diff options
author | Bert Lange <b.lange@hzdr.de> | 2015-04-15 13:36:55 +0200 |
---|---|---|
committer | Bert Lange <b.lange@hzdr.de> | 2015-04-15 13:36:55 +0200 |
commit | a1c964908b51599bf624bd2d253419c7e629f195 (patch) | |
tree | 06125d59e83b7dde82d1bb57bc0e09ca83451b98 /zpu/hdl | |
parent | bbfe29a15f11548eb7c9fa71dcb4d2d18c164a53 (diff) | |
parent | 8679e4f91dcae05aef40f96629f33f0f4161f14a (diff) | |
download | zpu-a1c964908b51599bf624bd2d253419c7e629f195.zip zpu-a1c964908b51599bf624bd2d253419c7e629f195.tar.gz |
Merge branch 'master' of https://github.com/zylin/zpu
Diffstat (limited to 'zpu/hdl')
142 files changed, 60334 insertions, 0 deletions
diff --git a/zpu/hdl/avalanche/core/zpu_core.v b/zpu/hdl/avalanche/core/zpu_core.v new file mode 100644 index 0000000..e704fbc --- /dev/null +++ b/zpu/hdl/avalanche/core/zpu_core.v @@ -0,0 +1,749 @@ +`timescale 1ns / 1ps +`include "zpu_core_defines.v" + +/* MODULE: zpu_core + DESCRIPTION: Contains ZPU cpu + AUTHOR: Antonio J. Anton (aj <at> anro-ingenieros.com) + +REVISION HISTORY: +Revision 1.0, 14/09/2009 +Initial public release + +COPYRIGHT: +Copyright (c) 2009 Antonio J. Anton + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.*/ + +// --------- MICROPROGRAMMED ZPU CORE --------------- +// all signals are polled on clk rising edge +// all signals positive + +module zpu_core ( +`ifdef ENABLE_CPU_INTERRUPTS + interrupt, // interrupt request +`endif + clk, // clock on rising edge + reset, // reset on rising edge + mem_read, // request memory read + mem_write, // request memory write + mem_done, // memory operation completed + mem_addr, // memory address + mem_data_read, // data readed + mem_data_write, // data written + byte_select // byte select on memory operation +); + +input clk; +input reset; +output mem_read; +output mem_write; +input mem_done; +input [31:0] mem_data_read; +output [31:0] mem_data_write; +output [31:0] mem_addr; +output [3:0] byte_select; +`ifdef ENABLE_CPU_INTERRUPTS +input interrupt; +`endif + +wire clk; +wire reset; +wire mem_read; +wire mem_write; +wire mem_done; +wire [31:0] mem_data_read; +wire [31:0] mem_data_write; +wire [31:0] mem_addr; +`ifdef ENABLE_CPU_INTERRUPTS +wire interrupt; +`endif + +`ifdef ENABLE_BYTE_SELECT +// ------ unaligned byte/halfword memory operations ----- +/// TODO: think rewriting into microcode or in a less resource wasting way + +reg [3:0] byte_select; +wire byte_op; +wire halfw_op; + +reg [31:0] mem_data_read_int; // aligned data from memory +reg [31:0] mem_data_write_out; // write data already aligned +wire [31:0] mem_data_write_int; // write data from cpu to be aligned + +// --- byte select logic --- +always @(mem_addr[1:0] or byte_op or halfw_op) +begin + casez( { mem_addr[1:0], byte_op, halfw_op } ) + 4'b00_1_? : byte_select <= 4'b0001; // byte select + 4'b01_1_? : byte_select <= 4'b0010; + 4'b10_1_? : byte_select <= 4'b0100; + 4'b11_1_? : byte_select <= 4'b1000; + 4'b0?_0_1 : byte_select <= 4'b0011; // half word select + 4'b1?_0_1 : byte_select <= 4'b1100; + default : byte_select <= 4'b1111; // word select + endcase +end + +// --- input data to cpu --- +always @(mem_data_read or mem_addr[1:0] or byte_op or halfw_op) +begin + casez( { mem_addr[1:0], byte_op, halfw_op } ) + 4'b00_1_? : mem_data_read_int <= { 24'b0, mem_data_read[7:0] }; // 8 bit read + 4'b01_1_? : mem_data_read_int <= { 24'b0, mem_data_read[15:8] }; + 4'b10_1_? : mem_data_read_int <= { 24'b0, mem_data_read[23:16] }; + 4'b11_1_? : mem_data_read_int <= { 24'b0, mem_data_read[31:24] }; + 4'b0?_0_1 : mem_data_read_int <= { 16'b0, mem_data_read[7:0], mem_data_read[15:8] }; // 16 bit read + 4'b1?_0_1 : mem_data_read_int <= { 16'b0, mem_data_read[23:16], mem_data_read[31:24] }; + default : mem_data_read_int <= { mem_data_read[7:0], mem_data_read[15:8], mem_data_read[23:16], mem_data_read[31:24] }; // 32 bit access (default) + endcase +end + +// --- output data from cpu --- +assign mem_data_write = mem_data_write_out; + +always @(mem_data_write_int or mem_addr[1:0] or byte_op or halfw_op) +begin + casez( {mem_addr[1:0], byte_op, halfw_op } ) + 4'b00_1_? : mem_data_write_out <= { 24'bX, mem_data_write_int[7:0] }; // 8 bit write + 4'b01_1_? : mem_data_write_out <= { 16'bX, mem_data_write_int[7:0], 8'bX }; + 4'b10_1_? : mem_data_write_out <= { 8'bX, mem_data_write_int[7:0], 16'bX }; + 4'b11_1_? : mem_data_write_out <= { mem_data_write_int[7:0], 24'bX }; + 4'b0?_0_1 : mem_data_write_out <= { 16'bX, mem_data_write_int[7:0], mem_data_write_int[15:8] }; // 16 bit write + 4'b1?_0_1 : mem_data_write_out <= { mem_data_write_int[7:0], mem_data_write_int[15:8], 16'bX }; + default : mem_data_write_out <= { mem_data_write_int[7:0], mem_data_write_int[15:8], mem_data_write_int[23:16], mem_data_write_int[31:24] }; + endcase +end +`else +// -------- only 32 bit memory access -------- +wire [3:0] byte_select = 4'b1111; // all memory operations are 32 bit wide +wire [31:0] mem_data_read_int; // no byte/halfword memory access by HW +wire [31:0] mem_data_write_int; // byte and halfword memory access must be emulated + +// ----- reorder bytes due to MSB-LSB configuration ----- +assign mem_data_read_int = { mem_data_read[7:0], mem_data_read[15:8], mem_data_read[23:16], mem_data_read[31:24] }; +assign mem_data_write = { mem_data_write_int[7:0], mem_data_write_int[15:8], mem_data_write_int[23:16], mem_data_write_int[31:24] }; +`endif + +// ------ datapath registers and connections ----------- +reg [31:0] pc; // program counter (byte align) +reg [31:0] sp; // stack counter (word align) +reg [31:0] a; // operand (address_out, data_out, alu_in) +reg [31:0] b; // operand (address_out) +reg idim; // im opcode being processed +reg [7:0] opcode; // opcode being processed +reg [31:2] pc_cached; // cached PC +reg [31:0] opcode_cache; // cached opcodes (current word) +`ifdef ENABLE_CPU_INTERRUPTS + reg int_requested; // interrupt has been requested + reg on_interrupt; // serving interrupt + wire exit_interrupt; // microcode says this is poppc_interrupt + wire enter_interrupt; // microcode says we are entering interrupt +`endif +wire [1:0] sel_opcode = pc[1:0]; // which opcode is selected +wire sel_read; // mux for data-in +wire [1:0] sel_alu; // mux for alu +wire [1:0] sel_addr; // mux for addr +wire w_pc; // write PC +`ifdef ENABLE_PC_INCREMENT + wire w_pc_increment; // write PC+1 +`endif +wire w_sp; // write SP +wire w_a; // write A (from ALU result) +wire w_a_mem; // write A (from MEM read) +wire w_b; // write B +wire w_op; // write OPCODE (opcode cache) +wire set_idim; // set IDIM +wire clear_idim; // clear IDIM +wire is_op_cached = (pc[31:2] == pc_cached) ? 1'b1 : 1'b0; // is opcode available? +wire a_is_zero; // A == 0 +wire a_is_neg; // A[31] == 1 +wire busy; // busy signal to microcode sequencer (stalls cpu) + +reg [`MC_MEM_BITS-1:0] mc_pc; // microcode PC +initial mc_pc <= `MC_ADDR_RESET-1; +wire [`MC_BITS-1:0] mc_op; // current microcode operation + +// memory addr / write ports +assign mem_addr = (sel_addr == `SEL_ADDR_SP) ? sp : + (sel_addr == `SEL_ADDR_A) ? a : + (sel_addr == `SEL_ADDR_B) ? b : pc; +assign mem_data_write_int = a; // only A can be written to memory + +// ------- alu instantiation ------- +wire [31:0] alu_a; +wire [31:0] alu_b; +wire [31:0] alu_r; +wire [`ALU_OP_WIDTH-1:0] alu_op; +wire alu_done; + +// alu inputs multiplexors +// constant in microcode is sign extended (in order to implement substractions like adds) +assign alu_a = (sel_read == `SEL_READ_DATA) ? mem_data_read_int : mem_addr; +assign alu_b = (sel_alu == `SEL_ALU_MC_CONST) ? { {25{mc_op[`P_ADDR+6]}} , mc_op[`P_ADDR+6:`P_ADDR] } : // most priority + (sel_alu == `SEL_ALU_A) ? a : + (sel_alu == `SEL_ALU_B) ? b : { {24{1'b0}} , opcode }; // `SEL_ALU_OPCODE is less priority + +zpu_core_alu alu( + .alu_a(alu_a), + .alu_b(alu_b), + .alu_r(alu_r), + .alu_op(alu_op), + .flag_idim(idim), + .clk(clk), + .done(alu_done) +); + +// -------- pc : program counter -------- +always @(posedge clk) +begin + if(w_pc) pc <= alu_r; +`ifdef ENABLE_PC_INCREMENT // microcode optimization + else if(w_pc_increment) pc <= pc + 1; // usually pc=pc+1 +`endif +end + +// -------- sp : stack pointer -------- +always @(posedge clk) +begin + if(w_sp) sp <= alu_r; +end + +// -------- a : acumulator register --------- +always @(posedge clk) +begin + if(w_a) a <= alu_r; + else if(w_a_mem) a <= mem_data_read_int; +end + +// alu results over a register instead of alu result +// in order to improve speed +assign a_is_zero = (a == 0); +assign a_is_neg = a[31]; + +// -------- b : auxiliary register --------- +always @(posedge clk) +begin + if(w_b) b <= alu_r; +end + +// -------- opcode and opcode_cache -------- +always @(posedge clk) +begin + if(w_op) + begin + opcode_cache <= alu_r; // store all opcodes in the word + pc_cached <= pc[31:2]; // store PC address of cached opcodes + end +end + +// -------- opcode : based on pc[1:0] --------- +always @(sel_opcode or opcode_cache) // select current opcode from +begin // the cached opcode word + case(sel_opcode) + 0 : opcode <= opcode_cache[31:24]; + 1 : opcode <= opcode_cache[23:16]; + 2 : opcode <= opcode_cache[15:8]; + 3 : opcode <= opcode_cache[7:0]; + endcase +end + +// ------- idim : immediate opcode handling ---------- +always @(posedge clk) +begin + if(set_idim) idim <= 1'b1; + else if(clear_idim) idim <= 1'b0; +end + +`ifdef ENABLE_CPU_INTERRUPTS +// ------ on interrupt status bit ----- +always @(posedge clk) +begin + if(reset | exit_interrupt) on_interrupt <= 1'b0; + else if(enter_interrupt) on_interrupt <= 1'b1; +end +`endif + +// ------ microcode execution unit -------- +assign sel_read = mc_op[`P_SEL_READ]; // map datapath signals with microcode program bits +assign sel_alu = mc_op[`P_SEL_ALU+1:`P_SEL_ALU]; +assign sel_addr = mc_op[`P_SEL_ADDR+1:`P_SEL_ADDR]; +assign alu_op = mc_op[`P_ALU+3:`P_ALU]; +assign w_sp = mc_op[`P_W_SP] & ~busy; +assign w_pc = mc_op[`P_W_PC] & ~busy; +assign w_a = mc_op[`P_W_A] & ~busy; +assign w_a_mem = mc_op[`P_W_A_MEM] & ~busy; +assign w_b = mc_op[`P_W_B] & ~busy; +assign w_op = mc_op[`P_W_OPCODE] & ~busy; +assign mem_read = mc_op[`P_MEM_R]; +assign mem_write = mc_op[`P_MEM_W]; +assign set_idim = mc_op[`P_SET_IDIM] & ~busy; +assign clear_idim= mc_op[`P_CLEAR_IDIM] & ~busy; +`ifdef ENABLE_BYTE_SELECT +assign byte_op = mc_op[`P_BYTE]; +assign halfw_op = mc_op[`P_HALFWORD]; +`endif +`ifdef ENABLE_PC_INCREMENT + assign w_pc_increment = mc_op[`P_PC_INCREMENT] & ~busy; +`endif +`ifdef ENABLE_CPU_INTERRUPTS + assign exit_interrupt = mc_op[`P_EXIT_INT] & ~busy; + assign enter_interrupt = mc_op[`P_ENTER_INT] & ~busy; +`endif + +wire cond_op_not_cached = mc_op[`P_OP_NOT_CACHED]; // conditional: true if opcode not cached +wire cond_a_zero = mc_op[`P_A_ZERO]; // conditional: true if A is zero +wire cond_a_neg = mc_op[`P_A_NEG]; // conditional: true if A is negative +wire decode = mc_op[`P_DECODE]; // decode means jumps to apropiate microcode based on zpu opcode +wire branch = mc_op[`P_BRANCH]; // unconditional jump inside microcode + +wire [`MC_MEM_BITS-1:0] mc_goto = { mc_op[`P_ADDR+6:`P_ADDR], 2'b00 }; // microcode goto (goto = high 7 bits) +wire [`MC_MEM_BITS-1:0] mc_entry = { opcode[6:0], 2'b00 }; // microcode entry point for opcode +reg [`MC_MEM_BITS-1:0] next_mc_pc; // next microcode operation to be executed +initial next_mc_pc <= `MC_ADDR_RESET-1; + +wire cond_branch = (cond_op_not_cached & ~is_op_cached) | // sum of all conditionals + (cond_a_zero & a_is_zero) | + (cond_a_neg & a_is_neg); + +assign busy = ((mem_read | mem_write) & ~mem_done) | ~alu_done; // busy signal for microcode sequencer + +// ------- handle interrupts --------- +`ifdef ENABLE_CPU_INTERRUPTS +always @(posedge clk) +begin + if(reset | on_interrupt) int_requested <= 0; + else if(interrupt & ~on_interrupt & ~int_requested) int_requested <= 1; // interrupt requested +end +`endif + +// ----- calculate next microcode address (next, decode, branch, specific opcode, etc.) ----- +always @(reset or mc_pc or mc_goto or opcode[7:4] or idim or + decode or branch or cond_branch or mc_entry or busy +`ifdef ENABLE_CPU_INTERRUPTS + or int_requested +`endif +) +begin + // default, next microcode instruction + next_mc_pc <= mc_pc + 1; + if(reset) next_mc_pc <= `MC_ADDR_RESET; + else if(~busy) + begin + // get next microcode instruction + if(branch | cond_branch) next_mc_pc <= mc_goto; + else if(decode) // decode: entry point of a new zpu opcode + begin +`ifdef ENABLE_CPU_INTERRUPTS + if(int_requested & ~idim) next_mc_pc <= `MC_ADDR_INTERRUPT; // microde to enter interrupt mode + else +`endif + if(opcode[7] == `OP_IM) next_mc_pc <= (idim ? `MC_ADDR_IM_IDIM : `MC_ADDR_IM_NOIDIM); + else if(opcode[7:5] == `OP_STORESP) next_mc_pc <= `MC_ADDR_STORESP; + else if(opcode[7:5] == `OP_LOADSP) next_mc_pc <= `MC_ADDR_LOADSP; + else if(opcode[7:4] == `OP_ADDSP) next_mc_pc <= `MC_ADDR_ADDSP; + else next_mc_pc <= mc_entry; // includes EMULATE opcodes + end + end + else next_mc_pc <= mc_pc; // in case of cpu stalled (busy=1) +end + +// set microcode program counter +always @(posedge clk) mc_pc <= next_mc_pc; + +// ----- microcode program ------ +zpu_core_rom microcode ( + .addr(next_mc_pc), + .data(mc_op), + .clk(clk) +); + +// -------------- ZPU debugger -------------------- +`ifdef ZPU_CORE_DEBUG +//synthesis translate_off +// ---- register operation dump ---- +always @(posedge clk) +begin + if(~reset) + begin + if(w_pc) $display("zpu_core: set PC=0x%h", alu.alu_r); +`ifdef ENABLE_PC_INCREMENT + if(w_pc_increment) $display("zpu_core: set PC=0x%h (PC+1)", pc); +`endif + if(w_sp) $display("zpu_core: set SP=0x%h", alu.alu_r); + if(w_a) $display("zpu_core: set A=0x%h", alu.alu_r); + if(w_a_mem) $display("zpu_core: set A=0x%h (from MEM)", mem_data_read_int); + if(w_b) $display("zpu_core: set B=0x%h", alu.alu_r); + if(w_op & ~is_op_cached) $display("zpu_core: set opcode_cache=0x%h, pc_cached=0x%h", alu.alu_r, {pc[31:2], 2'b0}); +`ifdef ENABLE_CPU_INTERRUPTS + if(~busy & mc_pc == `MC_ADDR_INTERRUPT) $display("zpu_core: ***** ENTERING INTERRUPT MICROCODE ******"); + if(~busy & exit_interrupt) $display("zpu_core: ***** INTERRUPT FLAG CLEARED *****"); + if(~busy & enter_interrupt) $display("zpu_core: ***** INTERRUPT FLAG SET *****"); +`endif + if(set_idim & ~idim) $display("zpu_core: IDIM=1"); + if(clear_idim & idim) $display("zpu_core: IDIM=0"); + +// ---- microcode debug ---- +`ifdef ZPU_CORE_DEBUG_MICROCODE + if(~busy) + begin + $display("zpu_core: mc_op[%d]=0b%b", mc_pc, mc_op); + if(branch) $display("zpu_core: microcode: branch=%d", mc_goto); + if(cond_branch) $display("zpu_core: microcode: CONDITION branch=%d", mc_goto); + if(decode) $display("zpu_core: decoding opcode=0x%h (0b%b) : branch to=%d ", opcode, opcode, mc_entry); + end + else $display("zpu_core: busy"); +`endif + +// ---- cpu abort in case of unaligned memory access --- +`ifdef ASSERT_NON_ALIGNMENT + /* unaligned word access (except PC) */ + if(sel_addr != `SEL_ADDR_PC & mem_addr[1:0] != 2'b00 & (mem_read | mem_write) & !byte_op & !halfw_op) + begin + $display("zpu_core: unaligned word operation at addr=0x%x", mem_addr); + $finish; + end + + /* unaligned halfword access */ + if(mem_addr[0] & (mem_read | mem_write) & !byte_op & halfw_op) + begin + $display("zpu_core: unaligned halfword operation at addr=0x%x", mem_addr); + $finish; + end +`endif + + end +end + +// ----- opcode dissasembler ------ +always @(posedge clk) +begin +if(~busy) +case(mc_pc) +0 : begin + $display("zpu_core: ------ breakpoint ------"); + $finish; + end +4 : $display("zpu_core: ------ shiftleft ------"); +8 : $display("zpu_core: ------ pushsp ------"); +12 : $display("zpu_core: ------ popint ------"); +16 : $display("zpu_core: ------ poppc ------"); +20 : $display("zpu_core: ------ add ------"); +24 : $display("zpu_core: ------ and ------"); +28 : $display("zpu_core: ------ or ------"); +32 : $display("zpu_core: ------ load ------"); +36 : $display("zpu_core: ------ not ------"); +40 : $display("zpu_core: ------ flip ------"); +44 : $display("zpu_core: ------ nop ------"); +48 : $display("zpu_core: ------ store ------"); +52 : $display("zpu_core: ------ popsp ------"); +56 : $display("zpu_core: ------ ipsum ------"); +60 : $display("zpu_core: ------ sncpy ------"); + +`MC_ADDR_IM_NOIDIM : $display("zpu_core: ------ im 0x%h (1st) ------", opcode[6:0] ); +`MC_ADDR_IM_IDIM : $display("zpu_core: ------ im 0x%h (cont) ------", opcode[6:0] ); +`MC_ADDR_STORESP : $display("zpu_core: ------ storesp 0x%h ------", { ~opcode[4], opcode[3:0], 2'b0 } ); +`MC_ADDR_LOADSP : $display("zpu_core: ------ loadsp 0x%h ------", { ~opcode[4], opcode[3:0], 2'b0 } ); +`MC_ADDR_ADDSP : $display("zpu_core: ------ addsp 0x%h ------", { ~opcode[4], opcode[3:0], 2'b0 } ); +`MC_ADDR_EMULATE : $display("zpu_core: ------ emulate 0x%h ------", b[2:0]); // opcode[5:0] ); + +128 : $display("zpu_core: ------ mcpy ------"); +132 : $display("zpu_core: ------ mset ------"); +136 : $display("zpu_core: ------ loadh ------"); +140 : $display("zpu_core: ------ storeh ------"); +144 : $display("zpu_core: ------ lessthan ------"); +148 : $display("zpu_core: ------ lessthanorequal ------"); +152 : $display("zpu_core: ------ ulessthan ------"); +156 : $display("zpu_core: ------ ulessthanorequal ------"); +160 : $display("zpu_core: ------ swap ------"); +164 : $display("zpu_core: ------ mult ------"); +168 : $display("zpu_core: ------ lshiftright ------"); +172 : $display("zpu_core: ------ ashiftleft ------"); +176 : $display("zpu_core: ------ ashiftright ------"); +180 : $display("zpu_core: ------ call ------"); +184 : $display("zpu_core: ------ eq ------"); +188 : $display("zpu_core: ------ neq ------"); +192 : $display("zpu_core: ------ neg ------"); +196 : $display("zpu_core: ------ sub ------"); +200 : $display("zpu_core: ------ xor ------"); +204 : $display("zpu_core: ------ loadb ------"); +208 : $display("zpu_core: ------ storeb ------"); +212 : $display("zpu_core: ------ div ------"); +216 : $display("zpu_core: ------ mod ------"); +220 : $display("zpu_core: ------ eqbranch ------"); +224 : $display("zpu_core: ------ neqbranch ------"); +228 : $display("zpu_core: ------ poppcrel ------"); +232 : $display("zpu_core: ------ config ------"); +236 : $display("zpu_core: ------ pushpc ------"); +240 : $display("zpu_core: ------ syscall_emulate ------"); +244 : $display("zpu_core: ------ pushspadd ------"); +248 : $display("zpu_core: ------ halfmult ------"); +252 : $display("zpu_core: ------ callpcrel ------"); +//default : $display("zpu_core: mc_pc=0x%h", decode_mcpc); +endcase +end +//synthesis translate_on +`endif +endmodule + +// --------- ZPU CORE ALU UNIT --------------- +module zpu_core_alu( + alu_a, // parameter A + alu_b, // parameter B + alu_r, // computed result + flag_idim, // for IMM alu op + alu_op, // ALU operation + clk, // clock for syncronous multicycle operations + done // done signal for alu operation +); + +input [31:0] alu_a; +input [31:0] alu_b; +input [`ALU_OP_WIDTH-1:0] alu_op; +input flag_idim; +output [31:0] alu_r; +input clk; +output done; + +wire [31:0] alu_a; +wire [31:0] alu_b; +wire [`ALU_OP_WIDTH-1:0] alu_op; +wire flag_idim; +reg [31:0] alu_r; +wire clk; +reg done; + +`ifdef ENABLE_MULT +// implement 32 bit pipeline multiplier +reg mul_running; +reg [2:0] mul_counter; +wire mul_done = (mul_counter == 3); +reg [31:0] mul_result, mul_tmp1; +reg [31:0] a_in, b_in; + +always@(posedge clk) +begin + a_in <= 0; + b_in <= 0; + mul_tmp1 <= 0; + mul_result <= 0; + mul_counter <= 0; + if(mul_running) + begin // infer pipeline multiplier + a_in <= alu_a; + b_in <= alu_b; + mul_tmp1 <= a_in * b_in; + mul_result <= mul_tmp1; + mul_counter <= mul_counter + 1; + end +end +`endif + +`ifdef ENABLE_DIV +// implement 32 bit divider +// Unsigned/Signed division based on Patterson and Hennessy's algorithm. +// Description: Calculates quotient. The "sign" input determines whether +// signs (two's complement) should be taken into consideration. +// references: http://www.ece.lsu.edu/ee3755/2002/l07.html +reg [63:0] qr; +wire [33:0] diff; +wire [31:0] quotient; +wire [31:0] dividend; +wire [31:0] divider; +reg [6:0] bit; +wire div_done; +reg div_running; +reg divide_sign; +reg negative_output; + +assign div_done = !bit; +assign diff = qr[63:31] - {1'b0, divider}; +assign quotient = (!negative_output) ? qr[31:0] : ~qr[31:0] + 1'b1; +assign dividend = (!divide_sign || !alu_a[31]) ? alu_a : ~alu_a + 1'b1; +assign divider = (!divide_sign || !alu_b[31]) ? alu_b : ~alu_b + 1'b1; + +always@(posedge clk) +begin + bit <= 7'b1_000000; // divider stopped + if(div_running) + begin + if(bit[6]) // divider started: initialize registers + begin + bit <= 7'd32; + qr <= { 32'd0, dividend }; + negative_output <= divide_sign && ((alu_b[31] && !alu_a[31]) || (!alu_b[31] && alu_a[31])); + end + else // step by step divide + begin + if( diff[32] ) qr <= { qr[62:0], 1'd0 }; + else qr <= { diff[31:0], qr[30:0], 1'd1 }; + bit <= bit - 1; + end + end +end +`endif + +`ifdef ENABLE_BARREL +// implement 32 bit barrel shift +// alu_b[6] == 1 ? left(only arithmetic) : right +// alu_b[5] == 1 ? logical : arithmetic +reg bs_running; +reg [31:0] bs_result; +reg [4:0] bs_counter; // 5 bits +wire bs_left = alu_b[6]; +wire bs_logical = alu_b[5]; +wire [4:0] bs_moves = alu_b[4:0]; +wire bs_done = (bs_counter == bs_moves); + +always @(posedge clk) +begin + bs_counter <= 0; + bs_result <= alu_a; + if(bs_running) + begin + if(bs_left) bs_result <= { bs_result[30:0], 1'b0 }; // shift left + else + begin + if(bs_logical) bs_result <= { 1'b0, bs_result[31:1] }; // shift logical right + else bs_result <= { bs_result[31], bs_result[31], bs_result[30:1] };// shift arithmetic right + end + bs_counter <= bs_counter + 1; + end +end +`endif + +// ----- alu add/sub ----- +reg [31:0] alu_b_tmp; +always @(alu_b or alu_op) +begin + alu_b_tmp <= alu_b; // by default, ALU_B as is + if(alu_op == `ALU_PLUS_OFFSET) alu_b_tmp <= { {25{1'b0}}, ~alu_b[4], alu_b[3:0], 2'b0 }; // ALU_B is an offset if ALU_PLUS_OFFSET operation +end + +reg [31:0] alu_r_addsub; // compute R=A+B or A-B based on opcode (ALU_PLUSxx / ALU_SUB-CMP) +always @(alu_a or alu_b_tmp or alu_op) +begin +`ifdef ENABLE_CMP + if(alu_op == `ALU_CMP_SIGNED || alu_op == `ALU_CMP_UNSIGNED) // in case of sub or cmp --> operation is '-' + begin + alu_r_addsub <= alu_a - alu_b_tmp; + end + else +`endif + begin + alu_r_addsub <= alu_a + alu_b_tmp; // by default '+' operation + end +end + +`ifdef ENABLE_CMP +// handle overflow/underflow exceptions in ALU_CMP_SIGNED +reg cmp_exception; +always @(alu_a[31] or alu_b[31] or alu_r_addsub[31]) +begin + cmp_exception <= 0; + if( (alu_a[31] == 0 && alu_b[31] == 1 && alu_r_addsub[31] == 1) || + (alu_a[31] == 1 && alu_b[31] == 0 && alu_r_addsub[31] == 0) ) cmp_exception <= 1; +end +`endif + +// ----- alu operation selection ----- +always @(alu_a or alu_b or alu_op or flag_idim or alu_r_addsub +`ifdef ENABLE_CMP + or cmp_exception +`endif +`ifdef ENABLE_MULT + or mul_done or mul_result +`endif +`ifdef ENABLE_BARREL + or bs_done or bs_result +`endif +`ifdef ENABLE_DIV + or div_done or div_result +`endif +) +begin + done <= 1; // default alu operations are 1 cycle +`ifdef ENABLE_MULT + mul_running <= 0; +`endif +`ifdef ENABLE_BARREL + bs_running <= 0; +`endif +`ifdef ENABLE_DIV + div_running <= 0; +`endif + alu_r <= alu_r_addsub; // ALU_PLUS, ALU_PLUS_OFFSET, ALU_SUB and part of ALU_CMP + case(alu_op) + `ALU_NOP : alu_r <= alu_a; + `ALU_NOP_B : alu_r <= alu_b; + `ALU_AND : alu_r <= alu_a & alu_b; + `ALU_OR : alu_r <= alu_a | alu_b; + `ALU_NOT : alu_r <= ~alu_a; + `ALU_FLIP : alu_r <= { alu_a[0], alu_a[1], alu_a[2], alu_a[3], alu_a[4], alu_a[5], alu_a[6], alu_a[7], + alu_a[8],alu_a[9],alu_a[10],alu_a[11],alu_a[12],alu_a[13],alu_a[14],alu_a[15], + alu_a[16],alu_a[17],alu_a[18],alu_a[19],alu_a[20],alu_a[21],alu_a[22],alu_a[23], + alu_a[24],alu_a[25],alu_a[26],alu_a[27],alu_a[28],alu_a[29],alu_a[30],alu_a[31] }; + `ALU_IM : if(flag_idim) alu_r <= { alu_a[24:0], alu_b[6:0] }; + else alu_r <= { {25{alu_b[6]}}, alu_b[6:0] }; +`ifdef ENABLE_CMP + `ALU_CMP_UNSIGNED:if( (alu_a[31] == alu_b[31] && cmp_exception) || + (alu_a[31] != alu_b[31] && ~cmp_exception) ) + begin + alu_r[31] <= ~alu_r_addsub[31]; + end + `ALU_CMP_SIGNED : if(cmp_exception) + begin + alu_r[31] <= ~alu_r_addsub[31]; + end +`endif +`ifdef ENABLE_XOR + `ALU_XOR : alu_r <= alu_a ^ alu_b; +`endif +`ifdef ENABLE_A_SHIFT + `ALU_A_SHIFT_RIGHT: alu_r <= { alu_a[31], alu_a[31], alu_a[30:1] }; // arithmetic shift left +`endif +`ifdef ENABLE_MULT + `ALU_MULT : begin + mul_running <= ~mul_done; + done <= mul_done; + alu_r <= mul_result; + end +`endif +`ifdef ENABLE_BARREL + `ALU_BARREL : begin + bs_running <= ~bs_done; + done <= bs_done; + alu_r <= bs_result; + end +`endif +`ifdef ENABLE_DIV + `ALU_DIV : begin + div_running<= ~div_done; + done <= div_done; + alu_r <= quotient; + end + `ALU_MOD : begin + div_running<= ~div_done; + done <= div_done; + alu_r <= qr[31:0]; + end +`endif + endcase +end + +endmodule diff --git a/zpu/hdl/avalanche/core/zpu_core_defines.v b/zpu/hdl/avalanche/core/zpu_core_defines.v new file mode 100644 index 0000000..228f46b --- /dev/null +++ b/zpu/hdl/avalanche/core/zpu_core_defines.v @@ -0,0 +1,322 @@ +/* MODULE: zpu_core_defines + DESCRIPTION: Contains ZPU parameters and other cpu related definitions + AUTHOR: Antonio J. Anton (aj <at> anro-ingenieros.com) + +REVISION HISTORY: +Revision 1.0, 14/09/2009 +Initial public release + +COPYRIGHT: +Copyright (c) 2009 Antonio J. Anton + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.*/ + +/* --------------- ISA DOCUMENTATION ------------------ + stack: top of stack = sp, mem[sp]=valid data + push: sp=sp-1, then mem[sp]=data + pop: data=mem[sp], then sp=sp+1 + + immediates: any opcode instead of im sets idim=0 + + MNEMONIC OPCODE HEX OPERATION +- im x 1_xxxxxxx if(~idim) { idim=1; sp=sp-1; mem[sp]={{25{b[6]}},b[6:0]} } + else { idim=1; mem[sp]={mem[sp][24:0], b[6:0]} } +- emulate x 001_xxxxx sp=sp-1; mem[sp]=pc+1; pc=mem[@VECTOR_EMULATE + <b>]; fetch (used only by microcode) +- storesp x 010_xxxxx mem[sp+x<<2] = mem[sp]; sp=sp+1 +- loadsp x 011_xxxxx mem[sp-1] = mem [sp+x<<2]; sp=sp-1 +- addsp x 0001_xxxx (1x) mem[sp] = mem[sp]+mem[sp+x<<2] + +- breakpoint 0000_0000 (00) call exception vector + shiftleft 0000_0001 (01) +- pushsp 0000_0010 (02) mem[sp-1] = sp; sp = sp - 1 +- popint 0000_0011 (03) pc=mem[sp]; sp = sp + 1 ; fetch ; decode ; clear_interrupt_flag +- poppc 0000_0100 (04) pc=mem[sp]; sp = sp + 1 +- add 0000_0101 (05) mem[sp+1] = mem[sp+1] + mem[sp]; sp = sp + 1 +- and 0000_0110 (06) mem[sp+1] = mem[sp+1] & mem[sp]; sp = sp + 1 +- or 0000_0111 (07) mem[sp+1] = mem[sp+1] | mem[sp]; sp = sp + 1 +- load 0000_1000 (08) mem[sp] = mem[ mem[sp] ] +- not 0000_1001 (09) mem[sp] = ~mem[sp] +- flip 0000_1010 (0a) mem[sp] = flip(mem[sp]) +- nop 0000_1011 (0b) - +- store 0000_1100 (0c) mem[mem[sp]] = mem[sp+1]; sp = sp + 2 +- popsp 0000_1101 (0d) sp = mem[sp] + compare 0000_1110 (0e) ???? --> opcode recycled (see below) + popint 0000_1111 (0f) duplicated of 0x03 ????? --> opcode recycled (see below) + +- ipsum 0000_1110 (0e) c=mem[sp],s=mem[sp+1]; sum=0; while(c-->0) {sum+=halfword(mem[s],s);s+=2}; sp=sp+1; mem[sp]=sum (overwrites mem[0] & mem[4] words) +- sncpy 0000_1111 (0f) c=mem[sp],d=mem[sp+1],s=mem[sp+2]; while( *(char*)s != 0 && c>0 ) {*((char*)d++)=*((char*)s++));c--}; sp=sp+3 (overwrites mem[0] & mem[4] words) +- wcpy 001_00000 (20) c=mem[sp],d=mem[sp+1],s=mem[sp+2]; while(c-->0) mem[d++]=mem[s++]; sp=sp+3 (overwrites mem[0] & mem[4] words) +- wset 001_00001 (21) v=mem[sp],c=mem[sp+1],d=mem[sp+2]; while(c-->0) mem[d++]=v; sp=sp+3 (overwrites mem[0] & mem[4] words) + +- loadh 001_00010 (22) mem[sp] = halfword[ mem[sp] ] +- storeh 001_00011 (23) halfword[mem[sp]] = (mem[sp+1] & 0xFFFF); sp = sp + 2 +- lessthan 001_00100 (24) (mem[sp]-mem[sp+1]) < 0 ? mem[sp+1]=1 : mem[sp+1]=0; sp = sp + 1 +- lessthanorequal 001_00101 (25) (mem[sp]-mem[sp+1]) <= 0 ? mem[sp+1]=1 : mem[sp+1]=0; sp = sp + 1 +- ulessthan 001_00110 (26) (unsigned(mem[sp])-unsigned(mem[sp+1])) < 0 ? mem[sp+1]=1 : mem[sp+1]=0; sp = sp + 1 +- ulessthanorequal 001_00111 (27) (unsigned(mem[sp])-unsigned(mem[sp+1])) <= 0 || == 0 ? mem[sp+1]=1 : mem[sp+1]=0; sp = sp + 1 + swap 001_01000 (28) +- mult 001_01001 (29) mem[sp+1] = mem[sp+1] * mem[sp]; sp = sp + 1 +- lshiftright 001_01010 (2a) mem[sp+1] = mem[sp+1] >> (mem[sp] & 0x1f); sp = sp + 1 +- ashiftleft 001_01011 (2b) mem[sp+1] = mem[sp+1] << (mem[sp] & 0x1f); sp = sp + 1 +- ashiftright 001_01100 (2c) mem[sp+1] = mem[sp+1] signed>> (mem[sp] & 0x1f); sp = sp + 1 +- call 001_01101 (2d) a = mem[sp]; mem[sp]=pc + 1; pc = a +- eq 001_01110 (2e) mem[sp+1] = (mem[sp] == mem[sp+1]) ? 1 : 0; sp = sp + 1 +- neq 001_01111 (2f) mem[sp+1] = (mem[sp] != mem[sp+1]) ? 1 : 0; sp = sp + 1 +- neg 001_10000 (30) mem[sp] = NOT(mem[sp])+1 +- sub 001_10001 (31) mem[sp+1]=mem[sp+1]-mem[sp]; sp=sp+1 +- xor 001_10010 (32) mem[sp+1]=mem[sp] ^ mem[sp+1]; sp=sp+1 +- loadb 001_10011 (33) mem[sp] = byte[ mem[sp] ] +- storeb 001_10100 (34) byte[mem[sp]] = (mem[sp+1] & 0xFF); sp = sp + 2 + div 001_10101 (35) + mod 001_10110 (36) +- eqbranch 001_10111 (37) mem[sp+1] == 0 ? pc = pc + mem[sp]; sp = sp + 2 +- neqbranch 001_11000 (38) mem[sp+1] != 0 ? pc = pc + mem[sp]; sp = sp + 2 +- poppcrel 001_11001 (39) pc = pc + mem[sp]; sp = sp + 1 + config 001_11010 (3a) +- pushpc 001_11011 (3b) sp=sp-1; mem[sp]=pc + syscall 001_11100 (3c) +- pushspadd 001_11101 (3d) mem[sp] = sp + (mem[sp] << 2) +- halfmult 001_11110 (3e) mem[sp+1] = 16bits(mem[sp]) * 16bits(mem[sp+1]); sp = sp + 1 +- callpcrel 001_11111 (3f) a = mem[sp]; mem[sp]=pc+1; pc = pc + a; + + gcc seems to be using only: + + add, addsp, and, ashiftleft, ashiftright, call, callpcrel, div, eq, flip, im, lessthan, + lessthanorequal, loadb, loadh, load, loadsp, lshiftright, mod, mult, neg, neqbranch, + not, or, poppc, poppcrel, popsp, pushpc, pushspadd, pushsp, storeb, storeh, store, storesp, + sub, ulessthan, ulessthanorequal, xor + + --------- memory access ---------------------------- + + data is stored in big-endian format into memory: + 00 MSB .. .. LSB + 05 .. .. .. .. + + ---------------------------------------------------- */ +`define SP_START 32'h10 // after reset change in startup code +`define EMULATION_VECTOR 32'h10 // table of emulated opcodes (interrupt & exception vectors plus up to 5 emulated opcodes) +`define RESET_VECTOR 32'h20 // reset entry point (can be moved up to 0x3c as per emulation table needs) + +// ---- zpu core optimizations/features ---- +`define ZPU_CORE_DEBUG +//`define ZPU_CORE_DEBUG_MICROCODE +`define ASSERT_NON_ALIGNMENT /* abort cpu in case of non-aligned memory access (only simulation) */ + +`define ENABLE_BYTE_SELECT /* allow byte / halfword memory accesses */ +`define ENABLE_CPU_INTERRUPTS /* enable interrupts to cpu */ +//`define ENABLE_PC_INCREMENT /* gain 1 clk per opcode but requires microcode changes ** not done at the moment ** */ +//`define ENABLE_A_SHIFT /* 1 bit arithmetic shift (right) mutual exclusive with barrel shift */ +//`define ENABLE_XOR /* 1 cycle x-or */ +//`define ENABLE_MULT /* 32 bit pipelined (3 stages) multiplier */ +//`define ENABLE_DIV /* 32 bit, up to 32 cycles serial divider */ +`define ENABLE_BARREL /* n bit logical & arithmetic shift mutual exclusive with 1 bit shift */ +`define ENABLE_CMP /* enable ALU_CMP_SIGNED and ALU_CMP_UNSIGNED */ + +// ------- microcode zpu core datapath selectors -------- +`define SEL_READ_DATA 0 +`define SEL_READ_ADDR 1 + +`define SEL_ALU_A 0 +`define SEL_ALU_OPCODE 1 +`define SEL_ALU_MC_CONST 2 +`define SEL_ALU_B 3 + +`define SEL_ADDR_PC 0 +`define SEL_ADDR_SP 1 +`define SEL_ADDR_A 2 +`define SEL_ADDR_B 3 + +`define ALU_OP_WIDTH 4 // alu operation is 4 bits + +`define ALU_NOP 0 // r = a +`define ALU_NOP_B 1 // r = b +`define ALU_PLUS 2 // r = a + b +`define ALU_PLUS_OFFSET 3 // r = a + { 27'b0, ~b[4], b[3:0] } +`define ALU_AND 4 // r = a AND b +`define ALU_OR 5 // r = a OR b +`define ALU_NOT 6 // r = NOT a +`define ALU_FLIP 7 // r = FLIP a +`define ALU_IM 8 // r = IDIM ? { a[24:0], b[6:0] } : { 25{b[6]}, b[6:0] } +`ifdef ENABLE_CMP + `define ALU_CMP_UNSIGNED 9 // r = (unsigned)a - (unsigned)b (r[31] is overflow/underflow adjusted) + `define ALU_CMP_SIGNED 10 // r = (signed)a - (signed)b (r[31] is overflow/underflow adjusted) +`endif +`ifdef ENABLE_BARREL + `define ALU_BARREL 11 // r = a <<|>> b (logical, arithmetical) +`endif +`ifdef ENABLE_A_SHIFT + `define ALU_A_SHIFT_RIGHT 11 // r = { a[31], a[31], a[30:29] } = (signed)a >> 1 +`endif +`ifdef ENABLE_XOR + `define ALU_XOR 12 // r = a XOR b +`endif +`ifdef ENABLE_MULT + `define ALU_MULT 13 // r = a * b +`endif +`ifdef ENABLE_DIV + `define ALU_DIV 14 // r = a / b + `define ALU_MOD 15 // r = a mod b +`endif + +// ------- special zpu opcodes ------ +`define OP_NOP 8'b0000_1011 // default value for opcode cache on reset +`define OP_IM 1'b1 +`define OP_EMULATE 3'b001 +`define OP_STORESP 3'b010 +`define OP_LOADSP 3'b011 +`define OP_ADDSP 4'b0001 + +// ------- microcode memory settings ------ +`define MC_MEM_BITS 9 // 512 microcode operations +`define MC_BITS 36 // microcode opcode width + +// ------- microcode labels for opcode execution ------- +// based on microcode program +`define MC_ADDR_IM_NOIDIM 488 +`define MC_ADDR_IM_IDIM 491 +`define MC_ADDR_STORESP 493 +`define MC_ADDR_LOADSP 496 +`define MC_ADDR_ADDSP 500 +`define MC_ADDR_EMULATE 504 +`define MC_ADDR_INTERRUPT 484 +`define MC_ADDR_FETCH_NEXT 480 +`define MC_ADDR_FETCH 476 +`define MC_ADDR_RESET 474 + +// ---------- microcode settings -------------------- +`define P_SEL_READ 0 // alu-A multiplexor between data-in and addr-out (1 bit) +`define P_SEL_ALU 1 // alu-B multiplexor between a, b, mc_const or opcode (2 bits) +`define P_SEL_ADDR 3 // addr-out multiplexor between sp, pc, a, b (2 bits) +`define P_ALU 5 // alu operation (4 bits) +`define P_W_SP 9 // write sp (from alu-out) +`define P_W_PC 10 // write pc (from alu-out) +`define P_W_A 11 // write a (from alu-out) +`define P_W_B 12 // write b (from alu-out) +`define P_SET_IDIM 13 // set idim flag +`define P_CLEAR_IDIM 14 // clear idim flag +`define P_W_OPCODE 15 // write opcode (from alu-out) : check if can be written directly from data-in +`define P_DECODE 16 // jump to microcode entry point based on current opcode +`define P_MEM_R 17 // request memory read +`define P_MEM_W 18 // request memory write +`define P_ADDR 19 // microcode address (7 bits (granularity is 4 words)) or constant to be used at microcode level +`define P_BRANCH 26 // microcode inconditional branch to address +`define P_OP_NOT_CACHED 27 // microcode branch if byte[pc] is not cached at opcode +`define P_A_ZERO 28 // microcode branch if a is zero +`define P_A_NEG 29 // microcode branch if a is negative a[31]=1 +`define P_W_A_MEM 30 // write a directly from data-in (alu datapath is free to perform any other operation in parallel) +`ifdef ENABLE_BYTE_SELECT + `define P_BYTE 31 // byte memory operation + `define P_HALFWORD 32 // half word memory operation +`endif +`ifdef ENABLE_PC_INCREMENT + `define P_PC_INCREMENT 33 // autoincrement PC bypassing ALU (1 clock gain per opcode) : not implemented at microcode level +`endif +`ifdef ENABLE_CPU_INTERRUPTS + `define P_EXIT_INT 34 // clear interrupt flag (exit from interrupt) + `define P_ENTER_INT 35 // set interrupt flag (enter interrupt) +`endif + +`define MC_SEL_READ_DATA (`SEL_READ_DATA << `P_SEL_READ) // 1 bit +`define MC_SEL_READ_ADDR (`SEL_READ_ADDR << `P_SEL_READ) + +`define MC_SEL_ALU_A (`SEL_ALU_A << `P_SEL_ALU) // 2 bit +`define MC_SEL_ALU_OPCODE (`SEL_ALU_OPCODE << `P_SEL_ALU) +`define MC_SEL_ALU_MC_CONST (`SEL_ALU_MC_CONST << `P_SEL_ALU) +`define MC_SEL_ALU_B (`SEL_ALU_B << `P_SEL_ALU) + +`define MC_SEL_ADDR_PC (`SEL_ADDR_PC << `P_SEL_ADDR) // 2 bits +`define MC_SEL_ADDR_SP (`SEL_ADDR_SP << `P_SEL_ADDR) +`define MC_SEL_ADDR_A (`SEL_ADDR_A << `P_SEL_ADDR) +`define MC_SEL_ADDR_B (`SEL_ADDR_B << `P_SEL_ADDR) + +`define MC_ALU_NOP (`ALU_NOP << `P_ALU) // 4 bits +`define MC_ALU_NOP_B (`ALU_NOP_B << `P_ALU) +`define MC_ALU_PLUS (`ALU_PLUS << `P_ALU) +`define MC_ALU_AND (`ALU_AND << `P_ALU) +`define MC_ALU_OR (`ALU_OR << `P_ALU) +`define MC_ALU_NOT (`ALU_NOT << `P_ALU) +`define MC_ALU_FLIP (`ALU_FLIP << `P_ALU) +`define MC_ALU_IM (`ALU_IM << `P_ALU) +`define MC_ALU_PLUS_OFFSET (`ALU_PLUS_OFFSET << `P_ALU) +`ifdef ENABLE_CMP + `define MC_ALU_CMP_SIGNED (`ALU_CMP_SIGNED << `P_ALU) + `define MC_ALU_CMP_UNSIGNED (`ALU_CMP_UNSIGNED << `P_ALU) +`endif +`ifdef ENABLE_XOR + `define MC_ALU_XOR (`ALU_XOR << `P_ALU) +`endif +`ifdef ENABLE_A_SHIFT + `define MC_ALU_A_SHIFT_RIGHT (`ALU_A_SHIFT_RIGHT << `P_ALU) +`endif +`ifdef ENABLE_MULT + `define MC_ALU_MULT (`ALU_MULT << `P_ALU) +`endif +`ifdef ENABLE_DIV + `define MC_ALU_DIV (`ALU_DIV << `P_ALU) + `define MC_ALU_MOD (`ALU_MOD << `P_ALU) +`endif +`ifdef ENABLE_BARREL + `define MC_ALU_BARREL (`ALU_BARREL << `P_ALU) +`endif + +`define MC_W_SP (1 << `P_W_SP) +`define MC_W_PC (1 << `P_W_PC) +`define MC_W_A (1 << `P_W_A) +`define MC_W_A_MEM (1 << `P_W_A_MEM) +`define MC_W_B (1 << `P_W_B) +`define MC_W_OPCODE (1 << `P_W_OPCODE) +`define MC_SET_IDIM (1 << `P_SET_IDIM) +`define MC_CLEAR_IDIM (1 << `P_CLEAR_IDIM) +`ifdef ENABLE_BYTE_SELECT + `define MC_BYTE (1 << `P_BYTE) + `define MC_HALFWORD (1 << `P_HALFWORD) +`endif +`ifdef ENABLE_PC_INCREMENT + `define MC_PC_INCREMENT (1 << `P_PC_INCREMENT) +`endif +`ifdef ENABLE_CPU_INTERRUPTS + `define MC_EXIT_INTERRUPT (1 << `P_EXIT_INT) + `define MC_ENTER_INTERRUPT (1 << `P_ENTER_INT) +`endif + +`define MC_MEM_R (1 << `P_MEM_R) +`define MC_MEM_W (1 << `P_MEM_W) + +`define MC_DECODE (1 << `P_DECODE) +`define MC_BRANCH (1 << `P_BRANCH) +`define MC_BRANCHIF_OP_NOT_CACHED (1 << `P_OP_NOT_CACHED) +`define MC_BRANCHIF_A_ZERO (1 << `P_A_ZERO) +`define MC_BRANCHIF_A_NEG (1 << `P_A_NEG) + +// microcode common operations + +`define MC_ADDR_FETCH_OP ( (`MC_ADDR_FETCH >> 2) << `P_ADDR) // fetch opcode from memory then decode +`define MC_ADDR_NEXT_OP ( (`MC_ADDR_FETCH_NEXT >> 2) << `P_ADDR) // go to next opcode +`define MC_ADDR_EMULATE_OP ( (`MC_ADDR_EMULATE >> 2) << `P_ADDR) // EMULATE opcode + +`define MC_PC_PLUS_1 (`MC_SEL_ADDR_PC | `MC_SEL_READ_ADDR | `MC_SEL_ALU_MC_CONST | `MC_ALU_PLUS | (1 << `P_ADDR) | `MC_W_PC) +`define MC_SP_MINUS_4 (`MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | `MC_SEL_ALU_MC_CONST | `MC_ALU_PLUS | ((-4 & 127) << `P_ADDR) | `MC_W_SP) +`define MC_SP_PLUS_4 (`MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | `MC_SEL_ALU_MC_CONST | `MC_ALU_PLUS | (4 << `P_ADDR) | `MC_W_SP) +`define MC_EMULATE (`MC_BRANCH | `MC_ADDR_EMULATE_OP) + +`define MC_FETCH (`MC_BRANCHIF_OP_NOT_CACHED | `MC_ADDR_FETCH_OP | `MC_DECODE) // fetch and decode current PC opcode +`define MC_GO_NEXT (`MC_BRANCH | `MC_ADDR_NEXT_OP) // go to next opcode (PC=PC+1, fetch, decode) +`define MC_GO_FETCH (`MC_BRANCH | `MC_ADDR_FETCH_OP) // go to fetch opcode at PC, then decode +`define MC_GO_BREAKPOINT (`MC_BRANCH | ((0 >> 2) << `P_ADDR)) // go to breakpoint opcode + diff --git a/zpu/hdl/avalanche/core/zpu_core_rom.v b/zpu/hdl/avalanche/core/zpu_core_rom.v new file mode 100644 index 0000000..62b7229 --- /dev/null +++ b/zpu/hdl/avalanche/core/zpu_core_rom.v @@ -0,0 +1,1017 @@ +`timescale 1ns / 1ps +`include "zpu_core_defines.v" + +/* MODULE: zpu_core_rom + DESCRIPTION: Contains microcode program + AUTHOR: Antonio J. Anton (aj <at> anro-ingenieros.com) + +REVISION HISTORY: +Revision 1.0, 14/09/2009 +Initial public release + +COPYRIGHT: +Copyright (c) 2009 Antonio J. Anton + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.*/ + +module zpu_core_rom ( + clk, + addr, + data +); + +input [`MC_MEM_BITS-1:0] addr; +output [`MC_BITS-1:0] data; +input clk; + +wire [`MC_MEM_BITS-1:0] addr; +reg [`MC_BITS-1:0] data; +reg [`MC_BITS-1:0] memory[(1<<`MC_MEM_BITS)-1:0]; + +initial data <= 0; +always @(posedge clk) data <= memory[addr]; + +// --- clear all memory at startup; for any reason, xilinx xst +// will not syntetize as block ram if not all memory is initialized --- +integer n; +initial begin +// initialize all memory array +for(n = 0; n < (1<<`MC_MEM_BITS); n = n + 1) memory[n] = 0; + +// ------------------------- MICROCODE MEMORY START ----------------------------------- + +// As per zpu_core.v, each opcode is executed by microcode. Each opcode microcode entry point +// is at <opcode> << 2 (example pushsp = 0x02 has microcode entry point of 0x08); this leaves +// room of 4 microcode operations per opcode; if the opcode microcode needs more space, +// it can jump & link to other microcode address (with the two lower bits at 0). The lower 256 addresses +// of microcode memory are entry points and code for 0..127 opcodes; other specific opcodes like im, storesp, etc. +// are directly hardwired to specific microcode addresses at the memory end. Upper 256 addresses are +// used by microcode continuation (eg. opcodes which needs more microcode operations), entry points, initializations, etc. +// the idea is to fit the microcode program in a xilinx blockram 512x36. + +// ----- OPCODES WITHOUT CONSTANT ------ + +// 0000_0000 (00) breakpoint ------------------------------------- +memory[0] = `MC_ALU_NOP_B | `MC_SEL_ALU_MC_CONST | (4 << `P_ADDR) | // b = 4 (#1 in emulate table) + `MC_W_B; +memory[1] = `MC_EMULATE; // emulate #1 (exception) + +// 0000_0001 (01) shiftleft ------------------------------------- +memory[4] = `MC_GO_BREAKPOINT; + +// 0000_0010 (02) pushsp ------------------------------------- +// mem[sp-1] = sp +// sp = sp - 1 +memory[8] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | // a = sp + `MC_ALU_NOP | `MC_W_A; +memory[9] = `MC_SP_MINUS_4; // sp = sp - 1 +memory[10] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp]=a + +// 0000_0011 (03) popint ------------------------------------- +`ifdef ENABLE_CPU_INTERRUPTS +// pc=mem[sp]-1 (emulate stores pc+1 but we must return to +// sp=sp+1 pc because interrupt takes precedence to decode) +// fetch & decode, then clear_interrupt_flag +// this guarantees that a continous interrupt allows to execute at least one +// opcode of mainstream program before reentry to interrupt handler +memory[12] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // pc = mem[sp]-1 + `MC_MEM_R | `MC_ALU_PLUS | `MC_SEL_ALU_MC_CONST | + ((-1 & 127) << `P_ADDR) | `MC_W_PC; +memory[13] = `MC_SEL_ADDR_PC | `MC_SEL_READ_DATA | `MC_MEM_R | // opcode_cache = mem[pc] + `MC_W_OPCODE; +memory[14] = `MC_SP_PLUS_4 | `MC_DECODE | `MC_EXIT_INTERRUPT; // sp=sp+1, decode opcode, exit_interrupt +`else +memory[12] = `MC_GO_BREAKPOINT; +`endif + +// 0000_0100 (04) poppc ------------------------------------- +// pc=mem[sp] +// sp = sp + 1 +memory[16] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // pc = mem[sp] + `MC_MEM_R | `MC_W_PC; +memory[17] = `MC_SP_PLUS_4; // sp = sp + 1 +memory[18] = `MC_FETCH; // opcode cached ? decode : fetch,decode + +// 0000_0101 (05) add ------------------------------------- +// mem[sp+1] = mem[sp+1] + mem[sp] +// sp = sp + 1 +memory[20] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | // a = mem[sp] || sp=sp+1 + `MC_W_A_MEM | `MC_SP_PLUS_4; +memory[21] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // a = a + mem[sp] + `MC_ALU_PLUS | `MC_SEL_ALU_A | `MC_W_A; +memory[22] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a + +// 0000_0110 (06) and ------------------------------------- +// mem[sp+1] = mem[sp+1] & mem[sp] +// sp = sp + 1 +memory[24] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | // a = mem[sp] || sp=sp+1 + `MC_W_A_MEM | `MC_SP_PLUS_4; +memory[25] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // a = a & mem[sp] + `MC_ALU_AND |`MC_SEL_ALU_A | `MC_W_A; +memory[26] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a + +// 0000_0111 (07) or ------------------------------------- +// mem[sp+1] = mem[sp+1] | mem[sp] +// sp = sp + 1 +memory[28] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | // a = mem[sp] || sp=sp+1 + `MC_W_A_MEM | `MC_SP_PLUS_4; +memory[29] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // a = a | mem[sp] + `MC_ALU_OR | `MC_SEL_ALU_A | `MC_W_A; +memory[30] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a + +// 0000_1000 (08) load ------------------------------------- +// mem[sp] = mem[ mem[sp] ] +memory[32] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // a = mem[sp] + `MC_MEM_R | `MC_W_A; +memory[33] = `MC_SEL_ADDR_A | `MC_SEL_READ_DATA | `MC_MEM_R | `MC_W_A; // a = mem[a] +memory[34] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a + +// 0000_1001 (09) not ------------------------------------- +// mem[sp] = ~mem[sp] +memory[36] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // a = ~mem[sp] + `MC_MEM_R | `MC_ALU_NOT | `MC_W_A; +memory[37] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a + +// 0000_1010 (0a) flip ------------------------------------- +// mem[sp] = flip(mem[sp]) +memory[40] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // a = FLIP(mem[sp]) + `MC_MEM_R | `MC_ALU_FLIP | `MC_W_A; +memory[41] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a + +// 0000_1011 (0b) nop ------------------------------------- +memory[44] = `MC_CLEAR_IDIM | `MC_PC_PLUS_1; // IDIM=0 +memory[45] = `MC_FETCH; + +// 0000_1100 (0c) store ------------------------------------- +// mem[mem[sp]] <= mem[sp+1] +// sp = sp + 2 +memory[48] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // b = mem[sp] + `MC_MEM_R | `MC_W_B; +memory[49] = `MC_SP_PLUS_4; // sp = sp + 1 +memory[50] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_W_A_MEM | `MC_SP_PLUS_4; // a = mem[sp] || sp = sp + 1 +memory[51] = `MC_SEL_ADDR_B | `MC_MEM_W | `MC_GO_NEXT; // mem[b] = a + +// 0000_1101 (0d) popsp ------------------------------------- +// sp = mem[sp] +memory[52] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | // sp = mem[sp] + `MC_W_SP | `MC_GO_NEXT; + +// 0000_1110 (0e) ipsum ------------------------------------ +// compare: opcode recycled --> ipsum +// c=mem[sp];s=mem[sp+1]; sum=0; +// while(c-->0) {sum+=halfword(mem[s],s);s++}; +// sp=sp+1; mem[sp]=sum (overwrites mem[0] & mem[4] words) +// requires HALFWORD memory access +`ifdef ENABLE_BYTE_SELECT +memory[56] = `MC_CLEAR_IDIM | `MC_ALU_NOP_B | `MC_SEL_ALU_MC_CONST | // b=0 + (0 << `P_ADDR) | `MC_W_B; +memory[57] = `MC_SEL_ADDR_PC | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a=pc+1 save next pc on mem[0] + `MC_SEL_ALU_MC_CONST | (1 << `P_ADDR) | `MC_W_A; +memory[58] = `MC_SEL_ADDR_B | `MC_MEM_W | `MC_ALU_NOP_B | `MC_W_B | // mem[b]=a || b=4 + `MC_SEL_ALU_MC_CONST | (4 << `P_ADDR); +memory[59] = `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | `MC_W_A | // a=sp || goto @ipsum_continue1 + `MC_BRANCH | ((116 >> 2) << `P_ADDR); +`else +memory[56] = `MC_GO_BREAKPOINT; +`endif + +// 0000_1111 (0f) sncpy --------------------------------------- +// c=mem[sp],d=mem[sp+1],s=mem[sp+2]; +// while( *(char*)s != 0 && c>0 ) { *((char*)d++)=*((char*)s++)); c-- }; +// sp=sp+1; mem[sp+1]=d; mem[sp]=c +// (overwrites mem[0] & mem[4] words) +// requires BYTE memory access +`ifdef ENABLE_BYTE_SELECT +memory[60] = `MC_CLEAR_IDIM | `MC_ALU_NOP_B | `MC_SEL_ALU_MC_CONST | // b=0 + (0 << `P_ADDR) | `MC_W_B; +memory[61] = `MC_SEL_ADDR_PC | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a=pc+1 save next pc on mem[0] + `MC_SEL_ALU_MC_CONST | (1 << `P_ADDR) | `MC_W_A; +memory[62] = `MC_SEL_ADDR_B | `MC_MEM_W | `MC_ALU_NOP_B | `MC_W_B | // mem[b]=a || b=4 + `MC_SEL_ALU_MC_CONST | (4 << `P_ADDR); +memory[63] = `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | `MC_W_A | // a=sp || goto @sncpy_continue1 + `MC_BRANCH | ((100 >> 2) << `P_ADDR); +`else +memory[60] = `MC_GO_BREAKPOINT; +`endif + +// ------------- microcode opcode continuations --------------- +// wset_continue1: ------------------------ +memory[64] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a=a+12 save clear stack on mem[4] + `MC_SEL_ALU_MC_CONST | (12 << `P_ADDR) | `MC_W_A; +memory[65] = `MC_SEL_ADDR_B | `MC_MEM_W; // mem[b]=a +memory[66] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_SEL_READ_DATA | `MC_W_PC;// pc=mem[sp] (data) +memory[67] = `MC_SP_PLUS_4; // sp=sp+4 +memory[68] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_SEL_READ_DATA | `MC_W_B; // b=mem[sp] (count) +memory[69] = `MC_SP_PLUS_4; // sp=sp+4 +memory[70] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_SEL_READ_DATA | `MC_W_SP;// sp=mem[sp] (destination @) +memory[71] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_W_A; // a=b (count) +// wset_loop: +memory[72] = `MC_BRANCHIF_A_ZERO | ( (80 >> 2) << `P_ADDR); // if(a==0) goto @wset_end +memory[73] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // b=b-1 (count) + `MC_SEL_ALU_MC_CONST | ((-1 & 127) << `P_ADDR) | `MC_W_B; +memory[74] = `MC_SEL_ADDR_PC | `MC_SEL_READ_ADDR | `MC_W_A; // a=pc (data) +memory[75] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_SP_PLUS_4; // mem[sp]=a || sp=sp+4 (sp=destination@) +memory[76] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_W_A | // a=b (count) || goto @wset_loop + `MC_BRANCH | ((72 >> 2) << `P_ADDR); +// wset_end: wcpy_end: sncpy_end: +memory[80] = `MC_SEL_ADDR_A | `MC_MEM_R | `MC_SEL_READ_DATA | `MC_W_PC; // pc=mem[a] (a is 0) +memory[81] = `MC_ALU_NOP_B | `MC_SEL_ALU_MC_CONST | (4 << `P_ADDR) | // b=4 + `MC_W_B; +memory[82] = `MC_SEL_ADDR_B | `MC_MEM_R | `MC_SEL_READ_DATA | // sp=mem[b] || goto @fetch + `MC_W_SP | `MC_FETCH; + +// wcpy_continue1: ------------------------ +memory[84] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a=a+12 save clear stack on mem[4] + `MC_SEL_ALU_MC_CONST | (12 << `P_ADDR) | `MC_W_A; +memory[85] = `MC_SEL_ADDR_B | `MC_MEM_W; // mem[b]=a +memory[86] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_SEL_READ_DATA | `MC_W_B; // b=mem[sp] (count) +memory[87] = `MC_SP_PLUS_4; // sp=sp+4 +memory[88] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_SEL_READ_DATA | `MC_W_PC;// pc=mem[sp] (destination @) +memory[89] = `MC_SP_PLUS_4; // sp=sp+4 +memory[90] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_SEL_READ_DATA | `MC_W_SP;// sp=mem[sp] (source @) +memory[91] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_W_A; // a=b (count) +// wcpy_loop: +memory[92] = `MC_BRANCHIF_A_ZERO | ( (80 >> 2) << `P_ADDR); // if(a==0) goto @wcpy_end +memory[93] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // b=b-1 (count) + `MC_SEL_ALU_MC_CONST | ((-1 & 127) << `P_ADDR) | `MC_W_B; +memory[94] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_W_A_MEM | // a=mem[sp] || sp=sp+4 (sp=source@) + `MC_SP_PLUS_4; +memory[95] = `MC_SEL_ADDR_PC | `MC_MEM_W | `MC_SEL_READ_ADDR | // mem[pc]=a || pc=pc+4 (pc=destination@) + `MC_ALU_PLUS | `MC_SEL_ALU_MC_CONST | (4 << `P_ADDR) | `MC_W_PC; +memory[96] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_W_A | // a=b (count) || goto @wcpy_loop + `MC_BRANCH | ((92 >> 2) << `P_ADDR); + +`ifdef ENABLE_BYTE_SELECT +// sncpy_continue1: --------------------- +memory[100] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a=a+12 + `MC_SEL_ALU_MC_CONST | (12 << `P_ADDR) | `MC_W_A; +memory[101] = `MC_SEL_ADDR_B | `MC_MEM_W; // mem[b]=a +memory[102] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_SEL_READ_DATA | `MC_W_B;// b=mem[sp] (count) +memory[103] = `MC_SP_PLUS_4; // sp=sp+4 +memory[104] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_SEL_READ_DATA | `MC_W_PC;// pc=mem[sp] (destination @) +memory[105] = `MC_SP_PLUS_4; // sp=sp+4 +memory[106] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_SEL_READ_DATA | `MC_W_SP;// sp=mem[sp] (source @) +memory[107] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_W_A; // a=b (count) +// sncpy_loop: +memory[108] = `MC_BRANCHIF_A_ZERO | ( (80 >> 2) << `P_ADDR); // if(a==0) goto @sncpy_end (count==0?) +memory[109] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_BYTE | `MC_W_A_MEM | // a=BYTE(mem[sp],sp) || sp=sp+1 (sp=source@) + `MC_SEL_READ_ADDR | `MC_ALU_PLUS | `MC_SEL_ALU_MC_CONST | + (1 << `P_ADDR) | `MC_W_SP; +memory[110] = `MC_SEL_ADDR_PC | `MC_MEM_W | `MC_SEL_READ_ADDR | // BYTE(mem[pc],pc)=a || pc=pc+1 (pc=destination@) + `MC_BYTE | `MC_ALU_PLUS | `MC_SEL_ALU_MC_CONST | + (1 << `P_ADDR) | `MC_W_PC; +memory[111] = `MC_BRANCHIF_A_ZERO | ( (80 >> 2) << `P_ADDR); // if(a==0) goto @sncpy_end (mem[src]==0?) +memory[112] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // b=b-1 (count) + `MC_SEL_ALU_MC_CONST | ((-1 & 127) << `P_ADDR) | `MC_W_B; +memory[113] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_W_A | // a=b (count) || goto @sncpy_loop + `MC_BRANCH | ((108 >> 2) << `P_ADDR); + +// ipsum_continue1: ------------------- +memory[116] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a=a+4 + `MC_SEL_ALU_MC_CONST | (4 << `P_ADDR) | `MC_W_A; +memory[117] = `MC_SEL_ADDR_B | `MC_MEM_W; // mem[b]=a save return sp on mem[4] +memory[118] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_SEL_READ_DATA | // pc=mem[sp] (count) + `MC_W_PC; +memory[119] = `MC_SP_PLUS_4; // sp=sp+4 +memory[120] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_SEL_READ_DATA | // sp=mem[sp] (start @) + `MC_W_SP; +memory[121] = `MC_SEL_ALU_MC_CONST | (0 << `P_ADDR) | `MC_W_B | // b=0 (sum) + `MC_ALU_NOP_B; +memory[122] = `MC_SEL_ADDR_PC | `MC_SEL_READ_DATA | `MC_W_A; // a=pc (count) +// ipsum_loop: +memory[124] = `MC_BRANCHIF_A_ZERO | ((392 >> 2) << `P_ADDR); // a == 0 ? goto @ipsum_end + +memory[125] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_HALFWORD | // b=mem[sp]+b + `MC_SEL_READ_DATA | `MC_ALU_PLUS | `MC_SEL_ALU_B | `MC_W_B; +memory[126] = `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // sp=sp+2 + `MC_SEL_ALU_MC_CONST | (2 << `P_ADDR) | `MC_W_SP; +memory[127] = `MC_BRANCH | ((408 >> 2) << `P_ADDR); // goto @ipsum_continue2 +`endif + +// ------------------------------------------------------------- + +// 001_00000 (20) wcpy ----------------------------------------- +// before using this opcode you must save mem[0] & mem[4] words, then wcpy, then restore mems +// c=mem[sp],d=mem[sp+1],s=mem[sp+2]; while(c-->0) mem[d++]=mem[s++]; sp=sp+3 +memory[128] = `MC_CLEAR_IDIM | `MC_ALU_NOP_B | `MC_SEL_ALU_MC_CONST | // b=0 + (0 << `P_ADDR) | `MC_W_B; +memory[129] = `MC_SEL_ADDR_PC | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a=pc+1 + `MC_SEL_ALU_MC_CONST | (1 << `P_ADDR) | `MC_W_A; +memory[130] = `MC_SEL_ADDR_B | `MC_MEM_W | `MC_ALU_NOP_B | `MC_W_B | // mem[b]=a || b=4 + `MC_SEL_ALU_MC_CONST | (4 << `P_ADDR); +memory[131] = `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | `MC_W_A | // a=sp || goto @wcpy_continue1 + `MC_BRANCH | ((84 >> 2) << `P_ADDR); + +// 001_00001 (21) wset ---------------------------------------- +// before using this opcode you must save mem[0] & mem[4] words, then wset, then restore mems +// v=mem[sp],c=mem[sp+1],d=mem[sp+2]; while(c-->0) mem[d++]=v; sp=sp+3 +memory[132] = `MC_CLEAR_IDIM | `MC_ALU_NOP_B | `MC_SEL_ALU_MC_CONST | // b=0 + (0 << `P_ADDR) | `MC_W_B; +memory[133] = `MC_SEL_ADDR_PC | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a=pc+1 + `MC_SEL_ALU_MC_CONST | (1 << `P_ADDR) | `MC_W_A; +memory[134] = `MC_SEL_ADDR_B | `MC_MEM_W | `MC_ALU_NOP_B | `MC_W_B | // mem[b]=a || b=4 + `MC_SEL_ALU_MC_CONST | (4 << `P_ADDR); +memory[135] = `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | `MC_W_A | // a=sp || goto @wset_continue1 + `MC_BRANCH | ((64 >> 2) << `P_ADDR); + +// 001_00010 (22) loadh ------------------------------------- +`ifdef ENABLE_BYTE_SELECT +// mem[sp] = HALFWORD(mem[sp], mem[mem[sp]]) +memory[136] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // a = mem[sp] + `MC_MEM_R | `MC_W_A; +memory[137] = `MC_SEL_ADDR_A | `MC_SEL_READ_DATA | `MC_MEM_R | // a = halfword(a, mem[a]) + `MC_W_A | `MC_HALFWORD; +memory[138] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a +`else +memory[136] = `MC_GO_BREAKPOINT; +`endif + +// 001_00011 (23) storeh ------------------------------------- +`ifdef ENABLE_BYTE_SELECT +// HALFWORD( mem[mem[sp]] <= mem[sp+1] ) +// sp = sp + 2 +memory[140] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // b = mem[sp] + `MC_MEM_R | `MC_W_B; +memory[141] = `MC_SP_PLUS_4; // sp = sp + 1 +memory[142] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_W_A_MEM | // a = mem[sp] || sp=sp+1 + `MC_SP_PLUS_4; +memory[143] = `MC_SEL_ADDR_B | `MC_MEM_W | `MC_HALFWORD | `MC_GO_NEXT; // HALFWORD(mem[b] = a) +`else +memory[140] = `MC_GO_BREAKPOINT; +`endif + +// 001_00100 (24) lessthan ------------------------------------- +// (mem[sp]-mem[sp+1]) < 0 ? mem[sp+1]=1 : mem[sp+1]=0 +// sp=sp+1 +`ifdef ENABLE_CMP +memory[144] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_W_A_MEM | // a=mem[sp] || sp=sp+1 + `MC_SP_PLUS_4; +memory[145] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | `MC_W_B; // b=mem[sp] +memory[146] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_SEL_ALU_B | // a = (a - b) with overflow/underflow correction || goto @lessthan_check + `MC_ALU_CMP_SIGNED | `MC_W_A | ((424>>2) << `P_ADDR) | `MC_BRANCH; +`else +memory[144] = `MC_GO_BREAKPOINT; +`endif + +// 001_00101 (25) lessthanorequal ------------------------------------- +// (mem[sp]-mem[sp+1]) <= 0 ? mem[sp+1]=1 : mem[sp+1]=0 +// sp=sp+1 +`ifdef ENABLE_CMP +memory[148] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_W_A_MEM | // a=mem[sp] || sp=sp+1 + `MC_SP_PLUS_4; +memory[149] = `MC_SEL_ADDR_SP | `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_W_B; // b=mem[sp] +memory[150] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_SEL_ALU_B | // a = (a - b) with overflow/underflow correction || goto @lessthanorequal_check + `MC_ALU_CMP_SIGNED | `MC_W_A | ((420>>2) << `P_ADDR) | `MC_BRANCH; +`else +memory[148] = `MC_GO_BREAKPOINT; +`endif + +// 001_00110 (26) ulessthan ------------------------------------- +// signA!=signB -> (unsigA < unsigB) == ~(sigA < sigA) +// signA==signB -> (unsigA < unsigB) == (sigA < sigB) +// (mem[sp]-mem[sp+1]) < 0 ? mem[sp+1]=1 : mem[sp+1]=0 +// sp=sp+1 +`ifdef ENABLE_CMP +memory[152] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_W_A_MEM | // a=mem[sp] || sp=sp+1 + `MC_SP_PLUS_4; +memory[153] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | `MC_W_B; // b=mem[sp] +memory[154] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_SEL_ALU_B | // a = (a - b) with overflow/underflow correction || goto @lessthan_check + `MC_ALU_CMP_UNSIGNED | `MC_W_A | ((424>>2) << `P_ADDR) | `MC_BRANCH; +`else +memory[152] = `MC_GO_BREAKPOINT; +`endif + +// 001_00111 (27) ulessthanorequal ------------------------------------- +// (mem[sp]-mem[sp+1]) <= 0 ? mem[sp+1]=1 : mem[sp+1]=0 +// sp=sp+1 +`ifdef ENABLE_CMP +memory[156] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_W_A_MEM | // a=mem[sp] || sp=sp+1 + `MC_SP_PLUS_4; +memory[157] = `MC_SEL_ADDR_SP | `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_W_B; // b=mem[sp] +memory[158] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_SEL_ALU_B | // a = (a - b) with overflow/underflow correction || goto @lessthanorequal_check + `MC_ALU_CMP_UNSIGNED | `MC_W_A | ((420>>2) << `P_ADDR) | `MC_BRANCH; +`else +memory[156] = `MC_GO_BREAKPOINT; +`endif + +// 001_01000 (28) swap ------------------------------------- +memory[160] = `MC_GO_BREAKPOINT; + +// 001_01001 (29) mult ------------------------------------- +`ifdef ENABLE_MULT +// mem[sp+1] = mem[sp+1] * mem[sp] +// sp = sp + 1 +memory[164] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | // a = mem[sp] || sp=sp+1 + `MC_W_A_MEM | `MC_SP_PLUS_4; +memory[165] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // b = mem[sp] + `MC_W_B; +memory[166] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_SEL_ALU_B | // a = a * b DON'T COMBINE MULTICYCLE ALU + `MC_ALU_MULT | `MC_W_A; // OPERATIONS WITH MEMORY READ/WRITE +memory[167] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a +`else +memory[164] = `MC_ALU_NOP_B | `MC_SEL_ALU_MC_CONST | (8 << `P_ADDR) | // b = 8 (#2 in emulate table) + `MC_W_B; +memory[165] = `MC_EMULATE; // emulate #2 (mult opcode) +`endif + +// 001_01010 (2a) lshiftright ------------------------------------- +`ifdef ENABLE_BARREL +// b = mem[sp] & 5'b1111 : limit to 5 bits (max 31 shifts) +// b = b | 7'b01_00000 : shift right, logical +// sp=sp+1 +// a = mem[sp] +// a = a >> b +// mem[sp] = a +memory[168] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // b = mem[sp] & 5'b11111 + `MC_MEM_R | `MC_ALU_AND | `MC_SEL_ALU_MC_CONST | (31 << `P_ADDR) | `MC_W_B; +memory[169] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_ALU_OR | // b = b | 7'b01_00000 (shift right, logical) + `MC_SEL_ALU_MC_CONST | (32 << `P_ADDR) | `MC_W_B; +memory[170] = `MC_SP_PLUS_4; // sp = sp + 1 +memory[171] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // a = mem[sp] | goto @shift_cont + `MC_W_A_MEM | `MC_BRANCH | ((432 >> 2) << `P_ADDR); +`else + `ifdef ENABLE_A_SHIFT +// a = mem[sp] & 5'b11111 +// sp=sp+1 +// b = FLIP(mem[sp]) +// label: a <= 0 ? goto @fin +// b = b << 1 +// a = a - 1 || goto @label +// fin: a = FLIP(b) +// mem[sp]=a +memory[168] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // a = mem[sp] & 5'b11111 + `MC_MEM_R | `MC_ALU_AND | `MC_SEL_ALU_MC_CONST | + (31 << `P_ADDR) | `MC_W_A; +memory[169] = `MC_SP_PLUS_4; // sp = sp + 1 +memory[170] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // b = FLIP(mem[sp]) + `MC_ALU_FLIP | `MC_W_B; +memory[171] = `MC_BRANCH | ((448 >> 2) << `P_ADDR); // goto @lshiftleft_loop + `else + memory[168] = `MC_GO_BREAKPOINT; + `endif +`endif + +// 001_01011 (2b) ashiftleft ------------------------------------- +`ifdef ENABLE_BARREL +// b = mem[sp] & 5'b11111 : 5 bit shift +// b = b | 7'b10_00000 : shift left, arithmetic +// sp=sp+1 +// a = mem[sp] +// a = a <<signed b +// mem[sp] = a +memory[172] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // b = mem[sp] & 5'b11111 + `MC_MEM_R | `MC_ALU_AND | `MC_SEL_ALU_MC_CONST | (31 << `P_ADDR) | `MC_W_B; +memory[173] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_ALU_OR | // b = b | 7'b10_00000 (shift left, arithmetic) + `MC_SEL_ALU_MC_CONST | (64 << `P_ADDR) | `MC_W_B; +memory[174] = `MC_SP_PLUS_4; // sp = sp + 1 +memory[175] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // a = mem[sp] | goto @shift_cont + `MC_W_A_MEM | `MC_BRANCH | ((432 >> 2) << `P_ADDR); +`else +// a = mem[sp] & 5'b11111 +// sp = sp + 1 +// b = mem[sp] +// label: a <= 0 ? goto @fin +// b = b << 1 +// a = a - 1 || goto @label +// fin: a = b +// mem[sp] = a +memory[172] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // a = mem[sp] & 5'b11111 + `MC_MEM_R | `MC_ALU_AND | `MC_SEL_ALU_MC_CONST | + (31 << `P_ADDR) | `MC_W_A; +memory[173] = `MC_SP_PLUS_4; // sp = sp + 1 +memory[174] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // b = mem[sp] + `MC_W_B; +memory[175] = `MC_BRANCH | ((440 >> 2) << `P_ADDR); // goto @ashiftleft_loop +`endif + +// 001_01100 (2c) ashiftright ------------------------------------- +`ifdef ENABLE_BARREL +// b = mem[sp] & 5'b11111 : 5 bit shift +// b = b | 7'b00_00000 : shift right, arithmetic +// sp=sp+1 +// a = mem[sp] +// a = a >>signed b +// mem[sp] = a +memory[176] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // b = mem[sp] & 5'b11111 + `MC_MEM_R | `MC_ALU_AND | `MC_SEL_ALU_MC_CONST | (31 << `P_ADDR) | `MC_W_B; +memory[177] = `MC_SP_PLUS_4; // sp = sp + 1 +memory[178] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // a = mem[sp] | goto @shift_cont + `MC_W_A_MEM | `MC_BRANCH | ((432 >> 2) << `P_ADDR); +`else + `ifdef ENABLE_A_SHIFT +// a = mem[sp] & 5'b11111 +// sp = sp + 1 +// b = FLIP(mem[sp]) +// label: a <= 0 ? goto @fin +// b = b signed_<< 1 +// a = a - 1 || goto @label +// fin: a = FLIP(b) +// mem[sp] = a +memory[176] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // a = mem[sp] & 5'b11111 + `MC_MEM_R | `MC_ALU_AND | `MC_SEL_ALU_MC_CONST | + (31 << `P_ADDR) | `MC_W_A; +memory[177] = `MC_SP_PLUS_4; // sp = sp + 1 +memory[178] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // b = FLIP(mem[sp]) + `MC_ALU_FLIP | `MC_W_B; +memory[179] = `MC_BRANCH | ((432 >> 2) << `P_ADDR); // goto @ashiftright_loop + `else +memory[176] = `MC_GO_BREAKPOINT; + `endif +`endif + +// 001_01101 (2d) call ------------------------------------- +// a = mem[sp] +// mem[sp]=pc+1 +// pc = a +memory[180] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // b = mem[sp] + `MC_MEM_R | `MC_W_B; +memory[181] = `MC_SEL_ADDR_PC | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | + `MC_SEL_ALU_MC_CONST | (1 << `P_ADDR) | `MC_W_A; // a = pc + 1 +memory[182] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_ALU_NOP_B | // mem[sp] = a || pc = b + `MC_SEL_ALU_B | `MC_W_PC; +memory[183] = `MC_FETCH; // op_cached? decode : goto next + +// 001_01110 (2e) eq ------------------------------------- +// a = mem[sp] +// sp = sp + 1 +// (mem[sp] - a == 0) ? mem[sp] = 1 : mem[sp] = 0 +memory[184] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | // a = NOT(mem[sp]) + `MC_SEL_READ_DATA | `MC_ALU_NOT | `MC_W_A; +memory[185] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR |`MC_ALU_PLUS | // a = a + 1 + `MC_SEL_ALU_MC_CONST | (1 << `P_ADDR) | `MC_W_A; +memory[186] = `MC_SP_PLUS_4; // sp = sp + 1 +memory[187] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // a = mem[sp] + a || goto @eq_check + `MC_ALU_PLUS |`MC_SEL_ALU_A | `MC_W_A | + ( (416 >> 2) << `P_ADDR) | `MC_BRANCH; + +// 001_01111 (2f) neq ------------------------------------- +// a = mem[sp] +// sp = sp + 1 +// (mem[sp] - a != 0) ? mem[sp] = 1 : mem[sp] = 0 +memory[188] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // a = NOT(mem[sp]) + `MC_MEM_R | `MC_ALU_NOT | `MC_W_A; +memory[189] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR |`MC_ALU_PLUS | // a = a + 1 + `MC_SEL_ALU_MC_CONST | (1 << `P_ADDR) | `MC_W_A; +memory[190] = `MC_SP_PLUS_4; // sp = sp + 1 +memory[191] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // a = mem[sp] + a || goto @neq_check + `MC_ALU_PLUS | `MC_SEL_ALU_A | `MC_W_A | + ( (412 >> 2) << `P_ADDR) | `MC_BRANCH; + +// 001_10000 (30) neg ------------------------------------- +// a = NOT(mem[sp]) +// a = a + 1 +// mem[sp] = a +memory[192] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // a = NOT(mem[sp]) + `MC_MEM_R | `MC_ALU_NOT | `MC_W_A; +memory[193] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a = a + 1 + (1 << `P_ADDR) | `MC_SEL_ALU_MC_CONST | `MC_W_A; +memory[194] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a + +// 001_10001 (31) sub ------------------------------------- +// mem[sp+1] = mem[sp+1] - mem[sp] +// sp = sp + 1 +memory[196] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // a = NOT(mem[sp]) + `MC_MEM_R | `MC_ALU_NOT | `MC_W_A; +memory[197] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a = a + 1 + `MC_SEL_ALU_MC_CONST | (1 << `P_ADDR) | `MC_W_A; +memory[198] = `MC_SP_PLUS_4; // sp = sp + 1 +memory[199] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // a = mem[sp] + a || goto @sub_cont (set_mem[sp]=a) + `MC_ALU_PLUS | `MC_SEL_ALU_A | `MC_W_A | ((400>>2) << `P_ADDR) | + `MC_BRANCH; + +// 001_10010 (32) xor ------------------------------------- +`ifdef ENABLE_XOR +// mem[sp+1] = mem[sp+1] ^ mem[sp] +// sp = sp + 1 +memory[200] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | // a = mem[sp] || sp=sp+1 + `MC_W_A_MEM | `MC_SP_PLUS_4; +memory[201] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // a = a ^ mem[sp] + `MC_ALU_XOR |`MC_SEL_ALU_A | `MC_W_A; +memory[202] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a +`else +// ALU doesn't perform XOR operation +// mem[sp+1] = mem[sp] ^ mem[sp+1] -> A^B=(A&~B)|(~A&B) +// a = ~mem[sp] --> a = ~A +// sp = sp + 1 +// a = mem[sp] & a --> a = ~A&B +// b = ~a --> b = A&~B +// a = a | b --> a = ~A&B | A&~B +// mem[sp] = a +memory[200] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // a = ~mem[sp] --> a=~A + `MC_ALU_NOT | `MC_W_A; +memory[201] = `MC_SP_PLUS_4; // sp = sp + 1 +memory[202] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // a = mem[sp] & a --> a = ~A&B + `MC_ALU_AND | `MC_SEL_ALU_A | `MC_W_A; +memory[203] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_ALU_NOT | // b = ~a || goto @xor_cont --> b = A&~B + `MC_W_B | `MC_BRANCH | ((428 >> 2) << `P_ADDR); +`endif + +// 001_10011 (33) loadb ------------------------------------- +`ifdef ENABLE_BYTE_SELECT +// mem[sp] = BYTE(mem[sp], mem[mem[sp]]) +memory[204] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // a = mem[sp] + `MC_MEM_R | `MC_W_A; +memory[205] = `MC_SEL_ADDR_A | `MC_SEL_READ_DATA | `MC_MEM_R | // a = byte(a, mem[a]) + `MC_W_A | `MC_BYTE; +memory[206] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a +`else +// b=pc +// pc = mem[sp] +// opcode_cache=mem[pc] +// a = opcode +// mem[sp]=a +// pc=b +// fetch +memory[204] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_PC | `MC_SEL_READ_ADDR | // b = pc + `MC_W_B; +memory[205] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // pc = mem[sp] + `MC_W_PC; +memory[206] = `MC_SEL_ADDR_PC | `MC_SEL_READ_DATA | `MC_MEM_R | // opcode_cache = mem[pc] + `MC_W_OPCODE; +memory[207] = `MC_SEL_ALU_OPCODE | `MC_ALU_NOP_B | `MC_W_A | // a = opcode -> byte(pc, mem[pc]) || goto @loadb_continued + `MC_BRANCH | ( (396 >> 2) << `P_ADDR); +`endif + +// 001_10100 (34) storeb ------------------------------------- +`ifdef ENABLE_BYTE_SELECT +// BYTE( mem[mem[sp]] <= mem[sp+1] ) +// sp = sp + 2 +memory[208] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // b = mem[sp] + `MC_MEM_R | `MC_W_B; +memory[209] = `MC_SP_PLUS_4; // sp = sp + 1 +memory[210] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_W_A_MEM | // a = mem[sp] || sp=sp+1 + `MC_SP_PLUS_4; +memory[211] = `MC_SEL_ADDR_B | `MC_MEM_W | `MC_BYTE | `MC_GO_NEXT; // BYTE(mem[b] = a) +`else +memory[208] = `MC_GO_BREAKPOINT; +`endif + +// 001_10101 (35) div ------------------------------------- +`ifdef ENABLE_DIV +// *** TODO: CHECK IF DIVIDE BY ZERO AND RAISE EXCEPTION *** +// mem[sp+1] = mem[sp+1] / mem[sp] +// sp = sp + 1 +memory[212] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | // a = mem[sp] || sp=sp+1 + `MC_W_A_MEM | `MC_SP_PLUS_4; +memory[213] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // b = mem[sp] + `MC_W_B; +memory[214] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_SEL_ALU_B | // a = a / b DON'T COMBINE MULTICYCLE ALU + `MC_ALU_DIV | `MC_W_A; // OPERATIONS WITH MEMORY READ/WRITE +memory[215] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a +`else +memory[212] = `MC_GO_BREAKPOINT; +`endif + +// 001_10110 (36) mod ------------------------------------- +`ifdef ENABLE_DIV +// mem[sp+1] = mem[sp+1] % mem[sp] +// sp = sp + 1 +memory[216] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | // a = mem[sp] || sp=sp+1 + `MC_W_A_MEM | `MC_SP_PLUS_4; +memory[217] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | // b = mem[sp] + `MC_W_B; +memory[218] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_SEL_ALU_B | // a = a % b DON'T COMBINE MULTICYCLE ALU + `MC_ALU_MOD | `MC_W_A; // OPERATIONS WITH MEMORY READ/WRITE +memory[219] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a +`else +memory[216] = `MC_GO_BREAKPOINT; +`endif + +// 001_10111 (37) eqbranch ------------------------------------- +// a = sp + 1 +// a = mem[a] +// a = mem[sp] || a == 0 ? { pc = pc + a; sp = sp + 2 } +// else { sp = sp + 2, pc = pc + 1 } +memory[220] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | // a = sp + 1 + `MC_ALU_PLUS | `MC_SEL_ALU_MC_CONST | (4 << `P_ADDR) | + `MC_W_A; +memory[221] = `MC_SEL_ADDR_A | `MC_MEM_R | `MC_W_A; // a = mem[a] +memory[222] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_W_A | // a = mem[sp] || a == 0 ? goto 456 (sp=sp+2, pc=pc+a) + `MC_BRANCHIF_A_ZERO | ((456>>2) << `P_ADDR); +memory[223] = `MC_BRANCH | ((460>>2) << `P_ADDR); // else goto 460 (sp=sp+2, pc=pc+1) + +// 001_11000 (38) neqbranch ------------------------------------- +// a = sp + 1 +// a = mem[a] +// a = mem[sp] || a == 0 ? { sp = sp + 2, pc = pc + 1 } +// else { sp = sp + 2, pc = pc + a } +memory[224] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | // a = sp + 1 + `MC_ALU_PLUS | `MC_SEL_ALU_MC_CONST | (4 << `P_ADDR) | + `MC_W_A; +memory[225] = `MC_SEL_ADDR_A | `MC_MEM_R | `MC_W_A; // a = mem[a] +memory[226] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_W_A | // a = mem[sp] || a == 0 ? goto 460 (sp=sp+2, pc=pc+1) + `MC_BRANCHIF_A_ZERO | ((460>>2) << `P_ADDR); +memory[227] = `MC_BRANCH | ((456>>2) << `P_ADDR); // else goto 456 (sp=sp+2, pc=pc+a) + +// 001_11001 (39) poppcrel ------------------------------------- +// a = mem[sp] +// sp = sp + 1 +// pc = pc + a +memory[228] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | // a=mem[sp] || sp=sp+1 + `MC_W_A_MEM | `MC_SP_PLUS_4; +memory[229] = `MC_SEL_ADDR_PC | `MC_SEL_READ_ADDR | `MC_SEL_ALU_A | // pc = pc + a + `MC_ALU_PLUS | `MC_W_PC; +memory[230] = `MC_FETCH; // op_cached? decode : goto next + +// 001_11010 (3a) config ------------------------------------- +memory[232] = `MC_GO_BREAKPOINT; + +// 001_11011 (3b) pushpc ------------------------------------- +// sp = sp - 1 +// mem[sp] = pc +memory[236] = `MC_CLEAR_IDIM | `MC_SP_MINUS_4 | `MC_W_A; // a = sp = sp - 1 +memory[237] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a + +// 001_11100 (3c) syscall_emulate ------------------------------ +memory[240] = `MC_GO_BREAKPOINT; + +// 001_11101 (3d) pushspadd ------------------------------------- +// a = mem[sp] << 2 +// mem[sp] = a + sp +`ifdef ENABLE_BARREL +memory[244] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | // a = mem[sp] + `MC_W_A_MEM; +memory[245] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_ALU_BARREL | // a = a << 2 (left,arithmetic->10_00010) + `MC_SEL_ALU_MC_CONST | ( 66 << `P_ADDR) | `MC_W_A; +memory[246] = `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | `MC_SEL_ALU_A | // a = a + sp + `MC_ALU_PLUS | `MC_W_A; +memory[247] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a +`else +memory[244] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_W_A_MEM; // a = mem[sp] +memory[245] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_SEL_ALU_A | // a = a + a + `MC_ALU_PLUS | `MC_W_A; +memory[246] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_SEL_ALU_A | // a = a + a + `MC_ALU_PLUS | `MC_W_A; +memory[247] = `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | `MC_SEL_ALU_A | // a = a + sp || goto @cont (->mem[sp] = a) + `MC_ALU_PLUS | `MC_W_A | ((400>>2) << `P_ADDR) | `MC_BRANCH; +`endif + +// 001_11110 (3e) halfmult ------------------------------------- +memory[248] = `MC_GO_BREAKPOINT; + +// 001_11111 (3f) callpcrel ------------------------------------- +// a = mem[sp] +// mem[sp]=pc+1 +// pc = pc + a +memory[252] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | // b = mem[sp] + `MC_MEM_R | `MC_W_B; +memory[253] = `MC_SEL_ADDR_PC | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a = pc + 1 + `MC_SEL_ALU_MC_CONST | (1 << `P_ADDR) | `MC_W_A; +memory[254] = `MC_SEL_ADDR_SP | `MC_MEM_W; // mem[sp] = a; +memory[255] = `MC_SEL_ADDR_PC | `MC_SEL_READ_ADDR | `MC_SEL_ALU_B | // pc = pc + b, goto @fetch + `MC_ALU_PLUS | `MC_W_PC | `MC_GO_FETCH; + +// --------------------- MICROCODE HOLE ----------------------------------- + + + + +// --------------------- CONTINUATION OF COMPLEX OPCODES ------------------ + +`ifdef ENABLE_BYTE_SELECT +// ipsum_end: ---------- +memory[392] = `MC_ALU_NOP_B | `MC_SEL_ALU_MC_CONST | (0 << `P_ADDR) | // sp=0 + `MC_W_SP; +memory[393] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_SEL_READ_DATA | // pc=mem[sp] restore next pc + `MC_W_PC; +memory[394] = `MC_SP_PLUS_4; // sp=sp+4 +memory[395] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_SEL_READ_DATA | // sp=mem[sp] restore sp + `MC_W_SP; +memory[396] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_W_A; // a=b (sum) +memory[397] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_FETCH; // mem[sp]=a || fetch (return sum) +`endif + +`ifndef ENABLE_BYTE_SELECT +// loadb continued microcode ----- +// mem[sp]=a || pc=b +// opcode_cache=mem[pc] || go next +memory[396] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_SEL_ALU_B | // mem[sp]=a || pc=b + `MC_ALU_NOP_B | `MC_W_PC; +memory[397] = `MC_SEL_ADDR_PC | `MC_MEM_R | `MC_W_OPCODE | `MC_GO_NEXT; // opcode_cache=mem[pc] || go next +`endif + +// sub/pushspadd continued microcode ---------------- +memory[400] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a + +// ----- hole ------ + +`ifdef ENABLE_BYTE_SELECT +// ipsum_continue2: ------------ +memory[408] = `MC_SEL_ADDR_PC | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // pc=pc-1; a=pc + `MC_SEL_ALU_MC_CONST | ((-1 & 127) << `P_ADDR) | `MC_W_PC | + `MC_W_A; +memory[409] = `MC_BRANCH | ((124 >> 2) << `P_ADDR); // goto @ipsum_loop +`endif + +// neqcheck ---------- +memory[412] = `MC_BRANCHIF_A_ZERO | ((468 >> 2) << `P_ADDR); // a == 0 ? goto @set_mem[sp]=0 +memory[413] = `MC_BRANCH | ((464 >> 2) << `P_ADDR); // else goto @set_mem[sp]=1 + +// eqcheck ---------- +memory[416] = `MC_BRANCHIF_A_ZERO | ((464 >> 2) << `P_ADDR); // a == 0 ? goto @set_mem[sp]=1 +memory[417] = `MC_BRANCH | ((468 >> 2) << `P_ADDR); // else goto @set_mem[sp]=0 + +// lessthanorequal_check ---- +memory[420] = `MC_BRANCHIF_A_ZERO | `MC_BRANCHIF_A_NEG | ((464 >> 2) << `P_ADDR); // a <= 0 ? goto @set_mem[sp]=1 +memory[421] = `MC_BRANCH | ((468 >> 2) << `P_ADDR); // else goto @set_mem[sp]=0 + +// lessthan_check ---- +memory[424] = `MC_BRANCHIF_A_NEG | ((464 >> 2) << `P_ADDR); // a < 0 ? goto @set_mem[sp]=1 +memory[425] = `MC_BRANCH | ((468 >> 2) << `P_ADDR); // else goto @set_mem[sp]=0 + +// xor_cont continued microcode ----------------------------------- +`ifndef ENABLE_XOR +memory[428] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_ALU_OR | // a = a | b --> a = ~A&B | A&~B + `MC_SEL_ALU_B | `MC_W_A; +memory[429] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a +`endif + +// ashiftright_loop continued microcode ----------------------------------- +`ifdef ENABLE_BARREL +memory[432] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_ALU_BARREL | // a = a {<<|>>} b + `MC_SEL_ALU_B | `MC_W_A; +memory[433] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a +`else + `ifdef ENABLE_A_SHIFT +memory[432] = `MC_BRANCHIF_A_ZERO | `MC_BRANCHIF_A_NEG | ((436 >> 2) << `P_ADDR); // (a <= 0) ? goto @ashiftright_exit +memory[433] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a = a + (-1) + `MC_SEL_ALU_MC_CONST | ( (-1 & 127) << `P_ADDR) | `MC_W_A; +memory[434] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // b = b signed_<< 1 || goto @ashiftright_loop + `MC_SEL_ALU_B | `MC_W_B | `MC_BRANCH | ((432 >>2) << `P_ADDR); +// ashiftright_exit +memory[436] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_ALU_FLIP | // a = FLIP(b) + `MC_W_A; +memory[437] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a + `endif +`endif + +// ashiftleft_loop continued microcode ----------------------------------- +`ifndef ENABLE_BARREL +memory[440] = `MC_BRANCHIF_A_ZERO | `MC_BRANCHIF_A_NEG | ((444 >> 2) << `P_ADDR);// (a <= 0) ? goto @ashiftleft_exit +memory[441] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a = a + (-1) + `MC_SEL_ALU_MC_CONST | ( (-1 & 127) << `P_ADDR) | `MC_W_A; +memory[442] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // b = b << 1 || goto @ashiftleft_loop + `MC_SEL_ALU_B | `MC_W_B | `MC_BRANCH | ((440 >>2) << `P_ADDR); +// ashiftleft_exit +memory[444] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_ALU_NOP | // a = b + `MC_W_A; +memory[445] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a +`endif + +// lshiftright_loop continued microcode ----------------------------------- +`ifdef ENABLE_A_SHIFT +memory[448] = `MC_BRANCHIF_A_ZERO | `MC_BRANCHIF_A_NEG | ((452 >> 2) << `P_ADDR);// (a <= 0) ? goto @lshiftright_exit +memory[449] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a = a + (-1) + `MC_SEL_ALU_MC_CONST | ( (-1 & 127) << `P_ADDR) | `MC_W_A; +memory[450] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // b = b << 1 || goto @lshiftright_loop + `MC_SEL_ALU_B | `MC_W_B | `MC_BRANCH | ((448 >>2) << `P_ADDR); +// lshiftright_exit +memory[452] = `MC_SEL_ADDR_B | `MC_SEL_READ_ADDR | `MC_ALU_FLIP | // a = FLIP(b) + `MC_W_A; +memory[453] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a +`endif + +// neqbranch / eqbranch --- continued microcode ------------------------------------- +// sp = sp + 2 +// pc = pc + a +memory[456] = `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // sp = sp + 2 + `MC_SEL_ALU_MC_CONST | (8 << `P_ADDR) | `MC_W_SP; +memory[457] = `MC_SEL_ADDR_PC | `MC_SEL_READ_ADDR | `MC_SEL_ALU_A | // pc = pc + a + `MC_ALU_PLUS | `MC_W_PC; +memory[458] = `MC_FETCH; // op_cached? decode : goto fetch + +// neqbranch / eqbranch --- continued microcode ------------------------------------- +// sp = sp + 2 +// pc = pc + 1 +memory[460] = `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // sp = sp + 2 + `MC_SEL_ALU_MC_CONST | (8 << `P_ADDR) | `MC_W_SP; +memory[461] = `MC_PC_PLUS_1; // pc = pc + 1 +memory[462] = `MC_FETCH; // op_cached? decode : goto fetch + +// neq / eq / lessthan_1 --- continued microcode -------------------- +// mem[sp] = 1 +memory[464] = `MC_SEL_ALU_MC_CONST | `MC_ALU_NOP_B | (1 << `P_ADDR) | // a = 1 + `MC_W_A; +memory[465] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a + +// neq / eq / lessthan_0 --- continued microcode -------------------- +// mem[sp] = 0 +memory[468] = `MC_SEL_ALU_MC_CONST | `MC_ALU_NOP_B | (0 << `P_ADDR) | // a = 0 + `MC_W_A; +memory[469] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a + +// MICROCODE ENTRY POINT AFTER RESET ------------------------------- +// initialize cpu registers +// sp = @SP_START +// pc = @RESET_VECTOR +memory[473] = 0; // reserved and empty for correct cpu startup +memory[474] = `MC_CLEAR_IDIM |`MC_SEL_ALU_MC_CONST | `MC_ALU_NOP_B | // sp = @SP_START + (`SP_START << `P_ADDR) | `MC_W_SP; +memory[475] = `MC_SEL_ALU_MC_CONST | `MC_ALU_NOP_B | `MC_W_PC | // pc = @RESET + (`RESET_VECTOR << `P_ADDR) | `MC_EXIT_INTERRUPT; // enable interrupts on reset +// fall throught fetch/decode + +// FETCH / DECODE ------------------------------------- +// opcode=mem[pc] +// decode (goto microcode entry point for opcode) +memory[476] = `MC_SEL_ADDR_PC | `MC_SEL_READ_DATA | `MC_MEM_R | // opcode_cache = mem[pc] + `MC_W_OPCODE; +memory[477] = `MC_DECODE; // decode jump to microcode + +// NEXT OPCODE ------------------------------------- +// pc = pc + 1 +// opcode cached ? decode : goto fetch +memory[480] = `MC_PC_PLUS_1; // pc = pc + 1 +memory[481] = `MC_FETCH; // pc_cached ? decode else fetch,decode + +// INTERRUPT REQUEST ------------------------------------- +// sp = sp - 1 +// mem[sp] = pc +// pc = mem[EMULATED_VECTORS + 0] +memory[484] = `MC_ALU_NOP_B | `MC_SEL_ALU_MC_CONST | (0 << `P_ADDR) | // b = 0 (#0 in emulate table) || disable interrupts + `MC_W_B | `MC_ENTER_INTERRUPT; +memory[485] = `MC_EMULATE; // emulate #0 (interrupt) + +// ---------------- OPCODES WITH PARAMETER IN OPCODE ---------------- + +// im x (idim=0) 1_xxxxxxx ------------------------------------- +// sp = sp - 1 +// mem[sp] = IMM(IDIM, opcode) +// idim = 1 +memory[488] = `MC_SP_MINUS_4; // sp = sp - 1 +memory[489] = `MC_SEL_ALU_OPCODE | `MC_ALU_IM | `MC_W_A; // a = IMM(IDIM, opcode) +memory[490] = `MC_SET_IDIM | `MC_SEL_ADDR_SP | `MC_MEM_W | // MEM[sp] = a; IDIM=1 + `MC_GO_NEXT; + +// 1_xxxxxxx im x (idim=1) ------------------------------------- +// mem[sp] = IMM(IDIM, mem[sp], opcode) +memory[491] = `MC_SET_IDIM | `MC_SEL_READ_DATA | `MC_SEL_ADDR_SP | // a = IMM(IDIM, MEM[sp], opcode) + `MC_MEM_R | `MC_SEL_ALU_OPCODE | `MC_ALU_IM | `MC_W_A; +memory[492] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // MEM[sp] = a + +// 010_xxxxx storesp x +// mem[sp + x<<2] = mem[sp] +// sp = sp + 1 +memory[493] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | // b = sp + offset + `MC_ALU_PLUS_OFFSET | `MC_SEL_ALU_OPCODE | `MC_W_B; +memory[494] = `MC_SEL_ADDR_SP | `MC_MEM_R | `MC_W_A_MEM | // a=mem[sp] || sp=sp+1 + `MC_SP_PLUS_4; +memory[495] = `MC_SEL_ADDR_B | `MC_MEM_W | `MC_GO_NEXT; // mem[b] = a + +// 011_xxxxx loadsp x ------------------------------------- +// mem[sp-1] = mem [sp + x<<2] +// sp = sp - 1 +memory[496] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | // a = sp + offset + `MC_ALU_PLUS_OFFSET | `MC_SEL_ALU_OPCODE | `MC_W_A; +memory[497] = `MC_SEL_ADDR_A | `MC_SEL_READ_DATA | `MC_MEM_R | `MC_W_A; // a = mem[a] +memory[498] = `MC_SP_MINUS_4; // sp = sp - 1 +memory[499] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a + +// 0001_xxxx addsp x ------------------------------------- +// mem[sp] = mem[sp] + mem[sp + x<<2] +memory[500] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_SP | `MC_SEL_READ_ADDR | // a = sp + offset + `MC_ALU_PLUS_OFFSET | `MC_SEL_ALU_OPCODE | `MC_W_A; +memory[501] = `MC_SEL_ADDR_A | `MC_SEL_READ_DATA | `MC_MEM_R | `MC_W_A; // a = mem[a] +memory[502] = `MC_SEL_ADDR_SP | `MC_SEL_READ_DATA | `MC_MEM_R | + `MC_ALU_PLUS | `MC_SEL_ALU_A | `MC_W_A; // a = a + mem[sp] +memory[503] = `MC_SEL_ADDR_SP | `MC_MEM_W | `MC_GO_NEXT; // mem[sp] = a + +// 001_xxxxx emulate x ------------------------------------- +// <expects b = offset into table for emulated opcode> +// sp = sp - 1 +// mem[sp] = pc + 1 emulated opcode microcode must set b to +// a=@EMULATION_TABLE offset inside emulated_table prior to +// pc = mem[a + b] calling the emulate microcode +// fetch +memory[504] = `MC_CLEAR_IDIM | `MC_SEL_ADDR_PC | `MC_SEL_READ_ADDR | // a = pc + 1 + `MC_ALU_PLUS | `MC_SEL_ALU_MC_CONST | (1 << `P_ADDR) | `MC_W_A; +memory[505] = `MC_SP_MINUS_4; // sp = sp - 1 +memory[506] = `MC_SEL_ADDR_SP | `MC_MEM_W; // mem[sp] = a +memory[507] = `MC_ALU_NOP_B | `MC_SEL_ALU_MC_CONST | `MC_W_A | // a = @vector_emulated + (`EMULATION_VECTOR << `P_ADDR); +memory[508] = `MC_SEL_ADDR_A | `MC_SEL_READ_ADDR | `MC_ALU_PLUS | // a = a + b + `MC_SEL_ALU_B | `MC_W_A; +memory[509] = `MC_SEL_ADDR_A | `MC_MEM_R | `MC_SEL_READ_DATA | // pc = mem[a] + `MC_ALU_NOP | `MC_W_PC; +memory[510] = `MC_FETCH; + +// --------------------- END OF MICROCODE PROGRAM -------------------------- +end + +endmodule diff --git a/zpu/hdl/avalanche/readme.txt b/zpu/hdl/avalanche/readme.txt new file mode 100644 index 0000000..3eb1baf --- /dev/null +++ b/zpu/hdl/avalanche/readme.txt @@ -0,0 +1,91 @@ +This ZPU implementation, codenamed "avalanche" was +contributed by Antonio Anton <antonio.anton@anro-ingenieros.com>. + +It's most interesting aspects are it's implementation using +microcode, small size, reduced code size overhead and that +it's implemented in Verilog. + +Please direct any questions to the zylin-zpu mailing list. + +The most urgently needed patches would be to provide working +simulation examples and improved documentation. + + +Ãyvind Harboe + + +Notes from Antonio: + +Hi, + +attached goes my zpu implementation in verilog in case anybody is +interested in. Code is quite commented. Also microcode and opcodes are +exhaustive commented (and more accurate that the HTML documentation in +some cases :-) ). + +At the moment I have no time to send a working environment but I will +get some time in next days and prepare a clean environment +(software/hardware) and send to the list. The target HW is spartan3 +starter kit board (all peripherals working: vga, sram, uarts, etc.). + +Feel free to ask any question to the list I will do my best to answer +quickly. + +Regards +Antonio + +Hi, + +the zpu_core is complete and lot of bugs has been solved in the past but +extensive testing and a complete test program has not been +defined/executed; anyway I'm quite confident it works: this core +executes eCos, FreeRTOS, Forth and other applications. + +Regarding FPGA resources for a "balanced" implementation (not the +smallest, not the fastest): + +-cpu+alu+microcode rom: 671 LUT + 239 FF + 1 BRAM (50% of LUT is ALU) +-complete soc (cpu, vga, uart, memory controller, interrupt controller, +timers, gpio, spi, etc.): 1317 LUT + 716 FF + 1 BRAM + +Regarding "modelsim hello world"; I'm sorry but I don't modelsim; +instead I use Icarus Verilog & gtkwave. The core has a "debug" facility +which displays all opcode and registers (memory changes, sp, pc, etc..) +during simulation execution. + +Regards +Antonio + + +> > Regarding FPGA resources for a "balanced" implementation (not the +> > smallest, not the fastest): +> > +> > -cpu+alu+microcode rom: 671 LUT + 239 FF + 1 BRAM (50% of LUT is ALU) +> +> Are there any emulated instructions not implemented in +> microcode? +> + +*All* zpu opcodes are microcoded. For some opcodes (like *shift*), +there are two versions; 32 bit barrel shift in HDL (up to 32 clocks) or +1 bit shift in HDL microcode drived (up to ~130 clocks). They are +selectable via `DEFINES in the zpu_core_defines.v + +Other opcodes like mult and div are 32 bit HDL only at the moment (there +are enough room in microcode memory to implement as microcode) and +software emulable as well. + +For the above figures (671 LUT + 239 FF): *shift* are 32 bit HDL and +mult/div are software implemented. + +There are new opcodes (as per my needs) like memory bulk copy (sncpy, +wcpy, wset) and ip checksum calculation (ipsum). There are room in +microccode memory to define new opcodes using the holes in the ISA (for +a complete list of opcodes and its function please see +zpu_core_defines.v). + +Some future ideas (easy to implement in microcode) +-on-chip debug +-microcode update via software + +Regards diff --git a/zpu/hdl/example/.cvsignore b/zpu/hdl/example/.cvsignore new file mode 100644 index 0000000..8238018 --- /dev/null +++ b/zpu/hdl/example/.cvsignore @@ -0,0 +1,3 @@ +work +vsim.wlf +install diff --git a/zpu/hdl/example/bram_dmips.vhd b/zpu/hdl/example/bram_dmips.vhd new file mode 100644 index 0000000..07b19f4 --- /dev/null +++ b/zpu/hdl/example/bram_dmips.vhd @@ -0,0 +1,3356 @@ +-- 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; + + +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"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", + 3256 => 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/example/helloworld.vhd b/zpu/hdl/example/helloworld.vhd new file mode 100644 index 0000000..cc8d8c6 --- /dev/null +++ b/zpu/hdl/example/helloworld.vhd @@ -0,0 +1,3154 @@ +-- 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; + + +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"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 + +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/example/interrupt.vhd b/zpu/hdl/example/interrupt.vhd new file mode 100644 index 0000000..d2bc709 --- /dev/null +++ b/zpu/hdl/example/interrupt.vhd @@ -0,0 +1,3156 @@ +-- 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; + + +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"82700b0b", +2 => x"80cfe00c", +3 => x"3a0b0b80", +4 => x"c6e00400", +5 => x"00000000", +6 => x"00000000", +7 => x"00000000", +8 => x"80088408", +9 => x"88080b0b", +10 => x"0b8af02d", +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"cc738306", +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"ab2d5050", +172 => x"80085688", +173 => x"0c840c80", +174 => x"0c510400", +175 => x"00000000", +176 => x"80088408", +177 => x"88087575", +178 => x"0b0b0b8b", +179 => x"ef2d5050", +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"80cfdc0c", +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"c6e63f04", +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"0b80dfc8", +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"c8085271", +292 => x"0870882a", +293 => x"81327081", +294 => x"06515151", +295 => x"70f13873", +296 => x"720c833d", +297 => x"0d0480cf", +298 => x"dc08802e", +299 => x"a43880cf", +300 => x"e008822e", +301 => x"bd388380", +302 => x"800b0b0b", +303 => x"80dfc80c", +304 => x"82a0800b", +305 => x"80dfcc0c", +306 => x"8290800b", +307 => x"80dfd00c", +308 => x"04f88080", +309 => x"80a40b0b", +310 => x"0b80dfc8", +311 => x"0cf88080", +312 => x"82800b80", +313 => x"dfcc0cf8", +314 => x"80808480", +315 => x"0b80dfd0", +316 => x"0c0480c0", +317 => x"a8808c0b", +318 => x"0b0b80df", +319 => x"c80c80c0", +320 => x"a880940b", +321 => x"80dfcc0c", +322 => x"0b0b80cf", +323 => x"980b80df", +324 => x"d00c0470", +325 => x"7080dfd4", +326 => x"335170a7", +327 => x"3880cfe8", +328 => x"08700852", +329 => x"5270802e", +330 => x"94388412", +331 => x"80cfe80c", +332 => x"702d80cf", +333 => x"e8087008", +334 => x"525270ee", +335 => x"38810b80", +336 => x"dfd43450", +337 => x"50040470", +338 => x"0b0b80df", +339 => x"c408802e", +340 => x"8e380b0b", +341 => x"0b0b800b", +342 => x"802e0981", +343 => x"06833850", +344 => x"040b0b80", +345 => x"dfc4510b", +346 => x"0b0bf594", +347 => x"3f500404", +348 => x"803d0d80", +349 => x"dfe00881", +350 => x"1180dfe0", +351 => x"0c51823d", +352 => x"0d04fe3d", +353 => x"0d80dfe0", +354 => x"085380df", +355 => x"e0085272", +356 => x"722e8f38", +357 => x"80cf9c51", +358 => x"82b03f80", +359 => x"dfe00853", +360 => x"e93980cf", +361 => x"ac5182a2", +362 => x"3fe039fb", +363 => x"3d0d7779", +364 => x"55558056", +365 => x"757524ab", +366 => x"38807424", +367 => x"9d388053", +368 => x"73527451", +369 => x"80e13f80", +370 => x"08547580", +371 => x"2e853880", +372 => x"08305473", +373 => x"800c873d", +374 => x"0d047330", +375 => x"76813257", +376 => x"54dc3974", +377 => x"30558156", +378 => x"738025d2", +379 => x"38ec39fa", +380 => x"3d0d787a", +381 => x"57558057", +382 => x"767524a4", +383 => x"38759f2c", +384 => x"54815375", +385 => x"74327431", +386 => x"5274519b", +387 => x"3f800854", +388 => x"76802e85", +389 => x"38800830", +390 => x"5473800c", +391 => x"883d0d04", +392 => x"74305581", +393 => x"57d739fc", +394 => x"3d0d7678", +395 => x"53548153", +396 => x"80747326", +397 => x"52557280", +398 => x"2e983870", +399 => x"802eab38", +400 => x"807224a6", +401 => x"38711073", +402 => x"10757226", +403 => x"53545272", +404 => x"ea387351", +405 => x"78833874", +406 => x"5170800c", +407 => x"863d0d04", +408 => x"720a100a", +409 => x"720a100a", +410 => x"53537280", +411 => x"2ee43871", +412 => x"7426ed38", +413 => x"73723175", +414 => x"7407740a", +415 => x"100a740a", +416 => x"100a5555", +417 => x"5654e339", +418 => x"f73d0d7c", +419 => x"70525380", +420 => x"fd3f7254", +421 => x"8008550b", +422 => x"0b80cfb8", +423 => x"56815780", +424 => x"0881055a", +425 => x"8b3de411", +426 => x"59538259", +427 => x"f413527b", +428 => x"88110852", +429 => x"5381b43f", +430 => x"80083070", +431 => x"8008079f", +432 => x"2c8a0780", +433 => x"0c538b3d", +434 => x"0d04f63d", +435 => x"0d7c80cf", +436 => x"ec087153", +437 => x"5553b73f", +438 => x"72558008", +439 => x"560b0b80", +440 => x"cfb85781", +441 => x"58800881", +442 => x"055b8c3d", +443 => x"e4115a53", +444 => x"825af413", +445 => x"52881408", +446 => x"5180f03f", +447 => x"80083070", +448 => x"8008079f", +449 => x"2c8a0780", +450 => x"0c548c3d", +451 => x"0d047070", +452 => x"70707570", +453 => x"71830653", +454 => x"555270b4", +455 => x"38717008", +456 => x"7009f7fb", +457 => x"fdff1206", +458 => x"f8848281", +459 => x"80065452", +460 => x"53719b38", +461 => x"84137008", +462 => x"7009f7fb", +463 => x"fdff1206", +464 => x"f8848281", +465 => x"80065452", +466 => x"5371802e", +467 => x"e7387252", +468 => x"71335372", +469 => x"802e8a38", +470 => x"81127033", +471 => x"545272f8", +472 => x"38717431", +473 => x"800c5050", +474 => x"505004f2", +475 => x"3d0d6062", +476 => x"88110870", +477 => x"58565f5a", +478 => x"73802e81", +479 => x"8c388c1a", +480 => x"2270832a", +481 => x"81328106", +482 => x"56587486", +483 => x"38901a08", +484 => x"91387951", +485 => x"90b73fff", +486 => x"55800880", +487 => x"ec388c1a", +488 => x"22587d08", +489 => x"55807883", +490 => x"ffff0670", +491 => x"0a100a81", +492 => x"06415c57", +493 => x"7e772e80", +494 => x"d7387690", +495 => x"38740884", +496 => x"16088817", +497 => x"57585676", +498 => x"802ef238", +499 => x"76548880", +500 => x"77278438", +501 => x"88805473", +502 => x"5375529c", +503 => x"1a0851a4", +504 => x"1a085877", +505 => x"2d800b80", +506 => x"082582e0", +507 => x"38800816", +508 => x"77800831", +509 => x"7f880508", +510 => x"80083170", +511 => x"6188050c", +512 => x"5b585678", +513 => x"ffb43880", +514 => x"5574800c", +515 => x"903d0d04", +516 => x"7a813281", +517 => x"06774056", +518 => x"75802e81", +519 => x"bd387690", +520 => x"38740884", +521 => x"16088817", +522 => x"57585976", +523 => x"802ef238", +524 => x"881a0878", +525 => x"83ffff06", +526 => x"70892a81", +527 => x"06565956", +528 => x"73802e82", +529 => x"f8387577", +530 => x"278b3877", +531 => x"872a8106", +532 => x"5c7b82b5", +533 => x"38767627", +534 => x"83387656", +535 => x"75537852", +536 => x"79085185", +537 => x"833f881a", +538 => x"08763188", +539 => x"1b0c7908", +540 => x"167a0c76", +541 => x"56751977", +542 => x"77317f88", +543 => x"05087831", +544 => x"70618805", +545 => x"0c415859", +546 => x"7e802efe", +547 => x"fa388c1a", +548 => x"2258ff8a", +549 => x"39787954", +550 => x"7c537b52", +551 => x"5684c93f", +552 => x"881a0879", +553 => x"31881b0c", +554 => x"7908197a", +555 => x"0c7c7631", +556 => x"5d7c8e38", +557 => x"79518ff2", +558 => x"3f800881", +559 => x"8f388008", +560 => x"5f751c77", +561 => x"77317f88", +562 => x"05087831", +563 => x"70618805", +564 => x"0c5d585c", +565 => x"7a802efe", +566 => x"ae387681", +567 => x"83387408", +568 => x"84160888", +569 => x"1757585c", +570 => x"76802ef2", +571 => x"3876538a", +572 => x"527b5182", +573 => x"d33f8008", +574 => x"7c318105", +575 => x"5d800884", +576 => x"3881175d", +577 => x"815f7c59", +578 => x"767d2783", +579 => x"38765994", +580 => x"1a08881b", +581 => x"08115758", +582 => x"807a085c", +583 => x"54901a08", +584 => x"7b278338", +585 => x"81547579", +586 => x"25843873", +587 => x"ba387779", +588 => x"24fee238", +589 => x"77537b52", +590 => x"9c1a0851", +591 => x"a41a0859", +592 => x"782d8008", +593 => x"56800880", +594 => x"24fee238", +595 => x"8c1a2280", +596 => x"c0075e7d", +597 => x"8c1b23ff", +598 => x"5574800c", +599 => x"903d0d04", +600 => x"7effa338", +601 => x"ff873975", +602 => x"537b527a", +603 => x"5182f93f", +604 => x"7908167a", +605 => x"0c79518e", +606 => x"b13f8008", +607 => x"cf387c76", +608 => x"315d7cfe", +609 => x"bc38feac", +610 => x"39901a08", +611 => x"7a087131", +612 => x"78117056", +613 => x"5a575280", +614 => x"cfec0851", +615 => x"84943f80", +616 => x"08802eff", +617 => x"a7388008", +618 => x"901b0c80", +619 => x"08167a0c", +620 => x"77941b0c", +621 => x"76881b0c", +622 => x"7656fd99", +623 => x"39790858", +624 => x"901a0878", +625 => x"27833881", +626 => x"54757727", +627 => x"843873b3", +628 => x"38941a08", +629 => x"54737726", +630 => x"80d33873", +631 => x"5378529c", +632 => x"1a0851a4", +633 => x"1a085877", +634 => x"2d800856", +635 => x"80088024", +636 => x"fd83388c", +637 => x"1a2280c0", +638 => x"075e7d8c", +639 => x"1b23ff55", +640 => x"fed73975", +641 => x"53785277", +642 => x"5181dd3f", +643 => x"7908167a", +644 => x"0c79518d", +645 => x"953f8008", +646 => x"802efcd9", +647 => x"388c1a22", +648 => x"80c0075e", +649 => x"7d8c1b23", +650 => x"ff55fead", +651 => x"39767754", +652 => x"79537852", +653 => x"5681b13f", +654 => x"881a0877", +655 => x"31881b0c", +656 => x"7908177a", +657 => x"0cfcae39", +658 => x"fa3d0d7a", +659 => x"79028805", +660 => x"a7053355", +661 => x"53548374", +662 => x"2780df38", +663 => x"71830651", +664 => x"7080d738", +665 => x"71715755", +666 => x"83517582", +667 => x"802913ff", +668 => x"12525670", +669 => x"8025f338", +670 => x"837427bc", +671 => x"38740876", +672 => x"327009f7", +673 => x"fbfdff12", +674 => x"06f88482", +675 => x"81800651", +676 => x"5170802e", +677 => x"98387451", +678 => x"80527033", +679 => x"5772772e", +680 => x"b9388111", +681 => x"81135351", +682 => x"837227ee", +683 => x"38fc1484", +684 => x"16565473", +685 => x"8326c638", +686 => x"7452ff14", +687 => x"5170ff2e", +688 => x"97387133", +689 => x"5472742e", +690 => x"98388112", +691 => x"ff125252", +692 => x"70ff2e09", +693 => x"8106eb38", +694 => x"80517080", +695 => x"0c883d0d", +696 => x"0471800c", +697 => x"883d0d04", +698 => x"fa3d0d78", +699 => x"7a7c7272", +700 => x"72595755", +701 => x"58565774", +702 => x"7727b238", +703 => x"75155176", +704 => x"7127aa38", +705 => x"707618ff", +706 => x"18535353", +707 => x"70ff2e96", +708 => x"38ff12ff", +709 => x"14545272", +710 => x"337234ff", +711 => x"115170ff", +712 => x"2e098106", +713 => x"ec387680", +714 => x"0c883d0d", +715 => x"048f7627", +716 => x"80e63874", +717 => x"77078306", +718 => x"517080dc", +719 => x"38767552", +720 => x"53707084", +721 => x"05520873", +722 => x"70840555", +723 => x"0c727170", +724 => x"84055308", +725 => x"71708405", +726 => x"530c7170", +727 => x"84055308", +728 => x"71708405", +729 => x"530c7170", +730 => x"84055308", +731 => x"71708405", +732 => x"530cf015", +733 => x"5553738f", +734 => x"26c73883", +735 => x"74279538", +736 => x"70708405", +737 => x"52087370", +738 => x"8405550c", +739 => x"fc145473", +740 => x"8326ed38", +741 => x"72715452", +742 => x"ff145170", +743 => x"ff2eff86", +744 => x"38727081", +745 => x"05543372", +746 => x"70810554", +747 => x"34ff1151", +748 => x"ea39ef3d", +749 => x"0d636567", +750 => x"405d427b", +751 => x"802e8582", +752 => x"386151a9", +753 => x"e73ff81c", +754 => x"70841208", +755 => x"70fc0670", +756 => x"628b0570", +757 => x"f8064159", +758 => x"455c5f41", +759 => x"57967427", +760 => x"82c53880", +761 => x"7b247e7c", +762 => x"26075880", +763 => x"5477742e", +764 => x"09810682", +765 => x"ab38787b", +766 => x"2581fe38", +767 => x"781780d7", +768 => x"a80b8805", +769 => x"085b5679", +770 => x"762e84c5", +771 => x"38841608", +772 => x"70fe0617", +773 => x"84110881", +774 => x"06415555", +775 => x"7e828d38", +776 => x"74fc0658", +777 => x"79762e84", +778 => x"e3387818", +779 => x"5f7e7b25", +780 => x"81ff387c", +781 => x"81065473", +782 => x"82c13876", +783 => x"77083184", +784 => x"1108fc06", +785 => x"56577580", +786 => x"2e913879", +787 => x"762e84f0", +788 => x"38741819", +789 => x"58777b25", +790 => x"84913876", +791 => x"802e829b", +792 => x"38781556", +793 => x"7a762482", +794 => x"92388c17", +795 => x"08881808", +796 => x"718c120c", +797 => x"88120c5e", +798 => x"75598817", +799 => x"61fc055b", +800 => x"5679a426", +801 => x"85ff387b", +802 => x"76595593", +803 => x"7a2780c9", +804 => x"387b7084", +805 => x"055d087c", +806 => x"56760c74", +807 => x"70840556", +808 => x"088c180c", +809 => x"9017589b", +810 => x"7a27ae38", +811 => x"74708405", +812 => x"5608780c", +813 => x"74708405", +814 => x"56089418", +815 => x"0c981758", +816 => x"a37a2795", +817 => x"38747084", +818 => x"05560878", +819 => x"0c747084", +820 => x"0556089c", +821 => x"180ca017", +822 => x"58747084", +823 => x"05560875", +824 => x"5f787084", +825 => x"055a0c77", +826 => x"7e708405", +827 => x"40087170", +828 => x"8405530c", +829 => x"7e08710c", +830 => x"5d787b31", +831 => x"56758f26", +832 => x"80c93884", +833 => x"17088106", +834 => x"79078418", +835 => x"0c781784", +836 => x"11088107", +837 => x"84120c5b", +838 => x"6151a791", +839 => x"3f881754", +840 => x"73800c93", +841 => x"3d0d0490", +842 => x"5bfdb839", +843 => x"7756fe83", +844 => x"398c1608", +845 => x"88170871", +846 => x"8c120c88", +847 => x"120c587e", +848 => x"707c3157", +849 => x"598f7627", +850 => x"ffb9387a", +851 => x"17841808", +852 => x"81067c07", +853 => x"84190c76", +854 => x"81078412", +855 => x"0c761184", +856 => x"11088107", +857 => x"84120c5b", +858 => x"88055261", +859 => x"518fda3f", +860 => x"6151a6b9", +861 => x"3f881754", +862 => x"ffa6397d", +863 => x"52615197", +864 => x"d73f8008", +865 => x"5a800880", +866 => x"2e81ab38", +867 => x"8008f805", +868 => x"60840508", +869 => x"fe066105", +870 => x"58557477", +871 => x"2e83f238", +872 => x"fc195877", +873 => x"a42681b0", +874 => x"387b8008", +875 => x"56579378", +876 => x"2780dc38", +877 => x"7b707084", +878 => x"05520880", +879 => x"08708405", +880 => x"800c0c80", +881 => x"08717084", +882 => x"0553085d", +883 => x"567b7670", +884 => x"8405580c", +885 => x"579b7827", +886 => x"b6387670", +887 => x"84055808", +888 => x"75708405", +889 => x"570c7670", +890 => x"84055808", +891 => x"75708405", +892 => x"570ca378", +893 => x"27993876", +894 => x"70840558", +895 => x"08757084", +896 => x"05570c76", +897 => x"70840558", +898 => x"08757084", +899 => x"05570c76", +900 => x"70840558", +901 => x"08775e75", +902 => x"70840557", +903 => x"0c747d70", +904 => x"84055f08", +905 => x"71708405", +906 => x"530c7d08", +907 => x"710c5f7b", +908 => x"5261518e", +909 => x"943f6151", +910 => x"a4f33f79", +911 => x"800c933d", +912 => x"0d047d52", +913 => x"61519690", +914 => x"3f800880", +915 => x"0c933d0d", +916 => x"04841608", +917 => x"55fbc939", +918 => x"77537b52", +919 => x"800851a2", +920 => x"a53f7b52", +921 => x"61518de1", +922 => x"3fcc398c", +923 => x"16088817", +924 => x"08718c12", +925 => x"0c88120c", +926 => x"5d8c1708", +927 => x"88180871", +928 => x"8c120c88", +929 => x"120c5977", +930 => x"59fbef39", +931 => x"7818901c", +932 => x"40557e75", +933 => x"24fb9c38", +934 => x"7a177080", +935 => x"d7a80b88", +936 => x"050c757c", +937 => x"31810784", +938 => x"120c5684", +939 => x"17088106", +940 => x"7b078418", +941 => x"0c6151a3", +942 => x"f43f8817", +943 => x"54fce139", +944 => x"74181990", +945 => x"1c5e5a7c", +946 => x"7a24fb8f", +947 => x"388c1708", +948 => x"88180871", +949 => x"8c120c88", +950 => x"120c5e88", +951 => x"1761fc05", +952 => x"575975a4", +953 => x"2681b638", +954 => x"7b795955", +955 => x"93762780", +956 => x"c9387b70", +957 => x"84055d08", +958 => x"7c56790c", +959 => x"74708405", +960 => x"56088c18", +961 => x"0c901758", +962 => x"9b7627ae", +963 => x"38747084", +964 => x"05560878", +965 => x"0c747084", +966 => x"05560894", +967 => x"180c9817", +968 => x"58a37627", +969 => x"95387470", +970 => x"84055608", +971 => x"780c7470", +972 => x"84055608", +973 => x"9c180ca0", +974 => x"17587470", +975 => x"84055608", +976 => x"75417870", +977 => x"84055a0c", +978 => x"77607084", +979 => x"05420871", +980 => x"70840553", +981 => x"0c600871", +982 => x"0c5e7a17", +983 => x"7080d7a8", +984 => x"0b88050c", +985 => x"7a7c3181", +986 => x"0784120c", +987 => x"58841708", +988 => x"81067b07", +989 => x"84180c61", +990 => x"51a2b23f", +991 => x"78547380", +992 => x"0c933d0d", +993 => x"0479537b", +994 => x"5275519f", +995 => x"f93ffae9", +996 => x"39841508", +997 => x"fc061960", +998 => x"5859fadd", +999 => x"3975537b", +1000 => x"5278519f", +1001 => x"e13f7a17", +1002 => x"7080d7a8", +1003 => x"0b88050c", +1004 => x"7a7c3181", +1005 => x"0784120c", +1006 => x"58841708", +1007 => x"81067b07", +1008 => x"84180c61", +1009 => x"51a1e63f", +1010 => x"7854ffb2", +1011 => x"39fa3d0d", +1012 => x"7880cfec", +1013 => x"085455b8", +1014 => x"1308802e", +1015 => x"81af388c", +1016 => x"15227083", +1017 => x"ffff0670", +1018 => x"832a8132", +1019 => x"81065555", +1020 => x"5672802e", +1021 => x"80da3873", +1022 => x"842a8132", +1023 => x"810657ff", +1024 => x"537680f2", +1025 => x"3873822a", +1026 => x"81065473", +1027 => x"802eb938", +1028 => x"b0150854", +1029 => x"73802e9c", +1030 => x"3880c015", +1031 => x"5373732e", +1032 => x"8f387352", +1033 => x"80cfec08", +1034 => x"518a9e3f", +1035 => x"8c152256", +1036 => x"76b0160c", +1037 => x"75db0657", +1038 => x"768c1623", +1039 => x"800b8416", +1040 => x"0c901508", +1041 => x"750c7656", +1042 => x"75880754", +1043 => x"738c1623", +1044 => x"90150880", +1045 => x"2ebf388c", +1046 => x"15227081", +1047 => x"06555373", +1048 => x"9c38720a", +1049 => x"100a8106", +1050 => x"56758538", +1051 => x"94150854", +1052 => x"7388160c", +1053 => x"80537280", +1054 => x"0c883d0d", +1055 => x"04800b88", +1056 => x"160c9415", +1057 => x"08309816", +1058 => x"0c8053ea", +1059 => x"39725182", +1060 => x"a63ffecb", +1061 => x"3974518f", +1062 => x"bc3f8c15", +1063 => x"22708106", +1064 => x"55537380", +1065 => x"2effbb38", +1066 => x"d439f83d", +1067 => x"0d7a5776", +1068 => x"802e8197", +1069 => x"3880cfec", +1070 => x"0854b814", +1071 => x"08802e80", +1072 => x"eb388c17", +1073 => x"2270902b", +1074 => x"70902c70", +1075 => x"832a8132", +1076 => x"81065b5b", +1077 => x"57557780", +1078 => x"cb389017", +1079 => x"08567580", +1080 => x"2e80c138", +1081 => x"76087631", +1082 => x"76780c79", +1083 => x"83065555", +1084 => x"73853894", +1085 => x"17085877", +1086 => x"88180c80", +1087 => x"7525a538", +1088 => x"74537552", +1089 => x"9c170851", +1090 => x"a4170854", +1091 => x"732d800b", +1092 => x"80082580", +1093 => x"c9388008", +1094 => x"16758008", +1095 => x"31565674", +1096 => x"8024dd38", +1097 => x"800b800c", +1098 => x"8a3d0d04", +1099 => x"73518187", +1100 => x"3f8c1722", +1101 => x"70902b70", +1102 => x"902c7083", +1103 => x"2a813281", +1104 => x"065b5b57", +1105 => x"5577dd38", +1106 => x"ff9039a1", +1107 => x"aa5280cf", +1108 => x"ec08518c", +1109 => x"d03f8008", +1110 => x"800c8a3d", +1111 => x"0d048c17", +1112 => x"2280c007", +1113 => x"58778c18", +1114 => x"23ff0b80", +1115 => x"0c8a3d0d", +1116 => x"04fa3d0d", +1117 => x"797080dc", +1118 => x"298c1154", +1119 => x"7a535657", +1120 => x"8fd63f80", +1121 => x"08800855", +1122 => x"56800880", +1123 => x"2ea23880", +1124 => x"088c0554", +1125 => x"800b8008", +1126 => x"0c768008", +1127 => x"84050c73", +1128 => x"80088805", +1129 => x"0c745380", +1130 => x"5273519c", +1131 => x"f53f7554", +1132 => x"73800c88", +1133 => x"3d0d0470", +1134 => x"707074a8", +1135 => x"f60bbc12", +1136 => x"0c53810b", +1137 => x"b8140c80", +1138 => x"0b84dc14", +1139 => x"0c830b84", +1140 => x"e0140c84", +1141 => x"e81384e4", +1142 => x"140c8413", +1143 => x"08518070", +1144 => x"720c7084", +1145 => x"130c7088", +1146 => x"130c5284", +1147 => x"0b8c1223", +1148 => x"718e1223", +1149 => x"7190120c", +1150 => x"7194120c", +1151 => x"7198120c", +1152 => x"709c120c", +1153 => x"80c1e50b", +1154 => x"a0120c80", +1155 => x"c2b10ba4", +1156 => x"120c80c3", +1157 => x"ad0ba812", +1158 => x"0c80c3fe", +1159 => x"0bac120c", +1160 => x"88130872", +1161 => x"710c7284", +1162 => x"120c7288", +1163 => x"120c5189", +1164 => x"0b8c1223", +1165 => x"810b8e12", +1166 => x"23719012", +1167 => x"0c719412", +1168 => x"0c719812", +1169 => x"0c709c12", +1170 => x"0c80c1e5", +1171 => x"0ba0120c", +1172 => x"80c2b10b", +1173 => x"a4120c80", +1174 => x"c3ad0ba8", +1175 => x"120c80c3", +1176 => x"fe0bac12", +1177 => x"0c8c1308", +1178 => x"72710c72", +1179 => x"84120c72", +1180 => x"88120c51", +1181 => x"8a0b8c12", +1182 => x"23820b8e", +1183 => x"12237190", +1184 => x"120c7194", +1185 => x"120c7198", +1186 => x"120c709c", +1187 => x"120c80c1", +1188 => x"e50ba012", +1189 => x"0c80c2b1", +1190 => x"0ba4120c", +1191 => x"80c3ad0b", +1192 => x"a8120c80", +1193 => x"c3fe0bac", +1194 => x"120c5050", +1195 => x"5004f83d", +1196 => x"0d7a80cf", +1197 => x"ec08b811", +1198 => x"08575758", +1199 => x"7481ec38", +1200 => x"a8f60bbc", +1201 => x"170c810b", +1202 => x"b8170c74", +1203 => x"84dc170c", +1204 => x"830b84e0", +1205 => x"170c84e8", +1206 => x"1684e417", +1207 => x"0c841608", +1208 => x"75710c75", +1209 => x"84120c75", +1210 => x"88120c59", +1211 => x"840b8c1a", +1212 => x"23748e1a", +1213 => x"2374901a", +1214 => x"0c74941a", +1215 => x"0c74981a", +1216 => x"0c789c1a", +1217 => x"0c80c1e5", +1218 => x"0ba01a0c", +1219 => x"80c2b10b", +1220 => x"a41a0c80", +1221 => x"c3ad0ba8", +1222 => x"1a0c80c3", +1223 => x"fe0bac1a", +1224 => x"0c881608", +1225 => x"75710c75", +1226 => x"84120c75", +1227 => x"88120c57", +1228 => x"890b8c18", +1229 => x"23810b8e", +1230 => x"18237490", +1231 => x"180c7494", +1232 => x"180c7498", +1233 => x"180c769c", +1234 => x"180c80c1", +1235 => x"e50ba018", +1236 => x"0c80c2b1", +1237 => x"0ba4180c", +1238 => x"80c3ad0b", +1239 => x"a8180c80", +1240 => x"c3fe0bac", +1241 => x"180c8c16", +1242 => x"0875710c", +1243 => x"7584120c", +1244 => x"7588120c", +1245 => x"548a0b8c", +1246 => x"1523820b", +1247 => x"8e152374", +1248 => x"90150c74", +1249 => x"94150c74", +1250 => x"98150c73", +1251 => x"9c150c80", +1252 => x"c1e50ba0", +1253 => x"150c80c2", +1254 => x"b10ba415", +1255 => x"0c80c3ad", +1256 => x"0ba8150c", +1257 => x"80c3fe0b", +1258 => x"ac150c84", +1259 => x"dc168811", +1260 => x"08841208", +1261 => x"ff055757", +1262 => x"57807524", +1263 => x"9f388c16", +1264 => x"2270902b", +1265 => x"70902c51", +1266 => x"55597380", +1267 => x"2e80ed38", +1268 => x"80dc16ff", +1269 => x"16565674", +1270 => x"8025e338", +1271 => x"76085574", +1272 => x"802e8f38", +1273 => x"74881108", +1274 => x"841208ff", +1275 => x"05575757", +1276 => x"c83982fc", +1277 => x"5277518a", +1278 => x"df3f8008", +1279 => x"80085556", +1280 => x"8008802e", +1281 => x"a3388008", +1282 => x"8c057580", +1283 => x"080c5484", +1284 => x"0b800884", +1285 => x"050c7380", +1286 => x"0888050c", +1287 => x"82f05374", +1288 => x"52735197", +1289 => x"fd3f7554", +1290 => x"7374780c", +1291 => x"5573ffb4", +1292 => x"388c780c", +1293 => x"800b800c", +1294 => x"8a3d0d04", +1295 => x"810b8c17", +1296 => x"2373760c", +1297 => x"7388170c", +1298 => x"7384170c", +1299 => x"7390170c", +1300 => x"7394170c", +1301 => x"7398170c", +1302 => x"ff0b8e17", +1303 => x"2373b017", +1304 => x"0c73b417", +1305 => x"0c7380c4", +1306 => x"170c7380", +1307 => x"c8170c75", +1308 => x"800c8a3d", +1309 => x"0d047070", +1310 => x"a1aa5273", +1311 => x"5186a63f", +1312 => x"50500470", +1313 => x"70a1aa52", +1314 => x"80cfec08", +1315 => x"5186963f", +1316 => x"505004fb", +1317 => x"3d0d7770", +1318 => x"52569890", +1319 => x"3f80d7a8", +1320 => x"0b880508", +1321 => x"841108fc", +1322 => x"06707b31", +1323 => x"9fef05e0", +1324 => x"8006e080", +1325 => x"05525555", +1326 => x"a0807524", +1327 => x"94388052", +1328 => x"755197ea", +1329 => x"3f80d7b0", +1330 => x"08145372", +1331 => x"80082e8f", +1332 => x"38755197", +1333 => x"d83f8053", +1334 => x"72800c87", +1335 => x"3d0d0474", +1336 => x"30527551", +1337 => x"97c83f80", +1338 => x"08ff2ea8", +1339 => x"3880d7a8", +1340 => x"0b880508", +1341 => x"74763181", +1342 => x"0784120c", +1343 => x"5380d6ec", +1344 => x"08753180", +1345 => x"d6ec0c75", +1346 => x"5197a23f", +1347 => x"810b800c", +1348 => x"873d0d04", +1349 => x"80527551", +1350 => x"97943f80", +1351 => x"d7a80b88", +1352 => x"05088008", +1353 => x"71315454", +1354 => x"8f7325ff", +1355 => x"a4388008", +1356 => x"80d79c08", +1357 => x"3180d6ec", +1358 => x"0c728107", +1359 => x"84150c75", +1360 => x"5196ea3f", +1361 => x"8053ff90", +1362 => x"39f73d0d", +1363 => x"7b7d545a", +1364 => x"72802e82", +1365 => x"83387951", +1366 => x"96d23ff8", +1367 => x"13841108", +1368 => x"70fe0670", +1369 => x"13841108", +1370 => x"fc065c57", +1371 => x"58545780", +1372 => x"d7b00874", +1373 => x"2e82de38", +1374 => x"7784150c", +1375 => x"80738106", +1376 => x"56597479", +1377 => x"2e81d538", +1378 => x"77148411", +1379 => x"08810656", +1380 => x"5374a038", +1381 => x"77165678", +1382 => x"81e63888", +1383 => x"14085574", +1384 => x"80d7b02e", +1385 => x"82f9388c", +1386 => x"1408708c", +1387 => x"170c7588", +1388 => x"120c5875", +1389 => x"81078418", +1390 => x"0c751776", +1391 => x"710c5478", +1392 => x"81913883", +1393 => x"ff762781", +1394 => x"c8387589", +1395 => x"2a76832a", +1396 => x"54547380", +1397 => x"2ebf3875", +1398 => x"862ab805", +1399 => x"53847427", +1400 => x"b43880db", +1401 => x"14539474", +1402 => x"27ab3875", +1403 => x"8c2a80ee", +1404 => x"055380d4", +1405 => x"74279e38", +1406 => x"758f2a80", +1407 => x"f7055382", +1408 => x"d4742791", +1409 => x"3875922a", +1410 => x"80fc0553", +1411 => x"8ad47427", +1412 => x"843880fe", +1413 => x"53721010", +1414 => x"1080d7a8", +1415 => x"05881108", +1416 => x"55557375", +1417 => x"2e82bf38", +1418 => x"841408fc", +1419 => x"06597579", +1420 => x"278d3888", +1421 => x"14085473", +1422 => x"752e0981", +1423 => x"06ea388c", +1424 => x"1408708c", +1425 => x"190c7488", +1426 => x"190c7788", +1427 => x"120c5576", +1428 => x"8c150c79", +1429 => x"5194d63f", +1430 => x"8b3d0d04", +1431 => x"76087771", +1432 => x"31587605", +1433 => x"88180856", +1434 => x"567480d7", +1435 => x"b02e80e0", +1436 => x"388c1708", +1437 => x"708c170c", +1438 => x"7588120c", +1439 => x"53fe8939", +1440 => x"8814088c", +1441 => x"1508708c", +1442 => x"130c5988", +1443 => x"190cfea3", +1444 => x"3975832a", +1445 => x"70545480", +1446 => x"74248198", +1447 => x"3872822c", +1448 => x"81712b80", +1449 => x"d7ac0807", +1450 => x"80d7a80b", +1451 => x"84050c74", +1452 => x"10101080", +1453 => x"d7a80588", +1454 => x"1108718c", +1455 => x"1b0c7088", +1456 => x"1b0c7988", +1457 => x"130c565a", +1458 => x"55768c15", +1459 => x"0cff8439", +1460 => x"8159fdb4", +1461 => x"39771673", +1462 => x"81065455", +1463 => x"72983876", +1464 => x"08777131", +1465 => x"5875058c", +1466 => x"18088819", +1467 => x"08718c12", +1468 => x"0c88120c", +1469 => x"55557481", +1470 => x"0784180c", +1471 => x"7680d7a8", +1472 => x"0b88050c", +1473 => x"80d7a408", +1474 => x"7526fec7", +1475 => x"3880d7a0", +1476 => x"08527951", +1477 => x"fafd3f79", +1478 => x"5193923f", +1479 => x"feba3981", +1480 => x"778c170c", +1481 => x"7788170c", +1482 => x"758c190c", +1483 => x"7588190c", +1484 => x"59fd8039", +1485 => x"83147082", +1486 => x"2c81712b", +1487 => x"80d7ac08", +1488 => x"0780d7a8", +1489 => x"0b84050c", +1490 => x"75101010", +1491 => x"80d7a805", +1492 => x"88110871", +1493 => x"8c1c0c70", +1494 => x"881c0c7a", +1495 => x"88130c57", +1496 => x"5b5653fe", +1497 => x"e4398073", +1498 => x"24a33872", +1499 => x"822c8171", +1500 => x"2b80d7ac", +1501 => x"080780d7", +1502 => x"a80b8405", +1503 => x"0c58748c", +1504 => x"180c7388", +1505 => x"180c7688", +1506 => x"160cfdc3", +1507 => x"39831370", +1508 => x"822c8171", +1509 => x"2b80d7ac", +1510 => x"080780d7", +1511 => x"a80b8405", +1512 => x"0c5953da", +1513 => x"39f93d0d", +1514 => x"797b5853", +1515 => x"800b80cf", +1516 => x"ec085356", +1517 => x"72722ebc", +1518 => x"3884dc13", +1519 => x"5574762e", +1520 => x"b3388815", +1521 => x"08841608", +1522 => x"ff055454", +1523 => x"80732499", +1524 => x"388c1422", +1525 => x"70902b53", +1526 => x"587180d4", +1527 => x"3880dc14", +1528 => x"ff145454", +1529 => x"728025e9", +1530 => x"38740855", +1531 => x"74d43880", +1532 => x"cfec0852", +1533 => x"84dc1255", +1534 => x"74802ead", +1535 => x"38881508", +1536 => x"841608ff", +1537 => x"05545480", +1538 => x"73249838", +1539 => x"8c142270", +1540 => x"902b5358", +1541 => x"71ad3880", +1542 => x"dc14ff14", +1543 => x"54547280", +1544 => x"25ea3874", +1545 => x"085574d5", +1546 => x"3875800c", +1547 => x"893d0d04", +1548 => x"7351762d", +1549 => x"75800807", +1550 => x"80dc15ff", +1551 => x"15555556", +1552 => x"ffa23973", +1553 => x"51762d75", +1554 => x"80080780", +1555 => x"dc15ff15", +1556 => x"555556ca", +1557 => x"39ea3d0d", +1558 => x"688c1122", +1559 => x"700a100a", +1560 => x"81065758", +1561 => x"567480e4", +1562 => x"388e1622", +1563 => x"70902b70", +1564 => x"902c5155", +1565 => x"58807424", +1566 => x"b138983d", +1567 => x"c4055373", +1568 => x"5280cfec", +1569 => x"08519481", +1570 => x"3f800b80", +1571 => x"08249738", +1572 => x"7983e080", +1573 => x"06547380", +1574 => x"c0802e81", +1575 => x"8f387382", +1576 => x"80802e81", +1577 => x"91388c16", +1578 => x"22577690", +1579 => x"80075473", +1580 => x"8c172388", +1581 => x"805280cf", +1582 => x"ec085181", +1583 => x"9b3f8008", +1584 => x"9d388c16", +1585 => x"22820755", +1586 => x"748c1723", +1587 => x"80c31670", +1588 => x"770c9017", +1589 => x"0c810b94", +1590 => x"170c983d", +1591 => x"0d0480cf", +1592 => x"ec08a8f6", +1593 => x"0bbc120c", +1594 => x"588c1622", +1595 => x"81800754", +1596 => x"738c1723", +1597 => x"8008760c", +1598 => x"80089017", +1599 => x"0c88800b", +1600 => x"94170c74", +1601 => x"802ed338", +1602 => x"8e162270", +1603 => x"902b7090", +1604 => x"2c535654", +1605 => x"9afb3f80", +1606 => x"08802eff", +1607 => x"bd388c16", +1608 => x"22810757", +1609 => x"768c1723", +1610 => x"983d0d04", +1611 => x"810b8c17", +1612 => x"225855fe", +1613 => x"f539a816", +1614 => x"0880c3ad", +1615 => x"2e098106", +1616 => x"fee4388c", +1617 => x"16228880", +1618 => x"0754738c", +1619 => x"17238880", +1620 => x"0b80cc17", +1621 => x"0cfedc39", +1622 => x"f43d0d7e", +1623 => x"608b1170", +1624 => x"f8065b55", +1625 => x"555d7296", +1626 => x"26833890", +1627 => x"58807824", +1628 => x"74792607", +1629 => x"55805474", +1630 => x"742e0981", +1631 => x"0680ca38", +1632 => x"7c518ea8", +1633 => x"3f7783f7", +1634 => x"2680c538", +1635 => x"77832a70", +1636 => x"10101080", +1637 => x"d7a8058c", +1638 => x"11085858", +1639 => x"5475772e", +1640 => x"81f03884", +1641 => x"1608fc06", +1642 => x"8c170888", +1643 => x"1808718c", +1644 => x"120c8812", +1645 => x"0c5b7605", +1646 => x"84110881", +1647 => x"0784120c", +1648 => x"537c518d", +1649 => x"e83f8816", +1650 => x"5473800c", +1651 => x"8e3d0d04", +1652 => x"77892a78", +1653 => x"832a5854", +1654 => x"73802ebf", +1655 => x"3877862a", +1656 => x"b8055784", +1657 => x"7427b438", +1658 => x"80db1457", +1659 => x"947427ab", +1660 => x"38778c2a", +1661 => x"80ee0557", +1662 => x"80d47427", +1663 => x"9e38778f", +1664 => x"2a80f705", +1665 => x"5782d474", +1666 => x"27913877", +1667 => x"922a80fc", +1668 => x"05578ad4", +1669 => x"74278438", +1670 => x"80fe5776", +1671 => x"10101080", +1672 => x"d7a8058c", +1673 => x"11085653", +1674 => x"74732ea3", +1675 => x"38841508", +1676 => x"fc067079", +1677 => x"31555673", +1678 => x"8f2488e4", +1679 => x"38738025", +1680 => x"88e6388c", +1681 => x"15085574", +1682 => x"732e0981", +1683 => x"06df3881", +1684 => x"175980d7", +1685 => x"b8085675", +1686 => x"80d7b02e", +1687 => x"82cc3884", +1688 => x"1608fc06", +1689 => x"70793155", +1690 => x"55738f24", +1691 => x"bb3880d7", +1692 => x"b00b80d7", +1693 => x"bc0c80d7", +1694 => x"b00b80d7", +1695 => x"b80c8074", +1696 => x"2480db38", +1697 => x"74168411", +1698 => x"08810784", +1699 => x"120c53fe", +1700 => x"b0398816", +1701 => x"8c110857", +1702 => x"5975792e", +1703 => x"098106fe", +1704 => x"82388214", +1705 => x"59ffab39", +1706 => x"77167881", +1707 => x"0784180c", +1708 => x"7080d7bc", +1709 => x"0c7080d7", +1710 => x"b80c80d7", +1711 => x"b00b8c12", +1712 => x"0c8c1108", +1713 => x"88120c74", +1714 => x"81078412", +1715 => x"0c740574", +1716 => x"710c5b7c", +1717 => x"518bd63f", +1718 => x"881654fd", +1719 => x"ec3983ff", +1720 => x"75278391", +1721 => x"3874892a", +1722 => x"75832a54", +1723 => x"5473802e", +1724 => x"bf387486", +1725 => x"2ab80553", +1726 => x"847427b4", +1727 => x"3880db14", +1728 => x"53947427", +1729 => x"ab38748c", +1730 => x"2a80ee05", +1731 => x"5380d474", +1732 => x"279e3874", +1733 => x"8f2a80f7", +1734 => x"055382d4", +1735 => x"74279138", +1736 => x"74922a80", +1737 => x"fc05538a", +1738 => x"d4742784", +1739 => x"3880fe53", +1740 => x"72101010", +1741 => x"80d7a805", +1742 => x"88110855", +1743 => x"5773772e", +1744 => x"868b3884", +1745 => x"1408fc06", +1746 => x"5b747b27", +1747 => x"8d388814", +1748 => x"08547377", +1749 => x"2e098106", +1750 => x"ea388c14", +1751 => x"0880d7a8", +1752 => x"0b840508", +1753 => x"718c190c", +1754 => x"7588190c", +1755 => x"7788130c", +1756 => x"5c57758c", +1757 => x"150c7853", +1758 => x"80792483", +1759 => x"98387282", +1760 => x"2c81712b", +1761 => x"5656747b", +1762 => x"2680ca38", +1763 => x"7a750657", +1764 => x"7682a338", +1765 => x"78fc0684", +1766 => x"05597410", +1767 => x"707c0655", +1768 => x"55738292", +1769 => x"38841959", +1770 => x"f13980d7", +1771 => x"a80b8405", +1772 => x"0879545b", +1773 => x"788025c6", +1774 => x"3882da39", +1775 => x"74097b06", +1776 => x"7080d7a8", +1777 => x"0b84050c", +1778 => x"5b741055", +1779 => x"747b2685", +1780 => x"387485bc", +1781 => x"3880d7a8", +1782 => x"0b880508", +1783 => x"70841208", +1784 => x"fc06707b", +1785 => x"317b7226", +1786 => x"8f722507", +1787 => x"5d575c5c", +1788 => x"5578802e", +1789 => x"80d93879", +1790 => x"1580d7a0", +1791 => x"08199011", +1792 => x"59545680", +1793 => x"d79c08ff", +1794 => x"2e8838a0", +1795 => x"8f13e080", +1796 => x"06577652", +1797 => x"7c518996", +1798 => x"3f800854", +1799 => x"8008ff2e", +1800 => x"90388008", +1801 => x"762782a7", +1802 => x"387480d7", +1803 => x"a82e829f", +1804 => x"3880d7a8", +1805 => x"0b880508", +1806 => x"55841508", +1807 => x"fc067079", +1808 => x"31797226", +1809 => x"8f722507", +1810 => x"5d555a7a", +1811 => x"83f23877", +1812 => x"81078416", +1813 => x"0c771570", +1814 => x"80d7a80b", +1815 => x"88050c74", +1816 => x"81078412", +1817 => x"0c567c51", +1818 => x"88c33f88", +1819 => x"15547380", +1820 => x"0c8e3d0d", +1821 => x"0474832a", +1822 => x"70545480", +1823 => x"7424819b", +1824 => x"3872822c", +1825 => x"81712b80", +1826 => x"d7ac0807", +1827 => x"7080d7a8", +1828 => x"0b84050c", +1829 => x"75101010", +1830 => x"80d7a805", +1831 => x"88110871", +1832 => x"8c1b0c70", +1833 => x"881b0c79", +1834 => x"88130c57", +1835 => x"555c5575", +1836 => x"8c150cfd", +1837 => x"c1397879", +1838 => x"10101080", +1839 => x"d7a80570", +1840 => x"565b5c8c", +1841 => x"14085675", +1842 => x"742ea338", +1843 => x"841608fc", +1844 => x"06707931", +1845 => x"5853768f", +1846 => x"2483f138", +1847 => x"76802584", +1848 => x"af388c16", +1849 => x"08567574", +1850 => x"2e098106", +1851 => x"df388814", +1852 => x"811a7083", +1853 => x"06555a54", +1854 => x"72c9387b", +1855 => x"83065675", +1856 => x"802efdb8", +1857 => x"38ff1cf8", +1858 => x"1b5b5c88", +1859 => x"1a087a2e", +1860 => x"ea38fdb5", +1861 => x"39831953", +1862 => x"fce43983", +1863 => x"1470822c", +1864 => x"81712b80", +1865 => x"d7ac0807", +1866 => x"7080d7a8", +1867 => x"0b84050c", +1868 => x"76101010", +1869 => x"80d7a805", +1870 => x"88110871", +1871 => x"8c1c0c70", +1872 => x"881c0c7a", +1873 => x"88130c58", +1874 => x"535d5653", +1875 => x"fee13980", +1876 => x"d6ec0817", +1877 => x"59800876", +1878 => x"2e818b38", +1879 => x"80d79c08", +1880 => x"ff2e848e", +1881 => x"38737631", +1882 => x"1980d6ec", +1883 => x"0c738706", +1884 => x"70565372", +1885 => x"802e8838", +1886 => x"88733170", +1887 => x"15555576", +1888 => x"149fff06", +1889 => x"a0807131", +1890 => x"1670547e", +1891 => x"53515386", +1892 => x"9d3f8008", +1893 => x"568008ff", +1894 => x"2e819e38", +1895 => x"80d6ec08", +1896 => x"137080d6", +1897 => x"ec0c7475", +1898 => x"80d7a80b", +1899 => x"88050c77", +1900 => x"76311581", +1901 => x"07555659", +1902 => x"7a80d7a8", +1903 => x"2e83c038", +1904 => x"798f2682", +1905 => x"ef38810b", +1906 => x"84150c84", +1907 => x"1508fc06", +1908 => x"70793179", +1909 => x"72268f72", +1910 => x"25075d55", +1911 => x"5a7a802e", +1912 => x"fced3880", +1913 => x"db398008", +1914 => x"9fff0655", +1915 => x"74feed38", +1916 => x"7880d6ec", +1917 => x"0c80d7a8", +1918 => x"0b880508", +1919 => x"7a188107", +1920 => x"84120c55", +1921 => x"80d79808", +1922 => x"79278638", +1923 => x"7880d798", +1924 => x"0c80d794", +1925 => x"087927fc", +1926 => x"a0387880", +1927 => x"d7940c84", +1928 => x"1508fc06", +1929 => x"70793179", +1930 => x"72268f72", +1931 => x"25075d55", +1932 => x"5a7a802e", +1933 => x"fc993888", +1934 => x"39807457", +1935 => x"53fedd39", +1936 => x"7c5184e9", +1937 => x"3f800b80", +1938 => x"0c8e3d0d", +1939 => x"04807324", +1940 => x"a5387282", +1941 => x"2c81712b", +1942 => x"80d7ac08", +1943 => x"077080d7", +1944 => x"a80b8405", +1945 => x"0c5c5a76", +1946 => x"8c170c73", +1947 => x"88170c75", +1948 => x"88180cf9", +1949 => x"fd398313", +1950 => x"70822c81", +1951 => x"712b80d7", +1952 => x"ac080770", +1953 => x"80d7a80b", +1954 => x"84050c5d", +1955 => x"5b53d839", +1956 => x"7a75065c", +1957 => x"7bfc9f38", +1958 => x"84197510", +1959 => x"5659f139", +1960 => x"ff178105", +1961 => x"59f7ab39", +1962 => x"8c150888", +1963 => x"1608718c", +1964 => x"120c8812", +1965 => x"0c597515", +1966 => x"84110881", +1967 => x"0784120c", +1968 => x"587c5183", +1969 => x"e83f8815", +1970 => x"54fba339", +1971 => x"77167881", +1972 => x"0784180c", +1973 => x"8c170888", +1974 => x"1808718c", +1975 => x"120c8812", +1976 => x"0c5c7080", +1977 => x"d7bc0c70", +1978 => x"80d7b80c", +1979 => x"80d7b00b", +1980 => x"8c120c8c", +1981 => x"11088812", +1982 => x"0c778107", +1983 => x"84120c77", +1984 => x"0577710c", +1985 => x"557c5183", +1986 => x"a43f8816", +1987 => x"54f5ba39", +1988 => x"72168411", +1989 => x"08810784", +1990 => x"120c588c", +1991 => x"16088817", +1992 => x"08718c12", +1993 => x"0c88120c", +1994 => x"577c5183", +1995 => x"803f8816", +1996 => x"54f59639", +1997 => x"7284150c", +1998 => x"f41af806", +1999 => x"70841d08", +2000 => x"81060784", +2001 => x"1d0c701c", +2002 => x"5556850b", +2003 => x"84150c85", +2004 => x"0b88150c", +2005 => x"8f7627fd", +2006 => x"ab38881b", +2007 => x"527c51eb", +2008 => x"e83f80d7", +2009 => x"a80b8805", +2010 => x"0880d6ec", +2011 => x"085a55fd", +2012 => x"93397880", +2013 => x"d6ec0c73", +2014 => x"80d79c0c", +2015 => x"fbef3972", +2016 => x"84150cfc", +2017 => x"ff39fb3d", +2018 => x"0d77707a", +2019 => x"7c585553", +2020 => x"568f7527", +2021 => x"80e63872", +2022 => x"76078306", +2023 => x"517080dc", +2024 => x"38757352", +2025 => x"54707084", +2026 => x"05520874", +2027 => x"70840556", +2028 => x"0c737170", +2029 => x"84055308", +2030 => x"71708405", +2031 => x"530c7170", +2032 => x"84055308", +2033 => x"71708405", +2034 => x"530c7170", +2035 => x"84055308", +2036 => x"71708405", +2037 => x"530cf016", +2038 => x"5654748f", +2039 => x"26c73883", +2040 => x"75279538", +2041 => x"70708405", +2042 => x"52087470", +2043 => x"8405560c", +2044 => x"fc155574", +2045 => x"8326ed38", +2046 => x"73715452", +2047 => x"ff155170", +2048 => x"ff2e9838", +2049 => x"72708105", +2050 => x"54337270", +2051 => x"81055434", +2052 => x"ff115170", +2053 => x"ff2e0981", +2054 => x"06ea3875", +2055 => x"800c873d", +2056 => x"0d04fb3d", +2057 => x"0d777a71", +2058 => x"028c05a3", +2059 => x"05335854", +2060 => x"54568373", +2061 => x"2780d438", +2062 => x"75830651", +2063 => x"7080cc38", +2064 => x"74882b75", +2065 => x"07707190", +2066 => x"2b075551", +2067 => x"8f7327a7", +2068 => x"38737270", +2069 => x"8405540c", +2070 => x"71747170", +2071 => x"8405530c", +2072 => x"74717084", +2073 => x"05530c74", +2074 => x"71708405", +2075 => x"530cf014", +2076 => x"5452728f", +2077 => x"26db3883", +2078 => x"73279038", +2079 => x"73727084", +2080 => x"05540cfc", +2081 => x"13537283", +2082 => x"26f238ff", +2083 => x"135170ff", +2084 => x"2e933874", +2085 => x"72708105", +2086 => x"5434ff11", +2087 => x"5170ff2e", +2088 => x"098106ef", +2089 => x"3875800c", +2090 => x"873d0d04", +2091 => x"04047070", +2092 => x"7070800b", +2093 => x"80dfe40c", +2094 => x"765184f3", +2095 => x"3f800853", +2096 => x"8008ff2e", +2097 => x"89387280", +2098 => x"0c505050", +2099 => x"500480df", +2100 => x"e4085473", +2101 => x"802eef38", +2102 => x"7574710c", +2103 => x"5272800c", +2104 => x"50505050", +2105 => x"04f93d0d", +2106 => x"797c557b", +2107 => x"548e1122", +2108 => x"70902b70", +2109 => x"902c5557", +2110 => x"80cfec08", +2111 => x"53585683", +2112 => x"f63f8008", +2113 => x"57800b80", +2114 => x"08249338", +2115 => x"80d01608", +2116 => x"80080580", +2117 => x"d0170c76", +2118 => x"800c893d", +2119 => x"0d048c16", +2120 => x"2283dfff", +2121 => x"0655748c", +2122 => x"17237680", +2123 => x"0c893d0d", +2124 => x"04fa3d0d", +2125 => x"788c1122", +2126 => x"70882a70", +2127 => x"81065157", +2128 => x"585674a9", +2129 => x"388c1622", +2130 => x"83dfff06", +2131 => x"55748c17", +2132 => x"237a5479", +2133 => x"538e1622", +2134 => x"70902b70", +2135 => x"902c5456", +2136 => x"80cfec08", +2137 => x"525681b2", +2138 => x"3f883d0d", +2139 => x"04825480", +2140 => x"538e1622", +2141 => x"70902b70", +2142 => x"902c5456", +2143 => x"80cfec08", +2144 => x"525782bb", +2145 => x"3f8c1622", +2146 => x"83dfff06", +2147 => x"55748c17", +2148 => x"237a5479", +2149 => x"538e1622", +2150 => x"70902b70", +2151 => x"902c5456", +2152 => x"80cfec08", +2153 => x"525680f2", +2154 => x"3f883d0d", +2155 => x"04f93d0d", +2156 => x"797c557b", +2157 => x"548e1122", +2158 => x"70902b70", +2159 => x"902c5557", +2160 => x"80cfec08", +2161 => x"53585681", +2162 => x"f63f8008", +2163 => x"578008ff", +2164 => x"2e99388c", +2165 => x"1622a080", +2166 => x"0755748c", +2167 => x"17238008", +2168 => x"80d0170c", +2169 => x"76800c89", +2170 => x"3d0d048c", +2171 => x"162283df", +2172 => x"ff065574", +2173 => x"8c172376", +2174 => x"800c893d", +2175 => x"0d047070", +2176 => x"70748e11", +2177 => x"2270902b", +2178 => x"70902c55", +2179 => x"51515380", +2180 => x"cfec0851", +2181 => x"bd3f5050", +2182 => x"5004fb3d", +2183 => x"0d800b80", +2184 => x"dfe40c7a", +2185 => x"53795278", +2186 => x"5182fc3f", +2187 => x"80085580", +2188 => x"08ff2e88", +2189 => x"3874800c", +2190 => x"873d0d04", +2191 => x"80dfe408", +2192 => x"5675802e", +2193 => x"f0387776", +2194 => x"710c5474", +2195 => x"800c873d", +2196 => x"0d047070", +2197 => x"7070800b", +2198 => x"80dfe40c", +2199 => x"765184c9", +2200 => x"3f800853", +2201 => x"8008ff2e", +2202 => x"89387280", +2203 => x"0c505050", +2204 => x"500480df", +2205 => x"e4085473", +2206 => x"802eef38", +2207 => x"7574710c", +2208 => x"5272800c", +2209 => x"50505050", +2210 => x"04fc3d0d", +2211 => x"800b80df", +2212 => x"e40c7852", +2213 => x"775187b0", +2214 => x"3f800854", +2215 => x"8008ff2e", +2216 => x"88387380", +2217 => x"0c863d0d", +2218 => x"0480dfe4", +2219 => x"08557480", +2220 => x"2ef03876", +2221 => x"75710c53", +2222 => x"73800c86", +2223 => x"3d0d04fb", +2224 => x"3d0d800b", +2225 => x"80dfe40c", +2226 => x"7a537952", +2227 => x"7851848b", +2228 => x"3f800855", +2229 => x"8008ff2e", +2230 => x"88387480", +2231 => x"0c873d0d", +2232 => x"0480dfe4", +2233 => x"08567580", +2234 => x"2ef03877", +2235 => x"76710c54", +2236 => x"74800c87", +2237 => x"3d0d04fb", +2238 => x"3d0d800b", +2239 => x"80dfe40c", +2240 => x"7a537952", +2241 => x"78518293", +2242 => x"3f800855", +2243 => x"8008ff2e", +2244 => x"88387480", +2245 => x"0c873d0d", +2246 => x"0480dfe4", +2247 => x"08567580", +2248 => x"2ef03877", +2249 => x"76710c54", +2250 => x"74800c87", +2251 => x"3d0d0470", +2252 => x"707080df", +2253 => x"d8088938", +2254 => x"80dfe80b", +2255 => x"80dfd80c", +2256 => x"80dfd808", +2257 => x"75115252", +2258 => x"ff537087", +2259 => x"fb808026", +2260 => x"88387080", +2261 => x"dfd80c71", +2262 => x"5372800c", +2263 => x"50505004", +2264 => x"fd3d0d80", +2265 => x"0b80cfe0", +2266 => x"08545472", +2267 => x"812e9b38", +2268 => x"7380dfdc", +2269 => x"0cc2af3f", +2270 => x"c1863f80", +2271 => x"dfb05281", +2272 => x"51c3ff3f", +2273 => x"80085186", +2274 => x"bf3f7280", +2275 => x"dfdc0cc2", +2276 => x"953fc0ec", +2277 => x"3f80dfb0", +2278 => x"528151c3", +2279 => x"e53f8008", +2280 => x"5186a53f", +2281 => x"00ff39f5", +2282 => x"3d0d7e60", +2283 => x"80dfdc08", +2284 => x"705b585b", +2285 => x"5b7580c2", +2286 => x"38777a25", +2287 => x"a138771b", +2288 => x"70337081", +2289 => x"ff065858", +2290 => x"59758a2e", +2291 => x"98387681", +2292 => x"ff0651c1", +2293 => x"b03f8118", +2294 => x"58797824", +2295 => x"e1387980", +2296 => x"0c8d3d0d", +2297 => x"048d51c1", +2298 => x"9c3f7833", +2299 => x"7081ff06", +2300 => x"5257c191", +2301 => x"3f811858", +2302 => x"e0397955", +2303 => x"7a547d53", +2304 => x"85528d3d", +2305 => x"fc0551c0", +2306 => x"b93f8008", +2307 => x"5685b23f", +2308 => x"7b80080c", +2309 => x"75800c8d", +2310 => x"3d0d04f6", +2311 => x"3d0d7d7f", +2312 => x"80dfdc08", +2313 => x"705b585a", +2314 => x"5a7580c1", +2315 => x"38777925", +2316 => x"b338c0ac", +2317 => x"3f800881", +2318 => x"ff06708d", +2319 => x"32703070", +2320 => x"9f2a5151", +2321 => x"5757768a", +2322 => x"2e80c438", +2323 => x"75802ebf", +2324 => x"38771a56", +2325 => x"76763476", +2326 => x"51c0aa3f", +2327 => x"81185878", +2328 => x"7824cf38", +2329 => x"77567580", +2330 => x"0c8c3d0d", +2331 => x"04785579", +2332 => x"547c5384", +2333 => x"528c3dfc", +2334 => x"0551ffbf", +2335 => x"c53f8008", +2336 => x"5684be3f", +2337 => x"7a80080c", +2338 => x"75800c8c", +2339 => x"3d0d0477", +2340 => x"1a598a79", +2341 => x"34811858", +2342 => x"8d51ffbf", +2343 => x"e83f8a51", +2344 => x"ffbfe23f", +2345 => x"7756ffbe", +2346 => x"39fb3d0d", +2347 => x"80dfdc08", +2348 => x"70565473", +2349 => x"88387480", +2350 => x"0c873d0d", +2351 => x"04775383", +2352 => x"52873dfc", +2353 => x"0551ffbe", +2354 => x"f93f8008", +2355 => x"5483f23f", +2356 => x"7580080c", +2357 => x"73800c87", +2358 => x"3d0d04fa", +2359 => x"3d0d80df", +2360 => x"dc08802e", +2361 => x"a3387a55", +2362 => x"79547853", +2363 => x"8652883d", +2364 => x"fc0551ff", +2365 => x"becc3f80", +2366 => x"085683c5", +2367 => x"3f768008", +2368 => x"0c75800c", +2369 => x"883d0d04", +2370 => x"83b73f9d", +2371 => x"0b80080c", +2372 => x"ff0b800c", +2373 => x"883d0d04", +2374 => x"f73d0d7b", +2375 => x"7d5b59bc", +2376 => x"53805279", +2377 => x"51f5fb3f", +2378 => x"80705657", +2379 => x"98567419", +2380 => x"70337078", +2381 => x"2b790781", +2382 => x"18f81a5a", +2383 => x"58595558", +2384 => x"847524ea", +2385 => x"38767a23", +2386 => x"84195880", +2387 => x"70565798", +2388 => x"56741870", +2389 => x"3370782b", +2390 => x"79078118", +2391 => x"f81a5a58", +2392 => x"59515484", +2393 => x"7524ea38", +2394 => x"76821b23", +2395 => x"88195880", +2396 => x"70565798", +2397 => x"56741870", +2398 => x"3370782b", +2399 => x"79078118", +2400 => x"f81a5a58", +2401 => x"59515484", +2402 => x"7524ea38", +2403 => x"76841b0c", +2404 => x"8c195880", +2405 => x"70565798", +2406 => x"56741870", +2407 => x"3370782b", +2408 => x"79078118", +2409 => x"f81a5a58", +2410 => x"59515484", +2411 => x"7524ea38", +2412 => x"76881b23", +2413 => x"90195880", +2414 => x"70565798", +2415 => x"56741870", +2416 => x"3370782b", +2417 => x"79078118", +2418 => x"f81a5a58", +2419 => x"59515484", +2420 => x"7524ea38", +2421 => x"768a1b23", +2422 => x"94195880", +2423 => x"70565798", +2424 => x"56741870", +2425 => x"3370782b", +2426 => x"79078118", +2427 => x"f81a5a58", +2428 => x"59515484", +2429 => x"7524ea38", +2430 => x"768c1b23", +2431 => x"98195880", +2432 => x"70565798", +2433 => x"56741870", +2434 => x"3370782b", +2435 => x"79078118", +2436 => x"f81a5a58", +2437 => x"59515484", +2438 => x"7524ea38", +2439 => x"768e1b23", +2440 => x"9c195880", +2441 => x"705657b8", +2442 => x"56741870", +2443 => x"3370782b", +2444 => x"79078118", +2445 => x"f81a5a58", +2446 => x"595a5488", +2447 => x"7524ea38", +2448 => x"76901b0c", +2449 => x"8b3d0d04", +2450 => x"e93d0d6a", +2451 => x"80dfdc08", +2452 => x"57577593", +2453 => x"3880c080", +2454 => x"0b84180c", +2455 => x"75ac180c", +2456 => x"75800c99", +2457 => x"3d0d0489", +2458 => x"3d70556a", +2459 => x"54558a52", +2460 => x"993dffbc", +2461 => x"0551ffbb", +2462 => x"c93f8008", +2463 => x"77537552", +2464 => x"56fd953f", +2465 => x"bc3f7780", +2466 => x"080c7580", +2467 => x"0c993d0d", +2468 => x"04fc3d0d", +2469 => x"815480df", +2470 => x"dc088838", +2471 => x"73800c86", +2472 => x"3d0d0476", +2473 => x"5397b952", +2474 => x"863dfc05", +2475 => x"51ffbb92", +2476 => x"3f800854", +2477 => x"8c3f7480", +2478 => x"080c7380", +2479 => x"0c863d0d", +2480 => x"0480cfec", +2481 => x"08800c04", +2482 => x"f73d0d7b", +2483 => x"80cfec08", +2484 => x"82c81108", +2485 => x"5a545a77", +2486 => x"802e80da", +2487 => x"38818818", +2488 => x"841908ff", +2489 => x"0581712b", +2490 => x"59555980", +2491 => x"742480ea", +2492 => x"38807424", +2493 => x"b5387382", +2494 => x"2b781188", +2495 => x"05565681", +2496 => x"80190877", +2497 => x"06537280", +2498 => x"2eb63878", +2499 => x"16700853", +2500 => x"53795174", +2501 => x"0853722d", +2502 => x"ff14fc17", +2503 => x"fc177981", +2504 => x"2c5a5757", +2505 => x"54738025", +2506 => x"d6387708", +2507 => x"5877ffad", +2508 => x"3880cfec", +2509 => x"0853bc13", +2510 => x"08a53879", +2511 => x"51f8e53f", +2512 => x"74085372", +2513 => x"2dff14fc", +2514 => x"17fc1779", +2515 => x"812c5a57", +2516 => x"57547380", +2517 => x"25ffa838", +2518 => x"d1398057", +2519 => x"ff933972", +2520 => x"51bc1308", +2521 => x"54732d79", +2522 => x"51f8b93f", +2523 => x"707080df", +2524 => x"b80bfc05", +2525 => x"70085252", +2526 => x"70ff2e91", +2527 => x"38702dfc", +2528 => x"12700852", +2529 => x"5270ff2e", +2530 => x"098106f1", +2531 => x"38505004", +2532 => x"04ffbaff", +2533 => x"3f040000", +2534 => x"00000040", +2535 => x"476f7420", +2536 => x"696e7465", +2537 => x"72727570", +2538 => x"740a0000", +2539 => x"4e6f2069", +2540 => x"6e746572", +2541 => x"72757074", +2542 => x"0a000000", +2543 => x"43000000", +2544 => x"64756d6d", +2545 => x"792e6578", +2546 => x"65000000", +2547 => x"00ffffff", +2548 => x"ff00ffff", +2549 => x"ffff00ff", +2550 => x"ffffff00", +2551 => x"00000000", +2552 => x"00000000", +2553 => x"00000000", +2554 => x"00002fc0", +2555 => x"000027f0", +2556 => x"00000000", +2557 => x"00002a58", +2558 => x"00002ab4", +2559 => x"00002b10", +2560 => x"00000000", +2561 => x"00000000", +2562 => x"00000000", +2563 => x"00000000", +2564 => x"00000000", +2565 => x"00000000", +2566 => x"00000000", +2567 => x"00000000", +2568 => x"00000000", +2569 => x"000027bc", +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"00000000", +2597 => x"00000000", +2598 => x"00000001", +2599 => x"330eabcd", +2600 => x"1234e66d", +2601 => x"deec0005", +2602 => x"000b0000", +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"00000000", +2790 => x"00000000", +2791 => x"ffffffff", +2792 => x"00000000", +2793 => x"00020000", +2794 => x"00000000", +2795 => x"00000000", +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"00002fa0", +3051 => x"00002fa0", +3052 => x"000027c0", +3053 => x"ffffffff", +3054 => x"00000000", +3055 => x"ffffffff", +3056 => 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/example/log.txt b/zpu/hdl/example/log.txt new file mode 100644 index 0000000..6ee1d94 --- /dev/null +++ b/zpu/hdl/example/log.txt @@ -0,0 +1,20 @@ +Hello world 1
+
+Hello world 2
+
+Hello world 1
+
+Hello world 2
+
+Hello world 1
+
+Hello world 2
+
+Hello world 1
+
+Hello world 2
+
+Hello world 1
+
+Hello world 2
+
diff --git a/zpu/hdl/example/sim_small_fpga_top.vhd b/zpu/hdl/example/sim_small_fpga_top.vhd new file mode 100644 index 0000000..909ea21 --- /dev/null +++ b/zpu/hdl/example/sim_small_fpga_top.vhd @@ -0,0 +1,197 @@ +-- 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; + +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 := '1'; + + + 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 interruptcounter : unsigned(15 downto 0); + signal interrupt : std_logic; + + signal break : std_logic; + +begin + + zpu: zpu_core + port map ( + clk => clk, + reset => 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 => interrupt, + 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'; + + interruptcounter <= to_unsigned(0, 16); + interrupt <= '0'; + + elsif rising_edge(clk) then + enable <= '1'; + io_reading <= io_busy or io_mem_readEnable; + dram_ready <= dram_mem_readEnable; + + -- keep interrupt signal high for 16 cycles + interruptcounter <= interruptcounter + 1; + if (interruptcounter < 16) then + report "Interrupt asserted!" severity note; + interrupt <='1'; + else + interrupt <='0'; + end if; + end if; + end process; + + -- wiggle the clock @ 100MHz + clock: process + begin + clk <= '0'; + wait for 5 ns; + clk <= '1'; + wait for 5 ns; + areset <= '0'; + end process clock; + + +end architecture behave; diff --git a/zpu/hdl/example/sim_small_fpga_top_noint.vhd b/zpu/hdl/example/sim_small_fpga_top_noint.vhd new file mode 100644 index 0000000..23b92cc --- /dev/null +++ b/zpu/hdl/example/sim_small_fpga_top_noint.vhd @@ -0,0 +1,184 @@ +-- 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; + +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 := '1'; + + + 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 + + zpu: zpu_core + port map ( + clk => clk, + reset => 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 rising_edge(clk) 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; + areset <= '0'; + end process clock; + + +end architecture behave; diff --git a/zpu/hdl/example/simzpu_dmips.do b/zpu/hdl/example/simzpu_dmips.do new file mode 100644 index 0000000..883259e --- /dev/null +++ b/zpu/hdl/example/simzpu_dmips.do @@ -0,0 +1,29 @@ +# Xilinx WebPack modelsim script
+#
+#
+# cd C:/workspace/zpu/zpu/hdl/example
+# do simzpu_dmips.do
+
+set BreakOnAssertion 1
+vlib work
+
+vcom -93 -explicit zpu_config.vhd
+vcom -93 -explicit ../zpu4/core/zpupkg.vhd
+vcom -93 -explicit ../zpu4/src/txt_util.vhd
+vcom -93 -explicit sim_small_fpga_top_noint.vhd
+vcom -93 -explicit ../zpu4/core/zpu_core_small.vhd
+vcom -93 -explicit bram_dmips.vhd
+vcom -93 -explicit ../zpu4/src/timer.vhd
+vcom -93 -explicit ../zpu4/src/io.vhd
+vcom -93 -explicit ../zpu4/src/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 10 ms
diff --git a/zpu/hdl/example/simzpu_interrupt.do b/zpu/hdl/example/simzpu_interrupt.do new file mode 100644 index 0000000..864bf76 --- /dev/null +++ b/zpu/hdl/example/simzpu_interrupt.do @@ -0,0 +1,29 @@ +# Xilinx WebPack modelsim script
+#
+#
+# cd C:/workspace/zpu/zpu/hdl/example
+# do simzpu_interrupt.do
+
+set BreakOnAssertion 1
+vlib work
+
+vcom -93 -explicit zpu_config.vhd
+vcom -93 -explicit ../zpu4/core/zpupkg.vhd
+vcom -93 -explicit ../zpu4/src/txt_util.vhd
+vcom -93 -explicit sim_small_fpga_top.vhd
+vcom -93 -explicit ../zpu4/core/zpu_core_small.vhd
+vcom -93 -explicit interrupt.vhd
+vcom -93 -explicit ../zpu4/src/timer.vhd
+vcom -93 -explicit ../zpu4/src/io.vhd
+vcom -93 -explicit ../zpu4/src/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 10 ms
diff --git a/zpu/hdl/example/simzpu_small.do b/zpu/hdl/example/simzpu_small.do new file mode 100644 index 0000000..2b64926 --- /dev/null +++ b/zpu/hdl/example/simzpu_small.do @@ -0,0 +1,29 @@ +# Xilinx WebPack modelsim script
+#
+#
+# cd C:/workspace/zpu/zpu/hdl/example
+# do simzpu_small.do
+
+set BreakOnAssertion 1
+vlib work
+
+vcom -93 -explicit zpu_config.vhd
+vcom -93 -explicit ../zpu4/core/zpupkg.vhd
+vcom -93 -explicit ../zpu4/src/txt_util.vhd
+vcom -93 -explicit sim_small_fpga_top_noint.vhd
+vcom -93 -explicit ../zpu4/core/zpu_core_small.vhd
+vcom -93 -explicit helloworld.vhd
+vcom -93 -explicit ../zpu4/src/timer.vhd
+vcom -93 -explicit ../zpu4/src/io.vhd
+vcom -93 -explicit ../zpu4/src/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 10 ms
diff --git a/zpu/hdl/example/zpu_config.vhd b/zpu/hdl/example/zpu_config.vhd new file mode 100644 index 0000000..cd4163d --- /dev/null +++ b/zpu/hdl/example/zpu_config.vhd @@ -0,0 +1,55 @@ +-- 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; + +package zpu_config is + -- generate trace output + 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"; + -- This is the msb address bit. bytes=2^(maxAddrBitIncIO+1) + constant maxAddrBitIncIO : integer := 27; + constant maxAddrBitBRAM : integer := 16; + + -- start byte address of stack. + -- point to top of RAM - 2*words + constant spStart : std_logic_vector(maxAddrBitIncIO downto 0) := + std_logic_vector(to_unsigned((2**(maxAddrBitBRAM+1))-8, maxAddrBitIncIO+1)); +end zpu_config; diff --git a/zpu/hdl/example/zpuromgen.c b/zpu/hdl/example/zpuromgen.c new file mode 100644 index 0000000..fb8c4ba --- /dev/null +++ b/zpu/hdl/example/zpuromgen.c @@ -0,0 +1,59 @@ +// zpuromgen.c
+//
+// Program to turn a binary file into a VHDL lookup table.
+// by Adam Pierce
+// 29-Feb-2008
+//
+// This software is free to use by anyone for any purpose.
+//
+
+#include <unistd.h>
+#include <stdio.h>
+
+typedef uint8_t BYTE;
+
+main(int argc, char **argv)
+{
+ BYTE opcode[4];
+ int fd;
+ int addr = 0;
+ ssize_t s;
+
+// Check the user has given us an input file.
+ if(argc < 2)
+ {
+ printf("Usage: %s <binary_file>\n\n", argv[0]);
+ return 1;
+ }
+
+// Open the input file.
+ fd = open(argv[1], 0);
+ if(fd == -1)
+ {
+ perror("File Open");
+ return 2;
+ }
+
+ while(1)
+ {
+ // Read 32 bits.
+ s = read(fd, opcode, 4);
+ if(s == -1)
+ {
+ perror("File read");
+ return 3;
+ }
+
+ if(s == 0)
+ break; // End of file.
+
+ // Output to STDOUT.
+ printf("%6d => x\"%02x%02x%02x%02x\",\n",
+ addr++, opcode[0], opcode[1],
+ opcode[2], opcode[3]);
+ }
+
+ close(fd);
+ return 0;
+}
+
diff --git a/zpu/hdl/example/zpuromgen.exe b/zpu/hdl/example/zpuromgen.exe Binary files differnew file mode 100644 index 0000000..6655412 --- /dev/null +++ b/zpu/hdl/example/zpuromgen.exe diff --git a/zpu/hdl/example_ghdl/README b/zpu/hdl/example_ghdl/README new file mode 100644 index 0000000..a098c0c --- /dev/null +++ b/zpu/hdl/example_ghdl/README @@ -0,0 +1,44 @@ +This directory contains a quick setup of the helloworld example for
+the GHDL simulator.
+
+ http://ghdl.free.fr/
+
+Compiled by Arnim Laeuger, 17-Apr-2008.
+Removed ROC/unisim dependency 16-Jun-2008.
+
+Compiling the example
+---------------------
+
+Make all shell scripts executable:
+ $ chmod +x *.sh
+
+On Linux, convert files from DOS format:
+ $ dos2unix *.sh
+
+You need to import the project sources once by running
+ $ ./ghdl_import.sh
+
+Compilation (using GHDL's make feature) is invoked by
+ $ ./ghdl_make.sh
+
+Whenever the VHDL sources change, it's enough to execute ghdl_make.sh. GHDL
+will trace the dependencies and will rebuild only the modified sources.
+
+
+Simulation
+----------
+
+Simulation finally happens by running the fpga_top executable generated by the
+compilation step. Don't forget to set a stop time or the testbench might run
+forever:
+
+ $ ./fpga_top --stop-time=2100us
+
+The log.txt and trace.txt files are generated as simulation progresses. They
+should be compared to the files given in the example directory.
+
+Waveforms can be obtained by specifying the ghw file name:
+
+ $ ./fpga_top --stop-time=1ms --wave=zpu.ghw
+
+They can be inspected with gtkwave from http://home.nc.rr.com/gtkwave/.
diff --git a/zpu/hdl/example_ghdl/dmipssmalltrace_ghdl.sh b/zpu/hdl/example_ghdl/dmipssmalltrace_ghdl.sh new file mode 100644 index 0000000..b3be1a6 --- /dev/null +++ b/zpu/hdl/example_ghdl/dmipssmalltrace_ghdl.sh @@ -0,0 +1,24 @@ +#!/bin/sh
+
+IMPORT_OPTIONS="--std=93 --ieee=synopsys --workdir=work"
+MAKE_OPTIONS="${IMPORT_OPTIONS} -Wl,-s -fexplicit --syn-binding"
+
+if test ! -e work; then
+ echo "Building work library..."
+ mkdir work
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/example/zpu_config.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/core/zpupkg.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/txt_util.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/example/sim_small_fpga_top.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/core/zpu_core_small.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/example/bram_dmips.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/timer.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/io.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/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/example_ghdl/dmipstrace_ghdl.sh b/zpu/hdl/example_ghdl/dmipstrace_ghdl.sh new file mode 100644 index 0000000..53474d4 --- /dev/null +++ b/zpu/hdl/example_ghdl/dmipstrace_ghdl.sh @@ -0,0 +1,24 @@ +#!/bin/sh
+
+IMPORT_OPTIONS="--std=93 --ieee=synopsys --workdir=work"
+MAKE_OPTIONS="${IMPORT_OPTIONS} -Wl,-s -fexplicit --syn-binding"
+
+if test ! -e work; then
+ echo "Building work library..."
+ mkdir work
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/example_medium/zpu_config_trace.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/core/zpupkg.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/txt_util.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/example_medium/sim_fpga_top.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/core/zpu_core.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/example_medium/dram_dmips.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/timer.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/io.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/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/example_ghdl/ghdl_import.sh b/zpu/hdl/example_ghdl/ghdl_import.sh new file mode 100644 index 0000000..b1c2713 --- /dev/null +++ b/zpu/hdl/example_ghdl/ghdl_import.sh @@ -0,0 +1,16 @@ +#!/bin/sh
+. ghdl_options.sh
+
+mkdir -p work
+ghdl -i ${IMPORT_OPTIONS} ../../hdl/example/zpu_config.vhd
+ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/core/zpupkg.vhd
+ghdl -i ${IMPORT_OPTIONS} ../../hdl/example/interrupt.vhd
+# to execute helloworld comment interrupt.vhd above
+# and edit sim_small_fpga_top.vhd to never assert interrupts
+#ghdl -i ${IMPORT_OPTIONS} ../../hdl/example/helloworld.vhd
+ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/txt_util.vhd
+ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/trace.vhd
+ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/core/zpu_core_small.vhd
+ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/io.vhd
+ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/timer.vhd
+ghdl -i ${IMPORT_OPTIONS} ../../hdl/example/sim_small_fpga_top.vhd
diff --git a/zpu/hdl/example_ghdl/ghdl_make.sh b/zpu/hdl/example_ghdl/ghdl_make.sh new file mode 100644 index 0000000..948b100 --- /dev/null +++ b/zpu/hdl/example_ghdl/ghdl_make.sh @@ -0,0 +1,4 @@ +#!/bin/sh
+. ghdl_options.sh
+
+ghdl -m ${MAKE_OPTIONS} fpga_top
diff --git a/zpu/hdl/example_ghdl/ghdl_options.sh b/zpu/hdl/example_ghdl/ghdl_options.sh new file mode 100644 index 0000000..aba231c --- /dev/null +++ b/zpu/hdl/example_ghdl/ghdl_options.sh @@ -0,0 +1,2 @@ +IMPORT_OPTIONS="--std=93 --ieee=synopsys --workdir=work"
+MAKE_OPTIONS="${IMPORT_OPTIONS} -Wl,-s -fexplicit --syn-binding"
diff --git a/zpu/hdl/example_ghdl/simzpu_medium_ghdl.sh b/zpu/hdl/example_ghdl/simzpu_medium_ghdl.sh new file mode 100644 index 0000000..8ba5078 --- /dev/null +++ b/zpu/hdl/example_ghdl/simzpu_medium_ghdl.sh @@ -0,0 +1,24 @@ +#!/bin/sh
+
+IMPORT_OPTIONS="--std=93 --ieee=synopsys --workdir=work"
+MAKE_OPTIONS="${IMPORT_OPTIONS} -Wl,-s -fexplicit --syn-binding"
+
+if test ! -e work; then
+ echo "Building work library..."
+ mkdir work
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/example_medium/zpu_config_trace.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/core/zpupkg.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/txt_util.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/example_medium/sim_fpga_top.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/core/zpu_core.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/example_medium/dram_hello.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/timer.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/io.vhd
+ ghdl -i ${IMPORT_OPTIONS} ../../hdl/zpu4/src/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/example_medium/.cvsignore b/zpu/hdl/example_medium/.cvsignore new file mode 100644 index 0000000..3add443 --- /dev/null +++ b/zpu/hdl/example_medium/.cvsignore @@ -0,0 +1,4 @@ +vsim.wlf +work +log.txt +trace.txt diff --git a/zpu/hdl/example_medium/dram_dmips.vhd b/zpu/hdl/example_medium/dram_dmips.vhd new file mode 100644 index 0000000..0437adc --- /dev/null +++ b/zpu/hdl/example_medium/dram_dmips.vhd @@ -0,0 +1,3308 @@ +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/example_medium/dram_hello.vhd b/zpu/hdl/example_medium/dram_hello.vhd new file mode 100644 index 0000000..aae18fd --- /dev/null +++ b/zpu/hdl/example_medium/dram_hello.vhd @@ -0,0 +1,3107 @@ +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/example_medium/sim_fpga_top.vhd b/zpu/hdl/example_medium/sim_fpga_top.vhd new file mode 100644 index 0000000..962caad --- /dev/null +++ b/zpu/hdl/example_medium/sim_fpga_top.vhd @@ -0,0 +1,194 @@ +-------------------------------------------------------------------------------- +-- 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; + +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 := '1'; + + + 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 + + zpu: zpu_core + port map ( + clk => clk, + reset => 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 rising_edge(clk) 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; + areset <= '0'; + end process clock; + + +end architecture behave; diff --git a/zpu/hdl/example_medium/simzpu_medium.do b/zpu/hdl/example_medium/simzpu_medium.do new file mode 100644 index 0000000..2b77ba6 --- /dev/null +++ b/zpu/hdl/example_medium/simzpu_medium.do @@ -0,0 +1,28 @@ +# Xilinx WebPack modelsim script
+#
+# cd C:/workspace/zpu/zpu/hdl/example_medium
+# do simzpu_medium.do
+
+set BreakOnAssertion 1
+vlib work
+
+vcom -93 -explicit zpu_config_trace.vhd
+vcom -93 -explicit ../zpu4/core/zpupkg.vhd
+vcom -93 -explicit ../zpu4/src/txt_util.vhd
+vcom -93 -explicit sim_fpga_top.vhd
+vcom -93 -explicit ../zpu4/core/zpu_core.vhd
+vcom -93 -explicit dram_hello.vhd
+vcom -93 -explicit ../zpu4/src/timer.vhd
+vcom -93 -explicit ../zpu4/src/io.vhd
+vcom -93 -explicit ../zpu4/src/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/example_medium/zpu_config_trace.vhd b/zpu/hdl/example_medium/zpu_config_trace.vhd new file mode 100644 index 0000000..a5b9192 --- /dev/null +++ b/zpu/hdl/example_medium/zpu_config_trace.vhd @@ -0,0 +1,17 @@ +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; diff --git a/zpu/hdl/sim/dmipssmalltrace.do b/zpu/hdl/sim/dmipssmalltrace.do new file mode 100644 index 0000000..eb4c6fe --- /dev/null +++ b/zpu/hdl/sim/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/sim/dmipstrace.do b/zpu/hdl/sim/dmipstrace.do new file mode 100644 index 0000000..64cf8fd --- /dev/null +++ b/zpu/hdl/sim/dmipstrace.do @@ -0,0 +1,30 @@ +# 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/spi/spi_controller.v b/zpu/hdl/spi/spi_controller.v new file mode 100644 index 0000000..b22f294 --- /dev/null +++ b/zpu/hdl/spi/spi_controller.v @@ -0,0 +1,235 @@ +/*
+ SPI flash read-only controller
+
+ Copyright 2008 Álvaro Lopes <alvieboy@alvie.com>
+
+ Version: 1.3
+
+ 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 AUTHOR ``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.
+
+ Changelog:
+
+ 1.3: Remove async reset from spi_data shift register
+ Fix indentation of code
+
+ 1.2: Fix read count for sequential fetch
+
+ 1.1: Move port types outside module declaration.
+ Fix state machine to handle clock stop
+ Remove err out report
+ Fix SPI_CLK generation.
+*/
+
+module spi_controller (
+ clk, // Clock
+ rst, // Reset
+ ce, // Chip Enable
+ ack, // Acknowledge
+
+ adr, // Address in
+ dat_o, // Data out
+
+ SPI_MOSI, // Master Out/Slave In for SPI
+ SPI_MISO, // Master In/Slave Out for SPI
+ SPI_CLK, // SPI clock
+ SPI_SELN // SPI nSEL
+);
+
+parameter Tp = 0; // Propagation delay - for simulation
+parameter INIT_CLOCK_CYCLE_WAIT = 2; // Clock cycles to wait before init
+parameter DESELECT_CYCLES = 3; // Clock cycles to wait after deselection - should give 100ns at least
+parameter SPI_REGISTER_SIZE = 40;
+parameter SPI_ADDRESS_SIZE = 24;
+
+input clk;
+input rst;
+input ce;
+output reg ack;
+
+input [SPI_ADDRESS_SIZE-1:0] adr;
+output reg [31:0] dat_o;
+
+output reg SPI_MOSI;
+input SPI_MISO;
+output SPI_CLK;
+output reg SPI_SELN;
+
+
+// FSM states
+localparam SPI_STATE_WAIT = 7'b0000001,
+ SPI_STATE_IDLE = 7'b0000010,
+ SPI_STATE_WACK = 7'b0000100,
+ SPI_STATE_SEND = 7'b0001000,
+ SPI_STATE_BREAD = 7'b0010000,
+ SPI_STATE_READ = 7'b0100000,
+ SPI_STATE_WDES = 7'b1000000;
+
+// SPI commands
+localparam SPI_CMD_READ_FAST = 8'b00001011;
+
+
+// Shift register to hold command to be sent to SPI
+reg [SPI_REGISTER_SIZE-1:0] spi_shift_register_out;
+
+integer spi_reg_count;
+
+reg [8:0] spi_read_count;
+reg [7:0] spi_data;
+reg [3:0] data_valid_window;
+reg [SPI_REGISTER_SIZE-1:0] next_address;
+
+integer dsel_dly;
+integer spi_init_count;
+reg spi_start_count;
+reg spi_enable_clock; // Enable SPI clock
+reg [6:0] spi_state; // SPI state machine
+
+/*
+ SPI clock generation
+*/
+
+assign SPI_CLK = spi_enable_clock?~clk:1'b0;
+
+reg seq_read; // Sequential read in progress
+
+always @(posedge clk or posedge rst)
+begin
+ if ( rst ) begin
+ spi_enable_clock <= #Tp 1'b0;
+ spi_state <= #Tp SPI_STATE_WAIT;
+ spi_init_count <= #Tp INIT_CLOCK_CYCLE_WAIT;
+ SPI_SELN <= #Tp 1'b1;
+ ack <= #Tp 1'b0;
+ spi_start_count <= #Tp 1'b0;
+ next_address <= #Tp 32'hFFFFFFFF;
+ end else begin
+
+ case (spi_state)
+ SPI_STATE_WAIT:
+ begin
+ if ( spi_init_count == 0 ) begin
+ spi_state <= SPI_STATE_IDLE;
+ end else begin
+ spi_init_count <= #Tp spi_init_count - 1;
+ end
+ end
+ SPI_STATE_IDLE:
+ begin
+
+ if ( ce ) begin
+ next_address <= { adr[SPI_ADDRESS_SIZE-1:2], 2'b0 } + 4;
+ seq_read = adr[SPI_ADDRESS_SIZE-1:2] == next_address[SPI_ADDRESS_SIZE-1:2];
+ // Latch address (24 bit wordsize)
+ spi_shift_register_out <= #Tp { SPI_CMD_READ_FAST, adr[SPI_ADDRESS_SIZE-1:2], 2'b0, 8'b0 };
+
+ spi_enable_clock <= #Tp 1'b1;
+
+ if ( seq_read ) begin
+ spi_state <= #Tp SPI_STATE_BREAD;
+ end else begin
+ SPI_SELN <= 1'b1 ;
+ spi_reg_count <= #Tp SPI_REGISTER_SIZE;
+ dsel_dly <= DESELECT_CYCLES;
+ spi_state <= #Tp SPI_STATE_WDES;
+ end
+ end
+ end
+ SPI_STATE_WACK:
+ begin
+ ack <= 1'b0;
+ spi_state <= SPI_STATE_IDLE;
+ end
+ SPI_STATE_SEND:
+ begin
+
+ SPI_SELN <=#Tp 1'b0;
+
+ if (spi_reg_count == 0)
+ begin
+ spi_state <= #Tp SPI_STATE_BREAD;
+ end else begin
+ SPI_MOSI <= #Tp spi_shift_register_out[SPI_REGISTER_SIZE-1];
+ spi_shift_register_out <= #Tp { spi_shift_register_out[SPI_REGISTER_SIZE-2:0], 1'b0 };
+ spi_reg_count <= #Tp spi_reg_count - 1;
+ end
+ end
+ SPI_STATE_BREAD:
+ begin
+ spi_start_count <= #Tp 1'b1;
+ spi_state <= #Tp SPI_STATE_READ;
+ end
+ SPI_STATE_READ:
+ begin
+ spi_start_count <= #Tp 1'b0;
+
+ // Stop clock a bit earlier
+ if ( data_valid_window[3] && spi_read_count[1] )
+ spi_enable_clock <= 1'b0;
+
+ if (spi_read_count[0])
+ begin
+
+ dat_o <= #Tp { dat_o[23:0], spi_data };
+
+ if ( data_valid_window[3] ) begin
+ ack <= #Tp 1'b1;
+ spi_state <= #Tp SPI_STATE_WACK;
+ end
+ end
+ end
+ SPI_STATE_WDES:
+ begin
+ if ( dsel_dly == 0 )
+ spi_state <= SPI_STATE_SEND;
+ else
+ dsel_dly <= dsel_dly -1;
+ end
+ endcase
+ end
+end
+
+always @(posedge clk)
+begin
+ if (spi_start_count) begin
+ spi_read_count <= 8'b01000000;
+ data_valid_window <= #Tp 5'b00001;
+ end else begin
+ if ( spi_read_count[0] ) begin
+ data_valid_window <= #Tp { data_valid_window[3:0], 1'b0 };
+ end
+ spi_read_count <= #Tp { spi_read_count[0] ,spi_read_count[7:1] };
+ end
+end
+
+// SPI data shift register
+
+always @(negedge clk)
+begin
+ spi_data <= #Tp { spi_data[6:0], SPI_MISO };
+end
+
+endmodule
diff --git a/zpu/hdl/wishbone/wishbone_pkg.vhd b/zpu/hdl/wishbone/wishbone_pkg.vhd new file mode 100644 index 0000000..b6d30ee --- /dev/null +++ b/zpu/hdl/wishbone/wishbone_pkg.vhd @@ -0,0 +1,86 @@ +-- 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.STD_LOGIC_UNSIGNED.ALL; + +package wishbone_pkg is + + type wishbone_bus_in is record + adr : std_logic_vector(31 downto 0); + sel : std_logic_vector(3 downto 0); + we : std_logic; + dat : std_logic_vector(31 downto 0); -- Note! Data written with 'we' + cyc : std_logic; + stb : std_logic; + end record; + + type wishbone_bus_out is record + dat : std_logic_vector(31 downto 0); + ack : std_logic; + end record; + + type wishbone_bus is record + insig : wishbone_bus_in; + outsig : wishbone_bus_out; + end record; + + component atomic32_access is + port ( cpu_clk : in std_logic; + areset : in std_logic; + + -- Wishbone from CPU interface + wb_16_i : in wishbone_bus_in; + wb_16_o : out wishbone_bus_out; + -- Wishbone to FPGA registers and ethernet core + wb_32_i : in wishbone_bus_out; + wb_32_o : out wishbone_bus_in); + end component; + + component eth_access_corr is + port ( cpu_clk : in std_logic; + areset : in std_logic; + + -- Wishbone from Wishbone MUX + eth_raw_o : out wishbone_bus_out; + eth_raw_i : in wishbone_bus_in; + + -- Wishbone ethernet core + eth_slave_i : in wishbone_bus_out; + eth_slave_o : out wishbone_bus_in); + end component; + + +end wishbone_pkg; diff --git a/zpu/hdl/wishbone/zpu_system.vhd b/zpu/hdl/wishbone/zpu_system.vhd new file mode 100644 index 0000000..07c5bdc --- /dev/null +++ b/zpu/hdl/wishbone/zpu_system.vhd @@ -0,0 +1,104 @@ +-- 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.STD_LOGIC_UNSIGNED.all; + +library work; +use work.wishbone_pkg.all; +use work.zpupkg.all; +use work.zpu_config.all; + +entity zpu_system is + generic( + simulate : boolean := false); + port ( areset : in std_logic; + cpu_clk : in std_logic; + + -- ZPU Control signals + enable : in std_logic; + interrupt : in std_logic; + + zpu_status : out std_logic_vector(63 downto 0); + + -- wishbone interfaces + zpu_wb_i : in wishbone_bus_out; + zpu_wb_o : out wishbone_bus_in); +end zpu_system; + +architecture behave of zpu_system is + +signal mem_req : std_logic; +signal mem_we : std_logic; +signal mem_ack : std_logic; +signal mem_read : std_logic_vector(wordSize-1 downto 0); +signal mem_write : std_logic_vector(wordSize-1 downto 0); +signal out_mem_addr : std_logic_vector(maxAddrBitIncIO downto 0); +signal mem_writeMask : std_logic_vector(wordBytes-1 downto 0); + + +begin + + my_zpu_core: + zpu_core port map ( + clk => cpu_clk, + areset => areset, + enable => enable, + mem_req => mem_req, + mem_we => mem_we, + mem_ack => mem_ack, + mem_read => mem_read, + mem_write => mem_write, + out_mem_addr => out_mem_addr, + mem_writeMask => mem_writeMask, + interrupt => interrupt, + zpu_status => zpu_status, + break => open); + + my_zpu_wb_bridge: + zpu_wb_bridge port map ( + clk => cpu_clk, + areset => areset, + mem_req => mem_req, + mem_we => mem_we, + mem_ack => mem_ack, + mem_read => mem_read, + mem_write => mem_write, + out_mem_addr => out_mem_addr, + mem_writeMask => mem_writeMask, + zpu_wb_i => zpu_wb_i, + zpu_wb_o => zpu_wb_o); + +end behave; diff --git a/zpu/hdl/wishbone/zpu_wb_bridge.vhd b/zpu/hdl/wishbone/zpu_wb_bridge.vhd new file mode 100644 index 0000000..086ae11 --- /dev/null +++ b/zpu/hdl/wishbone/zpu_wb_bridge.vhd @@ -0,0 +1,83 @@ +-- 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.STD_LOGIC_UNSIGNED.ALL; + +library work; +use work.phi_config.all; +use work.wishbone_pkg.all; +use work.zpupkg.all; +use work.zpu_config.all; + +entity zpu_wb_bridge is + port ( -- Native ZPU interface + clk : in std_logic; + areset : in std_logic; + + mem_req : in std_logic; + mem_we : in std_logic; + mem_ack : out std_logic; + mem_read : out std_logic_vector(wordSize-1 downto 0); + mem_write : in std_logic_vector(wordSize-1 downto 0); + out_mem_addr : in std_logic_vector(maxAddrBitIncIO downto 0); + mem_writeMask : in std_logic_vector(wordBytes-1 downto 0); + + -- Wishbone from ZPU + zpu_wb_i : in wishbone_bus_out; + zpu_wb_o : out wishbone_bus_in); + +end zpu_wb_bridge; + +architecture behave of zpu_wb_bridge is + +begin + + mem_read <= zpu_wb_i.dat; + mem_ack <= zpu_wb_i.ack; + + zpu_wb_o.adr <= "000000" & out_mem_addr(27) & out_mem_addr(24 downto 0); + zpu_wb_o.dat <= mem_write; + zpu_wb_o.sel <= mem_writeMask; + zpu_wb_o.stb <= mem_req; + zpu_wb_o.cyc <= mem_req; + zpu_wb_o.we <= mem_we; + +end behave; + + + + + diff --git a/zpu/hdl/zealot/0README.txt b/zpu/hdl/zealot/0README.txt new file mode 100644 index 0000000..4bb4546 --- /dev/null +++ b/zpu/hdl/zealot/0README.txt @@ -0,0 +1,195 @@ +This is a test release of the ZPU. +ZPU is a 32 bits stack CPU. This package contains a VHDL implementation +suitable for FPGAs. It was tested using a Xilinx Spartan 3 1500 FPGA. + +The author of the ZPU is Øyvind Harboe (oyvind.harboe zylin.com) and the +license is the BSD one. Portions of this package were developed by Salvador E. +Tropea (salvador inti.gob.ar) and others. Some portions are under the GPL +license. + +Øyvind also added a ZPU target to the gcc/gdb. + +For more information about the ZPU core please visit: +http://www.zylin.com/zpu.htm +http://www.opencores.org/projects.cgi/web/zpu/overview + +What are the files? +------------------- + +zpu_medium.vhdl +ZPU CPU, medium version. + +zpu_small.vhdl +ZPU CPU, small version (Dual Port RAM only!). + +zpu_pkg.vhdl +Package containing the declarations for the ZPU library. + +devices/phi_io.vhdl +The very basic I/O peripherals needed for the standard C library. It includes a +timer (64 bits clock counter) and an UART (8N1 without FIFO). +This is known as the PHI I/O layout, this implementation isn't complete. Only +the above mentioned peripherals are available. + +devices/timer.vhdl +64 bits clock counter maped by the PHI I/O. + +devices/trace.vhdl +This is used for debug purposes. The ZPU have a debug port to connect this +module. It can generate an execution trace log during the simulation. + +devices/txt_util.vhdl +Useful text handling routines for the simulation. + +devices/br_gen.vhdl +Fixed baud rate generator for the UART. + +devices/rx_unit.vhdl +UART Rx module. + +devices/tx_unit.vhdl +UART Tx module. + +roms/rom_pkg.vhdl +Package containing the declarations for the memories used by the small and +medium ZPU. + +roms/dmips_bram.vhdl +A memory that maps to Xilinx BRAMs and contains the Dhrystone Benchmark, +Version 2.1 (Language: C). This memory can be connected to the ZPU for +simulation or hardware implementations. The code assumes a 50 MHz clock to +compute the benchmark. The minimum size for this block should be 32 kB. + +roms/dmips_dbram.vhdl +Same as roms/dmips_bram.vhdl, but dual ported. Suitable for the small ZPU. + +roms/hello_bram.vhdl +A memory that maps to Xilinx BRAMs and contains a simple "Hello World!" +program (C compiled). This memory can be connected to the ZPU for +simulation or hardware implementations. The minimum size for this block +should be 16 kB. + +roms/hello_dbram.vhdl +Same as roms/hello_bram.vhdl, but dual ported. Suitable for the small ZPU. +helpers/zpu_med1.vhdl +This is a helper that connects a ZPU to its memory and the PHI I/O space. + +testbenches/dmips_med1_tb.vhdl +A simple testbench to simulate the medium ZPU (behavior). + +testbenches/small1_tb.vhdl +A simple testbench to simulate the small ZPU (behavior). + +fpga/dmips_med1.vhdl +A wrapper to implement the medium ZPU in an FPGA. This example was designed +for a GR-XC3S board from Pender, but should be easily adapted to other +boards. + +fpga/hello_med1.vhdl +Same as fpga/dmips_med1.vhdl, but uses less memory, enough for the "Hello +Wold!" test. + +fpga/dmips_small1.vhdl +Same as fpga/dmips_med1.vhdl, but for the small ZPU. + +fpga/hello_small1.vhdl +Same as fpga/hello_med1.vhdl, but for the small ZPU. + + +ZPU library? +------------ + +The following files are part of a library I called ZPU: + +zpu_pkg.vhdl, zpu_medium.vhdl, zpu_small.vhdl, txt_util.vhdl, timer.vhdl, +rx_unit.vhdl, tx_unit.vhdl, br_gen.vhdl, phi_io.vhdl and trace.vhdl. + +You should group them inside a library called zpu. This procedure is +tool-chain dependent. In the ISE tool you must add a library and them move +these files to the library. + +If you don't know how to do it with your tools you can just replace all the: + +library zpu; +use zpu.xxxxxx.all; + +code by: + +library work; +use work.xxxxxx.all; + + +Which files are needed for simulation? +-------------------------------------- + +You need all the files that compose the zpu library plus: +1) A memory containing a program, i.e.: +roms/rom_pkg.vhdl and roms/dmips_bram.vhdl +2) A testbench (including the memory and I/O interconnections): +aux/zpu_med1.vhdl and testbenches/dmips_med1_tb.vhdl +3) Be careful to include only the medium or the small ZPU. Also note that +the small uses dual port BRAMs, i.e. roms/dmips_dbram.vhdl The testbench +for the small ZPU is small1_tb.vhdl + + +Which files are needed for synthesis? +------------------------------------- + +This is similar to simulation, but: +1) You should avoid trace.vhdl. +2) The top level should connect to the FPGA pins, replace dmips_med1_tb.vhdl +by fpga/dmips_med1.vhdl or fpga/hello_med1.vhdl + + +What resources are needed in the FPGA? +-------------------------------------- + +The DMIPS benchmarks needs aprox (Xilinx Spartan 3): + +Medium ZPU: + +Flip Flops: 498 +LUTs: 1877 +Slices: 1032 +BRAMs: 16 +Multipliers: 3 + +The hello world example needs less memory: + +Flip Flops: 496 +LUTs: 1871 +Slices: 1027 +BRAMs: 8 +Multipliers: 3 + + +Small ZPU: + +Flip Flops: 373 +LUTs: 706 +Slices: 434 +BRAMs: 16 + +The hello world example needs less memory: + +Flip Flops: 371 +LUTs: 701 +Slices: 431 +BRAMs: 8 + + +The board should contain an RS-232 transceiver. A push button (active when +pressed) is also used, for reset. + + +Ok, I synthetized it and put in the FPGA, what now? +--------------------------------------------------- + +Connect the RS-232 board output to a terminal (a PC). Setup the terminal for +115200 8N1 reception and press the reset push button. You should get the +program output. You can change the baudrate in the toplevel VHDL. + + +Please tell me if you succeed or failed! +Enjoy, Salvador E. Tropea + diff --git a/zpu/hdl/zealot/BSD b/zpu/hdl/zealot/BSD new file mode 100644 index 0000000..cca2a5c --- /dev/null +++ b/zpu/hdl/zealot/BSD @@ -0,0 +1,20 @@ +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 AUTHOR ``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 AUTHOR 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. diff --git a/zpu/hdl/zealot/GPL_V2 b/zpu/hdl/zealot/GPL_V2 new file mode 100644 index 0000000..21b9363 --- /dev/null +++ b/zpu/hdl/zealot/GPL_V2 @@ -0,0 +1,341 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) 19yy <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/zpu/hdl/zealot/devices/br_gen.vhdl b/zpu/hdl/zealot/devices/br_gen.vhdl new file mode 100644 index 0000000..d14440e --- /dev/null +++ b/zpu/hdl/zealot/devices/br_gen.vhdl @@ -0,0 +1,91 @@ +------------------------------------------------------------------------------ +---- ---- +---- RS-232 baudrate generator ---- +---- ---- +---- http://www.opencores.org/ ---- +---- ---- +---- Description: ---- +---- This counter is a parametrizable clock divider. The count value is ---- +---- the generic parameter COUNT. It has a chip enable ce_i input. ---- +---- (will count only if CE is high). ---- +---- When it overflows, will emit a pulse on o_o. ---- +---- ---- +---- To Do: ---- +---- - ---- +---- ---- +---- Author: ---- +---- - Philippe Carton, philippe.carton2 libertysurf.fr ---- +---- - Juan Pablo Daniel Borgna, jpdborgna gmail.com ---- +---- - Salvador E. Tropea, salvador inti.gob.ar ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Copyright (c) 2001-2003 Philippe Carton ---- +---- Copyright (c) 2005 Juan Pablo Daniel Borgna ---- +---- Copyright (c) 2005-2008 Salvador E. Tropea ---- +---- Copyright (c) 2005-2008 Instituto Nacional de Tecnología Industrial ---- +---- ---- +---- Distributed under the GPL license ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Design unit: BRGen(Behaviour) (Entity and architecture) ---- +---- File name: br_gen.vhdl ---- +---- Note: None ---- +---- Limitations: None known ---- +---- Errors: None known ---- +---- Library: zpu ---- +---- Dependencies: IEEE.std_logic_1164 ---- +---- Target FPGA: Spartan ---- +---- Language: VHDL ---- +---- Wishbone: No ---- +---- Synthesis tools: Xilinx Release 9.2.03i - xst J.39 ---- +---- Simulation tools: GHDL [Sokcho edition] (0.2x) ---- +---- Text editor: SETEdit 0.5.x ---- +---- ---- +------------------------------------------------------------------------------ + +library IEEE; +use IEEE.std_logic_1164.all; + +entity BRGen is + generic( + COUNT : integer range 0 to 65535);-- Count revolution + port ( + clk_i : in std_logic; -- Clock + reset_i : in std_logic; -- Reset input + ce_i : in std_logic; -- Chip Enable + o_o : out std_logic); -- Output +end entity BRGen; + +architecture Behaviour of BRGen is + +begin + CountGen: + if COUNT/=1 generate + Counter: + process (clk_i) + variable cnt : integer range 0 to COUNT-1; + begin + if rising_edge(clk_i) then + o_o <= '0'; + if reset_i='1' then + cnt:=COUNT-1; + elsif ce_i='1' then + if cnt=0 then + o_o <= '1'; + cnt:=COUNT-1; + else + cnt:=cnt-1; + end if; -- cnt/=0 + end if; -- ce_i='1' + end if; -- rising_edge(clk_i) + end process Counter; + end generate CountGen; + + CountWire: + if COUNT=1 generate + o_o <= '0' when reset_i='1' else ce_i; + end generate CountWire; +end architecture Behaviour; -- Entity: BRGen + diff --git a/zpu/hdl/zealot/devices/gpio.vhdl b/zpu/hdl/zealot/devices/gpio.vhdl new file mode 100644 index 0000000..fc66bde --- /dev/null +++ b/zpu/hdl/zealot/devices/gpio.vhdl @@ -0,0 +1,107 @@ +-- +-- this module desribes a simple GPIO interface +-- +-- data on port_in is synhronized to clk_i and can be read at +-- address 0 +-- +-- any write to address 0 is mapped to port_out +-- +-- at address 1 is a direction register (port_dir) +-- initialized with '1's, what mean direction = in +-- this register is useful for bidirectional pins, e.g. headers +-- +-- +-- some examples: +-- +-- to connect 4 buttons: +-- port_in( 3 downto 0) <= gpio_button; +-- +-- +-- to connect 8 LEDs: +-- gpio_led <= port_out(7 downto 0); +-- +-- +-- to connect 2 bidirectional header pins: +-- port_in(8) <= gpio_pin(0); +-- gpio_pin(0) <= port_out(8) when port_dir(8) = '0' else 'Z'; +-- +-- port_in(9) <= gpio_pin(1); +-- gpio_pin(1) <= port_out(9) when port_dir(9) = '0' else 'Z'; +-- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + + +entity gpio is + port( + clk_i : in std_logic; + reset_i : in std_logic; + -- + we_i : in std_logic; + data_i : in unsigned(31 downto 0); + addr_i : in unsigned( 0 downto 0); + data_o : out unsigned(31 downto 0); + -- + port_in : in std_logic_vector(31 downto 0); + port_out : out std_logic_vector(31 downto 0); + port_dir : out std_logic_vector(31 downto 0) + ); +end entity gpio; + + +architecture rtl of gpio is + + signal port_in_reg : std_logic_vector(31 downto 0); + signal port_in_sync : std_logic_vector(31 downto 0); + -- + signal direction : std_logic_vector(31 downto 0) := (others => '1'); + +begin + + process + begin + wait until rising_edge( clk_i); + + -- synchronize all inputs with two registers + -- to avoid metastability + port_in_reg <= port_in; + port_in_sync <= port_in_reg; + + -- write access to gpio + if we_i = '1' then + -- data + if addr_i = "0" then + port_out <= std_logic_vector( data_i); + end if; + -- direction + if addr_i = "1" then + direction <= std_logic_vector( data_i); + end if; + end if; + + -- read access to gpio + -- data + if addr_i = "0" then + data_o <= unsigned( port_in_sync); + end if; + -- direction + if addr_i = "1" then + data_o <= unsigned( direction); + end if; + + -- outputs + port_dir <= direction; + + -- sync reset + if reset_i = '1' then + direction <= (others => '1'); + port_in_reg <= (others => '0'); + port_in_sync <= (others => '0'); + end if; + + end process; + + +end architecture rtl; diff --git a/zpu/hdl/zealot/devices/phi_io.vhdl b/zpu/hdl/zealot/devices/phi_io.vhdl new file mode 100644 index 0000000..6e40d1d --- /dev/null +++ b/zpu/hdl/zealot/devices/phi_io.vhdl @@ -0,0 +1,257 @@ +------------------------------------------------------------------------------ +---- ---- +---- ZPU Phi I/O ---- +---- ---- +---- http://www.opencores.org/ ---- +---- ---- +---- Description: ---- +---- ZPU is a 32 bits small stack cpu. This is the minimum I/O devices ---- +---- assumed by the libc. They are a timer and an UART.@p ---- +---- Important! this is currently a simulation only model, no UART ---- +---- provided and it unconditionally generates a log. ---- +---- Important! not all peripherals implemented! ---- +---- Important! The enable signals assumes this is mapped @ 0x80A00xx. ---- +---- ---- +---- To Do: ---- +---- - ---- +---- ---- +---- Author: ---- +---- - Øyvind Harboe, oyvind.harboe zylin.com ---- +---- - Salvador E. Tropea, salvador inti.gob.ar ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Copyright (c) 2008 Øyvind Harboe <oyvind.harboe zylin.com> ---- +---- Copyright (c) 2008 Salvador E. Tropea <salvador inti.gob.ar> ---- +---- Copyright (c) 2008 Instituto Nacional de Tecnología Industrial ---- +---- ---- +---- Distributed under the BSD license ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Design unit: ZPUPhiIO(Behave) (Entity and architecture) ---- +---- File name: phi_io.vhdl ---- +---- Note: None ---- +---- Limitations: Only for simulation. ---- +---- Errors: None known ---- +---- Library: zpu ---- +---- Dependencies: IEEE.std_logic_1164 ---- +---- IEEE.numeric_std ---- +---- std.textio ---- +---- zpu.zpupkg ---- +---- zpu.txt_util ---- +---- Target FPGA: Spartan 3 (XC3S1500-4-FG456) ---- +---- Language: VHDL ---- +---- Wishbone: No ---- +---- Synthesis tools: N/A ---- +---- Simulation tools: GHDL [Sokcho edition] (0.2x) ---- +---- Text editor: SETEdit 0.5.x ---- +---- ---- +------------------------------------------------------------------------------ + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +use std.textio.all; + +library zpu; +use zpu.zpupkg.timer; +use zpu.zpupkg.gpio; +use zpu.UART.all; +use zpu.txt_util.all; + +entity ZPUPhiIO is + generic( + BRDIVISOR : positive:=1; -- Baud rate divisor i.e. br_clk/9600/4 + ENA_LOG : boolean:=true; -- Enable log + LOG_FILE : string:="log.txt"); -- Name for the log file + port( + clk_i : in std_logic; -- System Clock + reset_i : in std_logic; -- Synchronous Reset + busy_o : out std_logic; -- I/O is busy + we_i : in std_logic; -- Write Enable + re_i : in std_logic; -- Read Enable + data_i : in unsigned(31 downto 0); + data_o : out unsigned(31 downto 0); + addr_i : in unsigned(2 downto 0); -- Address bits 4-2 + -- + rs232_rx_i : in std_logic; -- UART Rx input + rs232_tx_o : out std_logic; -- UART Tx output + br_clk_i : in std_logic; -- UART base clock (enable) + -- + gpio_in : in std_logic_vector(31 downto 0); + gpio_out : out std_logic_vector(31 downto 0); + gpio_dir : out std_logic_vector(31 downto 0) -- 1 = in, 0 = out + ); +end entity ZPUPhiIO; + + +architecture Behave of ZPUPhiIO is + constant LOW_BITS : unsigned(1 downto 0):=(others=>'0'); + constant TX_FULL : std_logic:='0'; + constant RX_EMPTY : std_logic:='1'; + + -- "000" 0x00 is CPU enable ... useful? + constant IO_DATA : unsigned(2 downto 0):="001"; -- 0x04 + constant IO_DIR : unsigned(2 downto 0):="010"; -- 0x08 + constant UART_TX : unsigned(2 downto 0):="011"; -- 0x0C + constant UART_RX : unsigned(2 downto 0):="100"; -- 0x10 + constant CNT_1 : unsigned(2 downto 0):="101"; -- 0x14 + constant CNT_2 : unsigned(2 downto 0):="110"; -- 0x18 + -- "111" 0x1C Unused + -- Unimplemented: Interrupt control and timer (not counter ...?) + + signal timer_read : unsigned(31 downto 0); + signal timer_we : std_logic; + signal is_timer : std_logic; + + -- UART + -- Rx + signal rx_br : std_logic; -- Rx timing + signal uart_read : std_logic; -- ZPU read the value + signal rx_avail : std_logic; -- Rx data available + signal rx_data : std_logic_vector(7 downto 0); -- Rx data + -- Tx + signal tx_br : std_logic; -- Tx timing + signal uart_write : std_logic; -- ZPU is writing + signal tx_busy : std_logic; -- Tx can't get a new value + + -- GPIO + signal gpio_we : std_logic; + signal is_gpio : std_logic; + signal gpio_read : unsigned(31 downto 0); + + file l_file : text open write_mode is LOG_FILE; + +begin + ----------- + -- Timer -- + ----------- + timerinst: Timer + port map( + clk_i => clk_i, reset_i => reset_i, we_i => timer_we, + data_i => data_i, addr_i => addr_i(1 downto 1), + data_o => timer_read); + + busy_o <= we_i or re_i; + is_timer <= '1' when to_01(addr_i)=CNT_1 or to_01(addr_i)=CNT_2 else '0'; -- 0x80A0014/8 + timer_we <= we_i and is_timer; + + ---------- + -- UART -- + ---------- + -- Rx section + rx_core : RxUnit + port map( + clk_i => clk_i, reset_i => reset_i, enable_i => rx_br, + read_i => uart_read, rxd_i => rs232_rx_i, rxav_o => rx_avail, + datao_o => rx_data); + uart_read <= '1' when re_i='1' and addr_i=UART_RX else '0'; + + -- Tx section + tx_core : TxUnit + port map( + clk_i => clk_i, reset_i => reset_i, enable_i => tx_br, + load_i => uart_write, txd_o => rs232_tx_o, busy_o => tx_busy, + datai_i => std_logic_vector(data_i(7 downto 0))); + uart_write <= '1' when we_i='1' and addr_i=UART_TX else '0'; + + -- Rx timing + rx_timer : BRGen + generic map(COUNT => BRDIVISOR) + port map( + clk_i => clk_i, reset_i => reset_i, ce_i => br_clk_i, o_o => rx_br); + + -- Tx timing + tx_timer : BRGen -- 4 Divider for Tx + generic map(COUNT => 4) + port map( + clk_i => clk_i, reset_i => reset_i, ce_i => rx_br, o_o => tx_br); + + ---------- + -- GPIO -- + ---------- + gpio_i0: gpio + port map( + clk_i => clk_i, -- : in std_logic; + reset_i => reset_i, -- : in std_logic; + -- + we_i => gpio_we, -- : in std_logic; + data_i => data_i, -- : in unsigned(31 downto 0); + addr_i => addr_i(1 downto 1), -- : in unsigned( 0 downto 0); + data_o => gpio_read, -- : out unsigned(31 downto 0); + -- + port_in => gpio_in, -- : std_logic_vector(31 downto 0); + port_out => gpio_out, -- : std_logic_vector(31 downto 0); + port_dir => gpio_dir -- : std_logic_vector(31 downto 0); + ); + is_gpio <= '1' when to_01(addr_i) = IO_DATA or to_01(addr_i) = IO_DIR else '0'; -- 0x80A0004/8 + gpio_we <= we_i and is_gpio; + + + do_io: + process(clk_i) + --synopsys translate off + variable line_out : line := new string'(""); + variable char : character; + --synopsys translate on + begin + if rising_edge(clk_i) then + if reset_i/='1' then + --synopsys translate off + if we_i='1' then + if addr_i=UART_TX and ENA_LOG then -- 0x80a000c + -- Write to UART + print("- Write to UART Tx: 0x" &hstr(data_i)&" ("& + character'val(to_integer(data_i) mod 256)&")"); + char := character'val(to_integer(data_i)); + if char = lf then + std.textio.writeline(l_file, line_out); + else + std.textio.write(line_out, char); + end if; + elsif is_gpio = '1' and ENA_LOG then + print("- Write GPIO: 0x" & hstr(data_i)); + elsif is_timer='1' and ENA_LOG then + print("- Write to TIMER: 0x" & hstr(data_i)); + else + --print(l_file,character'val(to_integer(data_i))); + report "Illegal IO data_i=0x"&hstr(data_i)&" @0x"& + hstr(x"80a00"&"000"&addr_i&"00") severity warning; + end if; + end if; + --synopsys translate on + data_o <= (others => '0'); + if re_i='1' then + if is_gpio = '1' then + if ENA_LOG then + print("- Read GPIO: 0x" & hstr(gpio_read)); + end if; + data_o <= gpio_read; + elsif addr_i=UART_TX then + if ENA_LOG then + print("- Read UART Tx"); + end if; + data_o(8) <= not(tx_busy); -- output fifo not full + elsif addr_i=UART_RX then + if ENA_LOG then + print("- Read UART Rx"); + end if; + data_o(8) <= rx_avail; -- receiver not empty + data_o(7 downto 0) <= unsigned(rx_data); + elsif is_timer='1' then + if ENA_LOG then + print("- Read TIMER: 0x" & hstr(timer_read)); + end if; + data_o <= timer_read; + else + report "Illegal IO data_o @0x"& + hstr(x"80a00"&"000"&addr_i&"00") severity warning; + end if; + end if; -- re_i='1' + end if; -- reset_i/='1' + end if; -- rising_edge(clk_i) + end process do_io; +end Behave; + diff --git a/zpu/hdl/zealot/devices/rx_unit.vhdl b/zpu/hdl/zealot/devices/rx_unit.vhdl new file mode 100644 index 0000000..e9b3251 --- /dev/null +++ b/zpu/hdl/zealot/devices/rx_unit.vhdl @@ -0,0 +1,108 @@ +------------------------------------------------------------------------------ +---- ---- +---- RS-232 simple Rx module ---- +---- ---- +---- http://www.opencores.org/ ---- +---- ---- +---- Description: ---- +---- Implements a simple 8N1 rx module for RS-232. ---- +---- ---- +---- To Do: ---- +---- - ---- +---- ---- +---- Author: ---- +---- - Philippe Carton, philippe.carton2 libertysurf.fr ---- +---- - Juan Pablo Daniel Borgna, jpdborgna gmail.com ---- +---- - Salvador E. Tropea, salvador inti.gob.ar ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Copyright (c) 2001-2003 Philippe Carton ---- +---- Copyright (c) 2005 Juan Pablo Daniel Borgna ---- +---- Copyright (c) 2005-2008 Salvador E. Tropea ---- +---- Copyright (c) 2005-2008 Instituto Nacional de Tecnología Industrial ---- +---- ---- +---- Distributed under the GPL license ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Design unit: RxUnit(Behaviour) (Entity and architecture) ---- +---- File name: rx_unit.vhdl ---- +---- Note: None ---- +---- Limitations: None known ---- +---- Errors: None known ---- +---- Library: zpu ---- +---- Dependencies: IEEE.std_logic_1164 ---- +---- Target FPGA: Spartan ---- +---- Language: VHDL ---- +---- Wishbone: No ---- +---- Synthesis tools: Xilinx Release 9.2.03i - xst J.39 ---- +---- Simulation tools: GHDL [Sokcho edition] (0.2x) ---- +---- Text editor: SETEdit 0.5.x ---- +---- ---- +------------------------------------------------------------------------------ + +library IEEE; +use IEEE.std_logic_1164.all; + +entity RxUnit is + port( + clk_i : in std_logic; -- System clock signal + reset_i : in std_logic; -- Reset input (sync) + enable_i : in std_logic; -- Enable input (rate*4) + read_i : in std_logic; -- Received Byte Read + rxd_i : in std_logic; -- RS-232 data input + rxav_o : out std_logic; -- Byte available + datao_o : out std_logic_vector(7 downto 0)); -- Byte received +end entity RxUnit; + +architecture Behaviour of RxUnit is + signal r_r : std_logic_vector(7 downto 0); -- Receive register + signal bavail_r : std_logic:='0'; -- Byte received +begin + rxav_o <= bavail_r; + -- Rx Process + RxProc: + process (clk_i) + variable bitpos : integer range 0 to 10; -- Position of the bit in the frame + variable samplecnt : integer range 0 to 3; -- Count from 0 to 3 in each bit + begin + if rising_edge(clk_i) then + if reset_i='1' then + bavail_r <= '0'; + bitpos:=0; + else -- reset_i='0' + if read_i='1' then + bavail_r <= '0'; + end if; + if enable_i='1' then + case bitpos is + when 0 => -- idle + bavail_r <= '0'; + if rxd_i='0' then -- Start Bit + samplecnt:=0; + bitpos:=1; + end if; + when 10 => -- Stop Bit + bitpos:=0; -- next is idle + bavail_r <= '1'; -- Indicate byte received + datao_o <= r_r; -- Store received byte + when others => + if samplecnt=1 and bitpos>=2 then -- Sample RxD on 1 + r_r(bitpos-2) <= rxd_i; -- Deserialisation + end if; + if samplecnt=3 then -- Increment BitPos on 3 + bitpos:=bitpos+1; + end if; + end case; + if samplecnt=3 then + samplecnt:=0; + else + samplecnt:=samplecnt+1; + end if; + end if; -- enable_i='1' + end if; -- reset_i='0' + end if; -- rising_edge(clk_i) + end process RxProc; +end architecture Behaviour; + diff --git a/zpu/hdl/zealot/devices/timer.vhdl b/zpu/hdl/zealot/devices/timer.vhdl new file mode 100644 index 0000000..389868c --- /dev/null +++ b/zpu/hdl/zealot/devices/timer.vhdl @@ -0,0 +1,91 @@ +------------------------------------------------------------------------------ +---- ---- +---- 64 bits clock counter ---- +---- ---- +---- http://www.opencores.org/ ---- +---- ---- +---- Description: ---- +---- This is a peripheral used by the PHI I/O layout. It just counts the ---- +---- elapsed number of clocks. ---- +---- ---- +---- To Do: ---- +---- - ---- +---- ---- +---- Author: ---- +---- - Øyvind Harboe, oyvind.harboe zylin.com ---- +---- - Salvador E. Tropea, salvador inti.gob.ar ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Copyright (c) 2008 Øyvind Harboe <oyvind.harboe zylin.com> ---- +---- Copyright (c) 2008 Salvador E. Tropea <salvador inti.gob.ar> ---- +---- Copyright (c) 2008 Instituto Nacional de Tecnología Industrial ---- +---- ---- +---- Distributed under the BSD license ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Design unit: Timer(Behave) (Entity and architecture) ---- +---- File name: timer.vhdl ---- +---- Note: None ---- +---- Limitations: None known ---- +---- Errors: None known ---- +---- Library: zpu ---- +---- Dependencies: IEEE.std_logic_1164 ---- +---- IEEE.numeric_std ---- +---- zpu.zpupkg ---- +---- Target FPGA: Spartan 3 (XC3S1500-4-FG456) ---- +---- Language: VHDL ---- +---- Wishbone: No ---- +---- Synthesis tools: Xilinx Release 9.2.03i - xst J.39 ---- +---- Simulation tools: GHDL [Sokcho edition] (0.2x) ---- +---- Text editor: SETEdit 0.5.x ---- +---- ---- +------------------------------------------------------------------------------ + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity Timer is + port( + clk_i : in std_logic; + reset_i : in std_logic; + we_i : in std_logic; + data_i : in unsigned(31 downto 0); + addr_i : in unsigned(0 downto 0); + data_o : out unsigned(31 downto 0)); +end entity Timer; + +architecture Behave of Timer is + signal sample : std_logic; + signal reset : std_logic; + + signal cnt : unsigned(63 downto 0); + signal cnt_smp : unsigned(63 downto 0); +begin + reset <= '1' when (we_i='1' and data_i(0)='1') else '0'; + sample <= '1' when (we_i='1' and data_i(1)='1') else '0'; + + -- Carry generation + do_timer: + process (clk_i) + begin + if rising_edge(clk_i) then + if reset_i='1' or reset='1' then + cnt <= (others => '0'); + cnt_smp <= (others => '0'); + else + cnt <= cnt+1; + if sample='1' then + -- report "sampling" severity failure; + cnt_smp <= cnt; + end if; + end if; -- else reset_i='1' + end if; -- rising_edge(clk_i) + end process do_timer; + + data_o <= cnt_smp(31 downto 0) when to_01(addr_i)="0" else + cnt_smp(63 downto 32); +end architecture Behave; -- Entity: Timer + diff --git a/zpu/hdl/zealot/devices/trace.vhdl b/zpu/hdl/zealot/devices/trace.vhdl new file mode 100644 index 0000000..83d3782 --- /dev/null +++ b/zpu/hdl/zealot/devices/trace.vhdl @@ -0,0 +1,258 @@ +------------------------------------------------------------------------------ +---- ---- +---- ZPU Trace Module ---- +---- ---- +---- http://www.opencores.org/ ---- +---- ---- +---- Description: ---- +---- ZPU is a 32 bits small stack cpu. This is a module to log an ---- +---- execution trace. ---- +---- ---- +---- To Do: ---- +---- - ---- +---- ---- +---- Author: ---- +---- - Øyvind Harboe, oyvind.harboe zylin.com ---- +---- - Salvador E. Tropea, salvador inti.gob.ar ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Copyright (c) 2008 Øyvind Harboe <oyvind.harboe zylin.com> ---- +---- Copyright (c) 2008 Salvador E. Tropea <salvador inti.gob.ar> ---- +---- Copyright (c) 2008 Instituto Nacional de Tecnología Industrial ---- +---- ---- +---- Distributed under the BSD license ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Design unit: Trace(Behave) (Entity and architecture) ---- +---- File name: trace.vhdl ---- +---- Note: None ---- +---- Limitations: None known ---- +---- Errors: None known ---- +---- Library: zpu ---- +---- Dependencies: IEEE.std_logic_1164 ---- +---- IEEE.numeric_std ---- +---- std.textio ---- +---- zpu.zpupkg ---- +---- zpu.txt_util ---- +---- Target FPGA: N/A ---- +---- Language: VHDL ---- +---- Wishbone: No ---- +---- Synthesis tools: N/A ---- +---- Simulation tools: GHDL [Sokcho edition] (0.2x) ---- +---- Text editor: SETEdit 0.5.x ---- +---- ---- +------------------------------------------------------------------------------ + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +use std.textio.all; + +library zpu; +use zpu.zpupkg.all; +use zpu.txt_util.all; + +entity Trace is + generic( + LOG_FILE : string:="trace.txt"; -- Name of the trace file + ADDR_W : integer:=16; -- Address width + WORD_SIZE : integer:=32); -- 16/32 + port( + clk_i : in std_logic; + dbg_i : in zpu_dbgo_t; + stop_i : in std_logic; + busy_i : in std_logic + ); +end entity Trace; + +architecture Behave of Trace is + file l_file : text open write_mode is LOG_FILE; + signal counter : unsigned(63 downto 0); +begin + -- write data and control information to a file + receive_data: + process + variable l : line; + variable stk_min : unsigned(31 downto 0):=(others => '1'); + variable stk_ini : unsigned(31 downto 0); + variable first : boolean:=true; + variable sp_off : unsigned(4 downto 0); + variable idim : boolean:=false; + variable im_val : unsigned(31 downto 0):=(others => '0'); + begin + counter <= to_unsigned(1,64); + -- print header for the logfile + print(l_file,"#PC Opcode SP A=[SP] B=[SP+1] Clk Counter Assembler"); + print(l_file,"#---------------------------------------------------------------------------"); + print(l_file," "); + + wait until clk_i='1'; + wait until clk_i='0'; + + while true loop + counter <= counter+1; + if dbg_i.b_inst='1' then + write(l, "0x"&hstr(dbg_i.pc(ADDR_W-1 downto 0))& + " 0x"&hstr(dbg_i.opcode)& + " 0x"&hstr(dbg_i.sp)& + " 0x"&hstr(dbg_i.stk_a)& + " 0x"&hstr(dbg_i.stk_b)& + " 0x"&hstr(counter)&" "); + -------------------------- + -- Instruction Decoder -- + -------------------------- + sp_off(4):=not dbg_i.opcode(4); + sp_off(3 downto 0):=dbg_i.opcode(3 downto 0); + if dbg_i.opcode(7 downto 7)=OPCODE_IM then + if idim then + im_val(31 downto 7):=im_val(24 downto 0); + im_val(6 downto 0):=dbg_i.opcode(6 downto 0); + else + im_val:=unsigned(resize(signed(dbg_i.opcode(6 downto 0)),32)); + end if; + idim:=true; + write(l,"im 0x"&hstr(dbg_i.opcode(6 downto 0))&" ; 0x"&hstr(im_val)); + elsif dbg_i.opcode(7 downto 5)=OPCODE_STORESP then + if sp_off=0 then + write(l,string'("storesp 0 ; pop")); + elsif sp_off=1 then + write(l,string'("storesp 4 ; 1*4 = popdown")); + else + write(l,"storesp "&integer'image(to_integer(sp_off)*4)&" ; "& + integer'image(to_integer(sp_off))&"*4"); + end if; + elsif dbg_i.opcode(7 downto 5)=OPCODE_LOADSP then + if sp_off=0 then + write(l,string'("loadsp 0 ; dup")); + elsif sp_off=1 then + write(l,string'("loadsp 4 ; 1*4 = dupstkb")); + else + write(l,"loadsp "&integer'image(to_integer(sp_off)*4)&" ; "& + integer'image(to_integer(sp_off))&"*4"); + end if; + elsif dbg_i.opcode(7 downto 5)=OPCODE_EMULATE then + if dbg_i.opcode(5 downto 0)=OPCODE_EQ then + write(l,string'("eq")); + elsif dbg_i.opcode(5 downto 0)=OPCODE_LOADB then + write(l,string'("loadb")); + elsif dbg_i.opcode(5 downto 0)=OPCODE_NEQBRANCH then + write(l,string'("neqbranch")); + elsif dbg_i.opcode(5 downto 0)=OPCODE_PUSHSPADD then + write(l,string'("pushspadd")); + elsif dbg_i.opcode(5 downto 0)=OPCODE_LESSTHAN then + write(l,string'("lessthan")); + elsif dbg_i.opcode(5 downto 0)=OPCODE_ULESSTHAN then + write(l,string'("ulessthan")); + elsif dbg_i.opcode(5 downto 0)=OPCODE_MULT then + write(l,string'("mult")); + elsif dbg_i.opcode(5 downto 0)=OPCODE_STOREB then + write(l,string'("storeb")); + elsif dbg_i.opcode(5 downto 0)=OPCODE_CALLPCREL then + write(l,string'("callpcrel")); + elsif dbg_i.opcode(5 downto 0)=OPCODE_SUB then + write(l,string'("sub")); + elsif dbg_i.opcode(5 downto 0)=OPCODE_LESSTHANOREQUAL then + write(l,string'("lessthanorequal")); + elsif dbg_i.opcode(5 downto 0)=OPCODE_ULESSTHANOREQUAL then + write(l,string'("ulessthanorequal")); + elsif dbg_i.opcode(5 downto 0)=OPCODE_CALL then + write(l,string'("call")); + elsif dbg_i.opcode(5 downto 0)=OPCODE_POPPCREL then + write(l,string'("poppcrel")); + elsif dbg_i.opcode(5 downto 0)=OPCODE_LSHIFTRIGHT then + write(l,string'("lshiftright")); + elsif dbg_i.opcode(5 downto 0)=OPCODE_LOADH then + write(l,string'("loadh")); + elsif dbg_i.opcode(5 downto 0)=OPCODE_STOREH then + write(l,string'("storeh")); + elsif dbg_i.opcode(5 downto 0)=OPCODE_ASHIFTLEFT then + write(l,string'("ashiftleft")); + elsif dbg_i.opcode(5 downto 0)=OPCODE_ASHIFTRIGHT then + write(l,string'("ashiftright")); + elsif dbg_i.opcode(5 downto 0)=OPCODE_NEQ then + write(l,string'("neq")); + elsif dbg_i.opcode(5 downto 0)=OPCODE_NEG then + write(l,string'("neg")); + elsif dbg_i.opcode(5 downto 0)=OPCODE_XOR then + write(l,string'("xor")); + elsif dbg_i.opcode(5 downto 0)=OPCODE_DIV then + write(l,string'("div")); + elsif dbg_i.opcode(5 downto 0)=OPCODE_MOD then + write(l,string'("mod")); + elsif dbg_i.opcode(5 downto 0)=OPCODE_EQBRANCH then + write(l,string'("eqbranch")); + elsif dbg_i.opcode(5 downto 0)=OPCODE_CONFIG then + write(l,string'("config")); + elsif dbg_i.opcode(5 downto 0)=OPCODE_PUSHPC then + write(l,string'("pushpc")); + else + write(l,integer'image(to_integer(dbg_i.opcode(5 downto 0)))& + " ; invalid emulated instruction"); + end if; + elsif dbg_i.opcode(7 downto 4)=OPCODE_ADDSP then + if sp_off=0 then + write(l,string'("addsp 0 ; shift")); + elsif sp_off=1 then + write(l,string'("addsp 4 ; 1*4 = addtop")); + else + write(l,"addsp "&integer'image(to_integer(sp_off)*4)&" ; "& + integer'image(to_integer(sp_off))&"*4"); + end if; + else -- OPCODE_SHORT + case dbg_i.opcode(3 downto 0) is + when OPCODE_BREAK => + write(l,string'("break")); + when OPCODE_PUSHSP => + write(l,string'("pushsp")); + when OPCODE_POPPC => + write(l,string'("poppc")); + when OPCODE_ADD => + write(l,string'("add")); + when OPCODE_OR => + write(l,string'("or")); + when OPCODE_AND => + write(l,string'("and")); + when OPCODE_LOAD => + write(l,string'("load")); + when OPCODE_NOT => + write(l,string'("not")); + when OPCODE_FLIP => + write(l,string'("flip")); + when OPCODE_STORE => + write(l,string'("store")); + when OPCODE_POPSP => + write(l,string'("popsp")); + when OPCODE_NOP => + write(l,string'("nop")); + when others => + write(l,integer'image(to_integer(dbg_i.opcode))& + " ; invalid instruction"); + end case; + end if; + if dbg_i.opcode(7 downto 7)/=OPCODE_IM then + idim:=false; + end if; + ----------------------------- + -- End Instruction Decoder -- + ----------------------------- + writeline(l_file,l); + if dbg_i.sp<stk_min then + stk_min:=dbg_i.sp; + end if; + if first then + stk_ini:=dbg_i.sp+8; + first:=false; + end if; + end if; + wait until clk_i='0' or stop_i='1'; + if stop_i='1' then + print(output,"Minimum SP: 0x"&hstr(stk_min)&" Size: 0x"&hstr(stk_ini-stk_min)); + wait; + end if; + end loop; + end process receive_data; +end Behave; + diff --git a/zpu/hdl/zealot/devices/tx_unit.vhdl b/zpu/hdl/zealot/devices/tx_unit.vhdl new file mode 100644 index 0000000..73293f6 --- /dev/null +++ b/zpu/hdl/zealot/devices/tx_unit.vhdl @@ -0,0 +1,109 @@ +------------------------------------------------------------------------------ +---- ---- +---- RS-232 simple Tx module ---- +---- ---- +---- http://www.opencores.org/ ---- +---- ---- +---- Description: ---- +---- Implements a simple 8N1 tx module for RS-232. ---- +---- ---- +---- To Do: ---- +---- - ---- +---- ---- +---- Author: ---- +---- - Philippe Carton, philippe.carton2 libertysurf.fr ---- +---- - Juan Pablo Daniel Borgna, jpdborgna gmail.com ---- +---- - Salvador E. Tropea, salvador inti.gob.ar ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Copyright (c) 2001-2003 Philippe Carton ---- +---- Copyright (c) 2005 Juan Pablo Daniel Borgna ---- +---- Copyright (c) 2005-2008 Salvador E. Tropea ---- +---- Copyright (c) 2005-2008 Instituto Nacional de Tecnología Industrial ---- +---- ---- +---- Distributed under the GPL license ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Design unit: TxUnit(Behaviour) (Entity and architecture) ---- +---- File name: Txunit.vhdl ---- +---- Note: None ---- +---- Limitations: None known ---- +---- Errors: None known ---- +---- Library: zpu ---- +---- Dependencies: IEEE.std_logic_1164 ---- +---- zpu.UART ---- +---- Target FPGA: Spartan ---- +---- Language: VHDL ---- +---- Wishbone: No ---- +---- Synthesis tools: Xilinx Release 9.2.03i - xst J.39 ---- +---- Simulation tools: GHDL [Sokcho edition] (0.2x) ---- +---- Text editor: SETEdit 0.5.x ---- +---- ---- +------------------------------------------------------------------------------ + +library IEEE; +use IEEE.std_logic_1164.all; +library zpu; +use zpu.UART.all; + +entity TxUnit is + port ( + clk_i : in std_logic; -- Clock signal + reset_i : in std_logic; -- Reset input + enable_i : in std_logic; -- Enable input + load_i : in std_logic; -- Load input + txd_o : out std_logic; -- RS-232 data output + busy_o : out std_logic; -- Tx Busy + datai_i : in std_logic_vector(7 downto 0)); -- Byte to transmit +end entity TxUnit; + +architecture Behaviour of TxUnit is + signal tbuff_r : std_logic_vector(7 downto 0); -- transmit buffer + signal t_r : std_logic_vector(7 downto 0); -- transmit register + signal loaded_r : std_logic:='0'; -- Buffer loaded + signal txd_r : std_logic:='1'; -- Tx buffer ready +begin + busy_o <= load_i or loaded_r; + txd_o <= txd_r; + + -- Tx process + TxProc: + process (clk_i) + variable bitpos : integer range 0 to 10; -- Bit position in the frame + begin + if rising_edge(clk_i) then + if reset_i='1' then + loaded_r <= '0'; + bitpos:=0; + txd_r <= '1'; + else -- reset_i='0' + if load_i='1' then + tbuff_r <= datai_i; + loaded_r <= '1'; + end if; + if enable_i='1' then + case bitpos is + when 0 => -- idle or stop bit + txd_r <= '1'; + if loaded_r='1' then -- start transmit. next is start bit + t_r <= tbuff_r; + loaded_r <= '0'; + bitpos:=1; + end if; + when 1 => -- Start bit + txd_r <= '0'; + bitpos:=2; + when others => + txd_r <= t_r(bitpos-2); -- Serialisation of t_r + bitpos:=bitpos+1; + end case; + if bitpos=10 then -- bit8. next is stop bit + bitpos:=0; + end if; + end if; -- enable_i='1' + end if; -- reset_i='0' + end if; -- rising_edge(clk_i) + end process TxProc; +end architecture Behaviour; diff --git a/zpu/hdl/zealot/devices/txt_util.vhdl b/zpu/hdl/zealot/devices/txt_util.vhdl new file mode 100644 index 0000000..862611c --- /dev/null +++ b/zpu/hdl/zealot/devices/txt_util.vhdl @@ -0,0 +1,541 @@ +------------------------------------------------------------------------------ +---- ---- +---- Text Utils ---- +---- ---- +---- http://www.opencores.org/ ---- +---- ---- +---- Description: ---- +---- Utils to handle text. Used for the testbenches. ---- +---- ---- +---- To Do: ---- +---- - ---- +---- ---- +---- Author: ---- +---- - Øyvind Harboe, oyvind.harboe zylin.com ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Copyright (c) 2008 Øyvind Harboe <oyvind.harboe zylin.com> ---- +---- ---- +---- Distributed under the BSD license ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Design unit: txt_util (Package) ---- +---- File name: txt_util.vhdl ---- +---- Note: None ---- +---- Limitations: None known ---- +---- Errors: None known ---- +---- Library: zpu ---- +---- Dependencies: IEEE.std_logic_1164 ---- +---- IEEE.numeric_std ---- +---- std.textio ---- +---- Target FPGA: N/A ---- +---- Language: VHDL ---- +---- Wishbone: No ---- +---- Synthesis tools: Xilinx Release 9.2.03i - xst J.39 ---- +---- Simulation tools: GHDL [Sokcho edition] (0.2x) ---- +---- Text editor: SETEdit 0.5.x ---- +---- ---- +------------------------------------------------------------------------------ + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +use std.textio.all; + +library zpu; + +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; + function hstr(slv: unsigned) 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); + + procedure str_write(file out_file: TEXT; + new_string: in 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 package txt_util; + + + + +package body txt_util is + -- prints text to the screen + procedure print(text: string) is + variable msg_line: line; + begin + --synopsys translate off + write(msg_line, text); + writeline(output, msg_line); + --synopsys translate on + end procedure print; + + -- 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; + + -- 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 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 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; + + + 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 + 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 function 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 function str; + + -- convert integer to string, using base 10 + function str(int: integer) return string is + begin + return str(int, 10) ; + end function 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 function hstr; + + function hstr(slv: unsigned) return string is + begin + return hstr(std_logic_vector(slv)); + end function 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 function 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 function 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 function 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 function 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 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; + + -- 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; + + -- 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 package body txt_util; + diff --git a/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/clean_up.sh b/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/clean_up.sh new file mode 100755 index 0000000..3855f16 --- /dev/null +++ b/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/clean_up.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +# ise build stuff +rm -rf build +rm -f top.bit + +# modelsim compile stuff +rm -rf work +rm -rf zpu + +# modelsim simulation stuff +rm -f vsim.wlf +rm -f transcript +rm -f zpu_trace.log +rm -f zpu_med1_io.log +rm -f zpu_small1_io.log diff --git a/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/simulation.sh b/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/simulation.sh new file mode 100755 index 0000000..d525737 --- /dev/null +++ b/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/simulation.sh @@ -0,0 +1,49 @@ +#!/bin/sh + +# need project files: +# run.do +# wave.do + +# need ModelSim tools: +# vlib +# vcom +# vsim + + +echo "###############" +echo "compile zpu lib" +echo "###############" +vlib zpu +vcom -work zpu ../../roms/hello_dbram.vhdl +vcom -work zpu ../../roms/hello_bram.vhdl +#vcom -work zpu ../../roms/dmips_dbram.vhdl +#vcom -work zpu ../../roms/dmips_bram.vhdl + +vcom -work zpu ../../roms/rom_pkg.vhdl +vcom -work zpu ../../zpu_pkg.vhdl +vcom -work zpu ../../zpu_small.vhdl +vcom -work zpu ../../zpu_medium.vhdl +vcom -work zpu ../../helpers/zpu_small1.vhdl +vcom -work zpu ../../helpers/zpu_med1.vhdl +vcom -work zpu ../../devices/txt_util.vhdl +vcom -work zpu ../../devices/phi_io.vhdl +vcom -work zpu ../../devices/timer.vhdl +vcom -work zpu ../../devices/gpio.vhdl +vcom -work zpu ../../devices/rx_unit.vhdl +vcom -work zpu ../../devices/tx_unit.vhdl +vcom -work zpu ../../devices/br_gen.vhdl +vcom -work zpu ../../devices/trace.vhdl + + +echo "################" +echo "compile work lib" +echo "################" +vlib work +vcom top.vhd +vcom top_tb.vhd + + +echo "###################" +echo "start simulator gui" +echo "###################" +vsim -gui top_tb -do simulation_config/run.do diff --git a/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/simulation_config/run.do b/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/simulation_config/run.do new file mode 100644 index 0000000..acc1710 --- /dev/null +++ b/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/simulation_config/run.do @@ -0,0 +1,2 @@ +do wave.do +run -all diff --git a/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/simulation_config/wave.do b/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/simulation_config/wave.do new file mode 100644 index 0000000..3f5d4fe --- /dev/null +++ b/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/simulation_config/wave.do @@ -0,0 +1,30 @@ +onerror {resume} +quietly WaveActivateNextPane {} 0 +add wave -noupdate /top_tb/tb_reset_n +add wave -noupdate /top_tb/tb_clk +add wave -noupdate -divider <NULL> +add wave -noupdate /top_tb/tb_rs232_rx +add wave -noupdate /top_tb/tb_rs232_tx +add wave -noupdate /top_tb/tb_rs232_rts +add wave -noupdate /top_tb/tb_rs232_cts +add wave -noupdate -divider Buttons +add wave -noupdate /top_tb/tb_button_n +add wave -noupdate -divider LEDs +add wave -noupdate /top_tb/tb_led +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {{Cursor 1} {0 ps} 0} +configure wave -namecolwidth 150 +configure wave -valuecolwidth 100 +configure wave -justifyvalue left +configure wave -signalnamewidth 2 +configure wave -snapdistance 10 +configure wave -datasetprefix 0 +configure wave -rowmargin 4 +configure wave -childrowmargin 2 +configure wave -gridoffset 0 +configure wave -gridperiod 1 +configure wave -griddelta 40 +configure wave -timeline 0 +configure wave -timelineunits ns +update +WaveRestoreZoom {1294218073 ps} {1421130628 ps} diff --git a/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/synthesis.sh b/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/synthesis.sh new file mode 100755 index 0000000..a7180fc --- /dev/null +++ b/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/synthesis.sh @@ -0,0 +1,36 @@ +#!/bin/sh + +# need project files: +# top.xst +# top.prj +# top.ut + +# need Xilinx tools: +# xst +# ngdbuild +# map +# par +# trce +# bitgen + +echo "########################" +echo "generate build directory" +echo "########################" +mkdir build +cd build +mkdir tmp + +echo "###############" +echo "start processes" +echo "###############" +xst -ifn "../synthesis_config/top.xst" -ofn "top.syr" +ngdbuild -dd _ngo -nt timestamp -uc ../synthesis_config/altium-livedesign-xc3s1000.ucf -p xc3s1000-fg456-4 top.ngc top.ngd +map -p xc3s1000-fg456-4 -cm area -ir off -pr off -c 100 -o top_map.ncd top.ngd top.pcf +par -w -ol high -t 1 top_map.ncd top.ncd top.pcf +trce -v 3 -s 4 -n 3 -fastpaths -xml top.twx top.ncd -o top.twr top.pcf +bitgen -f ../synthesis_config/top.ut top.ncd + +echo "###########" +echo "get bitfile" +echo "###########" +cp top.bit .. diff --git a/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/synthesis_config/altium-livedesign-xc3s1000.ucf b/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/synthesis_config/altium-livedesign-xc3s1000.ucf new file mode 100644 index 0000000..ba22ee9 --- /dev/null +++ b/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/synthesis_config/altium-livedesign-xc3s1000.ucf @@ -0,0 +1,397 @@ +############################################################ +# Altium Livedesign Evaluation Board constraints file +# +# Familiy: Spartan-3 +# Device: XC3S1000 +# Package: FG456C +# Speed: -4 +# +# all banks are powered with 3.3V +# +# config pins (M2, M1, M0): 101 + +############################################################ +## clock/timing constraints +############################################################ + +NET "clk_50" period = 50 MHz ; + + +############################################################ +## pin placement constraints +############################################################ + +NET "clk_50" LOC = AA12 | IOSTANDARD = LVCMOS33; +NET "reset_n" LOC = Y17 | IOSTANDARD = LVCMOS33; # low active + +# Soft JTAG +NET "soft_tdo" LOC = D22 | IOSTANDARD = LVCMOS33; +NET "soft_tms" LOC = E21 | IOSTANDARD = LVCMOS33; +NET "soft_tdi" LOC = E22 | IOSTANDARD = LVCMOS33; +NET "soft_tck" LOC = F21 | IOSTANDARD = LVCMOS33; + +# SRAM 0 +NET "sram0_a<0>" LOC = L6 | IOSTANDARD = LVCMOS33; +NET "sram0_a<1>" LOC = K4 | IOSTANDARD = LVCMOS33; +NET "sram0_a<2>" LOC = H5 | IOSTANDARD = LVCMOS33; +NET "sram0_a<3>" LOC = G6 | IOSTANDARD = LVCMOS33; +NET "sram0_a<4>" LOC = F3 | IOSTANDARD = LVCMOS33; +NET "sram0_a<5>" LOC = G1 | IOSTANDARD = LVCMOS33; +NET "sram0_a<6>" LOC = G2 | IOSTANDARD = LVCMOS33; +NET "sram0_a<7>" LOC = K3 | IOSTANDARD = LVCMOS33; +NET "sram0_a<8>" LOC = T2 | IOSTANDARD = LVCMOS33; +NET "sram0_a<9>" LOC = T1 | IOSTANDARD = LVCMOS33; +NET "sram0_a<10>" LOC = U2 | IOSTANDARD = LVCMOS33; +NET "sram0_a<11>" LOC = V3 | IOSTANDARD = LVCMOS33; +NET "sram0_a<12>" LOC = V1 | IOSTANDARD = LVCMOS33; +NET "sram0_a<13>" LOC = W1 | IOSTANDARD = LVCMOS33; +NET "sram0_a<14>" LOC = V2 | IOSTANDARD = LVCMOS33; +NET "sram0_a<15>" LOC = V5 | IOSTANDARD = LVCMOS33; +NET "sram0_a<16>" LOC = V4 | IOSTANDARD = LVCMOS33; +NET "sram0_a<17>" LOC = U5 | IOSTANDARD = LVCMOS33; +NET "sram0_a<18>" LOC = U6 | IOSTANDARD = LVCMOS33; # n.c. +NET "sram0_d<0>" LOC = L4 | IOSTANDARD = LVCMOS33; +NET "sram0_d<1>" LOC = L3 | IOSTANDARD = LVCMOS33; +NET "sram0_d<2>" LOC = M5 | IOSTANDARD = LVCMOS33; +NET "sram0_d<3>" LOC = M4 | IOSTANDARD = LVCMOS33; +NET "sram0_d<4>" LOC = M3 | IOSTANDARD = LVCMOS33; +NET "sram0_d<5>" LOC = N4 | IOSTANDARD = LVCMOS33; +NET "sram0_d<6>" LOC = N3 | IOSTANDARD = LVCMOS33; +NET "sram0_d<7>" LOC = T5 | IOSTANDARD = LVCMOS33; +NET "sram0_d<8>" LOC = T4 | IOSTANDARD = LVCMOS33; +NET "sram0_d<9>" LOC = T6 | IOSTANDARD = LVCMOS33; +NET "sram0_d<10>" LOC = M6 | IOSTANDARD = LVCMOS33; +NET "sram0_d<11>" LOC = N2 | IOSTANDARD = LVCMOS33; +NET "sram0_d<12>" LOC = N1 | IOSTANDARD = LVCMOS33; +NET "sram0_d<13>" LOC = M2 | IOSTANDARD = LVCMOS33; +NET "sram0_d<14>" LOC = M1 | IOSTANDARD = LVCMOS33; +NET "sram0_d<15>" LOC = L2 | IOSTANDARD = LVCMOS33; +NET "sram0_cs_n" LOC = L5 | IOSTANDARD = LVCMOS33; +NET "sram0_lb_n" LOC = L1 | IOSTANDARD = LVCMOS33; +NET "sram0_ub_n" LOC = K2 | IOSTANDARD = LVCMOS33; +NET "sram0_we_n" LOC = U4 | IOSTANDARD = LVCMOS33; +NET "sram0_oe_n" LOC = K1 | IOSTANDARD = LVCMOS33; + +# SRAM 1 +NET "sram1_a<0>" LOC = K21 | IOSTANDARD = LVCMOS33; +NET "sram1_a<1>" LOC = K22 | IOSTANDARD = LVCMOS33; +NET "sram1_a<2>" LOC = K20 | IOSTANDARD = LVCMOS33; +NET "sram1_a<3>" LOC = G21 | IOSTANDARD = LVCMOS33; +NET "sram1_a<4>" LOC = G22 | IOSTANDARD = LVCMOS33; +NET "sram1_a<5>" LOC = M17 | IOSTANDARD = LVCMOS33; +NET "sram1_a<6>" LOC = L18 | IOSTANDARD = LVCMOS33; +NET "sram1_a<7>" LOC = K19 | IOSTANDARD = LVCMOS33; +NET "sram1_a<8>" LOC = V19 | IOSTANDARD = LVCMOS33; +NET "sram1_a<9>" LOC = W20 | IOSTANDARD = LVCMOS33; +NET "sram1_a<10>" LOC = W19 | IOSTANDARD = LVCMOS33; +NET "sram1_a<11>" LOC = Y20 | IOSTANDARD = LVCMOS33; +NET "sram1_a<12>" LOC = Y21 | IOSTANDARD = LVCMOS33; +NET "sram1_a<13>" LOC = Y22 | IOSTANDARD = LVCMOS33; +NET "sram1_a<14>" LOC = W21 | IOSTANDARD = LVCMOS33; +NET "sram1_a<15>" LOC = W22 | IOSTANDARD = LVCMOS33; +NET "sram1_a<16>" LOC = V21 | IOSTANDARD = LVCMOS33; +NET "sram1_a<17>" LOC = V22 | IOSTANDARD = LVCMOS33; +NET "sram1_a<18>" LOC = V20 | IOSTANDARD = LVCMOS33; # n.c. +NET "sram1_d<0>" LOC = L21 | IOSTANDARD = LVCMOS33; +NET "sram1_d<1>" LOC = M22 | IOSTANDARD = LVCMOS33; +NET "sram1_d<2>" LOC = M21 | IOSTANDARD = LVCMOS33; +NET "sram1_d<3>" LOC = N22 | IOSTANDARD = LVCMOS33; +NET "sram1_d<4>" LOC = N21 | IOSTANDARD = LVCMOS33; +NET "sram1_d<5>" LOC = U20 | IOSTANDARD = LVCMOS33; +NET "sram1_d<6>" LOC = T22 | IOSTANDARD = LVCMOS33; +NET "sram1_d<7>" LOC = T21 | IOSTANDARD = LVCMOS33; +NET "sram1_d<8>" LOC = V18 | IOSTANDARD = LVCMOS33; +NET "sram1_d<9>" LOC = U19 | IOSTANDARD = LVCMOS33; +NET "sram1_d<10>" LOC = U18 | IOSTANDARD = LVCMOS33; +NET "sram1_d<11>" LOC = T18 | IOSTANDARD = LVCMOS33; +NET "sram1_d<12>" LOC = R18 | IOSTANDARD = LVCMOS33; +NET "sram1_d<13>" LOC = T17 | IOSTANDARD = LVCMOS33; +NET "sram1_d<14>" LOC = M18 | IOSTANDARD = LVCMOS33; +NET "sram1_d<15>" LOC = M20 | IOSTANDARD = LVCMOS33; +NET "sram1_cs_n" LOC = L22 | IOSTANDARD = LVCMOS33; +NET "sram1_lb_n" LOC = M19 | IOSTANDARD = LVCMOS33; +NET "sram1_ub_n" LOC = L20 | IOSTANDARD = LVCMOS33; +NET "sram1_we_n" LOC = U21 | IOSTANDARD = LVCMOS33; +NET "sram1_oe_n" LOC = L19 | IOSTANDARD = LVCMOS33; + +# RS232 +NET "rs232_rx" LOC = A5 | IOSTANDARD = LVCMOS33; +NET "rs232_tx" LOC = F7 | IOSTANDARD = LVCMOS33; +NET "rs232_cts" LOC = F2 | IOSTANDARD = LVCMOS33; +NET "rs232_rts" LOC = E1 | IOSTANDARD = LVCMOS33; + +# 2x PS2 connectors +NET "mouse_clk" LOC = L17 | IOSTANDARD = LVCMOS33; +NET "mouse_data" LOC = G18 | IOSTANDARD = LVCMOS33; +NET "kbd_clk" LOC = F20 | IOSTANDARD = LVCMOS33; +NET "kbd_data" LOC = G19 | IOSTANDARD = LVCMOS33; + + +# VGA output (2**9 = 512 colors) +NET "vga_blue<7>" LOC = E14 | IOSTANDARD = LVCMOS33; +NET "vga_blue<6>" LOC = A13 | IOSTANDARD = LVCMOS33; +NET "vga_blue<5>" LOC = C13 | IOSTANDARD = LVCMOS33; +NET "vga_green<7>" LOC = E11 | IOSTANDARD = LVCMOS33; +NET "vga_green<6>" LOC = C11 | IOSTANDARD = LVCMOS33; +NET "vga_green<5>" LOC = D10 | IOSTANDARD = LVCMOS33; +NET "vga_red<7>" LOC = D6 | IOSTANDARD = LVCMOS33; +NET "vga_red<6>" LOC = D7 | IOSTANDARD = LVCMOS33; +NET "vga_red<5>" LOC = D9 | IOSTANDARD = LVCMOS33; +NET "vga_hsync" LOC = A8 | IOSTANDARD = LVCMOS33; +NET "vga_vsync" LOC = B14 | IOSTANDARD = LVCMOS33; + + +# Stereo Audio out +NET "audio_r" LOC = U3 | IOSTANDARD = LVCMOS33; +NET "audio_l" LOC = W3 | IOSTANDARD = LVCMOS33; + + +# GPIO DIP switches 7..0 left..right, low active +NET "switch_n<0>" LOC = Y6 | IOSTANDARD = LVCMOS33; +NET "switch_n<1>" LOC = V6 | IOSTANDARD = LVCMOS33; +NET "switch_n<2>" LOC = U7 | IOSTANDARD = LVCMOS33; +NET "switch_n<3>" LOC = AA4 | IOSTANDARD = LVCMOS33; +NET "switch_n<4>" LOC = AB4 | IOSTANDARD = LVCMOS33; +NET "switch_n<5>" LOC = AA5 | IOSTANDARD = LVCMOS33; +NET "switch_n<6>" LOC = AB5 | IOSTANDARD = LVCMOS33; +NET "switch_n<7>" LOC = AA6 | IOSTANDARD = LVCMOS33; + +# GPIO push buttons, low active +NET "button_n<5>" LOC = C21 | IOSTANDARD = LVCMOS33; +NET "button_n<4>" LOC = B20 | IOSTANDARD = LVCMOS33; +NET "button_n<3>" LOC = A15 | IOSTANDARD = LVCMOS33; +NET "button_n<2>" LOC = B6 | IOSTANDARD = LVCMOS33; +NET "button_n<1>" LOC = C1 | IOSTANDARD = LVCMOS33; +NET "button_n<0>" LOC = D1 | IOSTANDARD = LVCMOS33; + +# GPIO LEDs +NET "led<7>" LOC = W6 | IOSTANDARD = LVCMOS33; +NET "led<6>" LOC = Y5 | IOSTANDARD = LVCMOS33; +NET "led<5>" LOC = W5 | IOSTANDARD = LVCMOS33; +NET "led<4>" LOC = W4 | IOSTANDARD = LVCMOS33; +NET "led<3>" LOC = Y3 | IOSTANDARD = LVCMOS33; +NET "led<2>" LOC = Y2 | IOSTANDARD = LVCMOS33; +NET "led<1>" LOC = Y1 | IOSTANDARD = LVCMOS33; +NET "led<0>" LOC = W2 | IOSTANDARD = LVCMOS33; + +# seven segment display (5=left 0=right) +# +# segment assignment: +# .ABCDEFG +# 76543210 +NET "dig0_seg<7>" LOC = E20 | IOSTANDARD = LVCMOS33; +NET "dig0_seg<6>" LOC = C22 | IOSTANDARD = LVCMOS33; +NET "dig0_seg<5>" LOC = E18 | IOSTANDARD = LVCMOS33; +NET "dig0_seg<4>" LOC = D20 | IOSTANDARD = LVCMOS33; +NET "dig0_seg<3>" LOC = D21 | IOSTANDARD = LVCMOS33; +NET "dig0_seg<2>" LOC = E19 | IOSTANDARD = LVCMOS33; +NET "dig0_seg<1>" LOC = G17 | IOSTANDARD = LVCMOS33; +NET "dig0_seg<0>" LOC = F19 | IOSTANDARD = LVCMOS33; + +NET "dig1_seg<7>" LOC = F17 | IOSTANDARD = LVCMOS33; +NET "dig1_seg<6>" LOC = D18 | IOSTANDARD = LVCMOS33; +NET "dig1_seg<5>" LOC = B19 | IOSTANDARD = LVCMOS33; +NET "dig1_seg<4>" LOC = C18 | IOSTANDARD = LVCMOS33; +NET "dig1_seg<3>" LOC = C19 | IOSTANDARD = LVCMOS33; +NET "dig1_seg<2>" LOC = C20 | IOSTANDARD = LVCMOS33; +NET "dig1_seg<1>" LOC = F18 | IOSTANDARD = LVCMOS33; +NET "dig1_seg<0>" LOC = D19 | IOSTANDARD = LVCMOS33; + +NET "dig2_seg<7>" LOC = A19 | IOSTANDARD = LVCMOS33; +NET "dig2_seg<6>" LOC = E17 | IOSTANDARD = LVCMOS33; +NET "dig2_seg<5>" LOC = C17 | IOSTANDARD = LVCMOS33; +NET "dig2_seg<4>" LOC = D17 | IOSTANDARD = LVCMOS33; +NET "dig2_seg<3>" LOC = B15 | IOSTANDARD = LVCMOS33; +NET "dig2_seg<2>" LOC = A18 | IOSTANDARD = LVCMOS33; +NET "dig2_seg<1>" LOC = B18 | IOSTANDARD = LVCMOS33; +NET "dig2_seg<0>" LOC = B17 | IOSTANDARD = LVCMOS33; + +NET "dig3_seg<7>" LOC = D15 | IOSTANDARD = LVCMOS33; +NET "dig3_seg<6>" LOC = E13 | IOSTANDARD = LVCMOS33; +NET "dig3_seg<5>" LOC = B13 | IOSTANDARD = LVCMOS33; +NET "dig3_seg<4>" LOC = D13 | IOSTANDARD = LVCMOS33; +NET "dig3_seg<3>" LOC = D14 | IOSTANDARD = LVCMOS33; +NET "dig3_seg<2>" LOC = A14 | IOSTANDARD = LVCMOS33; +NET "dig3_seg<1>" LOC = E16 | IOSTANDARD = LVCMOS33; +NET "dig3_seg<0>" LOC = E15 | IOSTANDARD = LVCMOS33; + +NET "dig4_seg<7>" LOC = D11 | IOSTANDARD = LVCMOS33; +NET "dig4_seg<6>" LOC = E9 | IOSTANDARD = LVCMOS33; +NET "dig4_seg<5>" LOC = A10 | IOSTANDARD = LVCMOS33; +NET "dig4_seg<4>" LOC = B9 | IOSTANDARD = LVCMOS33; +NET "dig4_seg<3>" LOC = A9 | IOSTANDARD = LVCMOS33; +NET "dig4_seg<2>" LOC = C10 | IOSTANDARD = LVCMOS33; +NET "dig4_seg<1>" LOC = A12 | IOSTANDARD = LVCMOS33; +NET "dig4_seg<0>" LOC = B10 | IOSTANDARD = LVCMOS33; + +NET "dig5_seg<7>" LOC = C7 | IOSTANDARD = LVCMOS33; +NET "dig5_seg<6>" LOC = A4 | IOSTANDARD = LVCMOS33; +NET "dig5_seg<5>" LOC = B5 | IOSTANDARD = LVCMOS33; +NET "dig5_seg<4>" LOC = E6 | IOSTANDARD = LVCMOS33; +NET "dig5_seg<3>" LOC = C5 | IOSTANDARD = LVCMOS33; +NET "dig5_seg<2>" LOC = E7 | IOSTANDARD = LVCMOS33; +NET "dig5_seg<1>" LOC = B8 | IOSTANDARD = LVCMOS33; +NET "dig5_seg<0>" LOC = C6 | IOSTANDARD = LVCMOS33; + + +# Header A (left) +NET "header_a<2>" LOC = V7 | IOSTANDARD = LVCMOS33; +NET "header_a<3>" LOC = AA8 | IOSTANDARD = LVCMOS33; +NET "header_a<4>" LOC = AB8 | IOSTANDARD = LVCMOS33; +NET "header_a<5>" LOC = V8 | IOSTANDARD = LVCMOS33; +NET "header_a<6>" LOC = Y10 | IOSTANDARD = LVCMOS33; +NET "header_a<7>" LOC = V9 | IOSTANDARD = LVCMOS33; +NET "header_a<8>" LOC = W9 | IOSTANDARD = LVCMOS33; +NET "header_a<9>" LOC = AA10 | IOSTANDARD = LVCMOS33; +NET "header_a<10>" LOC = AB10 | IOSTANDARD = LVCMOS33; +NET "header_a<11>" LOC = W10 | IOSTANDARD = LVCMOS33; +NET "header_a<12>" LOC = AB11 | IOSTANDARD = LVCMOS33; +NET "header_a<13>" LOC = U11 | IOSTANDARD = LVCMOS33; +NET "header_a<14>" LOC = AB13 | IOSTANDARD = LVCMOS33; +NET "header_a<15>" LOC = AA13 | IOSTANDARD = LVCMOS33; +NET "header_a<16>" LOC = V10 | IOSTANDARD = LVCMOS33; +NET "header_a<17>" LOC = U10 | IOSTANDARD = LVCMOS33; +NET "header_a<18>" LOC = W13 | IOSTANDARD = LVCMOS33; +NET "header_a<19>" LOC = Y13 | IOSTANDARD = LVCMOS33; + +# Header B (right) +NET "header_b<2>" LOC = V14 | IOSTANDARD = LVCMOS33; +NET "header_b<3>" LOC = V13 | IOSTANDARD = LVCMOS33; +NET "header_b<4>" LOC = AA15 | IOSTANDARD = LVCMOS33; +NET "header_b<5>" LOC = W14 | IOSTANDARD = LVCMOS33; +NET "header_b<6>" LOC = AB15 | IOSTANDARD = LVCMOS33; +NET "header_b<7>" LOC = Y16 | IOSTANDARD = LVCMOS33; +NET "header_b<8>" LOC = AA17 | IOSTANDARD = LVCMOS33; +NET "header_b<9>" LOC = AA18 | IOSTANDARD = LVCMOS33; +NET "header_b<10>" LOC = AB18 | IOSTANDARD = LVCMOS33; +NET "header_b<11>" LOC = Y18 | IOSTANDARD = LVCMOS33; +NET "header_b<12>" LOC = Y19 | IOSTANDARD = LVCMOS33; +NET "header_b<13>" LOC = AB20 | IOSTANDARD = LVCMOS33; +NET "header_b<14>" LOC = AA20 | IOSTANDARD = LVCMOS33; +NET "header_b<15>" LOC = U16 | IOSTANDARD = LVCMOS33; +NET "header_b<16>" LOC = V16 | IOSTANDARD = LVCMOS33; +NET "header_b<17>" LOC = V17 | IOSTANDARD = LVCMOS33; +NET "header_b<18>" LOC = W16 | IOSTANDARD = LVCMOS33; +NET "header_b<19>" LOC = W17 | IOSTANDARD = LVCMOS33; + +# usused pins +CONFIG PROHIBIT = A3; +CONFIG PROHIBIT = A7; +CONFIG PROHIBIT = A11; +CONFIG PROHIBIT = A16; +CONFIG PROHIBIT = AA3; +CONFIG PROHIBIT = AA7; +CONFIG PROHIBIT = AA9; +CONFIG PROHIBIT = AA11; +CONFIG PROHIBIT = AA14; +CONFIG PROHIBIT = AA16; +CONFIG PROHIBIT = AA19; +CONFIG PROHIBIT = AB7; +CONFIG PROHIBIT = AB9; +CONFIG PROHIBIT = AB12; +CONFIG PROHIBIT = AB14; +CONFIG PROHIBIT = AB16; +CONFIG PROHIBIT = AB19; +CONFIG PROHIBIT = B4; +CONFIG PROHIBIT = B7; +CONFIG PROHIBIT = B12; +CONFIG PROHIBIT = B11; +CONFIG PROHIBIT = B16; +CONFIG PROHIBIT = C2; +CONFIG PROHIBIT = C3; +CONFIG PROHIBIT = C4; +CONFIG PROHIBIT = C12; +CONFIG PROHIBIT = C16; +CONFIG PROHIBIT = D2; +CONFIG PROHIBIT = D3; +CONFIG PROHIBIT = D4; +CONFIG PROHIBIT = D5; +CONFIG PROHIBIT = D8; +CONFIG PROHIBIT = D12; +CONFIG PROHIBIT = D16; +CONFIG PROHIBIT = E2; +CONFIG PROHIBIT = E3; +CONFIG PROHIBIT = E8; +CONFIG PROHIBIT = E4; +CONFIG PROHIBIT = E5; +CONFIG PROHIBIT = F4; +CONFIG PROHIBIT = E10; +CONFIG PROHIBIT = E12; +CONFIG PROHIBIT = F12; +CONFIG PROHIBIT = F5; +CONFIG PROHIBIT = F13; +CONFIG PROHIBIT = F6; +CONFIG PROHIBIT = F9; +CONFIG PROHIBIT = F10; +CONFIG PROHIBIT = F16; +CONFIG PROHIBIT = F11; +CONFIG PROHIBIT = F14; +CONFIG PROHIBIT = G3; +CONFIG PROHIBIT = G4; +CONFIG PROHIBIT = G5; +CONFIG PROHIBIT = G20; +CONFIG PROHIBIT = H1; +CONFIG PROHIBIT = H2; +CONFIG PROHIBIT = H4; +CONFIG PROHIBIT = H18; +CONFIG PROHIBIT = H19; +CONFIG PROHIBIT = H21; +CONFIG PROHIBIT = H22; +CONFIG PROHIBIT = J1; +CONFIG PROHIBIT = J2; +CONFIG PROHIBIT = J4; +CONFIG PROHIBIT = J5; +CONFIG PROHIBIT = J6; +CONFIG PROHIBIT = J17; +CONFIG PROHIBIT = J18; +CONFIG PROHIBIT = J19; +CONFIG PROHIBIT = J21; +CONFIG PROHIBIT = J22; +CONFIG PROHIBIT = K5; +CONFIG PROHIBIT = K6; +CONFIG PROHIBIT = K17; +CONFIG PROHIBIT = K18; +CONFIG PROHIBIT = N5; +CONFIG PROHIBIT = N6; +CONFIG PROHIBIT = N17; +CONFIG PROHIBIT = N18; +CONFIG PROHIBIT = N19; +CONFIG PROHIBIT = N20; +CONFIG PROHIBIT = P1; +CONFIG PROHIBIT = P2; +CONFIG PROHIBIT = P4; +CONFIG PROHIBIT = P5; +CONFIG PROHIBIT = P6; +CONFIG PROHIBIT = P17; +CONFIG PROHIBIT = P18; +CONFIG PROHIBIT = P19; +CONFIG PROHIBIT = P21; +CONFIG PROHIBIT = P22; +CONFIG PROHIBIT = R1; +CONFIG PROHIBIT = R2; +CONFIG PROHIBIT = R4; +CONFIG PROHIBIT = R5; +CONFIG PROHIBIT = R19; +CONFIG PROHIBIT = R21; +CONFIG PROHIBIT = R22; +CONFIG PROHIBIT = T3; +CONFIG PROHIBIT = T19; +CONFIG PROHIBIT = T20; +CONFIG PROHIBIT = U9; +CONFIG PROHIBIT = U12; +CONFIG PROHIBIT = U13; +CONFIG PROHIBIT = U14; +CONFIG PROHIBIT = U17; +CONFIG PROHIBIT = V11; +CONFIG PROHIBIT = V12; +CONFIG PROHIBIT = V15; +CONFIG PROHIBIT = W7; +CONFIG PROHIBIT = W8; +CONFIG PROHIBIT = W11; +CONFIG PROHIBIT = W12; +CONFIG PROHIBIT = W15; +CONFIG PROHIBIT = W18; +CONFIG PROHIBIT = Y4; +CONFIG PROHIBIT = Y7; +CONFIG PROHIBIT = Y11; +CONFIG PROHIBIT = Y12; diff --git a/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/synthesis_config/top.prj b/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/synthesis_config/top.prj new file mode 100644 index 0000000..24120d5 --- /dev/null +++ b/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/synthesis_config/top.prj @@ -0,0 +1,19 @@ +vhdl work ../top.vhd +vhdl zpu ../../../zpu_pkg.vhdl +vhdl zpu ../../../zpu_small.vhdl +vhdl zpu ../../../zpu_medium.vhdl +vhdl zpu ../../../roms/rom_pkg.vhdl +#vhdl zpu ../../../roms/hello_dbram.vhdl +#vhdl zpu ../../../roms/hello_bram.vhdl +vhdl zpu ../../../roms/dmips_dbram.vhdl +vhdl zpu ../../../roms/dmips_bram.vhdl +vhdl zpu ../../../helpers/zpu_small1.vhdl +vhdl zpu ../../../helpers/zpu_med1.vhdl +vhdl zpu ../../../devices/txt_util.vhdl +vhdl zpu ../../../devices/phi_io.vhdl +vhdl zpu ../../../devices/timer.vhdl +vhdl zpu ../../../devices/gpio.vhdl +vhdl zpu ../../../devices/rx_unit.vhdl +vhdl zpu ../../../devices/tx_unit.vhdl +vhdl zpu ../../../devices/br_gen.vhdl +vhdl zpu ../../../devices/trace.vhdl diff --git a/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/synthesis_config/top.ut b/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/synthesis_config/top.ut new file mode 100644 index 0000000..765a6f3 --- /dev/null +++ b/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/synthesis_config/top.ut @@ -0,0 +1,29 @@ +-w +-g DebugBitstream:No +-g Binary:no +-g CRC:Enable +-g ConfigRate:6 +-g CclkPin:PullUp +-g M0Pin:PullUp +-g M1Pin:PullUp +-g M2Pin:PullUp +-g ProgPin:PullUp +-g DonePin:PullUp +-g HswapenPin:PullUp +-g TckPin:PullUp +-g TdiPin:PullUp +-g TdoPin:PullUp +-g TmsPin:PullUp +-g UnusedPin:PullDown +-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 Match_cycle:Auto +-g Security:None +-g DonePipe:No +-g DriveDone:No diff --git a/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/synthesis_config/top.xst b/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/synthesis_config/top.xst new file mode 100644 index 0000000..14873ea --- /dev/null +++ b/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/synthesis_config/top.xst @@ -0,0 +1,56 @@ +set -tmpdir "tmp" +set -xsthdpdir "xst" +run +-ifn ../synthesis_config/top.prj +-ifmt mixed +-ofn top +-ofmt NGC +-p xc3s1000-4-fg456 +-top top +-opt_mode Speed +-opt_level 1 +-iuc NO +-keep_hierarchy No +-netlist_hierarchy As_Optimized +-rtlview Yes +-glob_opt AllClockNets +-read_cores YES +-write_timing_constraints NO +-cross_clock_analysis NO +-hierarchy_separator / +-bus_delimiter <> +-case Maintain +-slice_utilization_ratio 100 +-bram_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 +-mux_style Auto +-decoder_extract YES +-priority_extract Yes +-shreg_extract YES +-shift_extract YES +-xor_collapse YES +-rom_style Auto +-auto_bram_packing NO +-mux_extract Yes +-resource_sharing YES +-async_to_sync NO +-mult_style Auto +-iobuf YES +-max_fanout 500 +-bufg 8 +-register_duplication YES +-register_balancing No +-slice_packing YES +-optimize_primitives NO +-use_clock_enable Yes +-use_sync_set Yes +-use_sync_reset Yes +-iob Auto +-equivalent_register_removal YES +-slice_utilization_ratio_maxmargin 5 diff --git a/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/top.vhd b/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/top.vhd new file mode 100644 index 0000000..4a93c4f --- /dev/null +++ b/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/top.vhd @@ -0,0 +1,372 @@ +-- top module of +-- Altium LiveDesign Board +-- +-- using following external connections: +-- test button as reset +-- LEDs and 7 segment for output +-- RS232 +-- + + +library ieee; +use ieee.std_logic_1164.all; + +library zpu; +use zpu.zpupkg.all; -- zpu_dbgo_t + +library unisim; +use unisim.vcomponents.dcm; + + +entity top is + port ( + -- pragma translate_off + stop_simulation : out std_logic; + -- pragma translate_on + clk_50 : in std_logic; + reset_n : in std_logic; + -- + -- soft JTAG + soft_tdo : out std_logic; + soft_tms : in std_logic; + soft_tdi : in std_logic; + soft_tck : in std_logic; + -- + -- SRAM 0 (256k x 16) pin connections + sram0_a : out std_logic_vector(18 downto 0); + sram0_d : inout std_logic_vector(15 downto 0); + sram0_lb_n : out std_logic; + sram0_ub_n : out std_logic; + sram0_cs_n : out std_logic; -- chip select + sram0_we_n : out std_logic; -- write-enable + sram0_oe_n : out std_logic; -- output enable + -- + -- SRAM 1 (256k x 16) pin connections + sram1_a : out std_logic_vector(18 downto 0); + sram1_d : inout std_logic_vector(15 downto 0); + sram1_lb_n : out std_logic; + sram1_ub_n : out std_logic; + sram1_cs_n : out std_logic; -- chip select + sram1_we_n : out std_logic; -- write-enable + sram1_oe_n : out std_logic; -- output enable + -- + -- RS232 + rs232_rx : in std_logic; + rs232_tx : out std_logic; + rs232_cts : in std_logic; + rs232_rts : out std_logic; + -- + -- PS2 connectors + mouse_clk : inout std_logic; + mouse_data : inout std_logic; + kbd_clk : inout std_logic; + kbd_data : inout std_logic; + -- + -- vga output + vga_red : out std_logic_vector(7 downto 5); + vga_green : out std_logic_vector(7 downto 5); + vga_blue : out std_logic_vector(7 downto 5); + vga_hsync : out std_logic; + vga_vsync : out std_logic; + -- + -- Audio out + audio_r : out std_logic; + audio_l : out std_logic; + -- + -- GPIOs + switch_n : in std_logic_vector(7 downto 0); + button_n : in std_logic_vector(5 downto 0); + led : out std_logic_vector(7 downto 0); + -- + -- seven segment display + dig0_seg : out std_logic_vector(7 downto 0); + dig1_seg : out std_logic_vector(7 downto 0); + dig2_seg : out std_logic_vector(7 downto 0); + dig3_seg : out std_logic_vector(7 downto 0); + dig4_seg : out std_logic_vector(7 downto 0); + dig5_seg : out std_logic_vector(7 downto 0); + -- + -- User Header + header_a : inout std_logic_vector(19 downto 2); + header_b : inout std_logic_vector(19 downto 2) + ); +end entity top; + + +architecture rtl of top is + + + --------------------------- + -- type declarations + type zpu_type is (zpu_small, zpu_medium); + + --------------------------- + -- constant declarations + constant zpu_flavour : zpu_type := zpu_medium; -- choose your flavour HERE + -- modify frequency here + constant clk_multiply : positive := 3; -- 9 for small, 3 for medium + constant clk_divide : positive := 2; -- 5 for small, 2 for medium + -- + constant word_size_c : natural := 32; -- 32 bits data path + constant addr_w_c : natural := 18; -- 18 bits address space=256 kB, 128 kB I/O + + constant clk_frequency : positive := 50; -- input frequency for correct calculation + + + --------------------------- + -- component declarations + component zpu_small1 is + generic ( + word_size : natural := 32; -- 32 bits data path + d_care_val : std_logic := '0'; -- Fill value + clk_freq : positive := 50; -- 50 MHz clock + brate : positive := 115200; -- RS232 baudrate + addr_w : natural := 16; -- 16 bits address space=64 kB, 32 kB I/O + bram_w : natural := 15 -- 15 bits RAM space=32 kB + ); + port ( + clk_i : in std_logic; -- CPU clock + rst_i : in std_logic; -- Reset + break_o : out std_logic; -- Break executed + dbg_o : out zpu_dbgo_t; -- Debug info + rs232_tx_o : out std_logic; -- UART Tx + rs232_rx_i : in std_logic; -- UART Rx + gpio_in : in std_logic_vector(31 downto 0); + gpio_out : out std_logic_vector(31 downto 0); + gpio_dir : out std_logic_vector(31 downto 0) -- 1 = in, 0 = out + ); + end component zpu_small1; + + component zpu_med1 is + generic( + word_size : natural := 32; -- 32 bits data path + d_care_val : std_logic := '0'; -- Fill value + clk_freq : positive := 50; -- 50 MHz clock + brate : positive := 115200; -- RS232 baudrate + addr_w : natural := 18; -- 18 bits address space=256 kB, 128 kB I/O + bram_w : natural := 15 -- 15 bits RAM space=32 kB + ); + port( + clk_i : in std_logic; -- CPU clock + rst_i : in std_logic; -- Reset + break_o : out std_logic; -- Break executed + dbg_o : out zpu_dbgo_t; -- Debug info + rs232_tx_o : out std_logic; -- UART Tx + rs232_rx_i : in std_logic; -- UART Rx + gpio_in : in std_logic_vector(31 downto 0); + gpio_out : out std_logic_vector(31 downto 0); + gpio_dir : out std_logic_vector(31 downto 0) -- 1 = in, 0 = out + ); + end component zpu_med1; + + + --------------------------- + -- signal declarations + signal dcm_i0_clk0 : std_ulogic; + signal dcm_i0_clkfx : std_ulogic; + signal clk_fb : std_ulogic; + signal clk : std_ulogic; + -- + signal reset_shift_reg : std_ulogic_vector(3 downto 0); + signal reset_sync : std_ulogic; + -- + signal zpu_i0_dbg : zpu_dbgo_t; -- Debug info + signal zpu_i0_break : std_logic; + -- + signal gpio_in : std_logic_vector(31 downto 0) := (others => '0'); + signal zpu_i0_gpio_out : std_logic_vector(31 downto 0); + signal zpu_i0_gpio_dir : std_logic_vector(31 downto 0); + + +begin + + -- default output drivers + -- to pass bitgen DRC + -- outputs used by design are commented + soft_tdo <= '1'; + -- + sram0_a <= (others => '1'); + sram0_d <= (others => 'Z'); + sram0_lb_n <= '1'; + sram0_ub_n <= '1'; + sram0_cs_n <= '1'; + sram0_we_n <= '1'; + sram0_oe_n <= '1'; + -- + sram1_a <= (others => '1'); + sram1_d <= (others => 'Z'); + sram1_lb_n <= '1'; + sram1_ub_n <= '1'; + sram1_cs_n <= '1'; + sram1_we_n <= '1'; + sram1_oe_n <= '1'; + -- + --rs232_tx <= '1'; + rs232_rts <= '1'; + -- + mouse_clk <= 'Z'; + mouse_data <= 'Z'; + kbd_clk <= 'Z'; + kbd_data <= 'Z'; + -- + vga_red <= (others => '1'); + vga_green <= (others => '1'); + vga_blue <= (others => '1'); + vga_hsync <= '1'; + vga_vsync <= '1'; + -- + audio_r <= '0'; + audio_l <= '0'; + -- + --led <= (others => '0'); + -- + --dig0_seg <= (others => '0'); + --dig1_seg <= (others => '0'); + dig2_seg <= (others => '0'); + dig3_seg <= (others => '0'); + dig4_seg <= (others => '0'); + dig5_seg <= (others => '0'); + -- + header_a <= (others => 'Z'); + header_b <= (others => 'Z'); + + + -- digital clock manager (DCM) + -- to generate higher/other system clock frequencys + dcm_i0 : dcm + generic map ( + startup_wait => true, -- wait with DONE till locked + clkfx_multiply => clk_multiply, + clkfx_divide => clk_divide, + clk_feedback => "1X" + ) + port map ( + clkin => clk_50, + clk0 => dcm_i0_clk0, + clkfx => dcm_i0_clkfx, + clkfb => clk_fb + ); + + clk_fb <= dcm_i0_clk0; + clk <= dcm_i0_clkfx; + + + -- reset synchronizer + -- generate synchronous reset + reset_synchronizer : process(clk, reset_n) + begin + if reset_n = '0' then + reset_shift_reg <= (others => '1'); + elsif rising_edge(clk) then + reset_shift_reg <= reset_shift_reg(reset_shift_reg'high-1 downto 0) & '0'; + end if; + end process; + reset_sync <= reset_shift_reg(reset_shift_reg'high); + + + -- select instance of zpu + zpu_i0_small : if zpu_flavour = zpu_small generate + zpu_i0 : zpu_small1 + generic map ( + addr_w => addr_w_c, + word_size => word_size_c, + clk_freq => clk_frequency * clk_multiply / clk_divide + ) + port map ( + clk_i => clk, -- : in std_logic; -- CPU clock + rst_i => reset_sync, -- : in std_logic; -- Reset + break_o => zpu_i0_break, -- : out std_logic; -- Break executed + dbg_o => zpu_i0_dbg, -- : out zpu_dbgo_t; -- Debug info + rs232_tx_o => rs232_tx, -- : out std_logic; -- UART Tx + rs232_rx_i => rs232_rx, -- : in std_logic -- UART Rx + gpio_in => gpio_in, -- : in std_logic_vector(31 downto 0); + gpio_out => zpu_i0_gpio_out, -- : out std_logic_vector(31 downto 0); + gpio_dir => zpu_i0_gpio_dir -- : out std_logic_vector(31 downto 0) -- 1 = in, 0 = out + ); + end generate zpu_i0_small; + + zpu_i0_medium : if zpu_flavour = zpu_medium generate + zpu_i0 : zpu_med1 + generic map ( + addr_w => addr_w_c, + word_size => word_size_c, + clk_freq => clk_frequency * clk_multiply / clk_divide + ) + port map ( + clk_i => clk, -- : in std_logic; -- CPU clock + rst_i => reset_sync, -- : in std_logic; -- Reset + break_o => zpu_i0_break, -- : out std_logic; -- Break executed + dbg_o => zpu_i0_dbg, -- : out zpu_dbgo_t; -- Debug info + rs232_tx_o => rs232_tx, -- : out std_logic; -- UART Tx + rs232_rx_i => rs232_rx, -- : in std_logic -- UART Rx + gpio_in => gpio_in, -- : in std_logic_vector(31 downto 0); + gpio_out => zpu_i0_gpio_out, -- : out std_logic_vector(31 downto 0); + gpio_dir => zpu_i0_gpio_dir -- : out std_logic_vector(31 downto 0) -- 1 = in, 0 = out + ); + end generate zpu_i0_medium; + + + -- pragma translate_off + stop_simulation <= zpu_i0_break; + + + trace_mod : trace + generic map ( + addr_w => addr_w_c, + word_size => word_size_c, + log_file => "zpu_trace.log" + ) + port map ( + clk_i => clk, + dbg_i => zpu_i0_dbg, + stop_i => zpu_i0_break, + busy_i => '0' + ); + -- pragma translate_on + + + -- assign GPIOs + -- + -- bit 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 + -- + -- in header_a(19.........12) -- -- -- -- -- -- -- -- + -- out header_a(19.........12) dig1_seg(7...........0) + -- + -- + -- bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 + -- + -- in switch_n(7...........0) -- -- button_n(5....0) + -- out dig0_seg(7...........0) led(7................0) + -- + + gpio_in(31 downto 24) <= header_a(19 downto 12); + gpio_in(15 downto 8) <= switch_n; + gpio_in( 5 downto 0) <= button_n; + + -- 3-state buffers for some headers + header_a(19) <= zpu_i0_gpio_out(31) when zpu_i0_gpio_dir(31) = '0' else 'Z'; + header_a(18) <= zpu_i0_gpio_out(30) when zpu_i0_gpio_dir(30) = '0' else 'Z'; + header_a(17) <= zpu_i0_gpio_out(29) when zpu_i0_gpio_dir(29) = '0' else 'Z'; + header_a(16) <= zpu_i0_gpio_out(28) when zpu_i0_gpio_dir(28) = '0' else 'Z'; + header_a(15) <= zpu_i0_gpio_out(27) when zpu_i0_gpio_dir(27) = '0' else 'Z'; + header_a(14) <= zpu_i0_gpio_out(26) when zpu_i0_gpio_dir(26) = '0' else 'Z'; + header_a(13) <= zpu_i0_gpio_out(25) when zpu_i0_gpio_dir(25) = '0' else 'Z'; + header_a(12) <= zpu_i0_gpio_out(24) when zpu_i0_gpio_dir(24) = '0' else 'Z'; + + -- outputs + dig1_seg <= zpu_i0_gpio_out(23 downto 16); + dig0_seg <= zpu_i0_gpio_out(15 downto 8); + + -- switch on all LEDs in case of break + process + begin + wait until rising_edge(clk); + led <= zpu_i0_gpio_out(7 downto 0); + if zpu_i0_break = '1' then + led <= (others => '1'); + end if; + end process; + + +end architecture rtl; + diff --git a/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/top_tb.vhd b/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/top_tb.vhd new file mode 100644 index 0000000..e42fc20 --- /dev/null +++ b/zpu/hdl/zealot/fpga/altium-livedesign-xc3s1000/top_tb.vhd @@ -0,0 +1,194 @@ +-- testbench for +-- Altium LiveDesign Board +-- +-- includes "model" for clock generation +-- simulate press on test/reset as reset +-- +-- place models for external components (SRAM, PS2) in this file +-- + + +library ieee; +use ieee.std_logic_1164.all; + + +entity top_tb is +end entity top_tb; + +architecture testbench of top_tb is + + --------------------------- + -- constant declarations + constant clk_period : time := 1 sec / 50_000_000; -- 50 MHz + + + --------------------------- + -- signal declarations + signal simulation_run : boolean := true; + signal tb_stop_simulation : std_logic; + -- + signal tb_clk : std_logic := '0'; + signal tb_reset_n : std_logic; + -- + -- soft JTAG + signal tb_soft_tdo : std_logic; + signal tb_soft_tms : std_logic := '1'; + signal tb_soft_tdi : std_logic := '1'; + signal tb_soft_tck : std_logic := '1'; + -- + -- SRAM 0 (256k x 16) pin connections + signal tb_sram0_a : std_logic_vector(18 downto 0); + signal tb_sram0_d : std_logic_vector(15 downto 0) := (others => 'Z'); + signal tb_sram0_lb_n : std_logic; + signal tb_sram0_ub_n : std_logic; + signal tb_sram0_cs_n : std_logic; -- chip select + signal tb_sram0_we_n : std_logic; -- write-enable + signal tb_sram0_oe_n : std_logic; -- output enable + -- + -- SRAM 1 (256k x 16) pin connections + signal tb_sram1_a : std_logic_vector(18 downto 0); + signal tb_sram1_d : std_logic_vector(15 downto 0) := (others => 'Z'); + signal tb_sram1_lb_n : std_logic; + signal tb_sram1_ub_n : std_logic; + signal tb_sram1_cs_n : std_logic; -- chip select + signal tb_sram1_we_n : std_logic; -- write-enable + signal tb_sram1_oe_n : std_logic; -- output enable + -- + -- RS232 + signal tb_rs232_rx : std_logic := '1'; + signal tb_rs232_tx : std_logic; + signal tb_rs232_cts : std_logic := '1'; + signal tb_rs232_rts : std_logic; + -- + -- PS2 connectors + signal tb_mouse_clk : std_logic := 'Z'; + signal tb_mouse_data : std_logic := 'Z'; + signal tb_kbd_clk : std_logic := 'Z'; + signal tb_kbd_data : std_logic := 'Z'; + -- + -- vga output + signal tb_vga_red : std_logic_vector(7 downto 5); + signal tb_vga_green : std_logic_vector(7 downto 5); + signal tb_vga_blue : std_logic_vector(7 downto 5); + signal tb_vga_hsync : std_logic; + signal tb_vga_vsync : std_logic; + -- + -- Audio out + signal tb_audio_r : std_logic; + signal tb_audio_l : std_logic; + -- + -- GPIOs + signal tb_switch_n : std_logic_vector(7 downto 0) := (others => '1'); + signal tb_button_n : std_logic_vector(5 downto 0) := (others => '1'); + signal tb_led : std_logic_vector(7 downto 0); + -- + -- seven segment display + signal tb_dig0_seg : std_logic_vector(7 downto 0); + signal tb_dig1_seg : std_logic_vector(7 downto 0); + signal tb_dig2_seg : std_logic_vector(7 downto 0); + signal tb_dig3_seg : std_logic_vector(7 downto 0); + signal tb_dig4_seg : std_logic_vector(7 downto 0); + signal tb_dig5_seg : std_logic_vector(7 downto 0); + -- + -- User Header A + signal tb_header_a : std_logic_vector(19 downto 2) := (others => 'Z'); + signal tb_header_b : std_logic_vector(19 downto 2) := (others => 'Z'); + +begin + + -- generate clock + tb_clk <= not tb_clk after clk_period / 2 when simulation_run; + + -- generate reset + tb_reset_n <= '0', '1' after 6.66 * clk_period; + + + -- simulate keypress + tb_button_n(2) <= '1', '0' after 50 us, '1' after 52 us; + + -- dut + top_i0 : entity work.top + port map ( + stop_simulation => tb_stop_simulation, -- : out std_logic; + -- + clk_50 => tb_clk, -- : in std_logic; + reset_n => tb_reset_n, -- : in std_logic; + -- + -- soft JTAG + soft_tdo => tb_soft_tdo, -- : out std_logic; + soft_tms => tb_soft_tms, -- : in std_logic; + soft_tdi => tb_soft_tdi, -- : in std_logic; + soft_tck => tb_soft_tck, -- : in std_logic; + -- + -- SRAM 0 (256k x 16) pin connections + sram0_a => tb_sram0_a, -- : out std_logic_vector(18 downto 0); + sram0_d => tb_sram0_d, -- : inout std_logic_vector(15 downto 0); + sram0_lb_n => tb_sram0_lb_n, -- : out std_logic; + sram0_ub_n => tb_sram0_ub_n, -- : out std_logic; + sram0_cs_n => tb_sram0_cs_n, -- : out std_logic; -- chip select + sram0_we_n => tb_sram0_we_n, -- : out std_logic; -- write-enable + sram0_oe_n => tb_sram0_oe_n, -- : out std_logic; -- output enable + -- + -- SRAM 1 (256k x 16) pin connections + sram1_a => tb_sram1_a, -- : out std_logic_vector(18 downto 0); + sram1_d => tb_sram1_d, -- : inout std_logic_vector(15 downto 0); + sram1_lb_n => tb_sram1_lb_n, -- : out std_logic; + sram1_ub_n => tb_sram1_ub_n, -- : out std_logic; + sram1_cs_n => tb_sram1_cs_n, -- : out std_logic; -- chip select + sram1_we_n => tb_sram1_we_n, -- : out std_logic; -- write-enable + sram1_oe_n => tb_sram1_oe_n, -- : out std_logic; -- output enable + -- + -- RS232 + rs232_rx => tb_rs232_rx, -- : in std_logic; + rs232_tx => tb_rs232_tx, -- : out std_logic; + rs232_cts => tb_rs232_cts, -- : in std_logic; + rs232_rts => tb_rs232_rts, -- : out std_logic; + -- + -- PS2 connectors + mouse_clk => tb_mouse_clk, -- : inout std_logic; + mouse_data => tb_mouse_data, -- : inout std_logic; + kbd_clk => tb_kbd_clk, -- : inout std_logic; + kbd_data => tb_kbd_data, -- : inout std_logic; + -- + -- vga output + vga_red => tb_vga_red, -- : out std_logic_vector(7 downto 5); + vga_green => tb_vga_green, -- : out std_logic_vector(7 downto 5); + vga_blue => tb_vga_blue, -- : out std_logic_vector(7 downto 5); + vga_hsync => tb_vga_hsync, -- : out std_logic; + vga_vsync => tb_vga_vsync, -- : out std_logic; + -- + -- Audio out + audio_r => tb_audio_r, -- : out std_logic; + audio_l => tb_audio_l, -- : out std_logic; + -- + -- GPIOs + switch_n => tb_switch_n, -- : in std_logic_vector(7 downto 0); + button_n => tb_button_n, -- : in std_logic_vector(5 downto 0); + led => tb_led, -- : out std_logic_vector(7 downto 0); + -- + -- seven segment display + dig0_seg => tb_dig0_seg, -- : out std_logic_vector(7 downto 0); + dig1_seg => tb_dig1_seg, -- : out std_logic_vector(7 downto 0); + dig2_seg => tb_dig2_seg, -- : out std_logic_vector(7 downto 0); + dig3_seg => tb_dig3_seg, -- : out std_logic_vector(7 downto 0); + dig4_seg => tb_dig4_seg, -- : out std_logic_vector(7 downto 0); + dig5_seg => tb_dig5_seg, -- : out std_logic_vector(7 downto 0); + -- + -- User Header + header_a => tb_header_a, -- : inout std_logic_vector(19 downto 2); + header_b => tb_header_b -- : inout std_logic_vector(19 downto 2) + ); + + + -- check for simulation stopping + process (tb_stop_simulation) + begin + if tb_stop_simulation = '1' then + report "Simulation end." severity note; + simulation_run <= false; + end if; + end process; + + +end architecture testbench; + diff --git a/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/clean_up.sh b/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/clean_up.sh new file mode 100755 index 0000000..3855f16 --- /dev/null +++ b/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/clean_up.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +# ise build stuff +rm -rf build +rm -f top.bit + +# modelsim compile stuff +rm -rf work +rm -rf zpu + +# modelsim simulation stuff +rm -f vsim.wlf +rm -f transcript +rm -f zpu_trace.log +rm -f zpu_med1_io.log +rm -f zpu_small1_io.log diff --git a/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/simulation.sh b/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/simulation.sh new file mode 100755 index 0000000..d525737 --- /dev/null +++ b/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/simulation.sh @@ -0,0 +1,49 @@ +#!/bin/sh + +# need project files: +# run.do +# wave.do + +# need ModelSim tools: +# vlib +# vcom +# vsim + + +echo "###############" +echo "compile zpu lib" +echo "###############" +vlib zpu +vcom -work zpu ../../roms/hello_dbram.vhdl +vcom -work zpu ../../roms/hello_bram.vhdl +#vcom -work zpu ../../roms/dmips_dbram.vhdl +#vcom -work zpu ../../roms/dmips_bram.vhdl + +vcom -work zpu ../../roms/rom_pkg.vhdl +vcom -work zpu ../../zpu_pkg.vhdl +vcom -work zpu ../../zpu_small.vhdl +vcom -work zpu ../../zpu_medium.vhdl +vcom -work zpu ../../helpers/zpu_small1.vhdl +vcom -work zpu ../../helpers/zpu_med1.vhdl +vcom -work zpu ../../devices/txt_util.vhdl +vcom -work zpu ../../devices/phi_io.vhdl +vcom -work zpu ../../devices/timer.vhdl +vcom -work zpu ../../devices/gpio.vhdl +vcom -work zpu ../../devices/rx_unit.vhdl +vcom -work zpu ../../devices/tx_unit.vhdl +vcom -work zpu ../../devices/br_gen.vhdl +vcom -work zpu ../../devices/trace.vhdl + + +echo "################" +echo "compile work lib" +echo "################" +vlib work +vcom top.vhd +vcom top_tb.vhd + + +echo "###################" +echo "start simulator gui" +echo "###################" +vsim -gui top_tb -do simulation_config/run.do diff --git a/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/simulation_config/run.do b/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/simulation_config/run.do new file mode 100644 index 0000000..acc1710 --- /dev/null +++ b/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/simulation_config/run.do @@ -0,0 +1,2 @@ +do wave.do +run -all diff --git a/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/simulation_config/wave.do b/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/simulation_config/wave.do new file mode 100644 index 0000000..d572a06 --- /dev/null +++ b/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/simulation_config/wave.do @@ -0,0 +1,30 @@ +onerror {resume}
+quietly WaveActivateNextPane {} 0
+add wave -noupdate /top_tb/tb_gpio_button(0)
+add wave -noupdate /top_tb/tb_clk_100MHz
+add wave -noupdate -divider <NULL>
+add wave -noupdate /top_tb/tb_rs232_rx
+add wave -noupdate /top_tb/tb_rs232_tx
+add wave -noupdate /top_tb/tb_rs232_rts
+add wave -noupdate /top_tb/tb_rs232_cts
+add wave -noupdate -divider Buttons
+add wave -noupdate /top_tb/tb_gpio_button
+add wave -noupdate -divider LEDs
+add wave -noupdate /top_tb/tb_gpio_led_n
+TreeUpdate [SetDefaultTree]
+WaveRestoreCursors {{Cursor 1} {0 ps} 0}
+configure wave -namecolwidth 150
+configure wave -valuecolwidth 100
+configure wave -justifyvalue left
+configure wave -signalnamewidth 2
+configure wave -snapdistance 10
+configure wave -datasetprefix 0
+configure wave -rowmargin 4
+configure wave -childrowmargin 2
+configure wave -gridoffset 0
+configure wave -gridperiod 1
+configure wave -griddelta 40
+configure wave -timeline 0
+configure wave -timelineunits ns
+update
+WaveRestoreZoom {0 ps} {126912555 ps}
diff --git a/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/synthesis.sh b/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/synthesis.sh new file mode 100755 index 0000000..d8d7603 --- /dev/null +++ b/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/synthesis.sh @@ -0,0 +1,36 @@ +#!/bin/sh + +# need project files: +# top.xst +# top.prj +# top.ut + +# need Xilinx tools: +# xst +# ngdbuild +# map +# par +# trce +# bitgen + +echo "########################" +echo "generate build directory" +echo "########################" +mkdir build +cd build +mkdir tmp + +echo "###############" +echo "start processes" +echo "###############" +xst -ifn "../synthesis_config/top.xst" -ofn "top.syr" +ngdbuild -dd _ngo -nt timestamp -uc ../synthesis_config/avnet-eval-xc5vfx30t.ucf -p xc5vfx30t-ff665-1 top.ngc top.ngd +map -p xc5vfx30t-ff665-1 -w -logic_opt off -ol high -t 1 -register_duplication off -global_opt off -mt off -cm area -ir off -pr off -lc off -power off -o top_map.ncd top.ngd top.pcf +par -w -ol high -mt off top_map.ncd top.ncd top.pcf +trce -v 3 -s 1 -n 3 -fastpaths -xml top.twx top.ncd -o top.twr top.pcf +bitgen -f ../synthesis_config/top.ut top.ncd + +echo "###########" +echo "get bitfile" +echo "###########" +cp top.bit .. diff --git a/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/synthesis_config/avnet-eval-xc5vfx30t.ucf b/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/synthesis_config/avnet-eval-xc5vfx30t.ucf new file mode 100644 index 0000000..8494af3 --- /dev/null +++ b/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/synthesis_config/avnet-eval-xc5vfx30t.ucf @@ -0,0 +1,482 @@ +############################################################ +# Avnet Virtex 5 FX Evaluation Board constraints file +# +# Familiy: Virtex5 +# Device: XC5VFX30T +# Package: FF665 +# Speed: -1 +# +# +# Bank 0 3.3V +# Bank 1 3.3V +# Bank 2 3.3V +# Bank 3 3.3V +# Bank 4 2.5V or 3.3V (JP2, VIO_EXP1_DP), here 2.5V +# Bank 11 1.8V +# Bank 12 3.3V +# Bank 13 1.8V +# Bank 15 3.3V +# Bank 16 2.5V or 3.3V (JP3, VIO_EXP1_SE), here 2.5V +# Bank 17 1.8V +# Bank 18 2.5V or 3.3V (JP2, VIO_EXP1_DP), here 2.5V + + +############################################################ +## clock/timing constraints +############################################################ + +TIMESPEC "TS_clk_100" = PERIOD "clk_100" 100 MHz; + + +############################################################ +## design placement constraints +############################################################ +# +# the following constraint are need if you want to synthesize +# zpu_medium with 125 MHz +# +INST "zpu_i0_medium.zpu_i0/zpu/*" AREA_GROUP = "zpu_block"; +AREA_GROUP "zpu_block" RANGE=SLICE_X18Y0:SLICE_X55Y41; +AREA_GROUP "zpu_block" RANGE=DSP48_X0Y0:DSP48_X0Y15; +AREA_GROUP "zpu_block" RANGE=RAMB36_X1Y0:RAMB36_X3Y7; + + +############################################################ +## pin placement constraints +############################################################ + +NET "clk_100MHz" LOC= E18 | IOSTANDARD = LVCMOS33 | TNM_NET = "clk_100"; +NET "clk_socket" LOC= E13 | IOSTANDARD = LVCMOS33; +NET "user_clk_p" LOC= AB15 ; +NET "user_clk_n" LOC= AC16 ; + +# RS232 +NET "RS232_RX" LOC= K8 | IOSTANDARD = LVCMOS33; +NET "RS232_TX" LOC= L8 | IOSTANDARD = LVCMOS33; +NET "RS232_RTS" LOC= N8 | IOSTANDARD = LVCMOS33; # Jumper J3 +NET "RS232_CTS" LOC= R8 | IOSTANDARD = LVCMOS33; # Jumper J4 + +# RS232_USB +NET "RS232_USB_RX" LOC= AA10 | IOSTANDARD = LVCMOS33; +NET "RS232_USB_TX" LOC= AA19 | IOSTANDARD = LVCMOS33; +NET "RS232_USB_reset_n" LOC= Y20 | IOSTANDARD = LVCMOS33; + +# GPIO LEDs, active low +NET "GPIO_LED_n<0>" LOC= AF22 | IOSTANDARD = LVCMOS18 | PULLUP; +NET "GPIO_LED_n<1>" LOC= AF23 | IOSTANDARD = LVCMOS18 | PULLUP; +NET "GPIO_LED_n<2>" LOC= AF25 | IOSTANDARD = LVCMOS18 | PULLUP; +NET "GPIO_LED_n<3>" LOC= AE25 | IOSTANDARD = LVCMOS18 | PULLUP; +NET "GPIO_LED_n<4>" LOC= AD25 | IOSTANDARD = LVCMOS18 | PULLUP; +NET "GPIO_LED_n<5>" LOC= AE26 | IOSTANDARD = LVCMOS18 | PULLUP; +NET "GPIO_LED_n<6>" LOC= AD26 | IOSTANDARD = LVCMOS18 | PULLUP; +NET "GPIO_LED_n<7>" LOC= AC26 | IOSTANDARD = LVCMOS18 | PULLUP; + +# GPIO DIP_Switches +NET "GPIO_DIPswitch<0>" LOC= AD13 | IOSTANDARD = LVCMOS18; +NET "GPIO_DIPswitch<1>" LOC= AE13 | IOSTANDARD = LVCMOS18; +NET "GPIO_DIPswitch<2>" LOC= AF13 | IOSTANDARD = LVCMOS18; +NET "GPIO_DIPswitch<3>" LOC= AD15 | IOSTANDARD = LVCMOS18; +NET "GPIO_DIPswitch<4>" LOC= AD14 | IOSTANDARD = LVCMOS18; +NET "GPIO_DIPswitch<5>" LOC= AF14 | IOSTANDARD = LVCMOS18; +NET "GPIO_DIPswitch<6>" LOC= AE15 | IOSTANDARD = LVCMOS18; +NET "GPIO_DIPswitch<7>" LOC= AF15 | IOSTANDARD = LVCMOS18; + +# Push Buttons +NET "GPIO_button<0>" LOC= AF20 | IOSTANDARD = LVCMOS18 | PULLUP; #PB1 +NET "GPIO_button<1>" LOC= AE20 | IOSTANDARD = LVCMOS18 | PULLUP; #PB2 +NET "GPIO_button<2>" LOC= AD19 | IOSTANDARD = LVCMOS18 | PULLUP; #PB3 +NET "GPIO_button<3>" LOC= AD20 | IOSTANDARD = LVCMOS18 | PULLUP; #PB4 + +# FLASH_8Mx16 +NET "FLASH_A<31>" LOC= Y11 | IOSTANDARD = LVCMOS33; +NET "FLASH_A<30>" LOC= H9 | IOSTANDARD = LVCMOS33; +NET "FLASH_A<29>" LOC= G10 | IOSTANDARD = LVCMOS33; +NET "FLASH_A<28>" LOC= H21 | IOSTANDARD = LVCMOS33; +NET "FLASH_A<27>" LOC= G20 | IOSTANDARD = LVCMOS33; +NET "FLASH_A<26>" LOC= H11 | IOSTANDARD = LVCMOS33; +NET "FLASH_A<25>" LOC= G11 | IOSTANDARD = LVCMOS33; +NET "FLASH_A<24>" LOC= H19 | IOSTANDARD = LVCMOS33; +NET "FLASH_A<23>" LOC= H18 | IOSTANDARD = LVCMOS33; +NET "FLASH_A<22>" LOC= G12 | IOSTANDARD = LVCMOS33; +NET "FLASH_A<21>" LOC= F13 | IOSTANDARD = LVCMOS33; +NET "FLASH_A<20>" LOC= G19 | IOSTANDARD = LVCMOS33; +NET "FLASH_A<19>" LOC= F18 | IOSTANDARD = LVCMOS33; +NET "FLASH_A<18>" LOC= F14 | IOSTANDARD = LVCMOS33; +NET "FLASH_A<17>" LOC= F15 | IOSTANDARD = LVCMOS33; +NET "FLASH_A<16>" LOC= F17 | IOSTANDARD = LVCMOS33; +NET "FLASH_A<15>" LOC= G17 | IOSTANDARD = LVCMOS33; +NET "FLASH_A<14>" LOC= G14 | IOSTANDARD = LVCMOS33; +NET "FLASH_A<13>" LOC= H13 | IOSTANDARD = LVCMOS33; +NET "FLASH_A<12>" LOC= G16 | IOSTANDARD = LVCMOS33; +NET "FLASH_A<11>" LOC= G15 | IOSTANDARD = LVCMOS33; +NET "FLASH_A<10>" LOC= Y18 | IOSTANDARD = LVCMOS33; +NET "FLASH_A<9>" LOC= AA18 | IOSTANDARD = LVCMOS33; +NET "FLASH_A<8>" LOC= Y10 | IOSTANDARD = LVCMOS33; +NET "FLASH_A<7>" LOC= W11 | IOSTANDARD = LVCMOS33; +NET "FLASH_DQ<0>" LOC= AA15 | IOSTANDARD = LVCMOS33; +NET "FLASH_DQ<1>" LOC= Y15 | IOSTANDARD = LVCMOS33; +NET "FLASH_DQ<2>" LOC= W14 | IOSTANDARD = LVCMOS33; +NET "FLASH_DQ<3>" LOC= Y13 | IOSTANDARD = LVCMOS33; +NET "FLASH_DQ<4>" LOC= W16 | IOSTANDARD = LVCMOS33; +NET "FLASH_DQ<5>" LOC= Y16 | IOSTANDARD = LVCMOS33; +NET "FLASH_DQ<6>" LOC= AA14 | IOSTANDARD = LVCMOS33; +NET "FLASH_DQ<7>" LOC= AA13 | IOSTANDARD = LVCMOS33; +NET "FLASH_DQ<8>" LOC= AB12 | IOSTANDARD = LVCMOS25; # with level shifter +NET "FLASH_DQ<9>" LOC= AC11 | IOSTANDARD = LVCMOS25; # with level shifter +NET "FLASH_DQ<10>" LOC= AB20 | IOSTANDARD = LVCMOS25; # with level shifter +NET "FLASH_DQ<11>" LOC= AB21 | IOSTANDARD = LVCMOS25; # with level shifter +NET "FLASH_DQ<12>" LOC= AB11 | IOSTANDARD = LVCMOS25; # with level shifter +NET "FLASH_DQ<13>" LOC= AB10 | IOSTANDARD = LVCMOS25; # with level shifter +NET "FLASH_DQ<14>" LOC= AA20 | IOSTANDARD = LVCMOS25; # with level shifter +NET "FLASH_DQ<15>" LOC= Y21 | IOSTANDARD = LVCMOS25; # with level shifter +NET "FLASH_WEN" LOC= AA17 | IOSTANDARD = LVCMOS33; +NET "FLASH_OEN<0>" LOC= AA12 | IOSTANDARD = LVCMOS33; +NET "FLASH_CEN<0>" LOC= Y12 | IOSTANDARD = LVCMOS33; +NET "FLASH_rp_n" LOC= D13 | IOSTANDARD = LVCMOS33; +NET "FLASH_byte_n" LOC= Y17 | IOSTANDARD = LVCMOS33; +NET "FLASH_adv_n" LOC= F19 | IOSTANDARD = LVCMOS33; +NET "FLASH_clk" LOC= E12 | IOSTANDARD = LVCMOS33; +NET "FLASH_wait" LOC= D16 | IOSTANDARD = LVCMOS33; + +# DDR2_SDRAM_16Mx32 +NET "DDR2_ODT<0>" LOC= AF24 | IOSTANDARD = SSTL18_II; +NET "DDR2_A<0>" LOC= U25 | IOSTANDARD = SSTL18_II; +NET "DDR2_A<1>" LOC= T25 | IOSTANDARD = SSTL18_II; +NET "DDR2_A<2>" LOC= T24 | IOSTANDARD = SSTL18_II; +NET "DDR2_A<3>" LOC= T23 | IOSTANDARD = SSTL18_II; +NET "DDR2_A<4>" LOC= U24 | IOSTANDARD = SSTL18_II; +NET "DDR2_A<5>" LOC= V24 | IOSTANDARD = SSTL18_II; +NET "DDR2_A<6>" LOC= Y23 | IOSTANDARD = SSTL18_II; +NET "DDR2_A<7>" LOC= W23 | IOSTANDARD = SSTL18_II; +NET "DDR2_A<8>" LOC= AA25 | IOSTANDARD = SSTL18_II; +NET "DDR2_A<9>" LOC= AB26 | IOSTANDARD = SSTL18_II; +NET "DDR2_A<10>" LOC= AB25 | IOSTANDARD = SSTL18_II; +NET "DDR2_A<11>" LOC= AB24 | IOSTANDARD = SSTL18_II; +NET "DDR2_A<12>" LOC= AA23 | IOSTANDARD = SSTL18_II; +NET "DDR2_BA<0>" LOC= U21 | IOSTANDARD = SSTL18_II; +NET "DDR2_BA<1>" LOC= V22 | IOSTANDARD = SSTL18_II; +NET "DDR2_CAS_N" LOC= W24 | IOSTANDARD = SSTL18_II; +NET "DDR2_CKE" LOC= T22 | IOSTANDARD = SSTL18_II; +NET "DDR2_CS_N" LOC= AD24 | IOSTANDARD = SSTL18_II; +NET "DDR2_RAS_N" LOC= Y22 | IOSTANDARD = SSTL18_II; +NET "DDR2_WE_N" LOC= AA22 | IOSTANDARD = SSTL18_II; +NET "DDR2_DM<0>" LOC= U26 | IOSTANDARD = SSTL18_II; +NET "DDR2_DM<1>" LOC= N24 | IOSTANDARD = SSTL18_II; +NET "DDR2_DM<2>" LOC= M24 | IOSTANDARD = SSTL18_II; +NET "DDR2_DM<3>" LOC= M25 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQS_P<0>" LOC= W26 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQS_P<1>" LOC= L23 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQS_P<2>" LOC= K22 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQS_P<3>" LOC= J21 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQS_N<0>" LOC= W25 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQS_N<1>" LOC= L22 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQS_N<2>" LOC= K23 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQS_N<3>" LOC= K21 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<0>" LOC= R22 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<1>" LOC= R23 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<2>" LOC= P23 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<3>" LOC= P24 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<4>" LOC= R25 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<5>" LOC= P25 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<6>" LOC= R26 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<7>" LOC= P26 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<8>" LOC= M26 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<9>" LOC= N26 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<10>" LOC= K25 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<11>" LOC= L24 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<12>" LOC= K26 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<13>" LOC= J26 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<14>" LOC= J25 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<15>" LOC= N21 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<16>" LOC= M21 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<17>" LOC= J23 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<18>" LOC= H23 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<19>" LOC= H22 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<20>" LOC= G22 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<21>" LOC= F22 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<22>" LOC= F23 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<23>" LOC= E23 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<24>" LOC= G24 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<25>" LOC= F24 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<26>" LOC= G25 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<27>" LOC= H26 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<28>" LOC= G26 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<29>" LOC= F25 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<30>" LOC= E25 | IOSTANDARD = SSTL18_II; +NET "DDR2_DQ<31>" LOC= E26 | IOSTANDARD = SSTL18_II; +NET "DDR2_CK_p<0>" LOC= V21 | IOSTANDARD = DIFF_SSTL18_II; +NET "DDR2_CK_p<1>" LOC= N22 | IOSTANDARD = DIFF_SSTL18_II; +NET "DDR2_CK_n<0>" LOC= W21 | IOSTANDARD = DIFF_SSTL18_II; +NET "DDR2_CK_n<1>" LOC= M22 | IOSTANDARD = DIFF_SSTL18_II; + +# Ethernet MAC +NET "GMII_txer" LOC= A22 | IOSTANDARD = LVCMOS33; +NET "GMII_tx_clk" LOC= E17 | IOSTANDARD = LVCMOS33 | PERIOD=40000 ps; +NET "GMII_rx_clk" LOC= E20 | IOSTANDARD = LVCMOS33 | PERIOD=40000 ps; +NET "GMII_gtc_clk" LOC= A19 | IOSTANDARD = LVCMOS33; +NET "GMII_crs" LOC= A25 | IOSTANDARD = LVCMOS33 | IOBDELAY=NONE; +NET "GMII_dv" LOC= C21 | IOSTANDARD = LVCMOS33 | IOBDELAY=NONE; +NET "GMII_rx_data<0>" LOC= D24 | IOSTANDARD = LVCMOS33 | IOBDELAY=NONE; +NET "GMII_rx_data<1>" LOC= D23 | IOSTANDARD = LVCMOS33 | IOBDELAY=NONE; +NET "GMII_rx_data<2>" LOC= D21 | IOSTANDARD = LVCMOS33 | IOBDELAY=NONE; +NET "GMII_rx_data<3>" LOC= C26 | IOSTANDARD = LVCMOS33 | IOBDELAY=NONE; +NET "GMII_rx_data<4>" LOC= D20 | IOSTANDARD = LVCMOS33 | IOBDELAY=NONE; +NET "GMII_rx_data<5>" LOC= C23 | IOSTANDARD = LVCMOS33 | IOBDELAY=NONE; +NET "GMII_rx_data<6>" LOC= B25 | IOSTANDARD = LVCMOS33 | IOBDELAY=NONE; +NET "GMII_rx_data<7>" LOC= C22 | IOSTANDARD = LVCMOS33 | IOBDELAY=NONE; +NET "GMII_col" LOC= A24 | IOSTANDARD = LVCMOS33 | IOBDELAY=NONE; +NET "GMII_rx_er" LOC= B24 | IOSTANDARD = LVCMOS33 | IOBDELAY=NONE; +NET "GMII_tx_en" LOC= A23 | IOSTANDARD = LVCMOS33; +NET "GMII_tx_data<0>" LOC= D19 | IOSTANDARD = LVCMOS33; +NET "GMII_tx_data<1>" LOC= C19 | IOSTANDARD = LVCMOS33; +NET "GMII_tx_data<2>" LOC= A20 | IOSTANDARD = LVCMOS33; +NET "GMII_tx_data<3>" LOC= B20 | IOSTANDARD = LVCMOS33; +NET "GMII_tx_data<4>" LOC= B19 | IOSTANDARD = LVCMOS33; +NET "GMII_tx_data<5>" LOC= A15 | IOSTANDARD = LVCMOS33; +NET "GMII_tx_data<6>" LOC= B22 | IOSTANDARD = LVCMOS33; +NET "GMII_tx_data<7>" LOC= B21 | IOSTANDARD = LVCMOS33; +NET "GBE_rst_n" LOC= B26 | IOSTANDARD = LVCMOS33; +NET "GBE_mdc" LOC= D26 | IOSTANDARD = LVCMOS33; +NET "GBE_mdio" LOC= D25 | IOSTANDARD = LVCMOS33; +NET "GBE_int_n" LOC= C24 | IOSTANDARD = LVCMOS33; +NET "GBE_mclk" LOC= F20 | IOSTANDARD = LVCMOS33; + +# SysACE CompactFlash +NET "SAM_CLK" LOC= F12 | IOSTANDARD = LVCMOS33; +NET "SAM_A<0>" LOC= Y5 | IOSTANDARD = LVCMOS33; +NET "SAM_A<1>" LOC= V7 | IOSTANDARD = LVCMOS33; +NET "SAM_A<2>" LOC= W6 | IOSTANDARD = LVCMOS33; +NET "SAM_A<3>" LOC= W5 | IOSTANDARD = LVCMOS33; +NET "SAM_A<4>" LOC= K6 | IOSTANDARD = LVCMOS33; +NET "SAM_A<5>" LOC= J5 | IOSTANDARD = LVCMOS33; +NET "SAM_A<6>" LOC= J6 | IOSTANDARD = LVCMOS33; +NET "SAM_D<0>" LOC= F5 | IOSTANDARD = LVCMOS33; +NET "SAM_D<1>" LOC= U7 | IOSTANDARD = LVCMOS33; +NET "SAM_D<2>" LOC= V6 | IOSTANDARD = LVCMOS33; +NET "SAM_D<3>" LOC= U5 | IOSTANDARD = LVCMOS33; +NET "SAM_D<4>" LOC= U6 | IOSTANDARD = LVCMOS33; +NET "SAM_D<5>" LOC= T5 | IOSTANDARD = LVCMOS33; +NET "SAM_D<6>" LOC= T7 | IOSTANDARD = LVCMOS33; +NET "SAM_D<7>" LOC= R6 | IOSTANDARD = LVCMOS33; +NET "SAM_D<8>" LOC= R7 | IOSTANDARD = LVCMOS33; +NET "SAM_D<9>" LOC= R5 | IOSTANDARD = LVCMOS33; +NET "SAM_D<10>" LOC= P6 | IOSTANDARD = LVCMOS33; +NET "SAM_D<11>" LOC= P8 | IOSTANDARD = LVCMOS33; +NET "SAM_D<12>" LOC= N6 | IOSTANDARD = LVCMOS33; +NET "SAM_D<13>" LOC= M7 | IOSTANDARD = LVCMOS33; +NET "SAM_D<14>" LOC= K5 | IOSTANDARD = LVCMOS33; +NET "SAM_D<15>" LOC= L7 | IOSTANDARD = LVCMOS33; +NET "SAM_CEN" LOC= G4 | IOSTANDARD = LVCMOS33; +NET "SAM_OEN" LOC= Y6 | IOSTANDARD = LVCMOS33; +NET "SAM_WEN" LOC= Y4 | IOSTANDARD = LVCMOS33; +NET "SAM_MPIRQ" LOC= H4 | IOSTANDARD = LVCMOS33; +NET "SAM_BRDY" LOC= G5 | IOSTANDARD = LVCMOS33; +NET "SAM_RESET_n" LOC= H6 | IOSTANDARD = LVCMOS33; + +# Expansion Header +NET "EXP1_SE_IO<0>" LOC= A8 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<1>" LOC= A12 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<2>" LOC= B10 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<3>" LOC= A10 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<4>" LOC= B9 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<5>" LOC= A9 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<6>" LOC= A5 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<7>" LOC= B11 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<8>" LOC= B6 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<9>" LOC= A7 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<10>" LOC= D8 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<11>" LOC= C9 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<12>" LOC= B7 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<13>" LOC= A4 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<14>" LOC= B5 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<15>" LOC= C8 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<16>" LOC= C7 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<17>" LOC= A3 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<18>" LOC= C6 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<19>" LOC= B4 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<20>" LOC= D6 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<21>" LOC= D9 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<22>" LOC= E8 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<23>" LOC= D5 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<24>" LOC= F7 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<25>" LOC= E7 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<26>" LOC= E5 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<27>" LOC= E6 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<28>" LOC= F8 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<29>" LOC= H7 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<30>" LOC= G7 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<31>" LOC= H8 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<32>" LOC= G9 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_IO<33>" LOC= J8 | IOSTANDARD = LVCMOS25; +NET "EXP1_DIFF_P<0>" LOC= AF9 ; +NET "EXP1_DIFF_N<0>" LOC= AF10 ; +NET "EXP1_DIFF_P<1>" LOC= AF12 ; +NET "EXP1_DIFF_N<1>" LOC= AE12 ; +NET "EXP1_DIFF_P<2>" LOC= AF7 ; +NET "EXP1_DIFF_N<2>" LOC= AF8 ; +NET "EXP1_DIFF_P<3>" LOC= AE11 ; +NET "EXP1_DIFF_N<3>" LOC= AD11 ; +NET "EXP1_DIFF_P<4>" LOC= AF4 ; +NET "EXP1_DIFF_N<4>" LOC= AF3 ; +NET "EXP1_DIFF_P<5>" LOC= AD10 ; +NET "EXP1_DIFF_N<5>" LOC= AE10 ; +NET "EXP1_DIFF_P<6>" LOC= AE8 ; +NET "EXP1_DIFF_N<6>" LOC= AE7 ; +NET "EXP1_DIFF_P<7>" LOC= AC8 ; +NET "EXP1_DIFF_N<7>" LOC= AD8 ; +NET "EXP1_DIFF_P<8>" LOC= AD9 ; +NET "EXP1_DIFF_N<8>" LOC= AC9 ; +NET "EXP1_DIFF_P<9>" LOC= AE6 ; +NET "EXP1_DIFF_N<9>" LOC= AF5 ; +NET "EXP1_DIFF_P<10>" LOC= AB6 ; +NET "EXP1_DIFF_N<10>" LOC= AB7 ; +NET "EXP1_DIFF_P<11>" LOC= AC6 ; +NET "EXP1_DIFF_N<11>" LOC= AD5 ; +NET "EXP1_DIFF_P<12>" LOC= AD6 ; +NET "EXP1_DIFF_N<12>" LOC= AC7 ; +NET "EXP1_DIFF_P<13>" LOC= AE5 ; +NET "EXP1_DIFF_N<13>" LOC= AD4 ; +NET "EXP1_DIFF_P<14>" LOC= AB9 ; +NET "EXP1_DIFF_N<14>" LOC= AA9 ; +NET "EXP1_DIFF_P<15>" LOC= AC12 ; +NET "EXP1_DIFF_N<15>" LOC= AC13 ; +NET "EXP1_DIFF_P<16>" LOC= AA7 ; +NET "EXP1_DIFF_N<16>" LOC= AA8 ; +NET "EXP1_DIFF_P<17>" LOC= AA5 ; +NET "EXP1_DIFF_N<17>" LOC= AB5 ; +NET "EXP1_DIFF_P<18>" LOC= AB19 ; +NET "EXP1_DIFF_N<18>" LOC= AC19 ; +NET "EXP1_DIFF_P<19>" LOC= Y7 ; +NET "EXP1_DIFF_N<19>" LOC= Y8 ; +NET "EXP1_DIFF_P<20>" LOC= W9 ; +NET "EXP1_DIFF_N<20>" LOC= W8 ; +NET "EXP1_DIFF_P<21>" LOC= V8 ; +NET "EXP1_DIFF_N<21>" LOC= V9 ; +NET "EXP1_SE_CLK_OUT" LOC= B12 | IOSTANDARD = LVCMOS25; +NET "EXP1_SE_CLK_IN" LOC= E10 | IOSTANDARD = LVCMOS33; +NET "EXP1_DIFF_CLK_OUT_P" LOC= AC18 ; +NET "EXP1_DIFF_CLK_OUT_N" LOC= AB17 ; +NET "EXP1_DIFF_CLK_IN_P" LOC= AB14 ; +NET "EXP1_DIFF_CLK_IN_N" LOC= AC14 ; +#NET "EXP1_RCLK_DIFF_P" LOC= AB6 ; +#NET "EXP1_RCLK_DIFF_N" LOC= AB7 ; + +# CPU Debug Trace +NET "ATDD<8>" LOC= C16 | IOSTANDARD = LVCMOS33; +NET "ATDD<9>" LOC= A17 | IOSTANDARD = LVCMOS33; +NET "ATDD<10>" LOC= B15 | IOSTANDARD = LVCMOS33; +NET "ATDD<11>" LOC= E15 | IOSTANDARD = LVCMOS33; +NET "ATDD<12>" LOC= A14 | IOSTANDARD = LVCMOS33; +NET "ATDD<13>" LOC= D18 | IOSTANDARD = LVCMOS33; +NET "ATDD<14>" LOC= A13 | IOSTANDARD = LVCMOS33; +NET "ATDD<15>" LOC= C13 | IOSTANDARD = LVCMOS33; +NET "ATDD<16>" LOC= D14 | IOSTANDARD = LVCMOS33; +NET "ATDD<17>" LOC= C17 | IOSTANDARD = LVCMOS33; +NET "ATDD<18>" LOC= E16 | IOSTANDARD = LVCMOS33; +NET "ATDD<19>" LOC= C14 | IOSTANDARD = LVCMOS33; +NET "TRACE_TS10" LOC= B16 | IOSTANDARD = LVCMOS33; +NET "TRACE_TS20" LOC= E21 | IOSTANDARD = LVCMOS33; +NET "TRACE_TS1E" LOC= B14 | IOSTANDARD = LVCMOS33; +NET "TRACE_TS2E" LOC= B17 | IOSTANDARD = LVCMOS33; +NET "TRACE_TS3" LOC= C18 | IOSTANDARD = LVCMOS33; +NET "TRACE_TS4" LOC= G21 | IOSTANDARD = LVCMOS33; +NET "TRACE_TS5" LOC= A18 | IOSTANDARD = LVCMOS33; +NET "TRACE_TS6" LOC= F10 | IOSTANDARD = LVCMOS33; +NET "TRACE_CLK" LOC= D15 | IOSTANDARD = LVCMOS33; +NET "CPU_HRESET" LOC= E11 | IOSTANDARD = LVCMOS33; +NET "CPU_TDO" LOC= K7 | IOSTANDARD = LVCMOS33; +NET "CPU_TMS" LOC= L5 | IOSTANDARD = LVCMOS33; +NET "CPU_TDI" LOC= M6 | IOSTANDARD = LVCMOS33; +NET "CPU_TRST" LOC= N7 | IOSTANDARD = LVCMOS33; +NET "CPU_TCK" LOC= T8 | IOSTANDARD = LVCMOS33; +NET "CPU_HALT_n" LOC= W4 | IOSTANDARD = LVCMOS33; + + +# voltage termination +CONFIG PROHIBIT = AA24; +CONFIG PROHIBIT = AE23; +CONFIG PROHIBIT = AF17; +CONFIG PROHIBIT = V26; +CONFIG PROHIBIT = E22; +CONFIG PROHIBIT = L25; + +# unused pins +CONFIG PROHIBIT = F9; +CONFIG PROHIBIT = D10; +CONFIG PROHIBIT = C12; +CONFIG PROHIBIT = C11; +CONFIG PROHIBIT = D11; +CONFIG PROHIBIT = AB16; +CONFIG PROHIBIT = AB22; +CONFIG PROHIBIT = AC17; +CONFIG PROHIBIT = AC21; +CONFIG PROHIBIT = AE22; +CONFIG PROHIBIT = AD23; +CONFIG PROHIBIT = AC24; +CONFIG PROHIBIT = AC23; +CONFIG PROHIBIT = AC22; +CONFIG PROHIBIT = AB22; +CONFIG PROHIBIT = AE21; +CONFIG PROHIBIT = AD21; +CONFIG PROHIBIT = AF19; +CONFIG PROHIBIT = AF18; +CONFIG PROHIBIT = AE18; +CONFIG PROHIBIT = AD18; +CONFIG PROHIBIT = AE17; +CONFIG PROHIBIT = AE16; +CONFIG PROHIBIT = AD16; +CONFIG PROHIBIT = G6; +CONFIG PROHIBIT = H24; +CONFIG PROHIBIT = J24; +CONFIG PROHIBIT = N23; +CONFIG PROHIBIT = N15; +CONFIG PROHIBIT = P14; +CONFIG PROHIBIT = V23; +CONFIG PROHIBIT = Y26; +CONFIG PROHIBIT = Y25; +CONFIG PROHIBIT = P21; +CONFIG PROHIBIT = R21; +CONFIG PROHIBIT = U22; + +# grounded pins from gigabit transcievers +CONFIG PROHIBIT = K4; +CONFIG PROHIBIT = K3; +CONFIG PROHIBIT = J1; +CONFIG PROHIBIT = K1; +CONFIG PROHIBIT = M1; +CONFIG PROHIBIT = L1; +CONFIG PROHIBIT = T3; +CONFIG PROHIBIT = T4; +CONFIG PROHIBIT = R1; +CONFIG PROHIBIT = T1; +CONFIG PROHIBIT = V1; +CONFIG PROHIBIT = U1; +CONFIG PROHIBIT = D3; +CONFIG PROHIBIT = D4; +CONFIG PROHIBIT = C1; +CONFIG PROHIBIT = D1; +CONFIG PROHIBIT = E1; +CONFIG PROHIBIT = F1; +CONFIG PROHIBIT = AB3; +CONFIG PROHIBIT = AB4; +CONFIG PROHIBIT = AA1; +CONFIG PROHIBIT = AB1; +CONFIG PROHIBIT = AC1; +CONFIG PROHIBIT = AD1; +CONFIG PROHIBIT = H2; +CONFIG PROHIBIT = J2; +CONFIG PROHIBIT = N2; +CONFIG PROHIBIT = M2; +CONFIG PROHIBIT = P2; +CONFIG PROHIBIT = R2; +CONFIG PROHIBIT = V2; +CONFIG PROHIBIT = W2; +CONFIG PROHIBIT = B2; +CONFIG PROHIBIT = C2; +CONFIG PROHIBIT = G2; +CONFIG PROHIBIT = F2; +CONFIG PROHIBIT = Y2; +CONFIG PROHIBIT = AA2; +CONFIG PROHIBIT = AD2; +CONFIG PROHIBIT = AE2; + diff --git a/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/synthesis_config/top.prj b/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/synthesis_config/top.prj new file mode 100644 index 0000000..24120d5 --- /dev/null +++ b/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/synthesis_config/top.prj @@ -0,0 +1,19 @@ +vhdl work ../top.vhd +vhdl zpu ../../../zpu_pkg.vhdl +vhdl zpu ../../../zpu_small.vhdl +vhdl zpu ../../../zpu_medium.vhdl +vhdl zpu ../../../roms/rom_pkg.vhdl +#vhdl zpu ../../../roms/hello_dbram.vhdl +#vhdl zpu ../../../roms/hello_bram.vhdl +vhdl zpu ../../../roms/dmips_dbram.vhdl +vhdl zpu ../../../roms/dmips_bram.vhdl +vhdl zpu ../../../helpers/zpu_small1.vhdl +vhdl zpu ../../../helpers/zpu_med1.vhdl +vhdl zpu ../../../devices/txt_util.vhdl +vhdl zpu ../../../devices/phi_io.vhdl +vhdl zpu ../../../devices/timer.vhdl +vhdl zpu ../../../devices/gpio.vhdl +vhdl zpu ../../../devices/rx_unit.vhdl +vhdl zpu ../../../devices/tx_unit.vhdl +vhdl zpu ../../../devices/br_gen.vhdl +vhdl zpu ../../../devices/trace.vhdl diff --git a/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/synthesis_config/top.ut b/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/synthesis_config/top.ut new file mode 100644 index 0000000..e0159fb --- /dev/null +++ b/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/synthesis_config/top.ut @@ -0,0 +1,39 @@ +-w +-g DebugBitstream:No +-g Binary:no +-g CRC:Enable +-g ConfigRate:2 +-g CclkPin:PullUp +-g M0Pin:PullUp +-g M1Pin:PullUp +-g M2Pin:PullUp +-g ProgPin:PullUp +-g DonePin:PullUp +-g InitPin:Pullup +-g CsPin:Pullup +-g DinPin:Pullup +-g BusyPin:Pullup +-g RdWrPin:Pullup +-g HswapenPin:PullUp +-g TckPin:PullUp +-g TdiPin:PullUp +-g TdoPin:PullUp +-g TmsPin:PullUp +-g UnusedPin:PullDown +-g UserID:0xFFFFFFFF +-g ConfigFallback:Enable +-g SelectMAPAbort:Enable +-g BPI_page_size:1 +-g OverTempPowerDown:Disable +-g JTAG_SysMon:Enable +-g DCIUpdateMode:AsRequired +-g StartUpClk:CClk +-g DONE_cycle:4 +-g GTS_cycle:5 +-g GWE_cycle:6 +-g LCK_cycle:NoWait +-g Match_cycle:Auto +-g Security:None +-g DonePipe:No +-g DriveDone:No +-g Encrypt:No diff --git a/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/synthesis_config/top.xst b/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/synthesis_config/top.xst new file mode 100644 index 0000000..7ca54bc --- /dev/null +++ b/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/synthesis_config/top.xst @@ -0,0 +1,60 @@ +set -tmpdir "tmp" +set -xsthdpdir "xst" +run +-ifn ../synthesis_config/top.prj +-ifmt mixed +-ofn top +-ofmt NGC +-p xc5vfx30t-1-ff665 +-top top +-opt_mode Speed +-opt_level 1 +-power NO +-iuc NO +-keep_hierarchy No +-netlist_hierarchy As_Optimized +-rtlview Yes +-glob_opt AllClockNets +-read_cores YES +-write_timing_constraints NO +-cross_clock_analysis NO +-hierarchy_separator / +-bus_delimiter <> +-case Maintain +-slice_utilization_ratio 100 +-bram_utilization_ratio 100 +-dsp_utilization_ratio 100 +-lc Off +-reduce_control_sets Off +-verilog2001 YES +-fsm_extract YES -fsm_encoding Auto +-safe_implementation No +-fsm_style LUT +-ram_extract Yes +-ram_style Auto +-rom_extract Yes +-mux_style Auto +-decoder_extract YES +-priority_extract Yes +-shreg_extract YES +-shift_extract YES +-xor_collapse YES +-rom_style Auto +-auto_bram_packing NO +-mux_extract Yes +-resource_sharing YES +-async_to_sync NO +-use_dsp48 Auto +-iobuf YES +-max_fanout 100000 +-bufg 32 +-register_duplication YES +-register_balancing No +-slice_packing YES +-optimize_primitives NO +-use_clock_enable Auto +-use_sync_set Auto +-use_sync_reset Auto +-iob Auto +-equivalent_register_removal YES +-slice_utilization_ratio_maxmargin 5 diff --git a/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/top.vhd b/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/top.vhd new file mode 100644 index 0000000..560e685 --- /dev/null +++ b/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/top.vhd @@ -0,0 +1,444 @@ +-- top module of +-- Avnet Virtex 5 FX Evaluation Board +-- +-- using following external connections: +-- pushbutton PB1 as reset +-- LEDs for output +-- RS232 (non USB) +-- + + +library ieee; +use ieee.std_logic_1164.all; + +library zpu; +use zpu.zpupkg.all; -- zpu_dbgo_t + +library unisim; +use unisim.vcomponents.ibufds; +use unisim.vcomponents.dcm_base; + + +entity top is + port ( + -- pragma translate_off + stop_simulation : out std_logic; + -- pragma translate_on + clk_100MHz : in std_logic; -- 100 MHz clock + clk_socket : in std_logic; -- user clock + user_clk_p : in std_logic; -- differential user clock + user_clk_n : in std_logic; -- differential user clock + -- + -- RS232 + rs232_rx : in std_logic; + rs232_tx : out std_logic; + rs232_rts : in std_logic; + rs232_cts : out std_logic; + -- RS232 USB + rs232_usb_rx : in std_logic; + rs232_usb_tx : out std_logic; + rs232_usb_reset_n : out std_logic; + -- + gpio_led_n : out std_logic_vector(7 downto 0); + gpio_dipswitch : in std_logic_vector(7 downto 0); + gpio_button : in std_logic_vector(3 downto 0); + -- + -- FLASH 8Mx16 + flash_a : out std_logic_vector(31 downto 7); + flash_dq : inout std_logic_vector(15 downto 0); + flash_wen : out std_logic; + flash_oen : out std_logic_vector(0 downto 0); + flash_cen : out std_logic_vector(0 downto 0); + flash_rp_n : out std_logic; + flash_byte_n : out std_logic; + flash_adv_n : out std_logic; + flash_clk : out std_logic; + flash_wait : in std_logic; + -- + -- DDR2 SDRAM 16Mx32 + ddr2_odt : in std_logic_vector(0 downto 0); + ddr2_a : out std_logic_vector(12 downto 0); + ddr2_ba : out std_logic_vector(1 downto 0); + ddr2_cas_n : out std_logic; + ddr2_cke : out std_logic; + ddr2_cs_n : out std_logic; + ddr2_ras_n : out std_logic; + ddr2_we_n : out std_logic; + ddr2_dm : out std_logic_vector(3 downto 0); + ddr2_dqs_p : inout std_logic_vector(3 downto 0); + ddr2_dqs_n : inout std_logic_vector(3 downto 0); + ddr2_dq : inout std_logic_vector(31 downto 0); + ddr2_ck_p : in std_logic_vector(1 downto 0); + ddr2_ck_n : in std_logic_vector(1 downto 0); + -- + -- Ethernet MAC + gmii_txer : out std_logic; + gmii_tx_clk : in std_logic; -- 25 MHz + gmii_rx_clk : in std_logic; -- 25 MHz + gmii_gtc_clk : out std_logic; + gmii_crs : in std_logic; + gmii_dv : in std_logic; + gmii_rx_data : in std_logic_vector(7 downto 0); + gmii_col : in std_logic; + gmii_rx_er : in std_logic; + gmii_tx_en : out std_logic; + gmii_tx_data : out std_logic_vector(7 downto 0); + gbe_rst_n : out std_logic; + gbe_mdc : out std_logic; + gbe_mdio : inout std_logic; + gbe_int_n : inout std_logic; + gbe_mclk : in std_logic; + -- + -- SysACE CompactFlash + sam_clk : in std_logic; + sam_a : out std_logic_vector(6 downto 0); + sam_d : inout std_logic_vector(15 downto 0); + sam_cen : out std_logic; + sam_oen : out std_logic; + sam_wen : out std_logic; + sam_mpirq : in std_logic; + sam_brdy : in std_logic; + sam_reset_n : out std_logic; + -- + -- Expansion Header + exp1_se_io : inout std_logic_vector(33 downto 0); + exp1_diff_p : inout std_logic_vector(21 downto 0); + exp1_diff_n : inout std_logic_vector(21 downto 0); + exp1_se_clk_out : out std_logic; + exp1_se_clk_in : in std_logic; + exp1_diff_clk_out_p : out std_logic; + exp1_diff_clk_out_n : out std_logic; + exp1_diff_clk_in_p : in std_logic; + exp1_diff_clk_in_n : in std_logic; + -- + -- Debug/Trace + atdd : inout std_logic_vector(19 downto 8); + trace_ts10 : inout std_logic; + trace_ts20 : inout std_logic; + trace_ts1e : inout std_logic; + trace_ts2e : inout std_logic; + trace_ts3 : inout std_logic; + trace_ts4 : inout std_logic; + trace_ts5 : inout std_logic; + trace_ts6 : inout std_logic; + trace_clk : in std_logic; + cpu_hreset : in std_logic; + cpu_tdo : out std_logic; + cpu_tms : in std_logic; + cpu_tdi : in std_logic; + cpu_trst : in std_logic; + cpu_tck : in std_logic; + cpu_halt_n : in std_logic + ); +end entity top; + + +architecture rtl of top is + + --------------------------- + -- type declarations + type zpu_type is (zpu_small, zpu_medium); + + --------------------------- + -- constant declarations + constant zpu_flavour : zpu_type := zpu_medium; -- choose your flavour HERE + -- modify frequency here + constant clk_multiply : positive := 5; -- 7 for small, 5 for medium + constant clk_divide : positive := 4; -- 4 for small, 4 for medium + -- + -- + constant word_size_c : natural := 32; -- 32 bits data path + constant addr_w_c : natural := 18; -- 18 bits address space=256 kB, 128 kB I/O + -- + constant clk_frequency : positive := 100; -- input frequency for correct calculation + + --------------------------- + -- component declarations + component zpu_small1 is + generic ( + word_size : natural := 32; -- 32 bits data path + d_care_val : std_logic := '0'; -- Fill value + clk_freq : positive := 50; -- 50 MHz clock + brate : positive := 115200; -- RS232 baudrate + addr_w : natural := 16; -- 16 bits address space=64 kB, 32 kB I/O + bram_w : natural := 15 -- 15 bits RAM space=32 kB + ); + port ( + clk_i : in std_logic; -- CPU clock + rst_i : in std_logic; -- Reset + break_o : out std_logic; -- Break executed + dbg_o : out zpu_dbgo_t; -- Debug info + rs232_tx_o : out std_logic; -- UART Tx + rs232_rx_i : in std_logic; -- UART Rx + gpio_in : in std_logic_vector(31 downto 0); + gpio_out : out std_logic_vector(31 downto 0); + gpio_dir : out std_logic_vector(31 downto 0) -- 1 = in, 0 = out + ); + end component zpu_small1; + + component zpu_med1 is + generic( + word_size : natural := 32; -- 32 bits data path + d_care_val : std_logic := '0'; -- Fill value + clk_freq : positive := 50; -- 50 MHz clock + brate : positive := 115200; -- RS232 baudrate + addr_w : natural := 18; -- 18 bits address space=256 kB, 128 kB I/O + bram_w : natural := 15 -- 15 bits RAM space=32 kB + ); + port( + clk_i : in std_logic; -- CPU clock + rst_i : in std_logic; -- Reset + break_o : out std_logic; -- Break executed + dbg_o : out zpu_dbgo_t; -- Debug info + rs232_tx_o : out std_logic; -- UART Tx + rs232_rx_i : in std_logic; -- UART Rx + gpio_in : in std_logic_vector(31 downto 0); + gpio_out : out std_logic_vector(31 downto 0); + gpio_dir : out std_logic_vector(31 downto 0) -- 1 = in, 0 = out + ); + end component zpu_med1; + + + + --------------------------- + -- signal declarations + signal sys_clk : std_ulogic; + signal dcm_base_i0_clk0 : std_ulogic; + signal dcm_base_i0_clkfx : std_ulogic; + signal clk_fb : std_ulogic; + signal clk : std_ulogic; + -- + signal reset_shift_reg : std_ulogic_vector(3 downto 0); + signal reset_sync : std_ulogic; + -- + signal zpu_i0_dbg : zpu_dbgo_t; -- Debug info + signal zpu_i0_break : std_logic; + -- + signal ibufds_i0_o : std_ulogic; + signal ibufds_i1_o : std_ulogic; + -- + signal gpio_in : std_logic_vector(31 downto 0) := (others => '0'); + signal zpu_i0_gpio_out : std_logic_vector(31 downto 0); + signal zpu_i0_gpio_dir : std_logic_vector(31 downto 0); + +begin + + -- default output drivers + -- to pass bitgen DRC + -- other used outputs are only commented + --rs232_tx <= '1'; + rs232_cts <= '1'; + rs232_usb_tx <= '1'; + rs232_usb_reset_n <= '1'; + -- + --gpio_led_n <= (others => '1'); + -- + flash_cen <= "1"; + flash_oen <= "1"; + flash_wen <= '1'; + flash_rp_n <= '1'; + flash_byte_n <= '1'; + flash_adv_n <= '1'; + flash_clk <= '0'; + flash_a <= (others => '0'); + flash_dq <= (others => 'Z'); + -- + ddr2_a <= (others => '0'); + ddr2_ba <= (others => '0'); + ddr2_dm <= (others => '0'); + ddr2_cs_n <= '1'; + ddr2_we_n <= '1'; + ddr2_cke <= '1'; + ddr2_cas_n <= '1'; + ddr2_ras_n <= '1'; + ddr2_dqs_p <= (others => 'Z'); + ddr2_dqs_n <= (others => 'Z'); + ddr2_dq <= (others => 'Z'); + -- + gmii_gtc_clk <= '0'; + gmii_tx_data <= (others => '0'); + gmii_tx_en <= '0'; + gmii_txer <= '0'; + gbe_rst_n <= '1'; + gbe_mdc <= '1'; + gbe_mdio <= 'Z'; + gbe_int_n <= 'Z'; + -- + sam_cen <= '1'; + sam_oen <= '1'; + sam_wen <= '1'; + sam_a <= (others => '0'); + sam_d <= (others => 'Z'); + sam_reset_n <= '1'; + -- + exp1_se_io <= (others => 'Z'); + exp1_diff_p <= (others => 'Z'); + exp1_diff_n <= (others => 'Z'); + exp1_se_clk_out <= '0'; + exp1_diff_clk_out_p <= '0'; + exp1_diff_clk_out_n <= '1'; + -- + atdd <= (others => 'Z'); + trace_ts10 <= 'Z'; + trace_ts20 <= 'Z'; + trace_ts1e <= 'Z'; + trace_ts2e <= 'Z'; + trace_ts3 <= 'Z'; + trace_ts4 <= 'Z'; + trace_ts5 <= 'Z'; + trace_ts6 <= 'Z'; + cpu_tdo <= '1'; + + + -- global differential input buffer + ibufds_i0 : ibufds + generic map ( + diff_term => true + ) + port map ( + o => ibufds_i0_o, + i => ddr2_ck_p(0), + ib => ddr2_ck_n(0) + ); + + -- global differential input buffer + ibufds_i1 : ibufds + generic map ( + diff_term => true + ) + port map ( + o => ibufds_i1_o, + i => ddr2_ck_p(1), + ib => ddr2_ck_n(1) + ); + + -- digital clock manager (DCM) + -- to generate higher/other system clock frequencys + dcm_base_i0: dcm_base + generic map ( + startup_wait => true, -- wait with DONE till locked + --dfs_frequency_mode => "HIGH", -- use this with zpu_small for 175 MHz + clkfx_multiply => clk_multiply, + clkfx_divide => clk_divide, + clk_feedback => "1X" + ) + port map ( + rst => '0', + clkin => clk_100MHz, + clk0 => dcm_base_i0_clk0, + clkfx => dcm_base_i0_clkfx, + clkfb => clk_fb + ); + + -- speaking names for dcm output + clk_fb <= dcm_base_i0_clk0; + clk <= dcm_base_i0_clkfx; + + + -- reset synchronizer + -- generate synchronous reset + reset_synchronizer : process(clk, gpio_button) + begin + if (gpio_button(0) = '1') then + reset_shift_reg <= (others => '1'); + elsif rising_edge(clk) then + reset_shift_reg <= reset_shift_reg(reset_shift_reg'high-1 downto 0) & '0'; + end if; + end process; + reset_sync <= reset_shift_reg(reset_shift_reg'high); + + + + -- select instance of zpu + zpu_i0_small: if zpu_flavour = zpu_small generate + zpu_i0 : zpu_small1 + generic map ( + addr_w => addr_w_c, + word_size => word_size_c, + clk_freq => clk_frequency * clk_multiply / clk_divide + ) + port map ( + clk_i => clk, -- : in std_logic; - CPU clock + rst_i => reset_sync, -- : in std_logic; - Reset + break_o => zpu_i0_break, -- : out std_logic; - Break executed + dbg_o => zpu_i0_dbg, -- : out zpu_dbgo_t; - Debug info + rs232_tx_o => rs232_tx, -- : out std_logic; - UART Tx + rs232_rx_i => rs232_rx, -- : in std_logic - UART Rx + gpio_in => gpio_in, -- : in std_logic_vector(31 downto 0); + gpio_out => zpu_i0_gpio_out, -- : out std_logic_vector(31 downto 0); + gpio_dir => zpu_i0_gpio_dir -- : out std_logic_vector(31 downto 0) -- 1 = in, 0 = out + ); + end generate zpu_i0_small; + + zpu_i0_medium: if zpu_flavour = zpu_medium generate + zpu_i0 : zpu_med1 + generic map ( + addr_w => addr_w_c, + word_size => word_size_c, + clk_freq => clk_frequency * clk_multiply / clk_divide + ) + port map ( + clk_i => clk, -- : in std_logic; - CPU clock + rst_i => reset_sync, -- : in std_logic; - Reset + break_o => zpu_i0_break, -- : out std_logic; - Break executed + dbg_o => zpu_i0_dbg, -- : out zpu_dbgo_t; - Debug info + rs232_tx_o => rs232_tx, -- : out std_logic; - UART Tx + rs232_rx_i => rs232_rx, -- : in std_logic - UART Rx + gpio_in => gpio_in, -- : in std_logic_vector(31 downto 0); + gpio_out => zpu_i0_gpio_out, -- : out std_logic_vector(31 downto 0); + gpio_dir => zpu_i0_gpio_dir -- : out std_logic_vector(31 downto 0) -- 1 = in, 0 = out + ); + end generate zpu_i0_medium; + + -- pragma translate_off + stop_simulation <= zpu_i0_break; -- abort() causes to stop the simulation + + + trace_mod : trace + generic map ( + addr_w => addr_w_c, + word_size => word_size_c, + log_file => "zpu_trace.log" + ) + port map ( + clk_i => clk, + dbg_i => zpu_i0_dbg, + stop_i => zpu_i0_break, + busy_i => '0' + ); + -- pragma translate_on + + -- assign GPIOs + -- no bidirectional pins (e.g. headers), so + -- gpio_dir is unused + -- + -- bit 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 + -- + -- in -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + -- out -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + -- + -- + -- bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 + -- + -- in gpio_dipswitch(7.....0) -- -- -- -- buttons3.0 + -- out -- -- -- -- -- -- -- -- led(7................0) + -- + + gpio_in(15 downto 8) <= gpio_dipswitch; + gpio_in( 3 downto 0) <= gpio_button; + + + -- switch on all LEDs in case of break + process + begin + wait until rising_edge(clk); + gpio_led_n <= not zpu_i0_gpio_out(7 downto 0); + if zpu_i0_break = '1' then + gpio_led_n <= (others => '0'); + end if; + end process; + + + +end architecture rtl; + diff --git a/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/top_tb.vhd b/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/top_tb.vhd new file mode 100644 index 0000000..751ce22 --- /dev/null +++ b/zpu/hdl/zealot/fpga/avnet-eval-xc5vfx30t/top_tb.vhd @@ -0,0 +1,271 @@ +-- testbench for +-- Avnet Virtex 5 FX Evaluation Board +-- +-- includes "model" for clock generation +-- simulate press on gpio_button(0) (=PB1) as reset +-- +-- place models for external components (PHY, DDR2-RAM) in this file +-- + + +library ieee; +use ieee.std_logic_1164.all; + + +entity top_tb is +end entity top_tb; + +architecture testbench of top_tb is + + --------------------------- + -- constant declarations + constant clk_100MHz_period : time := 1 sec / 100_000_000; -- 100 MHz + + + --------------------------- + -- signal declarations + signal simulation_run : boolean := true; + signal tb_stop_simulation : std_logic; + -- + signal tb_clk_100MHz : std_logic := '0'; -- 100 MHz clock + signal tb_clk_socket : std_logic := '0'; -- user clock + signal tb_user_clk_p : std_logic := '0'; -- diff user clock + signal tb_user_clk_n : std_logic := '0'; -- diff user clock + -- + -- RS232 + signal tb_rs232_rx : std_logic := '0'; + signal tb_rs232_tx : std_logic; + signal tb_rs232_rts : std_logic := '0'; + signal tb_rs232_cts : std_logic; + -- RS232 USB + signal tb_rs232_usb_rx : std_logic := '0'; + signal tb_rs232_usb_tx : std_logic; + signal tb_rs232_usb_reset_n : std_logic; + -- + signal tb_gpio_led_n : std_logic_vector(7 downto 0); + signal tb_gpio_dipswitch : std_logic_vector(7 downto 0) := (others => '0'); + signal tb_gpio_button : std_logic_vector(3 downto 0) := (others => '0'); + -- + -- FLASH 8Mx16 + signal tb_flash_a : std_logic_vector(31 downto 7); + signal tb_flash_dq : std_logic_vector(15 downto 0); + signal tb_flash_wen : std_logic; + signal tb_flash_oen : std_logic_vector(0 downto 0); + signal tb_flash_cen : std_logic_vector(0 downto 0); + signal tb_flash_rp_n : std_logic; + signal tb_flash_byte_n : std_logic; + signal tb_flash_adv_n : std_logic; + signal tb_flash_clk : std_logic; + signal tb_flash_wait : std_logic := '0'; + -- + -- DDR2 SDRAM 16Mx32 + signal tb_ddr2_odt : std_logic_vector(0 downto 0) := (others => '0'); + signal tb_ddr2_a : std_logic_vector(12 downto 0); + signal tb_ddr2_ba : std_logic_vector(1 downto 0); + signal tb_ddr2_cas_n : std_logic; + signal tb_ddr2_cke : std_logic; + signal tb_ddr2_cs_n : std_logic; + signal tb_ddr2_ras_n : std_logic; + signal tb_ddr2_we_n : std_logic; + signal tb_ddr2_dm : std_logic_vector(3 downto 0); + signal tb_ddr2_dqs_p : std_logic_vector(3 downto 0); + signal tb_ddr2_dqs_n : std_logic_vector(3 downto 0); + signal tb_ddr2_dq : std_logic_vector(31 downto 0); + signal tb_ddr2_ck_p : std_logic_vector(1 downto 0) := (others => '0'); + signal tb_ddr2_ck_n : std_logic_vector(1 downto 0) := (others => '0'); + -- + -- Ethernet MAC + signal tb_gmii_txer : std_logic; + signal tb_gmii_tx_clk : std_logic := '0'; -- 25 MHz + signal tb_gmii_rx_clk : std_logic := '0'; -- 25 MHz + signal tb_gmii_gtc_clk : std_logic; + signal tb_gmii_crs : std_logic := '0'; + signal tb_gmii_dv : std_logic := '0'; + signal tb_gmii_rx_data : std_logic_vector(7 downto 0); + signal tb_gmii_col : std_logic := '0'; + signal tb_gmii_rx_er : std_logic := '0'; + signal tb_gmii_tx_en : std_logic; + signal tb_gmii_tx_data : std_logic_vector(7 downto 0); + signal tb_gbe_rst_n : std_logic; + signal tb_gbe_mdc : std_logic; + signal tb_gbe_mdio : std_logic; + signal tb_gbe_int_n : std_logic; + signal tb_gbe_mclk : std_logic := '0'; + -- + -- SysACE CompactFlash + signal tb_sam_clk : std_logic := '0'; + signal tb_sam_a : std_logic_vector(6 downto 0); + signal tb_sam_d : std_logic_vector(15 downto 0); + signal tb_sam_cen : std_logic; + signal tb_sam_oen : std_logic; + signal tb_sam_wen : std_logic; + signal tb_sam_mpirq : std_logic := '0'; + signal tb_sam_brdy : std_logic := '0'; + signal tb_sam_reset_n : std_logic; + -- + -- Expansion Header + signal tb_exp1_se_io : std_logic_vector(33 downto 0); + signal tb_exp1_diff_p : std_logic_vector(21 downto 0); + signal tb_exp1_diff_n : std_logic_vector(21 downto 0); + signal tb_exp1_se_clk_out : std_logic; + signal tb_exp1_se_clk_in : std_logic := '0'; + signal tb_exp1_diff_clk_out_p : std_logic; + signal tb_exp1_diff_clk_out_n : std_logic; + signal tb_exp1_diff_clk_in_p : std_logic := '0'; + signal tb_exp1_diff_clk_in_n : std_logic := '0'; + -- + -- Debug/Trace + signal tb_atdd : std_logic_vector(19 downto 8); + signal tb_trace_ts10 : std_logic; + signal tb_trace_ts20 : std_logic; + signal tb_trace_ts1e : std_logic; + signal tb_trace_ts2e : std_logic; + signal tb_trace_ts3 : std_logic; + signal tb_trace_ts4 : std_logic; + signal tb_trace_ts5 : std_logic; + signal tb_trace_ts6 : std_logic; + signal tb_trace_clk : std_logic := '0'; + signal tb_cpu_hreset : std_logic := '0'; + signal tb_cpu_tdo : std_logic; + signal tb_cpu_tms : std_logic := '0'; + signal tb_cpu_tdi : std_logic := '0'; + signal tb_cpu_trst : std_logic := '0'; + signal tb_cpu_tck : std_logic := '0'; + signal tb_cpu_halt_n : std_logic := '0'; + + +begin + + + -- generate clocks + tb_clk_100MHz <= not tb_clk_100MHz after clk_100MHz_period / 2 when simulation_run; + + -- generate reset + tb_gpio_button(0) <= '1', '0' after 6.66 * clk_100MHz_period; + + + -- simulate keypress + tb_gpio_button(2) <= '0', '1' after 55 us, '0' after 56 us; + + -- dut + top_i0 : entity work.top + port map ( + stop_simulation => tb_stop_simulation, -- : out std_logic; + clk_100MHz => tb_clk_100MHz, -- : in std_logic; + clk_socket => tb_clk_socket, -- : in std_logic; + user_clk_p => tb_user_clk_p, -- : in std_logic; + user_clk_n => tb_user_clk_n, -- : in std_logic; + -- + -- RS232 + rs232_rx => tb_rs232_rx, -- : in std_logic; + rs232_tx => tb_rs232_tx, -- : out std_logic; + rs232_rts => tb_rs232_rts, -- : in std_logic; + rs232_cts => tb_rs232_cts, -- : out std_logic; + -- RS232 USB + rs232_usb_rx => tb_rs232_usb_rx, -- : in std_logic; + rs232_usb_tx => tb_rs232_usb_tx, -- : out std_logic; + rs232_usb_reset_n => tb_rs232_usb_reset_n, -- : out std_logic; + -- + gpio_led_n => tb_gpio_led_n, -- : out std_logic_vector(7 downto 0); + gpio_dipswitch => tb_gpio_dipswitch, -- : in std_logic_vector(7 downto 0); + gpio_button => tb_gpio_button, -- : in std_logic_vector(3 downto 0); + -- + -- FLASH 8Mx16 + flash_a => tb_flash_a, -- : out std_logic_vector(31 downto 7); + flash_dq => tb_flash_dq, -- : inout std_logic_vector(15 downto 0); + flash_wen => tb_flash_wen, -- : out std_logic; + flash_oen => tb_flash_oen, -- : out std_logic_vector(0 downto 0); + flash_cen => tb_flash_cen, -- : out std_logic_vector(0 downto 0); + flash_rp_n => tb_flash_rp_n, -- : out std_logic; + flash_byte_n => tb_flash_byte_n, -- : out std_logic; + flash_adv_n => tb_flash_adv_n, -- : out std_logic; + flash_clk => tb_flash_clk, -- : out std_logic; + flash_wait => tb_flash_wait, -- : in std_logic; + -- + -- DDR2 SDRAM 16Mx32 + ddr2_odt => tb_ddr2_odt, -- : in std_logic_vector(0 downto 0); + ddr2_a => tb_ddr2_a, -- : out std_logic_vector(12 downto 0); + ddr2_ba => tb_ddr2_ba, -- : out std_logic_vector(1 downto 0); + ddr2_cas_n => tb_ddr2_cas_n, -- : out std_logic; + ddr2_cke => tb_ddr2_cke, -- : out std_logic; + ddr2_cs_n => tb_ddr2_cs_n, -- : out std_logic; + ddr2_ras_n => tb_ddr2_ras_n, -- : out std_logic; + ddr2_we_n => tb_ddr2_we_n, -- : out std_logic; + ddr2_dm => tb_ddr2_dm, -- : out std_logic_vector(3 downto 0); + ddr2_dqs_p => tb_ddr2_dqs_p, -- : inout std_logic_vector(3 downto 0); + ddr2_dqs_n => tb_ddr2_dqs_n, -- : inout std_logic_vector(3 downto 0); + ddr2_dq => tb_ddr2_dq, -- : inout std_logic_vector(31 downto 0); + ddr2_ck_p => tb_ddr2_ck_p, -- : in std_logic_vector(1 downto 0); + ddr2_ck_n => tb_ddr2_ck_n, -- : in std_logic_vector(1 downto 0); + -- + -- Ethernet MAC + gmii_txer => tb_gmii_txer, -- : out std_logic; + gmii_tx_clk => tb_gmii_tx_clk, -- : in std_logic; + gmii_rx_clk => tb_gmii_rx_clk, -- : in std_logic; + gmii_gtc_clk => tb_gmii_gtc_clk, -- : out std_logic; + gmii_crs => tb_gmii_crs, -- : in std_logic; + gmii_dv => tb_gmii_dv, -- : in std_logic; + gmii_rx_data => tb_gmii_rx_data, -- : in std_logic_vector(7 downto 0); + gmii_col => tb_gmii_col, -- : in std_logic; + gmii_rx_er => tb_gmii_rx_er, -- : in std_logic; + gmii_tx_en => tb_gmii_tx_en, -- : out std_logic; + gmii_tx_data => tb_gmii_tx_data, -- : out std_logic_vector(7 downto 0); + gbe_rst_n => tb_gbe_rst_n, -- : out std_logic; + gbe_mdc => tb_gbe_mdc, -- : out std_logic; + gbe_mdio => tb_gbe_mdio, -- : inout std_logic; + gbe_int_n => tb_gbe_int_n, -- : inout std_logic; + gbe_mclk => tb_gbe_mclk, -- : in std_logic; + -- + -- SysACE CompactFlash + sam_clk => tb_sam_clk, -- : in std_logic; + sam_a => tb_sam_a, -- : out std_logic_vector(6 downto 0); + sam_d => tb_sam_d, -- : inout std_logic_vector(15 downto 0); + sam_cen => tb_sam_cen, -- : out std_logic; + sam_oen => tb_sam_oen, -- : out std_logic; + sam_wen => tb_sam_wen, -- : out std_logic; + sam_mpirq => tb_sam_mpirq, -- : in std_logic; + sam_brdy => tb_sam_brdy, -- : in std_logic; + sam_reset_n => tb_sam_reset_n, -- : out std_logic; + -- + -- Expansion Header + exp1_se_io => tb_exp1_se_io, -- : inout std_logic_vector(33 downto 0); + exp1_diff_p => tb_exp1_diff_p, -- : inout std_logic_vector(21 downto 0); + exp1_diff_n => tb_exp1_diff_n, -- : inout std_logic_vector(21 downto 0); + exp1_se_clk_out => tb_exp1_se_clk_out, -- : out std_logic; + exp1_se_clk_in => tb_exp1_se_clk_in, -- : in std_logic; + exp1_diff_clk_out_p => tb_exp1_diff_clk_out_p, -- : out std_logic; + exp1_diff_clk_out_n => tb_exp1_diff_clk_out_n, -- : out std_logic; + exp1_diff_clk_in_p => tb_exp1_diff_clk_in_p, -- : in std_logic; + exp1_diff_clk_in_n => tb_exp1_diff_clk_in_n, -- : in std_logic; + -- + -- Debug/Trace + atdd => tb_atdd, -- : inout std_logic_vector(19 downto 8); + trace_ts10 => tb_trace_ts10, -- : inout std_logic; + trace_ts20 => tb_trace_ts20, -- : inout std_logic; + trace_ts1e => tb_trace_ts1e, -- : inout std_logic; + trace_ts2e => tb_trace_ts2e, -- : inout std_logic; + trace_ts3 => tb_trace_ts3, -- : inout std_logic; + trace_ts4 => tb_trace_ts4, -- : inout std_logic; + trace_ts5 => tb_trace_ts5, -- : inout std_logic; + trace_ts6 => tb_trace_ts6, -- : inout std_logic; + trace_clk => tb_trace_clk, -- : in std_logic; + cpu_hreset => tb_cpu_hreset, -- : in std_logic; + cpu_tdo => tb_cpu_tdo, -- : out std_logic; + cpu_tms => tb_cpu_tms, -- : in std_logic; + cpu_tdi => tb_cpu_tdi, -- : in std_logic; + cpu_trst => tb_cpu_trst, -- : in std_logic; + cpu_tck => tb_cpu_tck, -- : in std_logic; + cpu_halt_n => tb_cpu_halt_n -- : in std_logic + ); + + + -- check for simulation stopping + process (tb_stop_simulation) + begin + if tb_stop_simulation = '1' then + report "Simulation end." severity note; + simulation_run <= false; + end if; + end process; + +end architecture testbench; diff --git a/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/clean_up.sh b/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/clean_up.sh new file mode 100755 index 0000000..3855f16 --- /dev/null +++ b/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/clean_up.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +# ise build stuff +rm -rf build +rm -f top.bit + +# modelsim compile stuff +rm -rf work +rm -rf zpu + +# modelsim simulation stuff +rm -f vsim.wlf +rm -f transcript +rm -f zpu_trace.log +rm -f zpu_med1_io.log +rm -f zpu_small1_io.log diff --git a/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/simulation.sh b/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/simulation.sh new file mode 100755 index 0000000..d525737 --- /dev/null +++ b/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/simulation.sh @@ -0,0 +1,49 @@ +#!/bin/sh + +# need project files: +# run.do +# wave.do + +# need ModelSim tools: +# vlib +# vcom +# vsim + + +echo "###############" +echo "compile zpu lib" +echo "###############" +vlib zpu +vcom -work zpu ../../roms/hello_dbram.vhdl +vcom -work zpu ../../roms/hello_bram.vhdl +#vcom -work zpu ../../roms/dmips_dbram.vhdl +#vcom -work zpu ../../roms/dmips_bram.vhdl + +vcom -work zpu ../../roms/rom_pkg.vhdl +vcom -work zpu ../../zpu_pkg.vhdl +vcom -work zpu ../../zpu_small.vhdl +vcom -work zpu ../../zpu_medium.vhdl +vcom -work zpu ../../helpers/zpu_small1.vhdl +vcom -work zpu ../../helpers/zpu_med1.vhdl +vcom -work zpu ../../devices/txt_util.vhdl +vcom -work zpu ../../devices/phi_io.vhdl +vcom -work zpu ../../devices/timer.vhdl +vcom -work zpu ../../devices/gpio.vhdl +vcom -work zpu ../../devices/rx_unit.vhdl +vcom -work zpu ../../devices/tx_unit.vhdl +vcom -work zpu ../../devices/br_gen.vhdl +vcom -work zpu ../../devices/trace.vhdl + + +echo "################" +echo "compile work lib" +echo "################" +vlib work +vcom top.vhd +vcom top_tb.vhd + + +echo "###################" +echo "start simulator gui" +echo "###################" +vsim -gui top_tb -do simulation_config/run.do diff --git a/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/simulation_config/run.do b/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/simulation_config/run.do new file mode 100644 index 0000000..0d29e0a --- /dev/null +++ b/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/simulation_config/run.do @@ -0,0 +1,2 @@ +do wave.do
+run -all
diff --git a/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/simulation_config/wave.do b/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/simulation_config/wave.do new file mode 100644 index 0000000..12582ce --- /dev/null +++ b/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/simulation_config/wave.do @@ -0,0 +1,30 @@ +onerror {resume}
+quietly WaveActivateNextPane {} 0
+add wave -noupdate /top_tb/tb_rot_center
+add wave -noupdate /top_tb/tb_clk_50mhz
+add wave -noupdate /top_tb/tb_rs232_dce_rxd
+add wave -noupdate /top_tb/tb_rs232_dce_txd
+add wave -noupdate -divider Buttons
+add wave -noupdate /top_tb/tb_btn_east
+add wave -noupdate /top_tb/tb_btn_north
+add wave -noupdate /top_tb/tb_btn_south
+add wave -noupdate /top_tb/tb_btn_west
+add wave -noupdate -divider LEDs
+add wave -noupdate /top_tb/top_i0/led
+TreeUpdate [SetDefaultTree]
+WaveRestoreCursors {{Cursor 1} {56714893 ps} 0}
+configure wave -namecolwidth 150
+configure wave -valuecolwidth 100
+configure wave -justifyvalue left
+configure wave -signalnamewidth 2
+configure wave -snapdistance 10
+configure wave -datasetprefix 0
+configure wave -rowmargin 4
+configure wave -childrowmargin 2
+configure wave -gridoffset 0
+configure wave -gridperiod 1
+configure wave -griddelta 40
+configure wave -timeline 0
+configure wave -timelineunits ns
+update
+WaveRestoreZoom {0 ps} {151772250 ps}
diff --git a/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/synthesis.sh b/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/synthesis.sh new file mode 100755 index 0000000..66622ea --- /dev/null +++ b/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/synthesis.sh @@ -0,0 +1,36 @@ +#!/bin/sh + +# need project files: +# top.xst +# top.prj +# top.ut + +# need Xilinx tools: +# xst +# ngdbuild +# map +# par +# trce +# bitgen + +echo "########################" +echo "generate build directory" +echo "########################" +mkdir build +cd build +mkdir tmp + +echo "###############" +echo "start processes" +echo "###############" +xst -ifn "../synthesis_config/top.xst" -ofn "top.syr" +ngdbuild -dd _ngo -nt timestamp -uc ../synthesis_config/digilent-starter-xc3s500e.ucf -p xc3s500e-fg320-4 top.ngc top.ngd +map -p xc3s500e-fg320-4 -cm area -ir off -pr off -c 100 -o top_map.ncd top.ngd top.pcf +par -w -ol high -t 1 top_map.ncd top.ncd top.pcf +trce -v 3 -s 4 -n 3 -fastpaths -xml top.twx top.ncd -o top.twr top.pcf +bitgen -f ../synthesis_config/top.ut top.ncd + +echo "###########" +echo "get bitfile" +echo "###########" +cp top.bit .. diff --git a/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/synthesis_config/digilent-starter-xc3s500e.ucf b/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/synthesis_config/digilent-starter-xc3s500e.ucf new file mode 100644 index 0000000..1007d00 --- /dev/null +++ b/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/synthesis_config/digilent-starter-xc3s500e.ucf @@ -0,0 +1,356 @@ +#####################################################
+# SPARTAN-3E Starter Kit Board Constraints File
+#
+# Family: Spartan3E
+# Device: XC3S500E
+# Package: FG320
+# Speed: -4
+
+
+############################################################
+## clock/timing constraints
+############################################################
+
+# Define clock period for 50 MHz oscillator (40%/60% duty-cycle)
+TIMESPEC "TS_CLK_50MHZ" = PERIOD "CLK_50MHZ" 50.0 MHz HIGH 40%;
+
+# ethernet clock
+TIMESPEC "TS_E_CLK" = PERIOD "E_CLK" 25.0 MHz HIGH 50% ;
+# need because misplaced ethernet clock lines
+NET "E_RX_CLK" CLOCK_DEDICATED_ROUTE = FALSE ;
+NET "E_TX_CLK" CLOCK_DEDICATED_ROUTE = FALSE ;
+
+############################################################
+## pin placement constraints
+############################################################
+
+# Analog-to-Digital Converter (ADC)
+# some connections shared with SPI Flash, DAC, ADC, and AMP
+NET "AD_CONV" LOC = "P11" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 6 ;
+
+# Programmable Gain Amplifier (AMP)
+# some connections shared with SPI Flash, DAC, ADC, and AMP
+NET "AMP_CS" LOC = "N7" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 6 ;
+NET "AMP_DOUT" LOC = "E18" | IOSTANDARD = LVCMOS33 ;
+NET "AMP_SHDN" LOC = "P7" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 6 ;
+
+# Pushbuttons (BTN)
+NET "BTN_EAST" LOC = "H13" | IOSTANDARD = LVTTL | PULLDOWN | TIG;
+NET "BTN_NORTH" LOC = "V4" | IOSTANDARD = LVTTL | PULLDOWN | TIG;
+NET "BTN_SOUTH" LOC = "K17" | IOSTANDARD = LVTTL | PULLDOWN | TIG;
+NET "BTN_WEST" LOC = "D18" | IOSTANDARD = LVTTL | PULLDOWN | TIG;
+
+# Clock inputs (CLK)
+NET "CLK_50MHZ" LOC = "C9" | IOSTANDARD = LVCMOS33 | TNM_NET = "CLK_50MHZ";
+NET "CLK_AUX" LOC = "B8" | IOSTANDARD = LVCMOS33 ;
+NET "CLK_SMA" LOC = "A10" | IOSTANDARD = LVCMOS33 ;
+
+# Digital-to-Analog Converter (DAC)
+# some connections shared with SPI Flash, DAC, ADC, and AMP
+NET "DAC_CLR" LOC = "P8" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8 ;
+NET "DAC_CS" LOC = "N8" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8 ;
+
+# 1-Wire Secure EEPROM (DS)
+NET "DS_WIRE" LOC = "U4" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
+
+# Ethernet PHY (E)
+NET "E_COL" LOC = "U6" | IOSTANDARD = LVCMOS33 ;
+NET "E_CRS" LOC = "U13" | IOSTANDARD = LVCMOS33 ;
+NET "E_MDC" LOC = "P9" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8 ;
+NET "E_MDIO" LOC = "U5" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8 ;
+NET "E_RX_CLK" LOC = "V3" | IOSTANDARD = LVCMOS33 | TNM_NET = "E_CLK";
+NET "E_RX_DV" LOC = "V2" | IOSTANDARD = LVCMOS33 ;
+NET "E_RXD<0>" LOC = "V8" | IOSTANDARD = LVCMOS33 ;
+NET "E_RXD<1>" LOC = "T11" | IOSTANDARD = LVCMOS33 ;
+NET "E_RXD<2>" LOC = "U11" | IOSTANDARD = LVCMOS33 ;
+NET "E_RXD<3>" LOC = "V14" | IOSTANDARD = LVCMOS33 ;
+NET "E_RX_ER" LOC = "U14" | IOSTANDARD = LVCMOS33 ;
+NET "E_TX_CLK" LOC = "T7" | IOSTANDARD = LVCMOS33 | TNM_NET = "E_CLK";
+NET "E_TX_EN" LOC = "P15" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8 ;
+NET "E_TXD<0>" LOC = "R11" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8 ;
+NET "E_TXD<1>" LOC = "T15" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8 ;
+NET "E_TXD<2>" LOC = "R5" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8 ;
+NET "E_TXD<3>" LOC = "T5" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8 ;
+NET "E_TX_ER" LOC = "R6" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8 ;
+
+# FPGA Configuration Mode, INIT_B Pins (FPGA)
+NET "FPGA_M0" LOC = "M10" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8 ;
+NET "FPGA_M1" LOC = "V11" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8 ;
+NET "FPGA_M2" LOC = "T10" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8 ;
+NET "FPGA_INIT_B" LOC = "T3" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 4 ;
+NET "FPGA_RDWR_B" LOC = "U10" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 4 ;
+NET "FPGA_HSWAP" LOC = "B3" | IOSTANDARD = LVCMOS33 ;
+
+# FX2 Connector (FX2)
+NET "FX2_CLKIN" LOC = "E10" | IOSTANDARD = LVCMOS33 ;
+NET "FX2_CLKIO" LOC = "D9" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_CLKOUT" LOC = "D10" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+
+# These four connections are shared with the J1 6-pin accessory header
+NET "FX2_IO<1>" LOC = "B4" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<2>" LOC = "A4" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<3>" LOC = "D5" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<4>" LOC = "C5" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+
+# These four connections are shared with the J2 6-pin accessory header
+NET "FX2_IO<5>" LOC = "A6" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<6>" LOC = "B6" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<7>" LOC = "E7" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<8>" LOC = "F7" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+
+# These four connections are shared with the J4 6-pin accessory header
+NET "FX2_IO<9>" LOC = "D7" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<10>" LOC = "C7" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<11>" LOC = "F8" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<12>" LOC = "E8" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+
+# The discrete LEDs are shared with the following 8 FX2 connections
+NET "FX2_IO<13>" LOC = "F9" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<14>" LOC = "E9" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<15>" LOC = "D11" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<16>" LOC = "C11" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<17>" LOC = "F11" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<18>" LOC = "E11" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<19>" LOC = "E12" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<20>" LOC = "F12" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+
+NET "FX2_IO<21>" LOC = "A13" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<22>" LOC = "B13" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<23>" LOC = "A14" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<24>" LOC = "B14" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<25>" LOC = "C14" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<26>" LOC = "D14" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<27>" LOC = "A16" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<28>" LOC = "B16" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<29>" LOC = "E13" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<30>" LOC = "C4" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<31>" LOC = "B11" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<32>" LOC = "A11" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<33>" LOC = "A8" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<34>" LOC = "G9" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+#
+NET "FX2_IO<35>" LOC = "D12" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<36>" LOC = "C12" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<37>" LOC = "A15" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<38>" LOC = "B15" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+#
+NET "FX2_IO<39>" LOC = "C3" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+NET "FX2_IO<40>" LOC = "C15" | IOSTANDARD = LVCMOS33 | SLEW = FAST | DRIVE = 8 ;
+
+# 6-pin header J1
+# These are shared connections with the FX2 connector
+#NET "J1<0>" LOC = "B4" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 6 ;
+#NET "J1<1>" LOC = "A4" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 6 ;
+#NET "J1<2>" LOC = "D5" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 6 ;
+#NET "J1<3>" LOC = "C5" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 6 ;
+
+# 6-pin header J2
+# These are shared connections with the FX2 connector
+#NET "J2<0>" LOC = "A6" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 6 ;
+#NET "J2<1>" LOC = "B6" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 6 ;
+#NET "J2<2>" LOC = "E7" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 6 ;
+#NET "J2<3>" LOC = "F7" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 6 ;
+
+# 6-pin header J4
+# These are shared connections with the FX2 connector
+#NET "J4<0>" LOC = "D7" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 6 ;
+#NET "J4<1>" LOC = "C7" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 6 ;
+#NET "J4<2>" LOC = "F8" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 6 ;
+#NET "J4<3>" LOC = "E8" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 6 ;
+
+# Character LCD (LCD)
+NET "LCD_E" LOC = "M18" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "LCD_RS" LOC = "L18" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "LCD_RW" LOC = "L17" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+
+# LCD data connections are shared with StrataFlash connections SF_D<11:8>
+#NET "SF_D<8>" LOC = "R15" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+#NET "SF_D<9>" LOC = "R16" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+#NET "SF_D<10>" LOC = "P17" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+#NET "SF_D<11>" LOC = "M15" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+
+# Discrete LEDs (LED)
+# These are shared connections with the FX2 connector
+#NET "LED<0>" LOC = "F12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
+#NET "LED<1>" LOC = "E12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
+#NET "LED<2>" LOC = "E11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
+#NET "LED<3>" LOC = "F11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
+#NET "LED<4>" LOC = "C11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
+#NET "LED<5>" LOC = "D11" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
+#NET "LED<6>" LOC = "E9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
+#NET "LED<7>" LOC = "F9" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 8 ;
+
+# PS/2 Mouse/Keyboard Port (PS2)
+NET "PS2_CLK" LOC = "G14" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW | TIG;
+NET "PS2_DATA" LOC = "G13" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW | TIG;
+
+# Rotary Pushbutton Switch (ROT)
+NET "ROT_A" LOC = "K18" | IOSTANDARD = LVTTL | PULLUP | TIG;
+NET "ROT_B" LOC = "G18" | IOSTANDARD = LVTTL | PULLUP | TIG;
+NET "ROT_CENTER" LOC = "V16" | IOSTANDARD = LVTTL | PULLDOWN | TIG;
+
+# RS-232 Serial Ports (RS232)
+NET "RS232_DCE_RXD" LOC = "R7" | IOSTANDARD = LVTTL | TIG;
+NET "RS232_DCE_TXD" LOC = "M14" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = SLOW | TIG;
+NET "RS232_DTE_RXD" LOC = "U8" | IOSTANDARD = LVTTL | TIG;
+NET "RS232_DTE_TXD" LOC = "M13" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = SLOW | TIG;
+
+# DDR SDRAM (SD) (I/O Bank 3, VCCO=2.5V)
+NET "SD_A<0>" LOC = "T1" | IOSTANDARD = SSTL2_I ;
+NET "SD_A<1>" LOC = "R3" | IOSTANDARD = SSTL2_I ;
+NET "SD_A<2>" LOC = "R2" | IOSTANDARD = SSTL2_I ;
+NET "SD_A<3>" LOC = "P1" | IOSTANDARD = SSTL2_I ;
+NET "SD_A<4>" LOC = "F4" | IOSTANDARD = SSTL2_I ;
+NET "SD_A<5>" LOC = "H4" | IOSTANDARD = SSTL2_I ;
+NET "SD_A<6>" LOC = "H3" | IOSTANDARD = SSTL2_I ;
+NET "SD_A<7>" LOC = "H1" | IOSTANDARD = SSTL2_I ;
+NET "SD_A<8>" LOC = "H2" | IOSTANDARD = SSTL2_I ;
+NET "SD_A<9>" LOC = "N4" | IOSTANDARD = SSTL2_I ;
+NET "SD_A<10>" LOC = "T2" | IOSTANDARD = SSTL2_I ;
+NET "SD_A<11>" LOC = "N5" | IOSTANDARD = SSTL2_I ;
+NET "SD_A<12>" LOC = "P2" | IOSTANDARD = SSTL2_I ;
+NET "SD_BA<0>" LOC = "K5" | IOSTANDARD = SSTL2_I ;
+NET "SD_BA<1>" LOC = "K6" | IOSTANDARD = SSTL2_I ;
+NET "SD_CAS" LOC = "C2" | IOSTANDARD = SSTL2_I ;
+NET "SD_CK_N" LOC = "J4" | IOSTANDARD = SSTL2_I ; #DIFF_SSTL2_I ;
+NET "SD_CK_P" LOC = "J5" | IOSTANDARD = SSTL2_I ; #DIFF_SSTL2_I ;
+NET "SD_CKE" LOC = "K3" | IOSTANDARD = SSTL2_I ;
+NET "SD_CS" LOC = "K4" | IOSTANDARD = SSTL2_I ;
+NET "SD_DQ<0>" LOC = "L2" | IOSTANDARD = SSTL2_I | PULLUP ;
+NET "SD_DQ<1>" LOC = "L1" | IOSTANDARD = SSTL2_I | PULLUP ;
+NET "SD_DQ<2>" LOC = "L3" | IOSTANDARD = SSTL2_I | PULLUP ;
+NET "SD_DQ<3>" LOC = "L4" | IOSTANDARD = SSTL2_I | PULLUP ;
+NET "SD_DQ<4>" LOC = "M3" | IOSTANDARD = SSTL2_I | PULLUP ;
+NET "SD_DQ<5>" LOC = "M4" | IOSTANDARD = SSTL2_I | PULLUP ;
+NET "SD_DQ<6>" LOC = "M5" | IOSTANDARD = SSTL2_I | PULLUP ;
+NET "SD_DQ<7>" LOC = "M6" | IOSTANDARD = SSTL2_I | PULLUP ;
+NET "SD_DQ<8>" LOC = "E2" | IOSTANDARD = SSTL2_I | PULLUP ;
+NET "SD_DQ<9>" LOC = "E1" | IOSTANDARD = SSTL2_I | PULLUP ;
+NET "SD_DQ<10>" LOC = "F1" | IOSTANDARD = SSTL2_I | PULLUP ;
+NET "SD_DQ<11>" LOC = "F2" | IOSTANDARD = SSTL2_I | PULLUP ;
+NET "SD_DQ<12>" LOC = "G6" | IOSTANDARD = SSTL2_I | PULLUP ;
+NET "SD_DQ<13>" LOC = "G5" | IOSTANDARD = SSTL2_I | PULLUP ;
+NET "SD_DQ<14>" LOC = "H6" | IOSTANDARD = SSTL2_I | PULLUP ;
+NET "SD_DQ<15>" LOC = "H5" | IOSTANDARD = SSTL2_I | PULLUP ;
+NET "SD_LDM" LOC = "J2" | IOSTANDARD = SSTL2_I ;
+NET "SD_UDM" LOC = "J1" | IOSTANDARD = SSTL2_I ;
+NET "SD_RAS" LOC = "C1" | IOSTANDARD = SSTL2_I ;
+NET "SD_LDQS" LOC = "L6" | IOSTANDARD = SSTL2_I | PULLUP ;
+NET "SD_UDQS" LOC = "G3" | IOSTANDARD = SSTL2_I | PULLUP ;
+NET "SD_WE" LOC = "D1" | IOSTANDARD = SSTL2_I ;
+# Path to allow connection to top DCM connection
+NET "SD_CK_FB" LOC = "B9" | IOSTANDARD = LVCMOS33 ;
+
+# Prohibit VREF pins
+CONFIG PROHIBIT = D2;
+CONFIG PROHIBIT = G4;
+CONFIG PROHIBIT = J6;
+CONFIG PROHIBIT = L5;
+CONFIG PROHIBIT = R4;
+
+# Intel StrataFlash Parallel NOR Flash (SF)
+NET "SF_A<0>" LOC = "H17" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_A<1>" LOC = "J13" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_A<2>" LOC = "J12" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_A<3>" LOC = "J14" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_A<4>" LOC = "J15" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_A<5>" LOC = "J16" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_A<6>" LOC = "J17" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_A<7>" LOC = "K14" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_A<8>" LOC = "K15" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_A<9>" LOC = "K12" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_A<10>" LOC = "K13" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_A<11>" LOC = "L15" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_A<12>" LOC = "L16" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_A<13>" LOC = "T18" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_A<14>" LOC = "R18" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_A<15>" LOC = "T17" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_A<16>" LOC = "U18" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_A<17>" LOC = "T16" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_A<18>" LOC = "U15" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_A<19>" LOC = "V15" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_A<20>" LOC = "T12" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_A<21>" LOC = "V13" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_A<22>" LOC = "V12" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_A<23>" LOC = "N11" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+#NET "SF_A<24>" LOC = "A11" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_BYTE" LOC = "C17" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_CE0" LOC = "D16" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_D<1>" LOC = "P10" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_D<2>" LOC = "R10" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_D<3>" LOC = "V9" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_D<4>" LOC = "U9" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_D<5>" LOC = "R9" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_D<6>" LOC = "M9" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_D<7>" LOC = "N9" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_D<8>" LOC = "R15" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_D<9>" LOC = "R16" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_D<10>" LOC = "P17" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_D<11>" LOC = "M15" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_D<12>" LOC = "M16" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_D<13>" LOC = "P6" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_D<14>" LOC = "R8" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_D<15>" LOC = "T8" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_OE" LOC = "C18" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+NET "SF_STS" LOC = "B18" | IOSTANDARD = LVCMOS33 ;
+NET "SF_WE" LOC = "D17" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+
+# STMicro SPI serial Flash (SPI)
+# some connections shared with SPI Flash, DAC, ADC, and AMP
+NET "SPI_MISO" LOC = "N10" | IOSTANDARD = LVCMOS33 ;
+NET "SPI_MOSI" LOC = "T4" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 6 ;
+NET "SPI_SCK" LOC = "U16" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 6 ;
+NET "SPI_SS_B" LOC = "U3" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 6 | PULLUP ;
+NET "SPI_ALT_CS_JP11" LOC = "R12" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 6 ;
+
+# Slide Switches (SW)
+NET "SW<0>" LOC = "L13" | IOSTANDARD = LVTTL | PULLUP | TIG;
+NET "SW<1>" LOC = "L14" | IOSTANDARD = LVTTL | PULLUP | TIG;
+NET "SW<2>" LOC = "H18" | IOSTANDARD = LVTTL | PULLUP | TIG;
+NET "SW<3>" LOC = "N17" | IOSTANDARD = LVTTL | PULLUP | TIG;
+
+# VGA Port (VGA)
+NET "VGA_BLUE" LOC = "G15" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST ;
+NET "VGA_GREEN" LOC = "H15" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST ;
+NET "VGA_HSYNC" LOC = "F15" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST ;
+NET "VGA_RED" LOC = "H14" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST ;
+NET "VGA_VSYNC" LOC = "F14" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST ;
+
+# Xilinx CPLD (XC)
+NET "XC_CMD<0>" LOC = "P18" | IOSTANDARD = LVTTL | DRIVE = 4 | SLEW = SLOW ;
+NET "XC_CMD<1>" LOC = "N18" | IOSTANDARD = LVTTL | DRIVE = 4 | SLEW = SLOW ;
+NET "XC_CPLD_EN" LOC = "B10" | IOSTANDARD = LVTTL ;
+NET "XC_D<0>" LOC = "G16" | IOSTANDARD = LVTTL | DRIVE = 4 | SLEW = SLOW ;
+NET "XC_D<1>" LOC = "F18" | IOSTANDARD = LVTTL | DRIVE = 4 | SLEW = SLOW ;
+NET "XC_D<2>" LOC = "F17" | IOSTANDARD = LVTTL | DRIVE = 4 | SLEW = SLOW ;
+NET "XC_TRIG" LOC = "R17" | IOSTANDARD = LVCMOS33 ;
+NET "XC_GCK0" LOC = "H16" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+#NET "GCLK10" LOC = "C9" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = SLOW ;
+
+# prohibit unused pins
+CONFIG PROHIBIT = A3;
+CONFIG PROHIBIT = A7;
+CONFIG PROHIBIT = D13;
+CONFIG PROHIBIT = F10;
+CONFIG PROHIBIT = G10;
+CONFIG PROHIBIT = C8;
+CONFIG PROHIBIT = D8;
+CONFIG PROHIBIT = A5;
+CONFIG PROHIBIT = B5;
+#
+CONFIG PROHIBIT = P13;
+CONFIG PROHIBIT = R13;
+CONFIG PROHIBIT = T14;
+CONFIG PROHIBIT = R14;
+#
+CONFIG PROHIBIT = D3;
+CONFIG PROHIBIT = F5;
+CONFIG PROHIBIT = G1;
+CONFIG PROHIBIT = J7;
+CONFIG PROHIBIT = K2;
+CONFIG PROHIBIT = K7;
+CONFIG PROHIBIT = M1;
+CONFIG PROHIBIT = N1;
+CONFIG PROHIBIT = N2;
+CONFIG PROHIBIT = R1;
+CONFIG PROHIBIT = U1;
diff --git a/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/synthesis_config/top.prj b/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/synthesis_config/top.prj new file mode 100644 index 0000000..965ae4c --- /dev/null +++ b/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/synthesis_config/top.prj @@ -0,0 +1,19 @@ +vhdl work ../top.vhd
+vhdl zpu ../../../zpu_pkg.vhdl
+vhdl zpu ../../../zpu_small.vhdl
+vhdl zpu ../../../zpu_medium.vhdl
+vhdl zpu ../../../roms/rom_pkg.vhdl
+#vhdl zpu ../../../roms/hello_dbram.vhdl
+#vhdl zpu ../../../roms/hello_bram.vhdl
+vhdl zpu ../../../roms/dmips_dbram.vhdl
+vhdl zpu ../../../roms/dmips_bram.vhdl
+vhdl zpu ../../../helpers/zpu_small1.vhdl
+vhdl zpu ../../../helpers/zpu_med1.vhdl
+vhdl zpu ../../../devices/txt_util.vhdl
+vhdl zpu ../../../devices/phi_io.vhdl
+vhdl zpu ../../../devices/timer.vhdl
+vhdl zpu ../../../devices/gpio.vhdl
+vhdl zpu ../../../devices/rx_unit.vhdl
+vhdl zpu ../../../devices/tx_unit.vhdl
+vhdl zpu ../../../devices/br_gen.vhdl
+vhdl zpu ../../../devices/trace.vhdl
diff --git a/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/synthesis_config/top.ut b/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/synthesis_config/top.ut new file mode 100644 index 0000000..4bf13c6 --- /dev/null +++ b/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/synthesis_config/top.ut @@ -0,0 +1,22 @@ +-w
+-g DebugBitstream:No
+-g Binary:no
+-g CRC:Enable
+-g ConfigRate:1
+-g ProgPin:PullUp
+-g DonePin:PullUp
+-g TckPin:PullUp
+-g TdiPin:PullUp
+-g TdoPin:PullUp
+-g TmsPin:PullUp
+-g UnusedPin:PullDown
+-g UserID:0xFFFFFFFF
+-g DCMShutdown:Disable
+-g StartUpClk:CClk
+-g DONE_cycle:4
+-g GTS_cycle:5
+-g GWE_cycle:6
+-g LCK_cycle:NoWait
+-g Security:None
+-g DonePipe:No
+-g DriveDone:No
diff --git a/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/synthesis_config/top.xst b/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/synthesis_config/top.xst new file mode 100644 index 0000000..d357860 --- /dev/null +++ b/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/synthesis_config/top.xst @@ -0,0 +1,56 @@ +set -tmpdir "tmp"
+set -xsthdpdir "xst"
+run
+-ifn ../synthesis_config/top.prj
+-ifmt mixed
+-ofn top
+-ofmt NGC
+-p xc3s500e-4-fg320
+-top top
+-opt_mode Speed
+-opt_level 1
+-iuc NO
+-keep_hierarchy No
+-netlist_hierarchy As_Optimized
+-rtlview Yes
+-glob_opt AllClockNets
+-read_cores YES
+-write_timing_constraints NO
+-cross_clock_analysis NO
+-hierarchy_separator /
+-bus_delimiter <>
+-case Maintain
+-slice_utilization_ratio 100
+-bram_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
+-mux_style Auto
+-decoder_extract YES
+-priority_extract Yes
+-shreg_extract YES
+-shift_extract YES
+-xor_collapse YES
+-rom_style Auto
+-auto_bram_packing NO
+-mux_extract Yes
+-resource_sharing YES
+-async_to_sync NO
+-mult_style Auto
+-iobuf YES
+-max_fanout 500
+-bufg 24
+-register_duplication YES
+-register_balancing No
+-slice_packing YES
+-optimize_primitives NO
+-use_clock_enable Yes
+-use_sync_set Yes
+-use_sync_reset Yes
+-iob Auto
+-equivalent_register_removal YES
+-slice_utilization_ratio_maxmargin 5
diff --git a/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/top.vhd b/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/top.vhd new file mode 100644 index 0000000..4adc18b --- /dev/null +++ b/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/top.vhd @@ -0,0 +1,464 @@ +-- top module of
+-- Spartan-3E Starter Kit Board
+--
+-- using following external connections:
+-- rotary pushbutton as reset
+-- LEDs for output
+-- RS232 (DCE, the left one)
+--
+
+
+library ieee;
+use ieee.std_logic_1164.all;
+
+library zpu;
+use zpu.zpupkg.all; -- zpu_dbgo_t
+
+library unisim;
+use unisim.vcomponents.dcm_sp;
+
+
+entity top is
+ port (
+ -- pragma translate_off
+ stop_simulation : out std_logic;
+ -- pragma translate_on
+ --
+ -- Analog-to-Digital Converter (ADC)
+ ad_conv : out std_logic;
+ -- Programmable Gain Amplifier (AMP)
+ amp_cs : out std_logic; -- active low chip select
+ amp_dout : in std_logic;
+ amp_shdn : out std_logic; -- active high shutdown, reset
+ -- Pushbuttons (BTN)
+ btn_east : in std_logic;
+ btn_north : in std_logic;
+ btn_south : in std_logic;
+ btn_west : in std_logic;
+ -- Clock inputs (CLK)
+ clk_50mhz : in std_logic;
+ clk_aux : in std_logic;
+ clk_sma : in std_logic;
+ -- Digital-to-Analog Converter (DAC)
+ dac_clr : out std_logic; -- async, active low reset input
+ dac_cs : out std_logic; -- active low chip select, conv start with rising edge
+ -- 1-Wire Secure EEPROM (DS)
+ ds_wire : inout std_logic;
+ -- Ethernet PHY (E)
+ e_col : in std_logic; -- MII collision detect
+ e_crs : in std_logic; -- carrier sense
+ e_mdc : out std_logic; -- management clock
+ e_mdio : inout std_logic; -- management data io
+ e_rx_clk : in std_logic; -- receive clock 25MHz@100BaseTx or 2.5MHz@10Base-T
+ e_rx_dv : in std_logic; -- receive data valid
+ e_rxd : in std_logic_vector(3 downto 0);
+ e_rx_er : in std_logic;
+ e_tx_clk : in std_logic; -- transmit clock 25MHz@100BaseTx or 2.5MHz@10Base-T
+ e_tx_en : out std_logic; -- transmit enable
+ e_txd : out std_logic_vector(3 downto 0);
+ e_tx_er : out std_logic;
+ -- FPGA Configuration Mode, INIT_B Pins (FPGA)
+ fpga_m0 : inout std_logic;
+ fpga_m1 : inout std_logic;
+ fpga_m2 : inout std_logic;
+ fpga_init_b : inout std_logic;
+ fpga_rdwr_b : in std_logic;
+ fpga_hswap : in std_logic;
+ -- FX2 Connector (FX2)
+ fx2_clkin : inout std_logic;
+ fx2_clkio : inout std_logic;
+ fx2_clkout : inout std_logic;
+ fx2_io : inout std_logic_vector(40 downto 1);
+ -- These are shared connections with the FX2 connector
+ --j1 : inout std_logic_vector(3 downto 0);
+ --j2 : inout std_logic_vector(3 downto 0);
+ --j4 : inout std_logic_vector(3 downto 0);
+ --led : out std_logic_vector(7 downto 0);
+ -- Character LCD (LCD)
+ lcd_e : out std_logic;
+ lcd_rs : out std_logic;
+ lcd_rw : out std_logic;
+ -- LCD data connections are shared with StrataFlash connections SF_D<11:8>
+ --sf_d : inout std_ulogic_vector(11 downto 8);
+ -- PS/2 Mouse/Keyboard Port (PS2)
+ ps2_clk : inout std_logic;
+ ps2_data : inout std_logic;
+ -- Rotary Pushbutton Switch (ROT)
+ rot_a : in std_logic;
+ rot_b : in std_logic;
+ rot_center : in std_logic;
+ -- RS-232 Serial Ports (RS232)
+ rs232_dce_rxd : in std_logic;
+ rs232_dce_txd : out std_logic;
+ rs232_dte_rxd : in std_logic;
+ rs232_dte_txd : out std_logic;
+ -- DDR SDRAM (SD) (I/O Bank 3, VCCO=2.5V)
+ sd_a : out std_logic_vector(12 downto 0); -- address inputs
+ sd_dq : inout std_logic_vector(15 downto 0); -- data io
+ sd_ba : out std_logic_vector(1 downto 0); -- bank address inputs
+ sd_ras : out std_logic; -- command output
+ sd_cas : out std_logic; -- command output
+ sd_we : out std_logic; -- command output
+ sd_udm : out std_logic; -- data mask
+ sd_ldm : out std_logic; -- data mask
+ sd_udqs : inout std_logic; -- data strobe
+ sd_ldqs : inout std_logic; -- data strobe
+ sd_cs : out std_logic; -- active low chip select
+ sd_cke : out std_logic; -- active high clock enable
+ sd_ck_n : out std_logic; -- differential clock
+ sd_ck_p : out std_logic; -- differential clock
+ -- Path to allow connection to top DCM connection
+ sd_ck_fb : in std_logic;
+ -- Intel StrataFlash Parallel NOR Flash (SF)
+ sf_a : out std_logic_vector(23 downto 0); -- sf_a<24> = fx_io32
+ sf_byte : out std_logic;
+ sf_ce0 : out std_logic;
+ sf_d : inout std_logic_vector(15 downto 1);
+ sf_oe : out std_logic;
+ sf_sts : in std_logic;
+ sf_we : out std_logic;
+ -- STMicro SPI serial Flash (SPI)
+ spi_mosi : out std_logic; -- master out slave in
+ spi_miso : in std_logic; -- master in slave out
+ spi_sck : out std_logic; -- clock
+ spi_ss_b : out std_logic; -- active low slave select
+ spi_alt_cs_jp11 : out std_logic;
+ -- Slide Switches (SW)
+ sw : in std_logic_vector(3 downto 0);
+ -- VGA Port (VGA)
+ vga_blue : out std_logic;
+ vga_green : out std_logic;
+ vga_hsync : out std_logic;
+ vga_red : out std_logic;
+ vga_vsync : out std_logic;
+ -- Xilinx CPLD (XC)
+ xc_cmd : out std_logic_vector(1 downto 0);
+ xc_cpld_en : out std_logic;
+ xc_d : inout std_logic_vector(2 downto 0);
+ xc_trig : in std_logic;
+ xc_gck0 : inout std_logic;
+ gclk10 : inout std_logic
+ );
+end entity top;
+
+
+architecture rtl of top is
+
+ ---------------------------
+ -- type declarations
+ type zpu_type is (zpu_small, zpu_medium);
+
+ ---------------------------
+ -- constant declarations
+ constant zpu_flavour : zpu_type := zpu_medium; -- choose your flavour HERE
+ -- modify frequency here
+ constant clk_multiply : positive := 3; -- 2 for small, 3 for medium
+ constant clk_divide : positive := 2; -- 1 for small, 2 for medium
+ --
+ constant word_size_c : natural := 32; -- 32 bits data path
+ constant addr_w_c : natural := 18; -- 18 bits address space=256 kB, 128 kB I/O
+
+
+ constant spi_ss_b_disable : std_ulogic := '1'; -- 1 = disable SPI serial flash
+ constant dac_cs_disable : std_ulogic := '1'; -- 1 = disable DAC
+ constant amp_cs_disable : std_ulogic := '1'; -- 1 = disable programmable pre-amplifier
+ constant ad_conv_disable : std_ulogic := '0'; -- 0 = disable ADC
+ constant sf_ce0_disable : std_ulogic := '1';
+ constant fpga_init_b_disable : std_ulogic := '1'; -- 1 = disable pflatform flash PROM
+ --
+ -- connect ldc to fpga
+ constant sf_ce0_lcd_to_fpga : std_ulogic := '1';
+ --
+ constant clk_frequency : positive := 50; -- input frequency for correct calculation
+
+
+ ---------------------------
+ -- component declarations
+ component zpu_small1 is
+ generic (
+ word_size : natural := 32; -- 32 bits data path
+ d_care_val : std_logic := '0'; -- Fill value
+ clk_freq : positive := 50; -- 50 MHz clock
+ brate : positive := 115200; -- RS232 baudrate
+ addr_w : natural := 16; -- 16 bits address space=64 kB, 32 kB I/O
+ bram_w : natural := 15 -- 15 bits RAM space=32 kB
+ );
+ port (
+ clk_i : in std_logic; -- CPU clock
+ rst_i : in std_logic; -- Reset
+ break_o : out std_logic; -- Break executed
+ dbg_o : out zpu_dbgo_t; -- Debug info
+ rs232_tx_o : out std_logic; -- UART Tx
+ rs232_rx_i : in std_logic; -- UART Rx
+ gpio_in : in std_logic_vector(31 downto 0);
+ gpio_out : out std_logic_vector(31 downto 0);
+ gpio_dir : out std_logic_vector(31 downto 0) -- 1 = in, 0 = out
+ );
+ end component zpu_small1;
+
+ component zpu_med1 is
+ generic(
+ word_size : natural := 32; -- 32 bits data path
+ d_care_val : std_logic := '0'; -- Fill value
+ clk_freq : positive := 50; -- 50 MHz clock
+ brate : positive := 115200; -- RS232 baudrate
+ addr_w : natural := 18; -- 18 bits address space=256 kB, 128 kB I/O
+ bram_w : natural := 15 -- 15 bits RAM space=32 kB
+ );
+ port(
+ clk_i : in std_logic; -- CPU clock
+ rst_i : in std_logic; -- Reset
+ break_o : out std_logic; -- Break executed
+ dbg_o : out zpu_dbgo_t; -- Debug info
+ rs232_tx_o : out std_logic; -- UART Tx
+ rs232_rx_i : in std_logic; -- UART Rx
+ gpio_in : in std_logic_vector(31 downto 0);
+ gpio_out : out std_logic_vector(31 downto 0);
+ gpio_dir : out std_logic_vector(31 downto 0) -- 1 = in, 0 = out
+ );
+ end component zpu_med1;
+
+
+ ---------------------------
+ -- signal declarations
+ signal dcm_sp_i0_clk0 : std_ulogic;
+ signal dcm_sp_i0_clkfx : std_ulogic;
+ signal clk_fb : std_ulogic;
+ signal clk : std_ulogic;
+ --
+ signal reset_shift_reg : std_ulogic_vector(3 downto 0);
+ signal reset_sync : std_ulogic;
+ --
+ signal zpu_i0_dbg : zpu_dbgo_t; -- Debug info
+ signal zpu_i0_break : std_logic;
+ --
+ signal gpio_in : std_logic_vector(31 downto 0);
+ signal zpu_i0_gpio_out : std_logic_vector(31 downto 0);
+ signal zpu_i0_gpio_dir : std_logic_vector(31 downto 0);
+
+ ---------------------------
+ -- alias declarations
+ alias led : std_logic_vector(7 downto 0) is fx2_io(20 downto 13);
+
+
+begin
+
+ -- default output drivers
+ -- to pass bitgen DRC
+ -- outputs used by design are commented
+ --
+ ad_conv <= ad_conv_disable;
+ amp_cs <= amp_cs_disable;
+ amp_shdn <= '1';
+ --
+ dac_clr <= '0';
+ dac_cs <= dac_cs_disable;
+ --
+ ds_wire <= 'Z';
+ --
+ e_txd(3 downto 0) <= (others => '1');
+ e_tx_en <= '0';
+ e_tx_er <= '0';
+ e_mdc <= '1';
+ e_mdio <= 'Z';
+ --
+ fpga_m0 <= 'Z';
+ fpga_m1 <= 'Z';
+ fpga_m2 <= 'Z';
+ fpga_init_b <= fpga_init_b_disable;
+ --
+ fx2_clkin <= 'Z';
+ fx2_clkio <= 'Z';
+ fx2_clkout <= 'Z';
+ fx2_io <= (others => 'Z');
+ --
+ lcd_e <= '0';
+ lcd_rs <= '0';
+ lcd_rw <= '0';
+ --
+ ps2_clk <= 'Z';
+ ps2_data <= 'Z';
+ --
+ --rs232_dce_txd <= '1';
+ rs232_dte_txd <= '1';
+ --
+ sd_a <= (others => '1');
+ sd_dq <= (others => 'Z');
+ sd_ba <= (others => '1');
+ sd_ras <= '0';
+ sd_cas <= '0';
+ sd_we <= '0';
+ sd_udm <= '1';
+ sd_ldm <= '1';
+ sd_udqs <= '1';
+ sd_ldqs <= '1';
+ sd_cs <= '1';
+ sd_cke <= '1';
+ sd_ck_n <= '0';
+ sd_ck_p <= '1';
+ --
+ sf_a <= (others => '0');
+ sf_byte <= '0';
+ sf_ce0 <= sf_ce0_lcd_to_fpga;
+ sf_d <= (others => 'Z');
+ sf_oe <= '1';
+ sf_we <= '0';
+ --
+ spi_mosi <= '0';
+ spi_sck <= '0';
+ spi_ss_b <= spi_ss_b_disable;
+ spi_alt_cs_jp11 <= spi_ss_b_disable;
+ --
+ vga_red <= '0';
+ vga_green <= '0';
+ vga_blue <= '0';
+ vga_hsync <= '0';
+ vga_vsync <= '0';
+ --
+ xc_cmd <= "00";
+ xc_d <= (others => 'Z');
+ xc_cpld_en <= '0';
+ xc_gck0 <= 'Z';
+ gclk10 <= 'Z';
+ -- led out
+ --fx2_io(20 downto 13) <= (others => '0');
+
+
+ -- digital clock manager (DCM)
+ -- to generate higher/other system clock frequencys
+ dcm_sp_i0 : dcm_sp
+ generic map (
+ startup_wait => true, -- wait with DONE till locked
+ clkfx_multiply => clk_multiply,
+ clkfx_divide => clk_divide,
+ clk_feedback => "1X"
+ )
+ port map (
+ clkin => clk_50mhz,
+ clk0 => dcm_sp_i0_clk0,
+ clkfx => dcm_sp_i0_clkfx,
+ clkfb => clk_fb
+ );
+
+ clk_fb <= dcm_sp_i0_clk0;
+ clk <= dcm_sp_i0_clkfx;
+
+
+ -- reset synchronizer
+ -- generate synchronous reset
+ reset_synchronizer : process(clk, rot_center)
+ begin
+ if rot_center = '1' then
+ reset_shift_reg <= (others => '1');
+ elsif rising_edge(clk) then
+ reset_shift_reg <= reset_shift_reg(reset_shift_reg'high-1 downto 0) & '0';
+ end if;
+ end process;
+ reset_sync <= reset_shift_reg(reset_shift_reg'high);
+
+
+ -- select instance of zpu
+ zpu_i0_small : if zpu_flavour = zpu_small generate
+ zpu_i0 : zpu_small1
+ generic map (
+ addr_w => addr_w_c,
+ word_size => word_size_c,
+ clk_freq => clk_frequency * clk_multiply / clk_divide
+ )
+ port map (
+ clk_i => clk, -- : in std_logic; -- CPU clock
+ rst_i => reset_sync, -- : in std_logic; -- Reset
+ break_o => zpu_i0_break, -- : out std_logic; -- Break executed
+ dbg_o => zpu_i0_dbg, -- : out zpu_dbgo_t; -- Debug info
+ rs232_tx_o => rs232_dce_txd, -- : out std_logic; -- UART Tx
+ rs232_rx_i => rs232_dce_rxd, -- : in std_logic -- UART Rx
+ gpio_in => gpio_in, -- : in std_logic_vector(31 downto 0);
+ gpio_out => zpu_i0_gpio_out, -- : out std_logic_vector(31 downto 0);
+ gpio_dir => zpu_i0_gpio_dir -- : out std_logic_vector(31 downto 0) -- 1 = in, 0 = out
+ );
+ end generate zpu_i0_small;
+
+ zpu_i0_medium : if zpu_flavour = zpu_medium generate
+ zpu_i0 : zpu_med1
+ generic map (
+ addr_w => addr_w_c,
+ word_size => word_size_c,
+ clk_freq => clk_frequency * clk_multiply / clk_divide
+ )
+ port map (
+ clk_i => clk, -- : in std_logic; -- CPU clock
+ rst_i => reset_sync, -- : in std_logic; -- Reset
+ break_o => zpu_i0_break, -- : out std_logic; -- Break executed
+ dbg_o => zpu_i0_dbg, -- : out zpu_dbgo_t; -- Debug info
+ rs232_tx_o => rs232_dce_txd, -- : out std_logic; -- UART Tx
+ rs232_rx_i => rs232_dce_rxd, -- : in std_logic -- UART Rx
+ gpio_in => gpio_in, -- : in std_logic_vector(31 downto 0);
+ gpio_out => zpu_i0_gpio_out, -- : out std_logic_vector(31 downto 0);
+ gpio_dir => zpu_i0_gpio_dir -- : out std_logic_vector(31 downto 0) -- 1 = in, 0 = out
+ );
+ end generate zpu_i0_medium;
+
+
+ -- pragma translate_off
+ stop_simulation <= zpu_i0_break;
+
+
+ trace_mod : trace
+ generic map (
+ addr_w => addr_w_c,
+ word_size => word_size_c,
+ log_file => "zpu_trace.log"
+ )
+ port map (
+ clk_i => clk,
+ dbg_i => zpu_i0_dbg,
+ stop_i => zpu_i0_break,
+ busy_i => '0'
+ );
+ -- pragma translate_on
+
+
+ -- assign GPIOs
+ -- no bidirectional pins (e.g. headers), so
+ -- gpio_dir is unused
+ --
+ -- bit 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
+ --
+ -- in -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+ -- out -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+ --
+ --
+ -- bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ --
+ -- in -- -- -- -- sw(3.....0) -- ra rb rc be bn bs bw
+ -- out -- -- -- -- -- -- -- -- led(7................0)
+
+ gpio_in <= ((11) => sw(3),
+ (10) => sw(2),
+ ( 9) => sw(1),
+ ( 8) => sw(0),
+ --
+ ( 6) => rot_a,
+ ( 5) => rot_b,
+ ( 4) => rot_center,
+ --
+ ( 3) => btn_east,
+ ( 2) => btn_north,
+ ( 1) => btn_south,
+ ( 0) => btn_west,
+ others => '0');
+
+
+ -- switch on all LEDs in case of break
+ process
+ begin
+ wait until rising_edge(clk);
+ led <= zpu_i0_gpio_out(7 downto 0);
+ if zpu_i0_break = '1' then
+ led <= (others => '1');
+ end if;
+ end process;
+
+
+
+end architecture rtl;
diff --git a/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/top_tb.vhd b/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/top_tb.vhd new file mode 100644 index 0000000..d62bed9 --- /dev/null +++ b/zpu/hdl/zealot/fpga/digilent-starter-xc3s500e/top_tb.vhd @@ -0,0 +1,281 @@ +-- testbench for
+-- Digilent Spartan 3E Starter Board
+--
+-- includes "model" for clock generation
+-- simulate press on Rotary Pushbutton Switch as reset
+--
+-- place models for external components (PHY, SDRAM) in this file
+--
+
+
+library ieee;
+use ieee.std_logic_1164.all;
+
+
+entity top_tb is
+end entity top_tb;
+
+architecture testbench of top_tb is
+
+ ---------------------------
+ -- constant declarations
+ constant clk_50mhz_period : time := 1 sec / 50_000_000; -- 50 MHz
+
+
+ ---------------------------
+ -- signal declarations
+ signal simulation_run : boolean := true;
+ signal tb_stop_simulation : std_logic;
+ --
+ -- Analog-to-Digital Converter (ADC)
+ signal tb_ad_conv : std_logic;
+ -- Programmable Gain Amplifier (AMP)
+ signal tb_amp_cs : std_logic; -- active low chip select
+ signal tb_amp_dout : std_logic := '1';
+ signal tb_amp_shdn : std_logic; -- active high shutdown, reset
+ -- Pushbuttons (BTN)
+ signal tb_btn_east : std_logic := '0';
+ signal tb_btn_north : std_logic := '0';
+ signal tb_btn_south : std_logic := '0';
+ signal tb_btn_west : std_logic := '0';
+ -- Clock inputs (CLK)
+ signal tb_clk_50mhz : std_logic := '0';
+ signal tb_clk_aux : std_logic := '0';
+ signal tb_clk_sma : std_logic := '0';
+ -- Digital-to-Analog Converter (DAC)
+ signal tb_dac_clr : std_logic; -- async, active low reset input
+ signal tb_dac_cs : std_logic; -- active low chip select, conv start with rising edge
+ -- 1-Wire Secure EEPROM (DS)
+ signal tb_ds_wire : std_logic;
+ -- Ethernet PHY (E)
+ signal tb_e_col : std_logic := '0'; -- MII collision detect
+ signal tb_e_crs : std_logic := '0'; -- carrier sense
+ signal tb_e_mdc : std_logic; -- management clock
+ signal tb_e_mdio : std_logic; -- management data io
+ signal tb_e_rx_clk : std_logic := '0'; -- receive clock 25MHz@100BaseTx or 2.5MHz@10Base-T
+ signal tb_e_rx_dv : std_logic := '0'; -- receive data valid
+ signal tb_e_rxd : std_logic_vector(3 downto 0) := (others => '0');
+ signal tb_e_rx_er : std_logic := '0';
+ signal tb_e_tx_clk : std_logic := '0'; -- transmit clock 25MHz@100BaseTx or 2.5MHz@10Base-T
+ signal tb_e_tx_en : std_logic; -- transmit enable
+ signal tb_e_txd : std_logic_vector(3 downto 0);
+ signal tb_e_tx_er : std_logic;
+ -- FPGA Configuration Mode, INIT_B Pins (FPGA)
+ signal tb_fpga_m0 : std_logic;
+ signal tb_fpga_m1 : std_logic;
+ signal tb_fpga_m2 : std_logic;
+ signal tb_fpga_init_b : std_logic;
+ signal tb_fpga_rdwr_b : std_logic := '0';
+ signal tb_fpga_hswap : std_logic := '0';
+ -- FX2 Connector (FX2)
+ signal tb_fx2_clkin : std_logic;
+ signal tb_fx2_clkio : std_logic;
+ signal tb_fx2_clkout : std_logic;
+ signal tb_fx2_io : std_logic_vector(40 downto 1);
+ -- Character LCD (LCD)
+ signal tb_lcd_e : std_logic;
+ signal tb_lcd_rs : std_logic;
+ signal tb_lcd_rw : std_logic;
+ -- LCD data connections are shared with StrataFlash connections SF_D<11:8>
+ -- PS/2 Mouse/Keyboard Port (PS2)
+ signal tb_ps2_clk : std_logic;
+ signal tb_ps2_data : std_logic;
+ -- Rotary Pushbutton Switch (ROT)
+ signal tb_rot_a : std_logic := '0';
+ signal tb_rot_b : std_logic := '0';
+ signal tb_rot_center : std_logic; -- use as reset
+ -- RS-232 Serial Ports (RS232)
+ signal tb_rs232_dce_rxd : std_logic := '1';
+ signal tb_rs232_dce_txd : std_logic;
+ signal tb_rs232_dte_rxd : std_logic := '1';
+ signal tb_rs232_dte_txd : std_logic;
+ -- DDR SDRAM (SD) (I/O Bank 3, VCCO=2.5V)
+ signal tb_sd_a : std_logic_vector(12 downto 0); -- address inputs
+ signal tb_sd_dq : std_logic_vector(15 downto 0); -- data io
+ signal tb_sd_ba : std_logic_vector(1 downto 0); -- bank address inputs
+ signal tb_sd_ras : std_logic; -- command output
+ signal tb_sd_cas : std_logic; -- command output
+ signal tb_sd_we : std_logic; -- command output
+ signal tb_sd_udm : std_logic; -- data mask
+ signal tb_sd_ldm : std_logic; -- data mask
+ signal tb_sd_udqs : std_logic; -- data strobe
+ signal tb_sd_ldqs : std_logic; -- data strobe
+ signal tb_sd_cs : std_logic; -- active low chip select
+ signal tb_sd_cke : std_logic; -- active high clock enable
+ signal tb_sd_ck_n : std_logic; -- differential clock
+ signal tb_sd_ck_p : std_logic; -- differential clock
+ -- Path to allow connection to top DCM connection
+ signal tb_sd_ck_fb : std_logic;
+ -- Intel StrataFlash Parallel NOR Flash (SF)
+ signal tb_sf_a : std_logic_vector(23 downto 0); -- sf_a<24> = fx_io32 :-(
+ signal tb_sf_byte : std_logic;
+ signal tb_sf_ce0 : std_logic;
+ signal tb_sf_d : std_logic_vector(15 downto 1);
+ signal tb_sf_oe : std_logic;
+ signal tb_sf_sts : std_logic := '0';
+ signal tb_sf_we : std_logic;
+ -- STMicro SPI serial Flash (SPI)
+ signal tb_spi_mosi : std_logic; -- master out slave in
+ signal tb_spi_miso : std_logic := '0'; -- master in slave out
+ signal tb_spi_sck : std_logic; -- clock
+ signal tb_spi_ss_b : std_logic; -- active low slave select
+ signal tb_spi_alt_cs_jp11 : std_logic;
+ -- Slide Switches (SW)
+ signal tb_sw : std_logic_vector(3 downto 0) := (others => '0');
+ -- VGA Port (VGA)
+ signal tb_vga_blue : std_logic;
+ signal tb_vga_green : std_logic;
+ signal tb_vga_hsync : std_logic;
+ signal tb_vga_red : std_logic;
+ signal tb_vga_vsync : std_logic;
+ -- Xilinx CPLD (XC)
+ signal tb_xc_cmd : std_logic_vector(1 downto 0);
+ signal tb_xc_cpld_en : std_logic;
+ signal tb_xc_d : std_logic_vector(2 downto 0);
+ signal tb_xc_trig : std_logic := '0';
+ signal tb_xc_gck0 : std_logic;
+ signal tb_gclk10 : std_logic;
+
+
+begin
+
+
+ -- generate clock
+ tb_clk_50mhz <= not tb_clk_50mhz after clk_50mhz_period / 2 when simulation_run;
+
+ -- generate reset
+ tb_rot_center <= '1', '0' after 6.66 * clk_50mhz_period;
+
+
+ -- clock feedback for SD-RAM (on board)
+ tb_sd_ck_fb <= tb_sd_ck_p;
+
+ -- simulate keypress
+ tb_btn_north <= '0', '1' after 55 us, '0' after 56 us;
+
+ -- dut
+ top_i0 : entity work.top
+ port map (
+ stop_simulation => tb_stop_simulation, -- : out std_logic;
+ -- Analog-to-Digital Converter (ADC)
+ ad_conv => tb_ad_conv, -- : out std_logic;
+ -- Programmable Gain Amplifier (AMP)
+ amp_cs => tb_amp_cs, -- : out std_logic;
+ amp_dout => tb_amp_dout, -- : in std_logic;
+ amp_shdn => tb_amp_shdn, -- : out std_logic;
+ -- Pushbuttons (BTN)
+ btn_east => tb_btn_east, -- : in std_logic;
+ btn_north => tb_btn_north, -- : in std_logic;
+ btn_south => tb_btn_south, -- : in std_logic;
+ btn_west => tb_btn_west, -- : in std_logic;
+ -- Clock inputs (CLK)
+ clk_50mhz => tb_clk_50mhz, -- : in std_logic;
+ clk_aux => tb_clk_aux, -- : in std_logic;
+ clk_sma => tb_clk_sma, -- : in std_logic;
+ -- Digital-to-Analog Converter (DAC)
+ dac_clr => tb_dac_clr, -- : out std_logic;
+ dac_cs => tb_dac_cs, -- : out std_logic;
+ -- 1-Wire Secure EEPROM (DS)
+ ds_wire => tb_ds_wire, -- : inout std_logic;
+ -- Ethernet PHY (E)
+ e_col => tb_e_col, -- : in std_logic;
+ e_crs => tb_e_crs, -- : in std_logic;
+ e_mdc => tb_e_mdc, -- : out std_logic;
+ e_mdio => tb_e_mdio, -- : inout std_logic;
+ e_rx_clk => tb_e_rx_clk, -- : in std_logic;
+ e_rx_dv => tb_e_rx_dv, -- : in std_logic;
+ e_rxd => tb_e_rxd, -- : in std_logic_vector(3 downto 0);
+ e_rx_er => tb_e_rx_er, -- : in std_logic;
+ e_tx_clk => tb_e_tx_clk, -- : in std_logic;
+ e_tx_en => tb_e_tx_en, -- : out std_logic;
+ e_txd => tb_e_txd, -- : out std_logic_vector(3 downto 0);
+ e_tx_er => tb_e_tx_er, -- : out std_logic;
+ -- FPGA Configuration Mode, INIT_B Pins (FPGA)
+ fpga_m0 => tb_fpga_m0, -- : inout std_logic;
+ fpga_m1 => tb_fpga_m1, -- : inout std_logic;
+ fpga_m2 => tb_fpga_m2, -- : inout std_logic;
+ fpga_init_b => tb_fpga_init_b, -- : inout std_logic;
+ fpga_rdwr_b => tb_fpga_rdwr_b, -- : in std_logic;
+ fpga_hswap => tb_fpga_hswap, -- : in std_logic;
+ -- FX2 Connector (FX2)
+ fx2_clkin => tb_fx2_clkin, -- : inout std_logic;
+ fx2_clkio => tb_fx2_clkio, -- : inout std_logic;
+ fx2_clkout => tb_fx2_clkout, -- : inout std_logic;
+ fx2_io => tb_fx2_io, -- : inout std_logic_vector(40 downto 1);
+ -- Character LCD (LCD)
+ lcd_e => tb_lcd_e, -- : out std_logic;
+ lcd_rs => tb_lcd_rs, -- : out std_logic;
+ lcd_rw => tb_lcd_rw, -- : out std_logic;
+ -- LCD data connections are shared with StrataFlash connections SF_D<11:8>
+ -- PS/2 Mouse/Keyboard Port (PS2)
+ ps2_clk => tb_ps2_clk, -- : inout std_logic;
+ ps2_data => tb_ps2_data, -- : inout std_logic;
+ -- Rotary Pushbutton Switch (ROT)
+ rot_a => tb_rot_a, -- : in std_logic;
+ rot_b => tb_rot_b, -- : in std_logic;
+ rot_center => tb_rot_center, -- : in std_logic;
+ -- RS-232 Serial Ports (RS232)
+ rs232_dce_rxd => tb_rs232_dce_rxd, -- : in std_logic;
+ rs232_dce_txd => tb_rs232_dce_txd, -- : out std_logic;
+ rs232_dte_rxd => tb_rs232_dte_rxd, -- : in std_logic;
+ rs232_dte_txd => tb_rs232_dte_txd, -- : out std_logic;
+ -- DDR SDRAM (SD) (I/O Bank 3, VCCO=2.5V)
+ sd_a => tb_sd_a, -- : out std_logic_vector(12 downto 0);
+ sd_dq => tb_sd_dq, -- : inout std_logic_vector(15 downto 0);
+ sd_ba => tb_sd_ba, -- : out std_logic_vector(1 downto 0);
+ sd_ras => tb_sd_ras, -- : out std_logic;
+ sd_cas => tb_sd_cas, -- : out std_logic;
+ sd_we => tb_sd_we, -- : out std_logic;
+ sd_udm => tb_sd_udm, -- : out std_logic;
+ sd_ldm => tb_sd_ldm, -- : out std_logic;
+ sd_udqs => tb_sd_udqs, -- : inout std_logic;
+ sd_ldqs => tb_sd_ldqs, -- : inout std_logic;
+ sd_cs => tb_sd_cs, -- : out std_logic;
+ sd_cke => tb_sd_cke, -- : out std_logic;
+ sd_ck_n => tb_sd_ck_n, -- : out std_logic;
+ sd_ck_p => tb_sd_ck_p, -- : out std_logic;
+ -- Path to allow connection to top DCM connection
+ sd_ck_fb => tb_sd_ck_fb, -- : in std_logic;
+ -- Intel StrataFlash Parallel NOR Flash (SF)
+ sf_a => tb_sf_a, -- : out std_logic_vector(23 downto 0);
+ sf_byte => tb_sf_byte, -- : out std_logic;
+ sf_ce0 => tb_sf_ce0, -- : out std_logic;
+ sf_d => tb_sf_d, -- : inout std_logic_vector(15 downto 1);
+ sf_oe => tb_sf_oe, -- : out std_logic;
+ sf_sts => tb_sf_sts, -- : in std_logic;
+ sf_we => tb_sf_we, -- : out std_logic;
+ -- STMicro SPI serial Flash (SPI)
+ spi_mosi => tb_spi_mosi, -- : out std_logic;
+ spi_miso => tb_spi_miso, -- : in std_logic;
+ spi_sck => tb_spi_sck, -- : out std_logic;
+ spi_ss_b => tb_spi_ss_b, -- : out std_logic;
+ spi_alt_cs_jp11 => tb_spi_alt_cs_jp11, -- : out std_logic;
+ -- Slide Switches (SW)
+ sw => tb_sw, -- : in std_logic_vector(3 downto 0);
+ -- VGA Port (VGA)
+ vga_blue => tb_vga_blue, -- : out std_logic;
+ vga_green => tb_vga_green, -- : out std_logic;
+ vga_hsync => tb_vga_hsync, -- : out std_logic;
+ vga_red => tb_vga_red, -- : out std_logic;
+ vga_vsync => tb_vga_vsync, -- : out std_logic;
+ -- Xilinx CPLD (XC)
+ xc_cmd => tb_xc_cmd, -- : out std_logic_vector(1 downto 0);
+ xc_cpld_en => tb_xc_cpld_en, -- : out std_logic;
+ xc_d => tb_xc_d, -- : inout std_logic_vector(2 downto 0);
+ xc_trig => tb_xc_trig, -- : in std_logic;
+ xc_gck0 => tb_xc_gck0, -- : inout std_logic;
+ gclk10 => tb_gclk10 -- : inout std_logic
+ );
+
+
+ -- check for simulation stopping
+ process (tb_stop_simulation)
+ begin
+ if tb_stop_simulation = '1' then
+ report "Simulation end." severity note;
+ simulation_run <= false;
+ end if;
+ end process;
+
+
+end architecture testbench;
diff --git a/zpu/hdl/zealot/fpga/dmips_med1.vhdl b/zpu/hdl/zealot/fpga/dmips_med1.vhdl new file mode 100644 index 0000000..b95016c --- /dev/null +++ b/zpu/hdl/zealot/fpga/dmips_med1.vhdl @@ -0,0 +1,119 @@ +------------------------------------------------------------------------------ +---- ---- +---- ZPU Medium connection to the FPGA pins ---- +---- ---- +---- http://www.opencores.org/ ---- +---- ---- +---- Description: ---- +---- This module connects the ZPU_Med1 (zpu_med1.vhdl) core to a Spartan ---- +---- 3 1500 Xilinx FPGA available in the GR-XC3S board from Pender. ---- +---- ---- +---- To Do: ---- +---- - ---- +---- ---- +---- Author: ---- +---- - Salvador E. Tropea, salvador inti.gob.ar ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Copyright (c) 2008 Salvador E. Tropea <salvador inti.gob.ar> ---- +---- Copyright (c) 2008 Instituto Nacional de Tecnología Industrial ---- +---- ---- +---- Distributed under the GPL license ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Design unit: DMIPS_Med1(FPGA) (Entity and architecture) ---- +---- File name: dmips_med1.vhdl ---- +---- Note: None ---- +---- Limitations: None known ---- +---- Errors: None known ---- +---- Library: work ---- +---- Dependencies: IEEE.std_logic_1164 ---- +---- IEEE.numeric_std ---- +---- zpu.zpu_pkg ---- +---- Target FPGA: Spartan 3 (XC3S1500-4-FG456) ---- +---- Language: VHDL ---- +---- Wishbone: No ---- +---- Synthesis tools: Xilinx Release 9.2.03i - xst J.39 ---- +---- Simulation tools: N/A ---- +---- Text editor: SETEdit 0.5.x ---- +---- ---- +------------------------------------------------------------------------------ + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library zpu; +use zpu.zpupkg.all; + +entity DMIPS_Med1 is + generic( + WORD_SIZE : natural:=32; -- 32 bits data path + D_CARE_VAL : std_logic:='0'; -- Fill value, I got better results with it + CLK_FREQ : positive:=50; -- 50 MHz clock + BRATE : positive:=115200; -- RS-232 baudrate + ADDR_W : natural:=18; -- 18 bits address space=256 kB, 128 kB I/O + BRAM_W : natural:=15); -- 15 bits RAM space=32 kB + port( + clk_i : in std_logic; -- CPU clock + rst_i : in std_logic; -- Reset + rs232_tx_o : out std_logic; -- UART Tx + rs232_rx_i : in std_logic); -- UART Rx + + constant BRD_PB1_I : string:="D19"; -- SWITCH8==S2 + constant BRD_CLK1_I : string:="AA12"; -- 50 MHz clock + --constant BRD_CLK1_I : string:="AB12"; -- 40 MHz clock + -- UART: direct 1:1 cable + constant BRD_TX_O : string:="L4"; -- UART 1 (J1) TXD1 DB9 pin 2 + constant BRD_RX_I : string:="L3"; -- UART 1 (J1) RXD1 DB9 pin 3 + + ------------ + -- Pinout -- + ------------ + attribute LOC : string; + attribute IOSTANDARD : string; + constant IOSTD : string:="LVTTL"; + + attribute LOC of rst_i : signal is BRD_PB1_I; + attribute IOSTANDARD of rst_i : signal is IOSTD; + attribute LOC of clk_i : signal is BRD_CLK1_I; + attribute LOC of rs232_tx_o : signal is BRD_TX_O; + attribute IOSTANDARD of rs232_tx_o : signal is IOSTD; + attribute LOC of rs232_rx_i : signal is BRD_RX_I; + attribute IOSTANDARD of rs232_rx_i : signal is IOSTD; +end entity DMIPS_Med1; + +architecture FPGA of DMIPS_Med1 is + component ZPU_Med1 is + generic( + WORD_SIZE : natural:=32; -- 32 bits data path + D_CARE_VAL : std_logic:='X'; -- Fill value + CLK_FREQ : positive:=50; -- 50 MHz clock + BRATE : positive:=9600; -- RS232 baudrate + ADDR_W : natural:=18; -- 18 bits address space=256 kB, 128 kB I/O + BRAM_W : natural:=15); -- 15 bits RAM space=32 kB + port( + clk_i : in std_logic; -- CPU clock + rst_i : in std_logic; -- Reset + break_o : out std_logic; -- Break executed + dbg_o : out zpu_dbgo_t; -- Debug info + rs232_tx_o : out std_logic; -- UART Tx + rs232_rx_i : in std_logic; -- UART Rx + gpio_in : in std_logic_vector(31 downto 0); + gpio_out : out std_logic_vector(31 downto 0); + gpio_dir : out std_logic_vector(31 downto 0) -- 1 = in, 0 = out + ); + end component ZPU_Med1; +begin + zpu : ZPU_Med1 + generic map( + WORD_SIZE => WORD_SIZE, D_CARE_VAL => D_CARE_VAL, + CLK_FREQ => CLK_FREQ, BRATE => BRATE, ADDR_W => ADDR_W, + BRAM_W => BRAM_W) + port map( + clk_i => clk_i, rst_i => rst_i, rs232_tx_o => rs232_tx_o, + rs232_rx_i => rs232_rx_i, dbg_o => open, gpio_in => (others => '0')); +end architecture FPGA; -- Entity: DMIPS_Med1 + diff --git a/zpu/hdl/zealot/fpga/dmips_small1.vhdl b/zpu/hdl/zealot/fpga/dmips_small1.vhdl new file mode 100644 index 0000000..6edec00 --- /dev/null +++ b/zpu/hdl/zealot/fpga/dmips_small1.vhdl @@ -0,0 +1,120 @@ +------------------------------------------------------------------------------ +---- ---- +---- ZPU Small connection to the FPGA pins ---- +---- ---- +---- http://www.opencores.org/ ---- +---- ---- +---- Description: ---- +---- This module connects the ZPU_Small1 (zpu_small1.vhdl) core to a ---- +---- Spartan 3 1500 Xilinx FPGA available in the GR-XC3S board from ---- +---- Pender. ---- +---- ---- +---- To Do: ---- +---- - ---- +---- ---- +---- Author: ---- +---- - Salvador E. Tropea, salvador inti.gob.ar ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Copyright (c) 2008 Salvador E. Tropea <salvador inti.gob.ar> ---- +---- Copyright (c) 2008 Instituto Nacional de Tecnología Industrial ---- +---- ---- +---- Distributed under the GPL license ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Design unit: DMIPS_Small1(FPGA) (Entity and architecture) ---- +---- File name: dmips_small1.vhdl ---- +---- Note: None ---- +---- Limitations: None known ---- +---- Errors: None known ---- +---- Library: work ---- +---- Dependencies: IEEE.std_logic_1164 ---- +---- IEEE.numeric_std ---- +---- zpu.zpu_pkg ---- +---- Target FPGA: Spartan 3 (XC3S1500-4-FG456) ---- +---- Language: VHDL ---- +---- Wishbone: No ---- +---- Synthesis tools: Xilinx Release 9.2.03i - xst J.39 ---- +---- Simulation tools: N/A ---- +---- Text editor: SETEdit 0.5.x ---- +---- ---- +------------------------------------------------------------------------------ + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library zpu; +use zpu.zpupkg.all; + +entity DMIPS_Small1 is + generic( + WORD_SIZE : natural:=32; -- 32 bits data path + D_CARE_VAL : std_logic:='0'; -- Fill value, I got better results with it + CLK_FREQ : positive:=50; -- 50 MHz clock + BRATE : positive:=115200; -- RS-232 baudrate + ADDR_W : natural:=18; -- 18 bits address space=256 kB, 128 kB I/O + BRAM_W : natural:=15); -- 15 bits RAM space=32 kB + port( + clk_i : in std_logic; -- CPU clock + rst_i : in std_logic; -- Reset + rs232_tx_o : out std_logic; -- UART Tx + rs232_rx_i : in std_logic); -- UART Rx + + constant BRD_PB1_I : string:="D19"; -- SWITCH8==S2 + constant BRD_CLK1_I : string:="AA12"; -- 50 MHz clock + --constant BRD_CLK1_I : string:="AB12"; -- 40 MHz clock + -- UART: direct 1:1 cable + constant BRD_TX_O : string:="L4"; -- UART 1 (J1) TXD1 DB9 pin 2 + constant BRD_RX_I : string:="L3"; -- UART 1 (J1) RXD1 DB9 pin 3 + + ------------ + -- Pinout -- + ------------ + attribute LOC : string; + attribute IOSTANDARD : string; + constant IOSTD : string:="LVTTL"; + + attribute LOC of rst_i : signal is BRD_PB1_I; + attribute IOSTANDARD of rst_i : signal is IOSTD; + attribute LOC of clk_i : signal is BRD_CLK1_I; + attribute LOC of rs232_tx_o : signal is BRD_TX_O; + attribute IOSTANDARD of rs232_tx_o : signal is IOSTD; + attribute LOC of rs232_rx_i : signal is BRD_RX_I; + attribute IOSTANDARD of rs232_rx_i : signal is IOSTD; +end entity DMIPS_Small1; + +architecture FPGA of DMIPS_Small1 is + component ZPU_Small1 is + generic( + WORD_SIZE : natural:=32; -- 32 bits data path + D_CARE_VAL : std_logic:='0'; -- Fill value + CLK_FREQ : positive:=50; -- 50 MHz clock + BRATE : positive:=115200; -- RS232 baudrate + ADDR_W : natural:=16; -- 16 bits address space=64 kB, 32 kB I/O + BRAM_W : natural:=15); -- 15 bits RAM space=32 kB + port( + clk_i : in std_logic; -- CPU clock + rst_i : in std_logic; -- Reset + break_o : out std_logic; -- Break executed + dbg_o : out zpu_dbgo_t; -- Debug info + rs232_tx_o : out std_logic; -- UART Tx + rs232_rx_i : in std_logic; -- UART Rx + gpio_in : in std_logic_vector(31 downto 0); + gpio_out : out std_logic_vector(31 downto 0); + gpio_dir : out std_logic_vector(31 downto 0) -- 1 = in, 0 = out + ); + end component ZPU_Small1; +begin + zpu : ZPU_Small1 + generic map( + WORD_SIZE => WORD_SIZE, D_CARE_VAL => D_CARE_VAL, + CLK_FREQ => CLK_FREQ, BRATE => BRATE, ADDR_W => ADDR_W, + BRAM_W => BRAM_W) + port map( + clk_i => clk_i, rst_i => rst_i, rs232_tx_o => rs232_tx_o, + rs232_rx_i => rs232_rx_i, dbg_o => open, gpio_in => (others => '0')); +end architecture FPGA; -- Entity: DMIPS_Small1 + diff --git a/zpu/hdl/zealot/fpga/hello_med1.vhdl b/zpu/hdl/zealot/fpga/hello_med1.vhdl new file mode 100644 index 0000000..5ffea1f --- /dev/null +++ b/zpu/hdl/zealot/fpga/hello_med1.vhdl @@ -0,0 +1,119 @@ +------------------------------------------------------------------------------ +---- ---- +---- ZPU Medium connection to the FPGA pins ---- +---- ---- +---- http://www.opencores.org/ ---- +---- ---- +---- Description: ---- +---- This module connects the ZPU_Med1 (zpu_med1.vhdl) core to a Spartan ---- +---- 3 1500 Xilinx FPGA available in the GR-XC3S board from Pender. ---- +---- ---- +---- To Do: ---- +---- - ---- +---- ---- +---- Author: ---- +---- - Salvador E. Tropea, salvador inti.gob.ar ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Copyright (c) 2008 Salvador E. Tropea <salvador inti.gob.ar> ---- +---- Copyright (c) 2008 Instituto Nacional de Tecnología Industrial ---- +---- ---- +---- Distributed under the GPL license ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Design unit: Hello_Med1(FPGA) (Entity and architecture) ---- +---- File name: hello_med1.vhdl ---- +---- Note: None ---- +---- Limitations: None known ---- +---- Errors: None known ---- +---- Library: work ---- +---- Dependencies: IEEE.std_logic_1164 ---- +---- IEEE.numeric_std ---- +---- zpu.zpu_pkg ---- +---- Target FPGA: Spartan 3 (XC3S1500-4-FG456) ---- +---- Language: VHDL ---- +---- Wishbone: No ---- +---- Synthesis tools: Xilinx Release 9.2.03i - xst J.39 ---- +---- Simulation tools: N/A ---- +---- Text editor: SETEdit 0.5.x ---- +---- ---- +------------------------------------------------------------------------------ + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library zpu; +use zpu.zpupkg.all; + +entity Hello_Med1 is + generic( + WORD_SIZE : natural:=32; -- 32 bits data path + D_CARE_VAL : std_logic:='0'; -- Fill value, I got better results with it + CLK_FREQ : positive:=50; -- 50 MHz clock + BRATE : positive:=115200; -- RS-232 baudrate + ADDR_W : natural:=18; -- 18 bits address space=256 kB, 128 kB I/O + BRAM_W : natural:=14); -- 14 bits RAM space=16 kB + port( + clk_i : in std_logic; -- CPU clock + rst_i : in std_logic; -- Reset + rs232_tx_o : out std_logic; -- UART Tx + rs232_rx_i : in std_logic); -- UART Rx + + constant BRD_PB1_I : string:="D19"; -- SWITCH8==S2 + constant BRD_CLK1_I : string:="AA12"; -- 50 MHz clock + --constant BRD_CLK1_I : string:="AB12"; -- 40 MHz clock + -- UART: direct 1:1 cable + constant BRD_TX_O : string:="L4"; -- UART 1 (J1) TXD1 DB9 pin 2 + constant BRD_RX_I : string:="L3"; -- UART 1 (J1) RXD1 DB9 pin 3 + + ------------ + -- Pinout -- + ------------ + attribute LOC : string; + attribute IOSTANDARD : string; + constant IOSTD : string:="LVTTL"; + + attribute LOC of rst_i : signal is BRD_PB1_I; + attribute IOSTANDARD of rst_i : signal is IOSTD; + attribute LOC of clk_i : signal is BRD_CLK1_I; + attribute LOC of rs232_tx_o : signal is BRD_TX_O; + attribute IOSTANDARD of rs232_tx_o : signal is IOSTD; + attribute LOC of rs232_rx_i : signal is BRD_RX_I; + attribute IOSTANDARD of rs232_rx_i : signal is IOSTD; +end entity Hello_Med1; + +architecture FPGA of Hello_Med1 is + component ZPU_Med1 is + generic( + WORD_SIZE : natural:=32; -- 32 bits data path + D_CARE_VAL : std_logic:='X'; -- Fill value + CLK_FREQ : positive:=50; -- 50 MHz clock + BRATE : positive:=9600; -- RS232 baudrate + ADDR_W : natural:=18; -- 18 bits address space=256 kB, 128 kB I/O + BRAM_W : natural:=15); -- 15 bits RAM space=32 kB + port( + clk_i : in std_logic; -- CPU clock + rst_i : in std_logic; -- Reset + break_o : out std_logic; -- Break executed + dbg_o : out zpu_dbgo_t; -- Debug info + rs232_tx_o : out std_logic; -- UART Tx + rs232_rx_i : in std_logic; -- UART Rx + gpio_in : in std_logic_vector(31 downto 0); + gpio_out : out std_logic_vector(31 downto 0); + gpio_dir : out std_logic_vector(31 downto 0) -- 1 = in, 0 = out + ); + end component ZPU_Med1; +begin + zpu : ZPU_Med1 + generic map( + WORD_SIZE => WORD_SIZE, D_CARE_VAL => D_CARE_VAL, + CLK_FREQ => CLK_FREQ, BRATE => BRATE, ADDR_W => ADDR_W, + BRAM_W => BRAM_W) + port map( + clk_i => clk_i, rst_i => rst_i, rs232_tx_o => rs232_tx_o, + rs232_rx_i => rs232_rx_i, dbg_o => open, gpio_in => (others => '0')); +end architecture FPGA; -- Entity: Hello_Med1 + diff --git a/zpu/hdl/zealot/fpga/hello_small1.vhdl b/zpu/hdl/zealot/fpga/hello_small1.vhdl new file mode 100644 index 0000000..a7e2c21 --- /dev/null +++ b/zpu/hdl/zealot/fpga/hello_small1.vhdl @@ -0,0 +1,120 @@ +------------------------------------------------------------------------------ +---- ---- +---- ZPU Small connection to the FPGA pins ---- +---- ---- +---- http://www.opencores.org/ ---- +---- ---- +---- Description: ---- +---- This module connects the ZPU_Small1 (zpu_small1.vhdl) core to a ---- +---- Spartan 3 1500 Xilinx FPGA available in the GR-XC3S board from ---- +---- Pender. ---- +---- ---- +---- To Do: ---- +---- - ---- +---- ---- +---- Author: ---- +---- - Salvador E. Tropea, salvador inti.gob.ar ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Copyright (c) 2008 Salvador E. Tropea <salvador inti.gob.ar> ---- +---- Copyright (c) 2008 Instituto Nacional de Tecnología Industrial ---- +---- ---- +---- Distributed under the GPL license ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Design unit: Hello_Small1(FPGA) (Entity and architecture) ---- +---- File name: hello_small1.vhdl ---- +---- Note: None ---- +---- Limitations: None known ---- +---- Errors: None known ---- +---- Library: work ---- +---- Dependencies: IEEE.std_logic_1164 ---- +---- IEEE.numeric_std ---- +---- zpu.zpu_pkg ---- +---- Target FPGA: Spartan 3 (XC3S1500-4-FG456) ---- +---- Language: VHDL ---- +---- Wishbone: No ---- +---- Synthesis tools: Xilinx Release 9.2.03i - xst J.39 ---- +---- Simulation tools: N/A ---- +---- Text editor: SETEdit 0.5.x ---- +---- ---- +------------------------------------------------------------------------------ + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library zpu; +use zpu.zpupkg.all; + +entity Hello_Small1 is + generic( + WORD_SIZE : natural:=32; -- 32 bits data path + D_CARE_VAL : std_logic:='0'; -- Fill value, I got better results with it + CLK_FREQ : positive:=50; -- 50 MHz clock + BRATE : positive:=115200; -- RS-232 baudrate + ADDR_W : natural:=18; -- 18 bits address space=256 kB, 128 kB I/O + BRAM_W : natural:=14); -- 14 bits RAM space=16 kB + port( + clk_i : in std_logic; -- CPU clock + rst_i : in std_logic; -- Reset + rs232_tx_o : out std_logic; -- UART Tx + rs232_rx_i : in std_logic); -- UART Rx + + constant BRD_PB1_I : string:="D19"; -- SWITCH8==S2 + constant BRD_CLK1_I : string:="AA12"; -- 50 MHz clock + --constant BRD_CLK1_I : string:="AB12"; -- 40 MHz clock + -- UART: direct 1:1 cable + constant BRD_TX_O : string:="L4"; -- UART 1 (J1) TXD1 DB9 pin 2 + constant BRD_RX_I : string:="L3"; -- UART 1 (J1) RXD1 DB9 pin 3 + + ------------ + -- Pinout -- + ------------ + attribute LOC : string; + attribute IOSTANDARD : string; + constant IOSTD : string:="LVTTL"; + + attribute LOC of rst_i : signal is BRD_PB1_I; + attribute IOSTANDARD of rst_i : signal is IOSTD; + attribute LOC of clk_i : signal is BRD_CLK1_I; + attribute LOC of rs232_tx_o : signal is BRD_TX_O; + attribute IOSTANDARD of rs232_tx_o : signal is IOSTD; + attribute LOC of rs232_rx_i : signal is BRD_RX_I; + attribute IOSTANDARD of rs232_rx_i : signal is IOSTD; +end entity Hello_Small1; + +architecture FPGA of Hello_Small1 is + component ZPU_Small1 is + generic( + WORD_SIZE : natural:=32; -- 32 bits data path + D_CARE_VAL : std_logic:='0'; -- Fill value + CLK_FREQ : positive:=50; -- 50 MHz clock + BRATE : positive:=115200; -- RS232 baudrate + ADDR_W : natural:=16; -- 16 bits address space=64 kB, 32 kB I/O + BRAM_W : natural:=15); -- 15 bits RAM space=32 kB + port( + clk_i : in std_logic; -- CPU clock + rst_i : in std_logic; -- Reset + break_o : out std_logic; -- Break executed + dbg_o : out zpu_dbgo_t; -- Debug info + rs232_tx_o : out std_logic; -- UART Tx + rs232_rx_i : in std_logic; -- UART Rx + gpio_in : in std_logic_vector(31 downto 0); + gpio_out : out std_logic_vector(31 downto 0); + gpio_dir : out std_logic_vector(31 downto 0) -- 1 = in, 0 = out + ); + end component ZPU_Small1; +begin + zpu : ZPU_Small1 + generic map( + WORD_SIZE => WORD_SIZE, D_CARE_VAL => D_CARE_VAL, + CLK_FREQ => CLK_FREQ, BRATE => BRATE, ADDR_W => ADDR_W, + BRAM_W => BRAM_W) + port map( + clk_i => clk_i, rst_i => rst_i, rs232_tx_o => rs232_tx_o, + rs232_rx_i => rs232_rx_i, dbg_o => open, gpio_in => (others => '0')); +end architecture FPGA; -- Entity: Hello_Small1 + diff --git a/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/clean_up.sh b/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/clean_up.sh new file mode 100755 index 0000000..3855f16 --- /dev/null +++ b/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/clean_up.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +# ise build stuff +rm -rf build +rm -f top.bit + +# modelsim compile stuff +rm -rf work +rm -rf zpu + +# modelsim simulation stuff +rm -f vsim.wlf +rm -f transcript +rm -f zpu_trace.log +rm -f zpu_med1_io.log +rm -f zpu_small1_io.log diff --git a/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/simulation.sh b/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/simulation.sh new file mode 100755 index 0000000..d525737 --- /dev/null +++ b/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/simulation.sh @@ -0,0 +1,49 @@ +#!/bin/sh + +# need project files: +# run.do +# wave.do + +# need ModelSim tools: +# vlib +# vcom +# vsim + + +echo "###############" +echo "compile zpu lib" +echo "###############" +vlib zpu +vcom -work zpu ../../roms/hello_dbram.vhdl +vcom -work zpu ../../roms/hello_bram.vhdl +#vcom -work zpu ../../roms/dmips_dbram.vhdl +#vcom -work zpu ../../roms/dmips_bram.vhdl + +vcom -work zpu ../../roms/rom_pkg.vhdl +vcom -work zpu ../../zpu_pkg.vhdl +vcom -work zpu ../../zpu_small.vhdl +vcom -work zpu ../../zpu_medium.vhdl +vcom -work zpu ../../helpers/zpu_small1.vhdl +vcom -work zpu ../../helpers/zpu_med1.vhdl +vcom -work zpu ../../devices/txt_util.vhdl +vcom -work zpu ../../devices/phi_io.vhdl +vcom -work zpu ../../devices/timer.vhdl +vcom -work zpu ../../devices/gpio.vhdl +vcom -work zpu ../../devices/rx_unit.vhdl +vcom -work zpu ../../devices/tx_unit.vhdl +vcom -work zpu ../../devices/br_gen.vhdl +vcom -work zpu ../../devices/trace.vhdl + + +echo "################" +echo "compile work lib" +echo "################" +vlib work +vcom top.vhd +vcom top_tb.vhd + + +echo "###################" +echo "start simulator gui" +echo "###################" +vsim -gui top_tb -do simulation_config/run.do diff --git a/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/simulation_config/run.do b/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/simulation_config/run.do new file mode 100644 index 0000000..0d29e0a --- /dev/null +++ b/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/simulation_config/run.do @@ -0,0 +1,2 @@ +do wave.do
+run -all
diff --git a/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/simulation_config/wave.do b/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/simulation_config/wave.do new file mode 100644 index 0000000..6a3731d --- /dev/null +++ b/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/simulation_config/wave.do @@ -0,0 +1,163 @@ +onerror {resume}
+quietly WaveActivateNextPane {} 0
+add wave -noupdate /top_tb/simulation_run
+add wave -noupdate /top_tb/tb_cpu_reset
+add wave -noupdate /top_tb/tb_sysclk_n
+add wave -noupdate /top_tb/tb_sysclk_p
+add wave -noupdate /top_tb/tb_user_clock
+add wave -noupdate -divider <NULL>
+add wave -noupdate /top_tb/top_i0/clk
+add wave -noupdate -divider <NULL>
+add wave -noupdate /top_tb/tb_gpio_button
+add wave -noupdate /top_tb/tb_gpio_header_ls
+add wave -noupdate /top_tb/tb_gpio_led
+add wave -noupdate /top_tb/tb_gpio_switch
+add wave -noupdate -expand -group USB/RS232 /top_tb/tb_usb_1_cts
+add wave -noupdate -expand -group USB/RS232 /top_tb/tb_usb_1_rts
+add wave -noupdate -expand -group USB/RS232 /top_tb/tb_usb_1_rx
+add wave -noupdate -expand -group USB/RS232 /top_tb/tb_usb_1_tx
+add wave -noupdate -group DDR2 /top_tb/tb_ddr2_a
+add wave -noupdate -group DDR2 /top_tb/tb_ddr2_ba
+add wave -noupdate -group DDR2 /top_tb/tb_ddr2_cas_b
+add wave -noupdate -group DDR2 /top_tb/tb_ddr2_ras_b
+add wave -noupdate -group DDR2 /top_tb/tb_ddr2_we_b
+add wave -noupdate -group DDR2 /top_tb/tb_ddr2_cke
+add wave -noupdate -group DDR2 /top_tb/tb_ddr2_clk_n
+add wave -noupdate -group DDR2 /top_tb/tb_ddr2_clk_p
+add wave -noupdate -group DDR2 /top_tb/tb_ddr2_dq
+add wave -noupdate -group DDR2 /top_tb/tb_ddr2_ldm
+add wave -noupdate -group DDR2 /top_tb/tb_ddr2_udm
+add wave -noupdate -group DDR2 /top_tb/tb_ddr2_ldqs_n
+add wave -noupdate -group DDR2 /top_tb/tb_ddr2_ldqs_p
+add wave -noupdate -group DDR2 /top_tb/tb_ddr2_udqs_n
+add wave -noupdate -group DDR2 /top_tb/tb_ddr2_udqs_p
+add wave -noupdate -group DDR2 /top_tb/tb_ddr2_odt
+add wave -noupdate -group {Flash memory} /top_tb/tb_flash_a
+add wave -noupdate -group {Flash memory} /top_tb/tb_flash_d
+add wave -noupdate -group {Flash memory} /top_tb/tb_fpga_d0_din_miso_miso1
+add wave -noupdate -group {Flash memory} /top_tb/tb_fpga_d1_miso2
+add wave -noupdate -group {Flash memory} /top_tb/tb_fpga_d2_miso3
+add wave -noupdate -group {Flash memory} /top_tb/tb_flash_we_b
+add wave -noupdate -group {Flash memory} /top_tb/tb_flash_oe_b
+add wave -noupdate -group {Flash memory} /top_tb/tb_flash_ce_b
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_clk0_m2c_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_clk0_m2c_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_clk1_m2c_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_clk1_m2c_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_iic_scl_main
+add wave -noupdate -group {FMC connector} /top_tb/tb_iic_sda_main
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la00_cc_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la00_cc_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la01_cc_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la01_cc_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la02_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la02_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la03_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la03_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la04_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la04_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la05_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la05_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la06_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la06_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la07_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la07_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la08_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la08_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la09_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la09_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la10_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la10_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la11_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la11_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la12_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la12_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la13_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la13_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la14_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la14_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la15_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la15_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la16_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la16_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la17_cc_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la17_cc_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la18_cc_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la18_cc_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la19_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la19_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la20_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la20_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la21_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la21_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la22_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la22_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la23_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la23_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la24_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la24_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la25_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la25_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la26_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la26_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la27_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la27_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la28_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la28_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la29_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la29_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la30_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la30_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la31_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la31_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la32_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la32_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la33_n
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_la33_p
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_prsnt_m2c_l
+add wave -noupdate -group {FMC connector} /top_tb/tb_fmc_pwr_good_flash_rst_b
+add wave -noupdate -group {special FPGA pins} /top_tb/tb_fpga_awake
+add wave -noupdate -group {special FPGA pins} /top_tb/tb_fpga_cclk
+add wave -noupdate -group {special FPGA pins} /top_tb/tb_fpga_cmp_clk
+add wave -noupdate -group {special FPGA pins} /top_tb/tb_fpga_cmp_mosi
+add wave -noupdate -group {special FPGA pins} /top_tb/tb_fpga_hswapen
+add wave -noupdate -group {special FPGA pins} /top_tb/tb_fpga_init_b
+add wave -noupdate -group {special FPGA pins} /top_tb/tb_fpga_m0_cmp_miso
+add wave -noupdate -group {special FPGA pins} /top_tb/tb_fpga_m1
+add wave -noupdate -group {special FPGA pins} /top_tb/tb_fpga_mosi_csi_b_miso0
+add wave -noupdate -group {special FPGA pins} /top_tb/tb_fpga_onchip_term1
+add wave -noupdate -group {special FPGA pins} /top_tb/tb_fpga_onchip_term2
+add wave -noupdate -group {special FPGA pins} /top_tb/tb_fpga_vtemp
+add wave -noupdate -group {special FPGA pins} /top_tb/tb_spi_cs_b
+add wave -noupdate -group {Ethernet phy} /top_tb/tb_phy_col
+add wave -noupdate -group {Ethernet phy} /top_tb/tb_phy_crs
+add wave -noupdate -group {Ethernet phy} /top_tb/tb_phy_int
+add wave -noupdate -group {Ethernet phy} /top_tb/tb_phy_mdc
+add wave -noupdate -group {Ethernet phy} /top_tb/tb_phy_mdio
+add wave -noupdate -group {Ethernet phy} /top_tb/tb_phy_reset
+add wave -noupdate -group {Ethernet phy} /top_tb/tb_phy_rxclk
+add wave -noupdate -group {Ethernet phy} /top_tb/tb_phy_rxctl_rxdv
+add wave -noupdate -group {Ethernet phy} /top_tb/tb_phy_rxd
+add wave -noupdate -group {Ethernet phy} /top_tb/tb_phy_rxer
+add wave -noupdate -group {Ethernet phy} /top_tb/tb_phy_txclk
+add wave -noupdate -group {Ethernet phy} /top_tb/tb_phy_txctl_txen
+add wave -noupdate -group {Ethernet phy} /top_tb/tb_phy_txc_gtxclk
+add wave -noupdate -group {Ethernet phy} /top_tb/tb_phy_txd
+add wave -noupdate -group {Ethernet phy} /top_tb/tb_phy_txer
+TreeUpdate [SetDefaultTree]
+WaveRestoreCursors {{Cursor 1} {1393701250 ps} 0} {{Cursor 2} {138750 ps} 0}
+configure wave -namecolwidth 150
+configure wave -valuecolwidth 100
+configure wave -justifyvalue left
+configure wave -signalnamewidth 1
+configure wave -snapdistance 10
+configure wave -datasetprefix 0
+configure wave -rowmargin 4
+configure wave -childrowmargin 2
+configure wave -gridoffset 0
+configure wave -gridperiod 1
+configure wave -griddelta 40
+configure wave -timeline 0
+configure wave -timelineunits ns
+update
+WaveRestoreZoom {0 ps} {327615 ps}
diff --git a/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/synthesis.sh b/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/synthesis.sh new file mode 100755 index 0000000..2f89415 --- /dev/null +++ b/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/synthesis.sh @@ -0,0 +1,36 @@ +#!/bin/sh + +# need project files: +# top.xst +# top.prj +# top.ut + +# need Xilinx tools: +# xst +# ngdbuild +# map +# par +# trce +# bitgen + +echo "########################" +echo "generate build directory" +echo "########################" +mkdir build +cd build +mkdir tmp + +echo "###############" +echo "start processes" +echo "###############" +xst -ifn "../synthesis_config/top.xst" -ofn "top.syr" +ngdbuild -dd _ngo -nt timestamp -uc ../synthesis_config/xilinx-sp601-xc6slx16.ucf -p xc6slx16-csg324-2 top.ngc top.ngd +map -p xc6slx16-csg324-2 -w -logic_opt off -ol high -t 1 -xt 0 -register_duplication off -global_opt off -mt off -ir off -pr off -lc off -power off -o top_map.ncd top.ngd top.pcf +par -ol high -mt off top_map.ncd -w top.ncd top.pcf +trce -v 3 -s 2 -n 3 -fastpaths -xml top.twx top.ncd -o top.twr top.pcf +bitgen -f ../synthesis_config/top.ut top.ncd + +echo "###########" +echo "get bitfile" +echo "###########" +cp top.bit .. diff --git a/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/synthesis_config/top.prj b/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/synthesis_config/top.prj new file mode 100644 index 0000000..965ae4c --- /dev/null +++ b/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/synthesis_config/top.prj @@ -0,0 +1,19 @@ +vhdl work ../top.vhd
+vhdl zpu ../../../zpu_pkg.vhdl
+vhdl zpu ../../../zpu_small.vhdl
+vhdl zpu ../../../zpu_medium.vhdl
+vhdl zpu ../../../roms/rom_pkg.vhdl
+#vhdl zpu ../../../roms/hello_dbram.vhdl
+#vhdl zpu ../../../roms/hello_bram.vhdl
+vhdl zpu ../../../roms/dmips_dbram.vhdl
+vhdl zpu ../../../roms/dmips_bram.vhdl
+vhdl zpu ../../../helpers/zpu_small1.vhdl
+vhdl zpu ../../../helpers/zpu_med1.vhdl
+vhdl zpu ../../../devices/txt_util.vhdl
+vhdl zpu ../../../devices/phi_io.vhdl
+vhdl zpu ../../../devices/timer.vhdl
+vhdl zpu ../../../devices/gpio.vhdl
+vhdl zpu ../../../devices/rx_unit.vhdl
+vhdl zpu ../../../devices/tx_unit.vhdl
+vhdl zpu ../../../devices/br_gen.vhdl
+vhdl zpu ../../../devices/trace.vhdl
diff --git a/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/synthesis_config/top.ut b/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/synthesis_config/top.ut new file mode 100644 index 0000000..be56902 --- /dev/null +++ b/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/synthesis_config/top.ut @@ -0,0 +1,30 @@ +-w
+-g DebugBitstream:No
+-g Binary:no
+-g CRC:Enable
+-g Reset_on_err:No
+-g ConfigRate:2
+-g ProgPin:PullUp
+-g TckPin:PullUp
+-g TdiPin:PullUp
+-g TdoPin:PullUp
+-g TmsPin:PullUp
+-g UnusedPin:PullDown
+-g UserID:0xFFFFFFFF
+-g ExtMasterCclk_en:No
+-g SPI_buswidth:1
+-g TIMER_CFG:0xFFFF
+-g multipin_wakeup:No
+-g StartUpClk:CClk
+-g DONE_cycle:4
+-g GTS_cycle:5
+-g GWE_cycle:6
+-g LCK_cycle:NoWait
+-g Security:None
+-g DonePipe:No
+-g DriveDone:No
+-g en_sw_gsr:No
+-g drive_awake:No
+-g sw_clk:Startupclk
+-g sw_gwe_cycle:5
+-g sw_gts_cycle:4
diff --git a/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/synthesis_config/top.xst b/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/synthesis_config/top.xst new file mode 100644 index 0000000..ddddddd --- /dev/null +++ b/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/synthesis_config/top.xst @@ -0,0 +1,53 @@ +set -tmpdir "tmp"
+set -xsthdpdir "xst"
+run
+-ifn ../synthesis_config/top.prj
+-ifmt mixed
+-ofn top
+-ofmt NGC
+-p xc6slx16-2-csg324
+-top top
+-opt_mode Speed
+-opt_level 1
+-power NO
+-iuc NO
+-keep_hierarchy No
+-netlist_hierarchy As_Optimized
+-rtlview Yes
+-glob_opt AllClockNets
+-read_cores YES
+-write_timing_constraints NO
+-cross_clock_analysis NO
+-hierarchy_separator /
+-bus_delimiter <>
+-case Maintain
+-slice_utilization_ratio 100
+-bram_utilization_ratio 100
+-dsp_utilization_ratio 100
+-lc Auto
+-reduce_control_sets Auto
+-fsm_extract YES -fsm_encoding Auto
+-safe_implementation No
+-fsm_style LUT
+-ram_extract Yes
+-ram_style Auto
+-rom_extract Yes
+-shreg_extract YES
+-rom_style Auto
+-auto_bram_packing NO
+-resource_sharing YES
+-async_to_sync NO
+-shreg_min_size 2
+-use_dsp48 Auto
+-iobuf YES
+-max_fanout 100000
+-bufg 16
+-register_duplication YES
+-register_balancing No
+-optimize_primitives NO
+-use_clock_enable Auto
+-use_sync_set Auto
+-use_sync_reset Auto
+-iob Auto
+-equivalent_register_removal YES
+-slice_utilization_ratio_maxmargin 5
diff --git a/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/synthesis_config/xilinx-sp601-xc6slx16.ucf b/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/synthesis_config/xilinx-sp601-xc6slx16.ucf new file mode 100644 index 0000000..a0c60e7 --- /dev/null +++ b/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/synthesis_config/xilinx-sp601-xc6slx16.ucf @@ -0,0 +1,303 @@ +############################################################
+# SPARTAN-6 SP601 Board Constraints File
+#
+# Family: Spartan6
+# Device: XC6SLX16
+# Package: CSG324
+# Speed: -2
+#
+#
+# Bank Voltage
+# Bank 0: 2.5 V
+# Bank 1: 2.5 V
+# Bank 2: 2.5 V
+# Bank 3: 1.8 V
+# VCCAUX: 2.5 V
+
+# following pins are connected to VCC1V8/2:
+# N3, M5, C1
+
+
+############################################################
+## clock/timing constraints
+############################################################
+
+TIMESPEC "TS_SYSCLK" = PERIOD "SYSCLK" 200 MHz HIGH 50 %;
+TIMESPEC "TS_USER_SMA_CLOCK" = PERIOD "USER_SMA_CLOCK" 50 MHz HIGH 50 %;
+NET "USER_CLOCK" PERIOD = 27 MHz HIGH 40%;
+
+
+############################################################
+## pin placement constraints
+############################################################
+
+NET "CPU_RESET" LOC = "N4";
+
+## 128 MB DDR2 Component Memory
+NET "DDR2_A<12>" LOC ="G6"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_A<11>" LOC ="D3"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_A<10>" LOC ="F4"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_A<9>" LOC ="D1"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_A<8>" LOC ="D2"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_A<7>" LOC ="H6"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_A<6>" LOC ="H3"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_A<5>" LOC ="H4"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_A<4>" LOC ="F3"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_A<3>" LOC ="L7"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_A<2>" LOC ="H5"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_A<1>" LOC ="J6"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_A<0>" LOC ="J7"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_DQ<15>" LOC ="U1"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_DQ<14>" LOC ="U2"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_DQ<13>" LOC ="T1"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_DQ<12>" LOC ="T2"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_DQ<11>" LOC ="N1"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_DQ<10>" LOC ="N2"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_DQ<9>" LOC ="M1"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_DQ<8>" LOC ="M3"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_DQ<7>" LOC ="J1"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_DQ<6>" LOC ="J3"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_DQ<5>" LOC ="H1"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_DQ<4>" LOC ="H2"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_DQ<3>" LOC ="K1"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_DQ<2>" LOC ="K2"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_DQ<1>" LOC ="L1"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_DQ<0>" LOC ="L2"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_WE_B" LOC ="E3"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_UDQS_P" LOC ="P2"; # | IOSTANDARD = DIFF_SSTL18_II;
+NET "DDR2_UDQS_N" LOC ="P1"; # | IOSTANDARD = DIFF_SSTL18_II;
+NET "DDR2_UDM" LOC ="K4"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_RAS_B" LOC ="L5"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_ODT" LOC ="K6"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_LDQS_P" LOC ="L4"; # | IOSTANDARD = DIFF_SSTL18_II;
+NET "DDR2_LDQS_N" LOC ="L3"; # | IOSTANDARD = DIFF_SSTL18_II;
+NET "DDR2_LDM" LOC ="K3"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_CLK_P" LOC ="G3"; # | IOSTANDARD = DIFF_SSTL18_II;
+NET "DDR2_CLK_N" LOC ="G1"; # | IOSTANDARD = DIFF_SSTL18_II;
+NET "DDR2_CKE" LOC ="H7"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_CAS_B" LOC ="K5"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_BA<2>" LOC ="E1"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_BA<1>" LOC ="F1"; # | IOSTANDARD = SSTL18_II ;
+NET "DDR2_BA<0>" LOC ="F2"; # | IOSTANDARD = SSTL18_II ;
+
+## Flash Memory
+NET "FLASH_A<0>" LOC = "K18";
+NET "FLASH_A<1>" LOC = "K17";
+NET "FLASH_A<2>" LOC = "J18";
+NET "FLASH_A<3>" LOC = "J16";
+NET "FLASH_A<4>" LOC = "G18";
+NET "FLASH_A<5>" LOC = "G16";
+NET "FLASH_A<6>" LOC = "H16";
+NET "FLASH_A<7>" LOC = "H15";
+NET "FLASH_A<8>" LOC = "H14";
+NET "FLASH_A<9>" LOC = "H13";
+NET "FLASH_A<10>" LOC = "F18";
+NET "FLASH_A<11>" LOC = "F17";
+NET "FLASH_A<12>" LOC = "K13";
+NET "FLASH_A<13>" LOC = "K12";
+NET "FLASH_A<14>" LOC = "E18";
+NET "FLASH_A<15>" LOC = "E16";
+NET "FLASH_A<16>" LOC = "G13";
+NET "FLASH_A<17>" LOC = "H12";
+NET "FLASH_A<18>" LOC = "D18";
+NET "FLASH_A<19>" LOC = "D17";
+NET "FLASH_A<20>" LOC = "G14";
+NET "FLASH_A<21>" LOC = "F14";
+NET "FLASH_A<22>" LOC = "C18";
+NET "FLASH_A<23>" LOC = "C17";
+NET "FLASH_A<24>" LOC = "F16";
+#NET "FLASH_D<0>" LOC = "R13" | SLEW = "SLOW" | DRIVE = 2;
+#NET "FLASH_D<1>" LOC = "T14" | SLEW = "SLOW" | DRIVE = 2;
+#NET "FLASH_D<2>" LOC = "V14" | SLEW = "SLOW" | DRIVE = 2;
+NET "FLASH_D<3>" LOC = "U5" | SLEW = "SLOW" | DRIVE = 2;
+NET "FLASH_D<4>" LOC = "V5" | SLEW = "SLOW" | DRIVE = 2;
+NET "FLASH_D<5>" LOC = "R3" | SLEW = "SLOW" | DRIVE = 2;
+NET "FLASH_D<6>" LOC = "T3" | SLEW = "SLOW" | DRIVE = 2;
+NET "FLASH_D<7>" LOC = "R5" | SLEW = "SLOW" | DRIVE = 2;
+NET "FLASH_OE_B" LOC = "L18";
+NET "FLASH_WE_B" LOC = "M16";
+NET "FLASH_CE_B" LOC = "L17";
+
+# FMC-Connector, Bank 0,2 (M2C = Mezzanine to Carrier, C2M = Carrier to Mezzanine)
+NET "FMC_CLK0_M2C_N" LOC = "A10";
+NET "FMC_CLK0_M2C_P" LOC = "C10";
+NET "FMC_CLK1_M2C_N" LOC = "V9" ;
+NET "FMC_CLK1_M2C_P" LOC = "T9" ;
+NET "FMC_LA00_CC_N" LOC = "C9" ;
+NET "FMC_LA00_CC_P" LOC = "D9" ;
+NET "FMC_LA01_CC_N" LOC = "C11";
+NET "FMC_LA01_CC_P" LOC = "D11";
+NET "FMC_LA02_N" LOC = "A15";
+NET "FMC_LA02_P" LOC = "C15";
+NET "FMC_LA03_N" LOC = "A13";
+NET "FMC_LA03_P" LOC = "C13";
+NET "FMC_LA04_N" LOC = "A16";
+NET "FMC_LA04_P" LOC = "B16";
+NET "FMC_LA05_N" LOC = "A14";
+NET "FMC_LA05_P" LOC = "B14";
+NET "FMC_LA06_N" LOC = "C12";
+NET "FMC_LA06_P" LOC = "D12";
+NET "FMC_LA07_N" LOC = "E8" ;
+NET "FMC_LA07_P" LOC = "E7" ;
+NET "FMC_LA08_N" LOC = "E11";
+NET "FMC_LA08_P" LOC = "F11";
+NET "FMC_LA09_N" LOC = "F10";
+NET "FMC_LA09_P" LOC = "G11";
+NET "FMC_LA10_N" LOC = "C8" ;
+NET "FMC_LA10_P" LOC = "D8" ;
+NET "FMC_LA11_N" LOC = "A12";
+NET "FMC_LA11_P" LOC = "B12";
+NET "FMC_LA12_N" LOC = "C6" ;
+NET "FMC_LA12_P" LOC = "D6" ;
+NET "FMC_LA13_N" LOC = "A11";
+NET "FMC_LA13_P" LOC = "B11";
+NET "FMC_LA14_N" LOC = "A2" ;
+NET "FMC_LA14_P" LOC = "B2" ;
+NET "FMC_LA15_N" LOC = "F9" ;
+NET "FMC_LA15_P" LOC = "G9" ;
+NET "FMC_LA16_N" LOC = "A7" ;
+NET "FMC_LA16_P" LOC = "C7" ;
+NET "FMC_LA17_CC_N" LOC = "T8" ;
+NET "FMC_LA17_CC_P" LOC = "R8" ;
+NET "FMC_LA18_CC_N" LOC = "T10";
+NET "FMC_LA18_CC_P" LOC = "R10";
+NET "FMC_LA19_N" LOC = "P7" ;
+NET "FMC_LA19_P" LOC = "N6" ;
+NET "FMC_LA20_N" LOC = "P8" ;
+NET "FMC_LA20_P" LOC = "N7" ;
+NET "FMC_LA21_N" LOC = "V4" ;
+NET "FMC_LA21_P" LOC = "T4" ;
+NET "FMC_LA22_N" LOC = "T7" ;
+NET "FMC_LA22_P" LOC = "R7" ;
+NET "FMC_LA23_N" LOC = "P6" ;
+NET "FMC_LA23_P" LOC = "N5" ;
+NET "FMC_LA24_N" LOC = "V8" ;
+NET "FMC_LA24_P" LOC = "U8" ;
+NET "FMC_LA25_N" LOC = "N11";
+NET "FMC_LA25_P" LOC = "M11";
+NET "FMC_LA26_N" LOC = "V7" ;
+NET "FMC_LA26_P" LOC = "U7" ;
+NET "FMC_LA27_N" LOC = "T11";
+NET "FMC_LA27_P" LOC = "R11";
+NET "FMC_LA28_N" LOC = "V11";
+NET "FMC_LA28_P" LOC = "U11";
+NET "FMC_LA29_N" LOC = "N8" ;
+NET "FMC_LA29_P" LOC = "M8" ;
+NET "FMC_LA30_N" LOC = "V12";
+NET "FMC_LA30_P" LOC = "T12";
+NET "FMC_LA31_N" LOC = "V6" ;
+NET "FMC_LA31_P" LOC = "T6" ;
+NET "FMC_LA32_N" LOC = "V15";
+NET "FMC_LA32_P" LOC = "U15";
+NET "FMC_LA33_N" LOC = "N9" ;
+NET "FMC_LA33_P" LOC = "M10";
+NET "FMC_PRSNT_M2C_L" LOC = "U13";
+NET "FMC_PWR_GOOD_FLASH_RST_B" LOC = "B3";
+
+# special FPGA pins
+NET "FPGA_AWAKE" LOC = "P15"| SLEW = SLOW | DRIVE = 2;
+NET "FPGA_CCLK" LOC = "R15";
+NET "FPGA_CMP_CLK" LOC = "U16";
+NET "FPGA_CMP_MOSI" LOC = "V16";
+NET "FPGA_D0_DIN_MISO_MISO1" LOC = "R13" | DRIVE = 4; ## 8 on U17 (thru series R187 100 ohm), 33 on U10, 6 on J12
+NET "FPGA_D1_MISO2" LOC = "T14" | DRIVE = 4; ## 9 on U17 (thru series R186 100 ohm), 35 on U10, 3 on J12
+NET "FPGA_D2_MISO3" LOC = "V14" | DRIVE = 4; ## 1 on U17, 38 on U10, 2 on J12
+NET "FPGA_HSWAPEN" LOC = "D4";
+NET "FPGA_INIT_B" LOC = "U3" | SLEW = SLOW | DRIVE = 4;
+NET "FPGA_M0_CMP_MISO" LOC = "T15";
+NET "FPGA_M1" LOC = "N12";
+NET "FPGA_MOSI_CSI_B_MISO0" LOC = "T13" | DRIVE = 4;
+NET "FPGA_ONCHIP_TERM1" LOC = "L6";
+NET "FPGA_ONCHIP_TERM2" LOC = "C2";
+NET "FPGA_VTEMP" LOC = "P3";
+
+## Pushbuttons, Bank 3, external Pulldown
+NET "GPIO_BUTTON<0>" LOC = "P4" ;
+NET "GPIO_BUTTON<1>" LOC = "F6" ;
+NET "GPIO_BUTTON<2>" LOC = "E4" ;
+NET "GPIO_BUTTON<3>" LOC = "F5" ;
+NET "GPIO_BUTTON*" TIG;
+
+## 8 Pin GPIO Header J13, Bank 0,1,2
+NET "GPIO_HEADER_LS<0>" LOC = "N17"| SLEW = SLOW | DRIVE = 4 ;
+NET "GPIO_HEADER_LS<1>" LOC = "M18"| SLEW = SLOW | DRIVE = 4 ;
+NET "GPIO_HEADER_LS<2>" LOC = "A3" | SLEW = SLOW | DRIVE = 4 ;
+NET "GPIO_HEADER_LS<3>" LOC = "L15"| SLEW = SLOW | DRIVE = 4 ;
+NET "GPIO_HEADER_LS<4>" LOC = "F15"| SLEW = SLOW | DRIVE = 4 ;
+NET "GPIO_HEADER_LS<5>" LOC = "B4" | SLEW = SLOW | DRIVE = 4 ;
+NET "GPIO_HEADER_LS<6>" LOC = "F13"| SLEW = SLOW | DRIVE = 4 ;
+NET "GPIO_HEADER_LS<7>" LOC = "P12"| SLEW = SLOW | DRIVE = 4 ;
+
+## 4 GPIO LEDs, Bank 0
+NET "GPIO_LED<0>" LOC = "E13"| SLEW = SLOW | DRIVE = 4 ;
+NET "GPIO_LED<1>" LOC = "C14"| SLEW = SLOW | DRIVE = 4 ;
+NET "GPIO_LED<2>" LOC = "C4" | SLEW = SLOW | DRIVE = 4 ;
+NET "GPIO_LED<3>" LOC = "A4" | SLEW = SLOW | DRIVE = 4 ;
+NET "GPIO_LED*" TIG;
+
+## GPIO Dip Switches, Bank 0,2, external Pulldown
+NET "GPIO_SWITCH<0>" LOC = "D14";
+NET "GPIO_SWITCH<1>" LOC = "E12";
+NET "GPIO_SWITCH<2>" LOC = "F12";
+NET "GPIO_SWITCH<3>" LOC = "V13";
+NET "GPIO_SWITCH*" TIG;
+
+## IIC Bus
+NET "IIC_SCL_MAIN" LOC = "P11";
+NET "IIC_SDA_MAIN" LOC = "N10";
+
+## 10/100/1000 Tri-Speed Ethernet PHY
+NET "PHY_COL" LOC = "L14";
+NET "PHY_CRS" LOC = "M13";
+NET "PHY_INT" LOC = "J13";
+NET "PHY_MDC" LOC = "N14" | SLEW = SLOW | DRIVE = 4;
+NET "PHY_MDIO" LOC = "P16" | SLEW = SLOW | DRIVE = 4;
+NET "PHY_RESET" LOC = "L13";
+NET "PHY_RXCLK" LOC = "L16";
+NET "PHY_RXCTL_RXDV" LOC = "N18";
+NET "PHY_RXD<0>" LOC = "M14";
+NET "PHY_RXD<1>" LOC = "U18";
+NET "PHY_RXD<2>" LOC = "U17";
+NET "PHY_RXD<3>" LOC = "T18";
+NET "PHY_RXD<4>" LOC = "T17";
+NET "PHY_RXD<5>" LOC = "N16";
+NET "PHY_RXD<6>" LOC = "N15";
+NET "PHY_RXD<7>" LOC = "P18";
+NET "PHY_RXER" LOC = "P17";
+NET "PHY_TXCLK" LOC = "B9" ;
+NET "PHY_TXCTL_TXEN" LOC = "B8" | SLEW = SLOW | DRIVE = 4;
+NET "PHY_TXC_GTXCLK" LOC = "A9" ;
+NET "PHY_TXD<0>" LOC = "F8" | SLEW = SLOW | DRIVE = 4;
+NET "PHY_TXD<1>" LOC = "G8" | SLEW = SLOW | DRIVE = 4;
+NET "PHY_TXD<2>" LOC = "A6" | SLEW = SLOW | DRIVE = 4;
+NET "PHY_TXD<3>" LOC = "B6" | SLEW = SLOW | DRIVE = 4;
+NET "PHY_TXD<4>" LOC = "E6" | SLEW = SLOW | DRIVE = 4;
+NET "PHY_TXD<5>" LOC = "F7" | SLEW = SLOW | DRIVE = 4;
+NET "PHY_TXD<6>" LOC = "A5" | SLEW = SLOW | DRIVE = 4;
+NET "PHY_TXD<7>" LOC = "C5" | SLEW = SLOW | DRIVE = 4;
+NET "PHY_TXER" LOC = "A8" | SLEW = SLOW | DRIVE = 4;
+
+## SPI x4 Flash
+NET "SPI_CS_B" LOC = "V3";
+
+## 200 MHz oscillator (differential)
+NET "SYSCLK_N" LOC = "K16"| IOSTANDARD = LVDS_33 | TNM_NET = "SYSCLK";
+NET "SYSCLK_P" LOC = "K15"| IOSTANDARD = LVDS_33 | TNM_NET = "SYSCLK";
+
+## USB-UART
+## this names are real net names
+NET "USB_1_CTS" LOC = "U10"| DRIVE = 4 | SLEW = SLOW; # RTS output
+NET "USB_1_RTS" LOC = "T5" ; # CTS input
+NET "USB_1_RX" LOC = "L12"| DRIVE = 4 | SLEW = SLOW; # TX data out
+NET "USB_1_TX" LOC = "K14"; # RX data in
+
+## 27 MHz
+NET "USER_CLOCK" LOC = "V10"| IOSTANDARD = LVCMOS33 ;
+##
+NET "USER_SMA_CLOCK_N" LOC = "H18"| TNM_NET = "USER_SMA_CLOCK";
+NET "USER_SMA_CLOCK_P" LOC = "H17"| TNM_NET = "USER_SMA_CLOCK";
+
+# pins used for voltage termination
+CONFIG PROHIBIT = C1;
+CONFIG PROHIBIT = M5;
+CONFIG PROHIBIT = N3;
diff --git a/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/top.vhd b/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/top.vhd new file mode 100644 index 0000000..27d158f --- /dev/null +++ b/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/top.vhd @@ -0,0 +1,574 @@ +-- top module of
+-- SP601 evaluation board
+--
+-- using following external connections:
+--
+-- cpu_reset (SW9) reset
+-- LEDs output
+-- USB_UART communication
+--
+
+
+library ieee;
+use ieee.std_logic_1164.all;
+
+library zpu;
+use zpu.zpupkg.all; -- zpu_dbgo_t
+
+library unisim;
+use unisim.vcomponents.ibufgds;
+use unisim.vcomponents.dcm_sp;
+
+
+entity top is
+ port (
+ -- pragma translate_off
+ stop_simulation : out std_logic;
+ -- pragma translate_on
+ --
+ cpu_reset : in std_logic; -- SW9 pushbutton (active-high)
+ --
+ -- DDR2 memory 128 MB
+ ddr2_a : out std_logic_vector(12 downto 0);
+ ddr2_ba : out std_logic_vector(2 downto 0);
+ ddr2_cas_b : out std_logic;
+ ddr2_ras_b : out std_logic;
+ ddr2_we_b : out std_logic;
+ ddr2_cke : out std_logic;
+ ddr2_clk_n : out std_logic;
+ ddr2_clk_p : out std_logic;
+ ddr2_dq : inout std_logic_vector(15 downto 0);
+ ddr2_ldm : out std_logic;
+ ddr2_udm : out std_logic;
+ ddr2_ldqs_n : inout std_logic;
+ ddr2_ldqs_p : inout std_logic;
+ ddr2_udqs_n : inout std_logic;
+ ddr2_udqs_p : inout std_logic;
+ ddr2_odt : out std_logic;
+ --
+ -- flash memory
+ flash_a : out std_logic_vector(24 downto 0);
+ flash_d : inout std_logic_vector(7 downto 3);
+ --
+ fpga_d0_din_miso_miso1 : inout std_logic; -- dual use
+ fpga_d1_miso2 : inout std_logic; -- dual use
+ fpga_d2_miso3 : inout std_logic; -- dual use
+ flash_we_b : out std_logic;
+ flash_oe_b : out std_logic;
+ flash_ce_b : out std_logic;
+ --
+ -- FMC connector
+ -- M2C Mezzanine to Carrier
+ -- C2M Carrier to Mezzanine
+ fmc_clk0_m2c_n : in std_logic;
+ fmc_clk0_m2c_p : in std_logic;
+ fmc_clk1_m2c_n : in std_logic;
+ fmc_clk1_m2c_p : in std_logic;
+ -- IIC addresses:
+ -- M24C08: 1010100..1010111
+ -- 2kb EEPROM on FMC card: 1010010
+ iic_scl_main : inout std_logic;
+ iic_sda_main : inout std_logic;
+ fmc_la00_cc_n : inout std_logic;
+ fmc_la00_cc_p : inout std_logic;
+ fmc_la01_cc_n : inout std_logic;
+ fmc_la01_cc_p : inout std_logic;
+ fmc_la02_n : inout std_logic;
+ fmc_la02_p : inout std_logic;
+ fmc_la03_n : inout std_logic;
+ fmc_la03_p : inout std_logic;
+ fmc_la04_n : inout std_logic;
+ fmc_la04_p : inout std_logic;
+ fmc_la05_n : inout std_logic;
+ fmc_la05_p : inout std_logic;
+ fmc_la06_n : inout std_logic;
+ fmc_la06_p : inout std_logic;
+ fmc_la07_n : inout std_logic;
+ fmc_la07_p : inout std_logic;
+ fmc_la08_n : inout std_logic;
+ fmc_la08_p : inout std_logic;
+ fmc_la09_n : inout std_logic;
+ fmc_la09_p : inout std_logic;
+ fmc_la10_n : inout std_logic;
+ fmc_la10_p : inout std_logic;
+ fmc_la11_n : inout std_logic;
+ fmc_la11_p : inout std_logic;
+ fmc_la12_n : inout std_logic;
+ fmc_la12_p : inout std_logic;
+ fmc_la13_n : inout std_logic;
+ fmc_la13_p : inout std_logic;
+ fmc_la14_n : inout std_logic;
+ fmc_la14_p : inout std_logic;
+ fmc_la15_n : inout std_logic;
+ fmc_la15_p : inout std_logic;
+ fmc_la16_n : inout std_logic;
+ fmc_la16_p : inout std_logic;
+ fmc_la17_cc_n : inout std_logic;
+ fmc_la17_cc_p : inout std_logic;
+ fmc_la18_cc_n : inout std_logic;
+ fmc_la18_cc_p : inout std_logic;
+ fmc_la19_n : inout std_logic;
+ fmc_la19_p : inout std_logic;
+ fmc_la20_n : inout std_logic;
+ fmc_la20_p : inout std_logic;
+ fmc_la21_n : inout std_logic;
+ fmc_la21_p : inout std_logic;
+ fmc_la22_n : inout std_logic;
+ fmc_la22_p : inout std_logic;
+ fmc_la23_n : inout std_logic;
+ fmc_la23_p : inout std_logic;
+ fmc_la24_n : inout std_logic;
+ fmc_la24_p : inout std_logic;
+ fmc_la25_n : inout std_logic;
+ fmc_la25_p : inout std_logic;
+ fmc_la26_n : inout std_logic;
+ fmc_la26_p : inout std_logic;
+ fmc_la27_n : inout std_logic;
+ fmc_la27_p : inout std_logic;
+ fmc_la28_n : inout std_logic;
+ fmc_la28_p : inout std_logic;
+ fmc_la29_n : inout std_logic;
+ fmc_la29_p : inout std_logic;
+ fmc_la30_n : inout std_logic;
+ fmc_la30_p : inout std_logic;
+ fmc_la31_n : inout std_logic;
+ fmc_la31_p : inout std_logic;
+ fmc_la32_n : inout std_logic;
+ fmc_la32_p : inout std_logic;
+ fmc_la33_n : inout std_logic;
+ fmc_la33_p : inout std_logic;
+ fmc_prsnt_m2c_l : in std_logic;
+ fmc_pwr_good_flash_rst_b : out std_logic; -- multiple destinations: 1 of Q2 (LED DS1 driver), U1 AB2 FPGA_PROG (through series R260 DNP), 44 of U25
+ --
+ fpga_awake : out std_logic;
+ fpga_cclk : out std_logic;
+ fpga_cmp_clk : in std_logic;
+ fpga_cmp_mosi : in std_logic;
+ --
+ fpga_hswapen : in std_logic;
+ fpga_init_b : out std_logic; -- low active
+ fpga_m0_cmp_miso : in std_logic; -- mode DIP switch SW1 active high
+ fpga_m1 : in std_logic; -- mode DIP switch SW1 active high
+ fpga_mosi_csi_b_miso0 : inout std_logic;
+ fpga_onchip_term1 : inout std_logic;
+ fpga_onchip_term2 : inout std_logic;
+ fpga_vtemp : in std_logic;
+ --
+ -- GPIOs
+ gpio_button : in std_logic_vector(3 downto 0); -- active high
+ gpio_header_ls : inout std_logic_vector(7 downto 0);
+ gpio_led : out std_logic_vector(3 downto 0);
+ gpio_switch : in std_logic_vector(3 downto 0); -- active high
+ --
+ -- Ethernet Gigabit PHY,
+ -- default settings:
+ -- phy address = 0b00111
+ -- ANEG[3..0] = "1111"
+ -- ENA_XC = 1
+ -- DIS_125 = 1
+ -- HWCFG_MD[3..0] = "1111"
+ -- DIS_FC = 1
+ -- DIS_SLEEP = 1
+ -- SEL_BDT = 0
+ -- INT_POL = 1
+ -- 75/50Ohm = 0
+ phy_col : in std_logic;
+ phy_crs : in std_logic;
+ phy_int : in std_logic;
+ phy_mdc : out std_logic;
+ phy_mdio : inout std_logic;
+ phy_reset : out std_logic;
+ phy_rxclk : in std_logic;
+ phy_rxctl_rxdv : in std_logic;
+ phy_rxd : in std_logic_vector(7 downto 0);
+ phy_rxer : in std_logic;
+ phy_txclk : in std_logic;
+ phy_txctl_txen : out std_logic;
+ phy_txc_gtxclk : out std_logic;
+ phy_txd : out std_logic_vector(7 downto 0);
+ phy_txer : out std_logic;
+ --
+ --
+ spi_cs_b : out std_logic;
+ --
+ -- 200 MHz oscillator, jitter 50 ppm
+ sysclk_n : in std_logic;
+ sysclk_p : in std_logic;
+ --
+ -- RS232 via USB
+ usb_1_cts : out std_logic; -- function: RTS output
+ usb_1_rts : in std_logic; -- function: CTS input
+ usb_1_rx : out std_logic; -- function: TX data out
+ usb_1_tx : in std_logic; -- function: RX data in
+ --
+ -- 27 MHz, oscillator socket
+ user_clock : in std_logic;
+ --
+ -- user clock provided per SMA
+ user_sma_clock_p : in std_logic;
+ user_sma_clock_n : in std_logic
+ );
+end entity top;
+
+
+architecture rtl of top is
+
+ ---------------------------
+ -- type declarations
+ type zpu_type is (zpu_small, zpu_medium);
+
+ ---------------------------
+ -- constant declarations
+ constant zpu_flavour : zpu_type := zpu_medium; -- choose your flavour HERE
+ -- modify frequency here
+ constant clk_multiply : positive := 2; -- 2 for small, 2 for medium
+ constant clk_divide : positive := 5; -- 4 for small, 5 for medium
+ --
+ --
+ constant word_size_c : natural := 32; -- 32 bits data path
+ constant addr_w_c : natural := 18; -- 18 bits address space=256 kB, 128 kB I/O
+ --
+ constant clk_frequency : positive := 200; -- input frequency for correct calculation
+
+
+ ---------------------------
+ -- component declarations
+ component zpu_small1 is
+ generic (
+ word_size : natural := 32; -- 32 bits data path
+ d_care_val : std_logic := '0'; -- Fill value
+ clk_freq : positive := 50; -- 50 MHz clock
+ brate : positive := 115200; -- RS232 baudrate
+ addr_w : natural := 16; -- 16 bits address space=64 kB, 32 kB I/O
+ bram_w : natural := 15 -- 15 bits RAM space=32 kB
+ );
+ port (
+ clk_i : in std_logic; -- CPU clock
+ rst_i : in std_logic; -- Reset
+ break_o : out std_logic; -- Break executed
+ dbg_o : out zpu_dbgo_t; -- Debug info
+ rs232_tx_o : out std_logic; -- UART Tx
+ rs232_rx_i : in std_logic; -- UART Rx
+ gpio_in : in std_logic_vector(31 downto 0);
+ gpio_out : out std_logic_vector(31 downto 0);
+ gpio_dir : out std_logic_vector(31 downto 0) -- 1 = in, 0 = out
+ );
+ end component zpu_small1;
+
+ component zpu_med1 is
+ generic(
+ word_size : natural := 32; -- 32 bits data path
+ d_care_val : std_logic := '0'; -- Fill value
+ clk_freq : positive := 50; -- 50 MHz clock
+ brate : positive := 115200; -- RS232 baudrate
+ addr_w : natural := 18; -- 18 bits address space=256 kB, 128 kB I/O
+ bram_w : natural := 15 -- 15 bits RAM space=32 kB
+ );
+ port(
+ clk_i : in std_logic; -- CPU clock
+ rst_i : in std_logic; -- Reset
+ break_o : out std_logic; -- Break executed
+ dbg_o : out zpu_dbgo_t; -- Debug info
+ rs232_tx_o : out std_logic; -- UART Tx
+ rs232_rx_i : in std_logic; -- UART Rx
+ gpio_in : in std_logic_vector(31 downto 0);
+ gpio_out : out std_logic_vector(31 downto 0);
+ gpio_dir : out std_logic_vector(31 downto 0) -- 1 = in, 0 = out
+ );
+ end component zpu_med1;
+
+
+
+ ---------------------------
+ -- signal declarations
+ signal sys_clk : std_ulogic;
+ signal dcm_sp_i0_clk0 : std_ulogic;
+ signal dcm_sp_i0_clkfx : std_ulogic;
+ signal clk_fb : std_ulogic;
+ signal clk : std_ulogic;
+ --
+ signal reset_shift_reg : std_ulogic_vector(3 downto 0);
+ signal reset_sync : std_ulogic;
+ --
+ signal zpu_i0_dbg : zpu_dbgo_t; -- Debug info
+ signal zpu_i0_break : std_logic;
+ --
+ signal gpio_in : std_logic_vector(31 downto 0) := (others => '0');
+ signal zpu_i0_gpio_out : std_logic_vector(31 downto 0);
+ signal zpu_i0_gpio_dir : std_logic_vector(31 downto 0);
+
+
+begin
+
+ -- default output drivers
+ -- to pass bitgen DRC
+ -- outputs used by design are commented
+ --
+ ddr2_a <= (others => '1');
+ ddr2_ba <= (others => '1');
+ ddr2_cas_b <= '1';
+ ddr2_ras_b <= '1';
+ ddr2_we_b <= '1';
+ ddr2_cke <= '0';
+ ddr2_clk_n <= '0';
+ ddr2_clk_p <= '1';
+ ddr2_dq <= (others => 'Z');
+ ddr2_ldm <= '0';
+ ddr2_udm <= '0';
+ ddr2_ldqs_n <= 'Z';
+ ddr2_ldqs_p <= 'Z';
+ ddr2_udqs_n <= 'Z';
+ ddr2_udqs_p <= 'Z';
+ ddr2_odt <= '1';
+ --
+ flash_a <= (others => '1');
+ flash_d <= (others => 'Z');
+ flash_we_b <= '1';
+ flash_oe_b <= '1';
+ flash_ce_b <= '1';
+ --
+ fpga_d0_din_miso_miso1 <= 'Z';
+ fpga_d1_miso2 <= 'Z';
+ fpga_d2_miso3 <= 'Z';
+ --
+ iic_scl_main <= 'Z';
+ iic_sda_main <= 'Z';
+ fmc_la00_cc_n <= 'Z';
+ fmc_la00_cc_p <= 'Z';
+ fmc_la01_cc_n <= 'Z';
+ fmc_la01_cc_p <= 'Z';
+ fmc_la02_n <= 'Z';
+ fmc_la02_p <= 'Z';
+ fmc_la03_n <= 'Z';
+ fmc_la03_p <= 'Z';
+ fmc_la04_n <= 'Z';
+ fmc_la04_p <= 'Z';
+ fmc_la05_n <= 'Z';
+ fmc_la05_p <= 'Z';
+ fmc_la06_n <= 'Z';
+ fmc_la06_p <= 'Z';
+ fmc_la07_n <= 'Z';
+ fmc_la07_p <= 'Z';
+ fmc_la08_n <= 'Z';
+ fmc_la08_p <= 'Z';
+ fmc_la09_n <= 'Z';
+ fmc_la09_p <= 'Z';
+ fmc_la10_n <= 'Z';
+ fmc_la10_p <= 'Z';
+ fmc_la11_n <= 'Z';
+ fmc_la11_p <= 'Z';
+ fmc_la12_n <= 'Z';
+ fmc_la12_p <= 'Z';
+ fmc_la13_n <= 'Z';
+ fmc_la13_p <= 'Z';
+ fmc_la14_n <= 'Z';
+ fmc_la14_p <= 'Z';
+ fmc_la15_n <= 'Z';
+ fmc_la15_p <= 'Z';
+ fmc_la16_n <= 'Z';
+ fmc_la16_p <= 'Z';
+ fmc_la17_cc_n <= 'Z';
+ fmc_la17_cc_p <= 'Z';
+ fmc_la18_cc_n <= 'Z';
+ fmc_la18_cc_p <= 'Z';
+ fmc_la19_n <= 'Z';
+ fmc_la19_p <= 'Z';
+ fmc_la20_n <= 'Z';
+ fmc_la20_p <= 'Z';
+ fmc_la21_n <= 'Z';
+ fmc_la21_p <= 'Z';
+ fmc_la22_n <= 'Z';
+ fmc_la22_p <= 'Z';
+ fmc_la23_n <= 'Z';
+ fmc_la23_p <= 'Z';
+ fmc_la24_n <= 'Z';
+ fmc_la24_p <= 'Z';
+ fmc_la25_n <= 'Z';
+ fmc_la25_p <= 'Z';
+ fmc_la26_n <= 'Z';
+ fmc_la26_p <= 'Z';
+ fmc_la27_n <= 'Z';
+ fmc_la27_p <= 'Z';
+ fmc_la28_n <= 'Z';
+ fmc_la28_p <= 'Z';
+ fmc_la29_n <= 'Z';
+ fmc_la29_p <= 'Z';
+ fmc_la30_n <= 'Z';
+ fmc_la30_p <= 'Z';
+ fmc_la31_n <= 'Z';
+ fmc_la31_p <= 'Z';
+ fmc_la32_n <= 'Z';
+ fmc_la32_p <= 'Z';
+ fmc_la33_n <= 'Z';
+ fmc_la33_p <= 'Z';
+ fmc_pwr_good_flash_rst_b <= '1';
+ --
+ fpga_awake <= '1';
+ fpga_cclk <= '1'; -- SPI clk
+ fpga_init_b <= '1';
+ fpga_mosi_csi_b_miso0 <= 'Z';
+ fpga_onchip_term1 <= 'Z';
+ fpga_onchip_term2 <= 'Z';
+ --
+ --gpio_led <= (others => '0');
+ --gpio_header_ls <= (others => 'Z');
+ --
+ phy_mdc <= '0';
+ phy_mdio <= 'Z';
+ phy_reset <= '0';
+ phy_txc_gtxclk <= '0';
+ phy_txctl_txen <= '0';
+ phy_txd <= (others => '1');
+ phy_txer <= '0';
+ --
+ spi_cs_b <= '1';
+ --
+ --usb_1_rx <= '1'; -- function: TX data out
+ usb_1_cts <= '1'; -- function: RTS
+
+
+ -- global differential input buffer
+ ibufgds_i0 : ibufgds
+ generic map (
+ diff_term => true
+ )
+ port map (
+ i => sysclk_p,
+ ib => sysclk_n,
+ o => sys_clk
+ );
+
+ -- digital clock manager (DCM)
+ -- to generate higher/other system clock frequencys
+ dcm_sp_i0 : dcm_sp
+ generic map (
+ startup_wait => true, -- wait with DONE till locked
+ clkfx_multiply => clk_multiply,
+ clkfx_divide => clk_divide,
+ clk_feedback => "1X"
+ )
+ port map (
+ clkin => sys_clk,
+ clk0 => dcm_sp_i0_clk0,
+ clkfx => dcm_sp_i0_clkfx,
+ clkfb => clk_fb
+ );
+
+ clk_fb <= dcm_sp_i0_clk0;
+ clk <= dcm_sp_i0_clkfx;
+
+
+ -- reset synchronizer
+ -- generate synchronous reset
+ reset_synchronizer : process(clk, cpu_reset)
+ begin
+ if cpu_reset = '1' then
+ reset_shift_reg <= (others => '1');
+ elsif rising_edge(clk) then
+ reset_shift_reg <= reset_shift_reg(reset_shift_reg'high-1 downto 0) & '0';
+ end if;
+ end process;
+ reset_sync <= reset_shift_reg(reset_shift_reg'high);
+
+
+
+ -- select instance of zpu
+ zpu_i0_small: if zpu_flavour = zpu_small generate
+ zpu_i0 : zpu_small1
+ generic map (
+ addr_w => addr_w_c,
+ word_size => word_size_c,
+ clk_freq => clk_frequency * clk_multiply / clk_divide
+ )
+ port map (
+ clk_i => clk, -- : in std_logic; -- CPU clock
+ rst_i => reset_sync, -- : in std_logic; -- Reset
+ break_o => zpu_i0_break, -- : out std_logic; -- Break executed
+ dbg_o => zpu_i0_dbg, -- : out zpu_dbgo_t; -- Debug info
+ rs232_tx_o => usb_1_rx, -- : out std_logic; -- UART Tx
+ rs232_rx_i => usb_1_tx, -- : in std_logic -- UART Rx
+ gpio_in => gpio_in, -- : in std_logic_vector(31 downto 0);
+ gpio_out => zpu_i0_gpio_out, -- : out std_logic_vector(31 downto 0);
+ gpio_dir => zpu_i0_gpio_dir -- : out std_logic_vector(31 downto 0) -- 1 = in, 0 = out
+ );
+ end generate zpu_i0_small;
+
+ zpu_i0_medium: if zpu_flavour = zpu_medium generate
+ zpu_i0 : zpu_med1
+ generic map (
+ addr_w => addr_w_c,
+ word_size => word_size_c,
+ clk_freq => clk_frequency * clk_multiply / clk_divide
+ )
+ port map (
+ clk_i => clk, -- : in std_logic; -- CPU clock
+ rst_i => reset_sync, -- : in std_logic; -- Reset
+ break_o => zpu_i0_break, -- : out std_logic; -- Break executed
+ dbg_o => zpu_i0_dbg, -- : out zpu_dbgo_t; -- Debug info
+ rs232_tx_o => usb_1_rx, -- : out std_logic; -- UART Tx
+ rs232_rx_i => usb_1_tx, -- : in std_logic -- UART Rx
+ gpio_in => gpio_in, -- : in std_logic_vector(31 downto 0);
+ gpio_out => zpu_i0_gpio_out, -- : out std_logic_vector(31 downto 0);
+ gpio_dir => zpu_i0_gpio_dir -- : out std_logic_vector(31 downto 0) -- 1 = in, 0 = out
+ );
+ end generate zpu_i0_medium;
+
+
+ -- pragma translate_off
+ stop_simulation <= zpu_i0_break; -- abort() causes to stop the simulation
+
+
+
+ trace_mod : trace
+ generic map (
+ addr_w => addr_w_c,
+ word_size => word_size_c,
+ log_file => "zpu_trace.log"
+ )
+ port map (
+ clk_i => clk,
+ dbg_i => zpu_i0_dbg,
+ stop_i => zpu_i0_break,
+ busy_i => '0'
+ );
+ -- pragma translate_on
+
+ -- assign GPIOs
+ --
+ -- bit 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
+ --
+ -- in -- -- -- -- -- -- -- -- gpio_header_ls(7.....0)
+ -- out -- -- -- -- -- -- -- -- gpio_header_ls(7.....0)
+ --
+ -- bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+ --
+ -- in -- -- -- -- switch(3.0) -- -- -- -- button(3.0)
+ -- out -- -- -- -- -- -- -- -- gpio_led(7...........0)
+ --
+ gpio_in(23 downto 16) <= gpio_header_ls;
+ gpio_in(11 downto 8) <= gpio_switch;
+ gpio_in( 3 downto 0) <= gpio_button;
+
+ -- 3-state buffers for header_ls
+ gpio_header_ls(7) <= zpu_i0_gpio_out(23) when zpu_i0_gpio_dir(23) = '0' else 'Z';
+ gpio_header_ls(6) <= zpu_i0_gpio_out(22) when zpu_i0_gpio_dir(22) = '0' else 'Z';
+ gpio_header_ls(5) <= zpu_i0_gpio_out(21) when zpu_i0_gpio_dir(21) = '0' else 'Z';
+ gpio_header_ls(4) <= zpu_i0_gpio_out(20) when zpu_i0_gpio_dir(20) = '0' else 'Z';
+ gpio_header_ls(3) <= zpu_i0_gpio_out(19) when zpu_i0_gpio_dir(19) = '0' else 'Z';
+ gpio_header_ls(2) <= zpu_i0_gpio_out(18) when zpu_i0_gpio_dir(18) = '0' else 'Z';
+ gpio_header_ls(1) <= zpu_i0_gpio_out(17) when zpu_i0_gpio_dir(17) = '0' else 'Z';
+ gpio_header_ls(0) <= zpu_i0_gpio_out(16) when zpu_i0_gpio_dir(16) = '0' else 'Z';
+
+ -- switch on all LEDs in case of break
+ process
+ begin
+ wait until rising_edge(clk);
+ gpio_led <= zpu_i0_gpio_out(3 downto 0);
+ if zpu_i0_break = '1' then
+ gpio_led <= (others => '1');
+ end if;
+ end process;
+
+
+
+end architecture rtl;
diff --git a/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/top_tb.vhd b/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/top_tb.vhd new file mode 100644 index 0000000..f089f29 --- /dev/null +++ b/zpu/hdl/zealot/fpga/xilinx-sp601-xc6slx16/top_tb.vhd @@ -0,0 +1,402 @@ +-- testbench for
+-- SP601 evaluation board
+--
+-- includes "model" for clock generation
+-- simulate press on cpu_reset as reset
+--
+-- place models for external components (PHY, DDR2) in this file
+--
+
+
+library ieee;
+use ieee.std_logic_1164.all;
+
+
+entity top_tb is
+end entity top_tb;
+
+architecture testbench of top_tb is
+
+ ---------------------------
+ -- constant declarations
+ constant sys_clk_period : time := 1 sec / 200_000_000; -- 200 MHz
+ constant user_clk_period : time := 1 sec / 27_000_000; -- 27 MHz
+
+
+ ---------------------------
+ -- signal declarations
+ signal simulation_run : boolean := true;
+ signal tb_stop_simulation : std_logic;
+ --
+ signal tb_cpu_reset : std_logic; -- SW9 pushbutton (active-high)
+ --
+ -- DDR2 memory 128 MB
+ signal tb_ddr2_a : std_logic_vector(12 downto 0);
+ signal tb_ddr2_ba : std_logic_vector(2 downto 0);
+ signal tb_ddr2_cas_b : std_logic;
+ signal tb_ddr2_ras_b : std_logic;
+ signal tb_ddr2_we_b : std_logic;
+ signal tb_ddr2_cke : std_logic;
+ signal tb_ddr2_clk_n : std_logic;
+ signal tb_ddr2_clk_p : std_logic;
+ signal tb_ddr2_dq : std_logic_vector(15 downto 0);
+ signal tb_ddr2_ldm : std_logic;
+ signal tb_ddr2_udm : std_logic;
+ signal tb_ddr2_ldqs_n : std_logic;
+ signal tb_ddr2_ldqs_p : std_logic;
+ signal tb_ddr2_udqs_n : std_logic;
+ signal tb_ddr2_udqs_p : std_logic;
+ signal tb_ddr2_odt : std_logic;
+ --
+ -- flash memory
+ signal tb_flash_a : std_logic_vector(24 downto 0);
+ signal tb_flash_d : std_logic_vector(7 downto 3);
+ signal tb_fpga_d0_din_miso_miso1 : std_logic; -- dual use
+ signal tb_fpga_d1_miso2 : std_logic; -- dual use
+ signal tb_fpga_d2_miso3 : std_logic; -- dual use
+ signal tb_flash_we_b : std_logic;
+ signal tb_flash_oe_b : std_logic;
+ signal tb_flash_ce_b : std_logic;
+ --
+ -- FMC connector
+ -- M2C Mezzanine to Carrier
+ -- C2M Carrier to Mezzanine
+ signal tb_fmc_clk0_m2c_n : std_logic := '1';
+ signal tb_fmc_clk0_m2c_p : std_logic := '0';
+ signal tb_fmc_clk1_m2c_n : std_logic := '1';
+ signal tb_fmc_clk1_m2c_p : std_logic := '0';
+ -- IIC addresses:
+ -- M24C08: 1010100..1010111
+ -- 2kb EEPROM on FMC card: 1010010
+ signal tb_iic_scl_main : std_logic;
+ signal tb_iic_sda_main : std_logic;
+ signal tb_fmc_la00_cc_n : std_logic;
+ signal tb_fmc_la00_cc_p : std_logic;
+ signal tb_fmc_la01_cc_n : std_logic;
+ signal tb_fmc_la01_cc_p : std_logic;
+ signal tb_fmc_la02_n : std_logic;
+ signal tb_fmc_la02_p : std_logic;
+ signal tb_fmc_la03_n : std_logic;
+ signal tb_fmc_la03_p : std_logic;
+ signal tb_fmc_la04_n : std_logic;
+ signal tb_fmc_la04_p : std_logic;
+ signal tb_fmc_la05_n : std_logic;
+ signal tb_fmc_la05_p : std_logic;
+ signal tb_fmc_la06_n : std_logic;
+ signal tb_fmc_la06_p : std_logic;
+ signal tb_fmc_la07_n : std_logic;
+ signal tb_fmc_la07_p : std_logic;
+ signal tb_fmc_la08_n : std_logic;
+ signal tb_fmc_la08_p : std_logic;
+ signal tb_fmc_la09_n : std_logic;
+ signal tb_fmc_la09_p : std_logic;
+ signal tb_fmc_la10_n : std_logic;
+ signal tb_fmc_la10_p : std_logic;
+ signal tb_fmc_la11_n : std_logic;
+ signal tb_fmc_la11_p : std_logic;
+ signal tb_fmc_la12_n : std_logic;
+ signal tb_fmc_la12_p : std_logic;
+ signal tb_fmc_la13_n : std_logic;
+ signal tb_fmc_la13_p : std_logic;
+ signal tb_fmc_la14_n : std_logic;
+ signal tb_fmc_la14_p : std_logic;
+ signal tb_fmc_la15_n : std_logic;
+ signal tb_fmc_la15_p : std_logic;
+ signal tb_fmc_la16_n : std_logic;
+ signal tb_fmc_la16_p : std_logic;
+ signal tb_fmc_la17_cc_n : std_logic;
+ signal tb_fmc_la17_cc_p : std_logic;
+ signal tb_fmc_la18_cc_n : std_logic;
+ signal tb_fmc_la18_cc_p : std_logic;
+ signal tb_fmc_la19_n : std_logic;
+ signal tb_fmc_la19_p : std_logic;
+ signal tb_fmc_la20_n : std_logic;
+ signal tb_fmc_la20_p : std_logic;
+ signal tb_fmc_la21_n : std_logic;
+ signal tb_fmc_la21_p : std_logic;
+ signal tb_fmc_la22_n : std_logic;
+ signal tb_fmc_la22_p : std_logic;
+ signal tb_fmc_la23_n : std_logic;
+ signal tb_fmc_la23_p : std_logic;
+ signal tb_fmc_la24_n : std_logic;
+ signal tb_fmc_la24_p : std_logic;
+ signal tb_fmc_la25_n : std_logic;
+ signal tb_fmc_la25_p : std_logic;
+ signal tb_fmc_la26_n : std_logic;
+ signal tb_fmc_la26_p : std_logic;
+ signal tb_fmc_la27_n : std_logic;
+ signal tb_fmc_la27_p : std_logic;
+ signal tb_fmc_la28_n : std_logic;
+ signal tb_fmc_la28_p : std_logic;
+ signal tb_fmc_la29_n : std_logic;
+ signal tb_fmc_la29_p : std_logic;
+ signal tb_fmc_la30_n : std_logic;
+ signal tb_fmc_la30_p : std_logic;
+ signal tb_fmc_la31_n : std_logic;
+ signal tb_fmc_la31_p : std_logic;
+ signal tb_fmc_la32_n : std_logic;
+ signal tb_fmc_la32_p : std_logic;
+ signal tb_fmc_la33_n : std_logic;
+ signal tb_fmc_la33_p : std_logic;
+ signal tb_fmc_prsnt_m2c_l : std_logic := '0';
+ signal tb_fmc_pwr_good_flash_rst_b : std_logic; -- multiple destinations: 1 of Q2 (LED DS1 driver), U1 AB2 FPGA_PROG (through series R260 DNP), 44 of U25
+ --
+ signal tb_fpga_awake : std_logic;
+ signal tb_fpga_cclk : std_logic;
+ signal tb_fpga_cmp_clk : std_logic := '0';
+ signal tb_fpga_cmp_mosi : std_logic := '0';
+ signal tb_fpga_hswapen : std_logic := '0';
+ signal tb_fpga_init_b : std_logic; -- low active
+ signal tb_fpga_m0_cmp_miso : std_logic := '0'; -- mode DIP switch SW1 active high
+ signal tb_fpga_m1 : std_logic := '0'; -- mode DIP switch SW1 active high
+ signal tb_fpga_mosi_csi_b_miso0 : std_logic;
+ signal tb_fpga_onchip_term1 : std_logic;
+ signal tb_fpga_onchip_term2 : std_logic;
+ signal tb_fpga_vtemp : std_logic := '0';
+ --
+ -- GPIOs
+ signal tb_gpio_button : std_logic_vector(3 downto 0) := (others => '0'); -- active high
+ signal tb_gpio_header_ls : std_logic_vector(7 downto 0); --
+ signal tb_gpio_led : std_logic_vector(3 downto 0);
+ signal tb_gpio_switch : std_logic_vector(3 downto 0) := (others => '0'); -- active high
+ --
+ -- Ethernet Gigabit PHY
+ signal tb_phy_col : std_logic := '0';
+ signal tb_phy_crs : std_logic := '0';
+ signal tb_phy_int : std_logic := '0';
+ signal tb_phy_mdc : std_logic;
+ signal tb_phy_mdio : std_logic;
+ signal tb_phy_reset : std_logic;
+ signal tb_phy_rxclk : std_logic := '0';
+ signal tb_phy_rxctl_rxdv : std_logic := '0';
+ signal tb_phy_rxd : std_logic_vector(7 downto 0);
+ signal tb_phy_rxer : std_logic := '0';
+ signal tb_phy_txclk : std_logic := '0';
+ signal tb_phy_txctl_txen : std_logic;
+ signal tb_phy_txc_gtxclk : std_logic;
+ signal tb_phy_txd : std_logic_vector(7 downto 0);
+ signal tb_phy_txer : std_logic;
+ --
+ --
+ signal tb_spi_cs_b : std_logic;
+ --
+ -- 200 MHz oscillator, jitter 50 ppm
+ signal tb_sysclk_n : std_logic := '1';
+ signal tb_sysclk_p : std_logic := '0';
+ --
+ -- RS232 via USB
+ signal tb_usb_1_cts : std_logic; -- function: RTS output
+ signal tb_usb_1_rts : std_logic := '0'; -- function: CTS input
+ signal tb_usb_1_rx : std_logic; -- function: TX data out
+ signal tb_usb_1_tx : std_logic := '0'; -- function: RX data in
+ --
+ -- 27 MHz, oscillator socket
+ signal tb_user_clock : std_logic := '0';
+ --
+ -- user clock provided per SMA
+ signal tb_user_sma_clock_p : std_logic := '0';
+ signal tb_user_sma_clock_n : std_logic := '0';
+
+
+
+begin
+
+ -- generate clocks
+ tb_sysclk_p <= not tb_sysclk_p after sys_clk_period / 2 when simulation_run;
+ tb_sysclk_n <= not tb_sysclk_n after sys_clk_period / 2 when simulation_run;
+ tb_user_clock <= not tb_user_clock after user_clk_period / 2 when simulation_run;
+
+ -- generate reset
+ tb_cpu_reset <= '1', '0' after 6.66 * sys_clk_period;
+
+
+ -- simulate keypress
+ tb_gpio_button(2) <= '0', '1' after 50 us, '0' after 52 us;
+
+ -- dut
+ top_i0 : entity work.top
+ port map (
+ stop_simulation => tb_stop_simulation, -- : out std_logic;
+ --
+ cpu_reset => tb_cpu_reset, -- : in std_logic;
+ --
+ -- DDR2 memory 128 MB
+ ddr2_a => tb_ddr2_a, -- : out std_logic_vector(12 downto 0);
+ ddr2_ba => tb_ddr2_ba, -- : out std_logic_vector(2 downto 0);
+ ddr2_cas_b => tb_ddr2_cas_b, -- : out std_logic;
+ ddr2_ras_b => tb_ddr2_ras_b, -- : out std_logic;
+ ddr2_we_b => tb_ddr2_we_b, -- : out std_logic;
+ ddr2_cke => tb_ddr2_cke, -- : out std_logic;
+ ddr2_clk_n => tb_ddr2_clk_n, -- : out std_logic;
+ ddr2_clk_p => tb_ddr2_clk_p, -- : out std_logic;
+ ddr2_dq => tb_ddr2_dq, -- : inout std_logic_vector(15 downto 0);
+ ddr2_ldm => tb_ddr2_ldm, -- : out std_logic;
+ ddr2_udm => tb_ddr2_udm, -- : out std_logic;
+ ddr2_ldqs_n => tb_ddr2_ldqs_n, -- : inout std_logic;
+ ddr2_ldqs_p => tb_ddr2_ldqs_p, -- : inout std_logic;
+ ddr2_udqs_n => tb_ddr2_udqs_n, -- : inout std_logic;
+ ddr2_udqs_p => tb_ddr2_udqs_p, -- : inout std_logic;
+ ddr2_odt => tb_ddr2_odt, -- : out std_logic;
+ --
+ -- flash memory
+ flash_a => tb_flash_a, -- : out std_logic_vector(24 downto 0);
+ flash_d => tb_flash_d, -- : inout std_logic_vector(7 downto 3);
+ -- --
+ fpga_d0_din_miso_miso1 => tb_fpga_d0_din_miso_miso1, -- : inout std_logic;
+ fpga_d1_miso2 => tb_fpga_d1_miso2, -- : inout std_logic;
+ fpga_d2_miso3 => tb_fpga_d2_miso3, -- : inout std_logic;
+ flash_we_b => tb_flash_we_b, -- : out std_logic;
+ flash_oe_b => tb_flash_oe_b, -- : out std_logic;
+ flash_ce_b => tb_flash_ce_b, -- : out std_logic;
+ --
+ -- FMC connector
+ -- M2C Mezzanine to Carrier
+ -- C2M Carrier to Mezzanine
+ fmc_clk0_m2c_n => tb_fmc_clk0_m2c_n, -- : in std_logic;
+ fmc_clk0_m2c_p => tb_fmc_clk0_m2c_p, -- : in std_logic;
+ fmc_clk1_m2c_n => tb_fmc_clk1_m2c_n, -- : in std_logic;
+ fmc_clk1_m2c_p => tb_fmc_clk1_m2c_p, -- : in std_logic;
+ iic_scl_main => tb_iic_scl_main, -- : inout std_logic;
+ iic_sda_main => tb_iic_sda_main, -- : inout std_logic;
+ fmc_la00_cc_n => tb_fmc_la00_cc_n, -- : inout std_logic;
+ fmc_la00_cc_p => tb_fmc_la00_cc_p, -- : inout std_logic;
+ fmc_la01_cc_n => tb_fmc_la01_cc_n, -- : inout std_logic;
+ fmc_la01_cc_p => tb_fmc_la01_cc_p, -- : inout std_logic;
+ fmc_la02_n => tb_fmc_la02_n, -- : inout std_logic;
+ fmc_la02_p => tb_fmc_la02_p, -- : inout std_logic;
+ fmc_la03_n => tb_fmc_la03_n, -- : inout std_logic;
+ fmc_la03_p => tb_fmc_la03_p, -- : inout std_logic;
+ fmc_la04_n => tb_fmc_la04_n, -- : inout std_logic;
+ fmc_la04_p => tb_fmc_la04_p, -- : inout std_logic;
+ fmc_la05_n => tb_fmc_la05_n, -- : inout std_logic;
+ fmc_la05_p => tb_fmc_la05_p, -- : inout std_logic;
+ fmc_la06_n => tb_fmc_la06_n, -- : inout std_logic;
+ fmc_la06_p => tb_fmc_la06_p, -- : inout std_logic;
+ fmc_la07_n => tb_fmc_la07_n, -- : inout std_logic;
+ fmc_la07_p => tb_fmc_la07_p, -- : inout std_logic;
+ fmc_la08_n => tb_fmc_la08_n, -- : inout std_logic;
+ fmc_la08_p => tb_fmc_la08_p, -- : inout std_logic;
+ fmc_la09_n => tb_fmc_la09_n, -- : inout std_logic;
+ fmc_la09_p => tb_fmc_la09_p, -- : inout std_logic;
+ fmc_la10_n => tb_fmc_la10_n, -- : inout std_logic;
+ fmc_la10_p => tb_fmc_la10_p, -- : inout std_logic;
+ fmc_la11_n => tb_fmc_la11_n, -- : inout std_logic;
+ fmc_la11_p => tb_fmc_la11_p, -- : inout std_logic;
+ fmc_la12_n => tb_fmc_la12_n, -- : inout std_logic;
+ fmc_la12_p => tb_fmc_la12_p, -- : inout std_logic;
+ fmc_la13_n => tb_fmc_la13_n, -- : inout std_logic;
+ fmc_la13_p => tb_fmc_la13_p, -- : inout std_logic;
+ fmc_la14_n => tb_fmc_la14_n, -- : inout std_logic;
+ fmc_la14_p => tb_fmc_la14_p, -- : inout std_logic;
+ fmc_la15_n => tb_fmc_la15_n, -- : inout std_logic;
+ fmc_la15_p => tb_fmc_la15_p, -- : inout std_logic;
+ fmc_la16_n => tb_fmc_la16_n, -- : inout std_logic;
+ fmc_la16_p => tb_fmc_la16_p, -- : inout std_logic;
+ fmc_la17_cc_n => tb_fmc_la17_cc_n, -- : inout std_logic;
+ fmc_la17_cc_p => tb_fmc_la17_cc_p, -- : inout std_logic;
+ fmc_la18_cc_n => tb_fmc_la18_cc_n, -- : inout std_logic;
+ fmc_la18_cc_p => tb_fmc_la18_cc_p, -- : inout std_logic;
+ fmc_la19_n => tb_fmc_la19_n, -- : inout std_logic;
+ fmc_la19_p => tb_fmc_la19_p, -- : inout std_logic;
+ fmc_la20_n => tb_fmc_la20_n, -- : inout std_logic;
+ fmc_la20_p => tb_fmc_la20_p, -- : inout std_logic;
+ fmc_la21_n => tb_fmc_la21_n, -- : inout std_logic;
+ fmc_la21_p => tb_fmc_la21_p, -- : inout std_logic;
+ fmc_la22_n => tb_fmc_la22_n, -- : inout std_logic;
+ fmc_la22_p => tb_fmc_la22_p, -- : inout std_logic;
+ fmc_la23_n => tb_fmc_la23_n, -- : inout std_logic;
+ fmc_la23_p => tb_fmc_la23_p, -- : inout std_logic;
+ fmc_la24_n => tb_fmc_la24_n, -- : inout std_logic;
+ fmc_la24_p => tb_fmc_la24_p, -- : inout std_logic;
+ fmc_la25_n => tb_fmc_la25_n, -- : inout std_logic;
+ fmc_la25_p => tb_fmc_la25_p, -- : inout std_logic;
+ fmc_la26_n => tb_fmc_la26_n, -- : inout std_logic;
+ fmc_la26_p => tb_fmc_la26_p, -- : inout std_logic;
+ fmc_la27_n => tb_fmc_la27_n, -- : inout std_logic;
+ fmc_la27_p => tb_fmc_la27_p, -- : inout std_logic;
+ fmc_la28_n => tb_fmc_la28_n, -- : inout std_logic;
+ fmc_la28_p => tb_fmc_la28_p, -- : inout std_logic;
+ fmc_la29_n => tb_fmc_la29_n, -- : inout std_logic;
+ fmc_la29_p => tb_fmc_la29_p, -- : inout std_logic;
+ fmc_la30_n => tb_fmc_la30_n, -- : inout std_logic;
+ fmc_la30_p => tb_fmc_la30_p, -- : inout std_logic;
+ fmc_la31_n => tb_fmc_la31_n, -- : inout std_logic;
+ fmc_la31_p => tb_fmc_la31_p, -- : inout std_logic;
+ fmc_la32_n => tb_fmc_la32_n, -- : inout std_logic;
+ fmc_la32_p => tb_fmc_la32_p, -- : inout std_logic;
+ fmc_la33_n => tb_fmc_la33_n, -- : inout std_logic;
+ fmc_la33_p => tb_fmc_la33_p, -- : inout std_logic;
+ fmc_prsnt_m2c_l => tb_fmc_prsnt_m2c_l, -- : in std_logic;
+ fmc_pwr_good_flash_rst_b => tb_fmc_pwr_good_flash_rst_b, -- : out std_logic;
+ --
+ fpga_awake => tb_fpga_awake, -- : out std_logic;
+ fpga_cclk => tb_fpga_cclk, -- : out std_logic;
+ fpga_cmp_clk => tb_fpga_cmp_clk, -- : in std_logic;
+ fpga_cmp_mosi => tb_fpga_cmp_mosi, -- : in std_logic;
+ -- --
+ fpga_hswapen => tb_fpga_hswapen, -- : in std_logic;
+ fpga_init_b => tb_fpga_init_b, -- : out std_logic;
+ fpga_m0_cmp_miso => tb_fpga_m0_cmp_miso, -- : in std_logic;
+ fpga_m1 => tb_fpga_m1, -- : in std_logic;
+ fpga_mosi_csi_b_miso0 => tb_fpga_mosi_csi_b_miso0, -- : inout std_logic;
+ fpga_onchip_term1 => tb_fpga_onchip_term1, -- : inout std_logic;
+ fpga_onchip_term2 => tb_fpga_onchip_term2, -- : inout std_logic;
+ fpga_vtemp => tb_fpga_vtemp, -- : in std_logic;
+ --
+ -- GPIOs
+ gpio_button => tb_gpio_button, -- : in std_logic_vector(3 downto 0);
+ gpio_header_ls => tb_gpio_header_ls, -- : inout std_logic_vector(7 downto 0);
+ gpio_led => tb_gpio_led, -- : out std_logic_vector(3 downto 0);
+ gpio_switch => tb_gpio_switch, -- : in std_logic_vector(3 downto 0);
+ --
+ -- Ethernet Gigabit PHY
+ phy_col => tb_phy_col, -- : in std_logic;
+ phy_crs => tb_phy_crs, -- : in std_logic;
+ phy_int => tb_phy_int, -- : in std_logic;
+ phy_mdc => tb_phy_mdc, -- : out std_logic;
+ phy_mdio => tb_phy_mdio, -- : inout std_logic;
+ phy_reset => tb_phy_reset, -- : out std_logic;
+ phy_rxclk => tb_phy_rxclk, -- : in std_logic;
+ phy_rxctl_rxdv => tb_phy_rxctl_rxdv, -- : in std_logic;
+ phy_rxd => tb_phy_rxd, -- : in std_logic_vector(7 downto 0);
+ phy_rxer => tb_phy_rxer, -- : in std_logic;
+ phy_txclk => tb_phy_txclk, -- : in std_logic;
+ phy_txctl_txen => tb_phy_txctl_txen, -- : out std_logic;
+ phy_txc_gtxclk => tb_phy_txc_gtxclk, -- : out std_logic;
+ phy_txd => tb_phy_txd, -- : out std_logic_vector(7 downto 0);
+ phy_txer => tb_phy_txer, -- : out std_logic;
+ --
+ --
+ spi_cs_b => tb_spi_cs_b, -- : out std_logic;
+ --
+ -- 200 MHz oscillator, jitter 50 ppm
+ sysclk_n => tb_sysclk_n, -- : in std_logic;
+ sysclk_p => tb_sysclk_p, -- : in std_logic;
+ --
+ -- RS232 via USB
+ usb_1_cts => tb_usb_1_cts, -- : out std_logic;
+ usb_1_rts => tb_usb_1_rts, -- : in std_logic;
+ usb_1_rx => tb_usb_1_rx, -- : out std_logic;
+ usb_1_tx => tb_usb_1_tx, -- : in std_logic;
+ --
+ -- 27 MHz, oscillator socket
+ user_clock => tb_user_clock, -- : in std_logic;
+ --
+ -- user clock provided per SMA
+ user_sma_clock_p => tb_user_sma_clock_p, -- : in std_logic;
+ user_sma_clock_n => tb_user_sma_clock_n -- : in std_logic
+ );
+
+
+ -- check for simulation stopping
+ process (tb_stop_simulation)
+ begin
+ if tb_stop_simulation = '1' then
+ report "Simulation end." severity note;
+ simulation_run <= false;
+ end if;
+ end process;
+
+
+end architecture testbench;
+
diff --git a/zpu/hdl/zealot/helpers/zpu_med1.vhdl b/zpu/hdl/zealot/helpers/zpu_med1.vhdl new file mode 100644 index 0000000..a0cbcb2 --- /dev/null +++ b/zpu/hdl/zealot/helpers/zpu_med1.vhdl @@ -0,0 +1,187 @@ +------------------------------------------------------------------------------ +---- ---- +---- ZPU Medium + PHI I/O + BRAM ---- +---- ---- +---- http://www.opencores.org/ ---- +---- ---- +---- Description: ---- +---- ZPU is a 32 bits small stack cpu. This is a helper that joins the ---- +---- medium version, the PHI I/O basic layout and a program BRAM. ---- +---- ---- +---- To Do: ---- +---- - ---- +---- ---- +---- Author: ---- +---- - Salvador E. Tropea, salvador inti.gob.ar ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Copyright (c) 2008 Salvador E. Tropea <salvador inti.gob.ar> ---- +---- Copyright (c) 2008 Instituto Nacional de Tecnología Industrial ---- +---- ---- +---- Distributed under the BSD license ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Design unit: ZPU_Med1(Structural) (Entity and architecture) ---- +---- File name: zpu_med1.vhdl ---- +---- Note: None ---- +---- Limitations: None known ---- +---- Errors: None known ---- +---- Library: work ---- +---- Dependencies: IEEE.std_logic_1164 ---- +---- IEEE.numeric_std ---- +---- zpu.zpupkg ---- +---- work.zpu_memory ---- +---- Target FPGA: Spartan 3 (XC3S1500-4-FG456) ---- +---- Language: VHDL ---- +---- Wishbone: No ---- +---- Synthesis tools: Xilinx Release 9.2.03i - xst J.39 ---- +---- Simulation tools: GHDL [Sokcho edition] (0.2x) ---- +---- Text editor: SETEdit 0.5.x ---- +---- ---- +------------------------------------------------------------------------------ + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library zpu; +use zpu.zpupkg.all; + +-- RAM declaration +library work; +use work.zpu_memory.all; + +entity ZPU_Med1 is + generic( + WORD_SIZE : natural:=32; -- 32 bits data path + D_CARE_VAL : std_logic:='X'; -- Fill value + CLK_FREQ : positive:=50; -- 50 MHz clock + BRATE : positive:=9600; -- RS232 baudrate + ADDR_W : natural:=18; -- 18 bits address space=256 kB, 128 kB I/O + BRAM_W : natural:=15); -- 15 bits RAM space=32 kB + port( + clk_i : in std_logic; -- CPU clock + rst_i : in std_logic; -- Reset + break_o : out std_logic; -- Break executed + dbg_o : out zpu_dbgo_t; -- Debug info + rs232_tx_o : out std_logic; -- UART Tx + rs232_rx_i : in std_logic; -- UART Rx + gpio_in : in std_logic_vector(31 downto 0); + gpio_out : out std_logic_vector(31 downto 0); + gpio_dir : out std_logic_vector(31 downto 0) -- 1 = in, 0 = out + ); +end entity ZPU_Med1; + +architecture Structural of ZPU_Med1 is + constant BYTE_BITS : integer:=WORD_SIZE/16; -- # of bits in a word that addresses bytes + constant IO_BIT : integer:=ADDR_W-1; -- Address bit to determine this is an I/O + constant BRDIVISOR : positive:=CLK_FREQ*1e6/BRATE/4; + + -- I/O & memory (ZPU) + signal mem_busy : std_logic; + signal mem_read : unsigned(WORD_SIZE-1 downto 0); + signal mem_write : unsigned(WORD_SIZE-1 downto 0); + signal mem_addr : unsigned(ADDR_W-1 downto 0); + signal mem_we : std_logic; + signal mem_re : std_logic; + + -- Memory (SinglePort_RAM) + signal ram_busy : std_logic; + signal ram_read : unsigned(WORD_SIZE-1 downto 0); + signal ram_addr : unsigned(BRAM_W-1 downto BYTE_BITS); + signal ram_we : std_logic; + signal ram_re : std_logic; + signal ram_ready_r : std_logic:='0'; + + -- I/O (ZPU_IO) + signal io_busy : std_logic; + signal io_re : std_logic; + signal io_we : std_logic; + signal io_read : unsigned(WORD_SIZE-1 downto 0); + signal io_ready : std_logic; + signal io_reading_r : std_logic:='0'; + signal io_addr : unsigned(2 downto 0); +begin + memory: SinglePortRAM + generic map( + WORD_SIZE => WORD_SIZE, BYTE_BITS => BYTE_BITS, BRAM_W => BRAM_W) + port map( + clk_i => clk_i, + we_i => ram_we, re_i => ram_re, addr_i => ram_addr, + write_i => mem_write, read_o => ram_read, busy_o => ram_busy); + ram_addr <= mem_addr(BRAM_W-1 downto BYTE_BITS); + ram_we <= mem_we and not(mem_addr(IO_BIT)); + ram_re <= mem_re and not(mem_addr(IO_BIT)); + + -- I/O: Phi layout + io_map: ZPUPhiIO + generic map( + BRDIVISOR => BRDIVISOR, + LOG_FILE => "zpu_med1_io.log" + ) + port map( + clk_i => clk_i, + reset_i => rst_i, + busy_o => io_busy, + we_i => io_we, + re_i => io_re, + data_i => mem_write, + data_o => io_read, + addr_i => io_addr, + rs232_rx_i => rs232_rx_i, + rs232_tx_o => rs232_tx_o, + br_clk_i => '1', + gpio_in => gpio_in, + gpio_out => gpio_out, + gpio_dir => gpio_dir + ); + io_addr <= mem_addr(4 downto 2); + -- Here we decode 0x8xxxx as I/O and not just 0x80A00xx + -- Note: We define the address space as 256 kB, so writing to 0x80A00xx + -- will be as wrting to 0x200xx and hence we decode it as I/O space. + io_we <= mem_we and mem_addr(IO_BIT); + io_re <= mem_re and mem_addr(IO_BIT); + io_ready <= (io_reading_r or io_re) and not io_busy; + + zpu : ZPUMediumCore + generic map( + WORD_SIZE => WORD_SIZE, ADDR_W => ADDR_W, MEM_W => BRAM_W, + D_CARE_VAL => D_CARE_VAL) + port map( + clk_i => clk_i, reset_i => rst_i, enable_i => '1', + break_o => break_o, dbg_o => dbg_o, + -- Memory + mem_busy_i => mem_busy, data_i => mem_read, data_o => mem_write, + addr_o => mem_addr, write_en_o => mem_we, read_en_o => mem_re); + mem_busy <= io_busy or ram_busy; + + -- Memory reads either come from IO or DRAM. We need to pick the right one. + memory_control: + process (ram_read, ram_ready_r, io_ready, io_read) + begin + mem_read <= (others => '0'); + if ram_ready_r='1' then + mem_read <= ram_read; + end if; + if io_ready='1' then + mem_read <= io_read; + end if; + end process memory_control; + + memory_control_sync: + process (clk_i) + begin + if rising_edge(clk_i) then + if rst_i='1' then + io_reading_r <= '0'; + ram_ready_r <= '0'; + else + io_reading_r <= io_busy or io_re; + ram_ready_r <= ram_re; + end if; + end if; + end process memory_control_sync; +end architecture Structural; -- Entity: ZPU_Med1 + diff --git a/zpu/hdl/zealot/helpers/zpu_small1.vhdl b/zpu/hdl/zealot/helpers/zpu_small1.vhdl new file mode 100644 index 0000000..52006e4 --- /dev/null +++ b/zpu/hdl/zealot/helpers/zpu_small1.vhdl @@ -0,0 +1,153 @@ +------------------------------------------------------------------------------ +---- ---- +---- ZPU Small + PHI I/O + BRAM ---- +---- ---- +---- http://www.opencores.org/ ---- +---- ---- +---- Description: ---- +---- ZPU is a 32 bits small stack cpu. This is a helper that joins the ---- +---- small version, the PHI I/O basic layout and a program BRAM. ---- +---- ---- +---- To Do: ---- +---- - ---- +---- ---- +---- Author: ---- +---- - Salvador E. Tropea, salvador inti.gob.ar ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Copyright (c) 2008 Salvador E. Tropea <salvador inti.gob.ar> ---- +---- Copyright (c) 2008 Instituto Nacional de Tecnología Industrial ---- +---- ---- +---- Distributed under the BSD license ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Design unit: ZPU_Small1(Structural) (Entity and architecture) ---- +---- File name: zpu_small1.vhdl ---- +---- Note: None ---- +---- Limitations: None known ---- +---- Errors: None known ---- +---- Library: work ---- +---- Dependencies: IEEE.std_logic_1164 ---- +---- IEEE.numeric_std ---- +---- zpu.zpupkg ---- +---- work.zpu_memory ---- +---- Target FPGA: Spartan 3 (XC3S1500-4-FG456) ---- +---- Language: VHDL ---- +---- Wishbone: No ---- +---- Synthesis tools: Xilinx Release 9.2.03i - xst J.39 ---- +---- Simulation tools: GHDL [Sokcho edition] (0.2x) ---- +---- Text editor: SETEdit 0.5.x ---- +---- ---- +------------------------------------------------------------------------------ + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library zpu; +use zpu.zpupkg.all; + +-- RAM declaration +library work; +use work.zpu_memory.all; + +entity ZPU_Small1 is + generic( + WORD_SIZE : natural:=32; -- 32 bits data path + D_CARE_VAL : std_logic:='0'; -- Fill value + CLK_FREQ : positive:=50; -- 50 MHz clock + BRATE : positive:=115200; -- RS232 baudrate + ADDR_W : natural:=16; -- 16 bits address space=64 kB, 32 kB I/O + BRAM_W : natural:=15); -- 15 bits RAM space=32 kB + port( + clk_i : in std_logic; -- CPU clock + rst_i : in std_logic; -- Reset + break_o : out std_logic; -- Break executed + dbg_o : out zpu_dbgo_t; -- Debug info + rs232_tx_o : out std_logic; -- UART Tx + rs232_rx_i : in std_logic; -- UART Rx + gpio_in : in std_logic_vector(31 downto 0); + gpio_out : out std_logic_vector(31 downto 0); + gpio_dir : out std_logic_vector(31 downto 0) -- 1 = in, 0 = out + ); +end entity ZPU_Small1; + +architecture Structural of ZPU_Small1 is + constant BYTE_BITS : integer:=WORD_SIZE/16; -- # of bits in a word that addresses bytes + constant IO_BIT : integer:=ADDR_W-1; -- Address bit to determine this is an I/O + constant BRDIVISOR : positive:=CLK_FREQ*1e6/BRATE/4; + + -- Program+data+stack BRAM + -- Port A + signal a_we : std_logic; + signal a_addr : unsigned(BRAM_W-1 downto BYTE_BITS); + signal a_write : unsigned(WORD_SIZE-1 downto 0); + signal a_read : unsigned(WORD_SIZE-1 downto 0); + -- Port B + signal b_we : std_logic; + signal b_addr : unsigned(BRAM_W-1 downto BYTE_BITS); + signal b_write : unsigned(WORD_SIZE-1 downto 0); + signal b_read : unsigned(WORD_SIZE-1 downto 0); + + -- I/O space + signal io_busy : std_logic; + signal io_write : unsigned(WORD_SIZE-1 downto 0); + signal io_read : unsigned(WORD_SIZE-1 downto 0); + signal io_addr : unsigned(ADDR_W-1 downto 0); + signal phi_addr : unsigned(2 downto 0); + signal io_we : std_logic; + signal io_re : std_logic; +begin + memory: DualPortRAM + generic map( + WORD_SIZE => WORD_SIZE, BYTE_BITS => BYTE_BITS, BRAM_W => BRAM_W) + port map( + clk_i => clk_i, + -- Port A + a_we_i => a_we, a_addr_i => a_addr, a_write_i => a_write, + a_read_o => a_read, + -- Port B + b_we_i => b_we, b_addr_i => b_addr, b_write_i => b_write, + b_read_o => b_read); + + -- I/O: Phi layout + io_map: ZPUPhiIO + generic map( + BRDIVISOR => BRDIVISOR, + LOG_FILE => "zpu_small1_io.log" + ) + port map( + clk_i => clk_i, + reset_i => rst_i, + busy_o => io_busy, + we_i => io_we, + re_i => io_re, + data_i => io_write, + data_o => io_read, + addr_i => phi_addr, + rs232_rx_i => rs232_rx_i, + rs232_tx_o => rs232_tx_o, + br_clk_i => '1', + gpio_in => gpio_in, + gpio_out => gpio_out, + gpio_dir => gpio_dir + ); + phi_addr <= io_addr(4 downto 2); + + zpu : ZPUSmallCore + generic map( + WORD_SIZE => WORD_SIZE, ADDR_W => ADDR_W, MEM_W => BRAM_W, + D_CARE_VAL => D_CARE_VAL) + port map( + clk_i => clk_i, reset_i => rst_i, interrupt_i => '0', + break_o => break_o, dbg_o => dbg_o, + -- BRAM (text, data, bss and stack) + a_we_o => a_we, a_addr_o => a_addr, a_o => a_write, a_i => a_read, + b_we_o => b_we, b_addr_o => b_addr, b_o => b_write, b_i => b_read, + -- Memory mapped I/O + mem_busy_i => io_busy, data_i => io_read, data_o => io_write, + addr_o => io_addr, write_en_o => io_we, read_en_o => io_re); +end architecture Structural; -- Entity: ZPU_Small1 + diff --git a/zpu/hdl/zealot/roms/dmips_bram.vhdl b/zpu/hdl/zealot/roms/dmips_bram.vhdl new file mode 100644 index 0000000..977626c --- /dev/null +++ b/zpu/hdl/zealot/roms/dmips_bram.vhdl @@ -0,0 +1,4462 @@ +------------------------------------------------------------------------------ +---- ---- +---- Single Port RAM that maps to a Xilinx BRAM ---- +---- ---- +---- http://www.opencores.org/ ---- +---- ---- +---- Description: ---- +---- This is a program+data memory for the ZPU. It maps to a Xilinx BRAM ---- +---- ---- +---- To Do: ---- +---- - ---- +---- ---- +---- Author: ---- +---- - Salvador E. Tropea, salvador inti.gob.ar ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Copyright (c) 2008 Salvador E. Tropea <salvador inti.gob.ar> ---- +---- Copyright (c) 2008 Instituto Nacional de Tecnología Industrial ---- +---- ---- +---- Distributed under the BSD license ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Design unit: SinglePortRAM(Xilinx) (Entity and architecture) ---- +---- File name: rom_s.in.vhdl (template used) ---- +---- Note: None ---- +---- Limitations: None known ---- +---- Errors: None known ---- +---- Library: work ---- +---- Dependencies: IEEE.std_logic_1164 ---- +---- IEEE.numeric_std ---- +---- Target FPGA: Spartan 3 (XC3S1500-4-FG456) ---- +---- Language: VHDL ---- +---- Wishbone: No ---- +---- Synthesis tools: Xilinx Release 9.2.03i - xst J.39 ---- +---- Simulation tools: GHDL [Sokcho edition] (0.2x) ---- +---- Text editor: SETEdit 0.5.x ---- +---- ---- +------------------------------------------------------------------------------ + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity SinglePortRAM is + generic( + WORD_SIZE : integer:=32; -- Word Size 16/32 + BYTE_BITS : integer:=2; -- Bits used to address bytes + BRAM_W : integer:=15); -- Address Width + port( + clk_i : in std_logic; + we_i : in std_logic; + re_i : in std_logic; + addr_i : in unsigned(BRAM_W-1 downto BYTE_BITS); + write_i : in unsigned(WORD_SIZE-1 downto 0); + read_o : out unsigned(WORD_SIZE-1 downto 0); + busy_o : out std_logic); +end entity SinglePortRAM; + +architecture Xilinx of SinglePortRAM is + type ram_type is array(natural range 0 to ((2**BRAM_W)/4)-1) of unsigned(WORD_SIZE-1 downto 0); + signal addr_r : unsigned(BRAM_W-1 downto BYTE_BITS); + + signal ram : ram_type := +( + 0 => x"0b0b0b0b", + 1 => x"82700b0b", + 2 => x"80f8ec0c", + 3 => x"3a0b0b80", + 4 => x"e7ea0400", + 5 => x"00000000", + 6 => x"00000000", + 7 => x"00000000", + 8 => x"80088408", + 9 => x"88080b0b", + 10 => x"80e8b72d", + 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"0b0b80f8", + 162 => x"d8738306", + 163 => x"10100508", + 164 => x"060b0b0b", + 165 => x"88aa0400", + 166 => x"00000000", + 167 => x"00000000", + 168 => x"80088408", + 169 => x"88087575", + 170 => x"0b0b80ce", + 171 => x"b62d5050", + 172 => x"80085688", + 173 => x"0c840c80", + 174 => x"0c510400", + 175 => x"00000000", + 176 => x"80088408", + 177 => x"88087575", + 178 => x"0b0b80cf", + 179 => x"e82d5050", + 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"80f8e80c", + 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"83803f80", + 257 => x"e2953f04", + 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"0b8188e0", + 282 => x"08527108", + 283 => x"70882a81", + 284 => x"32708106", + 285 => x"51515170", + 286 => x"f1387372", + 287 => x"0c833d0d", + 288 => x"0480f8e8", + 289 => x"08802ea4", + 290 => x"3880f8ec", + 291 => x"08822ebd", + 292 => x"38838080", + 293 => x"0b0b0b81", + 294 => x"88e00c82", + 295 => x"a0800b81", + 296 => x"88e40c82", + 297 => x"90800b81", + 298 => x"88e80c04", + 299 => x"f8808080", + 300 => x"a40b0b0b", + 301 => x"8188e00c", + 302 => x"f8808082", + 303 => x"800b8188", + 304 => x"e40cf880", + 305 => x"8084800b", + 306 => x"8188e80c", + 307 => x"0480c0a8", + 308 => x"808c0b0b", + 309 => x"0b8188e0", + 310 => x"0c80c0a8", + 311 => x"80940b81", + 312 => x"88e40c0b", + 313 => x"0b80eac8", + 314 => x"0b8188e8", + 315 => x"0c04f23d", + 316 => x"0d608188", + 317 => x"e408565d", + 318 => x"82750c80", + 319 => x"59805a80", + 320 => x"0b8f3d5d", + 321 => x"5b7a1010", + 322 => x"15700871", + 323 => x"08719f2c", + 324 => x"7e852b58", + 325 => x"55557d53", + 326 => x"59579d94", + 327 => x"3f7d7f7a", + 328 => x"72077c72", + 329 => x"07717160", + 330 => x"8105415f", + 331 => x"5d5b5957", + 332 => x"55817b27", + 333 => x"8f38767d", + 334 => x"0c77841e", + 335 => x"0c7c800c", + 336 => x"903d0d04", + 337 => x"8188e408", + 338 => x"55ffba39", + 339 => x"ff3d0d81", + 340 => x"88ec3351", + 341 => x"70a73880", + 342 => x"f8f40870", + 343 => x"08525270", + 344 => x"802e9438", + 345 => x"841280f8", + 346 => x"f40c702d", + 347 => x"80f8f408", + 348 => x"70085252", + 349 => x"70ee3881", + 350 => x"0b8188ec", + 351 => x"34833d0d", + 352 => x"0404803d", + 353 => x"0d0b0b81", + 354 => x"88dc0880", + 355 => x"2e8e380b", + 356 => x"0b0b0b80", + 357 => x"0b802e09", + 358 => x"81068538", + 359 => x"823d0d04", + 360 => x"0b0b8188", + 361 => x"dc510b0b", + 362 => x"0bf4d53f", + 363 => x"823d0d04", + 364 => x"04ff3d0d", + 365 => x"028f0533", + 366 => x"52718a2e", + 367 => x"8a387151", + 368 => x"fd9e3f83", + 369 => x"3d0d048d", + 370 => x"51fd953f", + 371 => x"7151fd90", + 372 => x"3f833d0d", + 373 => x"04ce3d0d", + 374 => x"b53d7070", + 375 => x"84055208", + 376 => x"8bb15c56", + 377 => x"a53d5e5c", + 378 => x"80757081", + 379 => x"05573376", + 380 => x"5b555873", + 381 => x"782e80c1", + 382 => x"388e3d5b", + 383 => x"73a52e09", + 384 => x"810680c5", + 385 => x"38787081", + 386 => x"055a3354", + 387 => x"7380e42e", + 388 => x"81b63873", + 389 => x"80e42480", + 390 => x"c6387380", + 391 => x"e32ea138", + 392 => x"8052a551", + 393 => x"792d8052", + 394 => x"7351792d", + 395 => x"82185878", + 396 => x"7081055a", + 397 => x"335473c4", + 398 => x"3877800c", + 399 => x"b43d0d04", + 400 => x"7b841d83", + 401 => x"1233565d", + 402 => x"57805273", + 403 => x"51792d81", + 404 => x"18797081", + 405 => x"055b3355", + 406 => x"5873ffa0", + 407 => x"38db3973", + 408 => x"80f32e09", + 409 => x"8106ffb8", + 410 => x"387b841d", + 411 => x"7108595d", + 412 => x"56807733", + 413 => x"55567376", + 414 => x"2e8d3881", + 415 => x"16701870", + 416 => x"33575556", + 417 => x"74f538ff", + 418 => x"16558076", + 419 => x"25ffa038", + 420 => x"76708105", + 421 => x"58335480", + 422 => x"52735179", + 423 => x"2d811875", + 424 => x"ff175757", + 425 => x"58807625", + 426 => x"ff853876", + 427 => x"70810558", + 428 => x"33548052", + 429 => x"7351792d", + 430 => x"811875ff", + 431 => x"17575758", + 432 => x"758024cc", + 433 => x"38fee839", + 434 => x"7b841d71", + 435 => x"0870719f", + 436 => x"2c595359", + 437 => x"5d568075", + 438 => x"24819338", + 439 => x"757d7c58", + 440 => x"56548057", + 441 => x"73772e09", + 442 => x"8106b638", + 443 => x"b07b3402", + 444 => x"b505567a", + 445 => x"762e9738", + 446 => x"ff165675", + 447 => x"33757081", + 448 => x"05573481", + 449 => x"17577a76", + 450 => x"2e098106", + 451 => x"eb388075", + 452 => x"34767dff", + 453 => x"12575856", + 454 => x"758024fe", + 455 => x"f338fe8f", + 456 => x"398a5273", + 457 => x"5180c1c0", + 458 => x"3f800880", + 459 => x"eacc0533", + 460 => x"76708105", + 461 => x"58348a52", + 462 => x"7351bffa", + 463 => x"3f800854", + 464 => x"8008802e", + 465 => x"ffad388a", + 466 => x"52735180", + 467 => x"c19a3f80", + 468 => x"0880eacc", + 469 => x"05337670", + 470 => x"81055834", + 471 => x"8a527351", + 472 => x"bfd43f80", + 473 => x"08548008", + 474 => x"ffb738ff", + 475 => x"86397452", + 476 => x"7653b43d", + 477 => x"ffb80551", + 478 => x"978a3fa3", + 479 => x"3d0856fe", + 480 => x"db39803d", + 481 => x"0d80c10b", + 482 => x"81d7b834", + 483 => x"800b81d9", + 484 => x"940c7080", + 485 => x"0c823d0d", + 486 => x"04ff3d0d", + 487 => x"800b81d7", + 488 => x"b8335252", + 489 => x"7080c12e", + 490 => x"99387181", + 491 => x"d9940807", + 492 => x"81d9940c", + 493 => x"80c20b81", + 494 => x"d7bc3470", + 495 => x"800c833d", + 496 => x"0d04810b", + 497 => x"81d99408", + 498 => x"0781d994", + 499 => x"0c80c20b", + 500 => x"81d7bc34", + 501 => x"70800c83", + 502 => x"3d0d04fd", + 503 => x"3d0d7570", + 504 => x"088a0553", + 505 => x"5381d7b8", + 506 => x"33517080", + 507 => x"c12e8b38", + 508 => x"73f33870", + 509 => x"800c853d", + 510 => x"0d04ff12", + 511 => x"7081d7b4", + 512 => x"0831740c", + 513 => x"800c853d", + 514 => x"0d04fc3d", + 515 => x"0d81d7c0", + 516 => x"08557480", + 517 => x"2e8c3876", + 518 => x"7508710c", + 519 => x"81d7c008", + 520 => x"56548c15", + 521 => x"5381d7b4", + 522 => x"08528a51", + 523 => x"8fe73f73", + 524 => x"800c863d", + 525 => x"0d04fb3d", + 526 => x"0d777008", + 527 => x"5656b053", + 528 => x"81d7c008", + 529 => x"52745180", + 530 => x"cdff3f85", + 531 => x"0b8c170c", + 532 => x"850b8c16", + 533 => x"0c750875", + 534 => x"0c81d7c0", + 535 => x"08547380", + 536 => x"2e8a3873", + 537 => x"08750c81", + 538 => x"d7c00854", + 539 => x"8c145381", + 540 => x"d7b40852", + 541 => x"8a518f9d", + 542 => x"3f841508", + 543 => x"ad38860b", + 544 => x"8c160c88", + 545 => x"15528816", + 546 => x"08518ea9", + 547 => x"3f81d7c0", + 548 => x"08700876", + 549 => x"0c548c15", + 550 => x"7054548a", + 551 => x"52730851", + 552 => x"8ef33f73", + 553 => x"800c873d", + 554 => x"0d047508", + 555 => x"54b05373", + 556 => x"52755180", + 557 => x"cd933f73", + 558 => x"800c873d", + 559 => x"0d04d93d", + 560 => x"0d80f980", + 561 => x"0b8188e8", + 562 => x"0cb05180", + 563 => x"c0e43f80", + 564 => x"0881d7b0", + 565 => x"0cb05180", + 566 => x"c0d83f80", + 567 => x"0881d7c0", + 568 => x"0c81d7b0", + 569 => x"0880080c", + 570 => x"800b8008", + 571 => x"84050c82", + 572 => x"0b800888", + 573 => x"050ca80b", + 574 => x"80088c05", + 575 => x"0c9f5380", + 576 => x"ead85280", + 577 => x"08900551", + 578 => x"80ccbe3f", + 579 => x"a13d5e9f", + 580 => x"5380eaf8", + 581 => x"527d5180", + 582 => x"ccaf3f8a", + 583 => x"0b8195f4", + 584 => x"0c80f59c", + 585 => x"51f9ae3f", + 586 => x"80eb9851", + 587 => x"f9a73f80", + 588 => x"f59c51f9", + 589 => x"a03f80f8", + 590 => x"fc08802e", + 591 => x"89d73880", + 592 => x"ebc851f9", + 593 => x"903f80f5", + 594 => x"9c51f989", + 595 => x"3f80f8f8", + 596 => x"085280eb", + 597 => x"f451f8fd", + 598 => x"3f818990", + 599 => x"5180d5da", + 600 => x"3f810b9a", + 601 => x"3d5e5b80", + 602 => x"0b80f8f8", + 603 => x"082582d6", + 604 => x"38903d5f", + 605 => x"80c10b81", + 606 => x"d7b83481", + 607 => x"0b81d994", + 608 => x"0c80c20b", + 609 => x"81d7bc34", + 610 => x"8240835a", + 611 => x"9f5380ec", + 612 => x"a4527c51", + 613 => x"80cbb23f", + 614 => x"8141807d", + 615 => x"537e5256", + 616 => x"8e973f80", + 617 => x"08762e09", + 618 => x"81068338", + 619 => x"81567581", + 620 => x"d9940c7f", + 621 => x"70585675", + 622 => x"8325a238", + 623 => x"75101016", + 624 => x"fd0542a9", + 625 => x"3dffa405", + 626 => x"53835276", + 627 => x"518cc63f", + 628 => x"7f810570", + 629 => x"41705856", + 630 => x"837624e0", + 631 => x"38615475", + 632 => x"53818998", + 633 => x"5281d7cc", + 634 => x"518cba3f", + 635 => x"81d7c008", + 636 => x"70085858", + 637 => x"b0537752", + 638 => x"765180ca", + 639 => x"cc3f850b", + 640 => x"8c190c85", + 641 => x"0b8c180c", + 642 => x"7708770c", + 643 => x"81d7c008", + 644 => x"5675802e", + 645 => x"8a387508", + 646 => x"770c81d7", + 647 => x"c008568c", + 648 => x"165381d7", + 649 => x"b408528a", + 650 => x"518bea3f", + 651 => x"84170887", + 652 => x"eb38860b", + 653 => x"8c180c88", + 654 => x"17528818", + 655 => x"08518af5", + 656 => x"3f81d7c0", + 657 => x"08700878", + 658 => x"0c568c17", + 659 => x"7054598a", + 660 => x"52780851", + 661 => x"8bbf3f80", + 662 => x"c10b81d7", + 663 => x"bc335757", + 664 => x"767626a2", + 665 => x"3880c352", + 666 => x"76518ca3", + 667 => x"3f800861", + 668 => x"2e89e638", + 669 => x"81177081", + 670 => x"ff0681d7", + 671 => x"bc335858", + 672 => x"58757727", + 673 => x"e0387960", + 674 => x"29627054", + 675 => x"71535b59", + 676 => x"b9a43f80", + 677 => x"0840787a", + 678 => x"31708729", + 679 => x"80083180", + 680 => x"088a0581", + 681 => x"d7b83381", + 682 => x"d7b4085e", + 683 => x"5b525a56", + 684 => x"7780c12e", + 685 => x"89d0387b", + 686 => x"f738811b", + 687 => x"5b80f8f8", + 688 => x"087b25fd", + 689 => x"af3881d7", + 690 => x"a85180d2", + 691 => x"ed3f80ec", + 692 => x"c451f681", + 693 => x"3f80f59c", + 694 => x"51f5fa3f", + 695 => x"80ecd451", + 696 => x"f5f33f80", + 697 => x"f59c51f5", + 698 => x"ec3f81d7", + 699 => x"b4085280", + 700 => x"ed8c51f5", + 701 => x"e03f8552", + 702 => x"80eda851", + 703 => x"f5d73f81", + 704 => x"d9940852", + 705 => x"80edc451", + 706 => x"f5cb3f81", + 707 => x"5280eda8", + 708 => x"51f5c23f", + 709 => x"81d7b833", + 710 => x"5280ede0", + 711 => x"51f5b63f", + 712 => x"80c15280", + 713 => x"edfc51f5", + 714 => x"ac3f81d7", + 715 => x"bc335280", + 716 => x"ee9851f5", + 717 => x"a03f80c2", + 718 => x"5280edfc", + 719 => x"51f5963f", + 720 => x"81d7ec08", + 721 => x"5280eeb4", + 722 => x"51f58a3f", + 723 => x"875280ed", + 724 => x"a851f581", + 725 => x"3f8195f4", + 726 => x"085280ee", + 727 => x"d051f4f5", + 728 => x"3f80eeec", + 729 => x"51f4ee3f", + 730 => x"80ef9851", + 731 => x"f4e73f81", + 732 => x"d7c00870", + 733 => x"08535a80", + 734 => x"efa451f4", + 735 => x"d83f80ef", + 736 => x"c051f4d1", + 737 => x"3f81d7c0", + 738 => x"08841108", + 739 => x"535680ef", + 740 => x"f451f4c1", + 741 => x"3f805280", + 742 => x"eda851f4", + 743 => x"b83f81d7", + 744 => x"c0088811", + 745 => x"08535880", + 746 => x"f09051f4", + 747 => x"a83f8252", + 748 => x"80eda851", + 749 => x"f49f3f81", + 750 => x"d7c0088c", + 751 => x"11085357", + 752 => x"80f0ac51", + 753 => x"f48f3f91", + 754 => x"5280eda8", + 755 => x"51f4863f", + 756 => x"81d7c008", + 757 => x"90055280", + 758 => x"f0c851f3", + 759 => x"f83f80f0", + 760 => x"e451f3f1", + 761 => x"3f80f19c", + 762 => x"51f3ea3f", + 763 => x"81d7b008", + 764 => x"7008535f", + 765 => x"80efa451", + 766 => x"f3db3f80", + 767 => x"f1b051f3", + 768 => x"d43f81d7", + 769 => x"b0088411", + 770 => x"08535b80", + 771 => x"eff451f3", + 772 => x"c43f8052", + 773 => x"80eda851", + 774 => x"f3bb3f81", + 775 => x"d7b00888", + 776 => x"1108535c", + 777 => x"80f09051", + 778 => x"f3ab3f81", + 779 => x"5280eda8", + 780 => x"51f3a23f", + 781 => x"81d7b008", + 782 => x"8c110853", + 783 => x"5a80f0ac", + 784 => x"51f3923f", + 785 => x"925280ed", + 786 => x"a851f389", + 787 => x"3f81d7b0", + 788 => x"08900552", + 789 => x"80f0c851", + 790 => x"f2fb3f80", + 791 => x"f0e451f2", + 792 => x"f43f7f52", + 793 => x"80f1f051", + 794 => x"f2eb3f85", + 795 => x"5280eda8", + 796 => x"51f2e23f", + 797 => x"785280f2", + 798 => x"8c51f2d9", + 799 => x"3f8d5280", + 800 => x"eda851f2", + 801 => x"d03f6152", + 802 => x"80f2a851", + 803 => x"f2c73f87", + 804 => x"5280eda8", + 805 => x"51f2be3f", + 806 => x"605280f2", + 807 => x"c451f2b5", + 808 => x"3f815280", + 809 => x"eda851f2", + 810 => x"ac3f7d52", + 811 => x"80f2e051", + 812 => x"f2a33f80", + 813 => x"f2fc51f2", + 814 => x"9c3f7c52", + 815 => x"80f3b451", + 816 => x"f2933f80", + 817 => x"f3d051f2", + 818 => x"8c3f80f5", + 819 => x"9c51f285", + 820 => x"3f81d7a8", + 821 => x"0881d7ac", + 822 => x"08818990", + 823 => x"08818994", + 824 => x"08727131", + 825 => x"70742675", + 826 => x"74317072", + 827 => x"31818988", + 828 => x"0c444481", + 829 => x"898c0c81", + 830 => x"898c0856", + 831 => x"80f48855", + 832 => x"5c595758", + 833 => x"f1cf3f81", + 834 => x"89880856", + 835 => x"80762582", + 836 => x"a43880f8", + 837 => x"f8087071", + 838 => x"9f2c9a3d", + 839 => x"53565681", + 840 => x"89880881", + 841 => x"898c0841", + 842 => x"537f5470", + 843 => x"525a8ef6", + 844 => x"3f66685f", + 845 => x"8188f80c", + 846 => x"7d8188fc", + 847 => x"0c80f8f8", + 848 => x"08709f2c", + 849 => x"58568058", + 850 => x"bd84c078", + 851 => x"55557652", + 852 => x"75537951", + 853 => x"87d23f95", + 854 => x"3d818988", + 855 => x"0881898c", + 856 => x"0841557f", + 857 => x"56676940", + 858 => x"537e5470", + 859 => x"525c8eb6", + 860 => x"3f64665e", + 861 => x"8189800c", + 862 => x"7c818984", + 863 => x"0c80f8f8", + 864 => x"08709f2c", + 865 => x"40588057", + 866 => x"83dceb94", + 867 => x"80775555", + 868 => x"7e527753", + 869 => x"7b518790", + 870 => x"3f64665d", + 871 => x"5b805e8d", + 872 => x"dd7e5555", + 873 => x"81898808", + 874 => x"81898c08", + 875 => x"59527753", + 876 => x"795186f4", + 877 => x"3f666840", + 878 => x"547e557a", + 879 => x"527b53a9", + 880 => x"3dffa805", + 881 => x"518ddf3f", + 882 => x"62645e81", + 883 => x"d7c40c7c", + 884 => x"81d7c80c", + 885 => x"80f49851", + 886 => x"effb3f81", + 887 => x"88fc0852", + 888 => x"80f4c851", + 889 => x"efef3f80", + 890 => x"f4d051ef", + 891 => x"e83f8189", + 892 => x"84085280", + 893 => x"f4c851ef", + 894 => x"dc3f81d7", + 895 => x"c8085280", + 896 => x"f58051ef", + 897 => x"d03f80f5", + 898 => x"9c51efc9", + 899 => x"3f800b80", + 900 => x"0ca93d0d", + 901 => x"0480f5a0", + 902 => x"51f6a839", + 903 => x"770857b0", + 904 => x"53765277", + 905 => x"5180c2a1", + 906 => x"3f80c10b", + 907 => x"81d7bc33", + 908 => x"5757f8ac", + 909 => x"39758a38", + 910 => x"81898c08", + 911 => x"8126fdd2", + 912 => x"3880f5d0", + 913 => x"51ef8e3f", + 914 => x"80f68851", + 915 => x"ef873f80", + 916 => x"f59c51ef", + 917 => x"803f80f8", + 918 => x"f8087071", + 919 => x"9f2c9a3d", + 920 => x"53565681", + 921 => x"89880881", + 922 => x"898c0841", + 923 => x"537f5470", + 924 => x"525a8cb2", + 925 => x"3f66685f", + 926 => x"8188f80c", + 927 => x"7d8188fc", + 928 => x"0c80f8f8", + 929 => x"08709f2c", + 930 => x"58568058", + 931 => x"bd84c078", + 932 => x"55557652", + 933 => x"75537951", + 934 => x"858e3f95", + 935 => x"3d818988", + 936 => x"0881898c", + 937 => x"0841557f", + 938 => x"56676940", + 939 => x"537e5470", + 940 => x"525c8bf2", + 941 => x"3f64665e", + 942 => x"8189800c", + 943 => x"7c818984", + 944 => x"0c80f8f8", + 945 => x"08709f2c", + 946 => x"40588057", + 947 => x"83dceb94", + 948 => x"80775555", + 949 => x"7e527753", + 950 => x"7b5184cc", + 951 => x"3f64665d", + 952 => x"5b805e8d", + 953 => x"dd7e5555", + 954 => x"81898808", + 955 => x"81898c08", + 956 => x"59527753", + 957 => x"795184b0", + 958 => x"3f666840", + 959 => x"547e557a", + 960 => x"527b53a9", + 961 => x"3dffa805", + 962 => x"518b9b3f", + 963 => x"62645e81", + 964 => x"d7c40c7c", + 965 => x"81d7c80c", + 966 => x"80f49851", + 967 => x"edb73f81", + 968 => x"88fc0852", + 969 => x"80f4c851", + 970 => x"edab3f80", + 971 => x"f4d051ed", + 972 => x"a43f8189", + 973 => x"84085280", + 974 => x"f4c851ed", + 975 => x"983f81d7", + 976 => x"c8085280", + 977 => x"f58051ed", + 978 => x"8c3f80f5", + 979 => x"9c51ed85", + 980 => x"3f800b80", + 981 => x"0ca93d0d", + 982 => x"04a93dff", + 983 => x"a0055280", + 984 => x"5180d23f", + 985 => x"9f5380f6", + 986 => x"a8527c51", + 987 => x"bfdb3f7a", + 988 => x"7b81d7b4", + 989 => x"0c811870", + 990 => x"81ff0681", + 991 => x"d7bc3359", + 992 => x"59595af5", + 993 => x"fc39ff16", + 994 => x"707b3160", + 995 => x"0c5c800b", + 996 => x"811c5c5c", + 997 => x"80f8f808", + 998 => x"7b25f3d8", + 999 => x"38f6a739", + 1000 => x"ff3d0d73", + 1001 => x"82327030", + 1002 => x"70720780", + 1003 => x"25800c52", + 1004 => x"52833d0d", + 1005 => x"04fe3d0d", + 1006 => x"74767153", + 1007 => x"54527182", + 1008 => x"2e833883", + 1009 => x"5171812e", + 1010 => x"9a388172", + 1011 => x"269f3871", + 1012 => x"822eb838", + 1013 => x"71842ea9", + 1014 => x"3870730c", + 1015 => x"70800c84", + 1016 => x"3d0d0480", + 1017 => x"e40b81d7", + 1018 => x"b408258b", + 1019 => x"3880730c", + 1020 => x"70800c84", + 1021 => x"3d0d0483", + 1022 => x"730c7080", + 1023 => x"0c843d0d", + 1024 => x"0482730c", + 1025 => x"70800c84", + 1026 => x"3d0d0481", + 1027 => x"730c7080", + 1028 => x"0c843d0d", + 1029 => x"04803d0d", + 1030 => x"74741482", + 1031 => x"05710c80", + 1032 => x"0c823d0d", + 1033 => x"04f73d0d", + 1034 => x"7b7d7f61", + 1035 => x"85127082", + 1036 => x"2b751170", + 1037 => x"74717084", + 1038 => x"05530c5a", + 1039 => x"5a5d5b76", + 1040 => x"0c7980f8", + 1041 => x"180c7986", + 1042 => x"12525758", + 1043 => x"5a5a7676", + 1044 => x"24993876", + 1045 => x"b329822b", + 1046 => x"79115153", + 1047 => x"76737084", + 1048 => x"05550c81", + 1049 => x"14547574", + 1050 => x"25f23876", + 1051 => x"81cc2919", + 1052 => x"fc110881", + 1053 => x"05fc120c", + 1054 => x"7a197008", + 1055 => x"9fa0130c", + 1056 => x"5856850b", + 1057 => x"81d7b40c", + 1058 => x"75800c8b", + 1059 => x"3d0d04fe", + 1060 => x"3d0d0293", + 1061 => x"05335180", + 1062 => x"02840597", + 1063 => x"05335452", + 1064 => x"70732e88", + 1065 => x"3871800c", + 1066 => x"843d0d04", + 1067 => x"7081d7b8", + 1068 => x"34810b80", + 1069 => x"0c843d0d", + 1070 => x"04f83d0d", + 1071 => x"7a7c5956", + 1072 => x"820b8319", + 1073 => x"55557416", + 1074 => x"70337533", + 1075 => x"5b515372", + 1076 => x"792e80c6", + 1077 => x"3880c10b", + 1078 => x"81168116", + 1079 => x"56565782", + 1080 => x"7525e338", + 1081 => x"ffa91770", + 1082 => x"81ff0655", + 1083 => x"59738226", + 1084 => x"83388755", + 1085 => x"81537680", + 1086 => x"d22e9838", + 1087 => x"77527551", + 1088 => x"be963f80", + 1089 => x"53728008", + 1090 => x"25893887", + 1091 => x"1581d7b4", + 1092 => x"0c815372", + 1093 => x"800c8a3d", + 1094 => x"0d047281", + 1095 => x"d7b83482", + 1096 => x"7525ffa2", + 1097 => x"38ffbd39", + 1098 => x"8c08028c", + 1099 => x"0ceb3d0d", + 1100 => x"800b8c08", + 1101 => x"f0050c80", + 1102 => x"0b8c08f4", + 1103 => x"050c8c08", + 1104 => x"8c05088c", + 1105 => x"08900508", + 1106 => x"5654738c", + 1107 => x"08f0050c", + 1108 => x"748c08f4", + 1109 => x"050c8c08", + 1110 => x"f8058c08", + 1111 => x"f0055656", + 1112 => x"88705475", + 1113 => x"53765254", + 1114 => x"bbdf3f80", + 1115 => x"0b8c08e8", + 1116 => x"050c800b", + 1117 => x"8c08ec05", + 1118 => x"0c8c0894", + 1119 => x"05088c08", + 1120 => x"98050856", + 1121 => x"54738c08", + 1122 => x"e8050c74", + 1123 => x"8c08ec05", + 1124 => x"0c8c08f0", + 1125 => x"058c08e8", + 1126 => x"05565688", + 1127 => x"70547553", + 1128 => x"765254bb", + 1129 => x"a43f800b", + 1130 => x"8c08e805", + 1131 => x"0c800b8c", + 1132 => x"08ec050c", + 1133 => x"8c08fc05", + 1134 => x"0883ffff", + 1135 => x"068c08cc", + 1136 => x"050c8c08", + 1137 => x"fc050890", + 1138 => x"2a8c08c4", + 1139 => x"050c8c08", + 1140 => x"f4050883", + 1141 => x"ffff068c", + 1142 => x"08c8050c", + 1143 => x"8c08f405", + 1144 => x"08902a8c", + 1145 => x"08c0050c", + 1146 => x"8c08cc05", + 1147 => x"088c08c8", + 1148 => x"05082970", + 1149 => x"8c08dc05", + 1150 => x"0c8c08cc", + 1151 => x"05088c08", + 1152 => x"c0050829", + 1153 => x"708c08d8", + 1154 => x"050c8c08", + 1155 => x"c405088c", + 1156 => x"08c80508", + 1157 => x"29708c08", + 1158 => x"d4050c8c", + 1159 => x"08c40508", + 1160 => x"8c08c005", + 1161 => x"0829708c", + 1162 => x"08d0050c", + 1163 => x"8c08dc05", + 1164 => x"08902a8c", + 1165 => x"08d80508", + 1166 => x"118c08d8", + 1167 => x"050c8c08", + 1168 => x"d805088c", + 1169 => x"08d40508", + 1170 => x"058c08d8", + 1171 => x"050c5151", + 1172 => x"5151548c", + 1173 => x"08d80508", + 1174 => x"8c08d405", + 1175 => x"08278f38", + 1176 => x"8c08d005", + 1177 => x"08848080", + 1178 => x"058c08d0", + 1179 => x"050c8c08", + 1180 => x"d8050890", + 1181 => x"2a8c08d0", + 1182 => x"0508118c", + 1183 => x"08e0050c", + 1184 => x"8c08d805", + 1185 => x"0883ffff", + 1186 => x"0670902b", + 1187 => x"8c08dc05", + 1188 => x"0883ffff", + 1189 => x"0670128c", + 1190 => x"08e4050c", + 1191 => x"52575154", + 1192 => x"8c08e005", + 1193 => x"088c08e4", + 1194 => x"05085654", + 1195 => x"738c08e8", + 1196 => x"050c748c", + 1197 => x"08ec050c", + 1198 => x"8c08fc05", + 1199 => x"088c08f0", + 1200 => x"0508298c", + 1201 => x"08f80508", + 1202 => x"8c08f405", + 1203 => x"08297012", + 1204 => x"8c08e805", + 1205 => x"08118c08", + 1206 => x"e8050c51", + 1207 => x"55558c08", + 1208 => x"e805088c", + 1209 => x"08ec0508", + 1210 => x"8c088805", + 1211 => x"08585654", + 1212 => x"73760c74", + 1213 => x"84170c8c", + 1214 => x"08880508", + 1215 => x"800c973d", + 1216 => x"0d8c0c04", + 1217 => x"8c08028c", + 1218 => x"0cf63d0d", + 1219 => x"800b8c08", + 1220 => x"f0050c80", + 1221 => x"0b8c08f4", + 1222 => x"050c8c08", + 1223 => x"8c05088c", + 1224 => x"08900508", + 1225 => x"5654738c", + 1226 => x"08f0050c", + 1227 => x"748c08f4", + 1228 => x"050c8c08", + 1229 => x"f8058c08", + 1230 => x"f0055656", + 1231 => x"88705475", + 1232 => x"53765254", + 1233 => x"b8833f80", + 1234 => x"0b8c08f0", + 1235 => x"050c800b", + 1236 => x"8c08f405", + 1237 => x"0c8c08f8", + 1238 => x"0508308c", + 1239 => x"08ec050c", + 1240 => x"8c08fc05", + 1241 => x"08802e8d", + 1242 => x"388c08ec", + 1243 => x"0508ff05", + 1244 => x"8c08ec05", + 1245 => x"0c8c08ec", + 1246 => x"05088c08", + 1247 => x"f0050c8c", + 1248 => x"08fc0508", + 1249 => x"308c08f4", + 1250 => x"050c8c08", + 1251 => x"f005088c", + 1252 => x"08f40508", + 1253 => x"8c088805", + 1254 => x"08585654", + 1255 => x"73760c74", + 1256 => x"84170c8c", + 1257 => x"08880508", + 1258 => x"800c8c3d", + 1259 => x"0d8c0c04", + 1260 => x"8c08028c", + 1261 => x"0cf53d0d", + 1262 => x"8c089405", + 1263 => x"089d388c", + 1264 => x"088c0508", + 1265 => x"8c089005", + 1266 => x"088c0888", + 1267 => x"05085856", + 1268 => x"5473760c", + 1269 => x"7484170c", + 1270 => x"81bf3980", + 1271 => x"0b8c08f0", + 1272 => x"050c800b", + 1273 => x"8c08f405", + 1274 => x"0c8c088c", + 1275 => x"05088c08", + 1276 => x"90050856", + 1277 => x"54738c08", + 1278 => x"f0050c74", + 1279 => x"8c08f405", + 1280 => x"0c8c08f8", + 1281 => x"058c08f0", + 1282 => x"05565688", + 1283 => x"70547553", + 1284 => x"765254b6", + 1285 => x"b43fa00b", + 1286 => x"8c089405", + 1287 => x"08318c08", + 1288 => x"ec050c8c", + 1289 => x"08ec0508", + 1290 => x"80249d38", + 1291 => x"800b8c08", + 1292 => x"f4050c8c", + 1293 => x"08ec0508", + 1294 => x"308c08fc", + 1295 => x"0508712b", + 1296 => x"8c08f005", + 1297 => x"0c54b939", + 1298 => x"8c08fc05", + 1299 => x"088c08ec", + 1300 => x"05082a8c", + 1301 => x"08e8050c", + 1302 => x"8c08fc05", + 1303 => x"088c0894", + 1304 => x"05082b8c", + 1305 => x"08f4050c", + 1306 => x"8c08f805", + 1307 => x"088c0894", + 1308 => x"05082b70", + 1309 => x"8c08e805", + 1310 => x"08078c08", + 1311 => x"f0050c54", + 1312 => x"8c08f005", + 1313 => x"088c08f4", + 1314 => x"05088c08", + 1315 => x"88050858", + 1316 => x"56547376", + 1317 => x"0c748417", + 1318 => x"0c8c0888", + 1319 => x"0508800c", + 1320 => x"8d3d0d8c", + 1321 => x"0c048c08", + 1322 => x"028c0ccc", + 1323 => x"3d0d800b", + 1324 => x"8c08fc05", + 1325 => x"0c800b8c", + 1326 => x"08ec050c", + 1327 => x"800b8c08", + 1328 => x"f0050c8c", + 1329 => x"088c0508", + 1330 => x"8c089005", + 1331 => x"08565473", + 1332 => x"8c08ec05", + 1333 => x"0c748c08", + 1334 => x"f0050c8c", + 1335 => x"08f4058c", + 1336 => x"08ec0556", + 1337 => x"56887054", + 1338 => x"75537652", + 1339 => x"54b4da3f", + 1340 => x"800b8c08", + 1341 => x"e4050c80", + 1342 => x"0b8c08e8", + 1343 => x"050c8c08", + 1344 => x"9405088c", + 1345 => x"08980508", + 1346 => x"5654738c", + 1347 => x"08e4050c", + 1348 => x"748c08e8", + 1349 => x"050c8c08", + 1350 => x"ec058c08", + 1351 => x"e4055656", + 1352 => x"88705475", + 1353 => x"53765254", + 1354 => x"b49f3f8c", + 1355 => x"08f40508", + 1356 => x"8025be38", + 1357 => x"8c08fc05", + 1358 => x"08098c08", + 1359 => x"fc050c8c", + 1360 => x"08d40554", + 1361 => x"8c08f405", + 1362 => x"088c08f8", + 1363 => x"05085755", + 1364 => x"74527553", + 1365 => x"7351fbac", + 1366 => x"3f8c08d4", + 1367 => x"05088c08", + 1368 => x"d8050856", + 1369 => x"54738c08", + 1370 => x"f4050c74", + 1371 => x"8c08f805", + 1372 => x"0c8c08ec", + 1373 => x"05088025", + 1374 => x"be388c08", + 1375 => x"fc050809", + 1376 => x"8c08fc05", + 1377 => x"0c8c08d4", + 1378 => x"05548c08", + 1379 => x"ec05088c", + 1380 => x"08f00508", + 1381 => x"57557452", + 1382 => x"75537351", + 1383 => x"fae63f8c", + 1384 => x"08d40508", + 1385 => x"8c08d805", + 1386 => x"08565473", + 1387 => x"8c08ec05", + 1388 => x"0c748c08", + 1389 => x"f0050c8c", + 1390 => x"08f40508", + 1391 => x"8c08f805", + 1392 => x"08565473", + 1393 => x"8c08d405", + 1394 => x"0c748c08", + 1395 => x"d8050c8c", + 1396 => x"08ec0508", + 1397 => x"8c08f005", + 1398 => x"08565473", + 1399 => x"8c08cc05", + 1400 => x"0c748c08", + 1401 => x"d0050c80", + 1402 => x"0b8c08c8", + 1403 => x"050c800b", + 1404 => x"8c08e405", + 1405 => x"0c800b8c", + 1406 => x"08e8050c", + 1407 => x"8c08d405", + 1408 => x"088c08d8", + 1409 => x"05085654", + 1410 => x"738c08e4", + 1411 => x"050c748c", + 1412 => x"08e8050c", + 1413 => x"800b8c08", + 1414 => x"ffb8050c", + 1415 => x"800b8c08", + 1416 => x"ffbc050c", + 1417 => x"8c08cc05", + 1418 => x"088c08d0", + 1419 => x"05085654", + 1420 => x"738c08ff", + 1421 => x"b8050c74", + 1422 => x"8c08ffbc", + 1423 => x"050c8c08", + 1424 => x"ffbc0508", + 1425 => x"8c08ffac", + 1426 => x"050c8c08", + 1427 => x"ffb80508", + 1428 => x"8c08ffa8", + 1429 => x"050c8c08", + 1430 => x"e805088c", + 1431 => x"08ffa405", + 1432 => x"0c8c08e4", + 1433 => x"05088c08", + 1434 => x"ffa0050c", + 1435 => x"8c08ffa8", + 1436 => x"050891d4", + 1437 => x"388c08ff", + 1438 => x"a005088c", + 1439 => x"08ffac05", + 1440 => x"0827868c", + 1441 => x"388c08ff", + 1442 => x"ac05088c", + 1443 => x"08ff8805", + 1444 => x"0c8c08ff", + 1445 => x"88050883", + 1446 => x"ffff26a0", + 1447 => x"388c08ff", + 1448 => x"88050881", + 1449 => x"ff268b38", + 1450 => x"800b8c08", + 1451 => x"fed8050c", + 1452 => x"a939880b", + 1453 => x"8c08fed8", + 1454 => x"050c9f39", + 1455 => x"8c08ff88", + 1456 => x"0508fe80", + 1457 => x"0a268b38", + 1458 => x"900b8c08", + 1459 => x"fed8050c", + 1460 => x"8939980b", + 1461 => x"8c08fed8", + 1462 => x"050c8c08", + 1463 => x"fed80508", + 1464 => x"8c08ff84", + 1465 => x"050c8c08", + 1466 => x"ff880508", + 1467 => x"8c08ff84", + 1468 => x"05082a80", + 1469 => x"f6c81133", + 1470 => x"8c08ff84", + 1471 => x"050811a0", + 1472 => x"71318c08", + 1473 => x"ff8c050c", + 1474 => x"5151548c", + 1475 => x"08ff8c05", + 1476 => x"08802e80", + 1477 => x"d1388c08", + 1478 => x"ffac0508", + 1479 => x"8c08ff8c", + 1480 => x"05082b8c", + 1481 => x"08ffac05", + 1482 => x"0c8c08ff", + 1483 => x"a005088c", + 1484 => x"08ff8c05", + 1485 => x"082ba00b", + 1486 => x"8c08ff8c", + 1487 => x"0508318c", + 1488 => x"08ffa405", + 1489 => x"08712a70", + 1490 => x"73078c08", + 1491 => x"ffa0050c", + 1492 => x"8c08ffa4", + 1493 => x"05088c08", + 1494 => x"ff8c0508", + 1495 => x"2b8c08ff", + 1496 => x"a4050c51", + 1497 => x"56548c08", + 1498 => x"ffac0508", + 1499 => x"902a8c08", + 1500 => x"ff84050c", + 1501 => x"8c08ffac", + 1502 => x"050883ff", + 1503 => x"ff068c08", + 1504 => x"ff88050c", + 1505 => x"8c08ffa0", + 1506 => x"05088c08", + 1507 => x"ff840508", + 1508 => x"53705254", + 1509 => x"9efb3f80", + 1510 => x"08708c08", + 1511 => x"fef8050c", + 1512 => x"8c08ff84", + 1513 => x"0508538c", + 1514 => x"08ffa005", + 1515 => x"0852549e", + 1516 => x"bb3f8008", + 1517 => x"708c08ff", + 1518 => x"80050c8c", + 1519 => x"08ff8005", + 1520 => x"088c08ff", + 1521 => x"88050829", + 1522 => x"708c08fe", + 1523 => x"f0050c8c", + 1524 => x"08fef805", + 1525 => x"0870902b", + 1526 => x"8c08ffa4", + 1527 => x"0508902a", + 1528 => x"7072078c", + 1529 => x"08fef805", + 1530 => x"0c525851", + 1531 => x"51548c08", + 1532 => x"fef80508", + 1533 => x"8c08fef0", + 1534 => x"05082780", + 1535 => x"e1388c08", + 1536 => x"ff800508", + 1537 => x"ff058c08", + 1538 => x"ff80050c", + 1539 => x"8c08fef8", + 1540 => x"05088c08", + 1541 => x"ffac0508", + 1542 => x"058c08fe", + 1543 => x"f8050c8c", + 1544 => x"08ffac05", + 1545 => x"088c08fe", + 1546 => x"f8050826", + 1547 => x"b1388c08", + 1548 => x"fef80508", + 1549 => x"8c08fef0", + 1550 => x"050827a2", + 1551 => x"388c08ff", + 1552 => x"800508ff", + 1553 => x"058c08ff", + 1554 => x"80050c8c", + 1555 => x"08fef805", + 1556 => x"088c08ff", + 1557 => x"ac050805", + 1558 => x"8c08fef8", + 1559 => x"050c8c08", + 1560 => x"fef80508", + 1561 => x"8c08fef0", + 1562 => x"0508318c", + 1563 => x"08fef805", + 1564 => x"0c8c08fe", + 1565 => x"f805088c", + 1566 => x"08ff8405", + 1567 => x"08537052", + 1568 => x"549d8e3f", + 1569 => x"8008708c", + 1570 => x"08fef405", + 1571 => x"0c8c08ff", + 1572 => x"84050853", + 1573 => x"8c08fef8", + 1574 => x"05085254", + 1575 => x"9cce3f80", + 1576 => x"08708c08", + 1577 => x"fefc050c", + 1578 => x"8c08fefc", + 1579 => x"05088c08", + 1580 => x"ff880508", + 1581 => x"29708c08", + 1582 => x"fef0050c", + 1583 => x"8c08fef4", + 1584 => x"05087090", + 1585 => x"2b8c08ff", + 1586 => x"a4050883", + 1587 => x"ffff0670", + 1588 => x"72078c08", + 1589 => x"fef4050c", + 1590 => x"52585151", + 1591 => x"548c08fe", + 1592 => x"f405088c", + 1593 => x"08fef005", + 1594 => x"082780e1", + 1595 => x"388c08fe", + 1596 => x"fc0508ff", + 1597 => x"058c08fe", + 1598 => x"fc050c8c", + 1599 => x"08fef405", + 1600 => x"088c08ff", + 1601 => x"ac050805", + 1602 => x"8c08fef4", + 1603 => x"050c8c08", + 1604 => x"ffac0508", + 1605 => x"8c08fef4", + 1606 => x"050826b1", + 1607 => x"388c08fe", + 1608 => x"f405088c", + 1609 => x"08fef005", + 1610 => x"0827a238", + 1611 => x"8c08fefc", + 1612 => x"0508ff05", + 1613 => x"8c08fefc", + 1614 => x"050c8c08", + 1615 => x"fef40508", + 1616 => x"8c08ffac", + 1617 => x"0508058c", + 1618 => x"08fef405", + 1619 => x"0c8c08fe", + 1620 => x"f405088c", + 1621 => x"08fef005", + 1622 => x"08318c08", + 1623 => x"fef4050c", + 1624 => x"8c08ff80", + 1625 => x"05087090", + 1626 => x"2b708c08", + 1627 => x"fefc0508", + 1628 => x"078c08ff", + 1629 => x"98050c8c", + 1630 => x"08fef405", + 1631 => x"088c08ff", + 1632 => x"a4050c51", + 1633 => x"54800b8c", + 1634 => x"08ff9405", + 1635 => x"0c8af639", + 1636 => x"8c08ffac", + 1637 => x"05089738", + 1638 => x"8c08ffac", + 1639 => x"05085281", + 1640 => x"519ac93f", + 1641 => x"8008708c", + 1642 => x"08ffac05", + 1643 => x"0c548c08", + 1644 => x"ffac0508", + 1645 => x"8c08fef0", + 1646 => x"050c8c08", + 1647 => x"fef00508", + 1648 => x"83ffff26", + 1649 => x"a0388c08", + 1650 => x"fef00508", + 1651 => x"81ff268b", + 1652 => x"38800b8c", + 1653 => x"08fed405", + 1654 => x"0ca93988", + 1655 => x"0b8c08fe", + 1656 => x"d4050c9f", + 1657 => x"398c08fe", + 1658 => x"f00508fe", + 1659 => x"800a268b", + 1660 => x"38900b8c", + 1661 => x"08fed405", + 1662 => x"0c893998", + 1663 => x"0b8c08fe", + 1664 => x"d4050c8c", + 1665 => x"08fed405", + 1666 => x"088c08fe", + 1667 => x"f4050c8c", + 1668 => x"08fef005", + 1669 => x"088c08fe", + 1670 => x"f405082a", + 1671 => x"80f6c811", + 1672 => x"338c08fe", + 1673 => x"f4050811", + 1674 => x"a071318c", + 1675 => x"08ff8c05", + 1676 => x"0c515154", + 1677 => x"8c08ff8c", + 1678 => x"05089f38", + 1679 => x"8c08ffa0", + 1680 => x"05088c08", + 1681 => x"ffac0508", + 1682 => x"318c08ff", + 1683 => x"a0050c81", + 1684 => x"0b8c08ff", + 1685 => x"94050c85", + 1686 => x"8d39a00b", + 1687 => x"8c08ff8c", + 1688 => x"0508318c", + 1689 => x"08ff9005", + 1690 => x"0c8c08ff", + 1691 => x"ac05088c", + 1692 => x"08ff8c05", + 1693 => x"082b8c08", + 1694 => x"ffac050c", + 1695 => x"8c08ffa0", + 1696 => x"05088c08", + 1697 => x"ff900508", + 1698 => x"2a8c08ff", + 1699 => x"9c050c8c", + 1700 => x"08ffa005", + 1701 => x"088c08ff", + 1702 => x"8c05082b", + 1703 => x"8c08ffa4", + 1704 => x"05088c08", + 1705 => x"ff900508", + 1706 => x"2a707207", + 1707 => x"8c08ffa0", + 1708 => x"050c8c08", + 1709 => x"ffa40508", + 1710 => x"8c08ff8c", + 1711 => x"05082b8c", + 1712 => x"08ffa405", + 1713 => x"0c8c08ff", + 1714 => x"ac050890", + 1715 => x"2a8c08fe", + 1716 => x"f0050c8c", + 1717 => x"08ffac05", + 1718 => x"0883ffff", + 1719 => x"068c08fe", + 1720 => x"f4050c8c", + 1721 => x"08ff9c05", + 1722 => x"088c08fe", + 1723 => x"f0050855", + 1724 => x"70545155", + 1725 => x"55989a3f", + 1726 => x"8008708c", + 1727 => x"08ff8005", + 1728 => x"0c8c08fe", + 1729 => x"f0050853", + 1730 => x"8c08ff9c", + 1731 => x"05085254", + 1732 => x"97da3f80", + 1733 => x"08708c08", + 1734 => x"fef8050c", + 1735 => x"8c08fef8", + 1736 => x"05088c08", + 1737 => x"fef40508", + 1738 => x"29708c08", + 1739 => x"ff88050c", + 1740 => x"8c08ff80", + 1741 => x"05087090", + 1742 => x"2b8c08ff", + 1743 => x"a0050890", + 1744 => x"2a707207", + 1745 => x"8c08ff80", + 1746 => x"050c5258", + 1747 => x"5151548c", + 1748 => x"08ff8005", + 1749 => x"088c08ff", + 1750 => x"88050827", + 1751 => x"80e1388c", + 1752 => x"08fef805", + 1753 => x"08ff058c", + 1754 => x"08fef805", + 1755 => x"0c8c08ff", + 1756 => x"8005088c", + 1757 => x"08ffac05", + 1758 => x"08058c08", + 1759 => x"ff80050c", + 1760 => x"8c08ffac", + 1761 => x"05088c08", + 1762 => x"ff800508", + 1763 => x"26b1388c", + 1764 => x"08ff8005", + 1765 => x"088c08ff", + 1766 => x"88050827", + 1767 => x"a2388c08", + 1768 => x"fef80508", + 1769 => x"ff058c08", + 1770 => x"fef8050c", + 1771 => x"8c08ff80", + 1772 => x"05088c08", + 1773 => x"ffac0508", + 1774 => x"058c08ff", + 1775 => x"80050c8c", + 1776 => x"08ff8005", + 1777 => x"088c08ff", + 1778 => x"88050831", + 1779 => x"8c08ff80", + 1780 => x"050c8c08", + 1781 => x"ff800508", + 1782 => x"8c08fef0", + 1783 => x"05085370", + 1784 => x"525496ad", + 1785 => x"3f800870", + 1786 => x"8c08ff84", + 1787 => x"050c8c08", + 1788 => x"fef00508", + 1789 => x"538c08ff", + 1790 => x"80050852", + 1791 => x"5495ed3f", + 1792 => x"8008708c", + 1793 => x"08fefc05", + 1794 => x"0c8c08fe", + 1795 => x"fc05088c", + 1796 => x"08fef405", + 1797 => x"0829708c", + 1798 => x"08ff8805", + 1799 => x"0c8c08ff", + 1800 => x"84050870", + 1801 => x"902b8c08", + 1802 => x"ffa00508", + 1803 => x"83ffff06", + 1804 => x"7072078c", + 1805 => x"08ff8405", + 1806 => x"0c525851", + 1807 => x"51548c08", + 1808 => x"ff840508", + 1809 => x"8c08ff88", + 1810 => x"05082780", + 1811 => x"e1388c08", + 1812 => x"fefc0508", + 1813 => x"ff058c08", + 1814 => x"fefc050c", + 1815 => x"8c08ff84", + 1816 => x"05088c08", + 1817 => x"ffac0508", + 1818 => x"058c08ff", + 1819 => x"84050c8c", + 1820 => x"08ffac05", + 1821 => x"088c08ff", + 1822 => x"84050826", + 1823 => x"b1388c08", + 1824 => x"ff840508", + 1825 => x"8c08ff88", + 1826 => x"050827a2", + 1827 => x"388c08fe", + 1828 => x"fc0508ff", + 1829 => x"058c08fe", + 1830 => x"fc050c8c", + 1831 => x"08ff8405", + 1832 => x"088c08ff", + 1833 => x"ac050805", + 1834 => x"8c08ff84", + 1835 => x"050c8c08", + 1836 => x"ff840508", + 1837 => x"8c08ff88", + 1838 => x"0508318c", + 1839 => x"08ff8405", + 1840 => x"0c8c08fe", + 1841 => x"f8050870", + 1842 => x"902b708c", + 1843 => x"08fefc05", + 1844 => x"08078c08", + 1845 => x"ff94050c", + 1846 => x"8c08ff84", + 1847 => x"05088c08", + 1848 => x"ffa0050c", + 1849 => x"51548c08", + 1850 => x"ffac0508", + 1851 => x"902a8c08", + 1852 => x"fef0050c", + 1853 => x"8c08ffac", + 1854 => x"050883ff", + 1855 => x"ff068c08", + 1856 => x"fef4050c", + 1857 => x"8c08ffa0", + 1858 => x"05088c08", + 1859 => x"fef00508", + 1860 => x"53705254", + 1861 => x"93fb3f80", + 1862 => x"08708c08", + 1863 => x"ff80050c", + 1864 => x"8c08fef0", + 1865 => x"0508538c", + 1866 => x"08ffa005", + 1867 => x"08525493", + 1868 => x"bb3f8008", + 1869 => x"708c08fe", + 1870 => x"f8050c8c", + 1871 => x"08fef805", + 1872 => x"088c08fe", + 1873 => x"f4050829", + 1874 => x"708c08ff", + 1875 => x"88050c8c", + 1876 => x"08ff8005", + 1877 => x"0870902b", + 1878 => x"8c08ffa4", + 1879 => x"0508902a", + 1880 => x"7072078c", + 1881 => x"08ff8005", + 1882 => x"0c525851", + 1883 => x"51548c08", + 1884 => x"ff800508", + 1885 => x"8c08ff88", + 1886 => x"05082780", + 1887 => x"e1388c08", + 1888 => x"fef80508", + 1889 => x"ff058c08", + 1890 => x"fef8050c", + 1891 => x"8c08ff80", + 1892 => x"05088c08", + 1893 => x"ffac0508", + 1894 => x"058c08ff", + 1895 => x"80050c8c", + 1896 => x"08ffac05", + 1897 => x"088c08ff", + 1898 => x"80050826", + 1899 => x"b1388c08", + 1900 => x"ff800508", + 1901 => x"8c08ff88", + 1902 => x"050827a2", + 1903 => x"388c08fe", + 1904 => x"f80508ff", + 1905 => x"058c08fe", + 1906 => x"f8050c8c", + 1907 => x"08ff8005", + 1908 => x"088c08ff", + 1909 => x"ac050805", + 1910 => x"8c08ff80", + 1911 => x"050c8c08", + 1912 => x"ff800508", + 1913 => x"8c08ff88", + 1914 => x"0508318c", + 1915 => x"08ff8005", + 1916 => x"0c8c08ff", + 1917 => x"8005088c", + 1918 => x"08fef005", + 1919 => x"08537052", + 1920 => x"54928e3f", + 1921 => x"8008708c", + 1922 => x"08ff8405", + 1923 => x"0c8c08fe", + 1924 => x"f0050853", + 1925 => x"8c08ff80", + 1926 => x"05085254", + 1927 => x"91ce3f80", + 1928 => x"08708c08", + 1929 => x"fefc050c", + 1930 => x"8c08fefc", + 1931 => x"05088c08", + 1932 => x"fef40508", + 1933 => x"29708c08", + 1934 => x"ff88050c", + 1935 => x"8c08ff84", + 1936 => x"05087090", + 1937 => x"2b8c08ff", + 1938 => x"a4050883", + 1939 => x"ffff0670", + 1940 => x"72078c08", + 1941 => x"ff84050c", + 1942 => x"52585151", + 1943 => x"548c08ff", + 1944 => x"8405088c", + 1945 => x"08ff8805", + 1946 => x"082780e1", + 1947 => x"388c08fe", + 1948 => x"fc0508ff", + 1949 => x"058c08fe", + 1950 => x"fc050c8c", + 1951 => x"08ff8405", + 1952 => x"088c08ff", + 1953 => x"ac050805", + 1954 => x"8c08ff84", + 1955 => x"050c8c08", + 1956 => x"ffac0508", + 1957 => x"8c08ff84", + 1958 => x"050826b1", + 1959 => x"388c08ff", + 1960 => x"8405088c", + 1961 => x"08ff8805", + 1962 => x"0827a238", + 1963 => x"8c08fefc", + 1964 => x"0508ff05", + 1965 => x"8c08fefc", + 1966 => x"050c8c08", + 1967 => x"ff840508", + 1968 => x"8c08ffac", + 1969 => x"0508058c", + 1970 => x"08ff8405", + 1971 => x"0c8c08ff", + 1972 => x"8405088c", + 1973 => x"08ff8805", + 1974 => x"08318c08", + 1975 => x"ff84050c", + 1976 => x"8c08fef8", + 1977 => x"05087090", + 1978 => x"2b708c08", + 1979 => x"fefc0508", + 1980 => x"078c08ff", + 1981 => x"98050c8c", + 1982 => x"08ff8405", + 1983 => x"088c08ff", + 1984 => x"a4050c51", + 1985 => x"548c08c8", + 1986 => x"0508802e", + 1987 => x"8ea3388c", + 1988 => x"08ffa405", + 1989 => x"088c08ff", + 1990 => x"8c05082a", + 1991 => x"8c08ffb4", + 1992 => x"050c800b", + 1993 => x"8c08ffb0", + 1994 => x"050c8c08", + 1995 => x"c8050856", + 1996 => x"8c08ffb0", + 1997 => x"05088c08", + 1998 => x"ffb40508", + 1999 => x"56547376", + 2000 => x"0c748417", + 2001 => x"0c8dea39", + 2002 => x"8c08ffa0", + 2003 => x"05088c08", + 2004 => x"ffa80508", + 2005 => x"2780d138", + 2006 => x"800b8c08", + 2007 => x"ff98050c", + 2008 => x"800b8c08", + 2009 => x"ff94050c", + 2010 => x"8c08c805", + 2011 => x"08802e8d", + 2012 => x"c0388c08", + 2013 => x"ffa40508", + 2014 => x"8c08ffb4", + 2015 => x"050c8c08", + 2016 => x"ffa00508", + 2017 => x"8c08ffb0", + 2018 => x"050c8c08", + 2019 => x"c8050856", + 2020 => x"8c08ffb0", + 2021 => x"05088c08", + 2022 => x"ffb40508", + 2023 => x"56547376", + 2024 => x"0c748417", + 2025 => x"0c8d8a39", + 2026 => x"8c08ffa8", + 2027 => x"05088c08", + 2028 => x"fef0050c", + 2029 => x"8c08fef0", + 2030 => x"050883ff", + 2031 => x"ff26a038", + 2032 => x"8c08fef0", + 2033 => x"050881ff", + 2034 => x"268b3880", + 2035 => x"0b8c08fe", + 2036 => x"d0050ca9", + 2037 => x"39880b8c", + 2038 => x"08fed005", + 2039 => x"0c9f398c", + 2040 => x"08fef005", + 2041 => x"08fe800a", + 2042 => x"268b3890", + 2043 => x"0b8c08fe", + 2044 => x"d0050c89", + 2045 => x"39980b8c", + 2046 => x"08fed005", + 2047 => x"0c8c08fe", + 2048 => x"d005088c", + 2049 => x"08fef405", + 2050 => x"0c8c08fe", + 2051 => x"f005088c", + 2052 => x"08fef405", + 2053 => x"082a80f6", + 2054 => x"c811338c", + 2055 => x"08fef405", + 2056 => x"0811a071", + 2057 => x"318c08ff", + 2058 => x"8c050c51", + 2059 => x"51548c08", + 2060 => x"ff8c0508", + 2061 => x"81d9388c", + 2062 => x"08ffa005", + 2063 => x"088c08ff", + 2064 => x"a8050826", + 2065 => x"93388c08", + 2066 => x"ffa40508", + 2067 => x"8c08ffac", + 2068 => x"05082784", + 2069 => x"3880e839", + 2070 => x"810b8c08", + 2071 => x"ff98050c", + 2072 => x"8c08ffa4", + 2073 => x"05088c08", + 2074 => x"ffac0508", + 2075 => x"318c08fe", + 2076 => x"f0050c8c", + 2077 => x"08ffa005", + 2078 => x"088c08ff", + 2079 => x"a8050831", + 2080 => x"708c08fe", + 2081 => x"cc050c54", + 2082 => x"8c08ffa4", + 2083 => x"05088c08", + 2084 => x"fef00508", + 2085 => x"278f388c", + 2086 => x"08fecc05", + 2087 => x"08ff058c", + 2088 => x"08fecc05", + 2089 => x"0c8c08fe", + 2090 => x"cc05088c", + 2091 => x"08ffa005", + 2092 => x"0c8c08fe", + 2093 => x"f005088c", + 2094 => x"08ffa405", + 2095 => x"0c893980", + 2096 => x"0b8c08ff", + 2097 => x"98050c80", + 2098 => x"0b8c08ff", + 2099 => x"94050c8c", + 2100 => x"08c80508", + 2101 => x"802e8ad9", + 2102 => x"388c08ff", + 2103 => x"a405088c", + 2104 => x"08ffb405", + 2105 => x"0c8c08ff", + 2106 => x"a005088c", + 2107 => x"08ffb005", + 2108 => x"0c8c08c8", + 2109 => x"0508568c", + 2110 => x"08ffb005", + 2111 => x"088c08ff", + 2112 => x"b4050856", + 2113 => x"5473760c", + 2114 => x"7484170c", + 2115 => x"8aa339a0", + 2116 => x"0b8c08ff", + 2117 => x"8c050831", + 2118 => x"8c08ff90", + 2119 => x"050c8c08", + 2120 => x"ffa80508", + 2121 => x"8c08ff8c", + 2122 => x"05082b8c", + 2123 => x"08ffac05", + 2124 => x"088c08ff", + 2125 => x"9005082a", + 2126 => x"7072078c", + 2127 => x"08ffa805", + 2128 => x"0c8c08ff", + 2129 => x"ac05088c", + 2130 => x"08ff8c05", + 2131 => x"082b8c08", + 2132 => x"ffac050c", + 2133 => x"8c08ffa0", + 2134 => x"05088c08", + 2135 => x"ff900508", + 2136 => x"2a8c08ff", + 2137 => x"9c050c8c", + 2138 => x"08ffa005", + 2139 => x"088c08ff", + 2140 => x"8c05082b", + 2141 => x"8c08ffa4", + 2142 => x"05088c08", + 2143 => x"ff900508", + 2144 => x"2a707207", + 2145 => x"8c08ffa0", + 2146 => x"050c8c08", + 2147 => x"ffa40508", + 2148 => x"8c08ff8c", + 2149 => x"05082b8c", + 2150 => x"08ffa405", + 2151 => x"0c8c08ff", + 2152 => x"a8050890", + 2153 => x"2a8c08fe", + 2154 => x"f8050c8c", + 2155 => x"08ffa805", + 2156 => x"0883ffff", + 2157 => x"068c08fe", + 2158 => x"fc050c8c", + 2159 => x"08ff9c05", + 2160 => x"088c08fe", + 2161 => x"f8050857", + 2162 => x"70565152", + 2163 => x"5255558a", + 2164 => x"c03f8008", + 2165 => x"708c08ff", + 2166 => x"88050c8c", + 2167 => x"08fef805", + 2168 => x"08538c08", + 2169 => x"ff9c0508", + 2170 => x"52548a80", + 2171 => x"3f800870", + 2172 => x"8c08ff80", + 2173 => x"050c8c08", + 2174 => x"ff800508", + 2175 => x"8c08fefc", + 2176 => x"05082970", + 2177 => x"8c08fee8", + 2178 => x"050c8c08", + 2179 => x"ff880508", + 2180 => x"70902b8c", + 2181 => x"08ffa005", + 2182 => x"08902a70", + 2183 => x"72078c08", + 2184 => x"ff88050c", + 2185 => x"52585151", + 2186 => x"548c08ff", + 2187 => x"8805088c", + 2188 => x"08fee805", + 2189 => x"082780e1", + 2190 => x"388c08ff", + 2191 => x"800508ff", + 2192 => x"058c08ff", + 2193 => x"80050c8c", + 2194 => x"08ff8805", + 2195 => x"088c08ff", + 2196 => x"a8050805", + 2197 => x"8c08ff88", + 2198 => x"050c8c08", + 2199 => x"ffa80508", + 2200 => x"8c08ff88", + 2201 => x"050826b1", + 2202 => x"388c08ff", + 2203 => x"8805088c", + 2204 => x"08fee805", + 2205 => x"0827a238", + 2206 => x"8c08ff80", + 2207 => x"0508ff05", + 2208 => x"8c08ff80", + 2209 => x"050c8c08", + 2210 => x"ff880508", + 2211 => x"8c08ffa8", + 2212 => x"0508058c", + 2213 => x"08ff8805", + 2214 => x"0c8c08ff", + 2215 => x"8805088c", + 2216 => x"08fee805", + 2217 => x"08318c08", + 2218 => x"ff88050c", + 2219 => x"8c08ff88", + 2220 => x"05088c08", + 2221 => x"fef80508", + 2222 => x"53705254", + 2223 => x"88d33f80", + 2224 => x"08708c08", + 2225 => x"feec050c", + 2226 => x"8c08fef8", + 2227 => x"0508538c", + 2228 => x"08ff8805", + 2229 => x"08525488", + 2230 => x"933f8008", + 2231 => x"708c08ff", + 2232 => x"84050c8c", + 2233 => x"08ff8405", + 2234 => x"088c08fe", + 2235 => x"fc050829", + 2236 => x"708c08fe", + 2237 => x"e8050c8c", + 2238 => x"08feec05", + 2239 => x"0870902b", + 2240 => x"8c08ffa0", + 2241 => x"050883ff", + 2242 => x"ff067072", + 2243 => x"078c08fe", + 2244 => x"ec050c52", + 2245 => x"58515154", + 2246 => x"8c08feec", + 2247 => x"05088c08", + 2248 => x"fee80508", + 2249 => x"2780e138", + 2250 => x"8c08ff84", + 2251 => x"0508ff05", + 2252 => x"8c08ff84", + 2253 => x"050c8c08", + 2254 => x"feec0508", + 2255 => x"8c08ffa8", + 2256 => x"0508058c", + 2257 => x"08feec05", + 2258 => x"0c8c08ff", + 2259 => x"a805088c", + 2260 => x"08feec05", + 2261 => x"0826b138", + 2262 => x"8c08feec", + 2263 => x"05088c08", + 2264 => x"fee80508", + 2265 => x"27a2388c", + 2266 => x"08ff8405", + 2267 => x"08ff058c", + 2268 => x"08ff8405", + 2269 => x"0c8c08fe", + 2270 => x"ec05088c", + 2271 => x"08ffa805", + 2272 => x"08058c08", + 2273 => x"feec050c", + 2274 => x"8c08feec", + 2275 => x"05088c08", + 2276 => x"fee80508", + 2277 => x"318c08fe", + 2278 => x"ec050c8c", + 2279 => x"08ff8005", + 2280 => x"0870902b", + 2281 => x"708c08ff", + 2282 => x"84050807", + 2283 => x"8c08ff98", + 2284 => x"050c8c08", + 2285 => x"feec0508", + 2286 => x"8c08ffa0", + 2287 => x"050c8c08", + 2288 => x"ff980508", + 2289 => x"83ffff06", + 2290 => x"8c08ff80", + 2291 => x"050c8c08", + 2292 => x"ff980508", + 2293 => x"902a8c08", + 2294 => x"ff88050c", + 2295 => x"8c08ffac", + 2296 => x"050883ff", + 2297 => x"ff068c08", + 2298 => x"ff84050c", + 2299 => x"8c08ffac", + 2300 => x"0508902a", + 2301 => x"8c08fee4", + 2302 => x"050c8c08", + 2303 => x"ff800508", + 2304 => x"8c08ff84", + 2305 => x"05082970", + 2306 => x"8c08fee8", + 2307 => x"050c8c08", + 2308 => x"ff800508", + 2309 => x"8c08fee4", + 2310 => x"05082970", + 2311 => x"8c08feec", + 2312 => x"050c8c08", + 2313 => x"ff880508", + 2314 => x"8c08ff84", + 2315 => x"05082970", + 2316 => x"8c08fef8", + 2317 => x"050c8c08", + 2318 => x"ff880508", + 2319 => x"8c08fee4", + 2320 => x"05082970", + 2321 => x"8c08fefc", + 2322 => x"050c8c08", + 2323 => x"fee80508", + 2324 => x"902a8c08", + 2325 => x"feec0508", + 2326 => x"118c08fe", + 2327 => x"ec050c8c", + 2328 => x"08feec05", + 2329 => x"088c08fe", + 2330 => x"f8050805", + 2331 => x"8c08feec", + 2332 => x"050c5151", + 2333 => x"51515151", + 2334 => x"548c08fe", + 2335 => x"ec05088c", + 2336 => x"08fef805", + 2337 => x"08279138", + 2338 => x"8c08fefc", + 2339 => x"05088480", + 2340 => x"80058c08", + 2341 => x"fefc050c", + 2342 => x"8c08feec", + 2343 => x"0508902a", + 2344 => x"8c08fefc", + 2345 => x"0508118c", + 2346 => x"08fef005", + 2347 => x"0c8c08fe", + 2348 => x"ec050883", + 2349 => x"ffff0670", + 2350 => x"902b8c08", + 2351 => x"fee80508", + 2352 => x"83ffff06", + 2353 => x"70128c08", + 2354 => x"fef4050c", + 2355 => x"52575154", + 2356 => x"8c08fef0", + 2357 => x"05088c08", + 2358 => x"ffa00508", + 2359 => x"26a6388c", + 2360 => x"08fef005", + 2361 => x"088c08ff", + 2362 => x"a005082e", + 2363 => x"09810680", + 2364 => x"fe388c08", + 2365 => x"fef40508", + 2366 => x"8c08ffa4", + 2367 => x"05082684", + 2368 => x"3880ec39", + 2369 => x"8c08ff98", + 2370 => x"0508ff05", + 2371 => x"8c08ff98", + 2372 => x"050c8c08", + 2373 => x"fef40508", + 2374 => x"8c08ffac", + 2375 => x"0508318c", + 2376 => x"08fee405", + 2377 => x"0c8c08fe", + 2378 => x"f005088c", + 2379 => x"08ffa805", + 2380 => x"0831708c", + 2381 => x"08fec805", + 2382 => x"0c548c08", + 2383 => x"fef40508", + 2384 => x"8c08fee4", + 2385 => x"0508278f", + 2386 => x"388c08fe", + 2387 => x"c80508ff", + 2388 => x"058c08fe", + 2389 => x"c8050c8c", + 2390 => x"08fec805", + 2391 => x"088c08fe", + 2392 => x"f0050c8c", + 2393 => x"08fee405", + 2394 => x"088c08fe", + 2395 => x"f4050c80", + 2396 => x"0b8c08ff", + 2397 => x"94050c8c", + 2398 => x"08c80508", + 2399 => x"802e81b1", + 2400 => x"388c08ff", + 2401 => x"a405088c", + 2402 => x"08fef405", + 2403 => x"08318c08", + 2404 => x"fee4050c", + 2405 => x"8c08ffa0", + 2406 => x"05088c08", + 2407 => x"fef00508", + 2408 => x"31708c08", + 2409 => x"fec4050c", + 2410 => x"548c08ff", + 2411 => x"a405088c", + 2412 => x"08fee405", + 2413 => x"08278f38", + 2414 => x"8c08fec4", + 2415 => x"0508ff05", + 2416 => x"8c08fec4", + 2417 => x"050c8c08", + 2418 => x"fec40508", + 2419 => x"8c08ffa0", + 2420 => x"050c8c08", + 2421 => x"fee40508", + 2422 => x"8c08ffa4", + 2423 => x"050c8c08", + 2424 => x"ffa00508", + 2425 => x"8c08ff90", + 2426 => x"05082b8c", + 2427 => x"08ffa405", + 2428 => x"088c08ff", + 2429 => x"8c05082a", + 2430 => x"7072078c", + 2431 => x"08ffb405", + 2432 => x"0c8c08ff", + 2433 => x"a005088c", + 2434 => x"08ff8c05", + 2435 => x"082a8c08", + 2436 => x"ffb0050c", + 2437 => x"8c08c805", + 2438 => x"08585555", + 2439 => x"8c08ffb0", + 2440 => x"05088c08", + 2441 => x"ffb40508", + 2442 => x"56547376", + 2443 => x"0c748417", + 2444 => x"0c800b8c", + 2445 => x"08fedc05", + 2446 => x"0c800b8c", + 2447 => x"08fee005", + 2448 => x"0c8c08ff", + 2449 => x"9405088c", + 2450 => x"08fedc05", + 2451 => x"0c8c08ff", + 2452 => x"9805088c", + 2453 => x"08fee005", + 2454 => x"0c8c08fe", + 2455 => x"dc05088c", + 2456 => x"08fee005", + 2457 => x"08565473", + 2458 => x"8c08c005", + 2459 => x"0c748c08", + 2460 => x"c4050c8c", + 2461 => x"08c00508", + 2462 => x"8c08c405", + 2463 => x"08565473", + 2464 => x"8c08dc05", + 2465 => x"0c748c08", + 2466 => x"e0050c8c", + 2467 => x"08fc0508", + 2468 => x"802eb338", + 2469 => x"8c08c005", + 2470 => x"548c08dc", + 2471 => x"05088c08", + 2472 => x"e0050857", + 2473 => x"55745275", + 2474 => x"537351d8", + 2475 => x"d73f8c08", + 2476 => x"c005088c", + 2477 => x"08c40508", + 2478 => x"5654738c", + 2479 => x"08dc050c", + 2480 => x"748c08e0", + 2481 => x"050c8c08", + 2482 => x"dc05088c", + 2483 => x"08e00508", + 2484 => x"8c088805", + 2485 => x"08585654", + 2486 => x"73760c74", + 2487 => x"84170c8c", + 2488 => x"08880508", + 2489 => x"800cb63d", + 2490 => x"0d8c0c04", + 2491 => x"8c08028c", + 2492 => x"0cfd3d0d", + 2493 => x"80538c08", + 2494 => x"8c050852", + 2495 => x"8c088805", + 2496 => x"085182de", + 2497 => x"3f800870", + 2498 => x"800c5485", + 2499 => x"3d0d8c0c", + 2500 => x"048c0802", + 2501 => x"8c0cfd3d", + 2502 => x"0d81538c", + 2503 => x"088c0508", + 2504 => x"528c0888", + 2505 => x"05085182", + 2506 => x"b93f8008", + 2507 => x"70800c54", + 2508 => x"853d0d8c", + 2509 => x"0c048c08", + 2510 => x"028c0cf9", + 2511 => x"3d0d800b", + 2512 => x"8c08fc05", + 2513 => x"0c8c0888", + 2514 => x"05088025", + 2515 => x"ab388c08", + 2516 => x"88050830", + 2517 => x"8c088805", + 2518 => x"0c800b8c", + 2519 => x"08f4050c", + 2520 => x"8c08fc05", + 2521 => x"08883881", + 2522 => x"0b8c08f4", + 2523 => x"050c8c08", + 2524 => x"f405088c", + 2525 => x"08fc050c", + 2526 => x"8c088c05", + 2527 => x"088025ab", + 2528 => x"388c088c", + 2529 => x"0508308c", + 2530 => x"088c050c", + 2531 => x"800b8c08", + 2532 => x"f0050c8c", + 2533 => x"08fc0508", + 2534 => x"8838810b", + 2535 => x"8c08f005", + 2536 => x"0c8c08f0", + 2537 => x"05088c08", + 2538 => x"fc050c80", + 2539 => x"538c088c", + 2540 => x"0508528c", + 2541 => x"08880508", + 2542 => x"5181a73f", + 2543 => x"8008708c", + 2544 => x"08f8050c", + 2545 => x"548c08fc", + 2546 => x"0508802e", + 2547 => x"8c388c08", + 2548 => x"f8050830", + 2549 => x"8c08f805", + 2550 => x"0c8c08f8", + 2551 => x"05087080", + 2552 => x"0c54893d", + 2553 => x"0d8c0c04", + 2554 => x"8c08028c", + 2555 => x"0cfb3d0d", + 2556 => x"800b8c08", + 2557 => x"fc050c8c", + 2558 => x"08880508", + 2559 => x"80259338", + 2560 => x"8c088805", + 2561 => x"08308c08", + 2562 => x"88050c81", + 2563 => x"0b8c08fc", + 2564 => x"050c8c08", + 2565 => x"8c050880", + 2566 => x"258c388c", + 2567 => x"088c0508", + 2568 => x"308c088c", + 2569 => x"050c8153", + 2570 => x"8c088c05", + 2571 => x"08528c08", + 2572 => x"88050851", + 2573 => x"ad3f8008", + 2574 => x"708c08f8", + 2575 => x"050c548c", + 2576 => x"08fc0508", + 2577 => x"802e8c38", + 2578 => x"8c08f805", + 2579 => x"08308c08", + 2580 => x"f8050c8c", + 2581 => x"08f80508", + 2582 => x"70800c54", + 2583 => x"873d0d8c", + 2584 => x"0c048c08", + 2585 => x"028c0cfd", + 2586 => x"3d0d810b", + 2587 => x"8c08fc05", + 2588 => x"0c800b8c", + 2589 => x"08f8050c", + 2590 => x"8c088c05", + 2591 => x"088c0888", + 2592 => x"050827ac", + 2593 => x"388c08fc", + 2594 => x"0508802e", + 2595 => x"a338800b", + 2596 => x"8c088c05", + 2597 => x"08249938", + 2598 => x"8c088c05", + 2599 => x"08108c08", + 2600 => x"8c050c8c", + 2601 => x"08fc0508", + 2602 => x"108c08fc", + 2603 => x"050cc939", + 2604 => x"8c08fc05", + 2605 => x"08802e80", + 2606 => x"c9388c08", + 2607 => x"8c05088c", + 2608 => x"08880508", + 2609 => x"26a1388c", + 2610 => x"08880508", + 2611 => x"8c088c05", + 2612 => x"08318c08", + 2613 => x"88050c8c", + 2614 => x"08f80508", + 2615 => x"8c08fc05", + 2616 => x"08078c08", + 2617 => x"f8050c8c", + 2618 => x"08fc0508", + 2619 => x"812a8c08", + 2620 => x"fc050c8c", + 2621 => x"088c0508", + 2622 => x"812a8c08", + 2623 => x"8c050cff", + 2624 => x"af398c08", + 2625 => x"90050880", + 2626 => x"2e8f388c", + 2627 => x"08880508", + 2628 => x"708c08f4", + 2629 => x"050c518d", + 2630 => x"398c08f8", + 2631 => x"0508708c", + 2632 => x"08f4050c", + 2633 => x"518c08f4", + 2634 => x"0508800c", + 2635 => x"853d0d8c", + 2636 => x"0c04ff3d", + 2637 => x"0d735281", + 2638 => x"81c80851", + 2639 => x"963f833d", + 2640 => x"0d04ff3d", + 2641 => x"0d735281", + 2642 => x"81c80851", + 2643 => x"90953f83", + 2644 => x"3d0d04f3", + 2645 => x"3d0d7f61", + 2646 => x"8b1170f8", + 2647 => x"065c5555", + 2648 => x"5e729626", + 2649 => x"83389059", + 2650 => x"80792474", + 2651 => x"7a260753", + 2652 => x"80547274", + 2653 => x"2e098106", + 2654 => x"80cb387d", + 2655 => x"518ce33f", + 2656 => x"7883f726", + 2657 => x"80c63878", + 2658 => x"832a7010", + 2659 => x"101080f9", + 2660 => x"c0058c11", + 2661 => x"0859595a", + 2662 => x"76782e83", + 2663 => x"b0388417", + 2664 => x"08fc0656", + 2665 => x"8c170888", + 2666 => x"1808718c", + 2667 => x"120c8812", + 2668 => x"0c587517", + 2669 => x"84110881", + 2670 => x"0784120c", + 2671 => x"537d518c", + 2672 => x"a23f8817", + 2673 => x"5473800c", + 2674 => x"8f3d0d04", + 2675 => x"78892a79", + 2676 => x"832a5b53", + 2677 => x"72802ebf", + 2678 => x"3878862a", + 2679 => x"b8055a84", + 2680 => x"7327b438", + 2681 => x"80db135a", + 2682 => x"947327ab", + 2683 => x"38788c2a", + 2684 => x"80ee055a", + 2685 => x"80d47327", + 2686 => x"9e38788f", + 2687 => x"2a80f705", + 2688 => x"5a82d473", + 2689 => x"27913878", + 2690 => x"922a80fc", + 2691 => x"055a8ad4", + 2692 => x"73278438", + 2693 => x"80fe5a79", + 2694 => x"10101080", + 2695 => x"f9c0058c", + 2696 => x"11085855", + 2697 => x"76752ea3", + 2698 => x"38841708", + 2699 => x"fc06707a", + 2700 => x"31555673", + 2701 => x"8f2488d5", + 2702 => x"38738025", + 2703 => x"fee6388c", + 2704 => x"17085776", + 2705 => x"752e0981", + 2706 => x"06df3881", + 2707 => x"1a5a80f9", + 2708 => x"d0085776", + 2709 => x"80f9c82e", + 2710 => x"82c03884", + 2711 => x"1708fc06", + 2712 => x"707a3155", + 2713 => x"56738f24", + 2714 => x"81f93880", + 2715 => x"f9c80b80", + 2716 => x"f9d40c80", + 2717 => x"f9c80b80", + 2718 => x"f9d00c73", + 2719 => x"8025feb2", + 2720 => x"3883ff76", + 2721 => x"2783df38", + 2722 => x"75892a76", + 2723 => x"832a5553", + 2724 => x"72802ebf", + 2725 => x"3875862a", + 2726 => x"b8055484", + 2727 => x"7327b438", + 2728 => x"80db1354", + 2729 => x"947327ab", + 2730 => x"38758c2a", + 2731 => x"80ee0554", + 2732 => x"80d47327", + 2733 => x"9e38758f", + 2734 => x"2a80f705", + 2735 => x"5482d473", + 2736 => x"27913875", + 2737 => x"922a80fc", + 2738 => x"05548ad4", + 2739 => x"73278438", + 2740 => x"80fe5473", + 2741 => x"10101080", + 2742 => x"f9c00588", + 2743 => x"11085658", + 2744 => x"74782e86", + 2745 => x"cf388415", + 2746 => x"08fc0653", + 2747 => x"7573278d", + 2748 => x"38881508", + 2749 => x"5574782e", + 2750 => x"098106ea", + 2751 => x"388c1508", + 2752 => x"80f9c00b", + 2753 => x"84050871", + 2754 => x"8c1a0c76", + 2755 => x"881a0c78", + 2756 => x"88130c78", + 2757 => x"8c180c5d", + 2758 => x"58795380", + 2759 => x"7a2483e6", + 2760 => x"3872822c", + 2761 => x"81712b5c", + 2762 => x"537a7c26", + 2763 => x"8198387b", + 2764 => x"7b065372", + 2765 => x"82f13879", + 2766 => x"fc068405", + 2767 => x"5a7a1070", + 2768 => x"7d06545b", + 2769 => x"7282e038", + 2770 => x"841a5af1", + 2771 => x"3988178c", + 2772 => x"11085858", + 2773 => x"76782e09", + 2774 => x"8106fcc2", + 2775 => x"38821a5a", + 2776 => x"fdec3978", + 2777 => x"17798107", + 2778 => x"84190c70", + 2779 => x"80f9d40c", + 2780 => x"7080f9d0", + 2781 => x"0c80f9c8", + 2782 => x"0b8c120c", + 2783 => x"8c110888", + 2784 => x"120c7481", + 2785 => x"0784120c", + 2786 => x"74117571", + 2787 => x"0c51537d", + 2788 => x"5188d03f", + 2789 => x"881754fc", + 2790 => x"ac3980f9", + 2791 => x"c00b8405", + 2792 => x"087a545c", + 2793 => x"798025fe", + 2794 => x"f83882da", + 2795 => x"397a097c", + 2796 => x"067080f9", + 2797 => x"c00b8405", + 2798 => x"0c5c7a10", + 2799 => x"5b7a7c26", + 2800 => x"85387a85", + 2801 => x"b83880f9", + 2802 => x"c00b8805", + 2803 => x"08708412", + 2804 => x"08fc0670", + 2805 => x"7c317c72", + 2806 => x"268f7225", + 2807 => x"0757575c", + 2808 => x"5d557280", + 2809 => x"2e80db38", + 2810 => x"797a1680", + 2811 => x"f9b8081b", + 2812 => x"90115a55", + 2813 => x"575b80f9", + 2814 => x"b408ff2e", + 2815 => x"8838a08f", + 2816 => x"13e08006", + 2817 => x"5776527d", + 2818 => x"5187d93f", + 2819 => x"80085480", + 2820 => x"08ff2e90", + 2821 => x"38800876", + 2822 => x"27829938", + 2823 => x"7480f9c0", + 2824 => x"2e829138", + 2825 => x"80f9c00b", + 2826 => x"88050855", + 2827 => x"841508fc", + 2828 => x"06707a31", + 2829 => x"7a72268f", + 2830 => x"72250752", + 2831 => x"55537283", + 2832 => x"e6387479", + 2833 => x"81078417", + 2834 => x"0c791670", + 2835 => x"80f9c00b", + 2836 => x"88050c75", + 2837 => x"81078412", + 2838 => x"0c547e52", + 2839 => x"5787843f", + 2840 => x"881754fa", + 2841 => x"e0397583", + 2842 => x"2a705454", + 2843 => x"80742481", + 2844 => x"9b387282", + 2845 => x"2c81712b", + 2846 => x"80f9c408", + 2847 => x"077080f9", + 2848 => x"c00b8405", + 2849 => x"0c751010", + 2850 => x"1080f9c0", + 2851 => x"05881108", + 2852 => x"585a5d53", + 2853 => x"778c180c", + 2854 => x"7488180c", + 2855 => x"7688190c", + 2856 => x"768c160c", + 2857 => x"fcf33979", + 2858 => x"7a101010", + 2859 => x"80f9c005", + 2860 => x"7057595d", + 2861 => x"8c150857", + 2862 => x"76752ea3", + 2863 => x"38841708", + 2864 => x"fc06707a", + 2865 => x"31555673", + 2866 => x"8f2483ca", + 2867 => x"38738025", + 2868 => x"8481388c", + 2869 => x"17085776", + 2870 => x"752e0981", + 2871 => x"06df3888", + 2872 => x"15811b70", + 2873 => x"8306555b", + 2874 => x"5572c938", + 2875 => x"7c830653", + 2876 => x"72802efd", + 2877 => x"b838ff1d", + 2878 => x"f819595d", + 2879 => x"88180878", + 2880 => x"2eea38fd", + 2881 => x"b539831a", + 2882 => x"53fc9639", + 2883 => x"83147082", + 2884 => x"2c81712b", + 2885 => x"80f9c408", + 2886 => x"077080f9", + 2887 => x"c00b8405", + 2888 => x"0c761010", + 2889 => x"1080f9c0", + 2890 => x"05881108", + 2891 => x"595b5e51", + 2892 => x"53fee139", + 2893 => x"80f98408", + 2894 => x"17588008", + 2895 => x"762e818d", + 2896 => x"3880f9b4", + 2897 => x"08ff2e83", + 2898 => x"ec387376", + 2899 => x"311880f9", + 2900 => x"840c7387", + 2901 => x"06705753", + 2902 => x"72802e88", + 2903 => x"38887331", + 2904 => x"70155556", + 2905 => x"76149fff", + 2906 => x"06a08071", + 2907 => x"31177054", + 2908 => x"7f535753", + 2909 => x"84ee3f80", + 2910 => x"08538008", + 2911 => x"ff2e81a0", + 2912 => x"3880f984", + 2913 => x"08167080", + 2914 => x"f9840c74", + 2915 => x"7580f9c0", + 2916 => x"0b88050c", + 2917 => x"74763118", + 2918 => x"70810751", + 2919 => x"5556587b", + 2920 => x"80f9c02e", + 2921 => x"839c3879", + 2922 => x"8f2682cb", + 2923 => x"38810b84", + 2924 => x"150c8415", + 2925 => x"08fc0670", + 2926 => x"7a317a72", + 2927 => x"268f7225", + 2928 => x"07525553", + 2929 => x"72802efc", + 2930 => x"f93880db", + 2931 => x"3980089f", + 2932 => x"ff065372", + 2933 => x"feeb3877", + 2934 => x"80f9840c", + 2935 => x"80f9c00b", + 2936 => x"8805087b", + 2937 => x"18810784", + 2938 => x"120c5580", + 2939 => x"f9b00878", + 2940 => x"27863877", + 2941 => x"80f9b00c", + 2942 => x"80f9ac08", + 2943 => x"7827fcac", + 2944 => x"387780f9", + 2945 => x"ac0c8415", + 2946 => x"08fc0670", + 2947 => x"7a317a72", + 2948 => x"268f7225", + 2949 => x"07525553", + 2950 => x"72802efc", + 2951 => x"a5388839", + 2952 => x"80745456", + 2953 => x"fedb397d", + 2954 => x"5183b83f", + 2955 => x"800b800c", + 2956 => x"8f3d0d04", + 2957 => x"73538074", + 2958 => x"24a93872", + 2959 => x"822c8171", + 2960 => x"2b80f9c4", + 2961 => x"08077080", + 2962 => x"f9c00b84", + 2963 => x"050c5d53", + 2964 => x"778c180c", + 2965 => x"7488180c", + 2966 => x"7688190c", + 2967 => x"768c160c", + 2968 => x"f9b73983", + 2969 => x"1470822c", + 2970 => x"81712b80", + 2971 => x"f9c40807", + 2972 => x"7080f9c0", + 2973 => x"0b84050c", + 2974 => x"5e5153d4", + 2975 => x"397b7b06", + 2976 => x"5372fca3", + 2977 => x"38841a7b", + 2978 => x"105c5af1", + 2979 => x"39ff1a81", + 2980 => x"11515af7", + 2981 => x"b9397817", + 2982 => x"79810784", + 2983 => x"190c8c18", + 2984 => x"08881908", + 2985 => x"718c120c", + 2986 => x"88120c59", + 2987 => x"7080f9d4", + 2988 => x"0c7080f9", + 2989 => x"d00c80f9", + 2990 => x"c80b8c12", + 2991 => x"0c8c1108", + 2992 => x"88120c74", + 2993 => x"81078412", + 2994 => x"0c741175", + 2995 => x"710c5153", + 2996 => x"f9bd3975", + 2997 => x"17841108", + 2998 => x"81078412", + 2999 => x"0c538c17", + 3000 => x"08881808", + 3001 => x"718c120c", + 3002 => x"88120c58", + 3003 => x"7d5181f3", + 3004 => x"3f881754", + 3005 => x"f5cf3972", + 3006 => x"84150cf4", + 3007 => x"1af80670", + 3008 => x"841e0881", + 3009 => x"0607841e", + 3010 => x"0c701d54", + 3011 => x"5b850b84", + 3012 => x"140c850b", + 3013 => x"88140c8f", + 3014 => x"7b27fdcf", + 3015 => x"38881c52", + 3016 => x"7d5184bf", + 3017 => x"3f80f9c0", + 3018 => x"0b880508", + 3019 => x"80f98408", + 3020 => x"5955fdb7", + 3021 => x"397780f9", + 3022 => x"840c7380", + 3023 => x"f9b40cfc", + 3024 => x"91397284", + 3025 => x"150cfda3", + 3026 => x"39fc3d0d", + 3027 => x"7670797b", + 3028 => x"55555555", + 3029 => x"8f72278c", + 3030 => x"38727507", + 3031 => x"83065170", + 3032 => x"802ea738", + 3033 => x"ff125271", + 3034 => x"ff2e9838", + 3035 => x"72708105", + 3036 => x"54337470", + 3037 => x"81055634", + 3038 => x"ff125271", + 3039 => x"ff2e0981", + 3040 => x"06ea3874", + 3041 => x"800c863d", + 3042 => x"0d047451", + 3043 => x"72708405", + 3044 => x"54087170", + 3045 => x"8405530c", + 3046 => x"72708405", + 3047 => x"54087170", + 3048 => x"8405530c", + 3049 => x"72708405", + 3050 => x"54087170", + 3051 => x"8405530c", + 3052 => x"72708405", + 3053 => x"54087170", + 3054 => x"8405530c", + 3055 => x"f0125271", + 3056 => x"8f26c938", + 3057 => x"83722795", + 3058 => x"38727084", + 3059 => x"05540871", + 3060 => x"70840553", + 3061 => x"0cfc1252", + 3062 => x"718326ed", + 3063 => x"387054ff", + 3064 => x"83390404", + 3065 => x"fd3d0d80", + 3066 => x"0b81d998", + 3067 => x"0c765187", + 3068 => x"c83f8008", + 3069 => x"538008ff", + 3070 => x"2e883872", + 3071 => x"800c853d", + 3072 => x"0d0481d9", + 3073 => x"98085473", + 3074 => x"802ef038", + 3075 => x"7574710c", + 3076 => x"5272800c", + 3077 => x"853d0d04", + 3078 => x"fb3d0d77", + 3079 => x"79707207", + 3080 => x"83065354", + 3081 => x"52709338", + 3082 => x"71737308", + 3083 => x"54565471", + 3084 => x"73082e80", + 3085 => x"c4387375", + 3086 => x"54527133", + 3087 => x"7081ff06", + 3088 => x"52547080", + 3089 => x"2e9d3872", + 3090 => x"33557075", + 3091 => x"2e098106", + 3092 => x"95388112", + 3093 => x"81147133", + 3094 => x"7081ff06", + 3095 => x"54565452", + 3096 => x"70e53872", + 3097 => x"33557381", + 3098 => x"ff067581", + 3099 => x"ff067171", + 3100 => x"31800c52", + 3101 => x"52873d0d", + 3102 => x"04710970", + 3103 => x"f7fbfdff", + 3104 => x"140670f8", + 3105 => x"84828180", + 3106 => x"06515151", + 3107 => x"70973884", + 3108 => x"14841671", + 3109 => x"08545654", + 3110 => x"7175082e", + 3111 => x"dc387375", + 3112 => x"5452ff96", + 3113 => x"39800b80", + 3114 => x"0c873d0d", + 3115 => x"04fb3d0d", + 3116 => x"77705256", + 3117 => x"feac3f80", + 3118 => x"f9c00b88", + 3119 => x"05088411", + 3120 => x"08fc0670", + 3121 => x"7b319fef", + 3122 => x"05e08006", + 3123 => x"e0800556", + 3124 => x"5653a080", + 3125 => x"74249438", + 3126 => x"80527551", + 3127 => x"fe863f80", + 3128 => x"f9c80815", + 3129 => x"53728008", + 3130 => x"2e8f3875", + 3131 => x"51fdf43f", + 3132 => x"80537280", + 3133 => x"0c873d0d", + 3134 => x"04733052", + 3135 => x"7551fde4", + 3136 => x"3f8008ff", + 3137 => x"2ea83880", + 3138 => x"f9c00b88", + 3139 => x"05087575", + 3140 => x"31810784", + 3141 => x"120c5380", + 3142 => x"f9840874", + 3143 => x"3180f984", + 3144 => x"0c7551fd", + 3145 => x"be3f810b", + 3146 => x"800c873d", + 3147 => x"0d048052", + 3148 => x"7551fdb0", + 3149 => x"3f80f9c0", + 3150 => x"0b880508", + 3151 => x"80087131", + 3152 => x"56538f75", + 3153 => x"25ffa438", + 3154 => x"800880f9", + 3155 => x"b4083180", + 3156 => x"f9840c74", + 3157 => x"81078414", + 3158 => x"0c7551fd", + 3159 => x"863f8053", + 3160 => x"ff9039f6", + 3161 => x"3d0d7c7e", + 3162 => x"545b7280", + 3163 => x"2e828338", + 3164 => x"7a51fcee", + 3165 => x"3ff81384", + 3166 => x"110870fe", + 3167 => x"06701384", + 3168 => x"1108fc06", + 3169 => x"5d585954", + 3170 => x"5880f9c8", + 3171 => x"08752e82", + 3172 => x"de387884", + 3173 => x"160c8073", + 3174 => x"8106545a", + 3175 => x"727a2e81", + 3176 => x"d5387815", + 3177 => x"84110881", + 3178 => x"06515372", + 3179 => x"a0387817", + 3180 => x"577981e6", + 3181 => x"38881508", + 3182 => x"537280f9", + 3183 => x"c82e82f9", + 3184 => x"388c1508", + 3185 => x"708c150c", + 3186 => x"7388120c", + 3187 => x"56768107", + 3188 => x"84190c76", + 3189 => x"1877710c", + 3190 => x"53798191", + 3191 => x"3883ff77", + 3192 => x"2781c838", + 3193 => x"76892a77", + 3194 => x"832a5653", + 3195 => x"72802ebf", + 3196 => x"3876862a", + 3197 => x"b8055584", + 3198 => x"7327b438", + 3199 => x"80db1355", + 3200 => x"947327ab", + 3201 => x"38768c2a", + 3202 => x"80ee0555", + 3203 => x"80d47327", + 3204 => x"9e38768f", + 3205 => x"2a80f705", + 3206 => x"5582d473", + 3207 => x"27913876", + 3208 => x"922a80fc", + 3209 => x"05558ad4", + 3210 => x"73278438", + 3211 => x"80fe5574", + 3212 => x"10101080", + 3213 => x"f9c00588", + 3214 => x"11085556", + 3215 => x"73762e82", + 3216 => x"b3388414", + 3217 => x"08fc0653", + 3218 => x"7673278d", + 3219 => x"38881408", + 3220 => x"5473762e", + 3221 => x"098106ea", + 3222 => x"388c1408", + 3223 => x"708c1a0c", + 3224 => x"74881a0c", + 3225 => x"7888120c", + 3226 => x"56778c15", + 3227 => x"0c7a51fa", + 3228 => x"f23f8c3d", + 3229 => x"0d047708", + 3230 => x"78713159", + 3231 => x"77058819", + 3232 => x"08545772", + 3233 => x"80f9c82e", + 3234 => x"80e0388c", + 3235 => x"1808708c", + 3236 => x"150c7388", + 3237 => x"120c56fe", + 3238 => x"89398815", + 3239 => x"088c1608", + 3240 => x"708c130c", + 3241 => x"5788170c", + 3242 => x"fea33976", + 3243 => x"832a7054", + 3244 => x"55807524", + 3245 => x"81983872", + 3246 => x"822c8171", + 3247 => x"2b80f9c4", + 3248 => x"080780f9", + 3249 => x"c00b8405", + 3250 => x"0c537410", + 3251 => x"101080f9", + 3252 => x"c0058811", + 3253 => x"08555675", + 3254 => x"8c190c73", + 3255 => x"88190c77", + 3256 => x"88170c77", + 3257 => x"8c150cff", + 3258 => x"8439815a", + 3259 => x"fdb43978", + 3260 => x"17738106", + 3261 => x"54577298", + 3262 => x"38770878", + 3263 => x"71315977", + 3264 => x"058c1908", + 3265 => x"881a0871", + 3266 => x"8c120c88", + 3267 => x"120c5757", + 3268 => x"76810784", + 3269 => x"190c7780", + 3270 => x"f9c00b88", + 3271 => x"050c80f9", + 3272 => x"bc087726", + 3273 => x"fec73880", + 3274 => x"f9b80852", + 3275 => x"7a51fafd", + 3276 => x"3f7a51f9", + 3277 => x"ae3ffeba", + 3278 => x"3981788c", + 3279 => x"150c7888", + 3280 => x"150c738c", + 3281 => x"1a0c7388", + 3282 => x"1a0c5afd", + 3283 => x"80398315", + 3284 => x"70822c81", + 3285 => x"712b80f9", + 3286 => x"c4080780", + 3287 => x"f9c00b84", + 3288 => x"050c5153", + 3289 => x"74101010", + 3290 => x"80f9c005", + 3291 => x"88110855", + 3292 => x"56fee439", + 3293 => x"74538075", + 3294 => x"24a73872", + 3295 => x"822c8171", + 3296 => x"2b80f9c4", + 3297 => x"080780f9", + 3298 => x"c00b8405", + 3299 => x"0c53758c", + 3300 => x"190c7388", + 3301 => x"190c7788", + 3302 => x"170c778c", + 3303 => x"150cfdcd", + 3304 => x"39831570", + 3305 => x"822c8171", + 3306 => x"2b80f9c4", + 3307 => x"080780f9", + 3308 => x"c00b8405", + 3309 => x"0c5153d6", + 3310 => x"39fe3d0d", + 3311 => x"8188f008", + 3312 => x"51708a38", + 3313 => x"81d99c70", + 3314 => x"8188f00c", + 3315 => x"51707512", + 3316 => x"5252ff53", + 3317 => x"7087fb80", + 3318 => x"80268838", + 3319 => x"708188f0", + 3320 => x"0c715372", + 3321 => x"800c843d", + 3322 => x"0d04fd3d", + 3323 => x"0d800b80", + 3324 => x"f8ec0854", + 3325 => x"5472812e", + 3326 => x"9e387381", + 3327 => x"88f40cff", + 3328 => x"a0ff3fff", + 3329 => x"9ffa3f81", + 3330 => x"88c85281", + 3331 => x"51ffa9ae", + 3332 => x"3f800851", + 3333 => x"80e13f72", + 3334 => x"8188f40c", + 3335 => x"ffa0e23f", + 3336 => x"ff9fdd3f", + 3337 => x"8188c852", + 3338 => x"8151ffa9", + 3339 => x"913f8008", + 3340 => x"5180c43f", + 3341 => x"00ff3900", + 3342 => x"ff39f43d", + 3343 => x"0d7e8188", + 3344 => x"e8087008", + 3345 => x"7081ff06", + 3346 => x"923df805", + 3347 => x"55515a57", + 3348 => x"59ffa19a", + 3349 => x"3f805477", + 3350 => x"557b7d58", + 3351 => x"5276538e", + 3352 => x"3df00551", + 3353 => x"c0c03f79", + 3354 => x"7b58790c", + 3355 => x"76841a0c", + 3356 => x"78800c8e", + 3357 => x"3d0d04f7", + 3358 => x"3d0d7b81", + 3359 => x"81c80882", + 3360 => x"c811085a", + 3361 => x"545a7780", + 3362 => x"2e80da38", + 3363 => x"81881884", + 3364 => x"1908ff05", + 3365 => x"81712b59", + 3366 => x"55598074", + 3367 => x"2480ea38", + 3368 => x"807424b5", + 3369 => x"3873822b", + 3370 => x"78118805", + 3371 => x"56568180", + 3372 => x"19087706", + 3373 => x"5372802e", + 3374 => x"b6387816", + 3375 => x"70085353", + 3376 => x"79517408", + 3377 => x"53722dff", + 3378 => x"14fc17fc", + 3379 => x"1779812c", + 3380 => x"5a575754", + 3381 => x"738025d6", + 3382 => x"38770858", + 3383 => x"77ffad38", + 3384 => x"8181c808", + 3385 => x"53bc1308", + 3386 => x"a5387951", + 3387 => x"fec63f74", + 3388 => x"0853722d", + 3389 => x"ff14fc17", + 3390 => x"fc177981", + 3391 => x"2c5a5757", + 3392 => x"54738025", + 3393 => x"ffa838d1", + 3394 => x"398057ff", + 3395 => x"93397251", + 3396 => x"bc130853", + 3397 => x"722d7951", + 3398 => x"fe9a3fff", + 3399 => x"3d0d8188", + 3400 => x"d00bfc05", + 3401 => x"70085252", + 3402 => x"70ff2e91", + 3403 => x"38702dfc", + 3404 => x"12700852", + 3405 => x"5270ff2e", + 3406 => x"098106f1", + 3407 => x"38833d0d", + 3408 => x"0404ffa0", + 3409 => x"873f0400", + 3410 => x"00000040", + 3411 => x"30313233", + 3412 => x"34353637", + 3413 => x"38390000", + 3414 => x"44485259", + 3415 => x"53544f4e", + 3416 => x"45205052", + 3417 => x"4f475241", + 3418 => x"4d2c2053", + 3419 => x"4f4d4520", + 3420 => x"53545249", + 3421 => x"4e470000", + 3422 => x"44485259", + 3423 => x"53544f4e", + 3424 => x"45205052", + 3425 => x"4f475241", + 3426 => x"4d2c2031", + 3427 => x"27535420", + 3428 => x"53545249", + 3429 => x"4e470000", + 3430 => x"44687279", + 3431 => x"73746f6e", + 3432 => x"65204265", + 3433 => x"6e63686d", + 3434 => x"61726b2c", + 3435 => x"20566572", + 3436 => x"73696f6e", + 3437 => x"20322e31", + 3438 => x"20284c61", + 3439 => x"6e677561", + 3440 => x"67653a20", + 3441 => x"43290a00", + 3442 => x"50726f67", + 3443 => x"72616d20", + 3444 => x"636f6d70", + 3445 => x"696c6564", + 3446 => x"20776974", + 3447 => x"68202772", + 3448 => x"65676973", + 3449 => x"74657227", + 3450 => x"20617474", + 3451 => x"72696275", + 3452 => x"74650a00", + 3453 => x"45786563", + 3454 => x"7574696f", + 3455 => x"6e207374", + 3456 => x"61727473", + 3457 => x"2c202564", + 3458 => x"2072756e", + 3459 => x"73207468", + 3460 => x"726f7567", + 3461 => x"68204468", + 3462 => x"72797374", + 3463 => x"6f6e650a", + 3464 => x"00000000", + 3465 => x"44485259", + 3466 => x"53544f4e", + 3467 => x"45205052", + 3468 => x"4f475241", + 3469 => x"4d2c2032", + 3470 => x"274e4420", + 3471 => x"53545249", + 3472 => x"4e470000", + 3473 => x"45786563", + 3474 => x"7574696f", + 3475 => x"6e20656e", + 3476 => x"64730a00", + 3477 => x"46696e61", + 3478 => x"6c207661", + 3479 => x"6c756573", + 3480 => x"206f6620", + 3481 => x"74686520", + 3482 => x"76617269", + 3483 => x"61626c65", + 3484 => x"73207573", + 3485 => x"65642069", + 3486 => x"6e207468", + 3487 => x"65206265", + 3488 => x"6e63686d", + 3489 => x"61726b3a", + 3490 => x"0a000000", + 3491 => x"496e745f", + 3492 => x"476c6f62", + 3493 => x"3a202020", + 3494 => x"20202020", + 3495 => x"20202020", + 3496 => x"2025640a", + 3497 => x"00000000", + 3498 => x"20202020", + 3499 => x"20202020", + 3500 => x"73686f75", + 3501 => x"6c642062", + 3502 => x"653a2020", + 3503 => x"2025640a", + 3504 => x"00000000", + 3505 => x"426f6f6c", + 3506 => x"5f476c6f", + 3507 => x"623a2020", + 3508 => x"20202020", + 3509 => x"20202020", + 3510 => x"2025640a", + 3511 => x"00000000", + 3512 => x"43685f31", + 3513 => x"5f476c6f", + 3514 => x"623a2020", + 3515 => x"20202020", + 3516 => x"20202020", + 3517 => x"2025630a", + 3518 => x"00000000", + 3519 => x"20202020", + 3520 => x"20202020", + 3521 => x"73686f75", + 3522 => x"6c642062", + 3523 => x"653a2020", + 3524 => x"2025630a", + 3525 => x"00000000", + 3526 => x"43685f32", + 3527 => x"5f476c6f", + 3528 => x"623a2020", + 3529 => x"20202020", + 3530 => x"20202020", + 3531 => x"2025630a", + 3532 => x"00000000", + 3533 => x"4172725f", + 3534 => x"315f476c", + 3535 => x"6f625b38", + 3536 => x"5d3a2020", + 3537 => x"20202020", + 3538 => x"2025640a", + 3539 => x"00000000", + 3540 => x"4172725f", + 3541 => x"325f476c", + 3542 => x"6f625b38", + 3543 => x"5d5b375d", + 3544 => x"3a202020", + 3545 => x"2025640a", + 3546 => x"00000000", + 3547 => x"20202020", + 3548 => x"20202020", + 3549 => x"73686f75", + 3550 => x"6c642062", + 3551 => x"653a2020", + 3552 => x"204e756d", + 3553 => x"6265725f", + 3554 => x"4f665f52", + 3555 => x"756e7320", + 3556 => x"2b203130", + 3557 => x"0a000000", + 3558 => x"5074725f", + 3559 => x"476c6f62", + 3560 => x"2d3e0a00", + 3561 => x"20205074", + 3562 => x"725f436f", + 3563 => x"6d703a20", + 3564 => x"20202020", + 3565 => x"20202020", + 3566 => x"2025640a", + 3567 => x"00000000", + 3568 => x"20202020", + 3569 => x"20202020", + 3570 => x"73686f75", + 3571 => x"6c642062", + 3572 => x"653a2020", + 3573 => x"2028696d", + 3574 => x"706c656d", + 3575 => x"656e7461", + 3576 => x"74696f6e", + 3577 => x"2d646570", + 3578 => x"656e6465", + 3579 => x"6e74290a", + 3580 => x"00000000", + 3581 => x"20204469", + 3582 => x"7363723a", + 3583 => x"20202020", + 3584 => x"20202020", + 3585 => x"20202020", + 3586 => x"2025640a", + 3587 => x"00000000", + 3588 => x"2020456e", + 3589 => x"756d5f43", + 3590 => x"6f6d703a", + 3591 => x"20202020", + 3592 => x"20202020", + 3593 => x"2025640a", + 3594 => x"00000000", + 3595 => x"2020496e", + 3596 => x"745f436f", + 3597 => x"6d703a20", + 3598 => x"20202020", + 3599 => x"20202020", + 3600 => x"2025640a", + 3601 => x"00000000", + 3602 => x"20205374", + 3603 => x"725f436f", + 3604 => x"6d703a20", + 3605 => x"20202020", + 3606 => x"20202020", + 3607 => x"2025730a", + 3608 => x"00000000", + 3609 => x"20202020", + 3610 => x"20202020", + 3611 => x"73686f75", + 3612 => x"6c642062", + 3613 => x"653a2020", + 3614 => x"20444852", + 3615 => x"5953544f", + 3616 => x"4e452050", + 3617 => x"524f4752", + 3618 => x"414d2c20", + 3619 => x"534f4d45", + 3620 => x"20535452", + 3621 => x"494e470a", + 3622 => x"00000000", + 3623 => x"4e657874", + 3624 => x"5f507472", + 3625 => x"5f476c6f", + 3626 => x"622d3e0a", + 3627 => x"00000000", + 3628 => x"20202020", + 3629 => x"20202020", + 3630 => x"73686f75", + 3631 => x"6c642062", + 3632 => x"653a2020", + 3633 => x"2028696d", + 3634 => x"706c656d", + 3635 => x"656e7461", + 3636 => x"74696f6e", + 3637 => x"2d646570", + 3638 => x"656e6465", + 3639 => x"6e74292c", + 3640 => x"2073616d", + 3641 => x"65206173", + 3642 => x"2061626f", + 3643 => x"76650a00", + 3644 => x"496e745f", + 3645 => x"315f4c6f", + 3646 => x"633a2020", + 3647 => x"20202020", + 3648 => x"20202020", + 3649 => x"2025640a", + 3650 => x"00000000", + 3651 => x"496e745f", + 3652 => x"325f4c6f", + 3653 => x"633a2020", + 3654 => x"20202020", + 3655 => x"20202020", + 3656 => x"2025640a", + 3657 => x"00000000", + 3658 => x"496e745f", + 3659 => x"335f4c6f", + 3660 => x"633a2020", + 3661 => x"20202020", + 3662 => x"20202020", + 3663 => x"2025640a", + 3664 => x"00000000", + 3665 => x"456e756d", + 3666 => x"5f4c6f63", + 3667 => x"3a202020", + 3668 => x"20202020", + 3669 => x"20202020", + 3670 => x"2025640a", + 3671 => x"00000000", + 3672 => x"5374725f", + 3673 => x"315f4c6f", + 3674 => x"633a2020", + 3675 => x"20202020", + 3676 => x"20202020", + 3677 => x"2025730a", + 3678 => x"00000000", + 3679 => x"20202020", + 3680 => x"20202020", + 3681 => x"73686f75", + 3682 => x"6c642062", + 3683 => x"653a2020", + 3684 => x"20444852", + 3685 => x"5953544f", + 3686 => x"4e452050", + 3687 => x"524f4752", + 3688 => x"414d2c20", + 3689 => x"31275354", + 3690 => x"20535452", + 3691 => x"494e470a", + 3692 => x"00000000", + 3693 => x"5374725f", + 3694 => x"325f4c6f", + 3695 => x"633a2020", + 3696 => x"20202020", + 3697 => x"20202020", + 3698 => x"2025730a", + 3699 => x"00000000", + 3700 => x"20202020", + 3701 => x"20202020", + 3702 => x"73686f75", + 3703 => x"6c642062", + 3704 => x"653a2020", + 3705 => x"20444852", + 3706 => x"5953544f", + 3707 => x"4e452050", + 3708 => x"524f4752", + 3709 => x"414d2c20", + 3710 => x"32274e44", + 3711 => x"20535452", + 3712 => x"494e470a", + 3713 => x"00000000", + 3714 => x"55736572", + 3715 => x"2074696d", + 3716 => x"653a2025", + 3717 => x"640a0000", + 3718 => x"4d696372", + 3719 => x"6f736563", + 3720 => x"6f6e6473", + 3721 => x"20666f72", + 3722 => x"206f6e65", + 3723 => x"2072756e", + 3724 => x"20746872", + 3725 => x"6f756768", + 3726 => x"20446872", + 3727 => x"7973746f", + 3728 => x"6e653a20", + 3729 => x"00000000", + 3730 => x"2564200a", + 3731 => x"00000000", + 3732 => x"44687279", + 3733 => x"73746f6e", + 3734 => x"65732070", + 3735 => x"65722053", + 3736 => x"65636f6e", + 3737 => x"643a2020", + 3738 => x"20202020", + 3739 => x"20202020", + 3740 => x"20202020", + 3741 => x"20202020", + 3742 => x"20202020", + 3743 => x"00000000", + 3744 => x"56415820", + 3745 => x"4d495053", + 3746 => x"20726174", + 3747 => x"696e6720", + 3748 => x"2a203130", + 3749 => x"3030203d", + 3750 => x"20256420", + 3751 => x"0a000000", + 3752 => x"50726f67", + 3753 => x"72616d20", + 3754 => x"636f6d70", + 3755 => x"696c6564", + 3756 => x"20776974", + 3757 => x"686f7574", + 3758 => x"20277265", + 3759 => x"67697374", + 3760 => x"65722720", + 3761 => x"61747472", + 3762 => x"69627574", + 3763 => x"650a0000", + 3764 => x"4d656173", + 3765 => x"75726564", + 3766 => x"2074696d", + 3767 => x"6520746f", + 3768 => x"6f20736d", + 3769 => x"616c6c20", + 3770 => x"746f206f", + 3771 => x"62746169", + 3772 => x"6e206d65", + 3773 => x"616e696e", + 3774 => x"6766756c", + 3775 => x"20726573", + 3776 => x"756c7473", + 3777 => x"0a000000", + 3778 => x"506c6561", + 3779 => x"73652069", + 3780 => x"6e637265", + 3781 => x"61736520", + 3782 => x"6e756d62", + 3783 => x"6572206f", + 3784 => x"66207275", + 3785 => x"6e730a00", + 3786 => x"44485259", + 3787 => x"53544f4e", + 3788 => x"45205052", + 3789 => x"4f475241", + 3790 => x"4d2c2033", + 3791 => x"27524420", + 3792 => x"53545249", + 3793 => x"4e470000", + 3794 => x"00010202", + 3795 => x"03030303", + 3796 => x"04040404", + 3797 => x"04040404", + 3798 => x"05050505", + 3799 => x"05050505", + 3800 => x"05050505", + 3801 => x"05050505", + 3802 => x"06060606", + 3803 => x"06060606", + 3804 => x"06060606", + 3805 => x"06060606", + 3806 => x"06060606", + 3807 => x"06060606", + 3808 => x"06060606", + 3809 => x"06060606", + 3810 => x"07070707", + 3811 => x"07070707", + 3812 => x"07070707", + 3813 => x"07070707", + 3814 => x"07070707", + 3815 => x"07070707", + 3816 => x"07070707", + 3817 => x"07070707", + 3818 => x"07070707", + 3819 => x"07070707", + 3820 => x"07070707", + 3821 => x"07070707", + 3822 => x"07070707", + 3823 => x"07070707", + 3824 => x"07070707", + 3825 => x"07070707", + 3826 => x"08080808", + 3827 => x"08080808", + 3828 => x"08080808", + 3829 => x"08080808", + 3830 => x"08080808", + 3831 => x"08080808", + 3832 => x"08080808", + 3833 => x"08080808", + 3834 => x"08080808", + 3835 => x"08080808", + 3836 => x"08080808", + 3837 => x"08080808", + 3838 => x"08080808", + 3839 => x"08080808", + 3840 => x"08080808", + 3841 => x"08080808", + 3842 => x"08080808", + 3843 => x"08080808", + 3844 => x"08080808", + 3845 => x"08080808", + 3846 => x"08080808", + 3847 => x"08080808", + 3848 => x"08080808", + 3849 => x"08080808", + 3850 => x"08080808", + 3851 => x"08080808", + 3852 => x"08080808", + 3853 => x"08080808", + 3854 => x"08080808", + 3855 => x"08080808", + 3856 => x"08080808", + 3857 => x"08080808", + 3858 => x"43000000", + 3859 => x"64756d6d", + 3860 => x"792e6578", + 3861 => x"65000000", + 3862 => x"00ffffff", + 3863 => x"ff00ffff", + 3864 => x"ffff00ff", + 3865 => x"ffffff00", + 3866 => x"00000000", + 3867 => x"00000000", + 3868 => x"00000000", + 3869 => x"00004458", + 3870 => x"0000000a", + 3871 => x"00000000", + 3872 => x"00000032", + 3873 => x"00000000", + 3874 => x"00000000", + 3875 => x"00000000", + 3876 => x"00000000", + 3877 => x"00000000", + 3878 => x"00000000", + 3879 => x"00000000", + 3880 => x"00000000", + 3881 => x"00000000", + 3882 => x"00000000", + 3883 => x"00000000", + 3884 => x"00000000", + 3885 => x"ffffffff", + 3886 => x"00000000", + 3887 => x"00020000", + 3888 => x"00000000", + 3889 => x"00000000", + 3890 => x"00003cc0", + 3891 => x"00003cc0", + 3892 => x"00003cc8", + 3893 => x"00003cc8", + 3894 => x"00003cd0", + 3895 => x"00003cd0", + 3896 => x"00003cd8", + 3897 => x"00003cd8", + 3898 => x"00003ce0", + 3899 => x"00003ce0", + 3900 => x"00003ce8", + 3901 => x"00003ce8", + 3902 => x"00003cf0", + 3903 => x"00003cf0", + 3904 => x"00003cf8", + 3905 => x"00003cf8", + 3906 => x"00003d00", + 3907 => x"00003d00", + 3908 => x"00003d08", + 3909 => x"00003d08", + 3910 => x"00003d10", + 3911 => x"00003d10", + 3912 => x"00003d18", + 3913 => x"00003d18", + 3914 => x"00003d20", + 3915 => x"00003d20", + 3916 => x"00003d28", + 3917 => x"00003d28", + 3918 => x"00003d30", + 3919 => x"00003d30", + 3920 => x"00003d38", + 3921 => x"00003d38", + 3922 => x"00003d40", + 3923 => x"00003d40", + 3924 => x"00003d48", + 3925 => x"00003d48", + 3926 => x"00003d50", + 3927 => x"00003d50", + 3928 => x"00003d58", + 3929 => x"00003d58", + 3930 => x"00003d60", + 3931 => x"00003d60", + 3932 => x"00003d68", + 3933 => x"00003d68", + 3934 => x"00003d70", + 3935 => x"00003d70", + 3936 => x"00003d78", + 3937 => x"00003d78", + 3938 => x"00003d80", + 3939 => x"00003d80", + 3940 => x"00003d88", + 3941 => x"00003d88", + 3942 => x"00003d90", + 3943 => x"00003d90", + 3944 => x"00003d98", + 3945 => x"00003d98", + 3946 => x"00003da0", + 3947 => x"00003da0", + 3948 => x"00003da8", + 3949 => x"00003da8", + 3950 => x"00003db0", + 3951 => x"00003db0", + 3952 => x"00003db8", + 3953 => x"00003db8", + 3954 => x"00003dc0", + 3955 => x"00003dc0", + 3956 => x"00003dc8", + 3957 => x"00003dc8", + 3958 => x"00003dd0", + 3959 => x"00003dd0", + 3960 => x"00003dd8", + 3961 => x"00003dd8", + 3962 => x"00003de0", + 3963 => x"00003de0", + 3964 => x"00003de8", + 3965 => x"00003de8", + 3966 => x"00003df0", + 3967 => x"00003df0", + 3968 => x"00003df8", + 3969 => x"00003df8", + 3970 => x"00003e00", + 3971 => x"00003e00", + 3972 => x"00003e08", + 3973 => x"00003e08", + 3974 => x"00003e10", + 3975 => x"00003e10", + 3976 => x"00003e18", + 3977 => x"00003e18", + 3978 => x"00003e20", + 3979 => x"00003e20", + 3980 => x"00003e28", + 3981 => x"00003e28", + 3982 => x"00003e30", + 3983 => x"00003e30", + 3984 => x"00003e38", + 3985 => x"00003e38", + 3986 => x"00003e40", + 3987 => x"00003e40", + 3988 => x"00003e48", + 3989 => x"00003e48", + 3990 => x"00003e50", + 3991 => x"00003e50", + 3992 => x"00003e58", + 3993 => x"00003e58", + 3994 => x"00003e60", + 3995 => x"00003e60", + 3996 => x"00003e68", + 3997 => x"00003e68", + 3998 => x"00003e70", + 3999 => x"00003e70", + 4000 => x"00003e78", + 4001 => x"00003e78", + 4002 => x"00003e80", + 4003 => x"00003e80", + 4004 => x"00003e88", + 4005 => x"00003e88", + 4006 => x"00003e90", + 4007 => x"00003e90", + 4008 => x"00003e98", + 4009 => x"00003e98", + 4010 => x"00003ea0", + 4011 => x"00003ea0", + 4012 => x"00003ea8", + 4013 => x"00003ea8", + 4014 => x"00003eb0", + 4015 => x"00003eb0", + 4016 => x"00003eb8", + 4017 => x"00003eb8", + 4018 => x"00003ec0", + 4019 => x"00003ec0", + 4020 => x"00003ec8", + 4021 => x"00003ec8", + 4022 => x"00003ed0", + 4023 => x"00003ed0", + 4024 => x"00003ed8", + 4025 => x"00003ed8", + 4026 => x"00003ee0", + 4027 => x"00003ee0", + 4028 => x"00003ee8", + 4029 => x"00003ee8", + 4030 => x"00003ef0", + 4031 => x"00003ef0", + 4032 => x"00003ef8", + 4033 => x"00003ef8", + 4034 => x"00003f00", + 4035 => x"00003f00", + 4036 => x"00003f08", + 4037 => x"00003f08", + 4038 => x"00003f10", + 4039 => x"00003f10", + 4040 => x"00003f18", + 4041 => x"00003f18", + 4042 => x"00003f20", + 4043 => x"00003f20", + 4044 => x"00003f28", + 4045 => x"00003f28", + 4046 => x"00003f30", + 4047 => x"00003f30", + 4048 => x"00003f38", + 4049 => x"00003f38", + 4050 => x"00003f40", + 4051 => x"00003f40", + 4052 => x"00003f48", + 4053 => x"00003f48", + 4054 => x"00003f50", + 4055 => x"00003f50", + 4056 => x"00003f58", + 4057 => x"00003f58", + 4058 => x"00003f60", + 4059 => x"00003f60", + 4060 => x"00003f68", + 4061 => x"00003f68", + 4062 => x"00003f70", + 4063 => x"00003f70", + 4064 => x"00003f78", + 4065 => x"00003f78", + 4066 => x"00003f80", + 4067 => x"00003f80", + 4068 => x"00003f88", + 4069 => x"00003f88", + 4070 => x"00003f90", + 4071 => x"00003f90", + 4072 => x"00003f98", + 4073 => x"00003f98", + 4074 => x"00003fa0", + 4075 => x"00003fa0", + 4076 => x"00003fa8", + 4077 => x"00003fa8", + 4078 => x"00003fb0", + 4079 => x"00003fb0", + 4080 => x"00003fb8", + 4081 => x"00003fb8", + 4082 => x"00003fc0", + 4083 => x"00003fc0", + 4084 => x"00003fc8", + 4085 => x"00003fc8", + 4086 => x"00003fd0", + 4087 => x"00003fd0", + 4088 => x"00003fd8", + 4089 => x"00003fd8", + 4090 => x"00003fe0", + 4091 => x"00003fe0", + 4092 => x"00003fe8", + 4093 => x"00003fe8", + 4094 => x"00003ff0", + 4095 => x"00003ff0", + 4096 => x"00003ff8", + 4097 => x"00003ff8", + 4098 => x"00004000", + 4099 => x"00004000", + 4100 => x"00004008", + 4101 => x"00004008", + 4102 => x"00004010", + 4103 => x"00004010", + 4104 => x"00004018", + 4105 => x"00004018", + 4106 => x"00004020", + 4107 => x"00004020", + 4108 => x"00004028", + 4109 => x"00004028", + 4110 => x"00004030", + 4111 => x"00004030", + 4112 => x"00004038", + 4113 => x"00004038", + 4114 => x"00004040", + 4115 => x"00004040", + 4116 => x"00004048", + 4117 => x"00004048", + 4118 => x"00004050", + 4119 => x"00004050", + 4120 => x"00004058", + 4121 => x"00004058", + 4122 => x"00004060", + 4123 => x"00004060", + 4124 => x"00004068", + 4125 => x"00004068", + 4126 => x"00004070", + 4127 => x"00004070", + 4128 => x"00004078", + 4129 => x"00004078", + 4130 => x"00004080", + 4131 => x"00004080", + 4132 => x"00004088", + 4133 => x"00004088", + 4134 => x"00004090", + 4135 => x"00004090", + 4136 => x"00004098", + 4137 => x"00004098", + 4138 => x"000040a0", + 4139 => x"000040a0", + 4140 => x"000040a8", + 4141 => x"000040a8", + 4142 => x"000040b0", + 4143 => x"000040b0", + 4144 => x"000040b8", + 4145 => x"000040b8", + 4146 => x"000040cc", + 4147 => x"00000000", + 4148 => x"00004334", + 4149 => x"00004390", + 4150 => x"000043ec", + 4151 => x"00000000", + 4152 => x"00000000", + 4153 => x"00000000", + 4154 => x"00000000", + 4155 => x"00000000", + 4156 => x"00000000", + 4157 => x"00000000", + 4158 => x"00000000", + 4159 => x"00000000", + 4160 => x"00003c48", + 4161 => x"00000000", + 4162 => x"00000000", + 4163 => x"00000000", + 4164 => x"00000000", + 4165 => x"00000000", + 4166 => x"00000000", + 4167 => x"00000000", + 4168 => x"00000000", + 4169 => x"00000000", + 4170 => x"00000000", + 4171 => x"00000000", + 4172 => x"00000000", + 4173 => x"00000000", + 4174 => x"00000000", + 4175 => x"00000000", + 4176 => x"00000000", + 4177 => x"00000000", + 4178 => x"00000000", + 4179 => x"00000000", + 4180 => x"00000000", + 4181 => x"00000000", + 4182 => x"00000000", + 4183 => x"00000000", + 4184 => x"00000000", + 4185 => x"00000000", + 4186 => x"00000000", + 4187 => x"00000000", + 4188 => x"00000000", + 4189 => x"00000001", + 4190 => x"330eabcd", + 4191 => x"1234e66d", + 4192 => x"deec0005", + 4193 => x"000b0000", + 4194 => x"00000000", + 4195 => x"00000000", + 4196 => x"00000000", + 4197 => x"00000000", + 4198 => x"00000000", + 4199 => x"00000000", + 4200 => x"00000000", + 4201 => x"00000000", + 4202 => x"00000000", + 4203 => x"00000000", + 4204 => x"00000000", + 4205 => x"00000000", + 4206 => x"00000000", + 4207 => x"00000000", + 4208 => x"00000000", + 4209 => x"00000000", + 4210 => x"00000000", + 4211 => x"00000000", + 4212 => x"00000000", + 4213 => x"00000000", + 4214 => x"00000000", + 4215 => x"00000000", + 4216 => x"00000000", + 4217 => x"00000000", + 4218 => x"00000000", + 4219 => x"00000000", + 4220 => x"00000000", + 4221 => x"00000000", + 4222 => x"00000000", + 4223 => x"00000000", + 4224 => x"00000000", + 4225 => x"00000000", + 4226 => x"00000000", + 4227 => x"00000000", + 4228 => x"00000000", + 4229 => x"00000000", + 4230 => x"00000000", + 4231 => x"00000000", + 4232 => x"00000000", + 4233 => x"00000000", + 4234 => x"00000000", + 4235 => x"00000000", + 4236 => x"00000000", + 4237 => x"00000000", + 4238 => x"00000000", + 4239 => x"00000000", + 4240 => x"00000000", + 4241 => x"00000000", + 4242 => x"00000000", + 4243 => x"00000000", + 4244 => x"00000000", + 4245 => x"00000000", + 4246 => x"00000000", + 4247 => x"00000000", + 4248 => x"00000000", + 4249 => x"00000000", + 4250 => x"00000000", + 4251 => x"00000000", + 4252 => x"00000000", + 4253 => x"00000000", + 4254 => x"00000000", + 4255 => x"00000000", + 4256 => x"00000000", + 4257 => x"00000000", + 4258 => x"00000000", + 4259 => x"00000000", + 4260 => x"00000000", + 4261 => x"00000000", + 4262 => x"00000000", + 4263 => x"00000000", + 4264 => x"00000000", + 4265 => x"00000000", + 4266 => x"00000000", + 4267 => x"00000000", + 4268 => x"00000000", + 4269 => x"00000000", + 4270 => x"00000000", + 4271 => x"00000000", + 4272 => x"00000000", + 4273 => x"00000000", + 4274 => x"00000000", + 4275 => x"00000000", + 4276 => x"00000000", + 4277 => x"00000000", + 4278 => x"00000000", + 4279 => x"00000000", + 4280 => x"00000000", + 4281 => x"00000000", + 4282 => x"00000000", + 4283 => x"00000000", + 4284 => x"00000000", + 4285 => x"00000000", + 4286 => x"00000000", + 4287 => x"00000000", + 4288 => x"00000000", + 4289 => x"00000000", + 4290 => x"00000000", + 4291 => x"00000000", + 4292 => x"00000000", + 4293 => x"00000000", + 4294 => x"00000000", + 4295 => x"00000000", + 4296 => x"00000000", + 4297 => x"00000000", + 4298 => x"00000000", + 4299 => x"00000000", + 4300 => x"00000000", + 4301 => x"00000000", + 4302 => x"00000000", + 4303 => x"00000000", + 4304 => x"00000000", + 4305 => x"00000000", + 4306 => x"00000000", + 4307 => x"00000000", + 4308 => x"00000000", + 4309 => x"00000000", + 4310 => x"00000000", + 4311 => x"00000000", + 4312 => x"00000000", + 4313 => x"00000000", + 4314 => x"00000000", + 4315 => x"00000000", + 4316 => x"00000000", + 4317 => x"00000000", + 4318 => x"00000000", + 4319 => x"00000000", + 4320 => x"00000000", + 4321 => x"00000000", + 4322 => x"00000000", + 4323 => x"00000000", + 4324 => x"00000000", + 4325 => x"00000000", + 4326 => x"00000000", + 4327 => x"00000000", + 4328 => x"00000000", + 4329 => x"00000000", + 4330 => x"00000000", + 4331 => x"00000000", + 4332 => x"00000000", + 4333 => x"00000000", + 4334 => x"00000000", + 4335 => x"00000000", + 4336 => x"00000000", + 4337 => x"00000000", + 4338 => x"00000000", + 4339 => x"00000000", + 4340 => x"00000000", + 4341 => x"00000000", + 4342 => x"00000000", + 4343 => x"00000000", + 4344 => x"00000000", + 4345 => x"00000000", + 4346 => x"00000000", + 4347 => x"00000000", + 4348 => x"00000000", + 4349 => x"00000000", + 4350 => x"00000000", + 4351 => x"00000000", + 4352 => x"00000000", + 4353 => x"00000000", + 4354 => x"00000000", + 4355 => x"00000000", + 4356 => x"00000000", + 4357 => x"00000000", + 4358 => x"00000000", + 4359 => x"00000000", + 4360 => x"00000000", + 4361 => x"00000000", + 4362 => x"00000000", + 4363 => x"00000000", + 4364 => x"00000000", + 4365 => x"00000000", + 4366 => x"00000000", + 4367 => x"00000000", + 4368 => x"00000000", + 4369 => x"00000000", + 4370 => x"00003c4c", + 4371 => x"ffffffff", + 4372 => x"00000000", + 4373 => x"ffffffff", + 4374 => x"00000000", + 4375 => x"00000000", + +others => x"00000000" +); +begin + busy_o <= re_i; -- we're done on the cycle after we serve the read request + + do_ram: + process (clk_i) + variable iaddr : integer; + begin + if rising_edge(clk_i) then + if we_i='1' then + ram(to_integer(addr_i)) <= write_i; + end if; + addr_r <= addr_i; + end if; + end process do_ram; + read_o <= ram(to_integer(addr_r)); +end architecture Xilinx; -- Entity: SinglePortRAM + diff --git a/zpu/hdl/zealot/roms/dmips_dbram.vhdl b/zpu/hdl/zealot/roms/dmips_dbram.vhdl new file mode 100644 index 0000000..32b6947 --- /dev/null +++ b/zpu/hdl/zealot/roms/dmips_dbram.vhdl @@ -0,0 +1,4485 @@ +------------------------------------------------------------------------------ +---- ---- +---- Dual Port RAM that maps to a Xilinx BRAM ---- +---- ---- +---- http://www.opencores.org/ ---- +---- ---- +---- Description: ---- +---- This is a program+data memory for the ZPU. It maps to a Xilinx BRAM ---- +---- ---- +---- To Do: ---- +---- - ---- +---- ---- +---- Author: ---- +---- - Øyvind Harboe, oyvind.harboe zylin.com ---- +---- - Salvador E. Tropea, salvador inti.gob.ar ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Copyright (c) 2008 Øyvind Harboe <oyvind.harboe zylin.com> ---- +---- Copyright (c) 2008 Salvador E. Tropea <salvador inti.gob.ar> ---- +---- Copyright (c) 2008 Instituto Nacional de Tecnología Industrial ---- +---- ---- +---- Distributed under the BSD license ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Design unit: DualPortRAM(Xilinx) (Entity and architecture) ---- +---- File name: rom.in.vhdl (template used) ---- +---- Note: None ---- +---- Limitations: None known ---- +---- Errors: None known ---- +---- Library: work ---- +---- Dependencies: IEEE.std_logic_1164 ---- +---- IEEE.numeric_std ---- +---- Target FPGA: Spartan 3 (XC3S1500-4-FG456) ---- +---- Language: VHDL ---- +---- Wishbone: No ---- +---- Synthesis tools: Xilinx Release 9.2.03i - xst J.39 ---- +---- Simulation tools: GHDL [Sokcho edition] (0.2x) ---- +---- Text editor: SETEdit 0.5.x ---- +---- ---- +------------------------------------------------------------------------------ + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity DualPortRAM is + generic( + WORD_SIZE : integer:=32; -- Word Size 16/32 + BYTE_BITS : integer:=2; -- Bits used to address bytes + BRAM_W : integer:=15); -- Address Width + port( + clk_i : in std_logic; + -- Port A + a_we_i : in std_logic; + a_addr_i : in unsigned(BRAM_W-1 downto BYTE_BITS); + a_write_i : in unsigned(WORD_SIZE-1 downto 0); + a_read_o : out unsigned(WORD_SIZE-1 downto 0); + -- Port B + b_we_i : in std_logic; + b_addr_i : in unsigned(BRAM_W-1 downto BYTE_BITS); + b_write_i : in unsigned(WORD_SIZE-1 downto 0); + b_read_o : out unsigned(WORD_SIZE-1 downto 0)); +end entity DualPortRAM; + +architecture Xilinx of DualPortRAM is + type ram_type is array(natural range 0 to ((2**BRAM_W)/4)-1) of unsigned(WORD_SIZE-1 downto 0); + + shared variable ram : ram_type:= +( + 0 => x"0b0b0b0b", + 1 => x"82700b0b", + 2 => x"80f8ec0c", + 3 => x"3a0b0b80", + 4 => x"e7ea0400", + 5 => x"00000000", + 6 => x"00000000", + 7 => x"00000000", + 8 => x"80088408", + 9 => x"88080b0b", + 10 => x"80e8b72d", + 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"0b0b80f8", + 162 => x"d8738306", + 163 => x"10100508", + 164 => x"060b0b0b", + 165 => x"88aa0400", + 166 => x"00000000", + 167 => x"00000000", + 168 => x"80088408", + 169 => x"88087575", + 170 => x"0b0b80ce", + 171 => x"b62d5050", + 172 => x"80085688", + 173 => x"0c840c80", + 174 => x"0c510400", + 175 => x"00000000", + 176 => x"80088408", + 177 => x"88087575", + 178 => x"0b0b80cf", + 179 => x"e82d5050", + 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"80f8e80c", + 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"83803f80", + 257 => x"e2953f04", + 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"0b8188e0", + 282 => x"08527108", + 283 => x"70882a81", + 284 => x"32708106", + 285 => x"51515170", + 286 => x"f1387372", + 287 => x"0c833d0d", + 288 => x"0480f8e8", + 289 => x"08802ea4", + 290 => x"3880f8ec", + 291 => x"08822ebd", + 292 => x"38838080", + 293 => x"0b0b0b81", + 294 => x"88e00c82", + 295 => x"a0800b81", + 296 => x"88e40c82", + 297 => x"90800b81", + 298 => x"88e80c04", + 299 => x"f8808080", + 300 => x"a40b0b0b", + 301 => x"8188e00c", + 302 => x"f8808082", + 303 => x"800b8188", + 304 => x"e40cf880", + 305 => x"8084800b", + 306 => x"8188e80c", + 307 => x"0480c0a8", + 308 => x"808c0b0b", + 309 => x"0b8188e0", + 310 => x"0c80c0a8", + 311 => x"80940b81", + 312 => x"88e40c0b", + 313 => x"0b80eac8", + 314 => x"0b8188e8", + 315 => x"0c04f23d", + 316 => x"0d608188", + 317 => x"e408565d", + 318 => x"82750c80", + 319 => x"59805a80", + 320 => x"0b8f3d5d", + 321 => x"5b7a1010", + 322 => x"15700871", + 323 => x"08719f2c", + 324 => x"7e852b58", + 325 => x"55557d53", + 326 => x"59579d94", + 327 => x"3f7d7f7a", + 328 => x"72077c72", + 329 => x"07717160", + 330 => x"8105415f", + 331 => x"5d5b5957", + 332 => x"55817b27", + 333 => x"8f38767d", + 334 => x"0c77841e", + 335 => x"0c7c800c", + 336 => x"903d0d04", + 337 => x"8188e408", + 338 => x"55ffba39", + 339 => x"ff3d0d81", + 340 => x"88ec3351", + 341 => x"70a73880", + 342 => x"f8f40870", + 343 => x"08525270", + 344 => x"802e9438", + 345 => x"841280f8", + 346 => x"f40c702d", + 347 => x"80f8f408", + 348 => x"70085252", + 349 => x"70ee3881", + 350 => x"0b8188ec", + 351 => x"34833d0d", + 352 => x"0404803d", + 353 => x"0d0b0b81", + 354 => x"88dc0880", + 355 => x"2e8e380b", + 356 => x"0b0b0b80", + 357 => x"0b802e09", + 358 => x"81068538", + 359 => x"823d0d04", + 360 => x"0b0b8188", + 361 => x"dc510b0b", + 362 => x"0bf4d53f", + 363 => x"823d0d04", + 364 => x"04ff3d0d", + 365 => x"028f0533", + 366 => x"52718a2e", + 367 => x"8a387151", + 368 => x"fd9e3f83", + 369 => x"3d0d048d", + 370 => x"51fd953f", + 371 => x"7151fd90", + 372 => x"3f833d0d", + 373 => x"04ce3d0d", + 374 => x"b53d7070", + 375 => x"84055208", + 376 => x"8bb15c56", + 377 => x"a53d5e5c", + 378 => x"80757081", + 379 => x"05573376", + 380 => x"5b555873", + 381 => x"782e80c1", + 382 => x"388e3d5b", + 383 => x"73a52e09", + 384 => x"810680c5", + 385 => x"38787081", + 386 => x"055a3354", + 387 => x"7380e42e", + 388 => x"81b63873", + 389 => x"80e42480", + 390 => x"c6387380", + 391 => x"e32ea138", + 392 => x"8052a551", + 393 => x"792d8052", + 394 => x"7351792d", + 395 => x"82185878", + 396 => x"7081055a", + 397 => x"335473c4", + 398 => x"3877800c", + 399 => x"b43d0d04", + 400 => x"7b841d83", + 401 => x"1233565d", + 402 => x"57805273", + 403 => x"51792d81", + 404 => x"18797081", + 405 => x"055b3355", + 406 => x"5873ffa0", + 407 => x"38db3973", + 408 => x"80f32e09", + 409 => x"8106ffb8", + 410 => x"387b841d", + 411 => x"7108595d", + 412 => x"56807733", + 413 => x"55567376", + 414 => x"2e8d3881", + 415 => x"16701870", + 416 => x"33575556", + 417 => x"74f538ff", + 418 => x"16558076", + 419 => x"25ffa038", + 420 => x"76708105", + 421 => x"58335480", + 422 => x"52735179", + 423 => x"2d811875", + 424 => x"ff175757", + 425 => x"58807625", + 426 => x"ff853876", + 427 => x"70810558", + 428 => x"33548052", + 429 => x"7351792d", + 430 => x"811875ff", + 431 => x"17575758", + 432 => x"758024cc", + 433 => x"38fee839", + 434 => x"7b841d71", + 435 => x"0870719f", + 436 => x"2c595359", + 437 => x"5d568075", + 438 => x"24819338", + 439 => x"757d7c58", + 440 => x"56548057", + 441 => x"73772e09", + 442 => x"8106b638", + 443 => x"b07b3402", + 444 => x"b505567a", + 445 => x"762e9738", + 446 => x"ff165675", + 447 => x"33757081", + 448 => x"05573481", + 449 => x"17577a76", + 450 => x"2e098106", + 451 => x"eb388075", + 452 => x"34767dff", + 453 => x"12575856", + 454 => x"758024fe", + 455 => x"f338fe8f", + 456 => x"398a5273", + 457 => x"5180c1c0", + 458 => x"3f800880", + 459 => x"eacc0533", + 460 => x"76708105", + 461 => x"58348a52", + 462 => x"7351bffa", + 463 => x"3f800854", + 464 => x"8008802e", + 465 => x"ffad388a", + 466 => x"52735180", + 467 => x"c19a3f80", + 468 => x"0880eacc", + 469 => x"05337670", + 470 => x"81055834", + 471 => x"8a527351", + 472 => x"bfd43f80", + 473 => x"08548008", + 474 => x"ffb738ff", + 475 => x"86397452", + 476 => x"7653b43d", + 477 => x"ffb80551", + 478 => x"978a3fa3", + 479 => x"3d0856fe", + 480 => x"db39803d", + 481 => x"0d80c10b", + 482 => x"81d7b834", + 483 => x"800b81d9", + 484 => x"940c7080", + 485 => x"0c823d0d", + 486 => x"04ff3d0d", + 487 => x"800b81d7", + 488 => x"b8335252", + 489 => x"7080c12e", + 490 => x"99387181", + 491 => x"d9940807", + 492 => x"81d9940c", + 493 => x"80c20b81", + 494 => x"d7bc3470", + 495 => x"800c833d", + 496 => x"0d04810b", + 497 => x"81d99408", + 498 => x"0781d994", + 499 => x"0c80c20b", + 500 => x"81d7bc34", + 501 => x"70800c83", + 502 => x"3d0d04fd", + 503 => x"3d0d7570", + 504 => x"088a0553", + 505 => x"5381d7b8", + 506 => x"33517080", + 507 => x"c12e8b38", + 508 => x"73f33870", + 509 => x"800c853d", + 510 => x"0d04ff12", + 511 => x"7081d7b4", + 512 => x"0831740c", + 513 => x"800c853d", + 514 => x"0d04fc3d", + 515 => x"0d81d7c0", + 516 => x"08557480", + 517 => x"2e8c3876", + 518 => x"7508710c", + 519 => x"81d7c008", + 520 => x"56548c15", + 521 => x"5381d7b4", + 522 => x"08528a51", + 523 => x"8fe73f73", + 524 => x"800c863d", + 525 => x"0d04fb3d", + 526 => x"0d777008", + 527 => x"5656b053", + 528 => x"81d7c008", + 529 => x"52745180", + 530 => x"cdff3f85", + 531 => x"0b8c170c", + 532 => x"850b8c16", + 533 => x"0c750875", + 534 => x"0c81d7c0", + 535 => x"08547380", + 536 => x"2e8a3873", + 537 => x"08750c81", + 538 => x"d7c00854", + 539 => x"8c145381", + 540 => x"d7b40852", + 541 => x"8a518f9d", + 542 => x"3f841508", + 543 => x"ad38860b", + 544 => x"8c160c88", + 545 => x"15528816", + 546 => x"08518ea9", + 547 => x"3f81d7c0", + 548 => x"08700876", + 549 => x"0c548c15", + 550 => x"7054548a", + 551 => x"52730851", + 552 => x"8ef33f73", + 553 => x"800c873d", + 554 => x"0d047508", + 555 => x"54b05373", + 556 => x"52755180", + 557 => x"cd933f73", + 558 => x"800c873d", + 559 => x"0d04d93d", + 560 => x"0d80f980", + 561 => x"0b8188e8", + 562 => x"0cb05180", + 563 => x"c0e43f80", + 564 => x"0881d7b0", + 565 => x"0cb05180", + 566 => x"c0d83f80", + 567 => x"0881d7c0", + 568 => x"0c81d7b0", + 569 => x"0880080c", + 570 => x"800b8008", + 571 => x"84050c82", + 572 => x"0b800888", + 573 => x"050ca80b", + 574 => x"80088c05", + 575 => x"0c9f5380", + 576 => x"ead85280", + 577 => x"08900551", + 578 => x"80ccbe3f", + 579 => x"a13d5e9f", + 580 => x"5380eaf8", + 581 => x"527d5180", + 582 => x"ccaf3f8a", + 583 => x"0b8195f4", + 584 => x"0c80f59c", + 585 => x"51f9ae3f", + 586 => x"80eb9851", + 587 => x"f9a73f80", + 588 => x"f59c51f9", + 589 => x"a03f80f8", + 590 => x"fc08802e", + 591 => x"89d73880", + 592 => x"ebc851f9", + 593 => x"903f80f5", + 594 => x"9c51f989", + 595 => x"3f80f8f8", + 596 => x"085280eb", + 597 => x"f451f8fd", + 598 => x"3f818990", + 599 => x"5180d5da", + 600 => x"3f810b9a", + 601 => x"3d5e5b80", + 602 => x"0b80f8f8", + 603 => x"082582d6", + 604 => x"38903d5f", + 605 => x"80c10b81", + 606 => x"d7b83481", + 607 => x"0b81d994", + 608 => x"0c80c20b", + 609 => x"81d7bc34", + 610 => x"8240835a", + 611 => x"9f5380ec", + 612 => x"a4527c51", + 613 => x"80cbb23f", + 614 => x"8141807d", + 615 => x"537e5256", + 616 => x"8e973f80", + 617 => x"08762e09", + 618 => x"81068338", + 619 => x"81567581", + 620 => x"d9940c7f", + 621 => x"70585675", + 622 => x"8325a238", + 623 => x"75101016", + 624 => x"fd0542a9", + 625 => x"3dffa405", + 626 => x"53835276", + 627 => x"518cc63f", + 628 => x"7f810570", + 629 => x"41705856", + 630 => x"837624e0", + 631 => x"38615475", + 632 => x"53818998", + 633 => x"5281d7cc", + 634 => x"518cba3f", + 635 => x"81d7c008", + 636 => x"70085858", + 637 => x"b0537752", + 638 => x"765180ca", + 639 => x"cc3f850b", + 640 => x"8c190c85", + 641 => x"0b8c180c", + 642 => x"7708770c", + 643 => x"81d7c008", + 644 => x"5675802e", + 645 => x"8a387508", + 646 => x"770c81d7", + 647 => x"c008568c", + 648 => x"165381d7", + 649 => x"b408528a", + 650 => x"518bea3f", + 651 => x"84170887", + 652 => x"eb38860b", + 653 => x"8c180c88", + 654 => x"17528818", + 655 => x"08518af5", + 656 => x"3f81d7c0", + 657 => x"08700878", + 658 => x"0c568c17", + 659 => x"7054598a", + 660 => x"52780851", + 661 => x"8bbf3f80", + 662 => x"c10b81d7", + 663 => x"bc335757", + 664 => x"767626a2", + 665 => x"3880c352", + 666 => x"76518ca3", + 667 => x"3f800861", + 668 => x"2e89e638", + 669 => x"81177081", + 670 => x"ff0681d7", + 671 => x"bc335858", + 672 => x"58757727", + 673 => x"e0387960", + 674 => x"29627054", + 675 => x"71535b59", + 676 => x"b9a43f80", + 677 => x"0840787a", + 678 => x"31708729", + 679 => x"80083180", + 680 => x"088a0581", + 681 => x"d7b83381", + 682 => x"d7b4085e", + 683 => x"5b525a56", + 684 => x"7780c12e", + 685 => x"89d0387b", + 686 => x"f738811b", + 687 => x"5b80f8f8", + 688 => x"087b25fd", + 689 => x"af3881d7", + 690 => x"a85180d2", + 691 => x"ed3f80ec", + 692 => x"c451f681", + 693 => x"3f80f59c", + 694 => x"51f5fa3f", + 695 => x"80ecd451", + 696 => x"f5f33f80", + 697 => x"f59c51f5", + 698 => x"ec3f81d7", + 699 => x"b4085280", + 700 => x"ed8c51f5", + 701 => x"e03f8552", + 702 => x"80eda851", + 703 => x"f5d73f81", + 704 => x"d9940852", + 705 => x"80edc451", + 706 => x"f5cb3f81", + 707 => x"5280eda8", + 708 => x"51f5c23f", + 709 => x"81d7b833", + 710 => x"5280ede0", + 711 => x"51f5b63f", + 712 => x"80c15280", + 713 => x"edfc51f5", + 714 => x"ac3f81d7", + 715 => x"bc335280", + 716 => x"ee9851f5", + 717 => x"a03f80c2", + 718 => x"5280edfc", + 719 => x"51f5963f", + 720 => x"81d7ec08", + 721 => x"5280eeb4", + 722 => x"51f58a3f", + 723 => x"875280ed", + 724 => x"a851f581", + 725 => x"3f8195f4", + 726 => x"085280ee", + 727 => x"d051f4f5", + 728 => x"3f80eeec", + 729 => x"51f4ee3f", + 730 => x"80ef9851", + 731 => x"f4e73f81", + 732 => x"d7c00870", + 733 => x"08535a80", + 734 => x"efa451f4", + 735 => x"d83f80ef", + 736 => x"c051f4d1", + 737 => x"3f81d7c0", + 738 => x"08841108", + 739 => x"535680ef", + 740 => x"f451f4c1", + 741 => x"3f805280", + 742 => x"eda851f4", + 743 => x"b83f81d7", + 744 => x"c0088811", + 745 => x"08535880", + 746 => x"f09051f4", + 747 => x"a83f8252", + 748 => x"80eda851", + 749 => x"f49f3f81", + 750 => x"d7c0088c", + 751 => x"11085357", + 752 => x"80f0ac51", + 753 => x"f48f3f91", + 754 => x"5280eda8", + 755 => x"51f4863f", + 756 => x"81d7c008", + 757 => x"90055280", + 758 => x"f0c851f3", + 759 => x"f83f80f0", + 760 => x"e451f3f1", + 761 => x"3f80f19c", + 762 => x"51f3ea3f", + 763 => x"81d7b008", + 764 => x"7008535f", + 765 => x"80efa451", + 766 => x"f3db3f80", + 767 => x"f1b051f3", + 768 => x"d43f81d7", + 769 => x"b0088411", + 770 => x"08535b80", + 771 => x"eff451f3", + 772 => x"c43f8052", + 773 => x"80eda851", + 774 => x"f3bb3f81", + 775 => x"d7b00888", + 776 => x"1108535c", + 777 => x"80f09051", + 778 => x"f3ab3f81", + 779 => x"5280eda8", + 780 => x"51f3a23f", + 781 => x"81d7b008", + 782 => x"8c110853", + 783 => x"5a80f0ac", + 784 => x"51f3923f", + 785 => x"925280ed", + 786 => x"a851f389", + 787 => x"3f81d7b0", + 788 => x"08900552", + 789 => x"80f0c851", + 790 => x"f2fb3f80", + 791 => x"f0e451f2", + 792 => x"f43f7f52", + 793 => x"80f1f051", + 794 => x"f2eb3f85", + 795 => x"5280eda8", + 796 => x"51f2e23f", + 797 => x"785280f2", + 798 => x"8c51f2d9", + 799 => x"3f8d5280", + 800 => x"eda851f2", + 801 => x"d03f6152", + 802 => x"80f2a851", + 803 => x"f2c73f87", + 804 => x"5280eda8", + 805 => x"51f2be3f", + 806 => x"605280f2", + 807 => x"c451f2b5", + 808 => x"3f815280", + 809 => x"eda851f2", + 810 => x"ac3f7d52", + 811 => x"80f2e051", + 812 => x"f2a33f80", + 813 => x"f2fc51f2", + 814 => x"9c3f7c52", + 815 => x"80f3b451", + 816 => x"f2933f80", + 817 => x"f3d051f2", + 818 => x"8c3f80f5", + 819 => x"9c51f285", + 820 => x"3f81d7a8", + 821 => x"0881d7ac", + 822 => x"08818990", + 823 => x"08818994", + 824 => x"08727131", + 825 => x"70742675", + 826 => x"74317072", + 827 => x"31818988", + 828 => x"0c444481", + 829 => x"898c0c81", + 830 => x"898c0856", + 831 => x"80f48855", + 832 => x"5c595758", + 833 => x"f1cf3f81", + 834 => x"89880856", + 835 => x"80762582", + 836 => x"a43880f8", + 837 => x"f8087071", + 838 => x"9f2c9a3d", + 839 => x"53565681", + 840 => x"89880881", + 841 => x"898c0841", + 842 => x"537f5470", + 843 => x"525a8ef6", + 844 => x"3f66685f", + 845 => x"8188f80c", + 846 => x"7d8188fc", + 847 => x"0c80f8f8", + 848 => x"08709f2c", + 849 => x"58568058", + 850 => x"bd84c078", + 851 => x"55557652", + 852 => x"75537951", + 853 => x"87d23f95", + 854 => x"3d818988", + 855 => x"0881898c", + 856 => x"0841557f", + 857 => x"56676940", + 858 => x"537e5470", + 859 => x"525c8eb6", + 860 => x"3f64665e", + 861 => x"8189800c", + 862 => x"7c818984", + 863 => x"0c80f8f8", + 864 => x"08709f2c", + 865 => x"40588057", + 866 => x"83dceb94", + 867 => x"80775555", + 868 => x"7e527753", + 869 => x"7b518790", + 870 => x"3f64665d", + 871 => x"5b805e8d", + 872 => x"dd7e5555", + 873 => x"81898808", + 874 => x"81898c08", + 875 => x"59527753", + 876 => x"795186f4", + 877 => x"3f666840", + 878 => x"547e557a", + 879 => x"527b53a9", + 880 => x"3dffa805", + 881 => x"518ddf3f", + 882 => x"62645e81", + 883 => x"d7c40c7c", + 884 => x"81d7c80c", + 885 => x"80f49851", + 886 => x"effb3f81", + 887 => x"88fc0852", + 888 => x"80f4c851", + 889 => x"efef3f80", + 890 => x"f4d051ef", + 891 => x"e83f8189", + 892 => x"84085280", + 893 => x"f4c851ef", + 894 => x"dc3f81d7", + 895 => x"c8085280", + 896 => x"f58051ef", + 897 => x"d03f80f5", + 898 => x"9c51efc9", + 899 => x"3f800b80", + 900 => x"0ca93d0d", + 901 => x"0480f5a0", + 902 => x"51f6a839", + 903 => x"770857b0", + 904 => x"53765277", + 905 => x"5180c2a1", + 906 => x"3f80c10b", + 907 => x"81d7bc33", + 908 => x"5757f8ac", + 909 => x"39758a38", + 910 => x"81898c08", + 911 => x"8126fdd2", + 912 => x"3880f5d0", + 913 => x"51ef8e3f", + 914 => x"80f68851", + 915 => x"ef873f80", + 916 => x"f59c51ef", + 917 => x"803f80f8", + 918 => x"f8087071", + 919 => x"9f2c9a3d", + 920 => x"53565681", + 921 => x"89880881", + 922 => x"898c0841", + 923 => x"537f5470", + 924 => x"525a8cb2", + 925 => x"3f66685f", + 926 => x"8188f80c", + 927 => x"7d8188fc", + 928 => x"0c80f8f8", + 929 => x"08709f2c", + 930 => x"58568058", + 931 => x"bd84c078", + 932 => x"55557652", + 933 => x"75537951", + 934 => x"858e3f95", + 935 => x"3d818988", + 936 => x"0881898c", + 937 => x"0841557f", + 938 => x"56676940", + 939 => x"537e5470", + 940 => x"525c8bf2", + 941 => x"3f64665e", + 942 => x"8189800c", + 943 => x"7c818984", + 944 => x"0c80f8f8", + 945 => x"08709f2c", + 946 => x"40588057", + 947 => x"83dceb94", + 948 => x"80775555", + 949 => x"7e527753", + 950 => x"7b5184cc", + 951 => x"3f64665d", + 952 => x"5b805e8d", + 953 => x"dd7e5555", + 954 => x"81898808", + 955 => x"81898c08", + 956 => x"59527753", + 957 => x"795184b0", + 958 => x"3f666840", + 959 => x"547e557a", + 960 => x"527b53a9", + 961 => x"3dffa805", + 962 => x"518b9b3f", + 963 => x"62645e81", + 964 => x"d7c40c7c", + 965 => x"81d7c80c", + 966 => x"80f49851", + 967 => x"edb73f81", + 968 => x"88fc0852", + 969 => x"80f4c851", + 970 => x"edab3f80", + 971 => x"f4d051ed", + 972 => x"a43f8189", + 973 => x"84085280", + 974 => x"f4c851ed", + 975 => x"983f81d7", + 976 => x"c8085280", + 977 => x"f58051ed", + 978 => x"8c3f80f5", + 979 => x"9c51ed85", + 980 => x"3f800b80", + 981 => x"0ca93d0d", + 982 => x"04a93dff", + 983 => x"a0055280", + 984 => x"5180d23f", + 985 => x"9f5380f6", + 986 => x"a8527c51", + 987 => x"bfdb3f7a", + 988 => x"7b81d7b4", + 989 => x"0c811870", + 990 => x"81ff0681", + 991 => x"d7bc3359", + 992 => x"59595af5", + 993 => x"fc39ff16", + 994 => x"707b3160", + 995 => x"0c5c800b", + 996 => x"811c5c5c", + 997 => x"80f8f808", + 998 => x"7b25f3d8", + 999 => x"38f6a739", + 1000 => x"ff3d0d73", + 1001 => x"82327030", + 1002 => x"70720780", + 1003 => x"25800c52", + 1004 => x"52833d0d", + 1005 => x"04fe3d0d", + 1006 => x"74767153", + 1007 => x"54527182", + 1008 => x"2e833883", + 1009 => x"5171812e", + 1010 => x"9a388172", + 1011 => x"269f3871", + 1012 => x"822eb838", + 1013 => x"71842ea9", + 1014 => x"3870730c", + 1015 => x"70800c84", + 1016 => x"3d0d0480", + 1017 => x"e40b81d7", + 1018 => x"b408258b", + 1019 => x"3880730c", + 1020 => x"70800c84", + 1021 => x"3d0d0483", + 1022 => x"730c7080", + 1023 => x"0c843d0d", + 1024 => x"0482730c", + 1025 => x"70800c84", + 1026 => x"3d0d0481", + 1027 => x"730c7080", + 1028 => x"0c843d0d", + 1029 => x"04803d0d", + 1030 => x"74741482", + 1031 => x"05710c80", + 1032 => x"0c823d0d", + 1033 => x"04f73d0d", + 1034 => x"7b7d7f61", + 1035 => x"85127082", + 1036 => x"2b751170", + 1037 => x"74717084", + 1038 => x"05530c5a", + 1039 => x"5a5d5b76", + 1040 => x"0c7980f8", + 1041 => x"180c7986", + 1042 => x"12525758", + 1043 => x"5a5a7676", + 1044 => x"24993876", + 1045 => x"b329822b", + 1046 => x"79115153", + 1047 => x"76737084", + 1048 => x"05550c81", + 1049 => x"14547574", + 1050 => x"25f23876", + 1051 => x"81cc2919", + 1052 => x"fc110881", + 1053 => x"05fc120c", + 1054 => x"7a197008", + 1055 => x"9fa0130c", + 1056 => x"5856850b", + 1057 => x"81d7b40c", + 1058 => x"75800c8b", + 1059 => x"3d0d04fe", + 1060 => x"3d0d0293", + 1061 => x"05335180", + 1062 => x"02840597", + 1063 => x"05335452", + 1064 => x"70732e88", + 1065 => x"3871800c", + 1066 => x"843d0d04", + 1067 => x"7081d7b8", + 1068 => x"34810b80", + 1069 => x"0c843d0d", + 1070 => x"04f83d0d", + 1071 => x"7a7c5956", + 1072 => x"820b8319", + 1073 => x"55557416", + 1074 => x"70337533", + 1075 => x"5b515372", + 1076 => x"792e80c6", + 1077 => x"3880c10b", + 1078 => x"81168116", + 1079 => x"56565782", + 1080 => x"7525e338", + 1081 => x"ffa91770", + 1082 => x"81ff0655", + 1083 => x"59738226", + 1084 => x"83388755", + 1085 => x"81537680", + 1086 => x"d22e9838", + 1087 => x"77527551", + 1088 => x"be963f80", + 1089 => x"53728008", + 1090 => x"25893887", + 1091 => x"1581d7b4", + 1092 => x"0c815372", + 1093 => x"800c8a3d", + 1094 => x"0d047281", + 1095 => x"d7b83482", + 1096 => x"7525ffa2", + 1097 => x"38ffbd39", + 1098 => x"8c08028c", + 1099 => x"0ceb3d0d", + 1100 => x"800b8c08", + 1101 => x"f0050c80", + 1102 => x"0b8c08f4", + 1103 => x"050c8c08", + 1104 => x"8c05088c", + 1105 => x"08900508", + 1106 => x"5654738c", + 1107 => x"08f0050c", + 1108 => x"748c08f4", + 1109 => x"050c8c08", + 1110 => x"f8058c08", + 1111 => x"f0055656", + 1112 => x"88705475", + 1113 => x"53765254", + 1114 => x"bbdf3f80", + 1115 => x"0b8c08e8", + 1116 => x"050c800b", + 1117 => x"8c08ec05", + 1118 => x"0c8c0894", + 1119 => x"05088c08", + 1120 => x"98050856", + 1121 => x"54738c08", + 1122 => x"e8050c74", + 1123 => x"8c08ec05", + 1124 => x"0c8c08f0", + 1125 => x"058c08e8", + 1126 => x"05565688", + 1127 => x"70547553", + 1128 => x"765254bb", + 1129 => x"a43f800b", + 1130 => x"8c08e805", + 1131 => x"0c800b8c", + 1132 => x"08ec050c", + 1133 => x"8c08fc05", + 1134 => x"0883ffff", + 1135 => x"068c08cc", + 1136 => x"050c8c08", + 1137 => x"fc050890", + 1138 => x"2a8c08c4", + 1139 => x"050c8c08", + 1140 => x"f4050883", + 1141 => x"ffff068c", + 1142 => x"08c8050c", + 1143 => x"8c08f405", + 1144 => x"08902a8c", + 1145 => x"08c0050c", + 1146 => x"8c08cc05", + 1147 => x"088c08c8", + 1148 => x"05082970", + 1149 => x"8c08dc05", + 1150 => x"0c8c08cc", + 1151 => x"05088c08", + 1152 => x"c0050829", + 1153 => x"708c08d8", + 1154 => x"050c8c08", + 1155 => x"c405088c", + 1156 => x"08c80508", + 1157 => x"29708c08", + 1158 => x"d4050c8c", + 1159 => x"08c40508", + 1160 => x"8c08c005", + 1161 => x"0829708c", + 1162 => x"08d0050c", + 1163 => x"8c08dc05", + 1164 => x"08902a8c", + 1165 => x"08d80508", + 1166 => x"118c08d8", + 1167 => x"050c8c08", + 1168 => x"d805088c", + 1169 => x"08d40508", + 1170 => x"058c08d8", + 1171 => x"050c5151", + 1172 => x"5151548c", + 1173 => x"08d80508", + 1174 => x"8c08d405", + 1175 => x"08278f38", + 1176 => x"8c08d005", + 1177 => x"08848080", + 1178 => x"058c08d0", + 1179 => x"050c8c08", + 1180 => x"d8050890", + 1181 => x"2a8c08d0", + 1182 => x"0508118c", + 1183 => x"08e0050c", + 1184 => x"8c08d805", + 1185 => x"0883ffff", + 1186 => x"0670902b", + 1187 => x"8c08dc05", + 1188 => x"0883ffff", + 1189 => x"0670128c", + 1190 => x"08e4050c", + 1191 => x"52575154", + 1192 => x"8c08e005", + 1193 => x"088c08e4", + 1194 => x"05085654", + 1195 => x"738c08e8", + 1196 => x"050c748c", + 1197 => x"08ec050c", + 1198 => x"8c08fc05", + 1199 => x"088c08f0", + 1200 => x"0508298c", + 1201 => x"08f80508", + 1202 => x"8c08f405", + 1203 => x"08297012", + 1204 => x"8c08e805", + 1205 => x"08118c08", + 1206 => x"e8050c51", + 1207 => x"55558c08", + 1208 => x"e805088c", + 1209 => x"08ec0508", + 1210 => x"8c088805", + 1211 => x"08585654", + 1212 => x"73760c74", + 1213 => x"84170c8c", + 1214 => x"08880508", + 1215 => x"800c973d", + 1216 => x"0d8c0c04", + 1217 => x"8c08028c", + 1218 => x"0cf63d0d", + 1219 => x"800b8c08", + 1220 => x"f0050c80", + 1221 => x"0b8c08f4", + 1222 => x"050c8c08", + 1223 => x"8c05088c", + 1224 => x"08900508", + 1225 => x"5654738c", + 1226 => x"08f0050c", + 1227 => x"748c08f4", + 1228 => x"050c8c08", + 1229 => x"f8058c08", + 1230 => x"f0055656", + 1231 => x"88705475", + 1232 => x"53765254", + 1233 => x"b8833f80", + 1234 => x"0b8c08f0", + 1235 => x"050c800b", + 1236 => x"8c08f405", + 1237 => x"0c8c08f8", + 1238 => x"0508308c", + 1239 => x"08ec050c", + 1240 => x"8c08fc05", + 1241 => x"08802e8d", + 1242 => x"388c08ec", + 1243 => x"0508ff05", + 1244 => x"8c08ec05", + 1245 => x"0c8c08ec", + 1246 => x"05088c08", + 1247 => x"f0050c8c", + 1248 => x"08fc0508", + 1249 => x"308c08f4", + 1250 => x"050c8c08", + 1251 => x"f005088c", + 1252 => x"08f40508", + 1253 => x"8c088805", + 1254 => x"08585654", + 1255 => x"73760c74", + 1256 => x"84170c8c", + 1257 => x"08880508", + 1258 => x"800c8c3d", + 1259 => x"0d8c0c04", + 1260 => x"8c08028c", + 1261 => x"0cf53d0d", + 1262 => x"8c089405", + 1263 => x"089d388c", + 1264 => x"088c0508", + 1265 => x"8c089005", + 1266 => x"088c0888", + 1267 => x"05085856", + 1268 => x"5473760c", + 1269 => x"7484170c", + 1270 => x"81bf3980", + 1271 => x"0b8c08f0", + 1272 => x"050c800b", + 1273 => x"8c08f405", + 1274 => x"0c8c088c", + 1275 => x"05088c08", + 1276 => x"90050856", + 1277 => x"54738c08", + 1278 => x"f0050c74", + 1279 => x"8c08f405", + 1280 => x"0c8c08f8", + 1281 => x"058c08f0", + 1282 => x"05565688", + 1283 => x"70547553", + 1284 => x"765254b6", + 1285 => x"b43fa00b", + 1286 => x"8c089405", + 1287 => x"08318c08", + 1288 => x"ec050c8c", + 1289 => x"08ec0508", + 1290 => x"80249d38", + 1291 => x"800b8c08", + 1292 => x"f4050c8c", + 1293 => x"08ec0508", + 1294 => x"308c08fc", + 1295 => x"0508712b", + 1296 => x"8c08f005", + 1297 => x"0c54b939", + 1298 => x"8c08fc05", + 1299 => x"088c08ec", + 1300 => x"05082a8c", + 1301 => x"08e8050c", + 1302 => x"8c08fc05", + 1303 => x"088c0894", + 1304 => x"05082b8c", + 1305 => x"08f4050c", + 1306 => x"8c08f805", + 1307 => x"088c0894", + 1308 => x"05082b70", + 1309 => x"8c08e805", + 1310 => x"08078c08", + 1311 => x"f0050c54", + 1312 => x"8c08f005", + 1313 => x"088c08f4", + 1314 => x"05088c08", + 1315 => x"88050858", + 1316 => x"56547376", + 1317 => x"0c748417", + 1318 => x"0c8c0888", + 1319 => x"0508800c", + 1320 => x"8d3d0d8c", + 1321 => x"0c048c08", + 1322 => x"028c0ccc", + 1323 => x"3d0d800b", + 1324 => x"8c08fc05", + 1325 => x"0c800b8c", + 1326 => x"08ec050c", + 1327 => x"800b8c08", + 1328 => x"f0050c8c", + 1329 => x"088c0508", + 1330 => x"8c089005", + 1331 => x"08565473", + 1332 => x"8c08ec05", + 1333 => x"0c748c08", + 1334 => x"f0050c8c", + 1335 => x"08f4058c", + 1336 => x"08ec0556", + 1337 => x"56887054", + 1338 => x"75537652", + 1339 => x"54b4da3f", + 1340 => x"800b8c08", + 1341 => x"e4050c80", + 1342 => x"0b8c08e8", + 1343 => x"050c8c08", + 1344 => x"9405088c", + 1345 => x"08980508", + 1346 => x"5654738c", + 1347 => x"08e4050c", + 1348 => x"748c08e8", + 1349 => x"050c8c08", + 1350 => x"ec058c08", + 1351 => x"e4055656", + 1352 => x"88705475", + 1353 => x"53765254", + 1354 => x"b49f3f8c", + 1355 => x"08f40508", + 1356 => x"8025be38", + 1357 => x"8c08fc05", + 1358 => x"08098c08", + 1359 => x"fc050c8c", + 1360 => x"08d40554", + 1361 => x"8c08f405", + 1362 => x"088c08f8", + 1363 => x"05085755", + 1364 => x"74527553", + 1365 => x"7351fbac", + 1366 => x"3f8c08d4", + 1367 => x"05088c08", + 1368 => x"d8050856", + 1369 => x"54738c08", + 1370 => x"f4050c74", + 1371 => x"8c08f805", + 1372 => x"0c8c08ec", + 1373 => x"05088025", + 1374 => x"be388c08", + 1375 => x"fc050809", + 1376 => x"8c08fc05", + 1377 => x"0c8c08d4", + 1378 => x"05548c08", + 1379 => x"ec05088c", + 1380 => x"08f00508", + 1381 => x"57557452", + 1382 => x"75537351", + 1383 => x"fae63f8c", + 1384 => x"08d40508", + 1385 => x"8c08d805", + 1386 => x"08565473", + 1387 => x"8c08ec05", + 1388 => x"0c748c08", + 1389 => x"f0050c8c", + 1390 => x"08f40508", + 1391 => x"8c08f805", + 1392 => x"08565473", + 1393 => x"8c08d405", + 1394 => x"0c748c08", + 1395 => x"d8050c8c", + 1396 => x"08ec0508", + 1397 => x"8c08f005", + 1398 => x"08565473", + 1399 => x"8c08cc05", + 1400 => x"0c748c08", + 1401 => x"d0050c80", + 1402 => x"0b8c08c8", + 1403 => x"050c800b", + 1404 => x"8c08e405", + 1405 => x"0c800b8c", + 1406 => x"08e8050c", + 1407 => x"8c08d405", + 1408 => x"088c08d8", + 1409 => x"05085654", + 1410 => x"738c08e4", + 1411 => x"050c748c", + 1412 => x"08e8050c", + 1413 => x"800b8c08", + 1414 => x"ffb8050c", + 1415 => x"800b8c08", + 1416 => x"ffbc050c", + 1417 => x"8c08cc05", + 1418 => x"088c08d0", + 1419 => x"05085654", + 1420 => x"738c08ff", + 1421 => x"b8050c74", + 1422 => x"8c08ffbc", + 1423 => x"050c8c08", + 1424 => x"ffbc0508", + 1425 => x"8c08ffac", + 1426 => x"050c8c08", + 1427 => x"ffb80508", + 1428 => x"8c08ffa8", + 1429 => x"050c8c08", + 1430 => x"e805088c", + 1431 => x"08ffa405", + 1432 => x"0c8c08e4", + 1433 => x"05088c08", + 1434 => x"ffa0050c", + 1435 => x"8c08ffa8", + 1436 => x"050891d4", + 1437 => x"388c08ff", + 1438 => x"a005088c", + 1439 => x"08ffac05", + 1440 => x"0827868c", + 1441 => x"388c08ff", + 1442 => x"ac05088c", + 1443 => x"08ff8805", + 1444 => x"0c8c08ff", + 1445 => x"88050883", + 1446 => x"ffff26a0", + 1447 => x"388c08ff", + 1448 => x"88050881", + 1449 => x"ff268b38", + 1450 => x"800b8c08", + 1451 => x"fed8050c", + 1452 => x"a939880b", + 1453 => x"8c08fed8", + 1454 => x"050c9f39", + 1455 => x"8c08ff88", + 1456 => x"0508fe80", + 1457 => x"0a268b38", + 1458 => x"900b8c08", + 1459 => x"fed8050c", + 1460 => x"8939980b", + 1461 => x"8c08fed8", + 1462 => x"050c8c08", + 1463 => x"fed80508", + 1464 => x"8c08ff84", + 1465 => x"050c8c08", + 1466 => x"ff880508", + 1467 => x"8c08ff84", + 1468 => x"05082a80", + 1469 => x"f6c81133", + 1470 => x"8c08ff84", + 1471 => x"050811a0", + 1472 => x"71318c08", + 1473 => x"ff8c050c", + 1474 => x"5151548c", + 1475 => x"08ff8c05", + 1476 => x"08802e80", + 1477 => x"d1388c08", + 1478 => x"ffac0508", + 1479 => x"8c08ff8c", + 1480 => x"05082b8c", + 1481 => x"08ffac05", + 1482 => x"0c8c08ff", + 1483 => x"a005088c", + 1484 => x"08ff8c05", + 1485 => x"082ba00b", + 1486 => x"8c08ff8c", + 1487 => x"0508318c", + 1488 => x"08ffa405", + 1489 => x"08712a70", + 1490 => x"73078c08", + 1491 => x"ffa0050c", + 1492 => x"8c08ffa4", + 1493 => x"05088c08", + 1494 => x"ff8c0508", + 1495 => x"2b8c08ff", + 1496 => x"a4050c51", + 1497 => x"56548c08", + 1498 => x"ffac0508", + 1499 => x"902a8c08", + 1500 => x"ff84050c", + 1501 => x"8c08ffac", + 1502 => x"050883ff", + 1503 => x"ff068c08", + 1504 => x"ff88050c", + 1505 => x"8c08ffa0", + 1506 => x"05088c08", + 1507 => x"ff840508", + 1508 => x"53705254", + 1509 => x"9efb3f80", + 1510 => x"08708c08", + 1511 => x"fef8050c", + 1512 => x"8c08ff84", + 1513 => x"0508538c", + 1514 => x"08ffa005", + 1515 => x"0852549e", + 1516 => x"bb3f8008", + 1517 => x"708c08ff", + 1518 => x"80050c8c", + 1519 => x"08ff8005", + 1520 => x"088c08ff", + 1521 => x"88050829", + 1522 => x"708c08fe", + 1523 => x"f0050c8c", + 1524 => x"08fef805", + 1525 => x"0870902b", + 1526 => x"8c08ffa4", + 1527 => x"0508902a", + 1528 => x"7072078c", + 1529 => x"08fef805", + 1530 => x"0c525851", + 1531 => x"51548c08", + 1532 => x"fef80508", + 1533 => x"8c08fef0", + 1534 => x"05082780", + 1535 => x"e1388c08", + 1536 => x"ff800508", + 1537 => x"ff058c08", + 1538 => x"ff80050c", + 1539 => x"8c08fef8", + 1540 => x"05088c08", + 1541 => x"ffac0508", + 1542 => x"058c08fe", + 1543 => x"f8050c8c", + 1544 => x"08ffac05", + 1545 => x"088c08fe", + 1546 => x"f8050826", + 1547 => x"b1388c08", + 1548 => x"fef80508", + 1549 => x"8c08fef0", + 1550 => x"050827a2", + 1551 => x"388c08ff", + 1552 => x"800508ff", + 1553 => x"058c08ff", + 1554 => x"80050c8c", + 1555 => x"08fef805", + 1556 => x"088c08ff", + 1557 => x"ac050805", + 1558 => x"8c08fef8", + 1559 => x"050c8c08", + 1560 => x"fef80508", + 1561 => x"8c08fef0", + 1562 => x"0508318c", + 1563 => x"08fef805", + 1564 => x"0c8c08fe", + 1565 => x"f805088c", + 1566 => x"08ff8405", + 1567 => x"08537052", + 1568 => x"549d8e3f", + 1569 => x"8008708c", + 1570 => x"08fef405", + 1571 => x"0c8c08ff", + 1572 => x"84050853", + 1573 => x"8c08fef8", + 1574 => x"05085254", + 1575 => x"9cce3f80", + 1576 => x"08708c08", + 1577 => x"fefc050c", + 1578 => x"8c08fefc", + 1579 => x"05088c08", + 1580 => x"ff880508", + 1581 => x"29708c08", + 1582 => x"fef0050c", + 1583 => x"8c08fef4", + 1584 => x"05087090", + 1585 => x"2b8c08ff", + 1586 => x"a4050883", + 1587 => x"ffff0670", + 1588 => x"72078c08", + 1589 => x"fef4050c", + 1590 => x"52585151", + 1591 => x"548c08fe", + 1592 => x"f405088c", + 1593 => x"08fef005", + 1594 => x"082780e1", + 1595 => x"388c08fe", + 1596 => x"fc0508ff", + 1597 => x"058c08fe", + 1598 => x"fc050c8c", + 1599 => x"08fef405", + 1600 => x"088c08ff", + 1601 => x"ac050805", + 1602 => x"8c08fef4", + 1603 => x"050c8c08", + 1604 => x"ffac0508", + 1605 => x"8c08fef4", + 1606 => x"050826b1", + 1607 => x"388c08fe", + 1608 => x"f405088c", + 1609 => x"08fef005", + 1610 => x"0827a238", + 1611 => x"8c08fefc", + 1612 => x"0508ff05", + 1613 => x"8c08fefc", + 1614 => x"050c8c08", + 1615 => x"fef40508", + 1616 => x"8c08ffac", + 1617 => x"0508058c", + 1618 => x"08fef405", + 1619 => x"0c8c08fe", + 1620 => x"f405088c", + 1621 => x"08fef005", + 1622 => x"08318c08", + 1623 => x"fef4050c", + 1624 => x"8c08ff80", + 1625 => x"05087090", + 1626 => x"2b708c08", + 1627 => x"fefc0508", + 1628 => x"078c08ff", + 1629 => x"98050c8c", + 1630 => x"08fef405", + 1631 => x"088c08ff", + 1632 => x"a4050c51", + 1633 => x"54800b8c", + 1634 => x"08ff9405", + 1635 => x"0c8af639", + 1636 => x"8c08ffac", + 1637 => x"05089738", + 1638 => x"8c08ffac", + 1639 => x"05085281", + 1640 => x"519ac93f", + 1641 => x"8008708c", + 1642 => x"08ffac05", + 1643 => x"0c548c08", + 1644 => x"ffac0508", + 1645 => x"8c08fef0", + 1646 => x"050c8c08", + 1647 => x"fef00508", + 1648 => x"83ffff26", + 1649 => x"a0388c08", + 1650 => x"fef00508", + 1651 => x"81ff268b", + 1652 => x"38800b8c", + 1653 => x"08fed405", + 1654 => x"0ca93988", + 1655 => x"0b8c08fe", + 1656 => x"d4050c9f", + 1657 => x"398c08fe", + 1658 => x"f00508fe", + 1659 => x"800a268b", + 1660 => x"38900b8c", + 1661 => x"08fed405", + 1662 => x"0c893998", + 1663 => x"0b8c08fe", + 1664 => x"d4050c8c", + 1665 => x"08fed405", + 1666 => x"088c08fe", + 1667 => x"f4050c8c", + 1668 => x"08fef005", + 1669 => x"088c08fe", + 1670 => x"f405082a", + 1671 => x"80f6c811", + 1672 => x"338c08fe", + 1673 => x"f4050811", + 1674 => x"a071318c", + 1675 => x"08ff8c05", + 1676 => x"0c515154", + 1677 => x"8c08ff8c", + 1678 => x"05089f38", + 1679 => x"8c08ffa0", + 1680 => x"05088c08", + 1681 => x"ffac0508", + 1682 => x"318c08ff", + 1683 => x"a0050c81", + 1684 => x"0b8c08ff", + 1685 => x"94050c85", + 1686 => x"8d39a00b", + 1687 => x"8c08ff8c", + 1688 => x"0508318c", + 1689 => x"08ff9005", + 1690 => x"0c8c08ff", + 1691 => x"ac05088c", + 1692 => x"08ff8c05", + 1693 => x"082b8c08", + 1694 => x"ffac050c", + 1695 => x"8c08ffa0", + 1696 => x"05088c08", + 1697 => x"ff900508", + 1698 => x"2a8c08ff", + 1699 => x"9c050c8c", + 1700 => x"08ffa005", + 1701 => x"088c08ff", + 1702 => x"8c05082b", + 1703 => x"8c08ffa4", + 1704 => x"05088c08", + 1705 => x"ff900508", + 1706 => x"2a707207", + 1707 => x"8c08ffa0", + 1708 => x"050c8c08", + 1709 => x"ffa40508", + 1710 => x"8c08ff8c", + 1711 => x"05082b8c", + 1712 => x"08ffa405", + 1713 => x"0c8c08ff", + 1714 => x"ac050890", + 1715 => x"2a8c08fe", + 1716 => x"f0050c8c", + 1717 => x"08ffac05", + 1718 => x"0883ffff", + 1719 => x"068c08fe", + 1720 => x"f4050c8c", + 1721 => x"08ff9c05", + 1722 => x"088c08fe", + 1723 => x"f0050855", + 1724 => x"70545155", + 1725 => x"55989a3f", + 1726 => x"8008708c", + 1727 => x"08ff8005", + 1728 => x"0c8c08fe", + 1729 => x"f0050853", + 1730 => x"8c08ff9c", + 1731 => x"05085254", + 1732 => x"97da3f80", + 1733 => x"08708c08", + 1734 => x"fef8050c", + 1735 => x"8c08fef8", + 1736 => x"05088c08", + 1737 => x"fef40508", + 1738 => x"29708c08", + 1739 => x"ff88050c", + 1740 => x"8c08ff80", + 1741 => x"05087090", + 1742 => x"2b8c08ff", + 1743 => x"a0050890", + 1744 => x"2a707207", + 1745 => x"8c08ff80", + 1746 => x"050c5258", + 1747 => x"5151548c", + 1748 => x"08ff8005", + 1749 => x"088c08ff", + 1750 => x"88050827", + 1751 => x"80e1388c", + 1752 => x"08fef805", + 1753 => x"08ff058c", + 1754 => x"08fef805", + 1755 => x"0c8c08ff", + 1756 => x"8005088c", + 1757 => x"08ffac05", + 1758 => x"08058c08", + 1759 => x"ff80050c", + 1760 => x"8c08ffac", + 1761 => x"05088c08", + 1762 => x"ff800508", + 1763 => x"26b1388c", + 1764 => x"08ff8005", + 1765 => x"088c08ff", + 1766 => x"88050827", + 1767 => x"a2388c08", + 1768 => x"fef80508", + 1769 => x"ff058c08", + 1770 => x"fef8050c", + 1771 => x"8c08ff80", + 1772 => x"05088c08", + 1773 => x"ffac0508", + 1774 => x"058c08ff", + 1775 => x"80050c8c", + 1776 => x"08ff8005", + 1777 => x"088c08ff", + 1778 => x"88050831", + 1779 => x"8c08ff80", + 1780 => x"050c8c08", + 1781 => x"ff800508", + 1782 => x"8c08fef0", + 1783 => x"05085370", + 1784 => x"525496ad", + 1785 => x"3f800870", + 1786 => x"8c08ff84", + 1787 => x"050c8c08", + 1788 => x"fef00508", + 1789 => x"538c08ff", + 1790 => x"80050852", + 1791 => x"5495ed3f", + 1792 => x"8008708c", + 1793 => x"08fefc05", + 1794 => x"0c8c08fe", + 1795 => x"fc05088c", + 1796 => x"08fef405", + 1797 => x"0829708c", + 1798 => x"08ff8805", + 1799 => x"0c8c08ff", + 1800 => x"84050870", + 1801 => x"902b8c08", + 1802 => x"ffa00508", + 1803 => x"83ffff06", + 1804 => x"7072078c", + 1805 => x"08ff8405", + 1806 => x"0c525851", + 1807 => x"51548c08", + 1808 => x"ff840508", + 1809 => x"8c08ff88", + 1810 => x"05082780", + 1811 => x"e1388c08", + 1812 => x"fefc0508", + 1813 => x"ff058c08", + 1814 => x"fefc050c", + 1815 => x"8c08ff84", + 1816 => x"05088c08", + 1817 => x"ffac0508", + 1818 => x"058c08ff", + 1819 => x"84050c8c", + 1820 => x"08ffac05", + 1821 => x"088c08ff", + 1822 => x"84050826", + 1823 => x"b1388c08", + 1824 => x"ff840508", + 1825 => x"8c08ff88", + 1826 => x"050827a2", + 1827 => x"388c08fe", + 1828 => x"fc0508ff", + 1829 => x"058c08fe", + 1830 => x"fc050c8c", + 1831 => x"08ff8405", + 1832 => x"088c08ff", + 1833 => x"ac050805", + 1834 => x"8c08ff84", + 1835 => x"050c8c08", + 1836 => x"ff840508", + 1837 => x"8c08ff88", + 1838 => x"0508318c", + 1839 => x"08ff8405", + 1840 => x"0c8c08fe", + 1841 => x"f8050870", + 1842 => x"902b708c", + 1843 => x"08fefc05", + 1844 => x"08078c08", + 1845 => x"ff94050c", + 1846 => x"8c08ff84", + 1847 => x"05088c08", + 1848 => x"ffa0050c", + 1849 => x"51548c08", + 1850 => x"ffac0508", + 1851 => x"902a8c08", + 1852 => x"fef0050c", + 1853 => x"8c08ffac", + 1854 => x"050883ff", + 1855 => x"ff068c08", + 1856 => x"fef4050c", + 1857 => x"8c08ffa0", + 1858 => x"05088c08", + 1859 => x"fef00508", + 1860 => x"53705254", + 1861 => x"93fb3f80", + 1862 => x"08708c08", + 1863 => x"ff80050c", + 1864 => x"8c08fef0", + 1865 => x"0508538c", + 1866 => x"08ffa005", + 1867 => x"08525493", + 1868 => x"bb3f8008", + 1869 => x"708c08fe", + 1870 => x"f8050c8c", + 1871 => x"08fef805", + 1872 => x"088c08fe", + 1873 => x"f4050829", + 1874 => x"708c08ff", + 1875 => x"88050c8c", + 1876 => x"08ff8005", + 1877 => x"0870902b", + 1878 => x"8c08ffa4", + 1879 => x"0508902a", + 1880 => x"7072078c", + 1881 => x"08ff8005", + 1882 => x"0c525851", + 1883 => x"51548c08", + 1884 => x"ff800508", + 1885 => x"8c08ff88", + 1886 => x"05082780", + 1887 => x"e1388c08", + 1888 => x"fef80508", + 1889 => x"ff058c08", + 1890 => x"fef8050c", + 1891 => x"8c08ff80", + 1892 => x"05088c08", + 1893 => x"ffac0508", + 1894 => x"058c08ff", + 1895 => x"80050c8c", + 1896 => x"08ffac05", + 1897 => x"088c08ff", + 1898 => x"80050826", + 1899 => x"b1388c08", + 1900 => x"ff800508", + 1901 => x"8c08ff88", + 1902 => x"050827a2", + 1903 => x"388c08fe", + 1904 => x"f80508ff", + 1905 => x"058c08fe", + 1906 => x"f8050c8c", + 1907 => x"08ff8005", + 1908 => x"088c08ff", + 1909 => x"ac050805", + 1910 => x"8c08ff80", + 1911 => x"050c8c08", + 1912 => x"ff800508", + 1913 => x"8c08ff88", + 1914 => x"0508318c", + 1915 => x"08ff8005", + 1916 => x"0c8c08ff", + 1917 => x"8005088c", + 1918 => x"08fef005", + 1919 => x"08537052", + 1920 => x"54928e3f", + 1921 => x"8008708c", + 1922 => x"08ff8405", + 1923 => x"0c8c08fe", + 1924 => x"f0050853", + 1925 => x"8c08ff80", + 1926 => x"05085254", + 1927 => x"91ce3f80", + 1928 => x"08708c08", + 1929 => x"fefc050c", + 1930 => x"8c08fefc", + 1931 => x"05088c08", + 1932 => x"fef40508", + 1933 => x"29708c08", + 1934 => x"ff88050c", + 1935 => x"8c08ff84", + 1936 => x"05087090", + 1937 => x"2b8c08ff", + 1938 => x"a4050883", + 1939 => x"ffff0670", + 1940 => x"72078c08", + 1941 => x"ff84050c", + 1942 => x"52585151", + 1943 => x"548c08ff", + 1944 => x"8405088c", + 1945 => x"08ff8805", + 1946 => x"082780e1", + 1947 => x"388c08fe", + 1948 => x"fc0508ff", + 1949 => x"058c08fe", + 1950 => x"fc050c8c", + 1951 => x"08ff8405", + 1952 => x"088c08ff", + 1953 => x"ac050805", + 1954 => x"8c08ff84", + 1955 => x"050c8c08", + 1956 => x"ffac0508", + 1957 => x"8c08ff84", + 1958 => x"050826b1", + 1959 => x"388c08ff", + 1960 => x"8405088c", + 1961 => x"08ff8805", + 1962 => x"0827a238", + 1963 => x"8c08fefc", + 1964 => x"0508ff05", + 1965 => x"8c08fefc", + 1966 => x"050c8c08", + 1967 => x"ff840508", + 1968 => x"8c08ffac", + 1969 => x"0508058c", + 1970 => x"08ff8405", + 1971 => x"0c8c08ff", + 1972 => x"8405088c", + 1973 => x"08ff8805", + 1974 => x"08318c08", + 1975 => x"ff84050c", + 1976 => x"8c08fef8", + 1977 => x"05087090", + 1978 => x"2b708c08", + 1979 => x"fefc0508", + 1980 => x"078c08ff", + 1981 => x"98050c8c", + 1982 => x"08ff8405", + 1983 => x"088c08ff", + 1984 => x"a4050c51", + 1985 => x"548c08c8", + 1986 => x"0508802e", + 1987 => x"8ea3388c", + 1988 => x"08ffa405", + 1989 => x"088c08ff", + 1990 => x"8c05082a", + 1991 => x"8c08ffb4", + 1992 => x"050c800b", + 1993 => x"8c08ffb0", + 1994 => x"050c8c08", + 1995 => x"c8050856", + 1996 => x"8c08ffb0", + 1997 => x"05088c08", + 1998 => x"ffb40508", + 1999 => x"56547376", + 2000 => x"0c748417", + 2001 => x"0c8dea39", + 2002 => x"8c08ffa0", + 2003 => x"05088c08", + 2004 => x"ffa80508", + 2005 => x"2780d138", + 2006 => x"800b8c08", + 2007 => x"ff98050c", + 2008 => x"800b8c08", + 2009 => x"ff94050c", + 2010 => x"8c08c805", + 2011 => x"08802e8d", + 2012 => x"c0388c08", + 2013 => x"ffa40508", + 2014 => x"8c08ffb4", + 2015 => x"050c8c08", + 2016 => x"ffa00508", + 2017 => x"8c08ffb0", + 2018 => x"050c8c08", + 2019 => x"c8050856", + 2020 => x"8c08ffb0", + 2021 => x"05088c08", + 2022 => x"ffb40508", + 2023 => x"56547376", + 2024 => x"0c748417", + 2025 => x"0c8d8a39", + 2026 => x"8c08ffa8", + 2027 => x"05088c08", + 2028 => x"fef0050c", + 2029 => x"8c08fef0", + 2030 => x"050883ff", + 2031 => x"ff26a038", + 2032 => x"8c08fef0", + 2033 => x"050881ff", + 2034 => x"268b3880", + 2035 => x"0b8c08fe", + 2036 => x"d0050ca9", + 2037 => x"39880b8c", + 2038 => x"08fed005", + 2039 => x"0c9f398c", + 2040 => x"08fef005", + 2041 => x"08fe800a", + 2042 => x"268b3890", + 2043 => x"0b8c08fe", + 2044 => x"d0050c89", + 2045 => x"39980b8c", + 2046 => x"08fed005", + 2047 => x"0c8c08fe", + 2048 => x"d005088c", + 2049 => x"08fef405", + 2050 => x"0c8c08fe", + 2051 => x"f005088c", + 2052 => x"08fef405", + 2053 => x"082a80f6", + 2054 => x"c811338c", + 2055 => x"08fef405", + 2056 => x"0811a071", + 2057 => x"318c08ff", + 2058 => x"8c050c51", + 2059 => x"51548c08", + 2060 => x"ff8c0508", + 2061 => x"81d9388c", + 2062 => x"08ffa005", + 2063 => x"088c08ff", + 2064 => x"a8050826", + 2065 => x"93388c08", + 2066 => x"ffa40508", + 2067 => x"8c08ffac", + 2068 => x"05082784", + 2069 => x"3880e839", + 2070 => x"810b8c08", + 2071 => x"ff98050c", + 2072 => x"8c08ffa4", + 2073 => x"05088c08", + 2074 => x"ffac0508", + 2075 => x"318c08fe", + 2076 => x"f0050c8c", + 2077 => x"08ffa005", + 2078 => x"088c08ff", + 2079 => x"a8050831", + 2080 => x"708c08fe", + 2081 => x"cc050c54", + 2082 => x"8c08ffa4", + 2083 => x"05088c08", + 2084 => x"fef00508", + 2085 => x"278f388c", + 2086 => x"08fecc05", + 2087 => x"08ff058c", + 2088 => x"08fecc05", + 2089 => x"0c8c08fe", + 2090 => x"cc05088c", + 2091 => x"08ffa005", + 2092 => x"0c8c08fe", + 2093 => x"f005088c", + 2094 => x"08ffa405", + 2095 => x"0c893980", + 2096 => x"0b8c08ff", + 2097 => x"98050c80", + 2098 => x"0b8c08ff", + 2099 => x"94050c8c", + 2100 => x"08c80508", + 2101 => x"802e8ad9", + 2102 => x"388c08ff", + 2103 => x"a405088c", + 2104 => x"08ffb405", + 2105 => x"0c8c08ff", + 2106 => x"a005088c", + 2107 => x"08ffb005", + 2108 => x"0c8c08c8", + 2109 => x"0508568c", + 2110 => x"08ffb005", + 2111 => x"088c08ff", + 2112 => x"b4050856", + 2113 => x"5473760c", + 2114 => x"7484170c", + 2115 => x"8aa339a0", + 2116 => x"0b8c08ff", + 2117 => x"8c050831", + 2118 => x"8c08ff90", + 2119 => x"050c8c08", + 2120 => x"ffa80508", + 2121 => x"8c08ff8c", + 2122 => x"05082b8c", + 2123 => x"08ffac05", + 2124 => x"088c08ff", + 2125 => x"9005082a", + 2126 => x"7072078c", + 2127 => x"08ffa805", + 2128 => x"0c8c08ff", + 2129 => x"ac05088c", + 2130 => x"08ff8c05", + 2131 => x"082b8c08", + 2132 => x"ffac050c", + 2133 => x"8c08ffa0", + 2134 => x"05088c08", + 2135 => x"ff900508", + 2136 => x"2a8c08ff", + 2137 => x"9c050c8c", + 2138 => x"08ffa005", + 2139 => x"088c08ff", + 2140 => x"8c05082b", + 2141 => x"8c08ffa4", + 2142 => x"05088c08", + 2143 => x"ff900508", + 2144 => x"2a707207", + 2145 => x"8c08ffa0", + 2146 => x"050c8c08", + 2147 => x"ffa40508", + 2148 => x"8c08ff8c", + 2149 => x"05082b8c", + 2150 => x"08ffa405", + 2151 => x"0c8c08ff", + 2152 => x"a8050890", + 2153 => x"2a8c08fe", + 2154 => x"f8050c8c", + 2155 => x"08ffa805", + 2156 => x"0883ffff", + 2157 => x"068c08fe", + 2158 => x"fc050c8c", + 2159 => x"08ff9c05", + 2160 => x"088c08fe", + 2161 => x"f8050857", + 2162 => x"70565152", + 2163 => x"5255558a", + 2164 => x"c03f8008", + 2165 => x"708c08ff", + 2166 => x"88050c8c", + 2167 => x"08fef805", + 2168 => x"08538c08", + 2169 => x"ff9c0508", + 2170 => x"52548a80", + 2171 => x"3f800870", + 2172 => x"8c08ff80", + 2173 => x"050c8c08", + 2174 => x"ff800508", + 2175 => x"8c08fefc", + 2176 => x"05082970", + 2177 => x"8c08fee8", + 2178 => x"050c8c08", + 2179 => x"ff880508", + 2180 => x"70902b8c", + 2181 => x"08ffa005", + 2182 => x"08902a70", + 2183 => x"72078c08", + 2184 => x"ff88050c", + 2185 => x"52585151", + 2186 => x"548c08ff", + 2187 => x"8805088c", + 2188 => x"08fee805", + 2189 => x"082780e1", + 2190 => x"388c08ff", + 2191 => x"800508ff", + 2192 => x"058c08ff", + 2193 => x"80050c8c", + 2194 => x"08ff8805", + 2195 => x"088c08ff", + 2196 => x"a8050805", + 2197 => x"8c08ff88", + 2198 => x"050c8c08", + 2199 => x"ffa80508", + 2200 => x"8c08ff88", + 2201 => x"050826b1", + 2202 => x"388c08ff", + 2203 => x"8805088c", + 2204 => x"08fee805", + 2205 => x"0827a238", + 2206 => x"8c08ff80", + 2207 => x"0508ff05", + 2208 => x"8c08ff80", + 2209 => x"050c8c08", + 2210 => x"ff880508", + 2211 => x"8c08ffa8", + 2212 => x"0508058c", + 2213 => x"08ff8805", + 2214 => x"0c8c08ff", + 2215 => x"8805088c", + 2216 => x"08fee805", + 2217 => x"08318c08", + 2218 => x"ff88050c", + 2219 => x"8c08ff88", + 2220 => x"05088c08", + 2221 => x"fef80508", + 2222 => x"53705254", + 2223 => x"88d33f80", + 2224 => x"08708c08", + 2225 => x"feec050c", + 2226 => x"8c08fef8", + 2227 => x"0508538c", + 2228 => x"08ff8805", + 2229 => x"08525488", + 2230 => x"933f8008", + 2231 => x"708c08ff", + 2232 => x"84050c8c", + 2233 => x"08ff8405", + 2234 => x"088c08fe", + 2235 => x"fc050829", + 2236 => x"708c08fe", + 2237 => x"e8050c8c", + 2238 => x"08feec05", + 2239 => x"0870902b", + 2240 => x"8c08ffa0", + 2241 => x"050883ff", + 2242 => x"ff067072", + 2243 => x"078c08fe", + 2244 => x"ec050c52", + 2245 => x"58515154", + 2246 => x"8c08feec", + 2247 => x"05088c08", + 2248 => x"fee80508", + 2249 => x"2780e138", + 2250 => x"8c08ff84", + 2251 => x"0508ff05", + 2252 => x"8c08ff84", + 2253 => x"050c8c08", + 2254 => x"feec0508", + 2255 => x"8c08ffa8", + 2256 => x"0508058c", + 2257 => x"08feec05", + 2258 => x"0c8c08ff", + 2259 => x"a805088c", + 2260 => x"08feec05", + 2261 => x"0826b138", + 2262 => x"8c08feec", + 2263 => x"05088c08", + 2264 => x"fee80508", + 2265 => x"27a2388c", + 2266 => x"08ff8405", + 2267 => x"08ff058c", + 2268 => x"08ff8405", + 2269 => x"0c8c08fe", + 2270 => x"ec05088c", + 2271 => x"08ffa805", + 2272 => x"08058c08", + 2273 => x"feec050c", + 2274 => x"8c08feec", + 2275 => x"05088c08", + 2276 => x"fee80508", + 2277 => x"318c08fe", + 2278 => x"ec050c8c", + 2279 => x"08ff8005", + 2280 => x"0870902b", + 2281 => x"708c08ff", + 2282 => x"84050807", + 2283 => x"8c08ff98", + 2284 => x"050c8c08", + 2285 => x"feec0508", + 2286 => x"8c08ffa0", + 2287 => x"050c8c08", + 2288 => x"ff980508", + 2289 => x"83ffff06", + 2290 => x"8c08ff80", + 2291 => x"050c8c08", + 2292 => x"ff980508", + 2293 => x"902a8c08", + 2294 => x"ff88050c", + 2295 => x"8c08ffac", + 2296 => x"050883ff", + 2297 => x"ff068c08", + 2298 => x"ff84050c", + 2299 => x"8c08ffac", + 2300 => x"0508902a", + 2301 => x"8c08fee4", + 2302 => x"050c8c08", + 2303 => x"ff800508", + 2304 => x"8c08ff84", + 2305 => x"05082970", + 2306 => x"8c08fee8", + 2307 => x"050c8c08", + 2308 => x"ff800508", + 2309 => x"8c08fee4", + 2310 => x"05082970", + 2311 => x"8c08feec", + 2312 => x"050c8c08", + 2313 => x"ff880508", + 2314 => x"8c08ff84", + 2315 => x"05082970", + 2316 => x"8c08fef8", + 2317 => x"050c8c08", + 2318 => x"ff880508", + 2319 => x"8c08fee4", + 2320 => x"05082970", + 2321 => x"8c08fefc", + 2322 => x"050c8c08", + 2323 => x"fee80508", + 2324 => x"902a8c08", + 2325 => x"feec0508", + 2326 => x"118c08fe", + 2327 => x"ec050c8c", + 2328 => x"08feec05", + 2329 => x"088c08fe", + 2330 => x"f8050805", + 2331 => x"8c08feec", + 2332 => x"050c5151", + 2333 => x"51515151", + 2334 => x"548c08fe", + 2335 => x"ec05088c", + 2336 => x"08fef805", + 2337 => x"08279138", + 2338 => x"8c08fefc", + 2339 => x"05088480", + 2340 => x"80058c08", + 2341 => x"fefc050c", + 2342 => x"8c08feec", + 2343 => x"0508902a", + 2344 => x"8c08fefc", + 2345 => x"0508118c", + 2346 => x"08fef005", + 2347 => x"0c8c08fe", + 2348 => x"ec050883", + 2349 => x"ffff0670", + 2350 => x"902b8c08", + 2351 => x"fee80508", + 2352 => x"83ffff06", + 2353 => x"70128c08", + 2354 => x"fef4050c", + 2355 => x"52575154", + 2356 => x"8c08fef0", + 2357 => x"05088c08", + 2358 => x"ffa00508", + 2359 => x"26a6388c", + 2360 => x"08fef005", + 2361 => x"088c08ff", + 2362 => x"a005082e", + 2363 => x"09810680", + 2364 => x"fe388c08", + 2365 => x"fef40508", + 2366 => x"8c08ffa4", + 2367 => x"05082684", + 2368 => x"3880ec39", + 2369 => x"8c08ff98", + 2370 => x"0508ff05", + 2371 => x"8c08ff98", + 2372 => x"050c8c08", + 2373 => x"fef40508", + 2374 => x"8c08ffac", + 2375 => x"0508318c", + 2376 => x"08fee405", + 2377 => x"0c8c08fe", + 2378 => x"f005088c", + 2379 => x"08ffa805", + 2380 => x"0831708c", + 2381 => x"08fec805", + 2382 => x"0c548c08", + 2383 => x"fef40508", + 2384 => x"8c08fee4", + 2385 => x"0508278f", + 2386 => x"388c08fe", + 2387 => x"c80508ff", + 2388 => x"058c08fe", + 2389 => x"c8050c8c", + 2390 => x"08fec805", + 2391 => x"088c08fe", + 2392 => x"f0050c8c", + 2393 => x"08fee405", + 2394 => x"088c08fe", + 2395 => x"f4050c80", + 2396 => x"0b8c08ff", + 2397 => x"94050c8c", + 2398 => x"08c80508", + 2399 => x"802e81b1", + 2400 => x"388c08ff", + 2401 => x"a405088c", + 2402 => x"08fef405", + 2403 => x"08318c08", + 2404 => x"fee4050c", + 2405 => x"8c08ffa0", + 2406 => x"05088c08", + 2407 => x"fef00508", + 2408 => x"31708c08", + 2409 => x"fec4050c", + 2410 => x"548c08ff", + 2411 => x"a405088c", + 2412 => x"08fee405", + 2413 => x"08278f38", + 2414 => x"8c08fec4", + 2415 => x"0508ff05", + 2416 => x"8c08fec4", + 2417 => x"050c8c08", + 2418 => x"fec40508", + 2419 => x"8c08ffa0", + 2420 => x"050c8c08", + 2421 => x"fee40508", + 2422 => x"8c08ffa4", + 2423 => x"050c8c08", + 2424 => x"ffa00508", + 2425 => x"8c08ff90", + 2426 => x"05082b8c", + 2427 => x"08ffa405", + 2428 => x"088c08ff", + 2429 => x"8c05082a", + 2430 => x"7072078c", + 2431 => x"08ffb405", + 2432 => x"0c8c08ff", + 2433 => x"a005088c", + 2434 => x"08ff8c05", + 2435 => x"082a8c08", + 2436 => x"ffb0050c", + 2437 => x"8c08c805", + 2438 => x"08585555", + 2439 => x"8c08ffb0", + 2440 => x"05088c08", + 2441 => x"ffb40508", + 2442 => x"56547376", + 2443 => x"0c748417", + 2444 => x"0c800b8c", + 2445 => x"08fedc05", + 2446 => x"0c800b8c", + 2447 => x"08fee005", + 2448 => x"0c8c08ff", + 2449 => x"9405088c", + 2450 => x"08fedc05", + 2451 => x"0c8c08ff", + 2452 => x"9805088c", + 2453 => x"08fee005", + 2454 => x"0c8c08fe", + 2455 => x"dc05088c", + 2456 => x"08fee005", + 2457 => x"08565473", + 2458 => x"8c08c005", + 2459 => x"0c748c08", + 2460 => x"c4050c8c", + 2461 => x"08c00508", + 2462 => x"8c08c405", + 2463 => x"08565473", + 2464 => x"8c08dc05", + 2465 => x"0c748c08", + 2466 => x"e0050c8c", + 2467 => x"08fc0508", + 2468 => x"802eb338", + 2469 => x"8c08c005", + 2470 => x"548c08dc", + 2471 => x"05088c08", + 2472 => x"e0050857", + 2473 => x"55745275", + 2474 => x"537351d8", + 2475 => x"d73f8c08", + 2476 => x"c005088c", + 2477 => x"08c40508", + 2478 => x"5654738c", + 2479 => x"08dc050c", + 2480 => x"748c08e0", + 2481 => x"050c8c08", + 2482 => x"dc05088c", + 2483 => x"08e00508", + 2484 => x"8c088805", + 2485 => x"08585654", + 2486 => x"73760c74", + 2487 => x"84170c8c", + 2488 => x"08880508", + 2489 => x"800cb63d", + 2490 => x"0d8c0c04", + 2491 => x"8c08028c", + 2492 => x"0cfd3d0d", + 2493 => x"80538c08", + 2494 => x"8c050852", + 2495 => x"8c088805", + 2496 => x"085182de", + 2497 => x"3f800870", + 2498 => x"800c5485", + 2499 => x"3d0d8c0c", + 2500 => x"048c0802", + 2501 => x"8c0cfd3d", + 2502 => x"0d81538c", + 2503 => x"088c0508", + 2504 => x"528c0888", + 2505 => x"05085182", + 2506 => x"b93f8008", + 2507 => x"70800c54", + 2508 => x"853d0d8c", + 2509 => x"0c048c08", + 2510 => x"028c0cf9", + 2511 => x"3d0d800b", + 2512 => x"8c08fc05", + 2513 => x"0c8c0888", + 2514 => x"05088025", + 2515 => x"ab388c08", + 2516 => x"88050830", + 2517 => x"8c088805", + 2518 => x"0c800b8c", + 2519 => x"08f4050c", + 2520 => x"8c08fc05", + 2521 => x"08883881", + 2522 => x"0b8c08f4", + 2523 => x"050c8c08", + 2524 => x"f405088c", + 2525 => x"08fc050c", + 2526 => x"8c088c05", + 2527 => x"088025ab", + 2528 => x"388c088c", + 2529 => x"0508308c", + 2530 => x"088c050c", + 2531 => x"800b8c08", + 2532 => x"f0050c8c", + 2533 => x"08fc0508", + 2534 => x"8838810b", + 2535 => x"8c08f005", + 2536 => x"0c8c08f0", + 2537 => x"05088c08", + 2538 => x"fc050c80", + 2539 => x"538c088c", + 2540 => x"0508528c", + 2541 => x"08880508", + 2542 => x"5181a73f", + 2543 => x"8008708c", + 2544 => x"08f8050c", + 2545 => x"548c08fc", + 2546 => x"0508802e", + 2547 => x"8c388c08", + 2548 => x"f8050830", + 2549 => x"8c08f805", + 2550 => x"0c8c08f8", + 2551 => x"05087080", + 2552 => x"0c54893d", + 2553 => x"0d8c0c04", + 2554 => x"8c08028c", + 2555 => x"0cfb3d0d", + 2556 => x"800b8c08", + 2557 => x"fc050c8c", + 2558 => x"08880508", + 2559 => x"80259338", + 2560 => x"8c088805", + 2561 => x"08308c08", + 2562 => x"88050c81", + 2563 => x"0b8c08fc", + 2564 => x"050c8c08", + 2565 => x"8c050880", + 2566 => x"258c388c", + 2567 => x"088c0508", + 2568 => x"308c088c", + 2569 => x"050c8153", + 2570 => x"8c088c05", + 2571 => x"08528c08", + 2572 => x"88050851", + 2573 => x"ad3f8008", + 2574 => x"708c08f8", + 2575 => x"050c548c", + 2576 => x"08fc0508", + 2577 => x"802e8c38", + 2578 => x"8c08f805", + 2579 => x"08308c08", + 2580 => x"f8050c8c", + 2581 => x"08f80508", + 2582 => x"70800c54", + 2583 => x"873d0d8c", + 2584 => x"0c048c08", + 2585 => x"028c0cfd", + 2586 => x"3d0d810b", + 2587 => x"8c08fc05", + 2588 => x"0c800b8c", + 2589 => x"08f8050c", + 2590 => x"8c088c05", + 2591 => x"088c0888", + 2592 => x"050827ac", + 2593 => x"388c08fc", + 2594 => x"0508802e", + 2595 => x"a338800b", + 2596 => x"8c088c05", + 2597 => x"08249938", + 2598 => x"8c088c05", + 2599 => x"08108c08", + 2600 => x"8c050c8c", + 2601 => x"08fc0508", + 2602 => x"108c08fc", + 2603 => x"050cc939", + 2604 => x"8c08fc05", + 2605 => x"08802e80", + 2606 => x"c9388c08", + 2607 => x"8c05088c", + 2608 => x"08880508", + 2609 => x"26a1388c", + 2610 => x"08880508", + 2611 => x"8c088c05", + 2612 => x"08318c08", + 2613 => x"88050c8c", + 2614 => x"08f80508", + 2615 => x"8c08fc05", + 2616 => x"08078c08", + 2617 => x"f8050c8c", + 2618 => x"08fc0508", + 2619 => x"812a8c08", + 2620 => x"fc050c8c", + 2621 => x"088c0508", + 2622 => x"812a8c08", + 2623 => x"8c050cff", + 2624 => x"af398c08", + 2625 => x"90050880", + 2626 => x"2e8f388c", + 2627 => x"08880508", + 2628 => x"708c08f4", + 2629 => x"050c518d", + 2630 => x"398c08f8", + 2631 => x"0508708c", + 2632 => x"08f4050c", + 2633 => x"518c08f4", + 2634 => x"0508800c", + 2635 => x"853d0d8c", + 2636 => x"0c04ff3d", + 2637 => x"0d735281", + 2638 => x"81c80851", + 2639 => x"963f833d", + 2640 => x"0d04ff3d", + 2641 => x"0d735281", + 2642 => x"81c80851", + 2643 => x"90953f83", + 2644 => x"3d0d04f3", + 2645 => x"3d0d7f61", + 2646 => x"8b1170f8", + 2647 => x"065c5555", + 2648 => x"5e729626", + 2649 => x"83389059", + 2650 => x"80792474", + 2651 => x"7a260753", + 2652 => x"80547274", + 2653 => x"2e098106", + 2654 => x"80cb387d", + 2655 => x"518ce33f", + 2656 => x"7883f726", + 2657 => x"80c63878", + 2658 => x"832a7010", + 2659 => x"101080f9", + 2660 => x"c0058c11", + 2661 => x"0859595a", + 2662 => x"76782e83", + 2663 => x"b0388417", + 2664 => x"08fc0656", + 2665 => x"8c170888", + 2666 => x"1808718c", + 2667 => x"120c8812", + 2668 => x"0c587517", + 2669 => x"84110881", + 2670 => x"0784120c", + 2671 => x"537d518c", + 2672 => x"a23f8817", + 2673 => x"5473800c", + 2674 => x"8f3d0d04", + 2675 => x"78892a79", + 2676 => x"832a5b53", + 2677 => x"72802ebf", + 2678 => x"3878862a", + 2679 => x"b8055a84", + 2680 => x"7327b438", + 2681 => x"80db135a", + 2682 => x"947327ab", + 2683 => x"38788c2a", + 2684 => x"80ee055a", + 2685 => x"80d47327", + 2686 => x"9e38788f", + 2687 => x"2a80f705", + 2688 => x"5a82d473", + 2689 => x"27913878", + 2690 => x"922a80fc", + 2691 => x"055a8ad4", + 2692 => x"73278438", + 2693 => x"80fe5a79", + 2694 => x"10101080", + 2695 => x"f9c0058c", + 2696 => x"11085855", + 2697 => x"76752ea3", + 2698 => x"38841708", + 2699 => x"fc06707a", + 2700 => x"31555673", + 2701 => x"8f2488d5", + 2702 => x"38738025", + 2703 => x"fee6388c", + 2704 => x"17085776", + 2705 => x"752e0981", + 2706 => x"06df3881", + 2707 => x"1a5a80f9", + 2708 => x"d0085776", + 2709 => x"80f9c82e", + 2710 => x"82c03884", + 2711 => x"1708fc06", + 2712 => x"707a3155", + 2713 => x"56738f24", + 2714 => x"81f93880", + 2715 => x"f9c80b80", + 2716 => x"f9d40c80", + 2717 => x"f9c80b80", + 2718 => x"f9d00c73", + 2719 => x"8025feb2", + 2720 => x"3883ff76", + 2721 => x"2783df38", + 2722 => x"75892a76", + 2723 => x"832a5553", + 2724 => x"72802ebf", + 2725 => x"3875862a", + 2726 => x"b8055484", + 2727 => x"7327b438", + 2728 => x"80db1354", + 2729 => x"947327ab", + 2730 => x"38758c2a", + 2731 => x"80ee0554", + 2732 => x"80d47327", + 2733 => x"9e38758f", + 2734 => x"2a80f705", + 2735 => x"5482d473", + 2736 => x"27913875", + 2737 => x"922a80fc", + 2738 => x"05548ad4", + 2739 => x"73278438", + 2740 => x"80fe5473", + 2741 => x"10101080", + 2742 => x"f9c00588", + 2743 => x"11085658", + 2744 => x"74782e86", + 2745 => x"cf388415", + 2746 => x"08fc0653", + 2747 => x"7573278d", + 2748 => x"38881508", + 2749 => x"5574782e", + 2750 => x"098106ea", + 2751 => x"388c1508", + 2752 => x"80f9c00b", + 2753 => x"84050871", + 2754 => x"8c1a0c76", + 2755 => x"881a0c78", + 2756 => x"88130c78", + 2757 => x"8c180c5d", + 2758 => x"58795380", + 2759 => x"7a2483e6", + 2760 => x"3872822c", + 2761 => x"81712b5c", + 2762 => x"537a7c26", + 2763 => x"8198387b", + 2764 => x"7b065372", + 2765 => x"82f13879", + 2766 => x"fc068405", + 2767 => x"5a7a1070", + 2768 => x"7d06545b", + 2769 => x"7282e038", + 2770 => x"841a5af1", + 2771 => x"3988178c", + 2772 => x"11085858", + 2773 => x"76782e09", + 2774 => x"8106fcc2", + 2775 => x"38821a5a", + 2776 => x"fdec3978", + 2777 => x"17798107", + 2778 => x"84190c70", + 2779 => x"80f9d40c", + 2780 => x"7080f9d0", + 2781 => x"0c80f9c8", + 2782 => x"0b8c120c", + 2783 => x"8c110888", + 2784 => x"120c7481", + 2785 => x"0784120c", + 2786 => x"74117571", + 2787 => x"0c51537d", + 2788 => x"5188d03f", + 2789 => x"881754fc", + 2790 => x"ac3980f9", + 2791 => x"c00b8405", + 2792 => x"087a545c", + 2793 => x"798025fe", + 2794 => x"f83882da", + 2795 => x"397a097c", + 2796 => x"067080f9", + 2797 => x"c00b8405", + 2798 => x"0c5c7a10", + 2799 => x"5b7a7c26", + 2800 => x"85387a85", + 2801 => x"b83880f9", + 2802 => x"c00b8805", + 2803 => x"08708412", + 2804 => x"08fc0670", + 2805 => x"7c317c72", + 2806 => x"268f7225", + 2807 => x"0757575c", + 2808 => x"5d557280", + 2809 => x"2e80db38", + 2810 => x"797a1680", + 2811 => x"f9b8081b", + 2812 => x"90115a55", + 2813 => x"575b80f9", + 2814 => x"b408ff2e", + 2815 => x"8838a08f", + 2816 => x"13e08006", + 2817 => x"5776527d", + 2818 => x"5187d93f", + 2819 => x"80085480", + 2820 => x"08ff2e90", + 2821 => x"38800876", + 2822 => x"27829938", + 2823 => x"7480f9c0", + 2824 => x"2e829138", + 2825 => x"80f9c00b", + 2826 => x"88050855", + 2827 => x"841508fc", + 2828 => x"06707a31", + 2829 => x"7a72268f", + 2830 => x"72250752", + 2831 => x"55537283", + 2832 => x"e6387479", + 2833 => x"81078417", + 2834 => x"0c791670", + 2835 => x"80f9c00b", + 2836 => x"88050c75", + 2837 => x"81078412", + 2838 => x"0c547e52", + 2839 => x"5787843f", + 2840 => x"881754fa", + 2841 => x"e0397583", + 2842 => x"2a705454", + 2843 => x"80742481", + 2844 => x"9b387282", + 2845 => x"2c81712b", + 2846 => x"80f9c408", + 2847 => x"077080f9", + 2848 => x"c00b8405", + 2849 => x"0c751010", + 2850 => x"1080f9c0", + 2851 => x"05881108", + 2852 => x"585a5d53", + 2853 => x"778c180c", + 2854 => x"7488180c", + 2855 => x"7688190c", + 2856 => x"768c160c", + 2857 => x"fcf33979", + 2858 => x"7a101010", + 2859 => x"80f9c005", + 2860 => x"7057595d", + 2861 => x"8c150857", + 2862 => x"76752ea3", + 2863 => x"38841708", + 2864 => x"fc06707a", + 2865 => x"31555673", + 2866 => x"8f2483ca", + 2867 => x"38738025", + 2868 => x"8481388c", + 2869 => x"17085776", + 2870 => x"752e0981", + 2871 => x"06df3888", + 2872 => x"15811b70", + 2873 => x"8306555b", + 2874 => x"5572c938", + 2875 => x"7c830653", + 2876 => x"72802efd", + 2877 => x"b838ff1d", + 2878 => x"f819595d", + 2879 => x"88180878", + 2880 => x"2eea38fd", + 2881 => x"b539831a", + 2882 => x"53fc9639", + 2883 => x"83147082", + 2884 => x"2c81712b", + 2885 => x"80f9c408", + 2886 => x"077080f9", + 2887 => x"c00b8405", + 2888 => x"0c761010", + 2889 => x"1080f9c0", + 2890 => x"05881108", + 2891 => x"595b5e51", + 2892 => x"53fee139", + 2893 => x"80f98408", + 2894 => x"17588008", + 2895 => x"762e818d", + 2896 => x"3880f9b4", + 2897 => x"08ff2e83", + 2898 => x"ec387376", + 2899 => x"311880f9", + 2900 => x"840c7387", + 2901 => x"06705753", + 2902 => x"72802e88", + 2903 => x"38887331", + 2904 => x"70155556", + 2905 => x"76149fff", + 2906 => x"06a08071", + 2907 => x"31177054", + 2908 => x"7f535753", + 2909 => x"84ee3f80", + 2910 => x"08538008", + 2911 => x"ff2e81a0", + 2912 => x"3880f984", + 2913 => x"08167080", + 2914 => x"f9840c74", + 2915 => x"7580f9c0", + 2916 => x"0b88050c", + 2917 => x"74763118", + 2918 => x"70810751", + 2919 => x"5556587b", + 2920 => x"80f9c02e", + 2921 => x"839c3879", + 2922 => x"8f2682cb", + 2923 => x"38810b84", + 2924 => x"150c8415", + 2925 => x"08fc0670", + 2926 => x"7a317a72", + 2927 => x"268f7225", + 2928 => x"07525553", + 2929 => x"72802efc", + 2930 => x"f93880db", + 2931 => x"3980089f", + 2932 => x"ff065372", + 2933 => x"feeb3877", + 2934 => x"80f9840c", + 2935 => x"80f9c00b", + 2936 => x"8805087b", + 2937 => x"18810784", + 2938 => x"120c5580", + 2939 => x"f9b00878", + 2940 => x"27863877", + 2941 => x"80f9b00c", + 2942 => x"80f9ac08", + 2943 => x"7827fcac", + 2944 => x"387780f9", + 2945 => x"ac0c8415", + 2946 => x"08fc0670", + 2947 => x"7a317a72", + 2948 => x"268f7225", + 2949 => x"07525553", + 2950 => x"72802efc", + 2951 => x"a5388839", + 2952 => x"80745456", + 2953 => x"fedb397d", + 2954 => x"5183b83f", + 2955 => x"800b800c", + 2956 => x"8f3d0d04", + 2957 => x"73538074", + 2958 => x"24a93872", + 2959 => x"822c8171", + 2960 => x"2b80f9c4", + 2961 => x"08077080", + 2962 => x"f9c00b84", + 2963 => x"050c5d53", + 2964 => x"778c180c", + 2965 => x"7488180c", + 2966 => x"7688190c", + 2967 => x"768c160c", + 2968 => x"f9b73983", + 2969 => x"1470822c", + 2970 => x"81712b80", + 2971 => x"f9c40807", + 2972 => x"7080f9c0", + 2973 => x"0b84050c", + 2974 => x"5e5153d4", + 2975 => x"397b7b06", + 2976 => x"5372fca3", + 2977 => x"38841a7b", + 2978 => x"105c5af1", + 2979 => x"39ff1a81", + 2980 => x"11515af7", + 2981 => x"b9397817", + 2982 => x"79810784", + 2983 => x"190c8c18", + 2984 => x"08881908", + 2985 => x"718c120c", + 2986 => x"88120c59", + 2987 => x"7080f9d4", + 2988 => x"0c7080f9", + 2989 => x"d00c80f9", + 2990 => x"c80b8c12", + 2991 => x"0c8c1108", + 2992 => x"88120c74", + 2993 => x"81078412", + 2994 => x"0c741175", + 2995 => x"710c5153", + 2996 => x"f9bd3975", + 2997 => x"17841108", + 2998 => x"81078412", + 2999 => x"0c538c17", + 3000 => x"08881808", + 3001 => x"718c120c", + 3002 => x"88120c58", + 3003 => x"7d5181f3", + 3004 => x"3f881754", + 3005 => x"f5cf3972", + 3006 => x"84150cf4", + 3007 => x"1af80670", + 3008 => x"841e0881", + 3009 => x"0607841e", + 3010 => x"0c701d54", + 3011 => x"5b850b84", + 3012 => x"140c850b", + 3013 => x"88140c8f", + 3014 => x"7b27fdcf", + 3015 => x"38881c52", + 3016 => x"7d5184bf", + 3017 => x"3f80f9c0", + 3018 => x"0b880508", + 3019 => x"80f98408", + 3020 => x"5955fdb7", + 3021 => x"397780f9", + 3022 => x"840c7380", + 3023 => x"f9b40cfc", + 3024 => x"91397284", + 3025 => x"150cfda3", + 3026 => x"39fc3d0d", + 3027 => x"7670797b", + 3028 => x"55555555", + 3029 => x"8f72278c", + 3030 => x"38727507", + 3031 => x"83065170", + 3032 => x"802ea738", + 3033 => x"ff125271", + 3034 => x"ff2e9838", + 3035 => x"72708105", + 3036 => x"54337470", + 3037 => x"81055634", + 3038 => x"ff125271", + 3039 => x"ff2e0981", + 3040 => x"06ea3874", + 3041 => x"800c863d", + 3042 => x"0d047451", + 3043 => x"72708405", + 3044 => x"54087170", + 3045 => x"8405530c", + 3046 => x"72708405", + 3047 => x"54087170", + 3048 => x"8405530c", + 3049 => x"72708405", + 3050 => x"54087170", + 3051 => x"8405530c", + 3052 => x"72708405", + 3053 => x"54087170", + 3054 => x"8405530c", + 3055 => x"f0125271", + 3056 => x"8f26c938", + 3057 => x"83722795", + 3058 => x"38727084", + 3059 => x"05540871", + 3060 => x"70840553", + 3061 => x"0cfc1252", + 3062 => x"718326ed", + 3063 => x"387054ff", + 3064 => x"83390404", + 3065 => x"fd3d0d80", + 3066 => x"0b81d998", + 3067 => x"0c765187", + 3068 => x"c83f8008", + 3069 => x"538008ff", + 3070 => x"2e883872", + 3071 => x"800c853d", + 3072 => x"0d0481d9", + 3073 => x"98085473", + 3074 => x"802ef038", + 3075 => x"7574710c", + 3076 => x"5272800c", + 3077 => x"853d0d04", + 3078 => x"fb3d0d77", + 3079 => x"79707207", + 3080 => x"83065354", + 3081 => x"52709338", + 3082 => x"71737308", + 3083 => x"54565471", + 3084 => x"73082e80", + 3085 => x"c4387375", + 3086 => x"54527133", + 3087 => x"7081ff06", + 3088 => x"52547080", + 3089 => x"2e9d3872", + 3090 => x"33557075", + 3091 => x"2e098106", + 3092 => x"95388112", + 3093 => x"81147133", + 3094 => x"7081ff06", + 3095 => x"54565452", + 3096 => x"70e53872", + 3097 => x"33557381", + 3098 => x"ff067581", + 3099 => x"ff067171", + 3100 => x"31800c52", + 3101 => x"52873d0d", + 3102 => x"04710970", + 3103 => x"f7fbfdff", + 3104 => x"140670f8", + 3105 => x"84828180", + 3106 => x"06515151", + 3107 => x"70973884", + 3108 => x"14841671", + 3109 => x"08545654", + 3110 => x"7175082e", + 3111 => x"dc387375", + 3112 => x"5452ff96", + 3113 => x"39800b80", + 3114 => x"0c873d0d", + 3115 => x"04fb3d0d", + 3116 => x"77705256", + 3117 => x"feac3f80", + 3118 => x"f9c00b88", + 3119 => x"05088411", + 3120 => x"08fc0670", + 3121 => x"7b319fef", + 3122 => x"05e08006", + 3123 => x"e0800556", + 3124 => x"5653a080", + 3125 => x"74249438", + 3126 => x"80527551", + 3127 => x"fe863f80", + 3128 => x"f9c80815", + 3129 => x"53728008", + 3130 => x"2e8f3875", + 3131 => x"51fdf43f", + 3132 => x"80537280", + 3133 => x"0c873d0d", + 3134 => x"04733052", + 3135 => x"7551fde4", + 3136 => x"3f8008ff", + 3137 => x"2ea83880", + 3138 => x"f9c00b88", + 3139 => x"05087575", + 3140 => x"31810784", + 3141 => x"120c5380", + 3142 => x"f9840874", + 3143 => x"3180f984", + 3144 => x"0c7551fd", + 3145 => x"be3f810b", + 3146 => x"800c873d", + 3147 => x"0d048052", + 3148 => x"7551fdb0", + 3149 => x"3f80f9c0", + 3150 => x"0b880508", + 3151 => x"80087131", + 3152 => x"56538f75", + 3153 => x"25ffa438", + 3154 => x"800880f9", + 3155 => x"b4083180", + 3156 => x"f9840c74", + 3157 => x"81078414", + 3158 => x"0c7551fd", + 3159 => x"863f8053", + 3160 => x"ff9039f6", + 3161 => x"3d0d7c7e", + 3162 => x"545b7280", + 3163 => x"2e828338", + 3164 => x"7a51fcee", + 3165 => x"3ff81384", + 3166 => x"110870fe", + 3167 => x"06701384", + 3168 => x"1108fc06", + 3169 => x"5d585954", + 3170 => x"5880f9c8", + 3171 => x"08752e82", + 3172 => x"de387884", + 3173 => x"160c8073", + 3174 => x"8106545a", + 3175 => x"727a2e81", + 3176 => x"d5387815", + 3177 => x"84110881", + 3178 => x"06515372", + 3179 => x"a0387817", + 3180 => x"577981e6", + 3181 => x"38881508", + 3182 => x"537280f9", + 3183 => x"c82e82f9", + 3184 => x"388c1508", + 3185 => x"708c150c", + 3186 => x"7388120c", + 3187 => x"56768107", + 3188 => x"84190c76", + 3189 => x"1877710c", + 3190 => x"53798191", + 3191 => x"3883ff77", + 3192 => x"2781c838", + 3193 => x"76892a77", + 3194 => x"832a5653", + 3195 => x"72802ebf", + 3196 => x"3876862a", + 3197 => x"b8055584", + 3198 => x"7327b438", + 3199 => x"80db1355", + 3200 => x"947327ab", + 3201 => x"38768c2a", + 3202 => x"80ee0555", + 3203 => x"80d47327", + 3204 => x"9e38768f", + 3205 => x"2a80f705", + 3206 => x"5582d473", + 3207 => x"27913876", + 3208 => x"922a80fc", + 3209 => x"05558ad4", + 3210 => x"73278438", + 3211 => x"80fe5574", + 3212 => x"10101080", + 3213 => x"f9c00588", + 3214 => x"11085556", + 3215 => x"73762e82", + 3216 => x"b3388414", + 3217 => x"08fc0653", + 3218 => x"7673278d", + 3219 => x"38881408", + 3220 => x"5473762e", + 3221 => x"098106ea", + 3222 => x"388c1408", + 3223 => x"708c1a0c", + 3224 => x"74881a0c", + 3225 => x"7888120c", + 3226 => x"56778c15", + 3227 => x"0c7a51fa", + 3228 => x"f23f8c3d", + 3229 => x"0d047708", + 3230 => x"78713159", + 3231 => x"77058819", + 3232 => x"08545772", + 3233 => x"80f9c82e", + 3234 => x"80e0388c", + 3235 => x"1808708c", + 3236 => x"150c7388", + 3237 => x"120c56fe", + 3238 => x"89398815", + 3239 => x"088c1608", + 3240 => x"708c130c", + 3241 => x"5788170c", + 3242 => x"fea33976", + 3243 => x"832a7054", + 3244 => x"55807524", + 3245 => x"81983872", + 3246 => x"822c8171", + 3247 => x"2b80f9c4", + 3248 => x"080780f9", + 3249 => x"c00b8405", + 3250 => x"0c537410", + 3251 => x"101080f9", + 3252 => x"c0058811", + 3253 => x"08555675", + 3254 => x"8c190c73", + 3255 => x"88190c77", + 3256 => x"88170c77", + 3257 => x"8c150cff", + 3258 => x"8439815a", + 3259 => x"fdb43978", + 3260 => x"17738106", + 3261 => x"54577298", + 3262 => x"38770878", + 3263 => x"71315977", + 3264 => x"058c1908", + 3265 => x"881a0871", + 3266 => x"8c120c88", + 3267 => x"120c5757", + 3268 => x"76810784", + 3269 => x"190c7780", + 3270 => x"f9c00b88", + 3271 => x"050c80f9", + 3272 => x"bc087726", + 3273 => x"fec73880", + 3274 => x"f9b80852", + 3275 => x"7a51fafd", + 3276 => x"3f7a51f9", + 3277 => x"ae3ffeba", + 3278 => x"3981788c", + 3279 => x"150c7888", + 3280 => x"150c738c", + 3281 => x"1a0c7388", + 3282 => x"1a0c5afd", + 3283 => x"80398315", + 3284 => x"70822c81", + 3285 => x"712b80f9", + 3286 => x"c4080780", + 3287 => x"f9c00b84", + 3288 => x"050c5153", + 3289 => x"74101010", + 3290 => x"80f9c005", + 3291 => x"88110855", + 3292 => x"56fee439", + 3293 => x"74538075", + 3294 => x"24a73872", + 3295 => x"822c8171", + 3296 => x"2b80f9c4", + 3297 => x"080780f9", + 3298 => x"c00b8405", + 3299 => x"0c53758c", + 3300 => x"190c7388", + 3301 => x"190c7788", + 3302 => x"170c778c", + 3303 => x"150cfdcd", + 3304 => x"39831570", + 3305 => x"822c8171", + 3306 => x"2b80f9c4", + 3307 => x"080780f9", + 3308 => x"c00b8405", + 3309 => x"0c5153d6", + 3310 => x"39fe3d0d", + 3311 => x"8188f008", + 3312 => x"51708a38", + 3313 => x"81d99c70", + 3314 => x"8188f00c", + 3315 => x"51707512", + 3316 => x"5252ff53", + 3317 => x"7087fb80", + 3318 => x"80268838", + 3319 => x"708188f0", + 3320 => x"0c715372", + 3321 => x"800c843d", + 3322 => x"0d04fd3d", + 3323 => x"0d800b80", + 3324 => x"f8ec0854", + 3325 => x"5472812e", + 3326 => x"9e387381", + 3327 => x"88f40cff", + 3328 => x"a0ff3fff", + 3329 => x"9ffa3f81", + 3330 => x"88c85281", + 3331 => x"51ffa9ae", + 3332 => x"3f800851", + 3333 => x"80e13f72", + 3334 => x"8188f40c", + 3335 => x"ffa0e23f", + 3336 => x"ff9fdd3f", + 3337 => x"8188c852", + 3338 => x"8151ffa9", + 3339 => x"913f8008", + 3340 => x"5180c43f", + 3341 => x"00ff3900", + 3342 => x"ff39f43d", + 3343 => x"0d7e8188", + 3344 => x"e8087008", + 3345 => x"7081ff06", + 3346 => x"923df805", + 3347 => x"55515a57", + 3348 => x"59ffa19a", + 3349 => x"3f805477", + 3350 => x"557b7d58", + 3351 => x"5276538e", + 3352 => x"3df00551", + 3353 => x"c0c03f79", + 3354 => x"7b58790c", + 3355 => x"76841a0c", + 3356 => x"78800c8e", + 3357 => x"3d0d04f7", + 3358 => x"3d0d7b81", + 3359 => x"81c80882", + 3360 => x"c811085a", + 3361 => x"545a7780", + 3362 => x"2e80da38", + 3363 => x"81881884", + 3364 => x"1908ff05", + 3365 => x"81712b59", + 3366 => x"55598074", + 3367 => x"2480ea38", + 3368 => x"807424b5", + 3369 => x"3873822b", + 3370 => x"78118805", + 3371 => x"56568180", + 3372 => x"19087706", + 3373 => x"5372802e", + 3374 => x"b6387816", + 3375 => x"70085353", + 3376 => x"79517408", + 3377 => x"53722dff", + 3378 => x"14fc17fc", + 3379 => x"1779812c", + 3380 => x"5a575754", + 3381 => x"738025d6", + 3382 => x"38770858", + 3383 => x"77ffad38", + 3384 => x"8181c808", + 3385 => x"53bc1308", + 3386 => x"a5387951", + 3387 => x"fec63f74", + 3388 => x"0853722d", + 3389 => x"ff14fc17", + 3390 => x"fc177981", + 3391 => x"2c5a5757", + 3392 => x"54738025", + 3393 => x"ffa838d1", + 3394 => x"398057ff", + 3395 => x"93397251", + 3396 => x"bc130853", + 3397 => x"722d7951", + 3398 => x"fe9a3fff", + 3399 => x"3d0d8188", + 3400 => x"d00bfc05", + 3401 => x"70085252", + 3402 => x"70ff2e91", + 3403 => x"38702dfc", + 3404 => x"12700852", + 3405 => x"5270ff2e", + 3406 => x"098106f1", + 3407 => x"38833d0d", + 3408 => x"0404ffa0", + 3409 => x"873f0400", + 3410 => x"00000040", + 3411 => x"30313233", + 3412 => x"34353637", + 3413 => x"38390000", + 3414 => x"44485259", + 3415 => x"53544f4e", + 3416 => x"45205052", + 3417 => x"4f475241", + 3418 => x"4d2c2053", + 3419 => x"4f4d4520", + 3420 => x"53545249", + 3421 => x"4e470000", + 3422 => x"44485259", + 3423 => x"53544f4e", + 3424 => x"45205052", + 3425 => x"4f475241", + 3426 => x"4d2c2031", + 3427 => x"27535420", + 3428 => x"53545249", + 3429 => x"4e470000", + 3430 => x"44687279", + 3431 => x"73746f6e", + 3432 => x"65204265", + 3433 => x"6e63686d", + 3434 => x"61726b2c", + 3435 => x"20566572", + 3436 => x"73696f6e", + 3437 => x"20322e31", + 3438 => x"20284c61", + 3439 => x"6e677561", + 3440 => x"67653a20", + 3441 => x"43290a00", + 3442 => x"50726f67", + 3443 => x"72616d20", + 3444 => x"636f6d70", + 3445 => x"696c6564", + 3446 => x"20776974", + 3447 => x"68202772", + 3448 => x"65676973", + 3449 => x"74657227", + 3450 => x"20617474", + 3451 => x"72696275", + 3452 => x"74650a00", + 3453 => x"45786563", + 3454 => x"7574696f", + 3455 => x"6e207374", + 3456 => x"61727473", + 3457 => x"2c202564", + 3458 => x"2072756e", + 3459 => x"73207468", + 3460 => x"726f7567", + 3461 => x"68204468", + 3462 => x"72797374", + 3463 => x"6f6e650a", + 3464 => x"00000000", + 3465 => x"44485259", + 3466 => x"53544f4e", + 3467 => x"45205052", + 3468 => x"4f475241", + 3469 => x"4d2c2032", + 3470 => x"274e4420", + 3471 => x"53545249", + 3472 => x"4e470000", + 3473 => x"45786563", + 3474 => x"7574696f", + 3475 => x"6e20656e", + 3476 => x"64730a00", + 3477 => x"46696e61", + 3478 => x"6c207661", + 3479 => x"6c756573", + 3480 => x"206f6620", + 3481 => x"74686520", + 3482 => x"76617269", + 3483 => x"61626c65", + 3484 => x"73207573", + 3485 => x"65642069", + 3486 => x"6e207468", + 3487 => x"65206265", + 3488 => x"6e63686d", + 3489 => x"61726b3a", + 3490 => x"0a000000", + 3491 => x"496e745f", + 3492 => x"476c6f62", + 3493 => x"3a202020", + 3494 => x"20202020", + 3495 => x"20202020", + 3496 => x"2025640a", + 3497 => x"00000000", + 3498 => x"20202020", + 3499 => x"20202020", + 3500 => x"73686f75", + 3501 => x"6c642062", + 3502 => x"653a2020", + 3503 => x"2025640a", + 3504 => x"00000000", + 3505 => x"426f6f6c", + 3506 => x"5f476c6f", + 3507 => x"623a2020", + 3508 => x"20202020", + 3509 => x"20202020", + 3510 => x"2025640a", + 3511 => x"00000000", + 3512 => x"43685f31", + 3513 => x"5f476c6f", + 3514 => x"623a2020", + 3515 => x"20202020", + 3516 => x"20202020", + 3517 => x"2025630a", + 3518 => x"00000000", + 3519 => x"20202020", + 3520 => x"20202020", + 3521 => x"73686f75", + 3522 => x"6c642062", + 3523 => x"653a2020", + 3524 => x"2025630a", + 3525 => x"00000000", + 3526 => x"43685f32", + 3527 => x"5f476c6f", + 3528 => x"623a2020", + 3529 => x"20202020", + 3530 => x"20202020", + 3531 => x"2025630a", + 3532 => x"00000000", + 3533 => x"4172725f", + 3534 => x"315f476c", + 3535 => x"6f625b38", + 3536 => x"5d3a2020", + 3537 => x"20202020", + 3538 => x"2025640a", + 3539 => x"00000000", + 3540 => x"4172725f", + 3541 => x"325f476c", + 3542 => x"6f625b38", + 3543 => x"5d5b375d", + 3544 => x"3a202020", + 3545 => x"2025640a", + 3546 => x"00000000", + 3547 => x"20202020", + 3548 => x"20202020", + 3549 => x"73686f75", + 3550 => x"6c642062", + 3551 => x"653a2020", + 3552 => x"204e756d", + 3553 => x"6265725f", + 3554 => x"4f665f52", + 3555 => x"756e7320", + 3556 => x"2b203130", + 3557 => x"0a000000", + 3558 => x"5074725f", + 3559 => x"476c6f62", + 3560 => x"2d3e0a00", + 3561 => x"20205074", + 3562 => x"725f436f", + 3563 => x"6d703a20", + 3564 => x"20202020", + 3565 => x"20202020", + 3566 => x"2025640a", + 3567 => x"00000000", + 3568 => x"20202020", + 3569 => x"20202020", + 3570 => x"73686f75", + 3571 => x"6c642062", + 3572 => x"653a2020", + 3573 => x"2028696d", + 3574 => x"706c656d", + 3575 => x"656e7461", + 3576 => x"74696f6e", + 3577 => x"2d646570", + 3578 => x"656e6465", + 3579 => x"6e74290a", + 3580 => x"00000000", + 3581 => x"20204469", + 3582 => x"7363723a", + 3583 => x"20202020", + 3584 => x"20202020", + 3585 => x"20202020", + 3586 => x"2025640a", + 3587 => x"00000000", + 3588 => x"2020456e", + 3589 => x"756d5f43", + 3590 => x"6f6d703a", + 3591 => x"20202020", + 3592 => x"20202020", + 3593 => x"2025640a", + 3594 => x"00000000", + 3595 => x"2020496e", + 3596 => x"745f436f", + 3597 => x"6d703a20", + 3598 => x"20202020", + 3599 => x"20202020", + 3600 => x"2025640a", + 3601 => x"00000000", + 3602 => x"20205374", + 3603 => x"725f436f", + 3604 => x"6d703a20", + 3605 => x"20202020", + 3606 => x"20202020", + 3607 => x"2025730a", + 3608 => x"00000000", + 3609 => x"20202020", + 3610 => x"20202020", + 3611 => x"73686f75", + 3612 => x"6c642062", + 3613 => x"653a2020", + 3614 => x"20444852", + 3615 => x"5953544f", + 3616 => x"4e452050", + 3617 => x"524f4752", + 3618 => x"414d2c20", + 3619 => x"534f4d45", + 3620 => x"20535452", + 3621 => x"494e470a", + 3622 => x"00000000", + 3623 => x"4e657874", + 3624 => x"5f507472", + 3625 => x"5f476c6f", + 3626 => x"622d3e0a", + 3627 => x"00000000", + 3628 => x"20202020", + 3629 => x"20202020", + 3630 => x"73686f75", + 3631 => x"6c642062", + 3632 => x"653a2020", + 3633 => x"2028696d", + 3634 => x"706c656d", + 3635 => x"656e7461", + 3636 => x"74696f6e", + 3637 => x"2d646570", + 3638 => x"656e6465", + 3639 => x"6e74292c", + 3640 => x"2073616d", + 3641 => x"65206173", + 3642 => x"2061626f", + 3643 => x"76650a00", + 3644 => x"496e745f", + 3645 => x"315f4c6f", + 3646 => x"633a2020", + 3647 => x"20202020", + 3648 => x"20202020", + 3649 => x"2025640a", + 3650 => x"00000000", + 3651 => x"496e745f", + 3652 => x"325f4c6f", + 3653 => x"633a2020", + 3654 => x"20202020", + 3655 => x"20202020", + 3656 => x"2025640a", + 3657 => x"00000000", + 3658 => x"496e745f", + 3659 => x"335f4c6f", + 3660 => x"633a2020", + 3661 => x"20202020", + 3662 => x"20202020", + 3663 => x"2025640a", + 3664 => x"00000000", + 3665 => x"456e756d", + 3666 => x"5f4c6f63", + 3667 => x"3a202020", + 3668 => x"20202020", + 3669 => x"20202020", + 3670 => x"2025640a", + 3671 => x"00000000", + 3672 => x"5374725f", + 3673 => x"315f4c6f", + 3674 => x"633a2020", + 3675 => x"20202020", + 3676 => x"20202020", + 3677 => x"2025730a", + 3678 => x"00000000", + 3679 => x"20202020", + 3680 => x"20202020", + 3681 => x"73686f75", + 3682 => x"6c642062", + 3683 => x"653a2020", + 3684 => x"20444852", + 3685 => x"5953544f", + 3686 => x"4e452050", + 3687 => x"524f4752", + 3688 => x"414d2c20", + 3689 => x"31275354", + 3690 => x"20535452", + 3691 => x"494e470a", + 3692 => x"00000000", + 3693 => x"5374725f", + 3694 => x"325f4c6f", + 3695 => x"633a2020", + 3696 => x"20202020", + 3697 => x"20202020", + 3698 => x"2025730a", + 3699 => x"00000000", + 3700 => x"20202020", + 3701 => x"20202020", + 3702 => x"73686f75", + 3703 => x"6c642062", + 3704 => x"653a2020", + 3705 => x"20444852", + 3706 => x"5953544f", + 3707 => x"4e452050", + 3708 => x"524f4752", + 3709 => x"414d2c20", + 3710 => x"32274e44", + 3711 => x"20535452", + 3712 => x"494e470a", + 3713 => x"00000000", + 3714 => x"55736572", + 3715 => x"2074696d", + 3716 => x"653a2025", + 3717 => x"640a0000", + 3718 => x"4d696372", + 3719 => x"6f736563", + 3720 => x"6f6e6473", + 3721 => x"20666f72", + 3722 => x"206f6e65", + 3723 => x"2072756e", + 3724 => x"20746872", + 3725 => x"6f756768", + 3726 => x"20446872", + 3727 => x"7973746f", + 3728 => x"6e653a20", + 3729 => x"00000000", + 3730 => x"2564200a", + 3731 => x"00000000", + 3732 => x"44687279", + 3733 => x"73746f6e", + 3734 => x"65732070", + 3735 => x"65722053", + 3736 => x"65636f6e", + 3737 => x"643a2020", + 3738 => x"20202020", + 3739 => x"20202020", + 3740 => x"20202020", + 3741 => x"20202020", + 3742 => x"20202020", + 3743 => x"00000000", + 3744 => x"56415820", + 3745 => x"4d495053", + 3746 => x"20726174", + 3747 => x"696e6720", + 3748 => x"2a203130", + 3749 => x"3030203d", + 3750 => x"20256420", + 3751 => x"0a000000", + 3752 => x"50726f67", + 3753 => x"72616d20", + 3754 => x"636f6d70", + 3755 => x"696c6564", + 3756 => x"20776974", + 3757 => x"686f7574", + 3758 => x"20277265", + 3759 => x"67697374", + 3760 => x"65722720", + 3761 => x"61747472", + 3762 => x"69627574", + 3763 => x"650a0000", + 3764 => x"4d656173", + 3765 => x"75726564", + 3766 => x"2074696d", + 3767 => x"6520746f", + 3768 => x"6f20736d", + 3769 => x"616c6c20", + 3770 => x"746f206f", + 3771 => x"62746169", + 3772 => x"6e206d65", + 3773 => x"616e696e", + 3774 => x"6766756c", + 3775 => x"20726573", + 3776 => x"756c7473", + 3777 => x"0a000000", + 3778 => x"506c6561", + 3779 => x"73652069", + 3780 => x"6e637265", + 3781 => x"61736520", + 3782 => x"6e756d62", + 3783 => x"6572206f", + 3784 => x"66207275", + 3785 => x"6e730a00", + 3786 => x"44485259", + 3787 => x"53544f4e", + 3788 => x"45205052", + 3789 => x"4f475241", + 3790 => x"4d2c2033", + 3791 => x"27524420", + 3792 => x"53545249", + 3793 => x"4e470000", + 3794 => x"00010202", + 3795 => x"03030303", + 3796 => x"04040404", + 3797 => x"04040404", + 3798 => x"05050505", + 3799 => x"05050505", + 3800 => x"05050505", + 3801 => x"05050505", + 3802 => x"06060606", + 3803 => x"06060606", + 3804 => x"06060606", + 3805 => x"06060606", + 3806 => x"06060606", + 3807 => x"06060606", + 3808 => x"06060606", + 3809 => x"06060606", + 3810 => x"07070707", + 3811 => x"07070707", + 3812 => x"07070707", + 3813 => x"07070707", + 3814 => x"07070707", + 3815 => x"07070707", + 3816 => x"07070707", + 3817 => x"07070707", + 3818 => x"07070707", + 3819 => x"07070707", + 3820 => x"07070707", + 3821 => x"07070707", + 3822 => x"07070707", + 3823 => x"07070707", + 3824 => x"07070707", + 3825 => x"07070707", + 3826 => x"08080808", + 3827 => x"08080808", + 3828 => x"08080808", + 3829 => x"08080808", + 3830 => x"08080808", + 3831 => x"08080808", + 3832 => x"08080808", + 3833 => x"08080808", + 3834 => x"08080808", + 3835 => x"08080808", + 3836 => x"08080808", + 3837 => x"08080808", + 3838 => x"08080808", + 3839 => x"08080808", + 3840 => x"08080808", + 3841 => x"08080808", + 3842 => x"08080808", + 3843 => x"08080808", + 3844 => x"08080808", + 3845 => x"08080808", + 3846 => x"08080808", + 3847 => x"08080808", + 3848 => x"08080808", + 3849 => x"08080808", + 3850 => x"08080808", + 3851 => x"08080808", + 3852 => x"08080808", + 3853 => x"08080808", + 3854 => x"08080808", + 3855 => x"08080808", + 3856 => x"08080808", + 3857 => x"08080808", + 3858 => x"43000000", + 3859 => x"64756d6d", + 3860 => x"792e6578", + 3861 => x"65000000", + 3862 => x"00ffffff", + 3863 => x"ff00ffff", + 3864 => x"ffff00ff", + 3865 => x"ffffff00", + 3866 => x"00000000", + 3867 => x"00000000", + 3868 => x"00000000", + 3869 => x"00004458", + 3870 => x"0000000a", + 3871 => x"00000000", + 3872 => x"00000032", + 3873 => x"00000000", + 3874 => x"00000000", + 3875 => x"00000000", + 3876 => x"00000000", + 3877 => x"00000000", + 3878 => x"00000000", + 3879 => x"00000000", + 3880 => x"00000000", + 3881 => x"00000000", + 3882 => x"00000000", + 3883 => x"00000000", + 3884 => x"00000000", + 3885 => x"ffffffff", + 3886 => x"00000000", + 3887 => x"00020000", + 3888 => x"00000000", + 3889 => x"00000000", + 3890 => x"00003cc0", + 3891 => x"00003cc0", + 3892 => x"00003cc8", + 3893 => x"00003cc8", + 3894 => x"00003cd0", + 3895 => x"00003cd0", + 3896 => x"00003cd8", + 3897 => x"00003cd8", + 3898 => x"00003ce0", + 3899 => x"00003ce0", + 3900 => x"00003ce8", + 3901 => x"00003ce8", + 3902 => x"00003cf0", + 3903 => x"00003cf0", + 3904 => x"00003cf8", + 3905 => x"00003cf8", + 3906 => x"00003d00", + 3907 => x"00003d00", + 3908 => x"00003d08", + 3909 => x"00003d08", + 3910 => x"00003d10", + 3911 => x"00003d10", + 3912 => x"00003d18", + 3913 => x"00003d18", + 3914 => x"00003d20", + 3915 => x"00003d20", + 3916 => x"00003d28", + 3917 => x"00003d28", + 3918 => x"00003d30", + 3919 => x"00003d30", + 3920 => x"00003d38", + 3921 => x"00003d38", + 3922 => x"00003d40", + 3923 => x"00003d40", + 3924 => x"00003d48", + 3925 => x"00003d48", + 3926 => x"00003d50", + 3927 => x"00003d50", + 3928 => x"00003d58", + 3929 => x"00003d58", + 3930 => x"00003d60", + 3931 => x"00003d60", + 3932 => x"00003d68", + 3933 => x"00003d68", + 3934 => x"00003d70", + 3935 => x"00003d70", + 3936 => x"00003d78", + 3937 => x"00003d78", + 3938 => x"00003d80", + 3939 => x"00003d80", + 3940 => x"00003d88", + 3941 => x"00003d88", + 3942 => x"00003d90", + 3943 => x"00003d90", + 3944 => x"00003d98", + 3945 => x"00003d98", + 3946 => x"00003da0", + 3947 => x"00003da0", + 3948 => x"00003da8", + 3949 => x"00003da8", + 3950 => x"00003db0", + 3951 => x"00003db0", + 3952 => x"00003db8", + 3953 => x"00003db8", + 3954 => x"00003dc0", + 3955 => x"00003dc0", + 3956 => x"00003dc8", + 3957 => x"00003dc8", + 3958 => x"00003dd0", + 3959 => x"00003dd0", + 3960 => x"00003dd8", + 3961 => x"00003dd8", + 3962 => x"00003de0", + 3963 => x"00003de0", + 3964 => x"00003de8", + 3965 => x"00003de8", + 3966 => x"00003df0", + 3967 => x"00003df0", + 3968 => x"00003df8", + 3969 => x"00003df8", + 3970 => x"00003e00", + 3971 => x"00003e00", + 3972 => x"00003e08", + 3973 => x"00003e08", + 3974 => x"00003e10", + 3975 => x"00003e10", + 3976 => x"00003e18", + 3977 => x"00003e18", + 3978 => x"00003e20", + 3979 => x"00003e20", + 3980 => x"00003e28", + 3981 => x"00003e28", + 3982 => x"00003e30", + 3983 => x"00003e30", + 3984 => x"00003e38", + 3985 => x"00003e38", + 3986 => x"00003e40", + 3987 => x"00003e40", + 3988 => x"00003e48", + 3989 => x"00003e48", + 3990 => x"00003e50", + 3991 => x"00003e50", + 3992 => x"00003e58", + 3993 => x"00003e58", + 3994 => x"00003e60", + 3995 => x"00003e60", + 3996 => x"00003e68", + 3997 => x"00003e68", + 3998 => x"00003e70", + 3999 => x"00003e70", + 4000 => x"00003e78", + 4001 => x"00003e78", + 4002 => x"00003e80", + 4003 => x"00003e80", + 4004 => x"00003e88", + 4005 => x"00003e88", + 4006 => x"00003e90", + 4007 => x"00003e90", + 4008 => x"00003e98", + 4009 => x"00003e98", + 4010 => x"00003ea0", + 4011 => x"00003ea0", + 4012 => x"00003ea8", + 4013 => x"00003ea8", + 4014 => x"00003eb0", + 4015 => x"00003eb0", + 4016 => x"00003eb8", + 4017 => x"00003eb8", + 4018 => x"00003ec0", + 4019 => x"00003ec0", + 4020 => x"00003ec8", + 4021 => x"00003ec8", + 4022 => x"00003ed0", + 4023 => x"00003ed0", + 4024 => x"00003ed8", + 4025 => x"00003ed8", + 4026 => x"00003ee0", + 4027 => x"00003ee0", + 4028 => x"00003ee8", + 4029 => x"00003ee8", + 4030 => x"00003ef0", + 4031 => x"00003ef0", + 4032 => x"00003ef8", + 4033 => x"00003ef8", + 4034 => x"00003f00", + 4035 => x"00003f00", + 4036 => x"00003f08", + 4037 => x"00003f08", + 4038 => x"00003f10", + 4039 => x"00003f10", + 4040 => x"00003f18", + 4041 => x"00003f18", + 4042 => x"00003f20", + 4043 => x"00003f20", + 4044 => x"00003f28", + 4045 => x"00003f28", + 4046 => x"00003f30", + 4047 => x"00003f30", + 4048 => x"00003f38", + 4049 => x"00003f38", + 4050 => x"00003f40", + 4051 => x"00003f40", + 4052 => x"00003f48", + 4053 => x"00003f48", + 4054 => x"00003f50", + 4055 => x"00003f50", + 4056 => x"00003f58", + 4057 => x"00003f58", + 4058 => x"00003f60", + 4059 => x"00003f60", + 4060 => x"00003f68", + 4061 => x"00003f68", + 4062 => x"00003f70", + 4063 => x"00003f70", + 4064 => x"00003f78", + 4065 => x"00003f78", + 4066 => x"00003f80", + 4067 => x"00003f80", + 4068 => x"00003f88", + 4069 => x"00003f88", + 4070 => x"00003f90", + 4071 => x"00003f90", + 4072 => x"00003f98", + 4073 => x"00003f98", + 4074 => x"00003fa0", + 4075 => x"00003fa0", + 4076 => x"00003fa8", + 4077 => x"00003fa8", + 4078 => x"00003fb0", + 4079 => x"00003fb0", + 4080 => x"00003fb8", + 4081 => x"00003fb8", + 4082 => x"00003fc0", + 4083 => x"00003fc0", + 4084 => x"00003fc8", + 4085 => x"00003fc8", + 4086 => x"00003fd0", + 4087 => x"00003fd0", + 4088 => x"00003fd8", + 4089 => x"00003fd8", + 4090 => x"00003fe0", + 4091 => x"00003fe0", + 4092 => x"00003fe8", + 4093 => x"00003fe8", + 4094 => x"00003ff0", + 4095 => x"00003ff0", + 4096 => x"00003ff8", + 4097 => x"00003ff8", + 4098 => x"00004000", + 4099 => x"00004000", + 4100 => x"00004008", + 4101 => x"00004008", + 4102 => x"00004010", + 4103 => x"00004010", + 4104 => x"00004018", + 4105 => x"00004018", + 4106 => x"00004020", + 4107 => x"00004020", + 4108 => x"00004028", + 4109 => x"00004028", + 4110 => x"00004030", + 4111 => x"00004030", + 4112 => x"00004038", + 4113 => x"00004038", + 4114 => x"00004040", + 4115 => x"00004040", + 4116 => x"00004048", + 4117 => x"00004048", + 4118 => x"00004050", + 4119 => x"00004050", + 4120 => x"00004058", + 4121 => x"00004058", + 4122 => x"00004060", + 4123 => x"00004060", + 4124 => x"00004068", + 4125 => x"00004068", + 4126 => x"00004070", + 4127 => x"00004070", + 4128 => x"00004078", + 4129 => x"00004078", + 4130 => x"00004080", + 4131 => x"00004080", + 4132 => x"00004088", + 4133 => x"00004088", + 4134 => x"00004090", + 4135 => x"00004090", + 4136 => x"00004098", + 4137 => x"00004098", + 4138 => x"000040a0", + 4139 => x"000040a0", + 4140 => x"000040a8", + 4141 => x"000040a8", + 4142 => x"000040b0", + 4143 => x"000040b0", + 4144 => x"000040b8", + 4145 => x"000040b8", + 4146 => x"000040cc", + 4147 => x"00000000", + 4148 => x"00004334", + 4149 => x"00004390", + 4150 => x"000043ec", + 4151 => x"00000000", + 4152 => x"00000000", + 4153 => x"00000000", + 4154 => x"00000000", + 4155 => x"00000000", + 4156 => x"00000000", + 4157 => x"00000000", + 4158 => x"00000000", + 4159 => x"00000000", + 4160 => x"00003c48", + 4161 => x"00000000", + 4162 => x"00000000", + 4163 => x"00000000", + 4164 => x"00000000", + 4165 => x"00000000", + 4166 => x"00000000", + 4167 => x"00000000", + 4168 => x"00000000", + 4169 => x"00000000", + 4170 => x"00000000", + 4171 => x"00000000", + 4172 => x"00000000", + 4173 => x"00000000", + 4174 => x"00000000", + 4175 => x"00000000", + 4176 => x"00000000", + 4177 => x"00000000", + 4178 => x"00000000", + 4179 => x"00000000", + 4180 => x"00000000", + 4181 => x"00000000", + 4182 => x"00000000", + 4183 => x"00000000", + 4184 => x"00000000", + 4185 => x"00000000", + 4186 => x"00000000", + 4187 => x"00000000", + 4188 => x"00000000", + 4189 => x"00000001", + 4190 => x"330eabcd", + 4191 => x"1234e66d", + 4192 => x"deec0005", + 4193 => x"000b0000", + 4194 => x"00000000", + 4195 => x"00000000", + 4196 => x"00000000", + 4197 => x"00000000", + 4198 => x"00000000", + 4199 => x"00000000", + 4200 => x"00000000", + 4201 => x"00000000", + 4202 => x"00000000", + 4203 => x"00000000", + 4204 => x"00000000", + 4205 => x"00000000", + 4206 => x"00000000", + 4207 => x"00000000", + 4208 => x"00000000", + 4209 => x"00000000", + 4210 => x"00000000", + 4211 => x"00000000", + 4212 => x"00000000", + 4213 => x"00000000", + 4214 => x"00000000", + 4215 => x"00000000", + 4216 => x"00000000", + 4217 => x"00000000", + 4218 => x"00000000", + 4219 => x"00000000", + 4220 => x"00000000", + 4221 => x"00000000", + 4222 => x"00000000", + 4223 => x"00000000", + 4224 => x"00000000", + 4225 => x"00000000", + 4226 => x"00000000", + 4227 => x"00000000", + 4228 => x"00000000", + 4229 => x"00000000", + 4230 => x"00000000", + 4231 => x"00000000", + 4232 => x"00000000", + 4233 => x"00000000", + 4234 => x"00000000", + 4235 => x"00000000", + 4236 => x"00000000", + 4237 => x"00000000", + 4238 => x"00000000", + 4239 => x"00000000", + 4240 => x"00000000", + 4241 => x"00000000", + 4242 => x"00000000", + 4243 => x"00000000", + 4244 => x"00000000", + 4245 => x"00000000", + 4246 => x"00000000", + 4247 => x"00000000", + 4248 => x"00000000", + 4249 => x"00000000", + 4250 => x"00000000", + 4251 => x"00000000", + 4252 => x"00000000", + 4253 => x"00000000", + 4254 => x"00000000", + 4255 => x"00000000", + 4256 => x"00000000", + 4257 => x"00000000", + 4258 => x"00000000", + 4259 => x"00000000", + 4260 => x"00000000", + 4261 => x"00000000", + 4262 => x"00000000", + 4263 => x"00000000", + 4264 => x"00000000", + 4265 => x"00000000", + 4266 => x"00000000", + 4267 => x"00000000", + 4268 => x"00000000", + 4269 => x"00000000", + 4270 => x"00000000", + 4271 => x"00000000", + 4272 => x"00000000", + 4273 => x"00000000", + 4274 => x"00000000", + 4275 => x"00000000", + 4276 => x"00000000", + 4277 => x"00000000", + 4278 => x"00000000", + 4279 => x"00000000", + 4280 => x"00000000", + 4281 => x"00000000", + 4282 => x"00000000", + 4283 => x"00000000", + 4284 => x"00000000", + 4285 => x"00000000", + 4286 => x"00000000", + 4287 => x"00000000", + 4288 => x"00000000", + 4289 => x"00000000", + 4290 => x"00000000", + 4291 => x"00000000", + 4292 => x"00000000", + 4293 => x"00000000", + 4294 => x"00000000", + 4295 => x"00000000", + 4296 => x"00000000", + 4297 => x"00000000", + 4298 => x"00000000", + 4299 => x"00000000", + 4300 => x"00000000", + 4301 => x"00000000", + 4302 => x"00000000", + 4303 => x"00000000", + 4304 => x"00000000", + 4305 => x"00000000", + 4306 => x"00000000", + 4307 => x"00000000", + 4308 => x"00000000", + 4309 => x"00000000", + 4310 => x"00000000", + 4311 => x"00000000", + 4312 => x"00000000", + 4313 => x"00000000", + 4314 => x"00000000", + 4315 => x"00000000", + 4316 => x"00000000", + 4317 => x"00000000", + 4318 => x"00000000", + 4319 => x"00000000", + 4320 => x"00000000", + 4321 => x"00000000", + 4322 => x"00000000", + 4323 => x"00000000", + 4324 => x"00000000", + 4325 => x"00000000", + 4326 => x"00000000", + 4327 => x"00000000", + 4328 => x"00000000", + 4329 => x"00000000", + 4330 => x"00000000", + 4331 => x"00000000", + 4332 => x"00000000", + 4333 => x"00000000", + 4334 => x"00000000", + 4335 => x"00000000", + 4336 => x"00000000", + 4337 => x"00000000", + 4338 => x"00000000", + 4339 => x"00000000", + 4340 => x"00000000", + 4341 => x"00000000", + 4342 => x"00000000", + 4343 => x"00000000", + 4344 => x"00000000", + 4345 => x"00000000", + 4346 => x"00000000", + 4347 => x"00000000", + 4348 => x"00000000", + 4349 => x"00000000", + 4350 => x"00000000", + 4351 => x"00000000", + 4352 => x"00000000", + 4353 => x"00000000", + 4354 => x"00000000", + 4355 => x"00000000", + 4356 => x"00000000", + 4357 => x"00000000", + 4358 => x"00000000", + 4359 => x"00000000", + 4360 => x"00000000", + 4361 => x"00000000", + 4362 => x"00000000", + 4363 => x"00000000", + 4364 => x"00000000", + 4365 => x"00000000", + 4366 => x"00000000", + 4367 => x"00000000", + 4368 => x"00000000", + 4369 => x"00000000", + 4370 => x"00003c4c", + 4371 => x"ffffffff", + 4372 => x"00000000", + 4373 => x"ffffffff", + 4374 => x"00000000", + 4375 => x"00000000", + +others => x"00000000" +); +begin + do_port_a: + process (clk_i) + variable iaddr : integer; + begin + if rising_edge(clk_i) then + if (a_we_i='1') and (b_we_i='1') and (a_addr_i=b_addr_i) and (a_write_i/=b_write_i) then + report "DualPortRAM write collision" severity failure; + end if; + iaddr:=to_integer(a_addr_i); + if a_we_i='1' then + ram(iaddr):=a_write_i; + -- Write First mode + a_read_o <= a_write_i; + else + a_read_o <= ram(iaddr); + end if; + end if; + end process do_port_a; + + do_port_b: + process (clk_i) + variable iaddr : integer; + begin + if rising_edge(clk_i) then + iaddr:=to_integer(b_addr_i); + if b_we_i='1' then + ram(iaddr):=b_write_i; + b_read_o <= b_write_i; + else + b_read_o <= ram(iaddr); + end if; + end if; + end process do_port_b; +end architecture Xilinx; -- Entity: DualPortRAM diff --git a/zpu/hdl/zealot/roms/hello_bram.vhdl b/zpu/hdl/zealot/roms/hello_bram.vhdl new file mode 100644 index 0000000..7724423 --- /dev/null +++ b/zpu/hdl/zealot/roms/hello_bram.vhdl @@ -0,0 +1,3056 @@ +------------------------------------------------------------------------------ +---- ---- +---- Single Port RAM that maps to a Xilinx BRAM ---- +---- ---- +---- http://www.opencores.org/ ---- +---- ---- +---- Description: ---- +---- This is a program+data memory for the ZPU. It maps to a Xilinx BRAM ---- +---- ---- +---- To Do: ---- +---- - ---- +---- ---- +---- Author: ---- +---- - Salvador E. Tropea, salvador inti.gob.ar ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Copyright (c) 2008 Salvador E. Tropea <salvador inti.gob.ar> ---- +---- Copyright (c) 2008 Instituto Nacional de Tecnología Industrial ---- +---- ---- +---- Distributed under the BSD license ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Design unit: SinglePortRAM(Xilinx) (Entity and architecture) ---- +---- File name: rom_s.in.vhdl (template used) ---- +---- Note: None ---- +---- Limitations: None known ---- +---- Errors: None known ---- +---- Library: work ---- +---- Dependencies: IEEE.std_logic_1164 ---- +---- IEEE.numeric_std ---- +---- Target FPGA: Spartan 3 (XC3S1500-4-FG456) ---- +---- Language: VHDL ---- +---- Wishbone: No ---- +---- Synthesis tools: Xilinx Release 9.2.03i - xst J.39 ---- +---- Simulation tools: GHDL [Sokcho edition] (0.2x) ---- +---- Text editor: SETEdit 0.5.x ---- +---- ---- +------------------------------------------------------------------------------ + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity SinglePortRAM is + generic( + WORD_SIZE : integer:=32; -- Word Size 16/32 + BYTE_BITS : integer:=2; -- Bits used to address bytes + BRAM_W : integer:=15); -- Address Width + port( + clk_i : in std_logic; + we_i : in std_logic; + re_i : in std_logic; + addr_i : in unsigned(BRAM_W-1 downto BYTE_BITS); + write_i : in unsigned(WORD_SIZE-1 downto 0); + read_o : out unsigned(WORD_SIZE-1 downto 0); + busy_o : out std_logic); +end entity SinglePortRAM; + +architecture Xilinx of SinglePortRAM is + type ram_type is array(natural range 0 to ((2**BRAM_W)/4)-1) of unsigned(WORD_SIZE-1 downto 0); + signal addr_r : unsigned(BRAM_W-1 downto BYTE_BITS); + + signal ram : ram_type := +( + 0 => x"0b0b0b0b", + 1 => x"82700b0b", + 2 => x"80cd800c", + 3 => x"3a0b0b80", + 4 => x"c58f0400", + 5 => x"00000000", + 6 => x"00000000", + 7 => x"00000000", + 8 => x"80088408", + 9 => x"88080b0b", + 10 => x"80c5d62d", + 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"0b0b80cc", + 162 => x"ec738306", + 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"8a2d5050", + 172 => x"80085688", + 173 => x"0c840c80", + 174 => x"0c510400", + 175 => x"00000000", + 176 => x"80088408", + 177 => x"88087575", + 178 => x"0b0b0b8c", + 179 => x"bc2d5050", + 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"80ccfc0c", + 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"82c73f80", + 257 => x"c4913f04", + 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"0b80dce8", + 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"0b0b80dc", + 291 => x"e8085271", + 292 => x"0870882a", + 293 => x"81327081", + 294 => x"06515151", + 295 => x"70f13873", + 296 => x"720c833d", + 297 => x"0d0480cc", + 298 => x"fc08802e", + 299 => x"a43880cd", + 300 => x"8008822e", + 301 => x"bd388380", + 302 => x"800b0b0b", + 303 => x"80dce80c", + 304 => x"82a0800b", + 305 => x"80dcec0c", + 306 => x"8290800b", + 307 => x"80dcf00c", + 308 => x"04f88080", + 309 => x"80a40b0b", + 310 => x"0b80dce8", + 311 => x"0cf88080", + 312 => x"82800b80", + 313 => x"dcec0cf8", + 314 => x"80808480", + 315 => x"0b80dcf0", + 316 => x"0c0480c0", + 317 => x"a8808c0b", + 318 => x"0b0b80dc", + 319 => x"e80c80c0", + 320 => x"a880940b", + 321 => x"80dcec0c", + 322 => x"0b0b80cc", + 323 => x"c40b80dc", + 324 => x"f00c04ff", + 325 => x"3d0d80dc", + 326 => x"f4335170", + 327 => x"a73880cd", + 328 => x"88087008", + 329 => x"52527080", + 330 => x"2e943884", + 331 => x"1280cd88", + 332 => x"0c702d80", + 333 => x"cd880870", + 334 => x"08525270", + 335 => x"ee38810b", + 336 => x"80dcf434", + 337 => x"833d0d04", + 338 => x"04803d0d", + 339 => x"0b0b80dc", + 340 => x"e408802e", + 341 => x"8e380b0b", + 342 => x"0b0b800b", + 343 => x"802e0981", + 344 => x"06853882", + 345 => x"3d0d040b", + 346 => x"0b80dce4", + 347 => x"510b0b0b", + 348 => x"f58e3f82", + 349 => x"3d0d0404", + 350 => x"803d0d80", + 351 => x"ccc85185", + 352 => x"de3f800b", + 353 => x"800c823d", + 354 => x"0d048c08", + 355 => x"028c0cf9", + 356 => x"3d0d800b", + 357 => x"8c08fc05", + 358 => x"0c8c0888", + 359 => x"05088025", + 360 => x"ab388c08", + 361 => x"88050830", + 362 => x"8c088805", + 363 => x"0c800b8c", + 364 => x"08f4050c", + 365 => x"8c08fc05", + 366 => x"08883881", + 367 => x"0b8c08f4", + 368 => x"050c8c08", + 369 => x"f405088c", + 370 => x"08fc050c", + 371 => x"8c088c05", + 372 => x"088025ab", + 373 => x"388c088c", + 374 => x"0508308c", + 375 => x"088c050c", + 376 => x"800b8c08", + 377 => x"f0050c8c", + 378 => x"08fc0508", + 379 => x"8838810b", + 380 => x"8c08f005", + 381 => x"0c8c08f0", + 382 => x"05088c08", + 383 => x"fc050c80", + 384 => x"538c088c", + 385 => x"0508528c", + 386 => x"08880508", + 387 => x"5181a73f", + 388 => x"8008708c", + 389 => x"08f8050c", + 390 => x"548c08fc", + 391 => x"0508802e", + 392 => x"8c388c08", + 393 => x"f8050830", + 394 => x"8c08f805", + 395 => x"0c8c08f8", + 396 => x"05087080", + 397 => x"0c54893d", + 398 => x"0d8c0c04", + 399 => x"8c08028c", + 400 => x"0cfb3d0d", + 401 => x"800b8c08", + 402 => x"fc050c8c", + 403 => x"08880508", + 404 => x"80259338", + 405 => x"8c088805", + 406 => x"08308c08", + 407 => x"88050c81", + 408 => x"0b8c08fc", + 409 => x"050c8c08", + 410 => x"8c050880", + 411 => x"258c388c", + 412 => x"088c0508", + 413 => x"308c088c", + 414 => x"050c8153", + 415 => x"8c088c05", + 416 => x"08528c08", + 417 => x"88050851", + 418 => x"ad3f8008", + 419 => x"708c08f8", + 420 => x"050c548c", + 421 => x"08fc0508", + 422 => x"802e8c38", + 423 => x"8c08f805", + 424 => x"08308c08", + 425 => x"f8050c8c", + 426 => x"08f80508", + 427 => x"70800c54", + 428 => x"873d0d8c", + 429 => x"0c048c08", + 430 => x"028c0cfd", + 431 => x"3d0d810b", + 432 => x"8c08fc05", + 433 => x"0c800b8c", + 434 => x"08f8050c", + 435 => x"8c088c05", + 436 => x"088c0888", + 437 => x"050827ac", + 438 => x"388c08fc", + 439 => x"0508802e", + 440 => x"a338800b", + 441 => x"8c088c05", + 442 => x"08249938", + 443 => x"8c088c05", + 444 => x"08108c08", + 445 => x"8c050c8c", + 446 => x"08fc0508", + 447 => x"108c08fc", + 448 => x"050cc939", + 449 => x"8c08fc05", + 450 => x"08802e80", + 451 => x"c9388c08", + 452 => x"8c05088c", + 453 => x"08880508", + 454 => x"26a1388c", + 455 => x"08880508", + 456 => x"8c088c05", + 457 => x"08318c08", + 458 => x"88050c8c", + 459 => x"08f80508", + 460 => x"8c08fc05", + 461 => x"08078c08", + 462 => x"f8050c8c", + 463 => x"08fc0508", + 464 => x"812a8c08", + 465 => x"fc050c8c", + 466 => x"088c0508", + 467 => x"812a8c08", + 468 => x"8c050cff", + 469 => x"af398c08", + 470 => x"90050880", + 471 => x"2e8f388c", + 472 => x"08880508", + 473 => x"708c08f4", + 474 => x"050c518d", + 475 => x"398c08f8", + 476 => x"0508708c", + 477 => x"08f4050c", + 478 => x"518c08f4", + 479 => x"0508800c", + 480 => x"853d0d8c", + 481 => x"0c04fc3d", + 482 => x"0d767079", + 483 => x"7b555555", + 484 => x"558f7227", + 485 => x"8c387275", + 486 => x"07830651", + 487 => x"70802ea7", + 488 => x"38ff1252", + 489 => x"71ff2e98", + 490 => x"38727081", + 491 => x"05543374", + 492 => x"70810556", + 493 => x"34ff1252", + 494 => x"71ff2e09", + 495 => x"8106ea38", + 496 => x"74800c86", + 497 => x"3d0d0474", + 498 => x"51727084", + 499 => x"05540871", + 500 => x"70840553", + 501 => x"0c727084", + 502 => x"05540871", + 503 => x"70840553", + 504 => x"0c727084", + 505 => x"05540871", + 506 => x"70840553", + 507 => x"0c727084", + 508 => x"05540871", + 509 => x"70840553", + 510 => x"0cf01252", + 511 => x"718f26c9", + 512 => x"38837227", + 513 => x"95387270", + 514 => x"84055408", + 515 => x"71708405", + 516 => x"530cfc12", + 517 => x"52718326", + 518 => x"ed387054", + 519 => x"ff8339f7", + 520 => x"3d0d7c70", + 521 => x"525380c8", + 522 => x"3f725480", + 523 => x"085580cc", + 524 => x"d8568157", + 525 => x"80088105", + 526 => x"5a8b3de4", + 527 => x"11595382", + 528 => x"59f41352", + 529 => x"7b881108", + 530 => x"52538183", + 531 => x"3f800830", + 532 => x"70800807", + 533 => x"9f2c8a07", + 534 => x"800c538b", + 535 => x"3d0d04ff", + 536 => x"3d0d7352", + 537 => x"80cd8c08", + 538 => x"51ffb43f", + 539 => x"833d0d04", + 540 => x"fd3d0d75", + 541 => x"70718306", + 542 => x"53555270", + 543 => x"b8387170", + 544 => x"087009f7", + 545 => x"fbfdff12", + 546 => x"0670f884", + 547 => x"82818006", + 548 => x"51515253", + 549 => x"709d3884", + 550 => x"13700870", + 551 => x"09f7fbfd", + 552 => x"ff120670", + 553 => x"f8848281", + 554 => x"80065151", + 555 => x"52537080", + 556 => x"2ee53872", + 557 => x"52713351", + 558 => x"70802e8a", + 559 => x"38811270", + 560 => x"33525270", + 561 => x"f8387174", + 562 => x"31800c85", + 563 => x"3d0d04f2", + 564 => x"3d0d6062", + 565 => x"88110870", + 566 => x"57575f5a", + 567 => x"74802e81", + 568 => x"90388c1a", + 569 => x"2270832a", + 570 => x"81327081", + 571 => x"06515558", + 572 => x"73863890", + 573 => x"1a089138", + 574 => x"795190a2", + 575 => x"3fff5480", + 576 => x"0880ee38", + 577 => x"8c1a2258", + 578 => x"7d085780", + 579 => x"7883ffff", + 580 => x"06700a10", + 581 => x"0a708106", + 582 => x"51565755", + 583 => x"73752e80", + 584 => x"d7387490", + 585 => x"38760884", + 586 => x"18088819", + 587 => x"59565974", + 588 => x"802ef238", + 589 => x"74548880", + 590 => x"75278438", + 591 => x"88805473", + 592 => x"5378529c", + 593 => x"1a0851a4", + 594 => x"1a085473", + 595 => x"2d800b80", + 596 => x"082582e6", + 597 => x"38800819", + 598 => x"75800831", + 599 => x"7f880508", + 600 => x"80083170", + 601 => x"6188050c", + 602 => x"56565973", + 603 => x"ffb43880", + 604 => x"5473800c", + 605 => x"903d0d04", + 606 => x"75813270", + 607 => x"81067641", + 608 => x"51547380", + 609 => x"2e81c138", + 610 => x"74903876", + 611 => x"08841808", + 612 => x"88195956", + 613 => x"5974802e", + 614 => x"f238881a", + 615 => x"087883ff", + 616 => x"ff067089", + 617 => x"2a708106", + 618 => x"51565956", + 619 => x"73802e82", + 620 => x"fa387575", + 621 => x"278d3877", + 622 => x"872a7081", + 623 => x"06515473", + 624 => x"82b53874", + 625 => x"76278338", + 626 => x"74567553", + 627 => x"78527908", + 628 => x"5185823f", + 629 => x"881a0876", + 630 => x"31881b0c", + 631 => x"7908167a", + 632 => x"0c745675", + 633 => x"19757731", + 634 => x"7f880508", + 635 => x"78317061", + 636 => x"88050c56", + 637 => x"56597380", + 638 => x"2efef438", + 639 => x"8c1a2258", + 640 => x"ff863977", + 641 => x"78547953", + 642 => x"7b525684", + 643 => x"c83f881a", + 644 => x"08783188", + 645 => x"1b0c7908", + 646 => x"187a0c7c", + 647 => x"76315d7c", + 648 => x"8e387951", + 649 => x"8fdc3f80", + 650 => x"08818f38", + 651 => x"80085f75", + 652 => x"19757731", + 653 => x"7f880508", + 654 => x"78317061", + 655 => x"88050c56", + 656 => x"56597380", + 657 => x"2efea838", + 658 => x"74818338", + 659 => x"76088418", + 660 => x"08881959", + 661 => x"56597480", + 662 => x"2ef23874", + 663 => x"538a5278", + 664 => x"5182d33f", + 665 => x"80087931", + 666 => x"81055d80", + 667 => x"08843881", + 668 => x"155d815f", + 669 => x"7c58747d", + 670 => x"27833874", + 671 => x"58941a08", + 672 => x"881b0811", + 673 => x"575c807a", + 674 => x"085c5490", + 675 => x"1a087b27", + 676 => x"83388154", + 677 => x"75782584", + 678 => x"3873ba38", + 679 => x"7b7824fe", + 680 => x"e2387b53", + 681 => x"78529c1a", + 682 => x"0851a41a", + 683 => x"0854732d", + 684 => x"80085680", + 685 => x"088024fe", + 686 => x"e2388c1a", + 687 => x"2280c007", + 688 => x"54738c1b", + 689 => x"23ff5473", + 690 => x"800c903d", + 691 => x"0d047eff", + 692 => x"a338ff87", + 693 => x"39755378", + 694 => x"527a5182", + 695 => x"f83f7908", + 696 => x"167a0c79", + 697 => x"518e9b3f", + 698 => x"8008cf38", + 699 => x"7c76315d", + 700 => x"7cfebc38", + 701 => x"feac3990", + 702 => x"1a087a08", + 703 => x"71317611", + 704 => x"70565a57", + 705 => x"5280cd8c", + 706 => x"0851848c", + 707 => x"3f800880", + 708 => x"2effa738", + 709 => x"8008901b", + 710 => x"0c800816", + 711 => x"7a0c7794", + 712 => x"1b0c7488", + 713 => x"1b0c7456", + 714 => x"fd993979", + 715 => x"0858901a", + 716 => x"08782783", + 717 => x"38815475", + 718 => x"75278438", + 719 => x"73b33894", + 720 => x"1a085675", + 721 => x"752680d3", + 722 => x"38755378", + 723 => x"529c1a08", + 724 => x"51a41a08", + 725 => x"54732d80", + 726 => x"08568008", + 727 => x"8024fd83", + 728 => x"388c1a22", + 729 => x"80c00754", + 730 => x"738c1b23", + 731 => x"ff54fed7", + 732 => x"39755378", + 733 => x"52775181", + 734 => x"dc3f7908", + 735 => x"167a0c79", + 736 => x"518cff3f", + 737 => x"8008802e", + 738 => x"fcd9388c", + 739 => x"1a2280c0", + 740 => x"0754738c", + 741 => x"1b23ff54", + 742 => x"fead3974", + 743 => x"75547953", + 744 => x"78525681", + 745 => x"b03f881a", + 746 => x"08753188", + 747 => x"1b0c7908", + 748 => x"157a0cfc", + 749 => x"ae39fa3d", + 750 => x"0d7a7902", + 751 => x"8805a705", + 752 => x"33565253", + 753 => x"8373278a", + 754 => x"38708306", + 755 => x"5271802e", + 756 => x"a838ff13", + 757 => x"5372ff2e", + 758 => x"97387033", + 759 => x"5273722e", + 760 => x"91388111", + 761 => x"ff145451", + 762 => x"72ff2e09", + 763 => x"8106eb38", + 764 => x"80517080", + 765 => x"0c883d0d", + 766 => x"04707257", + 767 => x"55835175", + 768 => x"82802914", + 769 => x"ff125256", + 770 => x"708025f3", + 771 => x"38837327", + 772 => x"bf387408", + 773 => x"76327009", + 774 => x"f7fbfdff", + 775 => x"120670f8", + 776 => x"84828180", + 777 => x"06515151", + 778 => x"70802e99", + 779 => x"38745180", + 780 => x"52703357", + 781 => x"73772eff", + 782 => x"b9388111", + 783 => x"81135351", + 784 => x"837227ed", + 785 => x"38fc1384", + 786 => x"16565372", + 787 => x"8326c338", + 788 => x"7451fefe", + 789 => x"39fa3d0d", + 790 => x"787a7c72", + 791 => x"72725757", + 792 => x"57595656", + 793 => x"747627b2", + 794 => x"38761551", + 795 => x"757127aa", + 796 => x"38707717", + 797 => x"ff145455", + 798 => x"5371ff2e", + 799 => x"9638ff14", + 800 => x"ff145454", + 801 => x"72337434", + 802 => x"ff125271", + 803 => x"ff2e0981", + 804 => x"06ec3875", + 805 => x"800c883d", + 806 => x"0d04768f", + 807 => x"269738ff", + 808 => x"125271ff", + 809 => x"2eed3872", + 810 => x"70810554", + 811 => x"33747081", + 812 => x"055634eb", + 813 => x"39747607", + 814 => x"83065170", + 815 => x"e2387575", + 816 => x"54517270", + 817 => x"84055408", + 818 => x"71708405", + 819 => x"530c7270", + 820 => x"84055408", + 821 => x"71708405", + 822 => x"530c7270", + 823 => x"84055408", + 824 => x"71708405", + 825 => x"530c7270", + 826 => x"84055408", + 827 => x"71708405", + 828 => x"530cf012", + 829 => x"52718f26", + 830 => x"c9388372", + 831 => x"27953872", + 832 => x"70840554", + 833 => x"08717084", + 834 => x"05530cfc", + 835 => x"12527183", + 836 => x"26ed3870", + 837 => x"54ff8839", + 838 => x"ef3d0d63", + 839 => x"6567405d", + 840 => x"427b802e", + 841 => x"84fa3861", + 842 => x"51a5b63f", + 843 => x"f81c7084", + 844 => x"120870fc", + 845 => x"0670628b", + 846 => x"0570f806", + 847 => x"4159455b", + 848 => x"5c415796", + 849 => x"742782c3", + 850 => x"38807b24", + 851 => x"7e7c2607", + 852 => x"59805478", + 853 => x"742e0981", + 854 => x"0682a938", + 855 => x"777b2581", + 856 => x"fc387717", + 857 => x"80d4c80b", + 858 => x"8805085e", + 859 => x"567c762e", + 860 => x"84bd3884", + 861 => x"160870fe", + 862 => x"06178411", + 863 => x"08810651", + 864 => x"55557382", + 865 => x"8b3874fc", + 866 => x"06597c76", + 867 => x"2e84dd38", + 868 => x"77195f7e", + 869 => x"7b2581fd", + 870 => x"38798106", + 871 => x"547382bf", + 872 => x"38767708", + 873 => x"31841108", + 874 => x"fc06565a", + 875 => x"75802e91", + 876 => x"387c762e", + 877 => x"84ea3874", + 878 => x"19185978", + 879 => x"7b258489", + 880 => x"3879802e", + 881 => x"82993877", + 882 => x"15567a76", + 883 => x"24829038", + 884 => x"8c1a0888", + 885 => x"1b08718c", + 886 => x"120c8812", + 887 => x"0c557976", + 888 => x"59578817", + 889 => x"61fc0557", + 890 => x"5975a426", + 891 => x"85ef387b", + 892 => x"79555593", + 893 => x"762780c9", + 894 => x"387b7084", + 895 => x"055d087c", + 896 => x"56790c74", + 897 => x"70840556", + 898 => x"088c180c", + 899 => x"9017549b", + 900 => x"7627ae38", + 901 => x"74708405", + 902 => x"5608740c", + 903 => x"74708405", + 904 => x"56089418", + 905 => x"0c981754", + 906 => x"a3762795", + 907 => x"38747084", + 908 => x"05560874", + 909 => x"0c747084", + 910 => x"0556089c", + 911 => x"180ca017", + 912 => x"54747084", + 913 => x"05560874", + 914 => x"70840556", + 915 => x"0c747084", + 916 => x"05560874", + 917 => x"70840556", + 918 => x"0c740874", + 919 => x"0c777b31", + 920 => x"56758f26", + 921 => x"80c93884", + 922 => x"17088106", + 923 => x"78078418", + 924 => x"0c771784", + 925 => x"11088107", + 926 => x"84120c54", + 927 => x"6151a2e2", + 928 => x"3f881754", + 929 => x"73800c93", + 930 => x"3d0d0490", + 931 => x"5bfdba39", + 932 => x"7856fe85", + 933 => x"398c1608", + 934 => x"88170871", + 935 => x"8c120c88", + 936 => x"120c557e", + 937 => x"707c3157", + 938 => x"588f7627", + 939 => x"ffb9387a", + 940 => x"17841808", + 941 => x"81067c07", + 942 => x"84190c76", + 943 => x"81078412", + 944 => x"0c761184", + 945 => x"11088107", + 946 => x"84120c55", + 947 => x"88055261", + 948 => x"518cf73f", + 949 => x"6151a28a", + 950 => x"3f881754", + 951 => x"ffa6397d", + 952 => x"52615194", + 953 => x"f73f8008", + 954 => x"59800880", + 955 => x"2e81a338", + 956 => x"8008f805", + 957 => x"60840508", + 958 => x"fe066105", + 959 => x"55577674", + 960 => x"2e83e638", + 961 => x"fc185675", + 962 => x"a42681aa", + 963 => x"387b8008", + 964 => x"55559376", + 965 => x"2780d838", + 966 => x"74708405", + 967 => x"56088008", + 968 => x"70840580", + 969 => x"0c0c8008", + 970 => x"75708405", + 971 => x"57087170", + 972 => x"8405530c", + 973 => x"549b7627", + 974 => x"b6387470", + 975 => x"84055608", + 976 => x"74708405", + 977 => x"560c7470", + 978 => x"84055608", + 979 => x"74708405", + 980 => x"560ca376", + 981 => x"27993874", + 982 => x"70840556", + 983 => x"08747084", + 984 => x"05560c74", + 985 => x"70840556", + 986 => x"08747084", + 987 => x"05560c74", + 988 => x"70840556", + 989 => x"08747084", + 990 => x"05560c74", + 991 => x"70840556", + 992 => x"08747084", + 993 => x"05560c74", + 994 => x"08740c7b", + 995 => x"5261518b", + 996 => x"b93f6151", + 997 => x"a0cc3f78", + 998 => x"5473800c", + 999 => x"933d0d04", + 1000 => x"7d526151", + 1001 => x"93b63f80", + 1002 => x"08800c93", + 1003 => x"3d0d0484", + 1004 => x"160855fb", + 1005 => x"d1397553", + 1006 => x"7b528008", + 1007 => x"51efc73f", + 1008 => x"7b526151", + 1009 => x"8b843fca", + 1010 => x"398c1608", + 1011 => x"88170871", + 1012 => x"8c120c88", + 1013 => x"120c558c", + 1014 => x"1a08881b", + 1015 => x"08718c12", + 1016 => x"0c88120c", + 1017 => x"55797959", + 1018 => x"57fbf739", + 1019 => x"7719901c", + 1020 => x"55557375", + 1021 => x"24fba238", + 1022 => x"7a177080", + 1023 => x"d4c80b88", + 1024 => x"050c757c", + 1025 => x"31810784", + 1026 => x"120c5d84", + 1027 => x"17088106", + 1028 => x"7b078418", + 1029 => x"0c61519f", + 1030 => x"c93f8817", + 1031 => x"54fce539", + 1032 => x"74191890", + 1033 => x"1c555d73", + 1034 => x"7d24fb95", + 1035 => x"388c1a08", + 1036 => x"881b0871", + 1037 => x"8c120c88", + 1038 => x"120c5588", + 1039 => x"1a61fc05", + 1040 => x"575975a4", + 1041 => x"2681ae38", + 1042 => x"7b795555", + 1043 => x"93762780", + 1044 => x"c9387b70", + 1045 => x"84055d08", + 1046 => x"7c56790c", + 1047 => x"74708405", + 1048 => x"56088c1b", + 1049 => x"0c901a54", + 1050 => x"9b7627ae", + 1051 => x"38747084", + 1052 => x"05560874", + 1053 => x"0c747084", + 1054 => x"05560894", + 1055 => x"1b0c981a", + 1056 => x"54a37627", + 1057 => x"95387470", + 1058 => x"84055608", + 1059 => x"740c7470", + 1060 => x"84055608", + 1061 => x"9c1b0ca0", + 1062 => x"1a547470", + 1063 => x"84055608", + 1064 => x"74708405", + 1065 => x"560c7470", + 1066 => x"84055608", + 1067 => x"74708405", + 1068 => x"560c7408", + 1069 => x"740c7a1a", + 1070 => x"7080d4c8", + 1071 => x"0b88050c", + 1072 => x"7d7c3181", + 1073 => x"0784120c", + 1074 => x"54841a08", + 1075 => x"81067b07", + 1076 => x"841b0c61", + 1077 => x"519e8b3f", + 1078 => x"7854fdbd", + 1079 => x"3975537b", + 1080 => x"527851ed", + 1081 => x"a13ffaf5", + 1082 => x"39841708", + 1083 => x"fc061860", + 1084 => x"5858fae9", + 1085 => x"3975537b", + 1086 => x"527851ed", + 1087 => x"893f7a1a", + 1088 => x"7080d4c8", + 1089 => x"0b88050c", + 1090 => x"7d7c3181", + 1091 => x"0784120c", + 1092 => x"54841a08", + 1093 => x"81067b07", + 1094 => x"841b0cff", + 1095 => x"b639fa3d", + 1096 => x"0d7880cd", + 1097 => x"8c085455", + 1098 => x"b8130880", + 1099 => x"2e81b638", + 1100 => x"8c152270", + 1101 => x"83ffff06", + 1102 => x"70832a81", + 1103 => x"32708106", + 1104 => x"51555556", + 1105 => x"72802e80", + 1106 => x"dc387384", + 1107 => x"2a813281", + 1108 => x"0657ff53", + 1109 => x"7680f738", + 1110 => x"73822a70", + 1111 => x"81065153", + 1112 => x"72802eb9", + 1113 => x"38b01508", + 1114 => x"5473802e", + 1115 => x"9c3880c0", + 1116 => x"15537373", + 1117 => x"2e8f3873", + 1118 => x"5280cd8c", + 1119 => x"085187ca", + 1120 => x"3f8c1522", + 1121 => x"5676b016", + 1122 => x"0c75db06", + 1123 => x"53728c16", + 1124 => x"23800b84", + 1125 => x"160c9015", + 1126 => x"08750c72", + 1127 => x"56758807", + 1128 => x"53728c16", + 1129 => x"23901508", + 1130 => x"802e80c1", + 1131 => x"388c1522", + 1132 => x"70810655", + 1133 => x"53739e38", + 1134 => x"720a100a", + 1135 => x"70810651", + 1136 => x"53728538", + 1137 => x"94150854", + 1138 => x"7388160c", + 1139 => x"80537280", + 1140 => x"0c883d0d", + 1141 => x"04800b88", + 1142 => x"160c9415", + 1143 => x"08309816", + 1144 => x"0c8053ea", + 1145 => x"39725182", + 1146 => x"fb3ffec4", + 1147 => x"3974518c", + 1148 => x"e83f8c15", + 1149 => x"22708106", + 1150 => x"55537380", + 1151 => x"2effb938", + 1152 => x"d439f83d", + 1153 => x"0d7a5877", + 1154 => x"802e8199", + 1155 => x"3880cd8c", + 1156 => x"0854b814", + 1157 => x"08802e80", + 1158 => x"ed388c18", + 1159 => x"2270902b", + 1160 => x"70902c70", + 1161 => x"832a8132", + 1162 => x"81065c51", + 1163 => x"57547880", + 1164 => x"cd389018", + 1165 => x"08577680", + 1166 => x"2e80c338", + 1167 => x"77087731", + 1168 => x"77790c76", + 1169 => x"83067a58", + 1170 => x"55557385", + 1171 => x"38941808", + 1172 => x"56758819", + 1173 => x"0c807525", + 1174 => x"a5387453", + 1175 => x"76529c18", + 1176 => x"0851a418", + 1177 => x"0854732d", + 1178 => x"800b8008", + 1179 => x"2580c938", + 1180 => x"80081775", + 1181 => x"80083156", + 1182 => x"57748024", + 1183 => x"dd38800b", + 1184 => x"800c8a3d", + 1185 => x"0d047351", + 1186 => x"81da3f8c", + 1187 => x"18227090", + 1188 => x"2b70902c", + 1189 => x"70832a81", + 1190 => x"3281065c", + 1191 => x"51575478", + 1192 => x"dd38ff8e", + 1193 => x"39a48252", + 1194 => x"80cd8c08", + 1195 => x"5189f13f", + 1196 => x"8008800c", + 1197 => x"8a3d0d04", + 1198 => x"8c182280", + 1199 => x"c0075473", + 1200 => x"8c1923ff", + 1201 => x"0b800c8a", + 1202 => x"3d0d0480", + 1203 => x"3d0d7251", + 1204 => x"80710c80", + 1205 => x"0b84120c", + 1206 => x"800b8812", + 1207 => x"0c028e05", + 1208 => x"228c1223", + 1209 => x"02920522", + 1210 => x"8e122380", + 1211 => x"0b90120c", + 1212 => x"800b9412", + 1213 => x"0c800b98", + 1214 => x"120c709c", + 1215 => x"120c80c0", + 1216 => x"970ba012", + 1217 => x"0c80c0e3", + 1218 => x"0ba4120c", + 1219 => x"80c1df0b", + 1220 => x"a8120c80", + 1221 => x"c2b00bac", + 1222 => x"120c823d", + 1223 => x"0d04fa3d", + 1224 => x"0d797080", + 1225 => x"dc298c11", + 1226 => x"547a5356", + 1227 => x"578cad3f", + 1228 => x"80088008", + 1229 => x"55568008", + 1230 => x"802ea238", + 1231 => x"80088c05", + 1232 => x"54800b80", + 1233 => x"080c7680", + 1234 => x"0884050c", + 1235 => x"73800888", + 1236 => x"050c7453", + 1237 => x"80527351", + 1238 => x"97f83f75", + 1239 => x"5473800c", + 1240 => x"883d0d04", + 1241 => x"fc3d0d76", + 1242 => x"a8f70bbc", + 1243 => x"120c5581", + 1244 => x"0bb8160c", + 1245 => x"800b84dc", + 1246 => x"160c830b", + 1247 => x"84e0160c", + 1248 => x"84e81584", + 1249 => x"e4160c74", + 1250 => x"54805384", + 1251 => x"52841508", + 1252 => x"51feb83f", + 1253 => x"74548153", + 1254 => x"89528815", + 1255 => x"0851feab", + 1256 => x"3f745482", + 1257 => x"538a528c", + 1258 => x"150851fe", + 1259 => x"9e3f863d", + 1260 => x"0d04f93d", + 1261 => x"0d7980cd", + 1262 => x"8c085457", + 1263 => x"b8130880", + 1264 => x"2e80c838", + 1265 => x"84dc1356", + 1266 => x"88160884", + 1267 => x"1708ff05", + 1268 => x"55558074", + 1269 => x"249f388c", + 1270 => x"15227090", + 1271 => x"2b70902c", + 1272 => x"51545872", + 1273 => x"802e80ca", + 1274 => x"3880dc15", + 1275 => x"ff155555", + 1276 => x"738025e3", + 1277 => x"38750853", + 1278 => x"72802e9f", + 1279 => x"38725688", + 1280 => x"16088417", + 1281 => x"08ff0555", + 1282 => x"55c83972", + 1283 => x"51fed53f", + 1284 => x"80cd8c08", + 1285 => x"84dc0556", + 1286 => x"ffae3984", + 1287 => x"527651fd", + 1288 => x"fd3f8008", + 1289 => x"760c8008", + 1290 => x"802e80c0", + 1291 => x"38800856", + 1292 => x"ce39810b", + 1293 => x"8c162372", + 1294 => x"750c7288", + 1295 => x"160c7284", + 1296 => x"160c7290", + 1297 => x"160c7294", + 1298 => x"160c7298", + 1299 => x"160cff0b", + 1300 => x"8e162372", + 1301 => x"b0160c72", + 1302 => x"b4160c72", + 1303 => x"80c4160c", + 1304 => x"7280c816", + 1305 => x"0c74800c", + 1306 => x"893d0d04", + 1307 => x"8c770c80", + 1308 => x"0b800c89", + 1309 => x"3d0d04ff", + 1310 => x"3d0da482", + 1311 => x"52735186", + 1312 => x"9f3f833d", + 1313 => x"0d04803d", + 1314 => x"0d80cd8c", + 1315 => x"0851e83f", + 1316 => x"823d0d04", + 1317 => x"fb3d0d77", + 1318 => x"70525696", + 1319 => x"c43f80d4", + 1320 => x"c80b8805", + 1321 => x"08841108", + 1322 => x"fc06707b", + 1323 => x"319fef05", + 1324 => x"e08006e0", + 1325 => x"80055656", + 1326 => x"53a08074", + 1327 => x"24943880", + 1328 => x"52755196", + 1329 => x"9e3f80d4", + 1330 => x"d0081553", + 1331 => x"7280082e", + 1332 => x"8f387551", + 1333 => x"968c3f80", + 1334 => x"5372800c", + 1335 => x"873d0d04", + 1336 => x"73305275", + 1337 => x"5195fc3f", + 1338 => x"8008ff2e", + 1339 => x"a83880d4", + 1340 => x"c80b8805", + 1341 => x"08757531", + 1342 => x"81078412", + 1343 => x"0c5380d4", + 1344 => x"8c087431", + 1345 => x"80d48c0c", + 1346 => x"755195d6", + 1347 => x"3f810b80", + 1348 => x"0c873d0d", + 1349 => x"04805275", + 1350 => x"5195c83f", + 1351 => x"80d4c80b", + 1352 => x"88050880", + 1353 => x"08713156", + 1354 => x"538f7525", + 1355 => x"ffa43880", + 1356 => x"0880d4bc", + 1357 => x"083180d4", + 1358 => x"8c0c7481", + 1359 => x"0784140c", + 1360 => x"7551959e", + 1361 => x"3f8053ff", + 1362 => x"9039f63d", + 1363 => x"0d7c7e54", + 1364 => x"5b72802e", + 1365 => x"8283387a", + 1366 => x"5195863f", + 1367 => x"f8138411", + 1368 => x"0870fe06", + 1369 => x"70138411", + 1370 => x"08fc065d", + 1371 => x"58595458", + 1372 => x"80d4d008", + 1373 => x"752e82de", + 1374 => x"38788416", + 1375 => x"0c807381", + 1376 => x"06545a72", + 1377 => x"7a2e81d5", + 1378 => x"38781584", + 1379 => x"11088106", + 1380 => x"515372a0", + 1381 => x"38781757", + 1382 => x"7981e638", + 1383 => x"88150853", + 1384 => x"7280d4d0", + 1385 => x"2e82f938", + 1386 => x"8c150870", + 1387 => x"8c150c73", + 1388 => x"88120c56", + 1389 => x"76810784", + 1390 => x"190c7618", + 1391 => x"77710c53", + 1392 => x"79819138", + 1393 => x"83ff7727", + 1394 => x"81c83876", + 1395 => x"892a7783", + 1396 => x"2a565372", + 1397 => x"802ebf38", + 1398 => x"76862ab8", + 1399 => x"05558473", + 1400 => x"27b43880", + 1401 => x"db135594", + 1402 => x"7327ab38", + 1403 => x"768c2a80", + 1404 => x"ee055580", + 1405 => x"d473279e", + 1406 => x"38768f2a", + 1407 => x"80f70555", + 1408 => x"82d47327", + 1409 => x"91387692", + 1410 => x"2a80fc05", + 1411 => x"558ad473", + 1412 => x"27843880", + 1413 => x"fe557410", + 1414 => x"101080d4", + 1415 => x"c8058811", + 1416 => x"08555673", + 1417 => x"762e82b3", + 1418 => x"38841408", + 1419 => x"fc065376", + 1420 => x"73278d38", + 1421 => x"88140854", + 1422 => x"73762e09", + 1423 => x"8106ea38", + 1424 => x"8c140870", + 1425 => x"8c1a0c74", + 1426 => x"881a0c78", + 1427 => x"88120c56", + 1428 => x"778c150c", + 1429 => x"7a51938a", + 1430 => x"3f8c3d0d", + 1431 => x"04770878", + 1432 => x"71315977", + 1433 => x"05881908", + 1434 => x"54577280", + 1435 => x"d4d02e80", + 1436 => x"e0388c18", + 1437 => x"08708c15", + 1438 => x"0c738812", + 1439 => x"0c56fe89", + 1440 => x"39881508", + 1441 => x"8c160870", + 1442 => x"8c130c57", + 1443 => x"88170cfe", + 1444 => x"a3397683", + 1445 => x"2a705455", + 1446 => x"80752481", + 1447 => x"98387282", + 1448 => x"2c81712b", + 1449 => x"80d4cc08", + 1450 => x"0780d4c8", + 1451 => x"0b84050c", + 1452 => x"53741010", + 1453 => x"1080d4c8", + 1454 => x"05881108", + 1455 => x"5556758c", + 1456 => x"190c7388", + 1457 => x"190c7788", + 1458 => x"170c778c", + 1459 => x"150cff84", + 1460 => x"39815afd", + 1461 => x"b4397817", + 1462 => x"73810654", + 1463 => x"57729838", + 1464 => x"77087871", + 1465 => x"31597705", + 1466 => x"8c190888", + 1467 => x"1a08718c", + 1468 => x"120c8812", + 1469 => x"0c575776", + 1470 => x"81078419", + 1471 => x"0c7780d4", + 1472 => x"c80b8805", + 1473 => x"0c80d4c4", + 1474 => x"087726fe", + 1475 => x"c73880d4", + 1476 => x"c008527a", + 1477 => x"51fafd3f", + 1478 => x"7a5191c6", + 1479 => x"3ffeba39", + 1480 => x"81788c15", + 1481 => x"0c788815", + 1482 => x"0c738c1a", + 1483 => x"0c73881a", + 1484 => x"0c5afd80", + 1485 => x"39831570", + 1486 => x"822c8171", + 1487 => x"2b80d4cc", + 1488 => x"080780d4", + 1489 => x"c80b8405", + 1490 => x"0c515374", + 1491 => x"10101080", + 1492 => x"d4c80588", + 1493 => x"11085556", + 1494 => x"fee43974", + 1495 => x"53807524", + 1496 => x"a7387282", + 1497 => x"2c81712b", + 1498 => x"80d4cc08", + 1499 => x"0780d4c8", + 1500 => x"0b84050c", + 1501 => x"53758c19", + 1502 => x"0c738819", + 1503 => x"0c778817", + 1504 => x"0c778c15", + 1505 => x"0cfdcd39", + 1506 => x"83157082", + 1507 => x"2c81712b", + 1508 => x"80d4cc08", + 1509 => x"0780d4c8", + 1510 => x"0b84050c", + 1511 => x"5153d639", + 1512 => x"f93d0d79", + 1513 => x"7b585380", + 1514 => x"0b80cd8c", + 1515 => x"08535672", + 1516 => x"722e80c0", + 1517 => x"3884dc13", + 1518 => x"5574762e", + 1519 => x"b7388815", + 1520 => x"08841608", + 1521 => x"ff055454", + 1522 => x"8073249d", + 1523 => x"388c1422", + 1524 => x"70902b70", + 1525 => x"902c5153", + 1526 => x"587180d8", + 1527 => x"3880dc14", + 1528 => x"ff145454", + 1529 => x"728025e5", + 1530 => x"38740855", + 1531 => x"74d03880", + 1532 => x"cd8c0852", + 1533 => x"84dc1255", + 1534 => x"74802eb1", + 1535 => x"38881508", + 1536 => x"841608ff", + 1537 => x"05545480", + 1538 => x"73249c38", + 1539 => x"8c142270", + 1540 => x"902b7090", + 1541 => x"2c515358", + 1542 => x"71ad3880", + 1543 => x"dc14ff14", + 1544 => x"54547280", + 1545 => x"25e63874", + 1546 => x"085574d1", + 1547 => x"3875800c", + 1548 => x"893d0d04", + 1549 => x"7351762d", + 1550 => x"75800807", + 1551 => x"80dc15ff", + 1552 => x"15555556", + 1553 => x"ff9e3973", + 1554 => x"51762d75", + 1555 => x"80080780", + 1556 => x"dc15ff15", + 1557 => x"555556ca", + 1558 => x"39ea3d0d", + 1559 => x"688c1122", + 1560 => x"700a100a", + 1561 => x"81065758", + 1562 => x"567480e4", + 1563 => x"388e1622", + 1564 => x"70902b70", + 1565 => x"902c5155", + 1566 => x"58807424", + 1567 => x"b138983d", + 1568 => x"c4055373", + 1569 => x"5280cd8c", + 1570 => x"085192ac", + 1571 => x"3f800b80", + 1572 => x"08249738", + 1573 => x"7983e080", + 1574 => x"06547380", + 1575 => x"c0802e81", + 1576 => x"8f387382", + 1577 => x"80802e81", + 1578 => x"91388c16", + 1579 => x"22577690", + 1580 => x"80075473", + 1581 => x"8c172388", + 1582 => x"805280cd", + 1583 => x"8c085181", + 1584 => x"9b3f8008", + 1585 => x"9d388c16", + 1586 => x"22820754", + 1587 => x"738c1723", + 1588 => x"80c31670", + 1589 => x"770c9017", + 1590 => x"0c810b94", + 1591 => x"170c983d", + 1592 => x"0d0480cd", + 1593 => x"8c08a8f7", + 1594 => x"0bbc120c", + 1595 => x"548c1622", + 1596 => x"81800754", + 1597 => x"738c1723", + 1598 => x"8008760c", + 1599 => x"80089017", + 1600 => x"0c88800b", + 1601 => x"94170c74", + 1602 => x"802ed338", + 1603 => x"8e162270", + 1604 => x"902b7090", + 1605 => x"2c535558", + 1606 => x"98a23f80", + 1607 => x"08802eff", + 1608 => x"bd388c16", + 1609 => x"22810754", + 1610 => x"738c1723", + 1611 => x"983d0d04", + 1612 => x"810b8c17", + 1613 => x"225855fe", + 1614 => x"f539a816", + 1615 => x"0880c1df", + 1616 => x"2e098106", + 1617 => x"fee4388c", + 1618 => x"16228880", + 1619 => x"0754738c", + 1620 => x"17238880", + 1621 => x"0b80cc17", + 1622 => x"0cfedc39", + 1623 => x"f33d0d7f", + 1624 => x"618b1170", + 1625 => x"f8065c55", + 1626 => x"555e7296", + 1627 => x"26833890", + 1628 => x"59807924", + 1629 => x"747a2607", + 1630 => x"53805472", + 1631 => x"742e0981", + 1632 => x"0680cb38", + 1633 => x"7d518cd9", + 1634 => x"3f7883f7", + 1635 => x"2680c638", + 1636 => x"78832a70", + 1637 => x"10101080", + 1638 => x"d4c8058c", + 1639 => x"11085959", + 1640 => x"5a76782e", + 1641 => x"83b03884", + 1642 => x"1708fc06", + 1643 => x"568c1708", + 1644 => x"88180871", + 1645 => x"8c120c88", + 1646 => x"120c5875", + 1647 => x"17841108", + 1648 => x"81078412", + 1649 => x"0c537d51", + 1650 => x"8c983f88", + 1651 => x"17547380", + 1652 => x"0c8f3d0d", + 1653 => x"0478892a", + 1654 => x"79832a5b", + 1655 => x"5372802e", + 1656 => x"bf387886", + 1657 => x"2ab8055a", + 1658 => x"847327b4", + 1659 => x"3880db13", + 1660 => x"5a947327", + 1661 => x"ab38788c", + 1662 => x"2a80ee05", + 1663 => x"5a80d473", + 1664 => x"279e3878", + 1665 => x"8f2a80f7", + 1666 => x"055a82d4", + 1667 => x"73279138", + 1668 => x"78922a80", + 1669 => x"fc055a8a", + 1670 => x"d4732784", + 1671 => x"3880fe5a", + 1672 => x"79101010", + 1673 => x"80d4c805", + 1674 => x"8c110858", + 1675 => x"5576752e", + 1676 => x"a3388417", + 1677 => x"08fc0670", + 1678 => x"7a315556", + 1679 => x"738f2488", + 1680 => x"d5387380", + 1681 => x"25fee638", + 1682 => x"8c170857", + 1683 => x"76752e09", + 1684 => x"8106df38", + 1685 => x"811a5a80", + 1686 => x"d4d80857", + 1687 => x"7680d4d0", + 1688 => x"2e82c038", + 1689 => x"841708fc", + 1690 => x"06707a31", + 1691 => x"5556738f", + 1692 => x"2481f938", + 1693 => x"80d4d00b", + 1694 => x"80d4dc0c", + 1695 => x"80d4d00b", + 1696 => x"80d4d80c", + 1697 => x"738025fe", + 1698 => x"b23883ff", + 1699 => x"762783df", + 1700 => x"3875892a", + 1701 => x"76832a55", + 1702 => x"5372802e", + 1703 => x"bf387586", + 1704 => x"2ab80554", + 1705 => x"847327b4", + 1706 => x"3880db13", + 1707 => x"54947327", + 1708 => x"ab38758c", + 1709 => x"2a80ee05", + 1710 => x"5480d473", + 1711 => x"279e3875", + 1712 => x"8f2a80f7", + 1713 => x"055482d4", + 1714 => x"73279138", + 1715 => x"75922a80", + 1716 => x"fc05548a", + 1717 => x"d4732784", + 1718 => x"3880fe54", + 1719 => x"73101010", + 1720 => x"80d4c805", + 1721 => x"88110856", + 1722 => x"5874782e", + 1723 => x"86cf3884", + 1724 => x"1508fc06", + 1725 => x"53757327", + 1726 => x"8d388815", + 1727 => x"08557478", + 1728 => x"2e098106", + 1729 => x"ea388c15", + 1730 => x"0880d4c8", + 1731 => x"0b840508", + 1732 => x"718c1a0c", + 1733 => x"76881a0c", + 1734 => x"7888130c", + 1735 => x"788c180c", + 1736 => x"5d587953", + 1737 => x"807a2483", + 1738 => x"e6387282", + 1739 => x"2c81712b", + 1740 => x"5c537a7c", + 1741 => x"26819838", + 1742 => x"7b7b0653", + 1743 => x"7282f138", + 1744 => x"79fc0684", + 1745 => x"055a7a10", + 1746 => x"707d0654", + 1747 => x"5b7282e0", + 1748 => x"38841a5a", + 1749 => x"f1398817", + 1750 => x"8c110858", + 1751 => x"5876782e", + 1752 => x"098106fc", + 1753 => x"c238821a", + 1754 => x"5afdec39", + 1755 => x"78177981", + 1756 => x"0784190c", + 1757 => x"7080d4dc", + 1758 => x"0c7080d4", + 1759 => x"d80c80d4", + 1760 => x"d00b8c12", + 1761 => x"0c8c1108", + 1762 => x"88120c74", + 1763 => x"81078412", + 1764 => x"0c741175", + 1765 => x"710c5153", + 1766 => x"7d5188c6", + 1767 => x"3f881754", + 1768 => x"fcac3980", + 1769 => x"d4c80b84", + 1770 => x"05087a54", + 1771 => x"5c798025", + 1772 => x"fef83882", + 1773 => x"da397a09", + 1774 => x"7c067080", + 1775 => x"d4c80b84", + 1776 => x"050c5c7a", + 1777 => x"105b7a7c", + 1778 => x"2685387a", + 1779 => x"85b83880", + 1780 => x"d4c80b88", + 1781 => x"05087084", + 1782 => x"1208fc06", + 1783 => x"707c317c", + 1784 => x"72268f72", + 1785 => x"25075757", + 1786 => x"5c5d5572", + 1787 => x"802e80db", + 1788 => x"38797a16", + 1789 => x"80d4c008", + 1790 => x"1b90115a", + 1791 => x"55575b80", + 1792 => x"d4bc08ff", + 1793 => x"2e8838a0", + 1794 => x"8f13e080", + 1795 => x"06577652", + 1796 => x"7d5187cf", + 1797 => x"3f800854", + 1798 => x"8008ff2e", + 1799 => x"90388008", + 1800 => x"76278299", + 1801 => x"387480d4", + 1802 => x"c82e8291", + 1803 => x"3880d4c8", + 1804 => x"0b880508", + 1805 => x"55841508", + 1806 => x"fc06707a", + 1807 => x"317a7226", + 1808 => x"8f722507", + 1809 => x"52555372", + 1810 => x"83e63874", + 1811 => x"79810784", + 1812 => x"170c7916", + 1813 => x"7080d4c8", + 1814 => x"0b88050c", + 1815 => x"75810784", + 1816 => x"120c547e", + 1817 => x"525786fa", + 1818 => x"3f881754", + 1819 => x"fae03975", + 1820 => x"832a7054", + 1821 => x"54807424", + 1822 => x"819b3872", + 1823 => x"822c8171", + 1824 => x"2b80d4cc", + 1825 => x"08077080", + 1826 => x"d4c80b84", + 1827 => x"050c7510", + 1828 => x"101080d4", + 1829 => x"c8058811", + 1830 => x"08585a5d", + 1831 => x"53778c18", + 1832 => x"0c748818", + 1833 => x"0c768819", + 1834 => x"0c768c16", + 1835 => x"0cfcf339", + 1836 => x"797a1010", + 1837 => x"1080d4c8", + 1838 => x"05705759", + 1839 => x"5d8c1508", + 1840 => x"5776752e", + 1841 => x"a3388417", + 1842 => x"08fc0670", + 1843 => x"7a315556", + 1844 => x"738f2483", + 1845 => x"ca387380", + 1846 => x"25848138", + 1847 => x"8c170857", + 1848 => x"76752e09", + 1849 => x"8106df38", + 1850 => x"8815811b", + 1851 => x"70830655", + 1852 => x"5b5572c9", + 1853 => x"387c8306", + 1854 => x"5372802e", + 1855 => x"fdb838ff", + 1856 => x"1df81959", + 1857 => x"5d881808", + 1858 => x"782eea38", + 1859 => x"fdb53983", + 1860 => x"1a53fc96", + 1861 => x"39831470", + 1862 => x"822c8171", + 1863 => x"2b80d4cc", + 1864 => x"08077080", + 1865 => x"d4c80b84", + 1866 => x"050c7610", + 1867 => x"101080d4", + 1868 => x"c8058811", + 1869 => x"08595b5e", + 1870 => x"5153fee1", + 1871 => x"3980d48c", + 1872 => x"08175880", + 1873 => x"08762e81", + 1874 => x"8d3880d4", + 1875 => x"bc08ff2e", + 1876 => x"83ec3873", + 1877 => x"76311880", + 1878 => x"d48c0c73", + 1879 => x"87067057", + 1880 => x"5372802e", + 1881 => x"88388873", + 1882 => x"31701555", + 1883 => x"5676149f", + 1884 => x"ff06a080", + 1885 => x"71311770", + 1886 => x"547f5357", + 1887 => x"5384e43f", + 1888 => x"80085380", + 1889 => x"08ff2e81", + 1890 => x"a03880d4", + 1891 => x"8c081670", + 1892 => x"80d48c0c", + 1893 => x"747580d4", + 1894 => x"c80b8805", + 1895 => x"0c747631", + 1896 => x"18708107", + 1897 => x"51555658", + 1898 => x"7b80d4c8", + 1899 => x"2e839c38", + 1900 => x"798f2682", + 1901 => x"cb38810b", + 1902 => x"84150c84", + 1903 => x"1508fc06", + 1904 => x"707a317a", + 1905 => x"72268f72", + 1906 => x"25075255", + 1907 => x"5372802e", + 1908 => x"fcf93880", + 1909 => x"db398008", + 1910 => x"9fff0653", + 1911 => x"72feeb38", + 1912 => x"7780d48c", + 1913 => x"0c80d4c8", + 1914 => x"0b880508", + 1915 => x"7b188107", + 1916 => x"84120c55", + 1917 => x"80d4b808", + 1918 => x"78278638", + 1919 => x"7780d4b8", + 1920 => x"0c80d4b4", + 1921 => x"087827fc", + 1922 => x"ac387780", + 1923 => x"d4b40c84", + 1924 => x"1508fc06", + 1925 => x"707a317a", + 1926 => x"72268f72", + 1927 => x"25075255", + 1928 => x"5372802e", + 1929 => x"fca53888", + 1930 => x"39807454", + 1931 => x"56fedb39", + 1932 => x"7d5183ae", + 1933 => x"3f800b80", + 1934 => x"0c8f3d0d", + 1935 => x"04735380", + 1936 => x"7424a938", + 1937 => x"72822c81", + 1938 => x"712b80d4", + 1939 => x"cc080770", + 1940 => x"80d4c80b", + 1941 => x"84050c5d", + 1942 => x"53778c18", + 1943 => x"0c748818", + 1944 => x"0c768819", + 1945 => x"0c768c16", + 1946 => x"0cf9b739", + 1947 => x"83147082", + 1948 => x"2c81712b", + 1949 => x"80d4cc08", + 1950 => x"077080d4", + 1951 => x"c80b8405", + 1952 => x"0c5e5153", + 1953 => x"d4397b7b", + 1954 => x"065372fc", + 1955 => x"a338841a", + 1956 => x"7b105c5a", + 1957 => x"f139ff1a", + 1958 => x"8111515a", + 1959 => x"f7b93978", + 1960 => x"17798107", + 1961 => x"84190c8c", + 1962 => x"18088819", + 1963 => x"08718c12", + 1964 => x"0c88120c", + 1965 => x"597080d4", + 1966 => x"dc0c7080", + 1967 => x"d4d80c80", + 1968 => x"d4d00b8c", + 1969 => x"120c8c11", + 1970 => x"0888120c", + 1971 => x"74810784", + 1972 => x"120c7411", + 1973 => x"75710c51", + 1974 => x"53f9bd39", + 1975 => x"75178411", + 1976 => x"08810784", + 1977 => x"120c538c", + 1978 => x"17088818", + 1979 => x"08718c12", + 1980 => x"0c88120c", + 1981 => x"587d5181", + 1982 => x"e93f8817", + 1983 => x"54f5cf39", + 1984 => x"7284150c", + 1985 => x"f41af806", + 1986 => x"70841e08", + 1987 => x"81060784", + 1988 => x"1e0c701d", + 1989 => x"545b850b", + 1990 => x"84140c85", + 1991 => x"0b88140c", + 1992 => x"8f7b27fd", + 1993 => x"cf38881c", + 1994 => x"527d51ec", + 1995 => x"9d3f80d4", + 1996 => x"c80b8805", + 1997 => x"0880d48c", + 1998 => x"085955fd", + 1999 => x"b7397780", + 2000 => x"d48c0c73", + 2001 => x"80d4bc0c", + 2002 => x"fc913972", + 2003 => x"84150cfd", + 2004 => x"a339fc3d", + 2005 => x"0d767971", + 2006 => x"028c059f", + 2007 => x"05335755", + 2008 => x"53558372", + 2009 => x"278a3874", + 2010 => x"83065170", + 2011 => x"802ea238", + 2012 => x"ff125271", + 2013 => x"ff2e9338", + 2014 => x"73737081", + 2015 => x"055534ff", + 2016 => x"125271ff", + 2017 => x"2e098106", + 2018 => x"ef387480", + 2019 => x"0c863d0d", + 2020 => x"04747488", + 2021 => x"2b750770", + 2022 => x"71902b07", + 2023 => x"5154518f", + 2024 => x"7227a538", + 2025 => x"72717084", + 2026 => x"05530c72", + 2027 => x"71708405", + 2028 => x"530c7271", + 2029 => x"70840553", + 2030 => x"0c727170", + 2031 => x"8405530c", + 2032 => x"f0125271", + 2033 => x"8f26dd38", + 2034 => x"83722790", + 2035 => x"38727170", + 2036 => x"8405530c", + 2037 => x"fc125271", + 2038 => x"8326f238", + 2039 => x"7053ff90", + 2040 => x"390404fd", + 2041 => x"3d0d800b", + 2042 => x"80dd800c", + 2043 => x"765184ee", + 2044 => x"3f800853", + 2045 => x"8008ff2e", + 2046 => x"88387280", + 2047 => x"0c853d0d", + 2048 => x"0480dd80", + 2049 => x"08547380", + 2050 => x"2ef03875", + 2051 => x"74710c52", + 2052 => x"72800c85", + 2053 => x"3d0d04f9", + 2054 => x"3d0d797c", + 2055 => x"557b548e", + 2056 => x"11227090", + 2057 => x"2b70902c", + 2058 => x"555780cd", + 2059 => x"8c085358", + 2060 => x"5683f33f", + 2061 => x"80085780", + 2062 => x"0b800824", + 2063 => x"933880d0", + 2064 => x"16088008", + 2065 => x"0580d017", + 2066 => x"0c76800c", + 2067 => x"893d0d04", + 2068 => x"8c162283", + 2069 => x"dfff0655", + 2070 => x"748c1723", + 2071 => x"76800c89", + 2072 => x"3d0d04fa", + 2073 => x"3d0d788c", + 2074 => x"11227088", + 2075 => x"2a708106", + 2076 => x"51575856", + 2077 => x"74a9388c", + 2078 => x"162283df", + 2079 => x"ff065574", + 2080 => x"8c17237a", + 2081 => x"5479538e", + 2082 => x"16227090", + 2083 => x"2b70902c", + 2084 => x"545680cd", + 2085 => x"8c085256", + 2086 => x"81b23f88", + 2087 => x"3d0d0482", + 2088 => x"5480538e", + 2089 => x"16227090", + 2090 => x"2b70902c", + 2091 => x"545680cd", + 2092 => x"8c085257", + 2093 => x"82b83f8c", + 2094 => x"162283df", + 2095 => x"ff065574", + 2096 => x"8c17237a", + 2097 => x"5479538e", + 2098 => x"16227090", + 2099 => x"2b70902c", + 2100 => x"545680cd", + 2101 => x"8c085256", + 2102 => x"80f23f88", + 2103 => x"3d0d04f9", + 2104 => x"3d0d797c", + 2105 => x"557b548e", + 2106 => x"11227090", + 2107 => x"2b70902c", + 2108 => x"555780cd", + 2109 => x"8c085358", + 2110 => x"5681f33f", + 2111 => x"80085780", + 2112 => x"08ff2e99", + 2113 => x"388c1622", + 2114 => x"a0800755", + 2115 => x"748c1723", + 2116 => x"800880d0", + 2117 => x"170c7680", + 2118 => x"0c893d0d", + 2119 => x"048c1622", + 2120 => x"83dfff06", + 2121 => x"55748c17", + 2122 => x"2376800c", + 2123 => x"893d0d04", + 2124 => x"fe3d0d74", + 2125 => x"8e112270", + 2126 => x"902b7090", + 2127 => x"2c555151", + 2128 => x"5380cd8c", + 2129 => x"0851bd3f", + 2130 => x"843d0d04", + 2131 => x"fb3d0d80", + 2132 => x"0b80dd80", + 2133 => x"0c7a5379", + 2134 => x"52785182", + 2135 => x"fc3f8008", + 2136 => x"558008ff", + 2137 => x"2e883874", + 2138 => x"800c873d", + 2139 => x"0d0480dd", + 2140 => x"80085675", + 2141 => x"802ef038", + 2142 => x"7776710c", + 2143 => x"5474800c", + 2144 => x"873d0d04", + 2145 => x"fd3d0d80", + 2146 => x"0b80dd80", + 2147 => x"0c765184", + 2148 => x"c63f8008", + 2149 => x"538008ff", + 2150 => x"2e883872", + 2151 => x"800c853d", + 2152 => x"0d0480dd", + 2153 => x"80085473", + 2154 => x"802ef038", + 2155 => x"7574710c", + 2156 => x"5272800c", + 2157 => x"853d0d04", + 2158 => x"fc3d0d80", + 2159 => x"0b80dd80", + 2160 => x"0c785277", + 2161 => x"5186ac3f", + 2162 => x"80085480", + 2163 => x"08ff2e88", + 2164 => x"3873800c", + 2165 => x"863d0d04", + 2166 => x"80dd8008", + 2167 => x"5574802e", + 2168 => x"f0387675", + 2169 => x"710c5373", + 2170 => x"800c863d", + 2171 => x"0d04fb3d", + 2172 => x"0d800b80", + 2173 => x"dd800c7a", + 2174 => x"53795278", + 2175 => x"5184893f", + 2176 => x"80085580", + 2177 => x"08ff2e88", + 2178 => x"3874800c", + 2179 => x"873d0d04", + 2180 => x"80dd8008", + 2181 => x"5675802e", + 2182 => x"f0387776", + 2183 => x"710c5474", + 2184 => x"800c873d", + 2185 => x"0d04fb3d", + 2186 => x"0d800b80", + 2187 => x"dd800c7a", + 2188 => x"53795278", + 2189 => x"5182963f", + 2190 => x"80085580", + 2191 => x"08ff2e88", + 2192 => x"3874800c", + 2193 => x"873d0d04", + 2194 => x"80dd8008", + 2195 => x"5675802e", + 2196 => x"f0387776", + 2197 => x"710c5474", + 2198 => x"800c873d", + 2199 => x"0d04fe3d", + 2200 => x"0d80dcf8", + 2201 => x"0851708a", + 2202 => x"3880dd84", + 2203 => x"7080dcf8", + 2204 => x"0c517075", + 2205 => x"125252ff", + 2206 => x"537087fb", + 2207 => x"80802688", + 2208 => x"387080dc", + 2209 => x"f80c7153", + 2210 => x"72800c84", + 2211 => x"3d0d04fd", + 2212 => x"3d0d800b", + 2213 => x"80cd8008", + 2214 => x"54547281", + 2215 => x"2e9b3873", + 2216 => x"80dcfc0c", + 2217 => x"c4803fc2", + 2218 => x"d73f80dc", + 2219 => x"d0528151", + 2220 => x"c5c63f80", + 2221 => x"085185bb", + 2222 => x"3f7280dc", + 2223 => x"fc0cc3e6", + 2224 => x"3fc2bd3f", + 2225 => x"80dcd052", + 2226 => x"8151c5ac", + 2227 => x"3f800851", + 2228 => x"85a13f00", + 2229 => x"ff3900ff", + 2230 => x"39f53d0d", + 2231 => x"7e6080dc", + 2232 => x"fc08705b", + 2233 => x"585b5b75", + 2234 => x"80c23877", + 2235 => x"7a25a138", + 2236 => x"771b7033", + 2237 => x"7081ff06", + 2238 => x"58585975", + 2239 => x"8a2e9838", + 2240 => x"7681ff06", + 2241 => x"51c2fe3f", + 2242 => x"81185879", + 2243 => x"7824e138", + 2244 => x"79800c8d", + 2245 => x"3d0d048d", + 2246 => x"51c2ea3f", + 2247 => x"78337081", + 2248 => x"ff065257", + 2249 => x"c2df3f81", + 2250 => x"1858e039", + 2251 => x"79557a54", + 2252 => x"7d538552", + 2253 => x"8d3dfc05", + 2254 => x"51c2873f", + 2255 => x"80085684", + 2256 => x"ab3f7b80", + 2257 => x"080c7580", + 2258 => x"0c8d3d0d", + 2259 => x"04f63d0d", + 2260 => x"7d7f80dc", + 2261 => x"fc08705b", + 2262 => x"585a5a75", + 2263 => x"80c13877", + 2264 => x"7925b338", + 2265 => x"c1fa3f80", + 2266 => x"0881ff06", + 2267 => x"708d3270", + 2268 => x"30709f2a", + 2269 => x"51515757", + 2270 => x"768a2e80", + 2271 => x"c3387580", + 2272 => x"2ebe3877", + 2273 => x"1a567676", + 2274 => x"347651c1", + 2275 => x"f83f8118", + 2276 => x"58787824", + 2277 => x"cf387756", + 2278 => x"75800c8c", + 2279 => x"3d0d0478", + 2280 => x"5579547c", + 2281 => x"5384528c", + 2282 => x"3dfc0551", + 2283 => x"c1943f80", + 2284 => x"085683b8", + 2285 => x"3f7a8008", + 2286 => x"0c75800c", + 2287 => x"8c3d0d04", + 2288 => x"771a568a", + 2289 => x"76348118", + 2290 => x"588d51c1", + 2291 => x"b83f8a51", + 2292 => x"c1b33f77", + 2293 => x"56c239fb", + 2294 => x"3d0d80dc", + 2295 => x"fc087056", + 2296 => x"54738838", + 2297 => x"74800c87", + 2298 => x"3d0d0477", + 2299 => x"53835287", + 2300 => x"3dfc0551", + 2301 => x"c0cc3f80", + 2302 => x"085482f0", + 2303 => x"3f758008", + 2304 => x"0c73800c", + 2305 => x"873d0d04", + 2306 => x"fa3d0d80", + 2307 => x"dcfc0880", + 2308 => x"2ea2387a", + 2309 => x"55795478", + 2310 => x"53865288", + 2311 => x"3dfc0551", + 2312 => x"c0a03f80", + 2313 => x"085682c4", + 2314 => x"3f768008", + 2315 => x"0c75800c", + 2316 => x"883d0d04", + 2317 => x"82b63f9d", + 2318 => x"0b80080c", + 2319 => x"ff0b800c", + 2320 => x"883d0d04", + 2321 => x"fb3d0d77", + 2322 => x"79565680", + 2323 => x"70545473", + 2324 => x"75259f38", + 2325 => x"74101010", + 2326 => x"f8055272", + 2327 => x"16703370", + 2328 => x"742b7607", + 2329 => x"8116f816", + 2330 => x"56565651", + 2331 => x"51747324", + 2332 => x"ea387380", + 2333 => x"0c873d0d", + 2334 => x"04fc3d0d", + 2335 => x"76785555", + 2336 => x"bc538052", + 2337 => x"7351f5ca", + 2338 => x"3f845274", + 2339 => x"51ffb53f", + 2340 => x"80087423", + 2341 => x"84528415", + 2342 => x"51ffa93f", + 2343 => x"80088215", + 2344 => x"23845288", + 2345 => x"1551ff9c", + 2346 => x"3f800884", + 2347 => x"150c8452", + 2348 => x"8c1551ff", + 2349 => x"8f3f8008", + 2350 => x"88152384", + 2351 => x"52901551", + 2352 => x"ff823f80", + 2353 => x"088a1523", + 2354 => x"84529415", + 2355 => x"51fef53f", + 2356 => x"80088c15", + 2357 => x"23845298", + 2358 => x"1551fee8", + 2359 => x"3f80088e", + 2360 => x"15238852", + 2361 => x"9c1551fe", + 2362 => x"db3f8008", + 2363 => x"90150c86", + 2364 => x"3d0d04e9", + 2365 => x"3d0d6a80", + 2366 => x"dcfc0857", + 2367 => x"57759338", + 2368 => x"80c0800b", + 2369 => x"84180c75", + 2370 => x"ac180c75", + 2371 => x"800c993d", + 2372 => x"0d04893d", + 2373 => x"70556a54", + 2374 => x"558a5299", + 2375 => x"3dffbc05", + 2376 => x"51ffbe9e", + 2377 => x"3f800877", + 2378 => x"53755256", + 2379 => x"fecb3fbc", + 2380 => x"3f778008", + 2381 => x"0c75800c", + 2382 => x"993d0d04", + 2383 => x"fc3d0d81", + 2384 => x"5480dcfc", + 2385 => x"08883873", + 2386 => x"800c863d", + 2387 => x"0d047653", + 2388 => x"97b95286", + 2389 => x"3dfc0551", + 2390 => x"ffbde73f", + 2391 => x"8008548c", + 2392 => x"3f748008", + 2393 => x"0c73800c", + 2394 => x"863d0d04", + 2395 => x"80cd8c08", + 2396 => x"800c04f7", + 2397 => x"3d0d7b80", + 2398 => x"cd8c0882", + 2399 => x"c811085a", + 2400 => x"545a7780", + 2401 => x"2e80da38", + 2402 => x"81881884", + 2403 => x"1908ff05", + 2404 => x"81712b59", + 2405 => x"55598074", + 2406 => x"2480ea38", + 2407 => x"807424b5", + 2408 => x"3873822b", + 2409 => x"78118805", + 2410 => x"56568180", + 2411 => x"19087706", + 2412 => x"5372802e", + 2413 => x"b6387816", + 2414 => x"70085353", + 2415 => x"79517408", + 2416 => x"53722dff", + 2417 => x"14fc17fc", + 2418 => x"1779812c", + 2419 => x"5a575754", + 2420 => x"738025d6", + 2421 => x"38770858", + 2422 => x"77ffad38", + 2423 => x"80cd8c08", + 2424 => x"53bc1308", + 2425 => x"a5387951", + 2426 => x"f9e93f74", + 2427 => x"0853722d", + 2428 => x"ff14fc17", + 2429 => x"fc177981", + 2430 => x"2c5a5757", + 2431 => x"54738025", + 2432 => x"ffa838d1", + 2433 => x"398057ff", + 2434 => x"93397251", + 2435 => x"bc130853", + 2436 => x"722d7951", + 2437 => x"f9bd3fff", + 2438 => x"3d0d80dc", + 2439 => x"d80bfc05", + 2440 => x"70085252", + 2441 => x"70ff2e91", + 2442 => x"38702dfc", + 2443 => x"12700852", + 2444 => x"5270ff2e", + 2445 => x"098106f1", + 2446 => x"38833d0d", + 2447 => x"0404ffbd", + 2448 => x"d23f0400", + 2449 => x"00000040", + 2450 => x"48656c6c", + 2451 => x"6f20776f", + 2452 => x"726c6421", + 2453 => x"00000000", + 2454 => x"0a000000", + 2455 => x"43000000", + 2456 => x"64756d6d", + 2457 => x"792e6578", + 2458 => x"65000000", + 2459 => x"00ffffff", + 2460 => x"ff00ffff", + 2461 => x"ffff00ff", + 2462 => x"ffffff00", + 2463 => x"00000000", + 2464 => x"00000000", + 2465 => x"00000000", + 2466 => x"00002e60", + 2467 => x"00002690", + 2468 => x"00000000", + 2469 => x"000028f8", + 2470 => x"00002954", + 2471 => x"000029b0", + 2472 => x"00000000", + 2473 => x"00000000", + 2474 => x"00000000", + 2475 => x"00000000", + 2476 => x"00000000", + 2477 => x"00000000", + 2478 => x"00000000", + 2479 => x"00000000", + 2480 => x"00000000", + 2481 => x"0000265c", + 2482 => x"00000000", + 2483 => x"00000000", + 2484 => x"00000000", + 2485 => x"00000000", + 2486 => x"00000000", + 2487 => x"00000000", + 2488 => x"00000000", + 2489 => x"00000000", + 2490 => x"00000000", + 2491 => x"00000000", + 2492 => x"00000000", + 2493 => x"00000000", + 2494 => x"00000000", + 2495 => x"00000000", + 2496 => x"00000000", + 2497 => x"00000000", + 2498 => x"00000000", + 2499 => x"00000000", + 2500 => x"00000000", + 2501 => x"00000000", + 2502 => x"00000000", + 2503 => x"00000000", + 2504 => x"00000000", + 2505 => x"00000000", + 2506 => x"00000000", + 2507 => x"00000000", + 2508 => x"00000000", + 2509 => x"00000000", + 2510 => x"00000001", + 2511 => x"330eabcd", + 2512 => x"1234e66d", + 2513 => x"deec0005", + 2514 => x"000b0000", + 2515 => x"00000000", + 2516 => x"00000000", + 2517 => x"00000000", + 2518 => x"00000000", + 2519 => x"00000000", + 2520 => x"00000000", + 2521 => x"00000000", + 2522 => x"00000000", + 2523 => x"00000000", + 2524 => x"00000000", + 2525 => x"00000000", + 2526 => x"00000000", + 2527 => x"00000000", + 2528 => x"00000000", + 2529 => x"00000000", + 2530 => x"00000000", + 2531 => x"00000000", + 2532 => x"00000000", + 2533 => x"00000000", + 2534 => x"00000000", + 2535 => x"00000000", + 2536 => x"00000000", + 2537 => x"00000000", + 2538 => x"00000000", + 2539 => x"00000000", + 2540 => x"00000000", + 2541 => x"00000000", + 2542 => x"00000000", + 2543 => x"00000000", + 2544 => x"00000000", + 2545 => x"00000000", + 2546 => x"00000000", + 2547 => x"00000000", + 2548 => x"00000000", + 2549 => x"00000000", + 2550 => x"00000000", + 2551 => x"00000000", + 2552 => x"00000000", + 2553 => x"00000000", + 2554 => x"00000000", + 2555 => x"00000000", + 2556 => x"00000000", + 2557 => x"00000000", + 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"00000000", + 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"00000000", + 2597 => x"00000000", + 2598 => x"00000000", + 2599 => x"00000000", + 2600 => x"00000000", + 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"ffffffff", + 2704 => x"00000000", + 2705 => x"00020000", + 2706 => x"00000000", + 2707 => x"00000000", + 2708 => x"00002a48", + 2709 => x"00002a48", + 2710 => x"00002a50", + 2711 => x"00002a50", + 2712 => x"00002a58", + 2713 => x"00002a58", + 2714 => x"00002a60", + 2715 => x"00002a60", + 2716 => x"00002a68", + 2717 => x"00002a68", + 2718 => x"00002a70", + 2719 => x"00002a70", + 2720 => x"00002a78", + 2721 => x"00002a78", + 2722 => x"00002a80", + 2723 => x"00002a80", + 2724 => x"00002a88", + 2725 => x"00002a88", + 2726 => x"00002a90", + 2727 => x"00002a90", + 2728 => x"00002a98", + 2729 => x"00002a98", + 2730 => x"00002aa0", + 2731 => x"00002aa0", + 2732 => x"00002aa8", + 2733 => x"00002aa8", + 2734 => x"00002ab0", + 2735 => x"00002ab0", + 2736 => x"00002ab8", + 2737 => x"00002ab8", + 2738 => x"00002ac0", + 2739 => x"00002ac0", + 2740 => x"00002ac8", + 2741 => x"00002ac8", + 2742 => x"00002ad0", + 2743 => x"00002ad0", + 2744 => x"00002ad8", + 2745 => x"00002ad8", + 2746 => x"00002ae0", + 2747 => x"00002ae0", + 2748 => x"00002ae8", + 2749 => x"00002ae8", + 2750 => x"00002af0", + 2751 => x"00002af0", + 2752 => x"00002af8", + 2753 => x"00002af8", + 2754 => x"00002b00", + 2755 => x"00002b00", + 2756 => x"00002b08", + 2757 => x"00002b08", + 2758 => x"00002b10", + 2759 => x"00002b10", + 2760 => x"00002b18", + 2761 => x"00002b18", + 2762 => x"00002b20", + 2763 => x"00002b20", + 2764 => x"00002b28", + 2765 => x"00002b28", + 2766 => x"00002b30", + 2767 => x"00002b30", + 2768 => x"00002b38", + 2769 => x"00002b38", + 2770 => x"00002b40", + 2771 => x"00002b40", + 2772 => x"00002b48", + 2773 => x"00002b48", + 2774 => x"00002b50", + 2775 => x"00002b50", + 2776 => x"00002b58", + 2777 => x"00002b58", + 2778 => x"00002b60", + 2779 => x"00002b60", + 2780 => x"00002b68", + 2781 => x"00002b68", + 2782 => x"00002b70", + 2783 => x"00002b70", + 2784 => x"00002b78", + 2785 => x"00002b78", + 2786 => x"00002b80", + 2787 => x"00002b80", + 2788 => x"00002b88", + 2789 => x"00002b88", + 2790 => x"00002b90", + 2791 => x"00002b90", + 2792 => x"00002b98", + 2793 => x"00002b98", + 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"00002660", + 2965 => x"ffffffff", + 2966 => x"00000000", + 2967 => x"ffffffff", + 2968 => x"00000000", + 2969 => x"00000000", + +others => x"00000000" +); +begin + busy_o <= re_i; -- we're done on the cycle after we serve the read request + + do_ram: + process (clk_i) + variable iaddr : integer; + begin + if rising_edge(clk_i) then + if we_i='1' then + ram(to_integer(addr_i)) <= write_i; + end if; + addr_r <= addr_i; + end if; + end process do_ram; + read_o <= ram(to_integer(addr_r)); +end architecture Xilinx; -- Entity: SinglePortRAM + diff --git a/zpu/hdl/zealot/roms/hello_dbram.vhdl b/zpu/hdl/zealot/roms/hello_dbram.vhdl new file mode 100644 index 0000000..28cac6f --- /dev/null +++ b/zpu/hdl/zealot/roms/hello_dbram.vhdl @@ -0,0 +1,3035 @@ +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity DualPortRAM is + generic( + WORD_SIZE : integer:=32; -- Word Size 16/32 + BYTE_BITS : integer:=2; -- Bits used to address bytes + BRAM_W : integer:=15); -- Address Width + port( + clk_i : in std_logic; + -- Port A + a_we_i : in std_logic; + a_addr_i : in unsigned(BRAM_W-1 downto BYTE_BITS); + a_write_i : in unsigned(WORD_SIZE-1 downto 0); + a_read_o : out unsigned(WORD_SIZE-1 downto 0); + -- Port B + b_we_i : in std_logic; + b_addr_i : in unsigned(BRAM_W-1 downto BYTE_BITS); + b_write_i : in unsigned(WORD_SIZE-1 downto 0); + b_read_o : out unsigned(WORD_SIZE-1 downto 0)); +end entity DualPortRAM; + +architecture DualPort_Arch of DualPortRAM is + type ram_type is array(natural range 0 to ((2**BRAM_W)/4)-1) of unsigned(WORD_SIZE-1 downto 0); + + shared variable ram : ram_type:= +( + 0 => x"0b0b0b0b", + 1 => x"82700b0b", + 2 => x"80cd800c", + 3 => x"3a0b0b80", + 4 => x"c58f0400", + 5 => x"00000000", + 6 => x"00000000", + 7 => x"00000000", + 8 => x"80088408", + 9 => x"88080b0b", + 10 => x"80c5d62d", + 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"0b0b80cc", + 162 => x"ec738306", + 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"8a2d5050", + 172 => x"80085688", + 173 => x"0c840c80", + 174 => x"0c510400", + 175 => x"00000000", + 176 => x"80088408", + 177 => x"88087575", + 178 => x"0b0b0b8c", + 179 => x"bc2d5050", + 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"80ccfc0c", + 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"82c73f80", + 257 => x"c4913f04", + 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"0b80dce8", + 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"0b0b80dc", + 291 => x"e8085271", + 292 => x"0870882a", + 293 => x"81327081", + 294 => x"06515151", + 295 => x"70f13873", + 296 => x"720c833d", + 297 => x"0d0480cc", + 298 => x"fc08802e", + 299 => x"a43880cd", + 300 => x"8008822e", + 301 => x"bd388380", + 302 => x"800b0b0b", + 303 => x"80dce80c", + 304 => x"82a0800b", + 305 => x"80dcec0c", + 306 => x"8290800b", + 307 => x"80dcf00c", + 308 => x"04f88080", + 309 => x"80a40b0b", + 310 => x"0b80dce8", + 311 => x"0cf88080", + 312 => x"82800b80", + 313 => x"dcec0cf8", + 314 => x"80808480", + 315 => x"0b80dcf0", + 316 => x"0c0480c0", + 317 => x"a8808c0b", + 318 => x"0b0b80dc", + 319 => x"e80c80c0", + 320 => x"a880940b", + 321 => x"80dcec0c", + 322 => x"0b0b80cc", + 323 => x"c40b80dc", + 324 => x"f00c04ff", + 325 => x"3d0d80dc", + 326 => x"f4335170", + 327 => x"a73880cd", + 328 => x"88087008", + 329 => x"52527080", + 330 => x"2e943884", + 331 => x"1280cd88", + 332 => x"0c702d80", + 333 => x"cd880870", + 334 => x"08525270", + 335 => x"ee38810b", + 336 => x"80dcf434", + 337 => x"833d0d04", + 338 => x"04803d0d", + 339 => x"0b0b80dc", + 340 => x"e408802e", + 341 => x"8e380b0b", + 342 => x"0b0b800b", + 343 => x"802e0981", + 344 => x"06853882", + 345 => x"3d0d040b", + 346 => x"0b80dce4", + 347 => x"510b0b0b", + 348 => x"f58e3f82", + 349 => x"3d0d0404", + 350 => x"803d0d80", + 351 => x"ccc85185", + 352 => x"de3f800b", + 353 => x"800c823d", + 354 => x"0d048c08", + 355 => x"028c0cf9", + 356 => x"3d0d800b", + 357 => x"8c08fc05", + 358 => x"0c8c0888", + 359 => x"05088025", + 360 => x"ab388c08", + 361 => x"88050830", + 362 => x"8c088805", + 363 => x"0c800b8c", + 364 => x"08f4050c", + 365 => x"8c08fc05", + 366 => x"08883881", + 367 => x"0b8c08f4", + 368 => x"050c8c08", + 369 => x"f405088c", + 370 => x"08fc050c", + 371 => x"8c088c05", + 372 => x"088025ab", + 373 => x"388c088c", + 374 => x"0508308c", + 375 => x"088c050c", + 376 => x"800b8c08", + 377 => x"f0050c8c", + 378 => x"08fc0508", + 379 => x"8838810b", + 380 => x"8c08f005", + 381 => x"0c8c08f0", + 382 => x"05088c08", + 383 => x"fc050c80", + 384 => x"538c088c", + 385 => x"0508528c", + 386 => x"08880508", + 387 => x"5181a73f", + 388 => x"8008708c", + 389 => x"08f8050c", + 390 => x"548c08fc", + 391 => x"0508802e", + 392 => x"8c388c08", + 393 => x"f8050830", + 394 => x"8c08f805", + 395 => x"0c8c08f8", + 396 => x"05087080", + 397 => x"0c54893d", + 398 => x"0d8c0c04", + 399 => x"8c08028c", + 400 => x"0cfb3d0d", + 401 => x"800b8c08", + 402 => x"fc050c8c", + 403 => x"08880508", + 404 => x"80259338", + 405 => x"8c088805", + 406 => x"08308c08", + 407 => x"88050c81", + 408 => x"0b8c08fc", + 409 => x"050c8c08", + 410 => x"8c050880", + 411 => x"258c388c", + 412 => x"088c0508", + 413 => x"308c088c", + 414 => x"050c8153", + 415 => x"8c088c05", + 416 => x"08528c08", + 417 => x"88050851", + 418 => x"ad3f8008", + 419 => x"708c08f8", + 420 => x"050c548c", + 421 => x"08fc0508", + 422 => x"802e8c38", + 423 => x"8c08f805", + 424 => x"08308c08", + 425 => x"f8050c8c", + 426 => x"08f80508", + 427 => x"70800c54", + 428 => x"873d0d8c", + 429 => x"0c048c08", + 430 => x"028c0cfd", + 431 => x"3d0d810b", + 432 => x"8c08fc05", + 433 => x"0c800b8c", + 434 => x"08f8050c", + 435 => x"8c088c05", + 436 => x"088c0888", + 437 => x"050827ac", + 438 => x"388c08fc", + 439 => x"0508802e", + 440 => x"a338800b", + 441 => x"8c088c05", + 442 => x"08249938", + 443 => x"8c088c05", + 444 => x"08108c08", + 445 => x"8c050c8c", + 446 => x"08fc0508", + 447 => x"108c08fc", + 448 => x"050cc939", + 449 => x"8c08fc05", + 450 => x"08802e80", + 451 => x"c9388c08", + 452 => x"8c05088c", + 453 => x"08880508", + 454 => x"26a1388c", + 455 => x"08880508", + 456 => x"8c088c05", + 457 => x"08318c08", + 458 => x"88050c8c", + 459 => x"08f80508", + 460 => x"8c08fc05", + 461 => x"08078c08", + 462 => x"f8050c8c", + 463 => x"08fc0508", + 464 => x"812a8c08", + 465 => x"fc050c8c", + 466 => x"088c0508", + 467 => x"812a8c08", + 468 => x"8c050cff", + 469 => x"af398c08", + 470 => x"90050880", + 471 => x"2e8f388c", + 472 => x"08880508", + 473 => x"708c08f4", + 474 => x"050c518d", + 475 => x"398c08f8", + 476 => x"0508708c", + 477 => x"08f4050c", + 478 => x"518c08f4", + 479 => x"0508800c", + 480 => x"853d0d8c", + 481 => x"0c04fc3d", + 482 => x"0d767079", + 483 => x"7b555555", + 484 => x"558f7227", + 485 => x"8c387275", + 486 => x"07830651", + 487 => x"70802ea7", + 488 => x"38ff1252", + 489 => x"71ff2e98", + 490 => x"38727081", + 491 => x"05543374", + 492 => x"70810556", + 493 => x"34ff1252", + 494 => x"71ff2e09", + 495 => x"8106ea38", + 496 => x"74800c86", + 497 => x"3d0d0474", + 498 => x"51727084", + 499 => x"05540871", + 500 => x"70840553", + 501 => x"0c727084", + 502 => x"05540871", + 503 => x"70840553", + 504 => x"0c727084", + 505 => x"05540871", + 506 => x"70840553", + 507 => x"0c727084", + 508 => x"05540871", + 509 => x"70840553", + 510 => x"0cf01252", + 511 => x"718f26c9", + 512 => x"38837227", + 513 => x"95387270", + 514 => x"84055408", + 515 => x"71708405", + 516 => x"530cfc12", + 517 => x"52718326", + 518 => x"ed387054", + 519 => x"ff8339f7", + 520 => x"3d0d7c70", + 521 => x"525380c8", + 522 => x"3f725480", + 523 => x"085580cc", + 524 => x"d8568157", + 525 => x"80088105", + 526 => x"5a8b3de4", + 527 => x"11595382", + 528 => x"59f41352", + 529 => x"7b881108", + 530 => x"52538183", + 531 => x"3f800830", + 532 => x"70800807", + 533 => x"9f2c8a07", + 534 => x"800c538b", + 535 => x"3d0d04ff", + 536 => x"3d0d7352", + 537 => x"80cd8c08", + 538 => x"51ffb43f", + 539 => x"833d0d04", + 540 => x"fd3d0d75", + 541 => x"70718306", + 542 => x"53555270", + 543 => x"b8387170", + 544 => x"087009f7", + 545 => x"fbfdff12", + 546 => x"0670f884", + 547 => x"82818006", + 548 => x"51515253", + 549 => x"709d3884", + 550 => x"13700870", + 551 => x"09f7fbfd", + 552 => x"ff120670", + 553 => x"f8848281", + 554 => x"80065151", + 555 => x"52537080", + 556 => x"2ee53872", + 557 => x"52713351", + 558 => x"70802e8a", + 559 => x"38811270", + 560 => x"33525270", + 561 => x"f8387174", + 562 => x"31800c85", + 563 => x"3d0d04f2", + 564 => x"3d0d6062", + 565 => x"88110870", + 566 => x"57575f5a", + 567 => x"74802e81", + 568 => x"90388c1a", + 569 => x"2270832a", + 570 => x"81327081", + 571 => x"06515558", + 572 => x"73863890", + 573 => x"1a089138", + 574 => x"795190a2", + 575 => x"3fff5480", + 576 => x"0880ee38", + 577 => x"8c1a2258", + 578 => x"7d085780", + 579 => x"7883ffff", + 580 => x"06700a10", + 581 => x"0a708106", + 582 => x"51565755", + 583 => x"73752e80", + 584 => x"d7387490", + 585 => x"38760884", + 586 => x"18088819", + 587 => x"59565974", + 588 => x"802ef238", + 589 => x"74548880", + 590 => x"75278438", + 591 => x"88805473", + 592 => x"5378529c", + 593 => x"1a0851a4", + 594 => x"1a085473", + 595 => x"2d800b80", + 596 => x"082582e6", + 597 => x"38800819", + 598 => x"75800831", + 599 => x"7f880508", + 600 => x"80083170", + 601 => x"6188050c", + 602 => x"56565973", + 603 => x"ffb43880", + 604 => x"5473800c", + 605 => x"903d0d04", + 606 => x"75813270", + 607 => x"81067641", + 608 => x"51547380", + 609 => x"2e81c138", + 610 => x"74903876", + 611 => x"08841808", + 612 => x"88195956", + 613 => x"5974802e", + 614 => x"f238881a", + 615 => x"087883ff", + 616 => x"ff067089", + 617 => x"2a708106", + 618 => x"51565956", + 619 => x"73802e82", + 620 => x"fa387575", + 621 => x"278d3877", + 622 => x"872a7081", + 623 => x"06515473", + 624 => x"82b53874", + 625 => x"76278338", + 626 => x"74567553", + 627 => x"78527908", + 628 => x"5185823f", + 629 => x"881a0876", + 630 => x"31881b0c", + 631 => x"7908167a", + 632 => x"0c745675", + 633 => x"19757731", + 634 => x"7f880508", + 635 => x"78317061", + 636 => x"88050c56", + 637 => x"56597380", + 638 => x"2efef438", + 639 => x"8c1a2258", + 640 => x"ff863977", + 641 => x"78547953", + 642 => x"7b525684", + 643 => x"c83f881a", + 644 => x"08783188", + 645 => x"1b0c7908", + 646 => x"187a0c7c", + 647 => x"76315d7c", + 648 => x"8e387951", + 649 => x"8fdc3f80", + 650 => x"08818f38", + 651 => x"80085f75", + 652 => x"19757731", + 653 => x"7f880508", + 654 => x"78317061", + 655 => x"88050c56", + 656 => x"56597380", + 657 => x"2efea838", + 658 => x"74818338", + 659 => x"76088418", + 660 => x"08881959", + 661 => x"56597480", + 662 => x"2ef23874", + 663 => x"538a5278", + 664 => x"5182d33f", + 665 => x"80087931", + 666 => x"81055d80", + 667 => x"08843881", + 668 => x"155d815f", + 669 => x"7c58747d", + 670 => x"27833874", + 671 => x"58941a08", + 672 => x"881b0811", + 673 => x"575c807a", + 674 => x"085c5490", + 675 => x"1a087b27", + 676 => x"83388154", + 677 => x"75782584", + 678 => x"3873ba38", + 679 => x"7b7824fe", + 680 => x"e2387b53", + 681 => x"78529c1a", + 682 => x"0851a41a", + 683 => x"0854732d", + 684 => x"80085680", + 685 => x"088024fe", + 686 => x"e2388c1a", + 687 => x"2280c007", + 688 => x"54738c1b", + 689 => x"23ff5473", + 690 => x"800c903d", + 691 => x"0d047eff", + 692 => x"a338ff87", + 693 => x"39755378", + 694 => x"527a5182", + 695 => x"f83f7908", + 696 => x"167a0c79", + 697 => x"518e9b3f", + 698 => x"8008cf38", + 699 => x"7c76315d", + 700 => x"7cfebc38", + 701 => x"feac3990", + 702 => x"1a087a08", + 703 => x"71317611", + 704 => x"70565a57", + 705 => x"5280cd8c", + 706 => x"0851848c", + 707 => x"3f800880", + 708 => x"2effa738", + 709 => x"8008901b", + 710 => x"0c800816", + 711 => x"7a0c7794", + 712 => x"1b0c7488", + 713 => x"1b0c7456", + 714 => x"fd993979", + 715 => x"0858901a", + 716 => x"08782783", + 717 => x"38815475", + 718 => x"75278438", + 719 => x"73b33894", + 720 => x"1a085675", + 721 => x"752680d3", + 722 => x"38755378", + 723 => x"529c1a08", + 724 => x"51a41a08", + 725 => x"54732d80", + 726 => x"08568008", + 727 => x"8024fd83", + 728 => x"388c1a22", + 729 => x"80c00754", + 730 => x"738c1b23", + 731 => x"ff54fed7", + 732 => x"39755378", + 733 => x"52775181", + 734 => x"dc3f7908", + 735 => x"167a0c79", + 736 => x"518cff3f", + 737 => x"8008802e", + 738 => x"fcd9388c", + 739 => x"1a2280c0", + 740 => x"0754738c", + 741 => x"1b23ff54", + 742 => x"fead3974", + 743 => x"75547953", + 744 => x"78525681", + 745 => x"b03f881a", + 746 => x"08753188", + 747 => x"1b0c7908", + 748 => x"157a0cfc", + 749 => x"ae39fa3d", + 750 => x"0d7a7902", + 751 => x"8805a705", + 752 => x"33565253", + 753 => x"8373278a", + 754 => x"38708306", + 755 => x"5271802e", + 756 => x"a838ff13", + 757 => x"5372ff2e", + 758 => x"97387033", + 759 => x"5273722e", + 760 => x"91388111", + 761 => x"ff145451", + 762 => x"72ff2e09", + 763 => x"8106eb38", + 764 => x"80517080", + 765 => x"0c883d0d", + 766 => x"04707257", + 767 => x"55835175", + 768 => x"82802914", + 769 => x"ff125256", + 770 => x"708025f3", + 771 => x"38837327", + 772 => x"bf387408", + 773 => x"76327009", + 774 => x"f7fbfdff", + 775 => x"120670f8", + 776 => x"84828180", + 777 => x"06515151", + 778 => x"70802e99", + 779 => x"38745180", + 780 => x"52703357", + 781 => x"73772eff", + 782 => x"b9388111", + 783 => x"81135351", + 784 => x"837227ed", + 785 => x"38fc1384", + 786 => x"16565372", + 787 => x"8326c338", + 788 => x"7451fefe", + 789 => x"39fa3d0d", + 790 => x"787a7c72", + 791 => x"72725757", + 792 => x"57595656", + 793 => x"747627b2", + 794 => x"38761551", + 795 => x"757127aa", + 796 => x"38707717", + 797 => x"ff145455", + 798 => x"5371ff2e", + 799 => x"9638ff14", + 800 => x"ff145454", + 801 => x"72337434", + 802 => x"ff125271", + 803 => x"ff2e0981", + 804 => x"06ec3875", + 805 => x"800c883d", + 806 => x"0d04768f", + 807 => x"269738ff", + 808 => x"125271ff", + 809 => x"2eed3872", + 810 => x"70810554", + 811 => x"33747081", + 812 => x"055634eb", + 813 => x"39747607", + 814 => x"83065170", + 815 => x"e2387575", + 816 => x"54517270", + 817 => x"84055408", + 818 => x"71708405", + 819 => x"530c7270", + 820 => x"84055408", + 821 => x"71708405", + 822 => x"530c7270", + 823 => x"84055408", + 824 => x"71708405", + 825 => x"530c7270", + 826 => x"84055408", + 827 => x"71708405", + 828 => x"530cf012", + 829 => x"52718f26", + 830 => x"c9388372", + 831 => x"27953872", + 832 => x"70840554", + 833 => x"08717084", + 834 => x"05530cfc", + 835 => x"12527183", + 836 => x"26ed3870", + 837 => x"54ff8839", + 838 => x"ef3d0d63", + 839 => x"6567405d", + 840 => x"427b802e", + 841 => x"84fa3861", + 842 => x"51a5b63f", + 843 => x"f81c7084", + 844 => x"120870fc", + 845 => x"0670628b", + 846 => x"0570f806", + 847 => x"4159455b", + 848 => x"5c415796", + 849 => x"742782c3", + 850 => x"38807b24", + 851 => x"7e7c2607", + 852 => x"59805478", + 853 => x"742e0981", + 854 => x"0682a938", + 855 => x"777b2581", + 856 => x"fc387717", + 857 => x"80d4c80b", + 858 => x"8805085e", + 859 => x"567c762e", + 860 => x"84bd3884", + 861 => x"160870fe", + 862 => x"06178411", + 863 => x"08810651", + 864 => x"55557382", + 865 => x"8b3874fc", + 866 => x"06597c76", + 867 => x"2e84dd38", + 868 => x"77195f7e", + 869 => x"7b2581fd", + 870 => x"38798106", + 871 => x"547382bf", + 872 => x"38767708", + 873 => x"31841108", + 874 => x"fc06565a", + 875 => x"75802e91", + 876 => x"387c762e", + 877 => x"84ea3874", + 878 => x"19185978", + 879 => x"7b258489", + 880 => x"3879802e", + 881 => x"82993877", + 882 => x"15567a76", + 883 => x"24829038", + 884 => x"8c1a0888", + 885 => x"1b08718c", + 886 => x"120c8812", + 887 => x"0c557976", + 888 => x"59578817", + 889 => x"61fc0557", + 890 => x"5975a426", + 891 => x"85ef387b", + 892 => x"79555593", + 893 => x"762780c9", + 894 => x"387b7084", + 895 => x"055d087c", + 896 => x"56790c74", + 897 => x"70840556", + 898 => x"088c180c", + 899 => x"9017549b", + 900 => x"7627ae38", + 901 => x"74708405", + 902 => x"5608740c", + 903 => x"74708405", + 904 => x"56089418", + 905 => x"0c981754", + 906 => x"a3762795", + 907 => x"38747084", + 908 => x"05560874", + 909 => x"0c747084", + 910 => x"0556089c", + 911 => x"180ca017", + 912 => x"54747084", + 913 => x"05560874", + 914 => x"70840556", + 915 => x"0c747084", + 916 => x"05560874", + 917 => x"70840556", + 918 => x"0c740874", + 919 => x"0c777b31", + 920 => x"56758f26", + 921 => x"80c93884", + 922 => x"17088106", + 923 => x"78078418", + 924 => x"0c771784", + 925 => x"11088107", + 926 => x"84120c54", + 927 => x"6151a2e2", + 928 => x"3f881754", + 929 => x"73800c93", + 930 => x"3d0d0490", + 931 => x"5bfdba39", + 932 => x"7856fe85", + 933 => x"398c1608", + 934 => x"88170871", + 935 => x"8c120c88", + 936 => x"120c557e", + 937 => x"707c3157", + 938 => x"588f7627", + 939 => x"ffb9387a", + 940 => x"17841808", + 941 => x"81067c07", + 942 => x"84190c76", + 943 => x"81078412", + 944 => x"0c761184", + 945 => x"11088107", + 946 => x"84120c55", + 947 => x"88055261", + 948 => x"518cf73f", + 949 => x"6151a28a", + 950 => x"3f881754", + 951 => x"ffa6397d", + 952 => x"52615194", + 953 => x"f73f8008", + 954 => x"59800880", + 955 => x"2e81a338", + 956 => x"8008f805", + 957 => x"60840508", + 958 => x"fe066105", + 959 => x"55577674", + 960 => x"2e83e638", + 961 => x"fc185675", + 962 => x"a42681aa", + 963 => x"387b8008", + 964 => x"55559376", + 965 => x"2780d838", + 966 => x"74708405", + 967 => x"56088008", + 968 => x"70840580", + 969 => x"0c0c8008", + 970 => x"75708405", + 971 => x"57087170", + 972 => x"8405530c", + 973 => x"549b7627", + 974 => x"b6387470", + 975 => x"84055608", + 976 => x"74708405", + 977 => x"560c7470", + 978 => x"84055608", + 979 => x"74708405", + 980 => x"560ca376", + 981 => x"27993874", + 982 => x"70840556", + 983 => x"08747084", + 984 => x"05560c74", + 985 => x"70840556", + 986 => x"08747084", + 987 => x"05560c74", + 988 => x"70840556", + 989 => x"08747084", + 990 => x"05560c74", + 991 => x"70840556", + 992 => x"08747084", + 993 => x"05560c74", + 994 => x"08740c7b", + 995 => x"5261518b", + 996 => x"b93f6151", + 997 => x"a0cc3f78", + 998 => x"5473800c", + 999 => x"933d0d04", + 1000 => x"7d526151", + 1001 => x"93b63f80", + 1002 => x"08800c93", + 1003 => x"3d0d0484", + 1004 => x"160855fb", + 1005 => x"d1397553", + 1006 => x"7b528008", + 1007 => x"51efc73f", + 1008 => x"7b526151", + 1009 => x"8b843fca", + 1010 => x"398c1608", + 1011 => x"88170871", + 1012 => x"8c120c88", + 1013 => x"120c558c", + 1014 => x"1a08881b", + 1015 => x"08718c12", + 1016 => x"0c88120c", + 1017 => x"55797959", + 1018 => x"57fbf739", + 1019 => x"7719901c", + 1020 => x"55557375", + 1021 => x"24fba238", + 1022 => x"7a177080", + 1023 => x"d4c80b88", + 1024 => x"050c757c", + 1025 => x"31810784", + 1026 => x"120c5d84", + 1027 => x"17088106", + 1028 => x"7b078418", + 1029 => x"0c61519f", + 1030 => x"c93f8817", + 1031 => x"54fce539", + 1032 => x"74191890", + 1033 => x"1c555d73", + 1034 => x"7d24fb95", + 1035 => x"388c1a08", + 1036 => x"881b0871", + 1037 => x"8c120c88", + 1038 => x"120c5588", + 1039 => x"1a61fc05", + 1040 => x"575975a4", + 1041 => x"2681ae38", + 1042 => x"7b795555", + 1043 => x"93762780", + 1044 => x"c9387b70", + 1045 => x"84055d08", + 1046 => x"7c56790c", + 1047 => x"74708405", + 1048 => x"56088c1b", + 1049 => x"0c901a54", + 1050 => x"9b7627ae", + 1051 => x"38747084", + 1052 => x"05560874", + 1053 => x"0c747084", + 1054 => x"05560894", + 1055 => x"1b0c981a", + 1056 => x"54a37627", + 1057 => x"95387470", + 1058 => x"84055608", + 1059 => x"740c7470", + 1060 => x"84055608", + 1061 => x"9c1b0ca0", + 1062 => x"1a547470", + 1063 => x"84055608", + 1064 => x"74708405", + 1065 => x"560c7470", + 1066 => x"84055608", + 1067 => x"74708405", + 1068 => x"560c7408", + 1069 => x"740c7a1a", + 1070 => x"7080d4c8", + 1071 => x"0b88050c", + 1072 => x"7d7c3181", + 1073 => x"0784120c", + 1074 => x"54841a08", + 1075 => x"81067b07", + 1076 => x"841b0c61", + 1077 => x"519e8b3f", + 1078 => x"7854fdbd", + 1079 => x"3975537b", + 1080 => x"527851ed", + 1081 => x"a13ffaf5", + 1082 => x"39841708", + 1083 => x"fc061860", + 1084 => x"5858fae9", + 1085 => x"3975537b", + 1086 => x"527851ed", + 1087 => x"893f7a1a", + 1088 => x"7080d4c8", + 1089 => x"0b88050c", + 1090 => x"7d7c3181", + 1091 => x"0784120c", + 1092 => x"54841a08", + 1093 => x"81067b07", + 1094 => x"841b0cff", + 1095 => x"b639fa3d", + 1096 => x"0d7880cd", + 1097 => x"8c085455", + 1098 => x"b8130880", + 1099 => x"2e81b638", + 1100 => x"8c152270", + 1101 => x"83ffff06", + 1102 => x"70832a81", + 1103 => x"32708106", + 1104 => x"51555556", + 1105 => x"72802e80", + 1106 => x"dc387384", + 1107 => x"2a813281", + 1108 => x"0657ff53", + 1109 => x"7680f738", + 1110 => x"73822a70", + 1111 => x"81065153", + 1112 => x"72802eb9", + 1113 => x"38b01508", + 1114 => x"5473802e", + 1115 => x"9c3880c0", + 1116 => x"15537373", + 1117 => x"2e8f3873", + 1118 => x"5280cd8c", + 1119 => x"085187ca", + 1120 => x"3f8c1522", + 1121 => x"5676b016", + 1122 => x"0c75db06", + 1123 => x"53728c16", + 1124 => x"23800b84", + 1125 => x"160c9015", + 1126 => x"08750c72", + 1127 => x"56758807", + 1128 => x"53728c16", + 1129 => x"23901508", + 1130 => x"802e80c1", + 1131 => x"388c1522", + 1132 => x"70810655", + 1133 => x"53739e38", + 1134 => x"720a100a", + 1135 => x"70810651", + 1136 => x"53728538", + 1137 => x"94150854", + 1138 => x"7388160c", + 1139 => x"80537280", + 1140 => x"0c883d0d", + 1141 => x"04800b88", + 1142 => x"160c9415", + 1143 => x"08309816", + 1144 => x"0c8053ea", + 1145 => x"39725182", + 1146 => x"fb3ffec4", + 1147 => x"3974518c", + 1148 => x"e83f8c15", + 1149 => x"22708106", + 1150 => x"55537380", + 1151 => x"2effb938", + 1152 => x"d439f83d", + 1153 => x"0d7a5877", + 1154 => x"802e8199", + 1155 => x"3880cd8c", + 1156 => x"0854b814", + 1157 => x"08802e80", + 1158 => x"ed388c18", + 1159 => x"2270902b", + 1160 => x"70902c70", + 1161 => x"832a8132", + 1162 => x"81065c51", + 1163 => x"57547880", + 1164 => x"cd389018", + 1165 => x"08577680", + 1166 => x"2e80c338", + 1167 => x"77087731", + 1168 => x"77790c76", + 1169 => x"83067a58", + 1170 => x"55557385", + 1171 => x"38941808", + 1172 => x"56758819", + 1173 => x"0c807525", + 1174 => x"a5387453", + 1175 => x"76529c18", + 1176 => x"0851a418", + 1177 => x"0854732d", + 1178 => x"800b8008", + 1179 => x"2580c938", + 1180 => x"80081775", + 1181 => x"80083156", + 1182 => x"57748024", + 1183 => x"dd38800b", + 1184 => x"800c8a3d", + 1185 => x"0d047351", + 1186 => x"81da3f8c", + 1187 => x"18227090", + 1188 => x"2b70902c", + 1189 => x"70832a81", + 1190 => x"3281065c", + 1191 => x"51575478", + 1192 => x"dd38ff8e", + 1193 => x"39a48252", + 1194 => x"80cd8c08", + 1195 => x"5189f13f", + 1196 => x"8008800c", + 1197 => x"8a3d0d04", + 1198 => x"8c182280", + 1199 => x"c0075473", + 1200 => x"8c1923ff", + 1201 => x"0b800c8a", + 1202 => x"3d0d0480", + 1203 => x"3d0d7251", + 1204 => x"80710c80", + 1205 => x"0b84120c", + 1206 => x"800b8812", + 1207 => x"0c028e05", + 1208 => x"228c1223", + 1209 => x"02920522", + 1210 => x"8e122380", + 1211 => x"0b90120c", + 1212 => x"800b9412", + 1213 => x"0c800b98", + 1214 => x"120c709c", + 1215 => x"120c80c0", + 1216 => x"970ba012", + 1217 => x"0c80c0e3", + 1218 => x"0ba4120c", + 1219 => x"80c1df0b", + 1220 => x"a8120c80", + 1221 => x"c2b00bac", + 1222 => x"120c823d", + 1223 => x"0d04fa3d", + 1224 => x"0d797080", + 1225 => x"dc298c11", + 1226 => x"547a5356", + 1227 => x"578cad3f", + 1228 => x"80088008", + 1229 => x"55568008", + 1230 => x"802ea238", + 1231 => x"80088c05", + 1232 => x"54800b80", + 1233 => x"080c7680", + 1234 => x"0884050c", + 1235 => x"73800888", + 1236 => x"050c7453", + 1237 => x"80527351", + 1238 => x"97f83f75", + 1239 => x"5473800c", + 1240 => x"883d0d04", + 1241 => x"fc3d0d76", + 1242 => x"a8f70bbc", + 1243 => x"120c5581", + 1244 => x"0bb8160c", + 1245 => x"800b84dc", + 1246 => x"160c830b", + 1247 => x"84e0160c", + 1248 => x"84e81584", + 1249 => x"e4160c74", + 1250 => x"54805384", + 1251 => x"52841508", + 1252 => x"51feb83f", + 1253 => x"74548153", + 1254 => x"89528815", + 1255 => x"0851feab", + 1256 => x"3f745482", + 1257 => x"538a528c", + 1258 => x"150851fe", + 1259 => x"9e3f863d", + 1260 => x"0d04f93d", + 1261 => x"0d7980cd", + 1262 => x"8c085457", + 1263 => x"b8130880", + 1264 => x"2e80c838", + 1265 => x"84dc1356", + 1266 => x"88160884", + 1267 => x"1708ff05", + 1268 => x"55558074", + 1269 => x"249f388c", + 1270 => x"15227090", + 1271 => x"2b70902c", + 1272 => x"51545872", + 1273 => x"802e80ca", + 1274 => x"3880dc15", + 1275 => x"ff155555", + 1276 => x"738025e3", + 1277 => x"38750853", + 1278 => x"72802e9f", + 1279 => x"38725688", + 1280 => x"16088417", + 1281 => x"08ff0555", + 1282 => x"55c83972", + 1283 => x"51fed53f", + 1284 => x"80cd8c08", + 1285 => x"84dc0556", + 1286 => x"ffae3984", + 1287 => x"527651fd", + 1288 => x"fd3f8008", + 1289 => x"760c8008", + 1290 => x"802e80c0", + 1291 => x"38800856", + 1292 => x"ce39810b", + 1293 => x"8c162372", + 1294 => x"750c7288", + 1295 => x"160c7284", + 1296 => x"160c7290", + 1297 => x"160c7294", + 1298 => x"160c7298", + 1299 => x"160cff0b", + 1300 => x"8e162372", + 1301 => x"b0160c72", + 1302 => x"b4160c72", + 1303 => x"80c4160c", + 1304 => x"7280c816", + 1305 => x"0c74800c", + 1306 => x"893d0d04", + 1307 => x"8c770c80", + 1308 => x"0b800c89", + 1309 => x"3d0d04ff", + 1310 => x"3d0da482", + 1311 => x"52735186", + 1312 => x"9f3f833d", + 1313 => x"0d04803d", + 1314 => x"0d80cd8c", + 1315 => x"0851e83f", + 1316 => x"823d0d04", + 1317 => x"fb3d0d77", + 1318 => x"70525696", + 1319 => x"c43f80d4", + 1320 => x"c80b8805", + 1321 => x"08841108", + 1322 => x"fc06707b", + 1323 => x"319fef05", + 1324 => x"e08006e0", + 1325 => x"80055656", + 1326 => x"53a08074", + 1327 => x"24943880", + 1328 => x"52755196", + 1329 => x"9e3f80d4", + 1330 => x"d0081553", + 1331 => x"7280082e", + 1332 => x"8f387551", + 1333 => x"968c3f80", + 1334 => x"5372800c", + 1335 => x"873d0d04", + 1336 => x"73305275", + 1337 => x"5195fc3f", + 1338 => x"8008ff2e", + 1339 => x"a83880d4", + 1340 => x"c80b8805", + 1341 => x"08757531", + 1342 => x"81078412", + 1343 => x"0c5380d4", + 1344 => x"8c087431", + 1345 => x"80d48c0c", + 1346 => x"755195d6", + 1347 => x"3f810b80", + 1348 => x"0c873d0d", + 1349 => x"04805275", + 1350 => x"5195c83f", + 1351 => x"80d4c80b", + 1352 => x"88050880", + 1353 => x"08713156", + 1354 => x"538f7525", + 1355 => x"ffa43880", + 1356 => x"0880d4bc", + 1357 => x"083180d4", + 1358 => x"8c0c7481", + 1359 => x"0784140c", + 1360 => x"7551959e", + 1361 => x"3f8053ff", + 1362 => x"9039f63d", + 1363 => x"0d7c7e54", + 1364 => x"5b72802e", + 1365 => x"8283387a", + 1366 => x"5195863f", + 1367 => x"f8138411", + 1368 => x"0870fe06", + 1369 => x"70138411", + 1370 => x"08fc065d", + 1371 => x"58595458", + 1372 => x"80d4d008", + 1373 => x"752e82de", + 1374 => x"38788416", + 1375 => x"0c807381", + 1376 => x"06545a72", + 1377 => x"7a2e81d5", + 1378 => x"38781584", + 1379 => x"11088106", + 1380 => x"515372a0", + 1381 => x"38781757", + 1382 => x"7981e638", + 1383 => x"88150853", + 1384 => x"7280d4d0", + 1385 => x"2e82f938", + 1386 => x"8c150870", + 1387 => x"8c150c73", + 1388 => x"88120c56", + 1389 => x"76810784", + 1390 => x"190c7618", + 1391 => x"77710c53", + 1392 => x"79819138", + 1393 => x"83ff7727", + 1394 => x"81c83876", + 1395 => x"892a7783", + 1396 => x"2a565372", + 1397 => x"802ebf38", + 1398 => x"76862ab8", + 1399 => x"05558473", + 1400 => x"27b43880", + 1401 => x"db135594", + 1402 => x"7327ab38", + 1403 => x"768c2a80", + 1404 => x"ee055580", + 1405 => x"d473279e", + 1406 => x"38768f2a", + 1407 => x"80f70555", + 1408 => x"82d47327", + 1409 => x"91387692", + 1410 => x"2a80fc05", + 1411 => x"558ad473", + 1412 => x"27843880", + 1413 => x"fe557410", + 1414 => x"101080d4", + 1415 => x"c8058811", + 1416 => x"08555673", + 1417 => x"762e82b3", + 1418 => x"38841408", + 1419 => x"fc065376", + 1420 => x"73278d38", + 1421 => x"88140854", + 1422 => x"73762e09", + 1423 => x"8106ea38", + 1424 => x"8c140870", + 1425 => x"8c1a0c74", + 1426 => x"881a0c78", + 1427 => x"88120c56", + 1428 => x"778c150c", + 1429 => x"7a51938a", + 1430 => x"3f8c3d0d", + 1431 => x"04770878", + 1432 => x"71315977", + 1433 => x"05881908", + 1434 => x"54577280", + 1435 => x"d4d02e80", + 1436 => x"e0388c18", + 1437 => x"08708c15", + 1438 => x"0c738812", + 1439 => x"0c56fe89", + 1440 => x"39881508", + 1441 => x"8c160870", + 1442 => x"8c130c57", + 1443 => x"88170cfe", + 1444 => x"a3397683", + 1445 => x"2a705455", + 1446 => x"80752481", + 1447 => x"98387282", + 1448 => x"2c81712b", + 1449 => x"80d4cc08", + 1450 => x"0780d4c8", + 1451 => x"0b84050c", + 1452 => x"53741010", + 1453 => x"1080d4c8", + 1454 => x"05881108", + 1455 => x"5556758c", + 1456 => x"190c7388", + 1457 => x"190c7788", + 1458 => x"170c778c", + 1459 => x"150cff84", + 1460 => x"39815afd", + 1461 => x"b4397817", + 1462 => x"73810654", + 1463 => x"57729838", + 1464 => x"77087871", + 1465 => x"31597705", + 1466 => x"8c190888", + 1467 => x"1a08718c", + 1468 => x"120c8812", + 1469 => x"0c575776", + 1470 => x"81078419", + 1471 => x"0c7780d4", + 1472 => x"c80b8805", + 1473 => x"0c80d4c4", + 1474 => x"087726fe", + 1475 => x"c73880d4", + 1476 => x"c008527a", + 1477 => x"51fafd3f", + 1478 => x"7a5191c6", + 1479 => x"3ffeba39", + 1480 => x"81788c15", + 1481 => x"0c788815", + 1482 => x"0c738c1a", + 1483 => x"0c73881a", + 1484 => x"0c5afd80", + 1485 => x"39831570", + 1486 => x"822c8171", + 1487 => x"2b80d4cc", + 1488 => x"080780d4", + 1489 => x"c80b8405", + 1490 => x"0c515374", + 1491 => x"10101080", + 1492 => x"d4c80588", + 1493 => x"11085556", + 1494 => x"fee43974", + 1495 => x"53807524", + 1496 => x"a7387282", + 1497 => x"2c81712b", + 1498 => x"80d4cc08", + 1499 => x"0780d4c8", + 1500 => x"0b84050c", + 1501 => x"53758c19", + 1502 => x"0c738819", + 1503 => x"0c778817", + 1504 => x"0c778c15", + 1505 => x"0cfdcd39", + 1506 => x"83157082", + 1507 => x"2c81712b", + 1508 => x"80d4cc08", + 1509 => x"0780d4c8", + 1510 => x"0b84050c", + 1511 => x"5153d639", + 1512 => x"f93d0d79", + 1513 => x"7b585380", + 1514 => x"0b80cd8c", + 1515 => x"08535672", + 1516 => x"722e80c0", + 1517 => x"3884dc13", + 1518 => x"5574762e", + 1519 => x"b7388815", + 1520 => x"08841608", + 1521 => x"ff055454", + 1522 => x"8073249d", + 1523 => x"388c1422", + 1524 => x"70902b70", + 1525 => x"902c5153", + 1526 => x"587180d8", + 1527 => x"3880dc14", + 1528 => x"ff145454", + 1529 => x"728025e5", + 1530 => x"38740855", + 1531 => x"74d03880", + 1532 => x"cd8c0852", + 1533 => x"84dc1255", + 1534 => x"74802eb1", + 1535 => x"38881508", + 1536 => x"841608ff", + 1537 => x"05545480", + 1538 => x"73249c38", + 1539 => x"8c142270", + 1540 => x"902b7090", + 1541 => x"2c515358", + 1542 => x"71ad3880", + 1543 => x"dc14ff14", + 1544 => x"54547280", + 1545 => x"25e63874", + 1546 => x"085574d1", + 1547 => x"3875800c", + 1548 => x"893d0d04", + 1549 => x"7351762d", + 1550 => x"75800807", + 1551 => x"80dc15ff", + 1552 => x"15555556", + 1553 => x"ff9e3973", + 1554 => x"51762d75", + 1555 => x"80080780", + 1556 => x"dc15ff15", + 1557 => x"555556ca", + 1558 => x"39ea3d0d", + 1559 => x"688c1122", + 1560 => x"700a100a", + 1561 => x"81065758", + 1562 => x"567480e4", + 1563 => x"388e1622", + 1564 => x"70902b70", + 1565 => x"902c5155", + 1566 => x"58807424", + 1567 => x"b138983d", + 1568 => x"c4055373", + 1569 => x"5280cd8c", + 1570 => x"085192ac", + 1571 => x"3f800b80", + 1572 => x"08249738", + 1573 => x"7983e080", + 1574 => x"06547380", + 1575 => x"c0802e81", + 1576 => x"8f387382", + 1577 => x"80802e81", + 1578 => x"91388c16", + 1579 => x"22577690", + 1580 => x"80075473", + 1581 => x"8c172388", + 1582 => x"805280cd", + 1583 => x"8c085181", + 1584 => x"9b3f8008", + 1585 => x"9d388c16", + 1586 => x"22820754", + 1587 => x"738c1723", + 1588 => x"80c31670", + 1589 => x"770c9017", + 1590 => x"0c810b94", + 1591 => x"170c983d", + 1592 => x"0d0480cd", + 1593 => x"8c08a8f7", + 1594 => x"0bbc120c", + 1595 => x"548c1622", + 1596 => x"81800754", + 1597 => x"738c1723", + 1598 => x"8008760c", + 1599 => x"80089017", + 1600 => x"0c88800b", + 1601 => x"94170c74", + 1602 => x"802ed338", + 1603 => x"8e162270", + 1604 => x"902b7090", + 1605 => x"2c535558", + 1606 => x"98a23f80", + 1607 => x"08802eff", + 1608 => x"bd388c16", + 1609 => x"22810754", + 1610 => x"738c1723", + 1611 => x"983d0d04", + 1612 => x"810b8c17", + 1613 => x"225855fe", + 1614 => x"f539a816", + 1615 => x"0880c1df", + 1616 => x"2e098106", + 1617 => x"fee4388c", + 1618 => x"16228880", + 1619 => x"0754738c", + 1620 => x"17238880", + 1621 => x"0b80cc17", + 1622 => x"0cfedc39", + 1623 => x"f33d0d7f", + 1624 => x"618b1170", + 1625 => x"f8065c55", + 1626 => x"555e7296", + 1627 => x"26833890", + 1628 => x"59807924", + 1629 => x"747a2607", + 1630 => x"53805472", + 1631 => x"742e0981", + 1632 => x"0680cb38", + 1633 => x"7d518cd9", + 1634 => x"3f7883f7", + 1635 => x"2680c638", + 1636 => x"78832a70", + 1637 => x"10101080", + 1638 => x"d4c8058c", + 1639 => x"11085959", + 1640 => x"5a76782e", + 1641 => x"83b03884", + 1642 => x"1708fc06", + 1643 => x"568c1708", + 1644 => x"88180871", + 1645 => x"8c120c88", + 1646 => x"120c5875", + 1647 => x"17841108", + 1648 => x"81078412", + 1649 => x"0c537d51", + 1650 => x"8c983f88", + 1651 => x"17547380", + 1652 => x"0c8f3d0d", + 1653 => x"0478892a", + 1654 => x"79832a5b", + 1655 => x"5372802e", + 1656 => x"bf387886", + 1657 => x"2ab8055a", + 1658 => x"847327b4", + 1659 => x"3880db13", + 1660 => x"5a947327", + 1661 => x"ab38788c", + 1662 => x"2a80ee05", + 1663 => x"5a80d473", + 1664 => x"279e3878", + 1665 => x"8f2a80f7", + 1666 => x"055a82d4", + 1667 => x"73279138", + 1668 => x"78922a80", + 1669 => x"fc055a8a", + 1670 => x"d4732784", + 1671 => x"3880fe5a", + 1672 => x"79101010", + 1673 => x"80d4c805", + 1674 => x"8c110858", + 1675 => x"5576752e", + 1676 => x"a3388417", + 1677 => x"08fc0670", + 1678 => x"7a315556", + 1679 => x"738f2488", + 1680 => x"d5387380", + 1681 => x"25fee638", + 1682 => x"8c170857", + 1683 => x"76752e09", + 1684 => x"8106df38", + 1685 => x"811a5a80", + 1686 => x"d4d80857", + 1687 => x"7680d4d0", + 1688 => x"2e82c038", + 1689 => x"841708fc", + 1690 => x"06707a31", + 1691 => x"5556738f", + 1692 => x"2481f938", + 1693 => x"80d4d00b", + 1694 => x"80d4dc0c", + 1695 => x"80d4d00b", + 1696 => x"80d4d80c", + 1697 => x"738025fe", + 1698 => x"b23883ff", + 1699 => x"762783df", + 1700 => x"3875892a", + 1701 => x"76832a55", + 1702 => x"5372802e", + 1703 => x"bf387586", + 1704 => x"2ab80554", + 1705 => x"847327b4", + 1706 => x"3880db13", + 1707 => x"54947327", + 1708 => x"ab38758c", + 1709 => x"2a80ee05", + 1710 => x"5480d473", + 1711 => x"279e3875", + 1712 => x"8f2a80f7", + 1713 => x"055482d4", + 1714 => x"73279138", + 1715 => x"75922a80", + 1716 => x"fc05548a", + 1717 => x"d4732784", + 1718 => x"3880fe54", + 1719 => x"73101010", + 1720 => x"80d4c805", + 1721 => x"88110856", + 1722 => x"5874782e", + 1723 => x"86cf3884", + 1724 => x"1508fc06", + 1725 => x"53757327", + 1726 => x"8d388815", + 1727 => x"08557478", + 1728 => x"2e098106", + 1729 => x"ea388c15", + 1730 => x"0880d4c8", + 1731 => x"0b840508", + 1732 => x"718c1a0c", + 1733 => x"76881a0c", + 1734 => x"7888130c", + 1735 => x"788c180c", + 1736 => x"5d587953", + 1737 => x"807a2483", + 1738 => x"e6387282", + 1739 => x"2c81712b", + 1740 => x"5c537a7c", + 1741 => x"26819838", + 1742 => x"7b7b0653", + 1743 => x"7282f138", + 1744 => x"79fc0684", + 1745 => x"055a7a10", + 1746 => x"707d0654", + 1747 => x"5b7282e0", + 1748 => x"38841a5a", + 1749 => x"f1398817", + 1750 => x"8c110858", + 1751 => x"5876782e", + 1752 => x"098106fc", + 1753 => x"c238821a", + 1754 => x"5afdec39", + 1755 => x"78177981", + 1756 => x"0784190c", + 1757 => x"7080d4dc", + 1758 => x"0c7080d4", + 1759 => x"d80c80d4", + 1760 => x"d00b8c12", + 1761 => x"0c8c1108", + 1762 => x"88120c74", + 1763 => x"81078412", + 1764 => x"0c741175", + 1765 => x"710c5153", + 1766 => x"7d5188c6", + 1767 => x"3f881754", + 1768 => x"fcac3980", + 1769 => x"d4c80b84", + 1770 => x"05087a54", + 1771 => x"5c798025", + 1772 => x"fef83882", + 1773 => x"da397a09", + 1774 => x"7c067080", + 1775 => x"d4c80b84", + 1776 => x"050c5c7a", + 1777 => x"105b7a7c", + 1778 => x"2685387a", + 1779 => x"85b83880", + 1780 => x"d4c80b88", + 1781 => x"05087084", + 1782 => x"1208fc06", + 1783 => x"707c317c", + 1784 => x"72268f72", + 1785 => x"25075757", + 1786 => x"5c5d5572", + 1787 => x"802e80db", + 1788 => x"38797a16", + 1789 => x"80d4c008", + 1790 => x"1b90115a", + 1791 => x"55575b80", + 1792 => x"d4bc08ff", + 1793 => x"2e8838a0", + 1794 => x"8f13e080", + 1795 => x"06577652", + 1796 => x"7d5187cf", + 1797 => x"3f800854", + 1798 => x"8008ff2e", + 1799 => x"90388008", + 1800 => x"76278299", + 1801 => x"387480d4", + 1802 => x"c82e8291", + 1803 => x"3880d4c8", + 1804 => x"0b880508", + 1805 => x"55841508", + 1806 => x"fc06707a", + 1807 => x"317a7226", + 1808 => x"8f722507", + 1809 => x"52555372", + 1810 => x"83e63874", + 1811 => x"79810784", + 1812 => x"170c7916", + 1813 => x"7080d4c8", + 1814 => x"0b88050c", + 1815 => x"75810784", + 1816 => x"120c547e", + 1817 => x"525786fa", + 1818 => x"3f881754", + 1819 => x"fae03975", + 1820 => x"832a7054", + 1821 => x"54807424", + 1822 => x"819b3872", + 1823 => x"822c8171", + 1824 => x"2b80d4cc", + 1825 => x"08077080", + 1826 => x"d4c80b84", + 1827 => x"050c7510", + 1828 => x"101080d4", + 1829 => x"c8058811", + 1830 => x"08585a5d", + 1831 => x"53778c18", + 1832 => x"0c748818", + 1833 => x"0c768819", + 1834 => x"0c768c16", + 1835 => x"0cfcf339", + 1836 => x"797a1010", + 1837 => x"1080d4c8", + 1838 => x"05705759", + 1839 => x"5d8c1508", + 1840 => x"5776752e", + 1841 => x"a3388417", + 1842 => x"08fc0670", + 1843 => x"7a315556", + 1844 => x"738f2483", + 1845 => x"ca387380", + 1846 => x"25848138", + 1847 => x"8c170857", + 1848 => x"76752e09", + 1849 => x"8106df38", + 1850 => x"8815811b", + 1851 => x"70830655", + 1852 => x"5b5572c9", + 1853 => x"387c8306", + 1854 => x"5372802e", + 1855 => x"fdb838ff", + 1856 => x"1df81959", + 1857 => x"5d881808", + 1858 => x"782eea38", + 1859 => x"fdb53983", + 1860 => x"1a53fc96", + 1861 => x"39831470", + 1862 => x"822c8171", + 1863 => x"2b80d4cc", + 1864 => x"08077080", + 1865 => x"d4c80b84", + 1866 => x"050c7610", + 1867 => x"101080d4", + 1868 => x"c8058811", + 1869 => x"08595b5e", + 1870 => x"5153fee1", + 1871 => x"3980d48c", + 1872 => x"08175880", + 1873 => x"08762e81", + 1874 => x"8d3880d4", + 1875 => x"bc08ff2e", + 1876 => x"83ec3873", + 1877 => x"76311880", + 1878 => x"d48c0c73", + 1879 => x"87067057", + 1880 => x"5372802e", + 1881 => x"88388873", + 1882 => x"31701555", + 1883 => x"5676149f", + 1884 => x"ff06a080", + 1885 => x"71311770", + 1886 => x"547f5357", + 1887 => x"5384e43f", + 1888 => x"80085380", + 1889 => x"08ff2e81", + 1890 => x"a03880d4", + 1891 => x"8c081670", + 1892 => x"80d48c0c", + 1893 => x"747580d4", + 1894 => x"c80b8805", + 1895 => x"0c747631", + 1896 => x"18708107", + 1897 => x"51555658", + 1898 => x"7b80d4c8", + 1899 => x"2e839c38", + 1900 => x"798f2682", + 1901 => x"cb38810b", + 1902 => x"84150c84", + 1903 => x"1508fc06", + 1904 => x"707a317a", + 1905 => x"72268f72", + 1906 => x"25075255", + 1907 => x"5372802e", + 1908 => x"fcf93880", + 1909 => x"db398008", + 1910 => x"9fff0653", + 1911 => x"72feeb38", + 1912 => x"7780d48c", + 1913 => x"0c80d4c8", + 1914 => x"0b880508", + 1915 => x"7b188107", + 1916 => x"84120c55", + 1917 => x"80d4b808", + 1918 => x"78278638", + 1919 => x"7780d4b8", + 1920 => x"0c80d4b4", + 1921 => x"087827fc", + 1922 => x"ac387780", + 1923 => x"d4b40c84", + 1924 => x"1508fc06", + 1925 => x"707a317a", + 1926 => x"72268f72", + 1927 => x"25075255", + 1928 => x"5372802e", + 1929 => x"fca53888", + 1930 => x"39807454", + 1931 => x"56fedb39", + 1932 => x"7d5183ae", + 1933 => x"3f800b80", + 1934 => x"0c8f3d0d", + 1935 => x"04735380", + 1936 => x"7424a938", + 1937 => x"72822c81", + 1938 => x"712b80d4", + 1939 => x"cc080770", + 1940 => x"80d4c80b", + 1941 => x"84050c5d", + 1942 => x"53778c18", + 1943 => x"0c748818", + 1944 => x"0c768819", + 1945 => x"0c768c16", + 1946 => x"0cf9b739", + 1947 => x"83147082", + 1948 => x"2c81712b", + 1949 => x"80d4cc08", + 1950 => x"077080d4", + 1951 => x"c80b8405", + 1952 => x"0c5e5153", + 1953 => x"d4397b7b", + 1954 => x"065372fc", + 1955 => x"a338841a", + 1956 => x"7b105c5a", + 1957 => x"f139ff1a", + 1958 => x"8111515a", + 1959 => x"f7b93978", + 1960 => x"17798107", + 1961 => x"84190c8c", + 1962 => x"18088819", + 1963 => x"08718c12", + 1964 => x"0c88120c", + 1965 => x"597080d4", + 1966 => x"dc0c7080", + 1967 => x"d4d80c80", + 1968 => x"d4d00b8c", + 1969 => x"120c8c11", + 1970 => x"0888120c", + 1971 => x"74810784", + 1972 => x"120c7411", + 1973 => x"75710c51", + 1974 => x"53f9bd39", + 1975 => x"75178411", + 1976 => x"08810784", + 1977 => x"120c538c", + 1978 => x"17088818", + 1979 => x"08718c12", + 1980 => x"0c88120c", + 1981 => x"587d5181", + 1982 => x"e93f8817", + 1983 => x"54f5cf39", + 1984 => x"7284150c", + 1985 => x"f41af806", + 1986 => x"70841e08", + 1987 => x"81060784", + 1988 => x"1e0c701d", + 1989 => x"545b850b", + 1990 => x"84140c85", + 1991 => x"0b88140c", + 1992 => x"8f7b27fd", + 1993 => x"cf38881c", + 1994 => x"527d51ec", + 1995 => x"9d3f80d4", + 1996 => x"c80b8805", + 1997 => x"0880d48c", + 1998 => x"085955fd", + 1999 => x"b7397780", + 2000 => x"d48c0c73", + 2001 => x"80d4bc0c", + 2002 => x"fc913972", + 2003 => x"84150cfd", + 2004 => x"a339fc3d", + 2005 => x"0d767971", + 2006 => x"028c059f", + 2007 => x"05335755", + 2008 => x"53558372", + 2009 => x"278a3874", + 2010 => x"83065170", + 2011 => x"802ea238", + 2012 => x"ff125271", + 2013 => x"ff2e9338", + 2014 => x"73737081", + 2015 => x"055534ff", + 2016 => x"125271ff", + 2017 => x"2e098106", + 2018 => x"ef387480", + 2019 => x"0c863d0d", + 2020 => x"04747488", + 2021 => x"2b750770", + 2022 => x"71902b07", + 2023 => x"5154518f", + 2024 => x"7227a538", + 2025 => x"72717084", + 2026 => x"05530c72", + 2027 => x"71708405", + 2028 => x"530c7271", + 2029 => x"70840553", + 2030 => x"0c727170", + 2031 => x"8405530c", + 2032 => x"f0125271", + 2033 => x"8f26dd38", + 2034 => x"83722790", + 2035 => x"38727170", + 2036 => x"8405530c", + 2037 => x"fc125271", + 2038 => x"8326f238", + 2039 => x"7053ff90", + 2040 => x"390404fd", + 2041 => x"3d0d800b", + 2042 => x"80dd800c", + 2043 => x"765184ee", + 2044 => x"3f800853", + 2045 => x"8008ff2e", + 2046 => x"88387280", + 2047 => x"0c853d0d", + 2048 => x"0480dd80", + 2049 => x"08547380", + 2050 => x"2ef03875", + 2051 => x"74710c52", + 2052 => x"72800c85", + 2053 => x"3d0d04f9", + 2054 => x"3d0d797c", + 2055 => x"557b548e", + 2056 => x"11227090", + 2057 => x"2b70902c", + 2058 => x"555780cd", + 2059 => x"8c085358", + 2060 => x"5683f33f", + 2061 => x"80085780", + 2062 => x"0b800824", + 2063 => x"933880d0", + 2064 => x"16088008", + 2065 => x"0580d017", + 2066 => x"0c76800c", + 2067 => x"893d0d04", + 2068 => x"8c162283", + 2069 => x"dfff0655", + 2070 => x"748c1723", + 2071 => x"76800c89", + 2072 => x"3d0d04fa", + 2073 => x"3d0d788c", + 2074 => x"11227088", + 2075 => x"2a708106", + 2076 => x"51575856", + 2077 => x"74a9388c", + 2078 => x"162283df", + 2079 => x"ff065574", + 2080 => x"8c17237a", + 2081 => x"5479538e", + 2082 => x"16227090", + 2083 => x"2b70902c", + 2084 => x"545680cd", + 2085 => x"8c085256", + 2086 => x"81b23f88", + 2087 => x"3d0d0482", + 2088 => x"5480538e", + 2089 => x"16227090", + 2090 => x"2b70902c", + 2091 => x"545680cd", + 2092 => x"8c085257", + 2093 => x"82b83f8c", + 2094 => x"162283df", + 2095 => x"ff065574", + 2096 => x"8c17237a", + 2097 => x"5479538e", + 2098 => x"16227090", + 2099 => x"2b70902c", + 2100 => x"545680cd", + 2101 => x"8c085256", + 2102 => x"80f23f88", + 2103 => x"3d0d04f9", + 2104 => x"3d0d797c", + 2105 => x"557b548e", + 2106 => x"11227090", + 2107 => x"2b70902c", + 2108 => x"555780cd", + 2109 => x"8c085358", + 2110 => x"5681f33f", + 2111 => x"80085780", + 2112 => x"08ff2e99", + 2113 => x"388c1622", + 2114 => x"a0800755", + 2115 => x"748c1723", + 2116 => x"800880d0", + 2117 => x"170c7680", + 2118 => x"0c893d0d", + 2119 => x"048c1622", + 2120 => x"83dfff06", + 2121 => x"55748c17", + 2122 => x"2376800c", + 2123 => x"893d0d04", + 2124 => x"fe3d0d74", + 2125 => x"8e112270", + 2126 => x"902b7090", + 2127 => x"2c555151", + 2128 => x"5380cd8c", + 2129 => x"0851bd3f", + 2130 => x"843d0d04", + 2131 => x"fb3d0d80", + 2132 => x"0b80dd80", + 2133 => x"0c7a5379", + 2134 => x"52785182", + 2135 => x"fc3f8008", + 2136 => x"558008ff", + 2137 => x"2e883874", + 2138 => x"800c873d", + 2139 => x"0d0480dd", + 2140 => x"80085675", + 2141 => x"802ef038", + 2142 => x"7776710c", + 2143 => x"5474800c", + 2144 => x"873d0d04", + 2145 => x"fd3d0d80", + 2146 => x"0b80dd80", + 2147 => x"0c765184", + 2148 => x"c63f8008", + 2149 => x"538008ff", + 2150 => x"2e883872", + 2151 => x"800c853d", + 2152 => x"0d0480dd", + 2153 => x"80085473", + 2154 => x"802ef038", + 2155 => x"7574710c", + 2156 => x"5272800c", + 2157 => x"853d0d04", + 2158 => x"fc3d0d80", + 2159 => x"0b80dd80", + 2160 => x"0c785277", + 2161 => x"5186ac3f", + 2162 => x"80085480", + 2163 => x"08ff2e88", + 2164 => x"3873800c", + 2165 => x"863d0d04", + 2166 => x"80dd8008", + 2167 => x"5574802e", + 2168 => x"f0387675", + 2169 => x"710c5373", + 2170 => x"800c863d", + 2171 => x"0d04fb3d", + 2172 => x"0d800b80", + 2173 => x"dd800c7a", + 2174 => x"53795278", + 2175 => x"5184893f", + 2176 => x"80085580", + 2177 => x"08ff2e88", + 2178 => x"3874800c", + 2179 => x"873d0d04", + 2180 => x"80dd8008", + 2181 => x"5675802e", + 2182 => x"f0387776", + 2183 => x"710c5474", + 2184 => x"800c873d", + 2185 => x"0d04fb3d", + 2186 => x"0d800b80", + 2187 => x"dd800c7a", + 2188 => x"53795278", + 2189 => x"5182963f", + 2190 => x"80085580", + 2191 => x"08ff2e88", + 2192 => x"3874800c", + 2193 => x"873d0d04", + 2194 => x"80dd8008", + 2195 => x"5675802e", + 2196 => x"f0387776", + 2197 => x"710c5474", + 2198 => x"800c873d", + 2199 => x"0d04fe3d", + 2200 => x"0d80dcf8", + 2201 => x"0851708a", + 2202 => x"3880dd84", + 2203 => x"7080dcf8", + 2204 => x"0c517075", + 2205 => x"125252ff", + 2206 => x"537087fb", + 2207 => x"80802688", + 2208 => x"387080dc", + 2209 => x"f80c7153", + 2210 => x"72800c84", + 2211 => x"3d0d04fd", + 2212 => x"3d0d800b", + 2213 => x"80cd8008", + 2214 => x"54547281", + 2215 => x"2e9b3873", + 2216 => x"80dcfc0c", + 2217 => x"c4803fc2", + 2218 => x"d73f80dc", + 2219 => x"d0528151", + 2220 => x"c5c63f80", + 2221 => x"085185bb", + 2222 => x"3f7280dc", + 2223 => x"fc0cc3e6", + 2224 => x"3fc2bd3f", + 2225 => x"80dcd052", + 2226 => x"8151c5ac", + 2227 => x"3f800851", + 2228 => x"85a13f00", + 2229 => x"ff3900ff", + 2230 => x"39f53d0d", + 2231 => x"7e6080dc", + 2232 => x"fc08705b", + 2233 => x"585b5b75", + 2234 => x"80c23877", + 2235 => x"7a25a138", + 2236 => x"771b7033", + 2237 => x"7081ff06", + 2238 => x"58585975", + 2239 => x"8a2e9838", + 2240 => x"7681ff06", + 2241 => x"51c2fe3f", + 2242 => x"81185879", + 2243 => x"7824e138", + 2244 => x"79800c8d", + 2245 => x"3d0d048d", + 2246 => x"51c2ea3f", + 2247 => x"78337081", + 2248 => x"ff065257", + 2249 => x"c2df3f81", + 2250 => x"1858e039", + 2251 => x"79557a54", + 2252 => x"7d538552", + 2253 => x"8d3dfc05", + 2254 => x"51c2873f", + 2255 => x"80085684", + 2256 => x"ab3f7b80", + 2257 => x"080c7580", + 2258 => x"0c8d3d0d", + 2259 => x"04f63d0d", + 2260 => x"7d7f80dc", + 2261 => x"fc08705b", + 2262 => x"585a5a75", + 2263 => x"80c13877", + 2264 => x"7925b338", + 2265 => x"c1fa3f80", + 2266 => x"0881ff06", + 2267 => x"708d3270", + 2268 => x"30709f2a", + 2269 => x"51515757", + 2270 => x"768a2e80", + 2271 => x"c3387580", + 2272 => x"2ebe3877", + 2273 => x"1a567676", + 2274 => x"347651c1", + 2275 => x"f83f8118", + 2276 => x"58787824", + 2277 => x"cf387756", + 2278 => x"75800c8c", + 2279 => x"3d0d0478", + 2280 => x"5579547c", + 2281 => x"5384528c", + 2282 => x"3dfc0551", + 2283 => x"c1943f80", + 2284 => x"085683b8", + 2285 => x"3f7a8008", + 2286 => x"0c75800c", + 2287 => x"8c3d0d04", + 2288 => x"771a568a", + 2289 => x"76348118", + 2290 => x"588d51c1", + 2291 => x"b83f8a51", + 2292 => x"c1b33f77", + 2293 => x"56c239fb", + 2294 => x"3d0d80dc", + 2295 => x"fc087056", + 2296 => x"54738838", + 2297 => x"74800c87", + 2298 => x"3d0d0477", + 2299 => x"53835287", + 2300 => x"3dfc0551", + 2301 => x"c0cc3f80", + 2302 => x"085482f0", + 2303 => x"3f758008", + 2304 => x"0c73800c", + 2305 => x"873d0d04", + 2306 => x"fa3d0d80", + 2307 => x"dcfc0880", + 2308 => x"2ea2387a", + 2309 => x"55795478", + 2310 => x"53865288", + 2311 => x"3dfc0551", + 2312 => x"c0a03f80", + 2313 => x"085682c4", + 2314 => x"3f768008", + 2315 => x"0c75800c", + 2316 => x"883d0d04", + 2317 => x"82b63f9d", + 2318 => x"0b80080c", + 2319 => x"ff0b800c", + 2320 => x"883d0d04", + 2321 => x"fb3d0d77", + 2322 => x"79565680", + 2323 => x"70545473", + 2324 => x"75259f38", + 2325 => x"74101010", + 2326 => x"f8055272", + 2327 => x"16703370", + 2328 => x"742b7607", + 2329 => x"8116f816", + 2330 => x"56565651", + 2331 => x"51747324", + 2332 => x"ea387380", + 2333 => x"0c873d0d", + 2334 => x"04fc3d0d", + 2335 => x"76785555", + 2336 => x"bc538052", + 2337 => x"7351f5ca", + 2338 => x"3f845274", + 2339 => x"51ffb53f", + 2340 => x"80087423", + 2341 => x"84528415", + 2342 => x"51ffa93f", + 2343 => x"80088215", + 2344 => x"23845288", + 2345 => x"1551ff9c", + 2346 => x"3f800884", + 2347 => x"150c8452", + 2348 => x"8c1551ff", + 2349 => x"8f3f8008", + 2350 => x"88152384", + 2351 => x"52901551", + 2352 => x"ff823f80", + 2353 => x"088a1523", + 2354 => x"84529415", + 2355 => x"51fef53f", + 2356 => x"80088c15", + 2357 => x"23845298", + 2358 => x"1551fee8", + 2359 => x"3f80088e", + 2360 => x"15238852", + 2361 => x"9c1551fe", + 2362 => x"db3f8008", + 2363 => x"90150c86", + 2364 => x"3d0d04e9", + 2365 => x"3d0d6a80", + 2366 => x"dcfc0857", + 2367 => x"57759338", + 2368 => x"80c0800b", + 2369 => x"84180c75", + 2370 => x"ac180c75", + 2371 => x"800c993d", + 2372 => x"0d04893d", + 2373 => x"70556a54", + 2374 => x"558a5299", + 2375 => x"3dffbc05", + 2376 => x"51ffbe9e", + 2377 => x"3f800877", + 2378 => x"53755256", + 2379 => x"fecb3fbc", + 2380 => x"3f778008", + 2381 => x"0c75800c", + 2382 => x"993d0d04", + 2383 => x"fc3d0d81", + 2384 => x"5480dcfc", + 2385 => x"08883873", + 2386 => x"800c863d", + 2387 => x"0d047653", + 2388 => x"97b95286", + 2389 => x"3dfc0551", + 2390 => x"ffbde73f", + 2391 => x"8008548c", + 2392 => x"3f748008", + 2393 => x"0c73800c", + 2394 => x"863d0d04", + 2395 => x"80cd8c08", + 2396 => x"800c04f7", + 2397 => x"3d0d7b80", + 2398 => x"cd8c0882", + 2399 => x"c811085a", + 2400 => x"545a7780", + 2401 => x"2e80da38", + 2402 => x"81881884", + 2403 => x"1908ff05", + 2404 => x"81712b59", + 2405 => x"55598074", + 2406 => x"2480ea38", + 2407 => x"807424b5", + 2408 => x"3873822b", + 2409 => x"78118805", + 2410 => x"56568180", + 2411 => x"19087706", + 2412 => x"5372802e", + 2413 => x"b6387816", + 2414 => x"70085353", + 2415 => x"79517408", + 2416 => x"53722dff", + 2417 => x"14fc17fc", + 2418 => x"1779812c", + 2419 => x"5a575754", + 2420 => x"738025d6", + 2421 => x"38770858", + 2422 => x"77ffad38", + 2423 => x"80cd8c08", + 2424 => x"53bc1308", + 2425 => x"a5387951", + 2426 => x"f9e93f74", + 2427 => x"0853722d", + 2428 => x"ff14fc17", + 2429 => x"fc177981", + 2430 => x"2c5a5757", + 2431 => x"54738025", + 2432 => x"ffa838d1", + 2433 => x"398057ff", + 2434 => x"93397251", + 2435 => x"bc130853", + 2436 => x"722d7951", + 2437 => x"f9bd3fff", + 2438 => x"3d0d80dc", + 2439 => x"d80bfc05", + 2440 => x"70085252", + 2441 => x"70ff2e91", + 2442 => x"38702dfc", + 2443 => x"12700852", + 2444 => x"5270ff2e", + 2445 => x"098106f1", + 2446 => x"38833d0d", + 2447 => x"0404ffbd", + 2448 => x"d23f0400", + 2449 => x"00000040", + 2450 => x"48656c6c", + 2451 => x"6f20776f", + 2452 => x"726c6421", + 2453 => x"00000000", + 2454 => x"0a000000", + 2455 => x"43000000", + 2456 => x"64756d6d", + 2457 => x"792e6578", + 2458 => x"65000000", + 2459 => x"00ffffff", + 2460 => x"ff00ffff", + 2461 => x"ffff00ff", + 2462 => x"ffffff00", + 2463 => x"00000000", + 2464 => x"00000000", + 2465 => x"00000000", + 2466 => x"00002e60", + 2467 => x"00002690", + 2468 => x"00000000", + 2469 => x"000028f8", + 2470 => x"00002954", + 2471 => x"000029b0", + 2472 => x"00000000", + 2473 => x"00000000", + 2474 => x"00000000", + 2475 => x"00000000", + 2476 => x"00000000", + 2477 => x"00000000", + 2478 => x"00000000", + 2479 => x"00000000", + 2480 => x"00000000", + 2481 => x"0000265c", + 2482 => x"00000000", + 2483 => x"00000000", + 2484 => x"00000000", + 2485 => x"00000000", + 2486 => x"00000000", + 2487 => x"00000000", + 2488 => x"00000000", + 2489 => x"00000000", + 2490 => x"00000000", + 2491 => x"00000000", + 2492 => x"00000000", + 2493 => x"00000000", + 2494 => x"00000000", + 2495 => x"00000000", + 2496 => x"00000000", + 2497 => x"00000000", + 2498 => x"00000000", + 2499 => x"00000000", + 2500 => x"00000000", + 2501 => x"00000000", + 2502 => x"00000000", + 2503 => x"00000000", + 2504 => x"00000000", + 2505 => x"00000000", + 2506 => x"00000000", + 2507 => x"00000000", + 2508 => x"00000000", + 2509 => x"00000000", + 2510 => x"00000001", + 2511 => x"330eabcd", + 2512 => x"1234e66d", + 2513 => x"deec0005", + 2514 => x"000b0000", + 2515 => x"00000000", + 2516 => x"00000000", + 2517 => x"00000000", + 2518 => x"00000000", + 2519 => x"00000000", + 2520 => x"00000000", + 2521 => x"00000000", + 2522 => x"00000000", + 2523 => x"00000000", + 2524 => x"00000000", + 2525 => x"00000000", + 2526 => x"00000000", + 2527 => x"00000000", + 2528 => x"00000000", + 2529 => x"00000000", + 2530 => x"00000000", + 2531 => x"00000000", + 2532 => x"00000000", + 2533 => x"00000000", + 2534 => x"00000000", + 2535 => x"00000000", + 2536 => x"00000000", + 2537 => x"00000000", + 2538 => x"00000000", + 2539 => x"00000000", + 2540 => x"00000000", + 2541 => x"00000000", + 2542 => x"00000000", + 2543 => x"00000000", + 2544 => x"00000000", + 2545 => x"00000000", + 2546 => x"00000000", + 2547 => x"00000000", + 2548 => x"00000000", + 2549 => x"00000000", + 2550 => x"00000000", + 2551 => x"00000000", + 2552 => x"00000000", + 2553 => x"00000000", + 2554 => x"00000000", + 2555 => x"00000000", + 2556 => x"00000000", + 2557 => x"00000000", + 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"00000000", + 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"00000000", + 2597 => x"00000000", + 2598 => x"00000000", + 2599 => x"00000000", + 2600 => x"00000000", + 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"ffffffff", + 2704 => x"00000000", + 2705 => x"00020000", + 2706 => x"00000000", + 2707 => x"00000000", + 2708 => x"00002a48", + 2709 => x"00002a48", + 2710 => x"00002a50", + 2711 => x"00002a50", + 2712 => x"00002a58", + 2713 => x"00002a58", + 2714 => x"00002a60", + 2715 => x"00002a60", + 2716 => x"00002a68", + 2717 => x"00002a68", + 2718 => x"00002a70", + 2719 => x"00002a70", + 2720 => x"00002a78", + 2721 => x"00002a78", + 2722 => x"00002a80", + 2723 => x"00002a80", + 2724 => x"00002a88", + 2725 => x"00002a88", + 2726 => x"00002a90", + 2727 => x"00002a90", + 2728 => x"00002a98", + 2729 => x"00002a98", + 2730 => x"00002aa0", + 2731 => x"00002aa0", + 2732 => x"00002aa8", + 2733 => x"00002aa8", + 2734 => x"00002ab0", + 2735 => x"00002ab0", + 2736 => x"00002ab8", + 2737 => x"00002ab8", + 2738 => x"00002ac0", + 2739 => x"00002ac0", + 2740 => x"00002ac8", + 2741 => x"00002ac8", + 2742 => x"00002ad0", + 2743 => x"00002ad0", + 2744 => x"00002ad8", + 2745 => x"00002ad8", + 2746 => x"00002ae0", + 2747 => x"00002ae0", + 2748 => x"00002ae8", + 2749 => x"00002ae8", + 2750 => x"00002af0", + 2751 => x"00002af0", + 2752 => x"00002af8", + 2753 => x"00002af8", + 2754 => x"00002b00", + 2755 => x"00002b00", + 2756 => x"00002b08", + 2757 => x"00002b08", + 2758 => x"00002b10", + 2759 => x"00002b10", + 2760 => x"00002b18", + 2761 => x"00002b18", + 2762 => x"00002b20", + 2763 => x"00002b20", + 2764 => x"00002b28", + 2765 => x"00002b28", + 2766 => x"00002b30", + 2767 => x"00002b30", + 2768 => x"00002b38", + 2769 => x"00002b38", + 2770 => x"00002b40", + 2771 => x"00002b40", + 2772 => x"00002b48", + 2773 => x"00002b48", + 2774 => x"00002b50", + 2775 => x"00002b50", + 2776 => x"00002b58", + 2777 => x"00002b58", + 2778 => x"00002b60", + 2779 => x"00002b60", + 2780 => x"00002b68", + 2781 => x"00002b68", + 2782 => x"00002b70", + 2783 => x"00002b70", + 2784 => x"00002b78", + 2785 => x"00002b78", + 2786 => x"00002b80", + 2787 => x"00002b80", + 2788 => x"00002b88", + 2789 => x"00002b88", + 2790 => x"00002b90", + 2791 => x"00002b90", + 2792 => x"00002b98", + 2793 => x"00002b98", + 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"00002660", + 2965 => x"ffffffff", + 2966 => x"00000000", + 2967 => x"ffffffff", + 2968 => x"00000000", + 2969 => x"00000000", + +others => x"00000000" +); +begin + do_port_a: + process (clk_i) + variable iaddr : integer; + begin + if rising_edge(clk_i) then + if (a_we_i='1') and (b_we_i='1') and (a_addr_i=b_addr_i) and (a_write_i/=b_write_i) then + report "DualPortRAM write collision" severity failure; + end if; + iaddr:=to_integer(a_addr_i); + if a_we_i='1' then + ram(iaddr):=a_write_i; + a_read_o <= a_write_i; + else + a_read_o <= ram(iaddr); + end if; + end if; + end process do_port_a; + + do_port_b: + process (clk_i) + variable iaddr : integer; + begin + if rising_edge(clk_i) then + iaddr:=to_integer(b_addr_i); + if b_we_i='1' then + ram(iaddr):=b_write_i; + b_read_o <= b_write_i; + else + b_read_o <= ram(iaddr); + end if; + end if; + end process do_port_b; +end architecture DualPort_Arch; -- Entity: DualPortRAM diff --git a/zpu/hdl/zealot/roms/rom_pkg.vhdl b/zpu/hdl/zealot/roms/rom_pkg.vhdl new file mode 100644 index 0000000..c5a4161 --- /dev/null +++ b/zpu/hdl/zealot/roms/rom_pkg.vhdl @@ -0,0 +1,80 @@ +------------------------------------------------------------------------------ +---- ---- +---- ZPU memories package ---- +---- ---- +---- http://www.opencores.org/ ---- +---- ---- +---- Description: ---- +---- This is a package with the memories used for the ZPU core. ---- +---- ---- +---- To Do: ---- +---- - ---- +---- ---- +---- Author: ---- +---- - Salvador E. Tropea, salvador inti.gob.ar ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Copyright (c) 2008 Salvador E. Tropea <salvador inti.gob.ar> ---- +---- Copyright (c) 2008 Instituto Nacional de Tecnología Industrial ---- +---- ---- +---- Distributed under the BSD license ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Design unit: zpu_memory (Package) ---- +---- File name: rom_pkg.vhdl (template used) ---- +---- Note: None ---- +---- Limitations: None known ---- +---- Errors: None known ---- +---- Library: work ---- +---- Dependencies: IEEE.std_logic_1164 ---- +---- IEEE.numeric_std ---- +---- Target FPGA: Spartan 3 (XC3S1500-4-FG456) ---- +---- Language: VHDL ---- +---- Wishbone: No ---- +---- Synthesis tools: Xilinx Release 9.2.03i - xst J.39 ---- +---- Simulation tools: GHDL [Sokcho edition] (0.2x) ---- +---- Text editor: SETEdit 0.5.x ---- +---- ---- +------------------------------------------------------------------------------ + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +package zpu_memory is + component DualPortRAM is + generic( + WORD_SIZE : integer:=32; -- Word Size 16/32 + BYTE_BITS : integer:=2; -- Bits used to address bytes + BRAM_W : integer:=15); -- Address Width + port( + clk_i : in std_logic; + -- Port A + a_we_i : in std_logic; + a_addr_i : in unsigned(BRAM_W-1 downto BYTE_BITS); + a_write_i : in unsigned(WORD_SIZE-1 downto 0); + a_read_o : out unsigned(WORD_SIZE-1 downto 0); + -- Port B + b_we_i : in std_logic; + b_addr_i : in unsigned(BRAM_W-1 downto BYTE_BITS); + b_write_i : in unsigned(WORD_SIZE-1 downto 0); + b_read_o : out unsigned(WORD_SIZE-1 downto 0)); + end component DualPortRAM; + + component SinglePortRAM is + generic( + WORD_SIZE : integer:=32; -- Word Size 16/32 + BYTE_BITS : integer:=2; -- Bits used to address bytes + BRAM_W : integer:=15); -- Address Width + port( + clk_i : in std_logic; + we_i : in std_logic; + re_i : in std_logic; + addr_i : in unsigned(BRAM_W-1 downto BYTE_BITS); + write_i : in unsigned(WORD_SIZE-1 downto 0); + read_o : out unsigned(WORD_SIZE-1 downto 0); + busy_o : out std_logic); + end component SinglePortRAM; +end package zpu_memory; diff --git a/zpu/hdl/zealot/testbenches/dmips_med1_tb.vhdl b/zpu/hdl/zealot/testbenches/dmips_med1_tb.vhdl new file mode 100644 index 0000000..8bdcdd3 --- /dev/null +++ b/zpu/hdl/zealot/testbenches/dmips_med1_tb.vhdl @@ -0,0 +1,134 @@ +------------------------------------------------------------------------------ +---- ---- +---- Testbench for the ZPU Medium connection to the FPGA ---- +---- ---- +---- http://www.opencores.org/ ---- +---- ---- +---- Description: ---- +---- This is a testbench to simulate the ZPU_Med1 core as used in the ---- +---- dmips_med1.vhdl ---- +---- ---- +---- To Do: ---- +---- - ---- +---- ---- +---- Author: ---- +---- - Salvador E. Tropea, salvador inti.gob.ar ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Copyright (c) 2008 Salvador E. Tropea <salvador inti.gob.ar> ---- +---- Copyright (c) 2008 Instituto Nacional de Tecnología Industrial ---- +---- ---- +---- Distributed under the BSD license ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Design unit: DMIPS_Med1_TB(Behave) (Entity and architecture) ---- +---- File name: dmips_med1_tb.vhdl ---- +---- Note: None ---- +---- Limitations: None known ---- +---- Errors: None known ---- +---- Library: work ---- +---- Dependencies: IEEE.std_logic_1164 ---- +---- IEEE.numeric_std ---- +---- zpu.zpupkg ---- +---- zpu.txt_util ---- +---- work.zpu_memory ---- +---- Target FPGA: Spartan 3 (XC3S1500-4-FG456) ---- +---- Language: VHDL ---- +---- Wishbone: No ---- +---- Synthesis tools: N/A ---- +---- Simulation tools: GHDL [Sokcho edition] (0.2x) ---- +---- Text editor: SETEdit 0.5.x ---- +---- ---- +------------------------------------------------------------------------------ + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library zpu; +use zpu.zpupkg.all; +use zpu.txt_util.all; + +library work; +use work.zpu_memory.all; + +entity DMIPS_Med1_TB is +end entity DMIPS_Med1_TB; + +architecture Behave of DMIPS_Med1_TB is + constant WORD_SIZE : natural:=32; -- 32 bits data path + constant ADDR_W : natural:=18; -- 18 bits address space=256 kB, 128 kB I/O + constant BRAM_W : natural:=15; -- 15 bits RAM space=32 kB + constant D_CARE_VAL : std_logic:='0'; -- Fill value + constant CLK_FREQ : positive:=50; -- 50 MHz clock + constant CLK_S_PER : time:=1 us/(2.0*real(CLK_FREQ)); -- Clock semi period + constant BRATE : positive:=115200; + + component ZPU_Med1 is + generic( + WORD_SIZE : natural:=32; -- 32 bits data path + D_CARE_VAL : std_logic:='X'; -- Fill value + CLK_FREQ : positive:=50; -- 50 MHz clock + BRATE : positive:=9600; -- RS232 baudrate + ADDR_W : natural:=18; -- 18 bits address space=256 kB, 128 kB I/O + BRAM_W : natural:=15); -- 15 bits RAM space=32 kB + port( + clk_i : in std_logic; -- CPU clock + rst_i : in std_logic; -- Reset + break_o : out std_logic; -- Break executed + dbg_o : out zpu_dbgo_t; -- Debug info + rs232_tx_o : out std_logic; -- UART Tx + rs232_rx_i : in std_logic; -- UART Rx + gpio_in : in std_logic_vector(31 downto 0); + gpio_out : out std_logic_vector(31 downto 0); + gpio_dir : out std_logic_vector(31 downto 0) -- 1 = in, 0 = out + ); + end component ZPU_Med1; + + signal clk : std_logic; + signal reset : std_logic:='1'; + + signal break : std_logic; + signal dbg : zpu_dbgo_t; -- Debug info + signal rs232_tx : std_logic; + signal rs232_rx : std_logic; +begin + zpu : ZPU_Med1 + generic map( + WORD_SIZE => WORD_SIZE, D_CARE_VAL => D_CARE_VAL, + CLK_FREQ => CLK_FREQ, BRATE => BRATE, ADDR_W => ADDR_W, + BRAM_W => BRAM_W) + port map( + clk_i => clk, rst_i => reset, rs232_tx_o => rs232_tx, + rs232_rx_i => rs232_rx, break_o => break, dbg_o => dbg, + gpio_in => (others => '0')); + + trace_mod : Trace + generic map( + ADDR_W => ADDR_W, WORD_SIZE => WORD_SIZE, + LOG_FILE => "dmips_med1.log") + port map( + clk_i => clk, dbg_i => dbg, stop_i => break, busy_i => '0'); + + do_clock: + process + begin + clk <= '0'; + wait for CLK_S_PER; + clk <= '1'; + wait for CLK_S_PER; + if break='1' then + print("* Break asserted, end of test"); + wait; + end if; + end process do_clock; + + do_reset: + process + begin + wait until rising_edge(clk); + reset <= '0'; + end process do_reset; +end architecture Behave; -- Entity: DMIPS_Med1_TB diff --git a/zpu/hdl/zealot/testbenches/small1_tb.vhdl b/zpu/hdl/zealot/testbenches/small1_tb.vhdl new file mode 100644 index 0000000..a77e5bc --- /dev/null +++ b/zpu/hdl/zealot/testbenches/small1_tb.vhdl @@ -0,0 +1,134 @@ +------------------------------------------------------------------------------ +---- ---- +---- Testbench for the ZPU Small connection to the FPGA ---- +---- ---- +---- http://www.opencores.org/ ---- +---- ---- +---- Description: ---- +---- This is a testbench to simulate the ZPU_Small1 core as used in the ---- +---- *_small1.vhdl ---- +---- ---- +---- To Do: ---- +---- - ---- +---- ---- +---- Author: ---- +---- - Salvador E. Tropea, salvador inti.gob.ar ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Copyright (c) 2008 Salvador E. Tropea <salvador inti.gob.ar> ---- +---- Copyright (c) 2008 Instituto Nacional de Tecnología Industrial ---- +---- ---- +---- Distributed under the BSD license ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Design unit: Small1_TB(Behave) (Entity and architecture) ---- +---- File name: small1_tb.vhdl ---- +---- Note: None ---- +---- Limitations: None known ---- +---- Errors: None known ---- +---- Library: work ---- +---- Dependencies: IEEE.std_logic_1164 ---- +---- IEEE.numeric_std ---- +---- zpu.zpupkg ---- +---- zpu.txt_util ---- +---- work.zpu_memory ---- +---- Target FPGA: Spartan 3 (XC3S1500-4-FG456) ---- +---- Language: VHDL ---- +---- Wishbone: No ---- +---- Synthesis tools: N/A ---- +---- Simulation tools: GHDL [Sokcho edition] (0.2x) ---- +---- Text editor: SETEdit 0.5.x ---- +---- ---- +------------------------------------------------------------------------------ + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library zpu; +use zpu.zpupkg.all; +use zpu.txt_util.all; + +library work; +use work.zpu_memory.all; + +entity Small1_TB is +end entity Small1_TB; + +architecture Behave of Small1_TB is + constant WORD_SIZE : natural:=32; -- 32 bits data path + constant ADDR_W : natural:=18; -- 18 bits address space=256 kB, 128 kB I/O + constant BRAM_W : natural:=15; -- 15 bits RAM space=32 kB + constant D_CARE_VAL : std_logic:='0'; -- Fill value + constant CLK_FREQ : positive:=50; -- 50 MHz clock + constant CLK_S_PER : time:=1 us/(2.0*real(CLK_FREQ)); -- Clock semi period + constant BRATE : positive:=115200; + + component ZPU_Small1 is + generic( + WORD_SIZE : natural:=32; -- 32 bits data path + D_CARE_VAL : std_logic:='0'; -- Fill value + CLK_FREQ : positive:=50; -- 50 MHz clock + BRATE : positive:=115200; -- RS232 baudrate + ADDR_W : natural:=16; -- 16 bits address space=64 kB, 32 kB I/O + BRAM_W : natural:=15); -- 15 bits RAM space=32 kB + port( + clk_i : in std_logic; -- CPU clock + rst_i : in std_logic; -- Reset + break_o : out std_logic; -- Break executed + dbg_o : out zpu_dbgo_t; -- Debug info + rs232_tx_o : out std_logic; -- UART Tx + rs232_rx_i : in std_logic; -- UART Rx + gpio_in : in std_logic_vector(31 downto 0); + gpio_out : out std_logic_vector(31 downto 0); + gpio_dir : out std_logic_vector(31 downto 0) -- 1 = in, 0 = out + ); + end component ZPU_Small1; + + signal clk : std_logic; + signal reset : std_logic:='1'; + + signal break : std_logic; + signal dbg : zpu_dbgo_t; -- Debug info + signal rs232_tx : std_logic; + signal rs232_rx : std_logic; +begin + zpu : ZPU_Small1 + generic map( + WORD_SIZE => WORD_SIZE, D_CARE_VAL => D_CARE_VAL, + CLK_FREQ => CLK_FREQ, BRATE => BRATE, ADDR_W => ADDR_W, + BRAM_W => BRAM_W) + port map( + clk_i => clk, rst_i => reset, rs232_tx_o => rs232_tx, + rs232_rx_i => rs232_rx, break_o => break, dbg_o => dbg, + gpio_in => (others => '0')); + + trace_mod : Trace + generic map( + ADDR_W => ADDR_W, WORD_SIZE => WORD_SIZE, + LOG_FILE => "small1_trace.log") + port map( + clk_i => clk, dbg_i => dbg, stop_i => break, busy_i => '0'); + + do_clock: + process + begin + clk <= '0'; + wait for CLK_S_PER; + clk <= '1'; + wait for CLK_S_PER; + if break='1' then + print("* Break asserted, end of test"); + wait; + end if; + end process do_clock; + + do_reset: + process + begin + wait until rising_edge(clk); + reset <= '0'; + end process do_reset; +end architecture Behave; -- Entity: Small1_TB diff --git a/zpu/hdl/zealot/zpu_medium.vhdl b/zpu/hdl/zealot/zpu_medium.vhdl new file mode 100644 index 0000000..47950fe --- /dev/null +++ b/zpu/hdl/zealot/zpu_medium.vhdl @@ -0,0 +1,948 @@ +------------------------------------------------------------------------------ +---- ---- +---- ZPU Medium ---- +---- ---- +---- http://www.opencores.org/ ---- +---- ---- +---- Description: ---- +---- ZPU is a 32 bits small stack cpu. This is the medium size version. ---- +---- Supports external memories. ---- +---- ---- +---- To Do: ---- +---- - ---- +---- ---- +---- Author: ---- +---- - Øyvind Harboe, oyvind.harboe zylin.com ---- +---- - Salvador E. Tropea, salvador inti.gob.ar ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Copyright (c) 2008 Øyvind Harboe <oyvind.harboe zylin.com> ---- +---- Copyright (c) 2008 Salvador E. Tropea <salvador inti.gob.ar> ---- +---- Copyright (c) 2008 Instituto Nacional de Tecnología Industrial ---- +---- ---- +---- Distributed under the BSD license ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Design unit: ZPUMediumCore(Behave) (Entity and architecture) ---- +---- File name: zpu_medium.vhdl ---- +---- Note: None ---- +---- Limitations: None known ---- +---- Errors: None known ---- +---- Library: zpu ---- +---- Dependencies: IEEE.std_logic_1164 ---- +---- IEEE.numeric_std ---- +---- zpu.zpupkg ---- +---- Target FPGA: Spartan 3 (XC3S400-4-FT256) ---- +---- Language: VHDL ---- +---- Wishbone: No ---- +---- Synthesis tools: Xilinx Release 9.2.03i - xst J.39 ---- +---- Simulation tools: GHDL [Sokcho edition] (0.2x) ---- +---- Text editor: SETEdit 0.5.x ---- +---- ---- +------------------------------------------------------------------------------ +-- +-- write_en_o - set to '1' for a single cycle to send off a write request. +-- data_o is valid only while write_en_o='1'. +-- read_en_o - set to '1' for a single cycle to send off a read request. +-- mem_busy_i - It is illegal to send off a read/write request when +-- mem_busy_i='1'. +-- Set to '0' when data_i is valid after a read request. +-- If it goes to '1'(busy), it is on the cycle after read/ +-- write_en_o is '1'. +-- addr_o - address for read/write request +-- data_i - read data. Valid only on the cycle after mem_busy_i='0' +-- after read_en_o='1' for a single cycle. +-- data_o - data to write +-- break_o - set to '1' when CPU hits break instruction + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +library zpu; +use zpu.zpupkg.all; + +entity ZPUMediumCore is + generic( + WORD_SIZE : integer:=32; -- 16/32 (2**wordPower) + ADDR_W : integer:=16; -- Total address space width (incl. I/O) + MEM_W : integer:=15; -- Memory (prog+data+stack) width + D_CARE_VAL : std_logic:='X'; -- Value used to fill the unsused bits + MULT_PIPE : boolean:=false; -- Pipeline multiplication + BINOP_PIPE : integer range 0 to 2:=0; -- Pipeline binary operations (-, =, < and <=) + ENA_LEVEL0 : boolean:=true; -- eq, loadb, neqbranch and pushspadd + ENA_LEVEL1 : boolean:=true; -- lessthan, ulessthan, mult, storeb, callpcrel and sub + ENA_LEVEL2 : boolean:=false; -- lessthanorequal, ulessthanorequal, call and poppcrel + ENA_LSHR : boolean:=true; -- lshiftright + ENA_IDLE : boolean:=false; -- Enable the enable_i input + FAST_FETCH : boolean:=true); -- Merge the st_fetch with the st_execute states + port( + clk_i : in std_logic; -- CPU Clock + reset_i : in std_logic; -- Sync Reset + enable_i : in std_logic; -- Hold the CPU (after reset) + break_o : out std_logic; -- Break instruction executed + dbg_o : out zpu_dbgo_t; -- Debug outputs (i.e. trace log) + -- Memory interface + mem_busy_i : in std_logic; -- Memory is busy + data_i : in unsigned(WORD_SIZE-1 downto 0); -- Data from mem + data_o : out unsigned(WORD_SIZE-1 downto 0); -- Data to mem + addr_o : out unsigned(ADDR_W-1 downto 0); -- Memory address + write_en_o : out std_logic; -- Memory write enable + read_en_o : out std_logic); -- Memory read enable +end entity ZPUMediumCore; + +architecture Behave of ZPUMediumCore is + constant BYTE_BITS : integer:=WORD_SIZE/16; -- # of bits in a word that addresses bytes + constant WORD_BYTES : integer:=WORD_SIZE/OPCODE_W; + constant MAX_ADDR_BIT : integer:=ADDR_W-2; + -- Stack Pointer initial value: BRAM size-8 + constant SP_START_1 : unsigned(ADDR_W-1 downto 0):=to_unsigned((2**MEM_W)-8,ADDR_W); + constant SP_START : unsigned(ADDR_W-1 downto BYTE_BITS):= + SP_START_1(ADDR_W-1 downto BYTE_BITS); + + -- Update [SP+1]. We hold it in b_r, this writes the value to memory. + procedure FlushB(signal we : out std_logic; + signal addr : out unsigned(ADDR_W-1 downto BYTE_BITS); + signal inc_sp : in unsigned(ADDR_W-1 downto BYTE_BITS); + signal data : out unsigned(WORD_SIZE-1 downto 0); + signal b : in unsigned(WORD_SIZE-1 downto 0)) is + begin + we <= '1'; + addr <= inc_sp; + data <= b; + end procedure FlushB; + + -- Do a simple stack push, it is performed in the internal cache registers, + -- not in the real memory. + procedure Push(signal sp : inout unsigned(ADDR_W-1 downto BYTE_BITS); + signal a : in unsigned(WORD_SIZE-1 downto 0); + signal b : out unsigned(WORD_SIZE-1 downto 0)) is + begin + b <= a; -- Update cache [SP+1]=[SP] + sp <= sp-1; + end procedure Push; + + -- Do a simple stack pop, it is performed in the internal cache registers, + -- not in the real memory. + procedure Pop(signal sp : inout unsigned(ADDR_W-1 downto BYTE_BITS); + signal a : out unsigned(WORD_SIZE-1 downto 0); + signal b : in unsigned(WORD_SIZE-1 downto 0)) is + begin + a <= b; -- Update cache [SP]=[SP+1] + sp <= sp+1; + end procedure Pop; + + -- Expand a PC value to WORD_SIZE + function ExpandPC(v : unsigned(ADDR_W-1 downto 0)) return unsigned is + variable nv : unsigned(WORD_SIZE-1 downto 0); + begin + nv:=(others => '0'); + nv(ADDR_W-1 downto 0):=v; + return nv; + end function ExpandPC; + + -- Program counter + signal pc_r : unsigned(ADDR_W-1 downto 0):=(others => '0'); + -- Stack pointer + signal sp_r : unsigned(ADDR_W-1 downto BYTE_BITS):=SP_START; + -- SP+1, SP+2 and SP-1 are very used, these are shortcuts + signal inc_sp : unsigned(ADDR_W-1 downto BYTE_BITS); + signal inc_inc_sp : unsigned(ADDR_W-1 downto BYTE_BITS); + -- a_r is a cache for the top of the stack [SP] + -- Note: as this is a stack CPU this is a very important register. + signal a_r : unsigned(WORD_SIZE-1 downto 0); + -- b_r is a cache for the next value in the stack [SP+1] + signal b_r : unsigned(WORD_SIZE-1 downto 0); + signal bin_op_res1_r : unsigned(WORD_SIZE-1 downto 0):=(others => '0'); + signal bin_op_res2_r : unsigned(WORD_SIZE-1 downto 0):=(others => '0'); + signal mult_res1_r : unsigned(WORD_SIZE-1 downto 0); + signal mult_res2_r : unsigned(WORD_SIZE-1 downto 0); + signal mult_res3_r : unsigned(WORD_SIZE-1 downto 0); + signal mult_a_r : unsigned(WORD_SIZE-1 downto 0):=(others => '0'); + signal mult_b_r : unsigned(WORD_SIZE-1 downto 0):=(others => '0'); + signal idim_r : std_logic; + signal write_en_r : std_logic; + signal read_en_r : std_logic; + signal addr_r : unsigned(ADDR_W-1 downto BYTE_BITS):=(others => '0'); + signal fetched_w_r : unsigned(WORD_SIZE-1 downto 0); + + type state_t is(st_load2, st_popped, st_load_sp2, st_load_sp3, st_add_sp2, + st_fetch, st_execute, st_decode, st_decode2, st_resync, + st_store_sp2, st_resync2, st_resync3, st_loadb2, st_storeb2, + st_mult2, st_mult3, st_mult5, st_mult4, st_binary_op_res2, + st_binary_op_res, st_idle); + signal state : state_t:=st_resync; + + -- Go to st_fetch state or just do its work + procedure DoFetch(constant FAST : boolean; + signal state : out state_t; + signal addr : out unsigned(ADDR_W-1 downto BYTE_BITS); + signal pc : in unsigned(ADDR_W-1 downto 0); + signal re : out std_logic; + signal busy : in std_logic) is + begin + if FAST then + -- Equivalent to st_fetch + if busy='0' then + addr <= pc(ADDR_W-1 downto BYTE_BITS); + re <= '1'; + state <= st_decode; + end if; + else + state <= st_fetch; + end if; + end procedure DoFetch; + + -- Perform a "binary operation" (2 operands) + procedure DoBinOp(result : in unsigned(WORD_SIZE-1 downto 0); + signal state : out state_t; + signal sp : inout unsigned(ADDR_W-1 downto BYTE_BITS); + signal addr : out unsigned(ADDR_W-1 downto BYTE_BITS); + signal re : out std_logic; + signal dest : out unsigned(WORD_SIZE-1 downto 0); + signal dest_p : out unsigned(WORD_SIZE-1 downto 0); + constant DEPTH : natural) is + begin + if DEPTH=2 then + -- 2 clocks: st_binary_op_res+st_binary_op_res2 + state <= st_binary_op_res; + dest_p <= result; + elsif DEPTH=1 then + -- 1 clock: st_binary_op_res2 + state <= st_binary_op_res2; + dest_p <= result; + else -- 0 clocks + re <= '1'; + addr <= sp+2; + sp <= sp+1; + dest <= result; + state <= st_popped; + end if; + end procedure DoBinOp; + + -- Perform a boolean "binary operation" (2 operands) + procedure DoBinOpBool(result : in boolean; + signal state : out state_t; + signal sp : inout unsigned(ADDR_W-1 downto BYTE_BITS); + signal addr : out unsigned(ADDR_W-1 downto BYTE_BITS); + signal re : out std_logic; + signal dest : out unsigned(WORD_SIZE-1 downto 0); + signal dest_p : out unsigned(WORD_SIZE-1 downto 0); + constant DEPTH : natural) is + variable res : unsigned(WORD_SIZE-1 downto 0):=(others => '0'); + begin + if result then + res(0):='1'; + end if; + DoBinOp(res,state,sp,addr,re,dest,dest_p,DEPTH); + end procedure DoBinOpBool; + + type insn_t is (dec_add_top, dec_dup, dec_dup_stk_b, dec_pop, dec_add, + dec_or, dec_and, dec_store, dec_add_sp, dec_shift, dec_nop, + dec_im, dec_load_sp, dec_store_sp, dec_emulate, dec_load, + dec_push_sp, dec_pop_pc, dec_pop_pc_rel, dec_not, dec_flip, + dec_pop_sp, dec_neq_branch, dec_eq, dec_loadb, dec_mult, + dec_less_than, dec_less_than_or_equal, dec_lshr, + dec_u_less_than_or_equal, dec_u_less_than, dec_push_sp_add, + dec_call, dec_call_pc_rel, dec_sub, dec_break, dec_storeb, + dec_insn_fetch, dec_pop_down); + signal insn : insn_t; + type insn_array_t is array(0 to WORD_BYTES-1) of insn_t; + signal insns : insn_array_t; + type opcode_array_t is array(0 to WORD_BYTES-1) of unsigned(OPCODE_W-1 downto 0); + signal opcode_r : opcode_array_t; +begin + -- the memory subsystem will tell us one cycle later whether or + -- not it is busy + write_en_o <= write_en_r; + read_en_o <= read_en_r; + addr_o(ADDR_W-1 downto BYTE_BITS) <= addr_r; + addr_o(BYTE_BITS-1 downto 0) <= (others => '0'); + + -- SP+1 and +2 + inc_sp <= sp_r+1; + inc_inc_sp <= sp_r+2; + + opcode_control: + process (clk_i) + variable topcode : unsigned(OPCODE_W-1 downto 0); + variable ex_opcode : unsigned(OPCODE_W-1 downto 0); + variable sp_offset : unsigned(4 downto 0); + variable tsp_offset : unsigned(4 downto 0); + variable next_pc : unsigned(ADDR_W-1 downto 0); + variable tdecoded : insn_t; + variable tinsns : insn_array_t; + variable mult_res : unsigned(WORD_SIZE*2-1 downto 0); + variable ipc_low : integer range 0 to 3; -- Address inside a word (pc_r) + variable inpc_low : integer range 0 to 3; -- Address inside a word (next_pc) + variable h_bit : integer; + variable l_bit : integer; + variable not_lshr : std_logic:='1'; + begin + if rising_edge(clk_i) then + break_o <= '0'; + if reset_i='1' then + if ENA_IDLE then + state <= st_idle; + else + state <= st_resync; + end if; + sp_r <= SP_START; + pc_r <= (others => '0'); + idim_r <= '0'; + write_en_r <= '0'; + read_en_r <= '0'; + mult_a_r <= (others => '0'); + mult_b_r <= (others => '0'); + dbg_o.b_inst <= '0'; + -- Reseting add_r here makes XST fail to use BRAMs ?! + else -- reset_i='1' + if MULT_PIPE then + -- We must multiply unconditionally to get pipelined multiplication + mult_res:=mult_a_r*mult_b_r; + mult_res1_r <= mult_res(WORD_SIZE-1 downto 0); + mult_res2_r <= mult_res1_r; + mult_res3_r <= mult_res2_r; + mult_a_r <= (others => D_CARE_VAL); + mult_b_r <= (others => D_CARE_VAL); + end if; + + if BINOP_PIPE=2 then + bin_op_res2_r <= bin_op_res1_r; -- pipeline a bit. + end if; + + read_en_r <='0'; + write_en_r <='0'; + -- Allow synthesis tools to load bogus values when we don't + -- care about the address and output data. + addr_r <= (others => D_CARE_VAL); + data_o <= (others => D_CARE_VAL); + + if (write_en_r='1') and (read_en_r='1') then + report "read/write collision" severity failure; + end if; + + ipc_low:=to_integer(pc_r(BYTE_BITS-1 downto 0)); + sp_offset(4):=not opcode_r(ipc_low)(4); + sp_offset(3 downto 0):=opcode_r(ipc_low)(3 downto 0); + next_pc:=pc_r+1; + + -- Prepare trace snapshot + dbg_o.opcode <= opcode_r(ipc_low); + dbg_o.pc <= resize(pc_r,32); + dbg_o.stk_a <= resize(a_r,32); + dbg_o.stk_b <= resize(b_r,32); + dbg_o.b_inst <= '0'; + dbg_o.sp <= (others => '0'); + dbg_o.sp(ADDR_W-1 downto BYTE_BITS) <= sp_r; + + case state is + when st_idle => + if enable_i='1' then + state <= st_resync; + end if; + -- Initial state of ZPU, fetch top of stack (A/B) + first instruction + when st_resync => + if mem_busy_i='0' then + addr_r <= sp_r; + read_en_r <= '1'; + state <= st_resync2; + end if; + when st_resync2 => + if mem_busy_i='0' then + a_r <= data_i; + addr_r <= inc_sp; + read_en_r <= '1'; + state <= st_resync3; + end if; + when st_resync3 => + if mem_busy_i='0' then + b_r <= data_i; + addr_r <= pc_r(ADDR_W-1 downto BYTE_BITS); + read_en_r <= '1'; + state <= st_decode; + end if; + when st_decode => + if mem_busy_i='0' then + -- Here we latch the fetched word to give one full clock + -- cycle to the instruction decoder. This could be removed + -- if using BRAMs and the decoder delay isn't important. + fetched_w_r <= data_i; + state <= st_decode2; + end if; + when st_decode2 => + -- decode 4 instructions in parallel + for i in 0 to WORD_BYTES-1 loop + topcode:=fetched_w_r((WORD_BYTES-1-i+1)*8-1 downto (WORD_BYTES-1-i)*8); + + tsp_offset(4):=not topcode(4); + tsp_offset(3 downto 0):=topcode(3 downto 0); + + opcode_r(i) <= topcode; + if topcode(7 downto 7)=OPCODE_IM then + tdecoded:=dec_im; + elsif topcode(7 downto 5)=OPCODE_STORESP then + if tsp_offset=0 then + -- Special case, we can avoid a write + tdecoded:=dec_pop; + elsif tsp_offset=1 then + -- Special case, collision + tdecoded:=dec_pop_down; + else + tdecoded:=dec_store_sp; + end if; + elsif topcode(7 downto 5)=OPCODE_LOADSP then + if tsp_offset=0 then + tdecoded:=dec_dup; + elsif tsp_offset=1 then + tdecoded:=dec_dup_stk_b; + else + tdecoded:=dec_load_sp; + end if; + elsif topcode(7 downto 5)=OPCODE_EMULATE then + tdecoded:=dec_emulate; + if ENA_LEVEL0 and topcode(5 downto 0)=OPCODE_NEQBRANCH then + tdecoded:=dec_neq_branch; + elsif ENA_LEVEL0 and topcode(5 downto 0)=OPCODE_EQ then + tdecoded:=dec_eq; + elsif ENA_LEVEL0 and topcode(5 downto 0)=OPCODE_LOADB then + tdecoded:=dec_loadb; + elsif ENA_LEVEL0 and topcode(5 downto 0)=OPCODE_PUSHSPADD then + tdecoded:=dec_push_sp_add; + elsif ENA_LEVEL1 and topcode(5 downto 0)=OPCODE_LESSTHAN then + tdecoded:=dec_less_than; + elsif ENA_LEVEL1 and topcode(5 downto 0)=OPCODE_ULESSTHAN then + tdecoded:=dec_u_less_than; + elsif ENA_LEVEL1 and topcode(5 downto 0)=OPCODE_MULT then + tdecoded:=dec_mult; + elsif ENA_LEVEL1 and topcode(5 downto 0)=OPCODE_STOREB then + tdecoded:=dec_storeb; + elsif ENA_LEVEL1 and topcode(5 downto 0)=OPCODE_CALLPCREL then + tdecoded:=dec_call_pc_rel; + elsif ENA_LEVEL1 and topcode(5 downto 0)=OPCODE_SUB then + tdecoded:=dec_sub; + elsif ENA_LEVEL2 and topcode(5 downto 0)=OPCODE_LESSTHANOREQUAL then + tdecoded:=dec_less_than_or_equal; + elsif ENA_LEVEL2 and topcode(5 downto 0)=OPCODE_ULESSTHANOREQUAL then + tdecoded:=dec_u_less_than_or_equal; + elsif ENA_LEVEL2 and topcode(5 downto 0)=OPCODE_CALL then + tdecoded:=dec_call; + elsif ENA_LEVEL2 and topcode(5 downto 0)=OPCODE_POPPCREL then + tdecoded:=dec_pop_pc_rel; + elsif ENA_LSHR and topcode(5 downto 0)=OPCODE_LSHIFTRIGHT then + tdecoded:=dec_lshr; + end if; + elsif topcode(7 downto 4)=OPCODE_ADDSP then + if tsp_offset=0 then + tdecoded:=dec_shift; + elsif tsp_offset=1 then + tdecoded:=dec_add_top; + else + tdecoded:=dec_add_sp; + end if; + else -- OPCODE_SHORT + case topcode(3 downto 0) is + when OPCODE_BREAK => + tdecoded:=dec_break; + when OPCODE_PUSHSP => + tdecoded:=dec_push_sp; + when OPCODE_POPPC => + tdecoded:=dec_pop_pc; + when OPCODE_ADD => + tdecoded:=dec_add; + when OPCODE_OR => + tdecoded:=dec_or; + when OPCODE_AND => + tdecoded:=dec_and; + when OPCODE_LOAD => + tdecoded:=dec_load; + when OPCODE_NOT => + tdecoded:=dec_not; + when OPCODE_FLIP => + tdecoded:=dec_flip; + when OPCODE_STORE => + tdecoded:=dec_store; + when OPCODE_POPSP => + tdecoded:=dec_pop_sp; + when others => -- OPCODE_NOP and others + tdecoded:=dec_nop; + end case; + end if; + tinsns(i):=tdecoded; + end loop; + + insn <= tinsns(ipc_low); + -- once we wrap, we need to fetch + tinsns(0):=dec_insn_fetch; + insns <= tinsns; + state <= st_execute; + + -- Each instruction must: + -- + -- 1. increase pc_r if applicable + -- 2. set next state if applicable + -- 3. do it's operation + when st_execute => + -- Some shortcut to make the code readable: + inpc_low:=to_integer(next_pc(BYTE_BITS-1 downto 0)); + ex_opcode:=opcode_r(ipc_low); + insn <= insns(inpc_low); + -- Defaults used by most instructions + if insn/=dec_insn_fetch and insn/=dec_im then + dbg_o.b_inst <= '1'; + idim_r <= '0'; + end if; + case insn is + when dec_insn_fetch => + -- Not a real instruction, fetch new instructions + DoFetch(FAST_FETCH,state,addr_r,pc_r,read_en_r,mem_busy_i); + when dec_im => + -- Push(immediate value), IDIM=1 + -- if IDIM=0 Push(signed(opcode & 0x7F)) else + -- Push((Pop()<<7)|(opcode&0x7F)) + if mem_busy_i='0' then + dbg_o.b_inst <= '1'; + idim_r <= '1'; + pc_r <= pc_r+1; + if idim_r='1' then + -- We already started an IM sequence + -- Shift left 7 bits + a_r(WORD_SIZE-1 downto 7) <= a_r(WORD_SIZE-8 downto 0); + -- Put the new value + a_r(6 downto 0) <= ex_opcode(6 downto 0); + else + -- First IM, push the value sign extended + FlushB(write_en_r,addr_r,inc_sp,data_o,b_r); + a_r <= unsigned(resize(signed(ex_opcode(6 downto 0)),WORD_SIZE)); + Push(sp_r,a_r,b_r); + end if; + end if; + when dec_store_sp => + -- [SP+Offset]=Pop() + if mem_busy_i='0' then + write_en_r <= '1'; + addr_r <= sp_r+sp_offset; + data_o <= a_r; + Pop(sp_r,a_r,b_r); + -- We need to fetch B + state <= st_store_sp2; + end if; + when dec_load_sp => + -- Push([SP+Offset]) + if mem_busy_i='0' then + FlushB(write_en_r,addr_r,inc_sp,data_o,b_r); + Push(sp_r,a_r,b_r); + -- We are flushing B cache, so we need more time to + -- read the value. + state <= st_load_sp2; + end if; + when dec_emulate => + -- Push(PC+1), PC=Opcode[4:0]*32 + if mem_busy_i='0' then + FlushB(write_en_r,addr_r,inc_sp,data_o,b_r); + state <= st_fetch; + a_r <= ExpandPC(pc_r+1); + Push(sp_r,a_r,b_r); + -- The emulate address is: + -- 98 7654 3210 + -- 0000 00aa aaa0 0000 + pc_r <= (others => '0'); + pc_r(9 downto 5) <= ex_opcode(4 downto 0); + end if; + when dec_call_pc_rel => + -- t=Pop(), Push(PC+1), PC=PC+t + if mem_busy_i='0' and ENA_LEVEL1 then + state <= st_fetch; + a_r <= ExpandPC(pc_r+1); + pc_r <= pc_r+a_r(ADDR_W-1 downto 0); + end if; + when dec_call => + -- t=Pop(), Push(PC+1), PC=t + if mem_busy_i='0' and ENA_LEVEL2 then + state <= st_fetch; + a_r <= ExpandPC(pc_r+1); + pc_r <= a_r(ADDR_W-1 downto 0); + end if; + when dec_add_sp => + -- Push(Pop()+[SP+Offset]) + if mem_busy_i='0' then + -- Read SP+Offset + state <= st_add_sp2; + read_en_r <= '1'; + addr_r <= sp_r+sp_offset; + pc_r <= pc_r+1; + end if; + when dec_push_sp => + -- Push(SP) + if mem_busy_i='0' then + FlushB(write_en_r,addr_r,inc_sp,data_o,b_r); + pc_r <= pc_r+1; + a_r <= (others => '0'); + a_r(ADDR_W-1 downto BYTE_BITS) <= sp_r; + Push(sp_r,a_r,b_r); + end if; + when dec_pop_pc => + -- PC=Pop() (return) + if mem_busy_i='0' then + FlushB(write_en_r,addr_r,inc_sp,data_o,b_r); + state <= st_resync; + pc_r <= a_r(ADDR_W-1 downto 0); + sp_r <= inc_sp; + end if; + when dec_pop_pc_rel => + -- PC=PC+Pop() + if mem_busy_i='0' and ENA_LEVEL2 then + FlushB(write_en_r,addr_r,inc_sp,data_o,b_r); + state <= st_resync; + pc_r <= a_r(ADDR_W-1 downto 0)+pc_r; + sp_r <= inc_sp; + end if; + when dec_add => + -- Push(Pop()+Pop()) [A=A+B, SP++, update B] + if mem_busy_i='0' then + state <= st_popped; + a_r <= a_r+b_r; + read_en_r <= '1'; + addr_r <= inc_inc_sp; + sp_r <= inc_sp; + end if; + when dec_sub => + -- a=Pop(), b=Pop(), Push(b-a) + if mem_busy_i='0' and ENA_LEVEL1 then + DoBinOp(b_r-a_r,state,sp_r,addr_r,read_en_r, + a_r,bin_op_res1_r,BINOP_PIPE); + end if; + when dec_pop => + -- Pop() + if mem_busy_i='0' then + state <= st_popped; + addr_r <= inc_inc_sp; + read_en_r <= '1'; + Pop(sp_r,a_r,b_r); + end if; + when dec_pop_down => + -- t=Pop(), Pop(), Push(t) + if mem_busy_i='0' then + -- PopDown leaves top of stack unchanged + state <= st_popped; + addr_r <= inc_inc_sp; + read_en_r <= '1'; + sp_r <= inc_sp; + end if; + when dec_or => + -- Push(Pop() or Pop()) + if mem_busy_i='0' then + state <= st_popped; + a_r <= a_r or b_r; + read_en_r <= '1'; + addr_r <= inc_inc_sp; + sp_r <= inc_sp; + end if; + when dec_and => + -- Push(Pop() and Pop()) + if mem_busy_i='0' then + state <= st_popped; + a_r <= a_r and b_r; + read_en_r <= '1'; + addr_r <= inc_inc_sp; + sp_r <= inc_sp; + end if; + when dec_eq => + -- a=Pop(), b=Pop(), Push(a=b ? 1 : 0) + if mem_busy_i='0' and ENA_LEVEL0 then + DoBinOpBool(a_r=b_r,state,sp_r,addr_r,read_en_r, + a_r,bin_op_res1_r,BINOP_PIPE); + end if; + when dec_u_less_than => + -- a=Pop(), b=Pop(), Push(a<b ? 1 : 0) + if mem_busy_i='0' and ENA_LEVEL1 then + DoBinOpBool(a_r<b_r,state,sp_r,addr_r,read_en_r, + a_r,bin_op_res1_r,BINOP_PIPE); + end if; + when dec_u_less_than_or_equal => + -- a=Pop(), b=Pop(), Push(a<=b ? 1 : 0) + if mem_busy_i='0' and ENA_LEVEL2 then + DoBinOpBool(a_r<=b_r,state,sp_r,addr_r,read_en_r, + a_r,bin_op_res1_r,BINOP_PIPE); + end if; + when dec_less_than => + -- a=signed(Pop()), b=signed(Pop()), Push(a<b ? 1 : 0) + if mem_busy_i='0' and ENA_LEVEL1 then + DoBinOpBool(signed(a_r)<signed(b_r),state,sp_r, + addr_r,read_en_r,a_r,bin_op_res1_r, + BINOP_PIPE); + end if; + when dec_less_than_or_equal => + -- a=signed(Pop()), b=signed(Pop()), Push(a<=b ? 1 : 0) + if mem_busy_i='0' and ENA_LEVEL2 then + DoBinOpBool(signed(a_r)<=signed(b_r),state,sp_r, + addr_r,read_en_r,a_r,bin_op_res1_r, + BINOP_PIPE); + end if; + when dec_load => + -- Push([Pop()]) + if mem_busy_i='0' then + state <= st_load2; + addr_r <= a_r(ADDR_W-1 downto BYTE_BITS); + read_en_r <= '1'; + pc_r <= pc_r+1; + end if; + when dec_dup => + -- t=Pop(), Push(t), Push(t) + if mem_busy_i='0' then + pc_r <= pc_r+1; + -- A is dupped, no change + Push(sp_r,a_r,b_r); + FlushB(write_en_r,addr_r,inc_sp,data_o,b_r); + end if; + when dec_dup_stk_b => + -- Pop(), t=Pop(), Push(t), Push(t), Push(t) + if mem_busy_i='0' then + pc_r <= pc_r+1; + a_r <= b_r; + -- B goes to A + Push(sp_r,a_r,b_r); + FlushB(write_en_r,addr_r,inc_sp,data_o,b_r); + end if; + when dec_store => + -- a=Pop(), b=Pop(), [a]=b + if mem_busy_i='0' then + state <= st_resync; + pc_r <= pc_r+1; + addr_r <= a_r(ADDR_W-1 downto BYTE_BITS); + data_o <= b_r; + write_en_r <= '1'; + sp_r <= inc_inc_sp; + end if; + when dec_pop_sp => + -- SP=Pop() + if mem_busy_i='0' then + FlushB(write_en_r,addr_r,inc_sp,data_o,b_r); + state <= st_resync; + pc_r <= pc_r+1; + sp_r <= a_r(ADDR_W-1 downto BYTE_BITS); + end if; + when dec_nop => + pc_r <= pc_r+1; + when dec_not => + -- Push(not(Pop())) + pc_r <= pc_r+1; + a_r <= not a_r; + when dec_flip => + -- Push(flip(Pop())) + pc_r <= pc_r+1; + for i in 0 to WORD_SIZE-1 loop + a_r(i) <= a_r(WORD_SIZE-1-i); + end loop; + when dec_add_top => + -- a=Pop(), b=Pop(), Push(b), Push(a+b) + pc_r <= pc_r+1; + a_r <= a_r+b_r; + when dec_shift => + -- Push(Pop()<<1) [equivalent to a=Pop(), Push(a+a)] + pc_r <= pc_r+1; + a_r(WORD_SIZE-1 downto 1) <= a_r(WORD_SIZE-2 downto 0); + a_r(0) <= '0'; + when dec_push_sp_add => + -- Push(Pop()+SP) + if ENA_LEVEL0 then + pc_r <= pc_r+1; + a_r <= (others => '0'); + a_r(ADDR_W-1 downto BYTE_BITS) <= + a_r(ADDR_W-1-BYTE_BITS downto 0)+sp_r; + end if; + when dec_neq_branch => + -- a=Pop(), b=Pop(), PC+=b==0 ? 1 : a + -- Branches are almost always taken as they form loops + if ENA_LEVEL0 then + sp_r <= inc_inc_sp; + -- Need to fetch stack again. + state <= st_resync; + if b_r/=0 then + pc_r <= a_r(ADDR_W-1 downto 0)+pc_r; + else + pc_r <= pc_r+1; + end if; + end if; + when dec_mult => + -- Push(Pop()*Pop()) + if ENA_LEVEL1 then + if MULT_PIPE then + mult_a_r <= a_r; + mult_b_r <= b_r; + state <= st_mult2; + else + mult_res:=a_r*b_r; + mult_res1_r <= mult_res(WORD_SIZE-1 downto 0); + state <= st_mult5; + end if; + end if; + when dec_break => + -- Assert the break_o signal + --report "Break instruction encountered" severity failure; + break_o <= '1'; + pc_r <= pc_r+1; + when dec_loadb => + -- Push([Pop()] & 0xFF) (byte address) + if mem_busy_i='0' and ENA_LEVEL0 then + state <= st_loadb2; + addr_r <= a_r(ADDR_W-1 downto BYTE_BITS); + read_en_r <= '1'; + pc_r <= pc_r+1; + end if; + when dec_storeb => + -- [Pop()]=Pop() & 0xFF (byte address) + if mem_busy_i='0' and ENA_LEVEL1 then + state <= st_storeb2; + addr_r <= a_r(ADDR_W-1 downto BYTE_BITS); + read_en_r <= '1'; + pc_r <= pc_r+1; + end if; + when dec_lshr => + -- a=Pop(), b=Pop(), Push(b>>(a&0x3F)) + if ENA_LSHR then + -- This instruction takes more than one cycle. + -- We must avoid duplications in the trace log. + dbg_o.b_inst <= not_lshr; + not_lshr:='0'; + if a_r(5 downto 0)=0 then -- Only 6 bits used + -- No more shifts + if mem_busy_i='0' then + state <= st_popped; + a_r <= b_r; + read_en_r <= '1'; + addr_r <= inc_inc_sp; + sp_r <= inc_sp; + not_lshr:='1'; + end if; + else -- More shifts needed + b_r <= "0"&b_r(WORD_SIZE-1 downto 1); + a_r(5 downto 0) <= a_r(5 downto 0)-1; + insn <= insn; + end if; + end if; + when others => + -- Undefined behavior, we shouldn't get here. + -- It only helps synthesis tools. + sp_r <= (others => D_CARE_VAL); + report "Illegal decode instruction?!" severity failure; + --break_o <= '1'; + end case; + -- The followup of operations that takes more than one execution clock + when st_store_sp2 => + if mem_busy_i='0' then + addr_r <= inc_sp; + read_en_r <= '1'; + state <= st_popped; + end if; + when st_load_sp2 => + if mem_busy_i='0' then + state <= st_load_sp3; + -- Now we can read SP+Offset (SP already decremented) + read_en_r <= '1'; + addr_r <= sp_r+sp_offset+1; + end if; + when st_load_sp3 => + if mem_busy_i='0' then + -- Note: We can't increment PC in the decode stage + -- because it will modify sp_offset. + pc_r <= pc_r+1; + -- Finally we have the result in A + state <= st_execute; + a_r <= data_i; + end if; + when st_add_sp2 => + if mem_busy_i='0' then + state <= st_execute; + a_r <= a_r+data_i; + end if; + when st_load2 => + if mem_busy_i='0' then + a_r <= data_i; + state <= st_execute; + end if; + when st_loadb2 => + if mem_busy_i='0' then + a_r <= (others => '0'); + -- Select the source bits using the less significant bits (byte address) + h_bit:=(WORD_BYTES-to_integer(a_r(BYTE_BITS-1 downto 0)))*8-1; + l_bit:=h_bit-7; + a_r(7 downto 0) <= data_i(h_bit downto l_bit); + state <= st_execute; + end if; + when st_storeb2 => + if mem_busy_i='0' then + addr_r <= a_r(ADDR_W-1 downto BYTE_BITS); + data_o <= data_i; + -- Select the source bits using the less significant bits (byte address) + h_bit:=(WORD_BYTES-to_integer(a_r(BYTE_BITS-1 downto 0)))*8-1; + l_bit:=h_bit-7; + data_o(h_bit downto l_bit) <= b_r(7 downto 0); + write_en_r <= '1'; + sp_r <= inc_inc_sp; + state <= st_resync; + end if; + when st_fetch => + if mem_busy_i='0' then + addr_r <= pc_r(ADDR_W-1 downto BYTE_BITS); + read_en_r <= '1'; + state <= st_decode; + end if; + -- The following states can be used to leave cycles free for + -- tools that can automagically decompose the multiplication + -- in various stages. Xilinx tools can do it to increase the + -- multipliers performance. + when st_mult2 => + state <= st_mult3; + when st_mult3 => + state <= st_mult4; + when st_mult4 => + state <= st_mult5; + when st_mult5 => + if mem_busy_i='0' then + if MULT_PIPE then + a_r <= mult_res3_r; + else + a_r <= mult_res1_r; + end if; + read_en_r <= '1'; + addr_r <= inc_inc_sp; + sp_r <= inc_sp; + state <= st_popped; + end if; + when st_binary_op_res => + -- BINOP_PIPE=2 + state <= st_binary_op_res2; + when st_binary_op_res2 => + -- BINOP_PIPE>=1 + read_en_r <= '1'; + addr_r <= inc_inc_sp; + sp_r <= inc_sp; + state <= st_popped; + if BINOP_PIPE=2 then + a_r <= bin_op_res2_r; + else -- 1 + a_r <= bin_op_res1_r; + end if; + when st_popped => + if mem_busy_i='0' then + -- Note: Moving this PC++ to the decoder seems to + -- consume more LUTs. + pc_r <= pc_r+1; + b_r <= data_i; + state <= st_execute; + end if; + when others => + -- Undefined behavior, we shouldn't get here. + -- It only helps synthesis tools. + sp_r <= (others => D_CARE_VAL); + report "Illegal state?!" severity failure; + --break_o <= '1'; + end case; -- state + end if; -- else reset_i='1' + end if; -- rising_edge(clk_i) + end process opcode_control; +end architecture Behave; -- Entity: ZPUMediumCore + diff --git a/zpu/hdl/zealot/zpu_pkg.vhdl b/zpu/hdl/zealot/zpu_pkg.vhdl new file mode 100644 index 0000000..915f352 --- /dev/null +++ b/zpu/hdl/zealot/zpu_pkg.vhdl @@ -0,0 +1,292 @@ +------------------------------------------------------------------------------
+---- ----
+---- ZPU Package ----
+---- ----
+---- http://www.opencores.org/ ----
+---- ----
+---- Description: ----
+---- ZPU is a 32 bits small stack cpu. This is the package. ----
+---- ----
+---- To Do: ----
+---- - ----
+---- ----
+---- Author: ----
+---- - Øyvind Harboe, oyvind.harboe zylin.com ----
+---- - Salvador E. Tropea, salvador inti.gob.ar ----
+---- ----
+------------------------------------------------------------------------------
+---- ----
+---- Copyright (c) 2008 Øyvind Harboe <oyvind.harboe zylin.com> ----
+---- Copyright (c) 2008 Salvador E. Tropea <salvador inti.gob.ar> ----
+---- Copyright (c) 2008 Instituto Nacional de Tecnología Industrial ----
+---- ----
+---- Distributed under the BSD license ----
+---- ----
+------------------------------------------------------------------------------
+---- ----
+---- Design unit: zpupkg, UART (Package) ----
+---- File name: zpu_medium.vhdl ----
+---- Note: None ----
+---- Limitations: None known ----
+---- Errors: None known ----
+---- Library: zpu ----
+---- Dependencies: IEEE.std_logic_1164 ----
+---- IEEE.numeric_std ----
+---- Target FPGA: Spartan 3 (XC3S400-4-FT256) ----
+---- Language: VHDL ----
+---- Wishbone: No ----
+---- Synthesis tools: Xilinx Release 9.2.03i - xst J.39 ----
+---- Simulation tools: GHDL [Sokcho edition] (0.2x) ----
+---- Text editor: SETEdit 0.5.x ----
+---- ----
+------------------------------------------------------------------------------
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.numeric_std.all;
+
+package zpupkg is
+ constant OPCODE_W : integer:=8;
+
+ -- Debug structure, currently only for the trace module
+ type zpu_dbgo_t is record
+ b_inst : std_logic;
+ opcode : unsigned(OPCODE_W-1 downto 0);
+ pc : unsigned(31 downto 0);
+ sp : unsigned(31 downto 0);
+ stk_a : unsigned(31 downto 0);
+ stk_b : unsigned(31 downto 0);
+ end record;
+
+ component Trace is
+ generic(
+ LOG_FILE : string:="trace.txt"; -- Name of the trace file
+ ADDR_W : integer:=16; -- Address width
+ WORD_SIZE : integer:=32); -- 16/32
+ port(
+ clk_i : in std_logic;
+ dbg_i : in zpu_dbgo_t;
+ stop_i : in std_logic;
+ busy_i : in std_logic
+ );
+ end component Trace;
+
+ component ZPUSmallCore is
+ generic(
+ WORD_SIZE : integer:=32; -- Data width 16/32
+ ADDR_W : integer:=16; -- Total address space width (incl. I/O)
+ MEM_W : integer:=15; -- Memory (prog+data+stack) width
+ D_CARE_VAL : std_logic:='X'); -- Value used to fill the unsused bits
+ port(
+ clk_i : in std_logic; -- System Clock
+ reset_i : in std_logic; -- Synchronous Reset
+ interrupt_i : in std_logic; -- Interrupt
+ break_o : out std_logic; -- Breakpoint opcode executed
+ dbg_o : out zpu_dbgo_t; -- Debug outputs (i.e. trace log)
+ -- BRAM (text, data, bss and stack)
+ a_we_o : out std_logic; -- BRAM A port Write Enable
+ a_addr_o : out unsigned(MEM_W-1 downto WORD_SIZE/16):=(others => '0'); -- BRAM A Address
+ a_o : out unsigned(WORD_SIZE-1 downto 0):=(others => '0'); -- Data to BRAM A port
+ a_i : in unsigned(WORD_SIZE-1 downto 0); -- Data from BRAM A port
+ b_we_o : out std_logic; -- BRAM B port Write Enable
+ b_addr_o : out unsigned(MEM_W-1 downto WORD_SIZE/16):=(others => '0'); -- BRAM B Address
+ b_o : out unsigned(WORD_SIZE-1 downto 0):=(others => '0'); -- Data to BRAM B port
+ b_i : in unsigned(WORD_SIZE-1 downto 0); -- Data from BRAM B port
+ -- Memory mapped I/O
+ mem_busy_i : in std_logic;
+ data_i : in unsigned(WORD_SIZE-1 downto 0);
+ data_o : out unsigned(WORD_SIZE-1 downto 0);
+ addr_o : out unsigned(ADDR_W-1 downto 0);
+ write_en_o : out std_logic;
+ read_en_o : out std_logic);
+ end component ZPUSmallCore;
+
+ component ZPUMediumCore is
+ generic(
+ WORD_SIZE : integer:=32; -- Data width 16/32
+ ADDR_W : integer:=16; -- Total address space width (incl. I/O)
+ MEM_W : integer:=15; -- Memory (prog+data+stack) width
+ D_CARE_VAL : std_logic:='X'; -- Value used to fill the unsused bits
+ MULT_PIPE : boolean:=false; -- Pipeline multiplication
+ BINOP_PIPE : integer range 0 to 2:=0; -- Pipeline binary operations (-, =, < and <=)
+ ENA_LEVEL0 : boolean:=true; -- eq, loadb, neqbranch and pushspadd
+ ENA_LEVEL1 : boolean:=true; -- lessthan, ulessthan, mult, storeb, callpcrel and sub
+ ENA_LEVEL2 : boolean:=false; -- lessthanorequal, ulessthanorequal, call and poppcrel
+ ENA_LSHR : boolean:=true; -- lshiftright
+ ENA_IDLE : boolean:=false; -- Enable the enable_i input
+ FAST_FETCH : boolean:=true); -- Merge the st_fetch with the st_execute states
+ port(
+ clk_i : in std_logic; -- CPU Clock
+ reset_i : in std_logic; -- Sync Reset
+ enable_i : in std_logic; -- Hold the CPU (after reset)
+ break_o : out std_logic; -- Break instruction executed
+ dbg_o : out zpu_dbgo_t; -- Debug outputs (i.e. trace log)
+ -- Memory interface
+ mem_busy_i : in std_logic; -- Memory is busy
+ data_i : in unsigned(WORD_SIZE-1 downto 0); -- Data from mem
+ data_o : out unsigned(WORD_SIZE-1 downto 0); -- Data to mem
+ addr_o : out unsigned(ADDR_W-1 downto 0); -- Memory address
+ write_en_o : out std_logic; -- Memory write enable
+ read_en_o : out std_logic); -- Memory read enable
+ end component ZPUMediumCore;
+
+ component Timer is
+ port(
+ clk_i : in std_logic;
+ reset_i : in std_logic;
+ we_i : in std_logic;
+ data_i : in unsigned(31 downto 0);
+ addr_i : in unsigned(0 downto 0);
+ data_o : out unsigned(31 downto 0));
+ end component Timer;
+
+ component gpio is
+ port(
+ clk_i : in std_logic;
+ reset_i : in std_logic;
+ --
+ we_i : in std_logic;
+ data_i : in unsigned(31 downto 0);
+ addr_i : in unsigned( 0 downto 0);
+ data_o : out unsigned(31 downto 0);
+ --
+ port_in : in std_logic_vector(31 downto 0);
+ port_out : out std_logic_vector(31 downto 0);
+ port_dir : out std_logic_vector(31 downto 0)
+ );
+ end component gpio;
+
+
+ component ZPUPhiIO is
+ generic(
+ BRDIVISOR : positive:=1; -- Baud rate divisor i.e. br_clk/9600/4
+ ENA_LOG : boolean:=true; -- Enable log
+ LOG_FILE : string:="log.txt"); -- Name for the log file
+ port(
+ clk_i : in std_logic; -- System Clock
+ reset_i : in std_logic; -- Synchronous Reset
+ busy_o : out std_logic; -- I/O is busy
+ we_i : in std_logic; -- Write Enable
+ re_i : in std_logic; -- Read Enable
+ data_i : in unsigned(31 downto 0);
+ data_o : out unsigned(31 downto 0);
+ addr_i : in unsigned(2 downto 0); -- Address bits 4-2
+ --
+ rs232_rx_i : in std_logic; -- UART Rx input
+ rs232_tx_o : out std_logic; -- UART Tx output
+ br_clk_i : in std_logic; -- UART base clock (enable)
+ --
+ gpio_in : in std_logic_vector(31 downto 0);
+ gpio_out : out std_logic_vector(31 downto 0);
+ gpio_dir : out std_logic_vector(31 downto 0)
+ );
+ end component ZPUPhiIO;
+
+ -- Opcode decode constants
+ -- Note: these are the basic opcodes, always implemented using hardware.
+ constant OPCODE_IM : unsigned(7 downto 7):="1";
+ constant OPCODE_STORESP : unsigned(7 downto 5):="010";
+ constant OPCODE_LOADSP : unsigned(7 downto 5):="011";
+ constant OPCODE_EMULATE : unsigned(7 downto 5):="001";
+ constant OPCODE_ADDSP : unsigned(7 downto 4):="0001";
+ constant OPCODE_SHORT : unsigned(7 downto 4):="0000";
+
+ constant OPCODE_BREAK : unsigned(3 downto 0):="0000";
+ constant OPCODE_SHIFTLEFT : unsigned(3 downto 0):="0001";
+ constant OPCODE_PUSHSP : unsigned(3 downto 0):="0010";
+ constant OPCODE_PUSHINT : unsigned(3 downto 0):="0011";
+
+ constant OPCODE_POPPC : unsigned(3 downto 0):="0100";
+ constant OPCODE_ADD : unsigned(3 downto 0):="0101";
+ constant OPCODE_AND : unsigned(3 downto 0):="0110";
+ constant OPCODE_OR : unsigned(3 downto 0):="0111";
+
+ constant OPCODE_LOAD : unsigned(3 downto 0):="1000";
+ constant OPCODE_NOT : unsigned(3 downto 0):="1001";
+ constant OPCODE_FLIP : unsigned(3 downto 0):="1010";
+ constant OPCODE_NOP : unsigned(3 downto 0):="1011";
+
+ constant OPCODE_STORE : unsigned(3 downto 0):="1100";
+ constant OPCODE_POPSP : unsigned(3 downto 0):="1101";
+ constant OPCODE_COMPARE : unsigned(3 downto 0):="1110";
+ constant OPCODE_POPINT : unsigned(3 downto 0):="1111";
+
+ -- The following instructions are emulated in the small version and
+ -- implemented as hardware in the full version.
+ -- The constants correpond to the "emulated" instruction number.
+
+ -- Enabled by the ENA_LEVEL0 generic:
+ constant OPCODE_EQ : unsigned(5 downto 0):=to_unsigned(46,6);
+ constant OPCODE_LOADB : unsigned(5 downto 0):=to_unsigned(51,6);
+ constant OPCODE_NEQBRANCH : unsigned(5 downto 0):=to_unsigned(56,6);
+ constant OPCODE_PUSHSPADD : unsigned(5 downto 0):=to_unsigned(61,6);
+ -- Enabled by the ENA_LEVEL1 generic:
+ constant OPCODE_LESSTHAN : unsigned(5 downto 0):=to_unsigned(36,6);
+ constant OPCODE_ULESSTHAN : unsigned(5 downto 0):=to_unsigned(38,6);
+ constant OPCODE_MULT : unsigned(5 downto 0):=to_unsigned(41,6);
+ constant OPCODE_STOREB : unsigned(5 downto 0):=to_unsigned(52,6);
+ constant OPCODE_CALLPCREL : unsigned(5 downto 0):=to_unsigned(63,6);
+ constant OPCODE_SUB : unsigned(5 downto 0):=to_unsigned(49,6);
+ -- Enabled by the ENA_LEVEL2 generic:
+ constant OPCODE_LESSTHANOREQUAL : unsigned(5 downto 0):=to_unsigned(37,6);
+ constant OPCODE_ULESSTHANOREQUAL : unsigned(5 downto 0):=to_unsigned(39,6);
+ constant OPCODE_CALL : unsigned(5 downto 0):=to_unsigned(45,6);
+ constant OPCODE_POPPCREL : unsigned(5 downto 0):=to_unsigned(57,6);
+ -- Enabled by the ENA_LSHR generic:
+ constant OPCODE_LSHIFTRIGHT : unsigned(5 downto 0):=to_unsigned(42,6);
+ -- The following opcodes are always emulated.
+ constant OPCODE_LOADH : unsigned(5 downto 0):=to_unsigned(34,6);
+ constant OPCODE_STOREH : unsigned(5 downto 0):=to_unsigned(35,6);
+ constant OPCODE_ASHIFTLEFT : unsigned(5 downto 0):=to_unsigned(43,6);
+ constant OPCODE_ASHIFTRIGHT : unsigned(5 downto 0):=to_unsigned(44,6);
+ constant OPCODE_NEQ : unsigned(5 downto 0):=to_unsigned(47,6);
+ constant OPCODE_NEG : unsigned(5 downto 0):=to_unsigned(48,6);
+ constant OPCODE_XOR : unsigned(5 downto 0):=to_unsigned(50,6);
+ constant OPCODE_DIV : unsigned(5 downto 0):=to_unsigned(53,6);
+ constant OPCODE_MOD : unsigned(5 downto 0):=to_unsigned(54,6);
+ constant OPCODE_EQBRANCH : unsigned(5 downto 0):=to_unsigned(55,6);
+ constant OPCODE_CONFIG : unsigned(5 downto 0):=to_unsigned(58,6);
+ constant OPCODE_PUSHPC : unsigned(5 downto 0):=to_unsigned(59,6);
+end package zpupkg;
+
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.numeric_std.all;
+
+package UART is
+ ----------------------
+ -- Very simple UART --
+ ----------------------
+ component RxUnit is
+ port(
+ clk_i : in std_logic; -- System clock signal
+ reset_i : in std_logic; -- Reset input (sync)
+ enable_i : in std_logic; -- Enable input (rate*4)
+ read_i : in std_logic; -- Received Byte Read
+ rxd_i : in std_logic; -- RS-232 data input
+ rxav_o : out std_logic; -- Byte available
+ datao_o : out std_logic_vector(7 downto 0)); -- Byte received
+ end component RxUnit;
+
+ component TxUnit is
+ port (
+ clk_i : in std_logic; -- Clock signal
+ reset_i : in std_logic; -- Reset input
+ enable_i : in std_logic; -- Enable input
+ load_i : in std_logic; -- Load input
+ txd_o : out std_logic; -- RS-232 data output
+ busy_o : out std_logic; -- Tx Busy
+ datai_i : in std_logic_vector(7 downto 0)); -- Byte to transmit
+ end component TxUnit;
+
+ component BRGen is
+ generic(
+ COUNT : integer range 0 to 65535);-- Count revolution
+ port (
+ clk_i : in std_logic; -- Clock
+ reset_i : in std_logic; -- Reset input
+ ce_i : in std_logic; -- Chip Enable
+ o_o : out std_logic); -- Output
+ end component BRGen;
+end package UART;
+
diff --git a/zpu/hdl/zealot/zpu_small.vhdl b/zpu/hdl/zealot/zpu_small.vhdl new file mode 100644 index 0000000..056b924 --- /dev/null +++ b/zpu/hdl/zealot/zpu_small.vhdl @@ -0,0 +1,472 @@ +------------------------------------------------------------------------------ +---- ---- +---- ZPU Small ---- +---- ---- +---- http://www.opencores.org/ ---- +---- ---- +---- Description: ---- +---- ZPU is a 32 bits small stack cpu. This is the small size version. ---- +---- It doesn't support external memories, needs a dual ported memory. ---- +---- ---- +---- To Do: ---- +---- - ---- +---- ---- +---- Author: ---- +---- - Øyvind Harboe, oyvind.harboe zylin.com ---- +---- - Salvador E. Tropea, salvador inti.gob.ar ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Copyright (c) 2008 Øyvind Harboe <oyvind.harboe zylin.com> ---- +---- Copyright (c) 2008 Salvador E. Tropea <salvador inti.gob.ar> ---- +---- Copyright (c) 2008 Instituto Nacional de Tecnología Industrial ---- +---- ---- +---- Distributed under the BSD license ---- +---- ---- +------------------------------------------------------------------------------ +---- ---- +---- Design unit: ZPUSmallCore(Behave) (Entity and architecture) ---- +---- File name: zpu_small.vhdl ---- +---- Note: None ---- +---- Limitations: None known ---- +---- Errors: None known ---- +---- Library: zpu ---- +---- Dependencies: IEEE.std_logic_1164 ---- +---- IEEE.numeric_std ---- +---- zpu.zpupkg ---- +---- Target FPGA: Spartan 3 (XC3S1500-4-FG456) ---- +---- Language: VHDL ---- +---- Wishbone: No ---- +---- Synthesis tools: Xilinx Release 9.2.03i - xst J.39 ---- +---- Simulation tools: GHDL [Sokcho edition] (0.2x) ---- +---- Text editor: SETEdit 0.5.x ---- +---- ---- +------------------------------------------------------------------------------ + +library IEEE; +use IEEE.std_logic_1164.ALL; +use IEEE.numeric_std.all; + +library zpu; +use zpu.zpupkg.all; + +entity ZPUSmallCore is + generic( + WORD_SIZE : integer:=32; -- Data width 16/32 + ADDR_W : integer:=16; -- Total address space width (incl. I/O) + MEM_W : integer:=15; -- Memory (prog+data+stack) width + D_CARE_VAL : std_logic:='X'); -- Value used to fill the unsused bits + port( + clk_i : in std_logic; -- System Clock + reset_i : in std_logic; -- Synchronous Reset + interrupt_i : in std_logic; -- Interrupt + break_o : out std_logic; -- Breakpoint opcode executed + dbg_o : out zpu_dbgo_t; -- Debug outputs (i.e. trace log) + -- BRAM (text, data, bss and stack) + a_we_o : out std_logic; -- BRAM A port Write Enable + a_addr_o : out unsigned(MEM_W-1 downto WORD_SIZE/16):=(others => '0'); -- BRAM A Address + a_o : out unsigned(WORD_SIZE-1 downto 0):=(others => '0'); -- Data to BRAM A port + a_i : in unsigned(WORD_SIZE-1 downto 0); -- Data from BRAM A port + b_we_o : out std_logic; -- BRAM B port Write Enable + b_addr_o : out unsigned(MEM_W-1 downto WORD_SIZE/16):=(others => '0'); -- BRAM B Address + b_o : out unsigned(WORD_SIZE-1 downto 0):=(others => '0'); -- Data to BRAM B port + b_i : in unsigned(WORD_SIZE-1 downto 0); -- Data from BRAM B port + -- Memory mapped I/O + mem_busy_i : in std_logic; + data_i : in unsigned(WORD_SIZE-1 downto 0); + data_o : out unsigned(WORD_SIZE-1 downto 0); + addr_o : out unsigned(ADDR_W-1 downto 0); + write_en_o : out std_logic; + read_en_o : out std_logic); +end entity ZPUSmallCore; + +architecture Behave of ZPUSmallCore is + constant MAX_ADDR_BIT : integer:=ADDR_W-2; + constant BYTE_BITS : integer:=WORD_SIZE/16; -- # of bits in a word that addresses bytes + -- Stack Pointer initial value: BRAM size-8 + constant SP_START_1 : unsigned(ADDR_W-1 downto 0):=to_unsigned((2**MEM_W)-8,ADDR_W); + constant SP_START : unsigned(MAX_ADDR_BIT downto BYTE_BITS):= + SP_START_1(MAX_ADDR_BIT downto BYTE_BITS); + constant IO_BIT : integer:=ADDR_W-1; -- Address bit to determine this is an I/O + + -- Program counter + signal pc_r : unsigned(MAX_ADDR_BIT downto 0):=(others => '0'); + -- Stack pointer + signal sp_r : unsigned(MAX_ADDR_BIT downto BYTE_BITS):=SP_START; + signal idim_r : std_logic:='0'; + + -- BRAM (text, data, bss and stack) + -- a_r is a register for the top of the stack [SP] + -- Note: as this is a stack CPU this is a very important register. + signal a_we_r : std_logic:='0'; + signal a_addr_r : unsigned(MAX_ADDR_BIT downto BYTE_BITS):=(others => '0'); + signal a_r : unsigned(WORD_SIZE-1 downto 0):=(others => '0'); + -- b_r is a register for the next value in the stack [SP+1] + -- We also use the B port to fetch instructions. + signal b_we_r : std_logic:='0'; + signal b_addr_r : unsigned(MAX_ADDR_BIT downto BYTE_BITS):=(others => '0'); + signal b_r : unsigned(WORD_SIZE-1 downto 0):=(others => '0'); + + -- State machine. + type state_t is (st_fetch, st_write_io_done, st_execute, st_add, st_or, + st_and, st_store, st_read_io, st_write_io, st_fetch_next, + st_add_sp, st_decode, st_resync); + signal state : state_t:=st_resync; + + -- Decoded Opcode + type decode_t is (dec_nop, dec_im, dec_load_sp, dec_store_sp, dec_add_sp, + dec_emulate, dec_break, dec_push_sp, dec_pop_pc, dec_add, + dec_or, dec_and, dec_load, dec_not, dec_flip, dec_store, + dec_pop_sp, dec_interrupt); + signal d_opcode_r : decode_t; + signal d_opcode : decode_t; + + signal opcode : unsigned(OPCODE_W-1 downto 0); -- Decoded + signal opcode_r : unsigned(OPCODE_W-1 downto 0); -- Registered + + -- IRQ flag + signal in_irq_r : std_logic:='0'; + -- I/O space address + signal addr_r : unsigned(ADDR_W-1 downto 0):=(others => '0'); +begin + -- Dual ported memory interface + a_we_o <= a_we_r; + a_addr_o <= a_addr_r(MEM_W-1 downto BYTE_BITS); + a_o <= a_r; + b_we_o <= b_we_r; + b_addr_o <= b_addr_r(MEM_W-1 downto BYTE_BITS); + b_o <= b_r; + + ------------------------- + -- Instruction Decoder -- + ------------------------- + -- Note: We use Port B memory to fetch the opcodes. + decode_control: + process(b_i, pc_r) + variable topcode : unsigned(OPCODE_W-1 downto 0); + begin + -- Select the addressed byte inside the fetched word + case (to_integer(pc_r(BYTE_BITS-1 downto 0))) is + when 0 => + topcode := to_01( b_i(31 downto 24)); + when 1 => + topcode := to_01( b_i(23 downto 16)); + when 2 => + topcode := to_01( b_i(15 downto 8)); + when others => -- 3 + topcode := to_01( b_i(7 downto 0)); + end case; + opcode <= topcode; + + if (topcode(7 downto 7)=OPCODE_IM) then + d_opcode <= dec_im; + elsif (topcode(7 downto 5)=OPCODE_STORESP) then + d_opcode <= dec_store_sp; + elsif (topcode(7 downto 5)=OPCODE_LOADSP) then + d_opcode <= dec_load_sp; + elsif (topcode(7 downto 5)=OPCODE_EMULATE) then + d_opcode <= dec_emulate; + elsif (topcode(7 downto 4)=OPCODE_ADDSP) then + d_opcode <= dec_add_sp; + else -- OPCODE_SHORT + case topcode(3 downto 0) is + when OPCODE_BREAK => + d_opcode <= dec_break; + when OPCODE_PUSHSP => + d_opcode <= dec_push_sp; + when OPCODE_POPPC => + d_opcode <= dec_pop_pc; + when OPCODE_ADD => + d_opcode <= dec_add; + when OPCODE_OR => + d_opcode <= dec_or; + when OPCODE_AND => + d_opcode <= dec_and; + when OPCODE_LOAD => + d_opcode <= dec_load; + when OPCODE_NOT => + d_opcode <= dec_not; + when OPCODE_FLIP => + d_opcode <= dec_flip; + when OPCODE_STORE => + d_opcode <= dec_store; + when OPCODE_POPSP => + d_opcode <= dec_pop_sp; + when others => -- OPCODE_NOP and others + d_opcode <= dec_nop; + end case; + end if; + end process decode_control; + + data_o <= b_i; + opcode_control: + process (clk_i) + variable sp_offset : unsigned(4 downto 0); + begin + if rising_edge(clk_i) then + break_o <= '0'; + write_en_o <= '0'; + read_en_o <= '0'; + dbg_o.b_inst <= '0'; + if reset_i='1' then + state <= st_resync; + sp_r <= SP_START; + pc_r <= (others => '0'); + idim_r <= '0'; + a_addr_r <= (others => '0'); + b_addr_r <= (others => '0'); + a_we_r <= '0'; + b_we_r <= '0'; + a_r <= (others => '0'); + b_r <= (others => '0'); + in_irq_r <= '0'; + addr_r <= (others => '0'); + else -- reset_i/='1' + a_we_r <= '0'; + b_we_r <= '0'; + -- This saves LUTs, by explicitly declaring that the + -- a_o can be left at whatever value if a_we_r is + -- not set. + a_r <= (others => D_CARE_VAL); + b_r <= (others => D_CARE_VAL); + sp_offset:=(others => D_CARE_VAL); + a_addr_r <= (others => D_CARE_VAL); + b_addr_r <= (others => D_CARE_VAL); + addr_r <= a_i(ADDR_W-1 downto 0); + d_opcode_r <= d_opcode; + opcode_r <= opcode; + if interrupt_i='0' then + in_irq_r <= '0'; -- no longer in an interrupt + end if; + + case state is + when st_execute => + state <= st_fetch; + -- At this point: + -- b_i contains opcode word + -- a_i contains top of stack + pc_r <= pc_r+1; + + -- Debug info (Trace) + dbg_o.b_inst <= '1'; + dbg_o.pc <= (others => '0'); + dbg_o.pc(MAX_ADDR_BIT downto 0) <= pc_r; + dbg_o.opcode <= opcode_r; + dbg_o.sp <= (others => '0'); + dbg_o.sp(MAX_ADDR_BIT downto BYTE_BITS) <= sp_r; + dbg_o.stk_a <= a_i; + dbg_o.stk_b <= b_i; + + -- During the next cycle we'll be reading the next opcode + sp_offset(4):=not opcode_r(4); + sp_offset(3 downto 0):=opcode_r(3 downto 0); + + idim_r <= '0'; + + -------------------- + -- Execution Unit -- + -------------------- + case d_opcode_r is + when dec_interrupt => + -- Not a real instruction, but an interrupt + -- Push(PC); PC=32 + sp_r <= sp_r-1; + a_addr_r <= sp_r-1; + a_we_r <= '1'; + a_r <= (others => D_CARE_VAL); + a_r(MAX_ADDR_BIT downto 0) <= pc_r; + -- Jump to ISR + pc_r <= to_unsigned(32,MAX_ADDR_BIT+1); -- interrupt address + --report "ZPU jumped to interrupt!" severity note; + when dec_im => + idim_r <= '1'; + a_we_r <= '1'; + if idim_r='0' then + -- First IM + -- Push the 7 bits (extending the sign) + sp_r <= sp_r-1; + a_addr_r <= sp_r-1; + a_r <= unsigned(resize(signed(opcode_r(6 downto 0)),WORD_SIZE)); + else + -- Next IMs, shift the word and put the new value in the lower + -- bits + a_addr_r <= sp_r; + a_r(WORD_SIZE-1 downto 7) <= a_i(WORD_SIZE-8 downto 0); + a_r(6 downto 0) <= opcode_r(6 downto 0); + end if; + when dec_store_sp => + -- [SP+Offset]=Pop() + b_we_r <= '1'; + b_addr_r <= sp_r+sp_offset; + b_r <= a_i; + sp_r <= sp_r+1; + state <= st_resync; + when dec_load_sp => + -- Push([SP+Offset]) + sp_r <= sp_r-1; + a_addr_r <= sp_r+sp_offset; + when dec_emulate => + -- Push(PC+1), PC=Opcode[4:0]*32 + sp_r <= sp_r-1; + a_we_r <= '1'; + a_addr_r <= sp_r-1; + a_r <= (others => D_CARE_VAL); + a_r(MAX_ADDR_BIT downto 0) <= pc_r+1; + -- Jump to NUM*32 + -- The emulate address is: + -- 98 7654 3210 + -- 0000 00aa aaa0 0000 + pc_r <= (others => '0'); + pc_r(9 downto 5) <= opcode_r(4 downto 0); + when dec_add_sp => + -- Push(Pop()+[SP+Offset]) + a_addr_r <= sp_r; + b_addr_r <= sp_r+sp_offset; + state <= st_add_sp; + when dec_break => + --report "Break instruction encountered" severity failure; + break_o <= '1'; + when dec_push_sp => + -- Push(SP) + sp_r <= sp_r-1; + a_we_r <= '1'; + a_addr_r <= sp_r-1; + a_r <= (others => D_CARE_VAL); + a_r(MAX_ADDR_BIT downto BYTE_BITS) <= sp_r; + when dec_pop_pc => + -- Pop(PC) + pc_r <= a_i(MAX_ADDR_BIT downto 0); + sp_r <= sp_r+1; + state <= st_resync; + when dec_add => + -- Push(Pop()+Pop()) + sp_r <= sp_r+1; + state <= st_add; + when dec_or => + -- Push(Pop() or Pop()) + sp_r <= sp_r+1; + state <= st_or; + when dec_and => + -- Push(Pop() and Pop()) + sp_r <= sp_r+1; + state <= st_and; + when dec_load => + -- Push([Pop()]) + if a_i(IO_BIT)='1' then + addr_r <= a_i(ADDR_W-1 downto 0); + read_en_o <= '1'; + state <= st_read_io; + else + a_addr_r <= a_i(MAX_ADDR_BIT downto BYTE_BITS); + end if; + when dec_not => + -- Push(not(Pop())) + a_addr_r <= sp_r(MAX_ADDR_BIT downto BYTE_BITS); + a_we_r <= '1'; + a_r <= not a_i; + when dec_flip => + -- Push(flip(Pop())) + a_addr_r <= sp_r(MAX_ADDR_BIT downto BYTE_BITS); + a_we_r <= '1'; + for i in 0 to WORD_SIZE-1 loop + a_r(i) <= a_i(WORD_SIZE-1-i); + end loop; + when dec_store => + -- a=Pop(), b=Pop(), [a]=b + b_addr_r <= sp_r+1; + sp_r <= sp_r+1; + if a_i(IO_BIT)='1' then + state <= st_write_io; + else + state <= st_store; + end if; + when dec_pop_sp => + -- SP=Pop() + sp_r <= a_i(MAX_ADDR_BIT downto BYTE_BITS); + state <= st_resync; + when dec_nop => + -- Default, keep addressing to of the stack (A) + a_addr_r <= sp_r; + when others => + null; + end case; + when st_read_io => + a_addr_r <= sp_r; + -- Wait until memory I/O isn't busy + if mem_busy_i='0' then + state <= st_fetch; + a_we_r <= '1'; + a_r <= data_i; + end if; + when st_write_io => + -- [A]=B + sp_r <= sp_r+1; + write_en_o <= '1'; + addr_r <= a_i(ADDR_W-1 downto 0); + state <= st_write_io_done; + when st_write_io_done => + -- Wait until memory I/O isn't busy + if mem_busy_i='0' then + state <= st_resync; + end if; + when st_fetch => + -- We need to resync. During the *next* cycle + -- we'll fetch the opcode @ pc and thus it will + -- be available for st_execute the cycle after + -- next + b_addr_r <= pc_r(MAX_ADDR_BIT downto BYTE_BITS); + state <= st_fetch_next; + when st_fetch_next => + -- At this point a_i contains the value that is either + -- from the top of stack or should be copied to the top of the stack + a_we_r <= '1'; + a_r <= a_i; + a_addr_r <= sp_r; + b_addr_r <= sp_r+1; + state <= st_decode; + when st_decode => + if interrupt_i='1' and in_irq_r='0' and idim_r='0' then + -- We got an interrupt, execute interrupt instead of next instruction + in_irq_r <= '1'; + d_opcode_r <= dec_interrupt; + end if; + -- during the st_execute cycle we'll be fetching SP+1 + a_addr_r <= sp_r; + b_addr_r <= sp_r+1; + state <= st_execute; + when st_store => + sp_r <= sp_r+1; + a_we_r <= '1'; + a_addr_r <= a_i(MAX_ADDR_BIT downto BYTE_BITS); + a_r <= b_i; + state <= st_resync; + when st_add_sp => + state <= st_add; + when st_add => + a_addr_r <= sp_r; + a_we_r <= '1'; + a_r <= a_i+b_i; + state <= st_fetch; + when st_or => + a_addr_r <= sp_r; + a_we_r <= '1'; + a_r <= a_i or b_i; + state <= st_fetch; + when st_and => + a_addr_r <= sp_r; + a_we_r <= '1'; + a_r <= a_i and b_i; + state <= st_fetch; + when st_resync => + a_addr_r <= sp_r; + state <= st_fetch; + when others => + null; + end case; + end if; -- else reset_i/='1' + end if; -- rising_edge(clk_i) + end process opcode_control; + addr_o <= addr_r; + +end architecture Behave; -- Entity: ZPUSmallCore + diff --git a/zpu/hdl/zpu4/core/histogram.perl b/zpu/hdl/zpu4/core/histogram.perl new file mode 100644 index 0000000..479ee0f --- /dev/null +++ b/zpu/hdl/zpu4/core/histogram.perl @@ -0,0 +1,218 @@ +#!/usr/bin/perl +############################################################################## +# +# Copyright (c) 2008 Salvador E. Tropea <salvador en inti gov ar> +# Copyright (c) 2008 Instituto Nacional de Tecnología Industrial +# +############################################################################## +# +# Target: Any +# Language: Perl +# Interpreter used: v5.6.1/v5.8.4 +# Text editor: SETEdit 0.5.5 +# +############################################################################## +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA +# +############################################################################## +# +# Description: Takes a ZPU trace and does some raw stats about opcodes +# frequency and speed. +# +############################################################################## +# +# TODO +# +# A lot ... +# + + +# 0x40-0x460 +# div y mod son especiales +@used=(); +@clks=(); + +$line=1; +$startLine=1; +#$endLine=10000; +$endLine=-1; +$lastClk=0; +$lastOpcode=-1; +while (<>) + { + if ($_=~/^(\S+) (\S+) (\S+) (\S+) (\S+) (\S+) (\S+)/) + { + $clk=hex($7); + #print "$line\n"; + if ($line>=$startLine) + { + #print $_; + $addr=hex($1); + $opcode=hex($2); + $sp=hex($3); + $a=hex($4); + $b=hex($5); + if ($addr>=0x40 and $addr<0x460) + { + @used[$opcode+0x100]++; + @clks[$lastOpcodeEmu]+=$clk-$lastClkEmu unless lastOpcodeEmu==-1; + $lastOpcodeEmu=$opcode+0x100; + $lastClkEmu=$clk; + } + else + { + @used[$opcode]++; + @clks[$lastOpcode]+=$clk-$lastClk unless $lastOpcode==-1; + #printf "%d+=%d\n",$lastOpcode,$clk-$lastClk; + $lastOpcode=$opcode; + $lastClk=$clk; + $lastOpcodeEmu=-1; + $lastClkEmu=$clk; + } + } + else + { + $lastClk=$clk; + } + last if $line==$endLine; + $line++; + } + } +@used[$lastOpcode]--; + +$id=0; +# Cluster them +AddSimple('breakpoint',0); +# 1=shiftleft, invalid +AddSimple('pushsp',2); +# 3=pushint, invalid +AddSimple('poppc',4); +AddSimple('add',5); +AddSimple('and',6); +AddSimple('or',7); +AddSimple('load',8); +AddSimple('not',9); +AddSimple('flip',10); +AddSimple('nop',11); +AddSimple('store',12); +AddSimple('popsp',13); +# 14=compare, invalid +# 15=popint, invalid +AddSimpleRange('addsp',16,31); +# 32-63 emulate +AddSimpleRange('storesp',64,95); +AddSimpleRange('loadsp',96,127); +AddSimpleRange('im',128,255); + +# 32 is the reset entry point +# 33 is the interrupt entry point +AddEmulate('loadh',34); +AddEmulate('storeh',35); +AddEmulate('lessthan',36); +AddEmulate('lessthanorequal',37); +AddEmulate('ulessthan',38); +AddEmulate('ulessthanorequal',39); +AddEmulate('swap',40); # unimplemented +AddEmulate('mult',41); +AddEmulate('lshiftright',42); +AddEmulate('ashiftleft',43); +AddEmulate('ashiftright',44); +AddEmulate('call',45); +AddEmulate('eq',46); +AddEmulate('neq',47); +AddEmulate('neg',48); +AddEmulate('sub',49); +AddEmulate('xor',50); +AddEmulate('loadb',51); +AddEmulate('storeb',52); +AddEmulate('div',53); +AddEmulate('mod',54); +AddEmulate('eqbranch',55); +AddEmulate('neqbranch',56); +AddEmulate('poppcrel',57); +AddEmulate('config',58); +AddEmulate('pushpc',59); +AddEmulate('syscall_emulate',60); # unimplemented +AddEmulate('pushspadd',61); +AddEmulate('halfmult',62); # unimplemented +AddEmulate('callpcrel',63); + +$maxID=$id; +print "Total clocks: $lastClk\n"; +print "Unsorted:\n\n"; +for ($i=0; $i<$maxID; $i++) + { + $used=@used_noemu[$i]; + $clkm=0; + $clkm=@clks_noemu[$i]/$used if $used; + printf "%-20s %8d %6.2f\n",$names[$i],$used,$clkm; + $by_times{$i}=$used; + $by_clks{$i}=@clks_noemu[$i]; + } +print "Sorted by consumed clocks:\n\n"; +foreach $key (sort { $by_clks{$b} <=> $by_clks{$a} } keys %by_clks) + { + printf "%5.2f %-20s %8d\n",$by_clks{$key}/$lastClk*100,$names[$key],$by_clks{$key}; + } + + +sub AddSimple +{ + my ($name, $opcode)=@_; + + $names[$id]=$name; + @used_noemu[$id]=@used[$opcode]; + @used_emu[$id]=@used[$opcode+0x100]; + @used_both[$id]=@used[$opcode]+@used[$opcode+0x100]; + @clks_noemu[$id]=@clks[$opcode]; + @clks_emu[$id]=@clks[$opcode+0x100]; + @clks_both[$id]=@clks[$opcode]+@clks[$opcode+0x100]; + $id++; +} + +sub AddEmulate +{ + my ($name, $opcode)=@_; + + $names[$id]=$name; + @used_noemu[$id]=@used[$opcode]; + @used_emu[$id]=@used[$opcode+0x100]; + @used_both[$id]=@used[$opcode]; + @clks_noemu[$id]=@clks[$opcode]; + @clks_emu[$id]=@clks[$opcode+0x100]; + @clks_both[$id]=@clks[$opcode]; + $id++; +} + +sub AddSimpleRange +{ + my ($name, $opStart, $opLast)=@_; + my $i; + + $names[$id]=$name; + for ($i=$opStart; $i<=$opLast; $i++) + { + @used_noemu[$id]+=@used[$i]; + @used_emu[$id]+=@used[$i+0x100]; + @used_both[$id]+=@used[$i]+@used[$i+0x100]; + @clks_noemu[$id]+=@clks[$i]; + @clks_emu[$id]+=@clks[$i+0x100]; + @clks_both[$id]+=@clks[$i]+@clks[$i+0x100]; + } + $id++; +} + + diff --git a/zpu/hdl/zpu4/core/zpu_config.vhd b/zpu/hdl/zpu4/core/zpu_config.vhd new file mode 100644 index 0000000..c678044 --- /dev/null +++ b/zpu/hdl/zpu4/core/zpu_config.vhd @@ -0,0 +1,58 @@ +-- 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;
+
+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;
+ constant maxAddrBitBRAM : integer := 14;
+
+ -- start byte address of stack.
+ -- point to top of RAM - 2*words
+ constant spStart : std_logic_vector(maxAddrBitIncIO downto 0) :=
+ std_logic_vector(to_unsigned((2**(maxAddrBitBRAM+1))-8, maxAddrBitIncIO+1));
+
+end zpu_config;
diff --git a/zpu/hdl/zpu4/core/zpu_core.vhd b/zpu/hdl/zpu4/core/zpu_core.vhd new file mode 100644 index 0000000..f423f80 --- /dev/null +++ b/zpu/hdl/zpu4/core/zpu_core.vhd @@ -0,0 +1,1014 @@ +-- ZPU +-- +-- Copyright 2004-2008 oharboe - Øyvind Harboe - oyvind.harboe@zylin.com +-- Copyright 2008 alvieboy - Álvaro Lopes - alvieboy@alvie.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; + +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; + reset : 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 ( + Insn_AddTop, + Insn_Dup, + Insn_DupStackB, + Insn_Pop, + Insn_PopDown, + Insn_Add, + Insn_Or, + Insn_And, + Insn_Store, + Insn_AddSP, + Insn_Shift, + Insn_Nop, + Insn_Im, + Insn_LoadSP, + Insn_StoreSP, + Insn_Emulate, + Insn_Load, + Insn_PushSP, + Insn_PopPC, + Insn_PopPCrel, + Insn_Not, + Insn_Flip, + Insn_PopSP, + Insn_Neqbranch, + Insn_Eq, + Insn_Loadb, + Insn_Mult, + Insn_Lessthan, + Insn_Lessthanorequal, + Insn_Ulessthanorequal, + Insn_Ulessthan, + Insn_PushSPadd, + Insn_Call, + Insn_CallPCrel, + Insn_Sub, + Insn_Break, + Insn_Storeb, + Insn_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, + State_Interrupt + ); + + + 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 inInterrupt : 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, reset) + 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 tNextInsn : InsnType; + variable tDecodedOpcode : InsnArray; + variable tMultResult : unsigned(wordSize*2-1 downto 0); + begin + if reset = '1' then + state <= State_Idle; + break <= '0'; + sp <= unsigned(spStart(maxAddrBitIncIO downto minAddrBit)); + + pc <= (others => '0'); + idim_flag <= '0'; + begin_inst <= '0'; + inInterrupt <= '0'; + mem_writeEnable <= '0'; + mem_readEnable <= '0'; + multA <= (others => '0'); + multB <= (others => '0'); + mem_writeMask <= (others => '1'); + elsif rising_edge(clk) 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'; + + if (interrupt = '0') then + -- Interrupt ended, we can serve ISR again + inInterrupt <= '0'; + 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 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; + -- Do not recurse into ISR while interrupt line is active + if interrupt = '1' and inInterrupt = '0' and idim_flag = '0' then + -- We got an interrupt, execute interrupt instead of next instruction + inInterrupt <= '1'; + 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; + stackB <= stackA; + pc <= to_unsigned(32, maxAddrBitIncIO+1); + state <= State_Interrupt; + end if; -- interrupt + end if; -- in_mem_busy + + when State_Interrupt => + if in_mem_busy = '0' then + mem_addr <= std_logic_vector(pc(maxAddrBitIncIO downto minAddrBit)); + mem_readEnable <= '1'; + state <= State_Decode; + report "ZPU jumped to interrupt!" severity note; + 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 + tNextInsn := Insn_Im; + elsif (tOpcode(7 downto 5) = OpCode_StoreSP) then + if tSpOffset = 0 then + tNextInsn := Insn_Pop; + elsif tSpOffset = 1 then + tNextInsn := Insn_PopDown; + else + tNextInsn := Insn_StoreSP; + end if; + elsif (tOpcode(7 downto 5) = OpCode_LoadSP) then + if tSpOffset = 0 then + tNextInsn := Insn_Dup; + elsif tSpOffset = 1 then + tNextInsn := Insn_DupStackB; + else + tNextInsn := Insn_LoadSP; + end if; + elsif (tOpcode(7 downto 5) = OpCode_Emulate) then + tNextInsn := Insn_Emulate; + if tOpcode(5 downto 0) = OpCode_Neqbranch then + tNextInsn := Insn_Neqbranch; + elsif tOpcode(5 downto 0) = OpCode_Eq then + tNextInsn := Insn_Eq; + elsif tOpcode(5 downto 0) = OpCode_Lessthan then + tNextInsn := Insn_Lessthan; + elsif tOpcode(5 downto 0) = OpCode_Lessthanorequal then + --tNextInsn :=Insn_Lessthanorequal; + elsif tOpcode(5 downto 0) = OpCode_Ulessthan then + tNextInsn := Insn_Ulessthan; + elsif tOpcode(5 downto 0) = OpCode_Ulessthanorequal then + --tNextInsn :=Insn_Ulessthanorequal; + elsif tOpcode(5 downto 0) = OpCode_Loadb then + tNextInsn := Insn_Loadb; + elsif tOpcode(5 downto 0) = OpCode_Mult then + tNextInsn := Insn_Mult; + elsif tOpcode(5 downto 0) = OpCode_Storeb then + tNextInsn := Insn_Storeb; + elsif tOpcode(5 downto 0) = OpCode_Pushspadd then + tNextInsn := Insn_PushSPadd; + elsif tOpcode(5 downto 0) = OpCode_Callpcrel then + tNextInsn := Insn_CallPCrel; + elsif tOpcode(5 downto 0) = OpCode_Call then + --tNextInsn :=Insn_Call; + elsif tOpcode(5 downto 0) = OpCode_Sub then + tNextInsn := Insn_Sub; + elsif tOpcode(5 downto 0) = OpCode_PopPCRel then + --tNextInsn :=Insn_PopPCrel; + end if; + elsif (tOpcode(7 downto 4) = OpCode_AddSP) then + if tSpOffset = 0 then + tNextInsn := Insn_Shift; + elsif tSpOffset = 1 then + tNextInsn := Insn_AddTop; + else + tNextInsn := Insn_AddSP; + end if; + else + case tOpcode(3 downto 0) is + when OpCode_Nop => + tNextInsn := Insn_Nop; + when OpCode_PushSP => + tNextInsn := Insn_PushSP; + when OpCode_PopPC => + tNextInsn := Insn_PopPC; + when OpCode_Add => + tNextInsn := Insn_Add; + when OpCode_Or => + tNextInsn := Insn_Or; + when OpCode_And => + tNextInsn := Insn_And; + when OpCode_Load => + tNextInsn := Insn_Load; + when OpCode_Not => + tNextInsn := Insn_Not; + when OpCode_Flip => + tNextInsn := Insn_Flip; + when OpCode_Store => + tNextInsn := Insn_Store; + when OpCode_PopSP => + tNextInsn := Insn_PopSP; + when others => + tNextInsn := Insn_Break; + + end case; -- tOpcode(3 downto 0) + end if; -- tOpcode + tDecodedOpcode(i) := tNextInsn; + + end loop; -- 0 to wordBytes-1 + + insn <= tDecodedOpcode(to_integer(pc(byteBits-1 downto 0))); + + -- once we wrap, we need to fetch + tDecodedOpcode(0) := Insn_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 Insn_InsnFetch => + state <= State_Fetch; + + when Insn_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; -- idim_flag + end if; -- in_mem_busy + + when Insn_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 Insn_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 Insn_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; -- in_mem_busy + + when Insn_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 Insn_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 Insn_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 Insn_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 Insn_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 Insn_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 Insn_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 Insn_Sub => + if in_mem_busy = '0' then + begin_inst <= '1'; + idim_flag <= '0'; + binaryOpResult <= stackB - stackA; + state <= State_BinaryOpResult; + end if; + + when Insn_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 Insn_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 Insn_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 Insn_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 Insn_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 Insn_Ulessthan => + 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 Insn_Ulessthanorequal => + 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 Insn_Lessthan => + 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 Insn_Lessthanorequal => + 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 Insn_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 Insn_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 Insn_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 Insn_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 Insn_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 Insn_Nop => + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + when Insn_Not => + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + stackA <= not stackA; + + when Insn_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 Insn_AddTop => + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + stackA <= stackA + stackB; + + when Insn_Shift => + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + stackA(wordSize-1 downto 1) <= stackA(wordSize-2 downto 0); + stackA(0) <= '0'; + + when Insn_PushSPadd => + begin_inst <= '1'; + idim_flag <= '0'; + pc <= pc + 1; + + stackA <= (others => '0'); + stackA(maxAddrBitIncIO downto minAddrBit) <= stackA(maxAddrBitIncIO-minAddrBit downto 0)+sp; + + when Insn_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 Insn_Mult => + begin_inst <= '1'; + idim_flag <= '0'; + + multA <= stackA; + multB <= stackB; + state <= State_Mult2; + + when Insn_Break => + report "Break instruction encountered" severity failure; + break <= '1'; + + when Insn_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 Insn_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; -- insn/State_Execute + + + 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; -- state + end if; -- clk'event + end process; + + + +end behave; diff --git a/zpu/hdl/zpu4/core/zpu_core_small.vhd b/zpu/hdl/zpu4/core/zpu_core_small.vhd new file mode 100644 index 0000000..9ac35a8 --- /dev/null +++ b/zpu/hdl/zpu4/core/zpu_core_small.vhd @@ -0,0 +1,602 @@ +-- 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; + +library work; +use work.zpu_config.all; +use work.zpupkg.all; + + +entity zpu_core is + port ( + clk : in std_logic; + -- asynchronous reset signal + reset : in std_logic; + -- this particular implementation of the ZPU does not + -- have a clocked enable signal + 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; + -- this implementation of the ZPU *always* reads and writes entire + -- 32 bit words, so mem_writeMask is tied to (others => '1'). + mem_writeMask : out std_logic_vector(wordBytes-1 downto 0); + -- Set to one to jump to interrupt vector + -- The ZPU will communicate with the hardware that caused the + -- interrupt via memory mapped IO or the interrupt flag can + -- be cleared automatically + interrupt : in std_logic; + -- Signal that the break instruction is executed, normally only used + -- in simulation to stop simulation + break : out std_logic + ); +end zpu_core; + + + +architecture behave of zpu_core is + + 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); + + -- this signal is set upon executing an IM instruction + -- the subsequence IM instruction will then behave differently. + -- all other instructions will clear the idim_flag. + -- this yields highly compact immediate instructions. + signal idim_flag : std_logic; + -- + signal busy : 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, + Decoded_Interrupt + ); + + + + 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 + + -- generate a trace file. + -- + -- This is only used in simulation to see what instructions are + -- executed. + -- + -- a quick & dirty regression test is then to commit trace files + -- to CVS and compare the latest trace file against the last known + -- good trace file + 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; + + + -- mem_writeMask is not used in this design, tie it to 1 + 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); + + + -- dualport_ram must be defined by the application. + -- + -- How this can be implemented is highly dependent on the FPGA + -- and synthesis technology used. + -- + -- sometimes it can be instantiated as in the + -- zpu/example/helloworld.vhd, using inference, + -- but oftentimes it must be instantiated directly + -- portmapping to part specific FPGA resources + -- + -- + -- DANGER!!!!!! If inference fails, then synthesis will try + -- to implement the memory using basic logic resources. This + -- will almost certainly cause the compiler to get "stuck" + -- since synthesising such a huge number of basic logic resources + -- will take more or less forever. + -- + -- So: if your compiler gets "stuck" then inference is not + -- the way to go. + 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)); + + + + -- move out calculation of the opcode to a seperate process + -- to make things a bit easier to read + 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; -- tOpcode(3 downto 0) + end if; -- tOpcode + end process; + + + opcodeControl: process(clk, reset) + variable spOffset : unsigned(4 downto 0); + begin + + if reset = '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(maxAddrBit downto 0) <= pc; + pc <= to_unsigned(32, maxAddrBit+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; -- idim_flag + + 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; -- decodedOpcode + + when State_ReadIO => + memAAddr <= sp; + 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 + inInterrupt <= '1'; + 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; -- state + + end if; -- reset, enable + end process; + + + +end behave; diff --git a/zpu/hdl/zpu4/core/zpupkg.vhd b/zpu/hdl/zpu4/core/zpupkg.vhd new file mode 100644 index 0000000..0363aca --- /dev/null +++ b/zpu/hdl/zpu4/core/zpupkg.vhd @@ -0,0 +1,218 @@ +-- 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; + +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; + + + ------------------------------------------------------------ + -- components + + 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 dualport_ram; + + + 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 dram; + + + 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 trace; + + + component zpu_core is + port ( + clk : in std_logic; + reset : 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 zpu_core; + + + 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 timer; + + + 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 zpuio; + + + ------------------------------------------------------------ + -- constants + + -- 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_NA4 : std_logic_vector(3 downto 0) := "0001"; + constant OpCode_PushSP : std_logic_vector(3 downto 0) := "0010"; + constant OpCode_NA3 : 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_NA2 : std_logic_vector(3 downto 0) := "1110"; + constant OpCode_NA : 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; 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/clocks.vhd b/zpu/hdl/zpu4/src/clocks.vhd new file mode 100644 index 0000000..67433be --- /dev/null +++ b/zpu/hdl/zpu4/src/clocks.vhd @@ -0,0 +1,198 @@ +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; + + +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 entity 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 ( + 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 + ); + +end architecture behave; diff --git a/zpu/hdl/zpu4/src/io.vhd b/zpu/hdl/zpu4/src/io.vhd new file mode 100644 index 0000000..56c7fb5 --- /dev/null +++ b/zpu/hdl/zpu4/src/io.vhd @@ -0,0 +1,119 @@ +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 entity zpu_io; + + +architecture behave of zpu_io is + + 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 + elsif (clk'event and clk = '1') then + if writeEnable = '1' then + -- external interface (fixed address) + --<JK> 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))); + 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); + + else + + report "Illegal IO write @" & "0x" & hstr(taddr) severity warning; + end if; + + end if; + read <= (others => '0'); + if (readEnable = '1') then + --<JK> 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 new file mode 100644 index 0000000..d6d9358 --- /dev/null +++ b/zpu/hdl/zpu4/src/timer.vhd @@ -0,0 +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 entity 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 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 new file mode 100644 index 0000000..01678c8 --- /dev/null +++ b/zpu/hdl/zpu4/src/trace.vhd @@ -0,0 +1,107 @@ +-- 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 entity 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 architecture 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..4dca901 --- /dev/null +++ b/zpu/hdl/zpu4/src/txt_util.vhd @@ -0,0 +1,539 @@ +-- 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; + + +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 package 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 procedure print; + + + -- 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; + + + -- 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 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 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; + + + 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 + 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 function 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 function str; + + + -- convert integer to string, using base 10 + function str(int : integer) return string is + begin + return str(int, 10); + end function 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 function 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 function 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 function 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 function 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; + + + + -- 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 function 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 function 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 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; + + + -- 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; + + + -- 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 procedure str_write; + + +end package body txt_util; + diff --git a/zpu/hdl/zpu4/src/zpuio.vhd b/zpu/hdl/zpu4/src/zpuio.vhd new file mode 100644 index 0000000..9ca9050 --- /dev/null +++ b/zpu/hdl/zpu4/src/zpuio.vhd @@ -0,0 +1,218 @@ +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) + ); +end zpuio; + +architecture behave of zpuio is + + 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 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; diff --git a/zpu/hdl/zpu4/test/dmips/build.sh b/zpu/hdl/zpu4/test/dmips/build.sh new file mode 100755 index 0000000..44ead41 --- /dev/null +++ b/zpu/hdl/zpu4/test/dmips/build.sh @@ -0,0 +1,4 @@ +zpu-elf-gcc -DTIME ../../../../../../roadshow/dhrystone/dhry_*.c -O3 -Wl,--gc-sections -Wl,--relax -phi -o dmips.elf +zpu-elf-objdump --disassemble-all >dmips.dis dmips.elf +zpu-elf-objcopy -O binary dmips.elf dmips.bin +java -classpath ../../../../sw/simulator/zpusim.jar com.zylin.zpu.simulator.tools.MakeRam dmips.bin >dmips.ram diff --git a/zpu/hdl/zpu4/test/dmips/dmips.bin b/zpu/hdl/zpu4/test/dmips/dmips.bin Binary files differnew file mode 100644 index 0000000..ee1a6fe --- /dev/null +++ b/zpu/hdl/zpu4/test/dmips/dmips.bin diff --git a/zpu/hdl/zpu4/test/dmips/dmips.elf b/zpu/hdl/zpu4/test/dmips/dmips.elf Binary files differnew file mode 100644 index 0000000..3a04a5b --- /dev/null +++ b/zpu/hdl/zpu4/test/dmips/dmips.elf diff --git a/zpu/hdl/zpu4/test/dmips/dmips.ram b/zpu/hdl/zpu4/test/dmips/dmips.ram new file mode 100644 index 0000000..0919ce1 --- /dev/null +++ b/zpu/hdl/zpu4/test/dmips/dmips.ram @@ -0,0 +1,3256 @@ +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",
diff --git a/zpu/hdl/zpu4/test/gpiotest/build.sh b/zpu/hdl/zpu4/test/gpiotest/build.sh new file mode 100755 index 0000000..c0385ad --- /dev/null +++ b/zpu/hdl/zpu4/test/gpiotest/build.sh @@ -0,0 +1,4 @@ +zpu-elf-gcc -O3 -phi `pwd`/gpiotest.c -o gpiotest.elf -Wl,--relax -Wl,--gc-sections -g +zpu-elf-objdump --disassemble-all >gpiotest.dis gpiotest.elf +zpu-elf-objcopy -O binary gpiotest.elf gpiotest.bin +java -classpath ../../../../sw/simulator/zpusim.jar com.zylin.zpu.simulator.tools.MakeRam gpiotest.bin >gpiotest.ram diff --git a/zpu/hdl/zpu4/test/gpiotest/gpiotest.c b/zpu/hdl/zpu4/test/gpiotest/gpiotest.c new file mode 100644 index 0000000..393ab9f --- /dev/null +++ b/zpu/hdl/zpu4/test/gpiotest/gpiotest.c @@ -0,0 +1,72 @@ +/*
+ * Small test program to check GPIOs
+ *
+ * LED chaser until keypress
+ *
+ */
+
+// addresses refer to Phi memory layout
+#define GPIO_DATA *((volatile unsigned int *) 0x080a0004)
+#define GPIO_DIR *((volatile unsigned int *) 0x080a0008)
+
+
+#define BUTTON_EAST (3)
+#define BUTTON_NORTH (2)
+#define BUTTON_SOUTH (1)
+#define BUTTON_WEST (0)
+
+
+#define bit_is_set(var, bit) ((var) & (1 << (bit)))
+#define bit_is_clear(var, bit) ((!(var)) & (1 << (bit)))
+#define loop_until_bit_is_set(var, bit) do { } while (bit_is_clear(var, bit))
+#define loop_until_bit_is_clear(var, bit) do { } while (bit_is_set(var, bit))
+
+
+void led_test( void)
+{
+ unsigned char runs;
+ unsigned char leds;
+
+ runs = 1;
+ leds = 0x01;
+
+ while( runs)
+ {
+ // output
+ GPIO_DATA = leds;
+
+ // read button status
+ if bit_is_set(GPIO_DATA, BUTTON_NORTH)
+ {
+ runs = 0;
+ }
+
+ // LED chaser
+ leds = leds << 1;
+ if (leds == 0)
+ {
+ leds = 0x01;
+ }
+ }
+}
+
+
+void header_test( void)
+{
+ // this test is special for the SP601 header connector
+ // check the output in simulation
+ GPIO_DATA = 0x00550000;
+ GPIO_DIR = 0xff00ffff;
+ GPIO_DATA = 0x00aa0000;
+ GPIO_DIR = 0xffffffff;
+}
+
+
+int main(int argc, char **argv)
+{
+
+ led_test();
+ header_test();
+
+ abort();
+}
diff --git a/zpu/hdl/zpu4/test/hello/build.sh b/zpu/hdl/zpu4/test/hello/build.sh new file mode 100755 index 0000000..dd87410 --- /dev/null +++ b/zpu/hdl/zpu4/test/hello/build.sh @@ -0,0 +1,4 @@ +zpu-elf-gcc -O3 -phi `pwd`/hello.c -o hello.elf -Wl,--relax -Wl,--gc-sections -g +zpu-elf-objdump --disassemble-all >hello.dis hello.elf +zpu-elf-objcopy -O binary hello.elf hello.bin +java -classpath ../../../../sw/simulator/zpusim.jar com.zylin.zpu.simulator.tools.MakeRam hello.bin >hello.ram diff --git a/zpu/hdl/zpu4/test/hello/hello.bin b/zpu/hdl/zpu4/test/hello/hello.bin Binary files differnew file mode 100644 index 0000000..7c37759 --- /dev/null +++ b/zpu/hdl/zpu4/test/hello/hello.bin diff --git a/zpu/hdl/zpu4/test/hello/hello.c b/zpu/hdl/zpu4/test/hello/hello.c new file mode 100644 index 0000000..609c163 --- /dev/null +++ b/zpu/hdl/zpu4/test/hello/hello.c @@ -0,0 +1,47 @@ +/*
+ * Small hello world example, does not use printf()
+ */
+#include <stdio.h>
+
+int j;
+int k;
+
+int main(int argc, char **argv)
+{
+ int i;
+ for (i=0; i< 10; i++)
+ {
+ puts("Hello world 1\n");
+ puts("Hello world 2\n");
+ j=-4;
+ if ((j>>1)!=-2)
+ {
+ abort();
+ }
+
+ k=10;
+ if (k*j!=-40)
+ {
+ abort();
+ }
+
+ j=10;
+ k=10000000;
+ if (k*j!=100000000)
+ {
+ abort();
+ }
+
+ j=0x80000000;
+ k=0xffffffff;
+ if (j>k)
+ {
+ abort();
+ }
+ }
+ if (i!=10)
+ {
+ abort();
+ }
+
+}
diff --git a/zpu/hdl/zpu4/test/hello/hello.elf b/zpu/hdl/zpu4/test/hello/hello.elf Binary files differnew file mode 100644 index 0000000..73d28e7 --- /dev/null +++ b/zpu/hdl/zpu4/test/hello/hello.elf diff --git a/zpu/hdl/zpu4/test/hello/hello.ram b/zpu/hdl/zpu4/test/hello/hello.ram new file mode 100644 index 0000000..175d3a8 --- /dev/null +++ b/zpu/hdl/zpu4/test/hello/hello.ram @@ -0,0 +1,3055 @@ +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",
diff --git a/zpu/hdl/zpu4/test/interrupt/build.sh b/zpu/hdl/zpu4/test/interrupt/build.sh new file mode 100755 index 0000000..3d617e9 --- /dev/null +++ b/zpu/hdl/zpu4/test/interrupt/build.sh @@ -0,0 +1,4 @@ +zpu-elf-gcc -O3 -phi `pwd`/int.c -o int.elf -Wl,--relax -Wl,--gc-sections -g +zpu-elf-objdump --disassemble-all >int.dis int.elf +zpu-elf-objcopy -O binary int.elf int.bin +java -classpath ../../../../sw/simulator/zpusim.jar com.zylin.zpu.simulator.tools.MakeRam int.bin >int.ram diff --git a/zpu/hdl/zpu4/test/interrupt/int.bin b/zpu/hdl/zpu4/test/interrupt/int.bin Binary files differnew file mode 100644 index 0000000..282f53b --- /dev/null +++ b/zpu/hdl/zpu4/test/interrupt/int.bin diff --git a/zpu/hdl/zpu4/test/interrupt/int.c b/zpu/hdl/zpu4/test/interrupt/int.c new file mode 100644 index 0000000..6ab28f7 --- /dev/null +++ b/zpu/hdl/zpu4/test/interrupt/int.c @@ -0,0 +1,40 @@ +/*
+ * Shows usage of interrupts. Goes along with zpu_core_small_wip.vhd.
+ */
+#include <stdio.h>
+
+
+volatile int counter;
+
+/* Example of single, fixed interval non-maskable, nested interrupt. The interrupt signal is
+ * held high for enough cycles to guarantee that it will be noticed, i.e. longer than
+ * any io access + 4 cycles roughly.
+ *
+ * Any non-trivial interrupt controller would have support for
+ * acknowledging interrupts(i.e. keep interrupts asserted until
+ * software acknowledges them via memory mapped IO).
+ */
+void _zpu_interrupt(void)
+{
+ /* interrupts are enabled so we need to finish up quickly,
+ * lest we will get infinite recursion!*/
+ counter++;
+}
+
+int main(int argc, char **argv)
+{
+ int t;
+ t=counter;
+ for (;;)
+ {
+ if (t==counter)
+ {
+ puts("No interrupt\n");
+ } else
+ {
+ puts("Got interrupt\n");
+ t=counter;
+ }
+ }
+
+}
diff --git a/zpu/hdl/zpu4/test/interrupt/int.elf b/zpu/hdl/zpu4/test/interrupt/int.elf Binary files differnew file mode 100644 index 0000000..346d148 --- /dev/null +++ b/zpu/hdl/zpu4/test/interrupt/int.elf diff --git a/zpu/hdl/zpu4/test/interrupt/int.ram b/zpu/hdl/zpu4/test/interrupt/int.ram new file mode 100644 index 0000000..6751ec2 --- /dev/null +++ b/zpu/hdl/zpu4/test/interrupt/int.ram @@ -0,0 +1,3057 @@ +0 => x"0b0b0b0b",
+1 => x"82700b0b",
+2 => x"80cfe00c",
+3 => x"3a0b0b80",
+4 => x"c6e00400",
+5 => x"00000000",
+6 => x"00000000",
+7 => x"00000000",
+8 => x"80088408",
+9 => x"88080b0b",
+10 => x"0b8af02d",
+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"cc738306",
+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"ab2d5050",
+172 => x"80085688",
+173 => x"0c840c80",
+174 => x"0c510400",
+175 => x"00000000",
+176 => x"80088408",
+177 => x"88087575",
+178 => x"0b0b0b8b",
+179 => x"ef2d5050",
+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"80cfdc0c",
+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"c6e63f04",
+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"0b80dfc8",
+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"c8085271",
+292 => x"0870882a",
+293 => x"81327081",
+294 => x"06515151",
+295 => x"70f13873",
+296 => x"720c833d",
+297 => x"0d0480cf",
+298 => x"dc08802e",
+299 => x"a43880cf",
+300 => x"e008822e",
+301 => x"bd388380",
+302 => x"800b0b0b",
+303 => x"80dfc80c",
+304 => x"82a0800b",
+305 => x"80dfcc0c",
+306 => x"8290800b",
+307 => x"80dfd00c",
+308 => x"04f88080",
+309 => x"80a40b0b",
+310 => x"0b80dfc8",
+311 => x"0cf88080",
+312 => x"82800b80",
+313 => x"dfcc0cf8",
+314 => x"80808480",
+315 => x"0b80dfd0",
+316 => x"0c0480c0",
+317 => x"a8808c0b",
+318 => x"0b0b80df",
+319 => x"c80c80c0",
+320 => x"a880940b",
+321 => x"80dfcc0c",
+322 => x"0b0b80cf",
+323 => x"980b80df",
+324 => x"d00c0470",
+325 => x"7080dfd4",
+326 => x"335170a7",
+327 => x"3880cfe8",
+328 => x"08700852",
+329 => x"5270802e",
+330 => x"94388412",
+331 => x"80cfe80c",
+332 => x"702d80cf",
+333 => x"e8087008",
+334 => x"525270ee",
+335 => x"38810b80",
+336 => x"dfd43450",
+337 => x"50040470",
+338 => x"0b0b80df",
+339 => x"c408802e",
+340 => x"8e380b0b",
+341 => x"0b0b800b",
+342 => x"802e0981",
+343 => x"06833850",
+344 => x"040b0b80",
+345 => x"dfc4510b",
+346 => x"0b0bf594",
+347 => x"3f500404",
+348 => x"803d0d80",
+349 => x"dfe00881",
+350 => x"1180dfe0",
+351 => x"0c51823d",
+352 => x"0d04fe3d",
+353 => x"0d80dfe0",
+354 => x"085380df",
+355 => x"e0085272",
+356 => x"722e8f38",
+357 => x"80cf9c51",
+358 => x"82b03f80",
+359 => x"dfe00853",
+360 => x"e93980cf",
+361 => x"ac5182a2",
+362 => x"3fe039fb",
+363 => x"3d0d7779",
+364 => x"55558056",
+365 => x"757524ab",
+366 => x"38807424",
+367 => x"9d388053",
+368 => x"73527451",
+369 => x"80e13f80",
+370 => x"08547580",
+371 => x"2e853880",
+372 => x"08305473",
+373 => x"800c873d",
+374 => x"0d047330",
+375 => x"76813257",
+376 => x"54dc3974",
+377 => x"30558156",
+378 => x"738025d2",
+379 => x"38ec39fa",
+380 => x"3d0d787a",
+381 => x"57558057",
+382 => x"767524a4",
+383 => x"38759f2c",
+384 => x"54815375",
+385 => x"74327431",
+386 => x"5274519b",
+387 => x"3f800854",
+388 => x"76802e85",
+389 => x"38800830",
+390 => x"5473800c",
+391 => x"883d0d04",
+392 => x"74305581",
+393 => x"57d739fc",
+394 => x"3d0d7678",
+395 => x"53548153",
+396 => x"80747326",
+397 => x"52557280",
+398 => x"2e983870",
+399 => x"802eab38",
+400 => x"807224a6",
+401 => x"38711073",
+402 => x"10757226",
+403 => x"53545272",
+404 => x"ea387351",
+405 => x"78833874",
+406 => x"5170800c",
+407 => x"863d0d04",
+408 => x"720a100a",
+409 => x"720a100a",
+410 => x"53537280",
+411 => x"2ee43871",
+412 => x"7426ed38",
+413 => x"73723175",
+414 => x"7407740a",
+415 => x"100a740a",
+416 => x"100a5555",
+417 => x"5654e339",
+418 => x"f73d0d7c",
+419 => x"70525380",
+420 => x"fd3f7254",
+421 => x"8008550b",
+422 => x"0b80cfb8",
+423 => x"56815780",
+424 => x"0881055a",
+425 => x"8b3de411",
+426 => x"59538259",
+427 => x"f413527b",
+428 => x"88110852",
+429 => x"5381b43f",
+430 => x"80083070",
+431 => x"8008079f",
+432 => x"2c8a0780",
+433 => x"0c538b3d",
+434 => x"0d04f63d",
+435 => x"0d7c80cf",
+436 => x"ec087153",
+437 => x"5553b73f",
+438 => x"72558008",
+439 => x"560b0b80",
+440 => x"cfb85781",
+441 => x"58800881",
+442 => x"055b8c3d",
+443 => x"e4115a53",
+444 => x"825af413",
+445 => x"52881408",
+446 => x"5180f03f",
+447 => x"80083070",
+448 => x"8008079f",
+449 => x"2c8a0780",
+450 => x"0c548c3d",
+451 => x"0d047070",
+452 => x"70707570",
+453 => x"71830653",
+454 => x"555270b4",
+455 => x"38717008",
+456 => x"7009f7fb",
+457 => x"fdff1206",
+458 => x"f8848281",
+459 => x"80065452",
+460 => x"53719b38",
+461 => x"84137008",
+462 => x"7009f7fb",
+463 => x"fdff1206",
+464 => x"f8848281",
+465 => x"80065452",
+466 => x"5371802e",
+467 => x"e7387252",
+468 => x"71335372",
+469 => x"802e8a38",
+470 => x"81127033",
+471 => x"545272f8",
+472 => x"38717431",
+473 => x"800c5050",
+474 => x"505004f2",
+475 => x"3d0d6062",
+476 => x"88110870",
+477 => x"58565f5a",
+478 => x"73802e81",
+479 => x"8c388c1a",
+480 => x"2270832a",
+481 => x"81328106",
+482 => x"56587486",
+483 => x"38901a08",
+484 => x"91387951",
+485 => x"90b73fff",
+486 => x"55800880",
+487 => x"ec388c1a",
+488 => x"22587d08",
+489 => x"55807883",
+490 => x"ffff0670",
+491 => x"0a100a81",
+492 => x"06415c57",
+493 => x"7e772e80",
+494 => x"d7387690",
+495 => x"38740884",
+496 => x"16088817",
+497 => x"57585676",
+498 => x"802ef238",
+499 => x"76548880",
+500 => x"77278438",
+501 => x"88805473",
+502 => x"5375529c",
+503 => x"1a0851a4",
+504 => x"1a085877",
+505 => x"2d800b80",
+506 => x"082582e0",
+507 => x"38800816",
+508 => x"77800831",
+509 => x"7f880508",
+510 => x"80083170",
+511 => x"6188050c",
+512 => x"5b585678",
+513 => x"ffb43880",
+514 => x"5574800c",
+515 => x"903d0d04",
+516 => x"7a813281",
+517 => x"06774056",
+518 => x"75802e81",
+519 => x"bd387690",
+520 => x"38740884",
+521 => x"16088817",
+522 => x"57585976",
+523 => x"802ef238",
+524 => x"881a0878",
+525 => x"83ffff06",
+526 => x"70892a81",
+527 => x"06565956",
+528 => x"73802e82",
+529 => x"f8387577",
+530 => x"278b3877",
+531 => x"872a8106",
+532 => x"5c7b82b5",
+533 => x"38767627",
+534 => x"83387656",
+535 => x"75537852",
+536 => x"79085185",
+537 => x"833f881a",
+538 => x"08763188",
+539 => x"1b0c7908",
+540 => x"167a0c76",
+541 => x"56751977",
+542 => x"77317f88",
+543 => x"05087831",
+544 => x"70618805",
+545 => x"0c415859",
+546 => x"7e802efe",
+547 => x"fa388c1a",
+548 => x"2258ff8a",
+549 => x"39787954",
+550 => x"7c537b52",
+551 => x"5684c93f",
+552 => x"881a0879",
+553 => x"31881b0c",
+554 => x"7908197a",
+555 => x"0c7c7631",
+556 => x"5d7c8e38",
+557 => x"79518ff2",
+558 => x"3f800881",
+559 => x"8f388008",
+560 => x"5f751c77",
+561 => x"77317f88",
+562 => x"05087831",
+563 => x"70618805",
+564 => x"0c5d585c",
+565 => x"7a802efe",
+566 => x"ae387681",
+567 => x"83387408",
+568 => x"84160888",
+569 => x"1757585c",
+570 => x"76802ef2",
+571 => x"3876538a",
+572 => x"527b5182",
+573 => x"d33f8008",
+574 => x"7c318105",
+575 => x"5d800884",
+576 => x"3881175d",
+577 => x"815f7c59",
+578 => x"767d2783",
+579 => x"38765994",
+580 => x"1a08881b",
+581 => x"08115758",
+582 => x"807a085c",
+583 => x"54901a08",
+584 => x"7b278338",
+585 => x"81547579",
+586 => x"25843873",
+587 => x"ba387779",
+588 => x"24fee238",
+589 => x"77537b52",
+590 => x"9c1a0851",
+591 => x"a41a0859",
+592 => x"782d8008",
+593 => x"56800880",
+594 => x"24fee238",
+595 => x"8c1a2280",
+596 => x"c0075e7d",
+597 => x"8c1b23ff",
+598 => x"5574800c",
+599 => x"903d0d04",
+600 => x"7effa338",
+601 => x"ff873975",
+602 => x"537b527a",
+603 => x"5182f93f",
+604 => x"7908167a",
+605 => x"0c79518e",
+606 => x"b13f8008",
+607 => x"cf387c76",
+608 => x"315d7cfe",
+609 => x"bc38feac",
+610 => x"39901a08",
+611 => x"7a087131",
+612 => x"78117056",
+613 => x"5a575280",
+614 => x"cfec0851",
+615 => x"84943f80",
+616 => x"08802eff",
+617 => x"a7388008",
+618 => x"901b0c80",
+619 => x"08167a0c",
+620 => x"77941b0c",
+621 => x"76881b0c",
+622 => x"7656fd99",
+623 => x"39790858",
+624 => x"901a0878",
+625 => x"27833881",
+626 => x"54757727",
+627 => x"843873b3",
+628 => x"38941a08",
+629 => x"54737726",
+630 => x"80d33873",
+631 => x"5378529c",
+632 => x"1a0851a4",
+633 => x"1a085877",
+634 => x"2d800856",
+635 => x"80088024",
+636 => x"fd83388c",
+637 => x"1a2280c0",
+638 => x"075e7d8c",
+639 => x"1b23ff55",
+640 => x"fed73975",
+641 => x"53785277",
+642 => x"5181dd3f",
+643 => x"7908167a",
+644 => x"0c79518d",
+645 => x"953f8008",
+646 => x"802efcd9",
+647 => x"388c1a22",
+648 => x"80c0075e",
+649 => x"7d8c1b23",
+650 => x"ff55fead",
+651 => x"39767754",
+652 => x"79537852",
+653 => x"5681b13f",
+654 => x"881a0877",
+655 => x"31881b0c",
+656 => x"7908177a",
+657 => x"0cfcae39",
+658 => x"fa3d0d7a",
+659 => x"79028805",
+660 => x"a7053355",
+661 => x"53548374",
+662 => x"2780df38",
+663 => x"71830651",
+664 => x"7080d738",
+665 => x"71715755",
+666 => x"83517582",
+667 => x"802913ff",
+668 => x"12525670",
+669 => x"8025f338",
+670 => x"837427bc",
+671 => x"38740876",
+672 => x"327009f7",
+673 => x"fbfdff12",
+674 => x"06f88482",
+675 => x"81800651",
+676 => x"5170802e",
+677 => x"98387451",
+678 => x"80527033",
+679 => x"5772772e",
+680 => x"b9388111",
+681 => x"81135351",
+682 => x"837227ee",
+683 => x"38fc1484",
+684 => x"16565473",
+685 => x"8326c638",
+686 => x"7452ff14",
+687 => x"5170ff2e",
+688 => x"97387133",
+689 => x"5472742e",
+690 => x"98388112",
+691 => x"ff125252",
+692 => x"70ff2e09",
+693 => x"8106eb38",
+694 => x"80517080",
+695 => x"0c883d0d",
+696 => x"0471800c",
+697 => x"883d0d04",
+698 => x"fa3d0d78",
+699 => x"7a7c7272",
+700 => x"72595755",
+701 => x"58565774",
+702 => x"7727b238",
+703 => x"75155176",
+704 => x"7127aa38",
+705 => x"707618ff",
+706 => x"18535353",
+707 => x"70ff2e96",
+708 => x"38ff12ff",
+709 => x"14545272",
+710 => x"337234ff",
+711 => x"115170ff",
+712 => x"2e098106",
+713 => x"ec387680",
+714 => x"0c883d0d",
+715 => x"048f7627",
+716 => x"80e63874",
+717 => x"77078306",
+718 => x"517080dc",
+719 => x"38767552",
+720 => x"53707084",
+721 => x"05520873",
+722 => x"70840555",
+723 => x"0c727170",
+724 => x"84055308",
+725 => x"71708405",
+726 => x"530c7170",
+727 => x"84055308",
+728 => x"71708405",
+729 => x"530c7170",
+730 => x"84055308",
+731 => x"71708405",
+732 => x"530cf015",
+733 => x"5553738f",
+734 => x"26c73883",
+735 => x"74279538",
+736 => x"70708405",
+737 => x"52087370",
+738 => x"8405550c",
+739 => x"fc145473",
+740 => x"8326ed38",
+741 => x"72715452",
+742 => x"ff145170",
+743 => x"ff2eff86",
+744 => x"38727081",
+745 => x"05543372",
+746 => x"70810554",
+747 => x"34ff1151",
+748 => x"ea39ef3d",
+749 => x"0d636567",
+750 => x"405d427b",
+751 => x"802e8582",
+752 => x"386151a9",
+753 => x"e73ff81c",
+754 => x"70841208",
+755 => x"70fc0670",
+756 => x"628b0570",
+757 => x"f8064159",
+758 => x"455c5f41",
+759 => x"57967427",
+760 => x"82c53880",
+761 => x"7b247e7c",
+762 => x"26075880",
+763 => x"5477742e",
+764 => x"09810682",
+765 => x"ab38787b",
+766 => x"2581fe38",
+767 => x"781780d7",
+768 => x"a80b8805",
+769 => x"085b5679",
+770 => x"762e84c5",
+771 => x"38841608",
+772 => x"70fe0617",
+773 => x"84110881",
+774 => x"06415555",
+775 => x"7e828d38",
+776 => x"74fc0658",
+777 => x"79762e84",
+778 => x"e3387818",
+779 => x"5f7e7b25",
+780 => x"81ff387c",
+781 => x"81065473",
+782 => x"82c13876",
+783 => x"77083184",
+784 => x"1108fc06",
+785 => x"56577580",
+786 => x"2e913879",
+787 => x"762e84f0",
+788 => x"38741819",
+789 => x"58777b25",
+790 => x"84913876",
+791 => x"802e829b",
+792 => x"38781556",
+793 => x"7a762482",
+794 => x"92388c17",
+795 => x"08881808",
+796 => x"718c120c",
+797 => x"88120c5e",
+798 => x"75598817",
+799 => x"61fc055b",
+800 => x"5679a426",
+801 => x"85ff387b",
+802 => x"76595593",
+803 => x"7a2780c9",
+804 => x"387b7084",
+805 => x"055d087c",
+806 => x"56760c74",
+807 => x"70840556",
+808 => x"088c180c",
+809 => x"9017589b",
+810 => x"7a27ae38",
+811 => x"74708405",
+812 => x"5608780c",
+813 => x"74708405",
+814 => x"56089418",
+815 => x"0c981758",
+816 => x"a37a2795",
+817 => x"38747084",
+818 => x"05560878",
+819 => x"0c747084",
+820 => x"0556089c",
+821 => x"180ca017",
+822 => x"58747084",
+823 => x"05560875",
+824 => x"5f787084",
+825 => x"055a0c77",
+826 => x"7e708405",
+827 => x"40087170",
+828 => x"8405530c",
+829 => x"7e08710c",
+830 => x"5d787b31",
+831 => x"56758f26",
+832 => x"80c93884",
+833 => x"17088106",
+834 => x"79078418",
+835 => x"0c781784",
+836 => x"11088107",
+837 => x"84120c5b",
+838 => x"6151a791",
+839 => x"3f881754",
+840 => x"73800c93",
+841 => x"3d0d0490",
+842 => x"5bfdb839",
+843 => x"7756fe83",
+844 => x"398c1608",
+845 => x"88170871",
+846 => x"8c120c88",
+847 => x"120c587e",
+848 => x"707c3157",
+849 => x"598f7627",
+850 => x"ffb9387a",
+851 => x"17841808",
+852 => x"81067c07",
+853 => x"84190c76",
+854 => x"81078412",
+855 => x"0c761184",
+856 => x"11088107",
+857 => x"84120c5b",
+858 => x"88055261",
+859 => x"518fda3f",
+860 => x"6151a6b9",
+861 => x"3f881754",
+862 => x"ffa6397d",
+863 => x"52615197",
+864 => x"d73f8008",
+865 => x"5a800880",
+866 => x"2e81ab38",
+867 => x"8008f805",
+868 => x"60840508",
+869 => x"fe066105",
+870 => x"58557477",
+871 => x"2e83f238",
+872 => x"fc195877",
+873 => x"a42681b0",
+874 => x"387b8008",
+875 => x"56579378",
+876 => x"2780dc38",
+877 => x"7b707084",
+878 => x"05520880",
+879 => x"08708405",
+880 => x"800c0c80",
+881 => x"08717084",
+882 => x"0553085d",
+883 => x"567b7670",
+884 => x"8405580c",
+885 => x"579b7827",
+886 => x"b6387670",
+887 => x"84055808",
+888 => x"75708405",
+889 => x"570c7670",
+890 => x"84055808",
+891 => x"75708405",
+892 => x"570ca378",
+893 => x"27993876",
+894 => x"70840558",
+895 => x"08757084",
+896 => x"05570c76",
+897 => x"70840558",
+898 => x"08757084",
+899 => x"05570c76",
+900 => x"70840558",
+901 => x"08775e75",
+902 => x"70840557",
+903 => x"0c747d70",
+904 => x"84055f08",
+905 => x"71708405",
+906 => x"530c7d08",
+907 => x"710c5f7b",
+908 => x"5261518e",
+909 => x"943f6151",
+910 => x"a4f33f79",
+911 => x"800c933d",
+912 => x"0d047d52",
+913 => x"61519690",
+914 => x"3f800880",
+915 => x"0c933d0d",
+916 => x"04841608",
+917 => x"55fbc939",
+918 => x"77537b52",
+919 => x"800851a2",
+920 => x"a53f7b52",
+921 => x"61518de1",
+922 => x"3fcc398c",
+923 => x"16088817",
+924 => x"08718c12",
+925 => x"0c88120c",
+926 => x"5d8c1708",
+927 => x"88180871",
+928 => x"8c120c88",
+929 => x"120c5977",
+930 => x"59fbef39",
+931 => x"7818901c",
+932 => x"40557e75",
+933 => x"24fb9c38",
+934 => x"7a177080",
+935 => x"d7a80b88",
+936 => x"050c757c",
+937 => x"31810784",
+938 => x"120c5684",
+939 => x"17088106",
+940 => x"7b078418",
+941 => x"0c6151a3",
+942 => x"f43f8817",
+943 => x"54fce139",
+944 => x"74181990",
+945 => x"1c5e5a7c",
+946 => x"7a24fb8f",
+947 => x"388c1708",
+948 => x"88180871",
+949 => x"8c120c88",
+950 => x"120c5e88",
+951 => x"1761fc05",
+952 => x"575975a4",
+953 => x"2681b638",
+954 => x"7b795955",
+955 => x"93762780",
+956 => x"c9387b70",
+957 => x"84055d08",
+958 => x"7c56790c",
+959 => x"74708405",
+960 => x"56088c18",
+961 => x"0c901758",
+962 => x"9b7627ae",
+963 => x"38747084",
+964 => x"05560878",
+965 => x"0c747084",
+966 => x"05560894",
+967 => x"180c9817",
+968 => x"58a37627",
+969 => x"95387470",
+970 => x"84055608",
+971 => x"780c7470",
+972 => x"84055608",
+973 => x"9c180ca0",
+974 => x"17587470",
+975 => x"84055608",
+976 => x"75417870",
+977 => x"84055a0c",
+978 => x"77607084",
+979 => x"05420871",
+980 => x"70840553",
+981 => x"0c600871",
+982 => x"0c5e7a17",
+983 => x"7080d7a8",
+984 => x"0b88050c",
+985 => x"7a7c3181",
+986 => x"0784120c",
+987 => x"58841708",
+988 => x"81067b07",
+989 => x"84180c61",
+990 => x"51a2b23f",
+991 => x"78547380",
+992 => x"0c933d0d",
+993 => x"0479537b",
+994 => x"5275519f",
+995 => x"f93ffae9",
+996 => x"39841508",
+997 => x"fc061960",
+998 => x"5859fadd",
+999 => x"3975537b",
+1000 => x"5278519f",
+1001 => x"e13f7a17",
+1002 => x"7080d7a8",
+1003 => x"0b88050c",
+1004 => x"7a7c3181",
+1005 => x"0784120c",
+1006 => x"58841708",
+1007 => x"81067b07",
+1008 => x"84180c61",
+1009 => x"51a1e63f",
+1010 => x"7854ffb2",
+1011 => x"39fa3d0d",
+1012 => x"7880cfec",
+1013 => x"085455b8",
+1014 => x"1308802e",
+1015 => x"81af388c",
+1016 => x"15227083",
+1017 => x"ffff0670",
+1018 => x"832a8132",
+1019 => x"81065555",
+1020 => x"5672802e",
+1021 => x"80da3873",
+1022 => x"842a8132",
+1023 => x"810657ff",
+1024 => x"537680f2",
+1025 => x"3873822a",
+1026 => x"81065473",
+1027 => x"802eb938",
+1028 => x"b0150854",
+1029 => x"73802e9c",
+1030 => x"3880c015",
+1031 => x"5373732e",
+1032 => x"8f387352",
+1033 => x"80cfec08",
+1034 => x"518a9e3f",
+1035 => x"8c152256",
+1036 => x"76b0160c",
+1037 => x"75db0657",
+1038 => x"768c1623",
+1039 => x"800b8416",
+1040 => x"0c901508",
+1041 => x"750c7656",
+1042 => x"75880754",
+1043 => x"738c1623",
+1044 => x"90150880",
+1045 => x"2ebf388c",
+1046 => x"15227081",
+1047 => x"06555373",
+1048 => x"9c38720a",
+1049 => x"100a8106",
+1050 => x"56758538",
+1051 => x"94150854",
+1052 => x"7388160c",
+1053 => x"80537280",
+1054 => x"0c883d0d",
+1055 => x"04800b88",
+1056 => x"160c9415",
+1057 => x"08309816",
+1058 => x"0c8053ea",
+1059 => x"39725182",
+1060 => x"a63ffecb",
+1061 => x"3974518f",
+1062 => x"bc3f8c15",
+1063 => x"22708106",
+1064 => x"55537380",
+1065 => x"2effbb38",
+1066 => x"d439f83d",
+1067 => x"0d7a5776",
+1068 => x"802e8197",
+1069 => x"3880cfec",
+1070 => x"0854b814",
+1071 => x"08802e80",
+1072 => x"eb388c17",
+1073 => x"2270902b",
+1074 => x"70902c70",
+1075 => x"832a8132",
+1076 => x"81065b5b",
+1077 => x"57557780",
+1078 => x"cb389017",
+1079 => x"08567580",
+1080 => x"2e80c138",
+1081 => x"76087631",
+1082 => x"76780c79",
+1083 => x"83065555",
+1084 => x"73853894",
+1085 => x"17085877",
+1086 => x"88180c80",
+1087 => x"7525a538",
+1088 => x"74537552",
+1089 => x"9c170851",
+1090 => x"a4170854",
+1091 => x"732d800b",
+1092 => x"80082580",
+1093 => x"c9388008",
+1094 => x"16758008",
+1095 => x"31565674",
+1096 => x"8024dd38",
+1097 => x"800b800c",
+1098 => x"8a3d0d04",
+1099 => x"73518187",
+1100 => x"3f8c1722",
+1101 => x"70902b70",
+1102 => x"902c7083",
+1103 => x"2a813281",
+1104 => x"065b5b57",
+1105 => x"5577dd38",
+1106 => x"ff9039a1",
+1107 => x"aa5280cf",
+1108 => x"ec08518c",
+1109 => x"d03f8008",
+1110 => x"800c8a3d",
+1111 => x"0d048c17",
+1112 => x"2280c007",
+1113 => x"58778c18",
+1114 => x"23ff0b80",
+1115 => x"0c8a3d0d",
+1116 => x"04fa3d0d",
+1117 => x"797080dc",
+1118 => x"298c1154",
+1119 => x"7a535657",
+1120 => x"8fd63f80",
+1121 => x"08800855",
+1122 => x"56800880",
+1123 => x"2ea23880",
+1124 => x"088c0554",
+1125 => x"800b8008",
+1126 => x"0c768008",
+1127 => x"84050c73",
+1128 => x"80088805",
+1129 => x"0c745380",
+1130 => x"5273519c",
+1131 => x"f53f7554",
+1132 => x"73800c88",
+1133 => x"3d0d0470",
+1134 => x"707074a8",
+1135 => x"f60bbc12",
+1136 => x"0c53810b",
+1137 => x"b8140c80",
+1138 => x"0b84dc14",
+1139 => x"0c830b84",
+1140 => x"e0140c84",
+1141 => x"e81384e4",
+1142 => x"140c8413",
+1143 => x"08518070",
+1144 => x"720c7084",
+1145 => x"130c7088",
+1146 => x"130c5284",
+1147 => x"0b8c1223",
+1148 => x"718e1223",
+1149 => x"7190120c",
+1150 => x"7194120c",
+1151 => x"7198120c",
+1152 => x"709c120c",
+1153 => x"80c1e50b",
+1154 => x"a0120c80",
+1155 => x"c2b10ba4",
+1156 => x"120c80c3",
+1157 => x"ad0ba812",
+1158 => x"0c80c3fe",
+1159 => x"0bac120c",
+1160 => x"88130872",
+1161 => x"710c7284",
+1162 => x"120c7288",
+1163 => x"120c5189",
+1164 => x"0b8c1223",
+1165 => x"810b8e12",
+1166 => x"23719012",
+1167 => x"0c719412",
+1168 => x"0c719812",
+1169 => x"0c709c12",
+1170 => x"0c80c1e5",
+1171 => x"0ba0120c",
+1172 => x"80c2b10b",
+1173 => x"a4120c80",
+1174 => x"c3ad0ba8",
+1175 => x"120c80c3",
+1176 => x"fe0bac12",
+1177 => x"0c8c1308",
+1178 => x"72710c72",
+1179 => x"84120c72",
+1180 => x"88120c51",
+1181 => x"8a0b8c12",
+1182 => x"23820b8e",
+1183 => x"12237190",
+1184 => x"120c7194",
+1185 => x"120c7198",
+1186 => x"120c709c",
+1187 => x"120c80c1",
+1188 => x"e50ba012",
+1189 => x"0c80c2b1",
+1190 => x"0ba4120c",
+1191 => x"80c3ad0b",
+1192 => x"a8120c80",
+1193 => x"c3fe0bac",
+1194 => x"120c5050",
+1195 => x"5004f83d",
+1196 => x"0d7a80cf",
+1197 => x"ec08b811",
+1198 => x"08575758",
+1199 => x"7481ec38",
+1200 => x"a8f60bbc",
+1201 => x"170c810b",
+1202 => x"b8170c74",
+1203 => x"84dc170c",
+1204 => x"830b84e0",
+1205 => x"170c84e8",
+1206 => x"1684e417",
+1207 => x"0c841608",
+1208 => x"75710c75",
+1209 => x"84120c75",
+1210 => x"88120c59",
+1211 => x"840b8c1a",
+1212 => x"23748e1a",
+1213 => x"2374901a",
+1214 => x"0c74941a",
+1215 => x"0c74981a",
+1216 => x"0c789c1a",
+1217 => x"0c80c1e5",
+1218 => x"0ba01a0c",
+1219 => x"80c2b10b",
+1220 => x"a41a0c80",
+1221 => x"c3ad0ba8",
+1222 => x"1a0c80c3",
+1223 => x"fe0bac1a",
+1224 => x"0c881608",
+1225 => x"75710c75",
+1226 => x"84120c75",
+1227 => x"88120c57",
+1228 => x"890b8c18",
+1229 => x"23810b8e",
+1230 => x"18237490",
+1231 => x"180c7494",
+1232 => x"180c7498",
+1233 => x"180c769c",
+1234 => x"180c80c1",
+1235 => x"e50ba018",
+1236 => x"0c80c2b1",
+1237 => x"0ba4180c",
+1238 => x"80c3ad0b",
+1239 => x"a8180c80",
+1240 => x"c3fe0bac",
+1241 => x"180c8c16",
+1242 => x"0875710c",
+1243 => x"7584120c",
+1244 => x"7588120c",
+1245 => x"548a0b8c",
+1246 => x"1523820b",
+1247 => x"8e152374",
+1248 => x"90150c74",
+1249 => x"94150c74",
+1250 => x"98150c73",
+1251 => x"9c150c80",
+1252 => x"c1e50ba0",
+1253 => x"150c80c2",
+1254 => x"b10ba415",
+1255 => x"0c80c3ad",
+1256 => x"0ba8150c",
+1257 => x"80c3fe0b",
+1258 => x"ac150c84",
+1259 => x"dc168811",
+1260 => x"08841208",
+1261 => x"ff055757",
+1262 => x"57807524",
+1263 => x"9f388c16",
+1264 => x"2270902b",
+1265 => x"70902c51",
+1266 => x"55597380",
+1267 => x"2e80ed38",
+1268 => x"80dc16ff",
+1269 => x"16565674",
+1270 => x"8025e338",
+1271 => x"76085574",
+1272 => x"802e8f38",
+1273 => x"74881108",
+1274 => x"841208ff",
+1275 => x"05575757",
+1276 => x"c83982fc",
+1277 => x"5277518a",
+1278 => x"df3f8008",
+1279 => x"80085556",
+1280 => x"8008802e",
+1281 => x"a3388008",
+1282 => x"8c057580",
+1283 => x"080c5484",
+1284 => x"0b800884",
+1285 => x"050c7380",
+1286 => x"0888050c",
+1287 => x"82f05374",
+1288 => x"52735197",
+1289 => x"fd3f7554",
+1290 => x"7374780c",
+1291 => x"5573ffb4",
+1292 => x"388c780c",
+1293 => x"800b800c",
+1294 => x"8a3d0d04",
+1295 => x"810b8c17",
+1296 => x"2373760c",
+1297 => x"7388170c",
+1298 => x"7384170c",
+1299 => x"7390170c",
+1300 => x"7394170c",
+1301 => x"7398170c",
+1302 => x"ff0b8e17",
+1303 => x"2373b017",
+1304 => x"0c73b417",
+1305 => x"0c7380c4",
+1306 => x"170c7380",
+1307 => x"c8170c75",
+1308 => x"800c8a3d",
+1309 => x"0d047070",
+1310 => x"a1aa5273",
+1311 => x"5186a63f",
+1312 => x"50500470",
+1313 => x"70a1aa52",
+1314 => x"80cfec08",
+1315 => x"5186963f",
+1316 => x"505004fb",
+1317 => x"3d0d7770",
+1318 => x"52569890",
+1319 => x"3f80d7a8",
+1320 => x"0b880508",
+1321 => x"841108fc",
+1322 => x"06707b31",
+1323 => x"9fef05e0",
+1324 => x"8006e080",
+1325 => x"05525555",
+1326 => x"a0807524",
+1327 => x"94388052",
+1328 => x"755197ea",
+1329 => x"3f80d7b0",
+1330 => x"08145372",
+1331 => x"80082e8f",
+1332 => x"38755197",
+1333 => x"d83f8053",
+1334 => x"72800c87",
+1335 => x"3d0d0474",
+1336 => x"30527551",
+1337 => x"97c83f80",
+1338 => x"08ff2ea8",
+1339 => x"3880d7a8",
+1340 => x"0b880508",
+1341 => x"74763181",
+1342 => x"0784120c",
+1343 => x"5380d6ec",
+1344 => x"08753180",
+1345 => x"d6ec0c75",
+1346 => x"5197a23f",
+1347 => x"810b800c",
+1348 => x"873d0d04",
+1349 => x"80527551",
+1350 => x"97943f80",
+1351 => x"d7a80b88",
+1352 => x"05088008",
+1353 => x"71315454",
+1354 => x"8f7325ff",
+1355 => x"a4388008",
+1356 => x"80d79c08",
+1357 => x"3180d6ec",
+1358 => x"0c728107",
+1359 => x"84150c75",
+1360 => x"5196ea3f",
+1361 => x"8053ff90",
+1362 => x"39f73d0d",
+1363 => x"7b7d545a",
+1364 => x"72802e82",
+1365 => x"83387951",
+1366 => x"96d23ff8",
+1367 => x"13841108",
+1368 => x"70fe0670",
+1369 => x"13841108",
+1370 => x"fc065c57",
+1371 => x"58545780",
+1372 => x"d7b00874",
+1373 => x"2e82de38",
+1374 => x"7784150c",
+1375 => x"80738106",
+1376 => x"56597479",
+1377 => x"2e81d538",
+1378 => x"77148411",
+1379 => x"08810656",
+1380 => x"5374a038",
+1381 => x"77165678",
+1382 => x"81e63888",
+1383 => x"14085574",
+1384 => x"80d7b02e",
+1385 => x"82f9388c",
+1386 => x"1408708c",
+1387 => x"170c7588",
+1388 => x"120c5875",
+1389 => x"81078418",
+1390 => x"0c751776",
+1391 => x"710c5478",
+1392 => x"81913883",
+1393 => x"ff762781",
+1394 => x"c8387589",
+1395 => x"2a76832a",
+1396 => x"54547380",
+1397 => x"2ebf3875",
+1398 => x"862ab805",
+1399 => x"53847427",
+1400 => x"b43880db",
+1401 => x"14539474",
+1402 => x"27ab3875",
+1403 => x"8c2a80ee",
+1404 => x"055380d4",
+1405 => x"74279e38",
+1406 => x"758f2a80",
+1407 => x"f7055382",
+1408 => x"d4742791",
+1409 => x"3875922a",
+1410 => x"80fc0553",
+1411 => x"8ad47427",
+1412 => x"843880fe",
+1413 => x"53721010",
+1414 => x"1080d7a8",
+1415 => x"05881108",
+1416 => x"55557375",
+1417 => x"2e82bf38",
+1418 => x"841408fc",
+1419 => x"06597579",
+1420 => x"278d3888",
+1421 => x"14085473",
+1422 => x"752e0981",
+1423 => x"06ea388c",
+1424 => x"1408708c",
+1425 => x"190c7488",
+1426 => x"190c7788",
+1427 => x"120c5576",
+1428 => x"8c150c79",
+1429 => x"5194d63f",
+1430 => x"8b3d0d04",
+1431 => x"76087771",
+1432 => x"31587605",
+1433 => x"88180856",
+1434 => x"567480d7",
+1435 => x"b02e80e0",
+1436 => x"388c1708",
+1437 => x"708c170c",
+1438 => x"7588120c",
+1439 => x"53fe8939",
+1440 => x"8814088c",
+1441 => x"1508708c",
+1442 => x"130c5988",
+1443 => x"190cfea3",
+1444 => x"3975832a",
+1445 => x"70545480",
+1446 => x"74248198",
+1447 => x"3872822c",
+1448 => x"81712b80",
+1449 => x"d7ac0807",
+1450 => x"80d7a80b",
+1451 => x"84050c74",
+1452 => x"10101080",
+1453 => x"d7a80588",
+1454 => x"1108718c",
+1455 => x"1b0c7088",
+1456 => x"1b0c7988",
+1457 => x"130c565a",
+1458 => x"55768c15",
+1459 => x"0cff8439",
+1460 => x"8159fdb4",
+1461 => x"39771673",
+1462 => x"81065455",
+1463 => x"72983876",
+1464 => x"08777131",
+1465 => x"5875058c",
+1466 => x"18088819",
+1467 => x"08718c12",
+1468 => x"0c88120c",
+1469 => x"55557481",
+1470 => x"0784180c",
+1471 => x"7680d7a8",
+1472 => x"0b88050c",
+1473 => x"80d7a408",
+1474 => x"7526fec7",
+1475 => x"3880d7a0",
+1476 => x"08527951",
+1477 => x"fafd3f79",
+1478 => x"5193923f",
+1479 => x"feba3981",
+1480 => x"778c170c",
+1481 => x"7788170c",
+1482 => x"758c190c",
+1483 => x"7588190c",
+1484 => x"59fd8039",
+1485 => x"83147082",
+1486 => x"2c81712b",
+1487 => x"80d7ac08",
+1488 => x"0780d7a8",
+1489 => x"0b84050c",
+1490 => x"75101010",
+1491 => x"80d7a805",
+1492 => x"88110871",
+1493 => x"8c1c0c70",
+1494 => x"881c0c7a",
+1495 => x"88130c57",
+1496 => x"5b5653fe",
+1497 => x"e4398073",
+1498 => x"24a33872",
+1499 => x"822c8171",
+1500 => x"2b80d7ac",
+1501 => x"080780d7",
+1502 => x"a80b8405",
+1503 => x"0c58748c",
+1504 => x"180c7388",
+1505 => x"180c7688",
+1506 => x"160cfdc3",
+1507 => x"39831370",
+1508 => x"822c8171",
+1509 => x"2b80d7ac",
+1510 => x"080780d7",
+1511 => x"a80b8405",
+1512 => x"0c5953da",
+1513 => x"39f93d0d",
+1514 => x"797b5853",
+1515 => x"800b80cf",
+1516 => x"ec085356",
+1517 => x"72722ebc",
+1518 => x"3884dc13",
+1519 => x"5574762e",
+1520 => x"b3388815",
+1521 => x"08841608",
+1522 => x"ff055454",
+1523 => x"80732499",
+1524 => x"388c1422",
+1525 => x"70902b53",
+1526 => x"587180d4",
+1527 => x"3880dc14",
+1528 => x"ff145454",
+1529 => x"728025e9",
+1530 => x"38740855",
+1531 => x"74d43880",
+1532 => x"cfec0852",
+1533 => x"84dc1255",
+1534 => x"74802ead",
+1535 => x"38881508",
+1536 => x"841608ff",
+1537 => x"05545480",
+1538 => x"73249838",
+1539 => x"8c142270",
+1540 => x"902b5358",
+1541 => x"71ad3880",
+1542 => x"dc14ff14",
+1543 => x"54547280",
+1544 => x"25ea3874",
+1545 => x"085574d5",
+1546 => x"3875800c",
+1547 => x"893d0d04",
+1548 => x"7351762d",
+1549 => x"75800807",
+1550 => x"80dc15ff",
+1551 => x"15555556",
+1552 => x"ffa23973",
+1553 => x"51762d75",
+1554 => x"80080780",
+1555 => x"dc15ff15",
+1556 => x"555556ca",
+1557 => x"39ea3d0d",
+1558 => x"688c1122",
+1559 => x"700a100a",
+1560 => x"81065758",
+1561 => x"567480e4",
+1562 => x"388e1622",
+1563 => x"70902b70",
+1564 => x"902c5155",
+1565 => x"58807424",
+1566 => x"b138983d",
+1567 => x"c4055373",
+1568 => x"5280cfec",
+1569 => x"08519481",
+1570 => x"3f800b80",
+1571 => x"08249738",
+1572 => x"7983e080",
+1573 => x"06547380",
+1574 => x"c0802e81",
+1575 => x"8f387382",
+1576 => x"80802e81",
+1577 => x"91388c16",
+1578 => x"22577690",
+1579 => x"80075473",
+1580 => x"8c172388",
+1581 => x"805280cf",
+1582 => x"ec085181",
+1583 => x"9b3f8008",
+1584 => x"9d388c16",
+1585 => x"22820755",
+1586 => x"748c1723",
+1587 => x"80c31670",
+1588 => x"770c9017",
+1589 => x"0c810b94",
+1590 => x"170c983d",
+1591 => x"0d0480cf",
+1592 => x"ec08a8f6",
+1593 => x"0bbc120c",
+1594 => x"588c1622",
+1595 => x"81800754",
+1596 => x"738c1723",
+1597 => x"8008760c",
+1598 => x"80089017",
+1599 => x"0c88800b",
+1600 => x"94170c74",
+1601 => x"802ed338",
+1602 => x"8e162270",
+1603 => x"902b7090",
+1604 => x"2c535654",
+1605 => x"9afb3f80",
+1606 => x"08802eff",
+1607 => x"bd388c16",
+1608 => x"22810757",
+1609 => x"768c1723",
+1610 => x"983d0d04",
+1611 => x"810b8c17",
+1612 => x"225855fe",
+1613 => x"f539a816",
+1614 => x"0880c3ad",
+1615 => x"2e098106",
+1616 => x"fee4388c",
+1617 => x"16228880",
+1618 => x"0754738c",
+1619 => x"17238880",
+1620 => x"0b80cc17",
+1621 => x"0cfedc39",
+1622 => x"f43d0d7e",
+1623 => x"608b1170",
+1624 => x"f8065b55",
+1625 => x"555d7296",
+1626 => x"26833890",
+1627 => x"58807824",
+1628 => x"74792607",
+1629 => x"55805474",
+1630 => x"742e0981",
+1631 => x"0680ca38",
+1632 => x"7c518ea8",
+1633 => x"3f7783f7",
+1634 => x"2680c538",
+1635 => x"77832a70",
+1636 => x"10101080",
+1637 => x"d7a8058c",
+1638 => x"11085858",
+1639 => x"5475772e",
+1640 => x"81f03884",
+1641 => x"1608fc06",
+1642 => x"8c170888",
+1643 => x"1808718c",
+1644 => x"120c8812",
+1645 => x"0c5b7605",
+1646 => x"84110881",
+1647 => x"0784120c",
+1648 => x"537c518d",
+1649 => x"e83f8816",
+1650 => x"5473800c",
+1651 => x"8e3d0d04",
+1652 => x"77892a78",
+1653 => x"832a5854",
+1654 => x"73802ebf",
+1655 => x"3877862a",
+1656 => x"b8055784",
+1657 => x"7427b438",
+1658 => x"80db1457",
+1659 => x"947427ab",
+1660 => x"38778c2a",
+1661 => x"80ee0557",
+1662 => x"80d47427",
+1663 => x"9e38778f",
+1664 => x"2a80f705",
+1665 => x"5782d474",
+1666 => x"27913877",
+1667 => x"922a80fc",
+1668 => x"05578ad4",
+1669 => x"74278438",
+1670 => x"80fe5776",
+1671 => x"10101080",
+1672 => x"d7a8058c",
+1673 => x"11085653",
+1674 => x"74732ea3",
+1675 => x"38841508",
+1676 => x"fc067079",
+1677 => x"31555673",
+1678 => x"8f2488e4",
+1679 => x"38738025",
+1680 => x"88e6388c",
+1681 => x"15085574",
+1682 => x"732e0981",
+1683 => x"06df3881",
+1684 => x"175980d7",
+1685 => x"b8085675",
+1686 => x"80d7b02e",
+1687 => x"82cc3884",
+1688 => x"1608fc06",
+1689 => x"70793155",
+1690 => x"55738f24",
+1691 => x"bb3880d7",
+1692 => x"b00b80d7",
+1693 => x"bc0c80d7",
+1694 => x"b00b80d7",
+1695 => x"b80c8074",
+1696 => x"2480db38",
+1697 => x"74168411",
+1698 => x"08810784",
+1699 => x"120c53fe",
+1700 => x"b0398816",
+1701 => x"8c110857",
+1702 => x"5975792e",
+1703 => x"098106fe",
+1704 => x"82388214",
+1705 => x"59ffab39",
+1706 => x"77167881",
+1707 => x"0784180c",
+1708 => x"7080d7bc",
+1709 => x"0c7080d7",
+1710 => x"b80c80d7",
+1711 => x"b00b8c12",
+1712 => x"0c8c1108",
+1713 => x"88120c74",
+1714 => x"81078412",
+1715 => x"0c740574",
+1716 => x"710c5b7c",
+1717 => x"518bd63f",
+1718 => x"881654fd",
+1719 => x"ec3983ff",
+1720 => x"75278391",
+1721 => x"3874892a",
+1722 => x"75832a54",
+1723 => x"5473802e",
+1724 => x"bf387486",
+1725 => x"2ab80553",
+1726 => x"847427b4",
+1727 => x"3880db14",
+1728 => x"53947427",
+1729 => x"ab38748c",
+1730 => x"2a80ee05",
+1731 => x"5380d474",
+1732 => x"279e3874",
+1733 => x"8f2a80f7",
+1734 => x"055382d4",
+1735 => x"74279138",
+1736 => x"74922a80",
+1737 => x"fc05538a",
+1738 => x"d4742784",
+1739 => x"3880fe53",
+1740 => x"72101010",
+1741 => x"80d7a805",
+1742 => x"88110855",
+1743 => x"5773772e",
+1744 => x"868b3884",
+1745 => x"1408fc06",
+1746 => x"5b747b27",
+1747 => x"8d388814",
+1748 => x"08547377",
+1749 => x"2e098106",
+1750 => x"ea388c14",
+1751 => x"0880d7a8",
+1752 => x"0b840508",
+1753 => x"718c190c",
+1754 => x"7588190c",
+1755 => x"7788130c",
+1756 => x"5c57758c",
+1757 => x"150c7853",
+1758 => x"80792483",
+1759 => x"98387282",
+1760 => x"2c81712b",
+1761 => x"5656747b",
+1762 => x"2680ca38",
+1763 => x"7a750657",
+1764 => x"7682a338",
+1765 => x"78fc0684",
+1766 => x"05597410",
+1767 => x"707c0655",
+1768 => x"55738292",
+1769 => x"38841959",
+1770 => x"f13980d7",
+1771 => x"a80b8405",
+1772 => x"0879545b",
+1773 => x"788025c6",
+1774 => x"3882da39",
+1775 => x"74097b06",
+1776 => x"7080d7a8",
+1777 => x"0b84050c",
+1778 => x"5b741055",
+1779 => x"747b2685",
+1780 => x"387485bc",
+1781 => x"3880d7a8",
+1782 => x"0b880508",
+1783 => x"70841208",
+1784 => x"fc06707b",
+1785 => x"317b7226",
+1786 => x"8f722507",
+1787 => x"5d575c5c",
+1788 => x"5578802e",
+1789 => x"80d93879",
+1790 => x"1580d7a0",
+1791 => x"08199011",
+1792 => x"59545680",
+1793 => x"d79c08ff",
+1794 => x"2e8838a0",
+1795 => x"8f13e080",
+1796 => x"06577652",
+1797 => x"7c518996",
+1798 => x"3f800854",
+1799 => x"8008ff2e",
+1800 => x"90388008",
+1801 => x"762782a7",
+1802 => x"387480d7",
+1803 => x"a82e829f",
+1804 => x"3880d7a8",
+1805 => x"0b880508",
+1806 => x"55841508",
+1807 => x"fc067079",
+1808 => x"31797226",
+1809 => x"8f722507",
+1810 => x"5d555a7a",
+1811 => x"83f23877",
+1812 => x"81078416",
+1813 => x"0c771570",
+1814 => x"80d7a80b",
+1815 => x"88050c74",
+1816 => x"81078412",
+1817 => x"0c567c51",
+1818 => x"88c33f88",
+1819 => x"15547380",
+1820 => x"0c8e3d0d",
+1821 => x"0474832a",
+1822 => x"70545480",
+1823 => x"7424819b",
+1824 => x"3872822c",
+1825 => x"81712b80",
+1826 => x"d7ac0807",
+1827 => x"7080d7a8",
+1828 => x"0b84050c",
+1829 => x"75101010",
+1830 => x"80d7a805",
+1831 => x"88110871",
+1832 => x"8c1b0c70",
+1833 => x"881b0c79",
+1834 => x"88130c57",
+1835 => x"555c5575",
+1836 => x"8c150cfd",
+1837 => x"c1397879",
+1838 => x"10101080",
+1839 => x"d7a80570",
+1840 => x"565b5c8c",
+1841 => x"14085675",
+1842 => x"742ea338",
+1843 => x"841608fc",
+1844 => x"06707931",
+1845 => x"5853768f",
+1846 => x"2483f138",
+1847 => x"76802584",
+1848 => x"af388c16",
+1849 => x"08567574",
+1850 => x"2e098106",
+1851 => x"df388814",
+1852 => x"811a7083",
+1853 => x"06555a54",
+1854 => x"72c9387b",
+1855 => x"83065675",
+1856 => x"802efdb8",
+1857 => x"38ff1cf8",
+1858 => x"1b5b5c88",
+1859 => x"1a087a2e",
+1860 => x"ea38fdb5",
+1861 => x"39831953",
+1862 => x"fce43983",
+1863 => x"1470822c",
+1864 => x"81712b80",
+1865 => x"d7ac0807",
+1866 => x"7080d7a8",
+1867 => x"0b84050c",
+1868 => x"76101010",
+1869 => x"80d7a805",
+1870 => x"88110871",
+1871 => x"8c1c0c70",
+1872 => x"881c0c7a",
+1873 => x"88130c58",
+1874 => x"535d5653",
+1875 => x"fee13980",
+1876 => x"d6ec0817",
+1877 => x"59800876",
+1878 => x"2e818b38",
+1879 => x"80d79c08",
+1880 => x"ff2e848e",
+1881 => x"38737631",
+1882 => x"1980d6ec",
+1883 => x"0c738706",
+1884 => x"70565372",
+1885 => x"802e8838",
+1886 => x"88733170",
+1887 => x"15555576",
+1888 => x"149fff06",
+1889 => x"a0807131",
+1890 => x"1670547e",
+1891 => x"53515386",
+1892 => x"9d3f8008",
+1893 => x"568008ff",
+1894 => x"2e819e38",
+1895 => x"80d6ec08",
+1896 => x"137080d6",
+1897 => x"ec0c7475",
+1898 => x"80d7a80b",
+1899 => x"88050c77",
+1900 => x"76311581",
+1901 => x"07555659",
+1902 => x"7a80d7a8",
+1903 => x"2e83c038",
+1904 => x"798f2682",
+1905 => x"ef38810b",
+1906 => x"84150c84",
+1907 => x"1508fc06",
+1908 => x"70793179",
+1909 => x"72268f72",
+1910 => x"25075d55",
+1911 => x"5a7a802e",
+1912 => x"fced3880",
+1913 => x"db398008",
+1914 => x"9fff0655",
+1915 => x"74feed38",
+1916 => x"7880d6ec",
+1917 => x"0c80d7a8",
+1918 => x"0b880508",
+1919 => x"7a188107",
+1920 => x"84120c55",
+1921 => x"80d79808",
+1922 => x"79278638",
+1923 => x"7880d798",
+1924 => x"0c80d794",
+1925 => x"087927fc",
+1926 => x"a0387880",
+1927 => x"d7940c84",
+1928 => x"1508fc06",
+1929 => x"70793179",
+1930 => x"72268f72",
+1931 => x"25075d55",
+1932 => x"5a7a802e",
+1933 => x"fc993888",
+1934 => x"39807457",
+1935 => x"53fedd39",
+1936 => x"7c5184e9",
+1937 => x"3f800b80",
+1938 => x"0c8e3d0d",
+1939 => x"04807324",
+1940 => x"a5387282",
+1941 => x"2c81712b",
+1942 => x"80d7ac08",
+1943 => x"077080d7",
+1944 => x"a80b8405",
+1945 => x"0c5c5a76",
+1946 => x"8c170c73",
+1947 => x"88170c75",
+1948 => x"88180cf9",
+1949 => x"fd398313",
+1950 => x"70822c81",
+1951 => x"712b80d7",
+1952 => x"ac080770",
+1953 => x"80d7a80b",
+1954 => x"84050c5d",
+1955 => x"5b53d839",
+1956 => x"7a75065c",
+1957 => x"7bfc9f38",
+1958 => x"84197510",
+1959 => x"5659f139",
+1960 => x"ff178105",
+1961 => x"59f7ab39",
+1962 => x"8c150888",
+1963 => x"1608718c",
+1964 => x"120c8812",
+1965 => x"0c597515",
+1966 => x"84110881",
+1967 => x"0784120c",
+1968 => x"587c5183",
+1969 => x"e83f8815",
+1970 => x"54fba339",
+1971 => x"77167881",
+1972 => x"0784180c",
+1973 => x"8c170888",
+1974 => x"1808718c",
+1975 => x"120c8812",
+1976 => x"0c5c7080",
+1977 => x"d7bc0c70",
+1978 => x"80d7b80c",
+1979 => x"80d7b00b",
+1980 => x"8c120c8c",
+1981 => x"11088812",
+1982 => x"0c778107",
+1983 => x"84120c77",
+1984 => x"0577710c",
+1985 => x"557c5183",
+1986 => x"a43f8816",
+1987 => x"54f5ba39",
+1988 => x"72168411",
+1989 => x"08810784",
+1990 => x"120c588c",
+1991 => x"16088817",
+1992 => x"08718c12",
+1993 => x"0c88120c",
+1994 => x"577c5183",
+1995 => x"803f8816",
+1996 => x"54f59639",
+1997 => x"7284150c",
+1998 => x"f41af806",
+1999 => x"70841d08",
+2000 => x"81060784",
+2001 => x"1d0c701c",
+2002 => x"5556850b",
+2003 => x"84150c85",
+2004 => x"0b88150c",
+2005 => x"8f7627fd",
+2006 => x"ab38881b",
+2007 => x"527c51eb",
+2008 => x"e83f80d7",
+2009 => x"a80b8805",
+2010 => x"0880d6ec",
+2011 => x"085a55fd",
+2012 => x"93397880",
+2013 => x"d6ec0c73",
+2014 => x"80d79c0c",
+2015 => x"fbef3972",
+2016 => x"84150cfc",
+2017 => x"ff39fb3d",
+2018 => x"0d77707a",
+2019 => x"7c585553",
+2020 => x"568f7527",
+2021 => x"80e63872",
+2022 => x"76078306",
+2023 => x"517080dc",
+2024 => x"38757352",
+2025 => x"54707084",
+2026 => x"05520874",
+2027 => x"70840556",
+2028 => x"0c737170",
+2029 => x"84055308",
+2030 => x"71708405",
+2031 => x"530c7170",
+2032 => x"84055308",
+2033 => x"71708405",
+2034 => x"530c7170",
+2035 => x"84055308",
+2036 => x"71708405",
+2037 => x"530cf016",
+2038 => x"5654748f",
+2039 => x"26c73883",
+2040 => x"75279538",
+2041 => x"70708405",
+2042 => x"52087470",
+2043 => x"8405560c",
+2044 => x"fc155574",
+2045 => x"8326ed38",
+2046 => x"73715452",
+2047 => x"ff155170",
+2048 => x"ff2e9838",
+2049 => x"72708105",
+2050 => x"54337270",
+2051 => x"81055434",
+2052 => x"ff115170",
+2053 => x"ff2e0981",
+2054 => x"06ea3875",
+2055 => x"800c873d",
+2056 => x"0d04fb3d",
+2057 => x"0d777a71",
+2058 => x"028c05a3",
+2059 => x"05335854",
+2060 => x"54568373",
+2061 => x"2780d438",
+2062 => x"75830651",
+2063 => x"7080cc38",
+2064 => x"74882b75",
+2065 => x"07707190",
+2066 => x"2b075551",
+2067 => x"8f7327a7",
+2068 => x"38737270",
+2069 => x"8405540c",
+2070 => x"71747170",
+2071 => x"8405530c",
+2072 => x"74717084",
+2073 => x"05530c74",
+2074 => x"71708405",
+2075 => x"530cf014",
+2076 => x"5452728f",
+2077 => x"26db3883",
+2078 => x"73279038",
+2079 => x"73727084",
+2080 => x"05540cfc",
+2081 => x"13537283",
+2082 => x"26f238ff",
+2083 => x"135170ff",
+2084 => x"2e933874",
+2085 => x"72708105",
+2086 => x"5434ff11",
+2087 => x"5170ff2e",
+2088 => x"098106ef",
+2089 => x"3875800c",
+2090 => x"873d0d04",
+2091 => x"04047070",
+2092 => x"7070800b",
+2093 => x"80dfe40c",
+2094 => x"765184f3",
+2095 => x"3f800853",
+2096 => x"8008ff2e",
+2097 => x"89387280",
+2098 => x"0c505050",
+2099 => x"500480df",
+2100 => x"e4085473",
+2101 => x"802eef38",
+2102 => x"7574710c",
+2103 => x"5272800c",
+2104 => x"50505050",
+2105 => x"04f93d0d",
+2106 => x"797c557b",
+2107 => x"548e1122",
+2108 => x"70902b70",
+2109 => x"902c5557",
+2110 => x"80cfec08",
+2111 => x"53585683",
+2112 => x"f63f8008",
+2113 => x"57800b80",
+2114 => x"08249338",
+2115 => x"80d01608",
+2116 => x"80080580",
+2117 => x"d0170c76",
+2118 => x"800c893d",
+2119 => x"0d048c16",
+2120 => x"2283dfff",
+2121 => x"0655748c",
+2122 => x"17237680",
+2123 => x"0c893d0d",
+2124 => x"04fa3d0d",
+2125 => x"788c1122",
+2126 => x"70882a70",
+2127 => x"81065157",
+2128 => x"585674a9",
+2129 => x"388c1622",
+2130 => x"83dfff06",
+2131 => x"55748c17",
+2132 => x"237a5479",
+2133 => x"538e1622",
+2134 => x"70902b70",
+2135 => x"902c5456",
+2136 => x"80cfec08",
+2137 => x"525681b2",
+2138 => x"3f883d0d",
+2139 => x"04825480",
+2140 => x"538e1622",
+2141 => x"70902b70",
+2142 => x"902c5456",
+2143 => x"80cfec08",
+2144 => x"525782bb",
+2145 => x"3f8c1622",
+2146 => x"83dfff06",
+2147 => x"55748c17",
+2148 => x"237a5479",
+2149 => x"538e1622",
+2150 => x"70902b70",
+2151 => x"902c5456",
+2152 => x"80cfec08",
+2153 => x"525680f2",
+2154 => x"3f883d0d",
+2155 => x"04f93d0d",
+2156 => x"797c557b",
+2157 => x"548e1122",
+2158 => x"70902b70",
+2159 => x"902c5557",
+2160 => x"80cfec08",
+2161 => x"53585681",
+2162 => x"f63f8008",
+2163 => x"578008ff",
+2164 => x"2e99388c",
+2165 => x"1622a080",
+2166 => x"0755748c",
+2167 => x"17238008",
+2168 => x"80d0170c",
+2169 => x"76800c89",
+2170 => x"3d0d048c",
+2171 => x"162283df",
+2172 => x"ff065574",
+2173 => x"8c172376",
+2174 => x"800c893d",
+2175 => x"0d047070",
+2176 => x"70748e11",
+2177 => x"2270902b",
+2178 => x"70902c55",
+2179 => x"51515380",
+2180 => x"cfec0851",
+2181 => x"bd3f5050",
+2182 => x"5004fb3d",
+2183 => x"0d800b80",
+2184 => x"dfe40c7a",
+2185 => x"53795278",
+2186 => x"5182fc3f",
+2187 => x"80085580",
+2188 => x"08ff2e88",
+2189 => x"3874800c",
+2190 => x"873d0d04",
+2191 => x"80dfe408",
+2192 => x"5675802e",
+2193 => x"f0387776",
+2194 => x"710c5474",
+2195 => x"800c873d",
+2196 => x"0d047070",
+2197 => x"7070800b",
+2198 => x"80dfe40c",
+2199 => x"765184c9",
+2200 => x"3f800853",
+2201 => x"8008ff2e",
+2202 => x"89387280",
+2203 => x"0c505050",
+2204 => x"500480df",
+2205 => x"e4085473",
+2206 => x"802eef38",
+2207 => x"7574710c",
+2208 => x"5272800c",
+2209 => x"50505050",
+2210 => x"04fc3d0d",
+2211 => x"800b80df",
+2212 => x"e40c7852",
+2213 => x"775187b0",
+2214 => x"3f800854",
+2215 => x"8008ff2e",
+2216 => x"88387380",
+2217 => x"0c863d0d",
+2218 => x"0480dfe4",
+2219 => x"08557480",
+2220 => x"2ef03876",
+2221 => x"75710c53",
+2222 => x"73800c86",
+2223 => x"3d0d04fb",
+2224 => x"3d0d800b",
+2225 => x"80dfe40c",
+2226 => x"7a537952",
+2227 => x"7851848b",
+2228 => x"3f800855",
+2229 => x"8008ff2e",
+2230 => x"88387480",
+2231 => x"0c873d0d",
+2232 => x"0480dfe4",
+2233 => x"08567580",
+2234 => x"2ef03877",
+2235 => x"76710c54",
+2236 => x"74800c87",
+2237 => x"3d0d04fb",
+2238 => x"3d0d800b",
+2239 => x"80dfe40c",
+2240 => x"7a537952",
+2241 => x"78518293",
+2242 => x"3f800855",
+2243 => x"8008ff2e",
+2244 => x"88387480",
+2245 => x"0c873d0d",
+2246 => x"0480dfe4",
+2247 => x"08567580",
+2248 => x"2ef03877",
+2249 => x"76710c54",
+2250 => x"74800c87",
+2251 => x"3d0d0470",
+2252 => x"707080df",
+2253 => x"d8088938",
+2254 => x"80dfe80b",
+2255 => x"80dfd80c",
+2256 => x"80dfd808",
+2257 => x"75115252",
+2258 => x"ff537087",
+2259 => x"fb808026",
+2260 => x"88387080",
+2261 => x"dfd80c71",
+2262 => x"5372800c",
+2263 => x"50505004",
+2264 => x"fd3d0d80",
+2265 => x"0b80cfe0",
+2266 => x"08545472",
+2267 => x"812e9b38",
+2268 => x"7380dfdc",
+2269 => x"0cc2af3f",
+2270 => x"c1863f80",
+2271 => x"dfb05281",
+2272 => x"51c3ff3f",
+2273 => x"80085186",
+2274 => x"bf3f7280",
+2275 => x"dfdc0cc2",
+2276 => x"953fc0ec",
+2277 => x"3f80dfb0",
+2278 => x"528151c3",
+2279 => x"e53f8008",
+2280 => x"5186a53f",
+2281 => x"00ff39f5",
+2282 => x"3d0d7e60",
+2283 => x"80dfdc08",
+2284 => x"705b585b",
+2285 => x"5b7580c2",
+2286 => x"38777a25",
+2287 => x"a138771b",
+2288 => x"70337081",
+2289 => x"ff065858",
+2290 => x"59758a2e",
+2291 => x"98387681",
+2292 => x"ff0651c1",
+2293 => x"b03f8118",
+2294 => x"58797824",
+2295 => x"e1387980",
+2296 => x"0c8d3d0d",
+2297 => x"048d51c1",
+2298 => x"9c3f7833",
+2299 => x"7081ff06",
+2300 => x"5257c191",
+2301 => x"3f811858",
+2302 => x"e0397955",
+2303 => x"7a547d53",
+2304 => x"85528d3d",
+2305 => x"fc0551c0",
+2306 => x"b93f8008",
+2307 => x"5685b23f",
+2308 => x"7b80080c",
+2309 => x"75800c8d",
+2310 => x"3d0d04f6",
+2311 => x"3d0d7d7f",
+2312 => x"80dfdc08",
+2313 => x"705b585a",
+2314 => x"5a7580c1",
+2315 => x"38777925",
+2316 => x"b338c0ac",
+2317 => x"3f800881",
+2318 => x"ff06708d",
+2319 => x"32703070",
+2320 => x"9f2a5151",
+2321 => x"5757768a",
+2322 => x"2e80c438",
+2323 => x"75802ebf",
+2324 => x"38771a56",
+2325 => x"76763476",
+2326 => x"51c0aa3f",
+2327 => x"81185878",
+2328 => x"7824cf38",
+2329 => x"77567580",
+2330 => x"0c8c3d0d",
+2331 => x"04785579",
+2332 => x"547c5384",
+2333 => x"528c3dfc",
+2334 => x"0551ffbf",
+2335 => x"c53f8008",
+2336 => x"5684be3f",
+2337 => x"7a80080c",
+2338 => x"75800c8c",
+2339 => x"3d0d0477",
+2340 => x"1a598a79",
+2341 => x"34811858",
+2342 => x"8d51ffbf",
+2343 => x"e83f8a51",
+2344 => x"ffbfe23f",
+2345 => x"7756ffbe",
+2346 => x"39fb3d0d",
+2347 => x"80dfdc08",
+2348 => x"70565473",
+2349 => x"88387480",
+2350 => x"0c873d0d",
+2351 => x"04775383",
+2352 => x"52873dfc",
+2353 => x"0551ffbe",
+2354 => x"f93f8008",
+2355 => x"5483f23f",
+2356 => x"7580080c",
+2357 => x"73800c87",
+2358 => x"3d0d04fa",
+2359 => x"3d0d80df",
+2360 => x"dc08802e",
+2361 => x"a3387a55",
+2362 => x"79547853",
+2363 => x"8652883d",
+2364 => x"fc0551ff",
+2365 => x"becc3f80",
+2366 => x"085683c5",
+2367 => x"3f768008",
+2368 => x"0c75800c",
+2369 => x"883d0d04",
+2370 => x"83b73f9d",
+2371 => x"0b80080c",
+2372 => x"ff0b800c",
+2373 => x"883d0d04",
+2374 => x"f73d0d7b",
+2375 => x"7d5b59bc",
+2376 => x"53805279",
+2377 => x"51f5fb3f",
+2378 => x"80705657",
+2379 => x"98567419",
+2380 => x"70337078",
+2381 => x"2b790781",
+2382 => x"18f81a5a",
+2383 => x"58595558",
+2384 => x"847524ea",
+2385 => x"38767a23",
+2386 => x"84195880",
+2387 => x"70565798",
+2388 => x"56741870",
+2389 => x"3370782b",
+2390 => x"79078118",
+2391 => x"f81a5a58",
+2392 => x"59515484",
+2393 => x"7524ea38",
+2394 => x"76821b23",
+2395 => x"88195880",
+2396 => x"70565798",
+2397 => x"56741870",
+2398 => x"3370782b",
+2399 => x"79078118",
+2400 => x"f81a5a58",
+2401 => x"59515484",
+2402 => x"7524ea38",
+2403 => x"76841b0c",
+2404 => x"8c195880",
+2405 => x"70565798",
+2406 => x"56741870",
+2407 => x"3370782b",
+2408 => x"79078118",
+2409 => x"f81a5a58",
+2410 => x"59515484",
+2411 => x"7524ea38",
+2412 => x"76881b23",
+2413 => x"90195880",
+2414 => x"70565798",
+2415 => x"56741870",
+2416 => x"3370782b",
+2417 => x"79078118",
+2418 => x"f81a5a58",
+2419 => x"59515484",
+2420 => x"7524ea38",
+2421 => x"768a1b23",
+2422 => x"94195880",
+2423 => x"70565798",
+2424 => x"56741870",
+2425 => x"3370782b",
+2426 => x"79078118",
+2427 => x"f81a5a58",
+2428 => x"59515484",
+2429 => x"7524ea38",
+2430 => x"768c1b23",
+2431 => x"98195880",
+2432 => x"70565798",
+2433 => x"56741870",
+2434 => x"3370782b",
+2435 => x"79078118",
+2436 => x"f81a5a58",
+2437 => x"59515484",
+2438 => x"7524ea38",
+2439 => x"768e1b23",
+2440 => x"9c195880",
+2441 => x"705657b8",
+2442 => x"56741870",
+2443 => x"3370782b",
+2444 => x"79078118",
+2445 => x"f81a5a58",
+2446 => x"595a5488",
+2447 => x"7524ea38",
+2448 => x"76901b0c",
+2449 => x"8b3d0d04",
+2450 => x"e93d0d6a",
+2451 => x"80dfdc08",
+2452 => x"57577593",
+2453 => x"3880c080",
+2454 => x"0b84180c",
+2455 => x"75ac180c",
+2456 => x"75800c99",
+2457 => x"3d0d0489",
+2458 => x"3d70556a",
+2459 => x"54558a52",
+2460 => x"993dffbc",
+2461 => x"0551ffbb",
+2462 => x"c93f8008",
+2463 => x"77537552",
+2464 => x"56fd953f",
+2465 => x"bc3f7780",
+2466 => x"080c7580",
+2467 => x"0c993d0d",
+2468 => x"04fc3d0d",
+2469 => x"815480df",
+2470 => x"dc088838",
+2471 => x"73800c86",
+2472 => x"3d0d0476",
+2473 => x"5397b952",
+2474 => x"863dfc05",
+2475 => x"51ffbb92",
+2476 => x"3f800854",
+2477 => x"8c3f7480",
+2478 => x"080c7380",
+2479 => x"0c863d0d",
+2480 => x"0480cfec",
+2481 => x"08800c04",
+2482 => x"f73d0d7b",
+2483 => x"80cfec08",
+2484 => x"82c81108",
+2485 => x"5a545a77",
+2486 => x"802e80da",
+2487 => x"38818818",
+2488 => x"841908ff",
+2489 => x"0581712b",
+2490 => x"59555980",
+2491 => x"742480ea",
+2492 => x"38807424",
+2493 => x"b5387382",
+2494 => x"2b781188",
+2495 => x"05565681",
+2496 => x"80190877",
+2497 => x"06537280",
+2498 => x"2eb63878",
+2499 => x"16700853",
+2500 => x"53795174",
+2501 => x"0853722d",
+2502 => x"ff14fc17",
+2503 => x"fc177981",
+2504 => x"2c5a5757",
+2505 => x"54738025",
+2506 => x"d6387708",
+2507 => x"5877ffad",
+2508 => x"3880cfec",
+2509 => x"0853bc13",
+2510 => x"08a53879",
+2511 => x"51f8e53f",
+2512 => x"74085372",
+2513 => x"2dff14fc",
+2514 => x"17fc1779",
+2515 => x"812c5a57",
+2516 => x"57547380",
+2517 => x"25ffa838",
+2518 => x"d1398057",
+2519 => x"ff933972",
+2520 => x"51bc1308",
+2521 => x"54732d79",
+2522 => x"51f8b93f",
+2523 => x"707080df",
+2524 => x"b80bfc05",
+2525 => x"70085252",
+2526 => x"70ff2e91",
+2527 => x"38702dfc",
+2528 => x"12700852",
+2529 => x"5270ff2e",
+2530 => x"098106f1",
+2531 => x"38505004",
+2532 => x"04ffbaff",
+2533 => x"3f040000",
+2534 => x"00000040",
+2535 => x"476f7420",
+2536 => x"696e7465",
+2537 => x"72727570",
+2538 => x"740a0000",
+2539 => x"4e6f2069",
+2540 => x"6e746572",
+2541 => x"72757074",
+2542 => x"0a000000",
+2543 => x"43000000",
+2544 => x"64756d6d",
+2545 => x"792e6578",
+2546 => x"65000000",
+2547 => x"00ffffff",
+2548 => x"ff00ffff",
+2549 => x"ffff00ff",
+2550 => x"ffffff00",
+2551 => x"00000000",
+2552 => x"00000000",
+2553 => x"00000000",
+2554 => x"00002fc0",
+2555 => x"000027f0",
+2556 => x"00000000",
+2557 => x"00002a58",
+2558 => x"00002ab4",
+2559 => x"00002b10",
+2560 => x"00000000",
+2561 => x"00000000",
+2562 => x"00000000",
+2563 => x"00000000",
+2564 => x"00000000",
+2565 => x"00000000",
+2566 => x"00000000",
+2567 => x"00000000",
+2568 => x"00000000",
+2569 => x"000027bc",
+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"00000000",
+2597 => x"00000000",
+2598 => x"00000001",
+2599 => x"330eabcd",
+2600 => x"1234e66d",
+2601 => x"deec0005",
+2602 => x"000b0000",
+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"00000000",
+2790 => x"00000000",
+2791 => x"ffffffff",
+2792 => x"00000000",
+2793 => x"00020000",
+2794 => x"00000000",
+2795 => x"00000000",
+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"00002fa0",
+3051 => x"00002fa0",
+3052 => x"000027c0",
+3053 => x"ffffffff",
+3054 => x"00000000",
+3055 => x"ffffffff",
+3056 => x"00000000",
diff --git a/zpu/hdl/zy2000/timer.vhd b/zpu/hdl/zy2000/timer.vhd new file mode 100644 index 0000000..735d55c --- /dev/null +++ b/zpu/hdl/zy2000/timer.vhd @@ -0,0 +1,137 @@ +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; + sample : in std_logic; + reset : in std_logic; + counter : out std_logic_vector(63 downto 0)); +end timer; + + +architecture behave of timer is + +signal c : std_logic_vector(1 to 7); + +signal cnt : std_logic_vector(63 downto 0); +signal cnt_smp : std_logic_vector(63 downto 0); + +begin + + counter <= cnt_smp; + + process(clk, areset) -- Carry generation + begin + if areset = '1' then + c <= "0000000"; + elsif (clk'event and clk = '1') then + if reset = '1' then + c <= "0000000"; + else + if cnt(7 downto 0) = "11111110" then + c(1) <= '1'; + else + c(1) <= '0'; + end if; + if cnt(15 downto 8) = "11111111" then + c(2) <= '1'; + else + c(2) <= '0'; + end if; + if cnt(23 downto 16) = "11111111" and c(2) = '1' then + c(3) <= '1'; + else + c(3) <= '0'; + end if; + if cnt(31 downto 24) = "11111111" and c(3) = '1' then + c(4) <= '1'; + else + c(4) <= '0'; + end if; + if cnt(39 downto 32) = "11111111" and c(4) = '1' then + c(5) <= '1'; + else + c(5) <= '0'; + end if; + if cnt(47 downto 40) = "11111111" and c(5) = '1' then + c(6) <= '1'; + else + c(6) <= '0'; + end if; + if cnt(55 downto 48) = "11111111" and c(6) = '1' then + c(7) <= '1'; + else + c(7) <= '0'; + end if; + end if; + end if; + end process; + + process(clk, areset) + begin + if areset = '1' then + cnt <= (others=>'0'); + elsif (clk'event and clk = '1') then + if reset = '1' then + cnt <= (others=>'0'); + else + cnt(7 downto 0) <= cnt(7 downto 0) + '1'; + if c(1) = '1' then + cnt(15 downto 8) <= cnt(15 downto 8) + '1'; + else + cnt(15 downto 8) <= cnt(15 downto 8); + end if; + if c(2) = '1' and c(1) = '1' then + cnt(23 downto 16) <= cnt(23 downto 16) + '1'; + else + cnt(23 downto 16) <= cnt(23 downto 16); + end if; + if c(3) = '1' and c(1) = '1' then + cnt(31 downto 24) <= cnt(31 downto 24) + '1'; + else + cnt(31 downto 24) <= cnt(31 downto 24); + end if; + if c(4) = '1' and c(1) = '1' then + cnt(39 downto 32) <= cnt(39 downto 32) + '1'; + else + cnt(39 downto 32) <= cnt(39 downto 32); + end if; + if c(5) = '1' and c(1) = '1' then + cnt(47 downto 40) <= cnt(47 downto 40) + '1'; + else + cnt(47 downto 40) <= cnt(47 downto 40); + end if; + if c(6) = '1' and c(1) = '1' then + cnt(55 downto 48) <= cnt(55 downto 48) + '1'; + else + cnt(55 downto 48) <= cnt(55 downto 48); + end if; + if c(7) = '1' and c(1) = '1' then + cnt(63 downto 56) <= cnt(63 downto 56) + '1'; + else + cnt(63 downto 56) <= cnt(63 downto 56); + end if; + end if; + end if; + end process; + + process(clk, areset) + begin + if areset = '1' then + cnt_smp <= (others=>'0'); + elsif (clk'event and clk = '1') then + if reset = '1' then + cnt_smp <= (others=>'0'); + elsif sample = '1' then + cnt_smp <= cnt; + else + cnt_smp <= cnt_smp; + end if; + end if; + end process; + +end behave; + diff --git a/zpu/hdl/zy2000/trace.vhd b/zpu/hdl/zy2000/trace.vhd new file mode 100644 index 0000000..ec6be57 --- /dev/null +++ b/zpu/hdl/zy2000/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/zy2000/txt_util.vhd b/zpu/hdl/zy2000/txt_util.vhd new file mode 100644 index 0000000..40d39b9 --- /dev/null +++ b/zpu/hdl/zy2000/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/zy2000/zpu_config.vhd b/zpu/hdl/zy2000/zpu_config.vhd new file mode 100644 index 0000000..c0df294 --- /dev/null +++ b/zpu/hdl/zy2000/zpu_config.vhd @@ -0,0 +1,20 @@ +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 := '0'; + -- Clock frequency in MHz. + constant ZPU_Frequency : std_logic_vector(7 downto 0) := x"40"; + -- This is the msb address bit. bytes=2^(maxAddrBitIncIO+1) + constant maxAddrBitIncIO : integer := 27; + + -- start byte address of stack. + -- point to top of RAM - 2*words + constant spStart : std_logic_vector(maxAddrBitIncIO downto 0) := x"1fffff8"; + +end zpu_config; diff --git a/zpu/hdl/zy2000/zpu_config_fast.vhd b/zpu/hdl/zy2000/zpu_config_fast.vhd new file mode 100644 index 0000000..c0df294 --- /dev/null +++ b/zpu/hdl/zy2000/zpu_config_fast.vhd @@ -0,0 +1,20 @@ +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 := '0'; + -- Clock frequency in MHz. + constant ZPU_Frequency : std_logic_vector(7 downto 0) := x"40"; + -- This is the msb address bit. bytes=2^(maxAddrBitIncIO+1) + constant maxAddrBitIncIO : integer := 27; + + -- start byte address of stack. + -- point to top of RAM - 2*words + constant spStart : std_logic_vector(maxAddrBitIncIO downto 0) := x"1fffff8"; + +end zpu_config; diff --git a/zpu/hdl/zy2000/zpu_core.vhd b/zpu/hdl/zy2000/zpu_core.vhd new file mode 100644 index 0000000..2450f14 --- /dev/null +++ b/zpu/hdl/zy2000/zpu_core.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<stackB) then + binaryOpResult(0) <= '1'; + end if; + state <= State_BinaryOpResult; + when State_Ulessthanorequal => + 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)<signed(stackB)) then + binaryOpResult(0) <= '1'; + end if; + state <= State_BinaryOpResult; + when State_Lessthanorequal => + 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; diff --git a/zpu/hdl/zy2000/zpupkg.vhd b/zpu/hdl/zy2000/zpupkg.vhd new file mode 100644 index 0000000..a7e6cf1 --- /dev/null +++ b/zpu/hdl/zy2000/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(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 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; + 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 component; + + + + component timer is + port( + clk : in std_logic; + areset : in std_logic; + sample : in std_logic; + reset : in std_logic; + counter : out std_logic_vector(63 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; |