12. Traps

In RISC-V terminology, a trap is the mechanism that handles interrupts and exceptions. The difference between an exception and an interrupt is that an exception is synchronous: For example, it can be by an invalid instruction executed by the core. On the other hand, an interrupt is caused by an external event. For example, an interrupt can be activated by a timer.

Upon a trap, the following things happen:

  • The reason for the trap is stored in the mcause CSR
  • The address of the instruction that was interrupted by the trap is stored in the mepc CSR
  • If there is extra information for the specific trap, it is stored in mtval, else it is set to 0
  • The MPIE field of mstatus is set to MIE
  • The MIE field of mstatus is set to 0
  • The pc is set to mtvec (in direct mode or for exceptions) or to mtvec + 4 * cause if the mode is vectored and the cause is an interrupt

The privileged part of the RISC-V docs also define some instructions. One of them is MRET, which return from a trap handler and does the following:

  • It resets mstatus.MIE to mstatus.MPIE
  • It sets mstatus.MPIE to 1
  • It sets pc to mepc

The other instruction that is defined in the privileged part of the ISA is the WFI (wait for interrupt). It should halt the processor until an interrupt occurs. However, this instruction is only meant to save power; a legal implemention is a NOP.

Let's do the easy work first and implement WFI as a NOP for now.

src/core/decode_write.vhd CHANGED
@@ -343,6 +343,8 @@ begin
343
  else
344
  v_decode_output.is_invalid := '1';
345
  end if;
 
 
346
  elsif opcode = "1111111" and funct3 = "000" then
347
  -- LED (custom instruction): set the LEDs to the 8 least significant bits of rs1
348
  v_decode_output.operation := OP_LED;
 
343
  else
344
  v_decode_output.is_invalid := '1';
345
  end if;
346
+ elsif funct7 = "0001000" and rs2 = "00101" and opcode = "1110011" then
347
+ -- WFI (implemented as NOP)
348
  elsif opcode = "1111111" and funct3 = "000" then
349
  -- LED (custom instruction): set the LEDs to the 8 least significant bits of rs1
350
  v_decode_output.operation := OP_LED;

Now let's implement MRET, which is also quite easy.

src/core/decode_write.vhd CHANGED
@@ -300,6 +300,9 @@ begin
300
  -- ECALL
301
  elsif i_imm = "000000000001" and rs1 = "00000" and funct3 = "000" and rd = "00000" and opcode = "1110011" then
302
  -- EBREAK
 
 
 
303
  elsif opcode = "1110011" then
304
  v_decode_output.operand2 := "00000000000000000000" & i_imm; -- store CSR register in operand 2
305
  v_decode_output.destination_reg := rd;
 
300
  -- ECALL
301
  elsif i_imm = "000000000001" and rs1 = "00000" and funct3 = "000" and rd = "00000" and opcode = "1110011" then
302
  -- EBREAK
303
+ elsif funct7 = "0011000" and rs2 = "00010" and rs1 = "00000" and rd = "00000" and opcode = "1110011" then
304
+ -- MRET
305
+ v_decode_output.operation := OP_MRET;
306
  elsif opcode = "1110011" then
307
  v_decode_output.operand2 := "00000000000000000000" & i_imm; -- store CSR register in operand 2
308
  v_decode_output.destination_reg := rd;
src/core/execute.vhd CHANGED
@@ -310,6 +310,11 @@ begin
310
  else
311
  -- TODO: exception; trying to write to non-existent or read-only CSR
312
  end if;
 
 
 
 
 
313
  elsif input.operation = OP_LED then
314
  led <= input.operand1(7 downto 0);
315
  else
 
310
  else
311
  -- TODO: exception; trying to write to non-existent or read-only CSR
312
  end if;
313
+ elsif input.operation = OP_MRET then
314
+ mstatus_mie <= mstatus_mpie;
315
+ mstatus_mpie <= '1';
316
+ v_jump := '1';
317
+ v_jump_address := mepc & "00";
318
  elsif input.operation = OP_LED then
319
  led <= input.operand1(7 downto 0);
320
  else
src/core/types.vhd CHANGED
@@ -32,6 +32,7 @@ package core_types is
32
  OP_CSRRW,
33
  OP_CSRRS,
34
  OP_CSRRC,
 
35
  OP_LED
36
  );
37
 
 
32
  OP_CSRRW,
33
  OP_CSRRS,
34
  OP_CSRRC,
35
+ OP_MRET,
36
  OP_LED
37
  );
38
 

Now we'll consider exceptions. The following exceptions are defined: 0. Instruction address misaligned: generated on a taken branch or unconditional jump when the target address is not aligned

  1. Instruction access fault: generated when the instruction fetch tries to fetch from a memory region that is not accessible
  2. Illegal instruction: when decoding an instruction fails
  3. Breakpoint: TODO
  4. Load address misaligned
  5. Load access fault
  6. Store address misaligned
  7. Store access fault ...
  8. Environment call from M-mode

There are a lot more exceptions defined, but they are not applicable. Regarding interrupts, there are 3 that are potentionally interesting:

  • Machine system interrupt
  • Machine timer interrupt
  • Machine external interrupt

The machine system interrupt is caused by other cores. Since our implementation only has one core, it is not applicable. The machine external interrupt is caused by peripherals, but at this point we don't have them, so we can ignore this interrupt as well. So only the machine timer interrupt is left, and I will postpone the implementation of this to a later lesson.

First, I'll set up the basic structure of how traps work.

.gitignore CHANGED
@@ -8,3 +8,6 @@ cpu.ip_user_files/
8
  cpu.sim/
9
  cpu.runs/
10
  cpu.srcs/
 
 
 
 
8
  cpu.sim/
9
  cpu.runs/
10
  cpu.srcs/
11
+ toolchain/resources/output.elf
12
+ toolchain/resources/output.bin
13
+
toolchain/asm/csrtest.s ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .section .text
2
+ .globl _start
3
+
4
+ _start:
5
+ /* Clear mscratch (swap with zero) */
6
+ li t0, 0
7
+ csrrw t1, mscratch, t0 /* t1 = old mstatus, mstatus = 0 */
8
+
9
+ /* Set some bits using register variant */
10
+ li t0, 0x8 /* example: set MIE bit */
11
+ csrrs t2, mscratch, t0 /* set bits, t2 = old mstatus */
12
+
13
+ /* Clear some bits using register variant */
14
+ li t0, 0x8
15
+ csrrc t3, mscratch, t0 /* clear MIE bit, t3 = old mstatus */
16
+
17
+ /* Set bits using immediate variant */
18
+ csrsi mscratch, 0x8 /* set MIE bit */
19
+
20
+ /* Clear bits using immediate variant */
21
+ csrci mscratch, 0x8 /* clear MIE bit */
22
+
23
+ /* Read CSR using register variant (no side effects) */
24
+ csrrs t4, mscratch, x0 /* t4 = mstatus */
25
+
26
+ /* Read CSR using immediate variant (no side effects) */
27
+ csrrsi t5, mscratch, 0 /* t5 = mstatus */
28
+
29
+ /* Swap CSR and register again */
30
+ li t0, 0x1800 /* example: set MPP=11 */
31
+ csrrw t6, mscratch, t0 /* t6 = old mstatus */
32
+
33
+ hang:
34
+ j hang
35
+
toolchain/asm/test.s ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ .section .text
2
+ .global _start
3
+
4
+ _start:
5
+ csrr x1, mvendorid
6
+
toolchain/assemble ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/env bash
2
+
3
+ # exit if any command fails
4
+ set -e
5
+
6
+ # make a temporary directory
7
+ tmp=$(mktemp -d)
8
+
9
+ # assemble
10
+ riscv-elf-as "$1" -o "$tmp/output.o"
11
+
12
+ # link
13
+ riscv-elf-ld "$tmp/output.o" -T resources/linker.ld -o resources/output.elf
14
+
15
+ # extract binary
16
+ riscv-elf-objcopy -O binary resources/output.elf resources/output.bin
toolchain/{main.c → c/main.c} RENAMED
@@ -1,5 +1,5 @@
1
  #include <stdint.h>
2
- #include <stdio.h>
3
 
4
  #define LENGTH 4484
5
  int16_t input[LENGTH] = { 17, 28, 8, -25, 33, -48, 2, 42, 39, -10, 29, -26, 24, 44, -37, -1, -4, 2, -43, -6, -44, 29, 47, -48, 13, -18, 18, 30, -44, 35, 18, 2, -38, 50, -28, 18, 21, 32, -8, 18, -33, 24, 46, -6, -9, 39, 7, 48, 41, -26, -52, 1, -1, -40, -60, 18, -18, -87, 73, -86, -45, 69, -24, -31, -69, -12, -79, 84, 83, 24, 70, -75, -81, -38, 24, 26, -26, -48, -52, -10, -90, 4, 54, -88, 31, -3, 91, -67, 65, -61, -32, 63, 83, -50, -90, 75, -26, -23, -26, -61, -89, -65, 250, 60, 652, -47, 88, 50, -61, -113, 36, 823, 26, -849, -46, 27, 58, 41, 68, -48, -42, 15, -22, 49, 78, 322, 28, -28, -95, -33, 56, -28, 37, 63, 13, -8, -57, 52, -64, -36, -8, -28, -313, 49, -87, -13, 24, 911, -35, -117, 60, -65, 34, -3, 52, 54, 85, -371, -67, -8, 668, -22, 96, 51, 8, -55, 69, 31, 83, -49, -734, 165, 35, 85, -45, 60, 332, 32, 36, -31, -22, 233, -702, 80, -23, 865, -6, -94, 57, 18, 225, 955, 34, -47, 55, -97, -9, 4, 63, 43, -1, 18, 7, 75, -224, -76, 10, 79, -898, -91, -47, -3, -74, 19, 50, -45, 46, 54, 36, 28, 8, -27, 55, 41, -41, 540, 60, 58, 76, -3, -831, -45, -78, -77, -2, -50, 24, -572, 3, -94, -509, -53, -35, 559, 21, -292, 10, 16, -98, 812, -40, 10, 74, 16, 255, 92, 670, -73, 56, -59, -41, -938, -62, -84, -5, 89, -23, 423, 62, -162, -57, -698, -80, 47, -413, -899, -69, 92, 322, -145, 59, 41, 39, -39, 9, -34, -28, -58, 559, -59, -89, -19, -13, 94, 34, 77, -2, -91, -86, -94, -67, -63, 430, -5, 5, 70, 30, -67, 67, -30, -39, -131, -21, 19, 98, -96, 36, 610, 54, -72, -90, -49, 11, -77, -93, -30, -5, 79, 67, 59, -29, 63, 66, -54, -546, -101, -28, 4, -6, 96, -1, 323, 435, -22, -74, -80, 54, 658, 88, -46, 21, -23, -89, -84, 72, 3, 60, 40, 48, -49, 1, -5, -195, 46, -20, 686, 88, -80, 50, 81, -31, -67, 15, -398, -269, -1, -722, -978, 53, -153, 39, 61, 7, 517, -24, -19, 19, 45, 135, 70, 950, 67, -267, -672, 41, 896, -65, -33, 35, 883, -72, -27, -86, -81, 81, -87, 13, 88, -48, 52, -47, -52, 117, -653, -36, -88, 12, -71, 25, 64, 751, -7, -33, 598, -98, 54, 30, 766, 15, -60, 695, -1, -56, 39, 16, -98, 101, 99, -277, -564, 41, -21, -79, -23, 777, 246, 37, 563, 40, 784, -80, 56, -69, -31, 3, 23, -331, -95, -563, 63, -5, -84, -48, 16, 84, -63, 78, -17, -61, -30, 3, 301, 26, 128, -988, -13, -14, 87, 15, 85, -61, 48, -587, 65, 72, 63, -754, 733, -79, 584, -81, 597, -94, -40, -66, -94, 94, 15, -15, 24, 67, 807, 82, 86, -66, 20, -41, 95, 26, 70, 430, -3, 3, -47, 31, -890, 513, -7, 61, 39, -75, 886, -97, 86, 60, 140, -87, 49, 46, 23, -4, 10, -276, -61, 24, 76, -59, -42, -530, -8, 56, -696, -83, -38, -290, 57, -39, 99, 71, 55, -381, 28, -75, -26, 22, 77, -4, -94, 68, -68, -246, 11, -65, -54, -46, -58, 56, -98, 94, -94, -429, 29, 867, 133, 41, 17, -58, -9, 920, -12, 1, -28, -72, 769, 31, 18, 82, 33, 518, -375, -78, -98, 92, -16, -44, 31, -51, 65, 40, -17, 52, -879, 3, 14, 382, 28, 38, 23, 539, 869, -46, -23, -87, -3, 790, 878, 563, -41, -67, 50, 20, 55, 42, -47, -44, -78, -675, 44, -578, -22, -821, 21, 28, 18, -682, 42, 52, 8, -66, -986, -80, -67, 6, -38, -80, -38, -85, -32, -17, 95, -3, 25, -19, 19, -56, 178, -22, 55, -355, -966, 810, -8, -388, -56, 485, 51, -28, -50, -79, -64, -32, -52, -323, 61, -322, -579, -37, 477, 508, 46, 972, -607, -919, -85, -521, 25, 49, 32, 23, 477, 71, 92, -54, -468, 59, -5, 294, -274, 20, 65, 287, 13, -856, -71, -344, 71, 77, -56, 90, 333, 56, -79, 4, 286, 89, -78, 20, 58, -313, 822, -5, 5, 92, 82, 17, 41, -38, 50, -71, -882, -75, 75, 298, -43, 45, 5, 21, 74, -55, 58, -36, 633, 57, 43, 15, -8, 93, 376, -781, 50, 55, -68, 56, -17, -71, 52, 435, 73, 69, -70, 97, 850, 44, -50, -8, 62, 18, -272, 15, 85, -14, 214, 46, -46, -51, 751, 37, 363, -18, -82, 288, -68, -94, -3, 2, 82, -21, 32, 82, -37, 37, -33, 81, 52, 51, 74, 75, -51, -44, 52, 43, 547, 753, 185, 78, 83, 54, -22, 25, -71, -32, -47, 60, 46, 80, -81, -35, 894, 14, 69, -54, 74, -24, -6, 5, -565, -30, -93, -7, 28, -85, -39, -63, 59, -30, -345, -674, 75, -354, -908, 622, 10, 4, -48, 55, -2, 99, -3, -1, -31, -54, 60, 3, 84, 40, 228, 92, -95, -177, -50, -71, 60, -38, 27, 75, 47, -126, 12, 287, 71, 95, -39, -9, 441, -92, -158, 36, 5, 49, 51, 877, -503, 241, -38, 74, 975, 49, -17, 19, -53, 53, 26, -41, -85, 22, 260, -7, -19, -70, -48, 270, 9, 71, -88, -87, 87, 2, 14, 84, -67, -33, -38, 75, -37, 13, -13, 43, -1, 51, 7, 63, -29, 15, -563, 58, -19, 50, -275, -10, 71, 42, -83, -20, -62, 88, -26, -99, -1, 93, -95, -36, -62, 29, -61, 43, 89, -10, 65, 781, 64, 84, 16, 76, 19, 98, -730, -63, 921, 83, -4, -16, -84, 77, -57, 91, 46, 89, -546, 17, 55, 51, -31, -92, -63, 47, 16, 20, 23, -43, 18, 20, -35, 97, 662, 28, 26, -16, -18, 88, 4, 29, -3, -53, 132, 21, -36, -59, 95, 15, -70, -80, 35, 66, -66, 63, 27, -358, 68, -23, 423, 62, -25, 63, -212, 12, 50, -27, 16, 23, 36, -98, -13, 85, 52, -302, 78, 398, -198, 96, -50, -46, 82, -129, -80, -13, 5, -73, -89, -58, -335, 25, 88, -164, -15, 61, 95, 69, 1, 30, 272, -221, -79, 165, 28, 43, 6, -96, 82, 82, -582, 18, 82, -637, -70, -93, -471, -633, -41, 97, -252, 59, 63, -38, 16, -41, 61, 80, 337, 94, 69, -58, 36, 15, 83, 924, 62, -48, -14, -40, -43, 46, 67, -33, -20, 23, 28, -737, 9, 77, -77, 53, 34, -87, -70, 70, 67, -49, 979, -87, -94, 45, -701, -18, 58, 59, -40, 81, 76, 243, 77, 540, -5, 869, 12, 901, 87, 40, -640, 3, -522, -134, -47, 54, -54, 884, -19, -265, 14, 143, 43, -629, 19, 86, 78, -47, -7, -59, 55, 11, -402, -29, 265, -90, -62, 11, 99, 101, -852, -48, 92, 81, -73, -41, 1, 55, -64, -20, -31, -169, -192, 65, 96, 532, 90, 15, 33, 236, 16, 94, 63, 2, 19, 949, 51, 20, 6, -71, 45, 840, -2, 92, 670, -26, 426, 18, -55, 63, -802, 89, 91, -65, 60, 1, -95, -97, -8, 15, -19, 58, 78, -32, -89, 27, -48, 68, -91, -673, 207, -2, -999, -2, -998, -66, 66, 22, 30, -35, 83, -93, -150, 5, -39, -23, -88, -28, 87, -471, 68, -468, -83, -17, -85, -39, 71, -947, 83, -33, 36, 89, 25, 897, -57, -40, 67, 733, -19, -756, 81, 849, 53, -89, -50, 35, -226, 618, -68, -82, -946, -742, -4, -58, -98, 13, 70, -81, 85, 15, -10, -41, 43, 968, 194, 46, 578, 22, -58, -763, 99, 53, -10, -21, 14, 386, 26, -25, -1, -270, -89, -20, 79, 66, -85, 236, -1, 84, -45, 68, -23, 54, -54, -9, 63, -54, 574, 6, 190, -70, 186, 81, -67, -202, 121, 781, -94, 94, -727, -280, -80, 87, 97, 82, -66, 87, 461, -761, -37, -648, 43, -120, 60, 95, 83, -43, 48, -6, 25, -9, -73, -738, -80, 17, -17, -16, 2, -11, -61, 945, -59, -402, 72, 519, -90, -37, 859, -26, 92, 13, -59, -270, 713, -84, 65, 35, -54, 54, 81, -201, -236, 89, -33, 18, 82, -13, 321, -8, -192, -8, 75, 25, 56, 44, -5, 880, 404, 17, 4, -49, -51, 10, -10, 72, 50, -3, -139, -80, 974, 59, 698, 41, 90, -891, -53, -18, 85, -79, 13, -619, -546, 71, 806, 69, -20, -80, -86, 5, 81, -64, 64, 12, 88, -331, 17, -3, 33, 279, 21, -659, -7, -25, 75, 732, 75, 493, 9, -639, 114, -84, 82, 518, -135, -82, 90, 482, -724, 7, -31, -46, -12, 92, 33, -40, 189, 77, -746, 34, 412, -9, 954, -945, -3, -40, 43, 20, 80, -81, 6, 16, -432, -9, -6, -94, -88, -43, -69, 91, 930, 29, -625, -98, 73, -86, 20, 557, 9, -55, 40, 15, -42, 42, 63, 68, 57, 58, 26, -93, -60, 5, 6, -35, -68, -27, -87, 54, -81, 14, -130, -15, 650, 95, -22, -278, -79, -321, 64, 36, 96, -46, 5, -59, 62, 42, 82, 13, 305, -62, -38, 15, 85, 15, -172, -129, -4, 90, -62, -38, -83, -32, -85, 89, -89, 963, -13, 85, 65, -98, -43, 72, -759, 52, 3, -975, 59, -11, -79, -221, 90, 29, 81, -19, 658, 71, 28, -38, -45, 45, -197, 7, -10, 96, 889, -85, 717, 59, -76, 797, 3, -24, 24, -24, 305, 65, -46, -623, -77, 429, -29, 13, -131, -82, 14, -85, 266, -53, -82, 56, -7, 91, 533, 67, -45, -75, -92, 103, -5, 14, 19, 90, -409, 938, -38, 58, 72, 57, 73, 48, -55, 21, 34, -52, 860, -8, -908, -64, -84, -52, 11, 77, -9, 21, -97, 97, -38, 38, -981, -56, 85, -6, -42, -231, 29, -88, 89, 1, 376, 24, 27, -27, 86, 14, 64, 96, 1, 39, 31, -9, 65, -91, -95, -901, 644, 56, 9, 8, -17, 21, 9, 79, 91, -289, 62, 71, 21, 35, -719, 22, 597, -11, 86, 88, 73, 32, 32, -84, 82, 2, 3, 9, -12, -32, 22, -90, -53, 53, -17, -83, 42, 30, -72, 38, -936, -502, 621, -25, 65, 935, 904, 90, -90, -53, -47, -19, 39, -41, 557, -62, 26, 316, -23, -32, 39, 215, -15, -45, 23, 33, -47, -78, -16, 20, -944, 54, -19, 19, -25, -23, -52, 347, 53, 96, 603, -99, -20, 999, 87, -66, -2, 23, 76, 3, -4, 69, -565, 41, 745, -852, 66, -2, 503, 99, -990, 90, 310, -5, 94, -36, 6, -605, 61, -26, 607, -93, 2, 985, -915, 15, -699, -1, 83, -87, -296, 49, 51, 69, -363, -734, 28, 8, -35, -556, 12, -29, 635, -36, 1, 46, -98, 52, -27, -643, 70, 739, 24, -4, -959, 470, 30, -46, -54, -44, 79, -535, 67, 676, -43, 98, -90, -8, 44, -52, -92, -799, -91, -610, -2, 2, 52, 45, 123, -20, 66, 67, 67, 90, 946, 91, 39, 69, 65, -51, 61, 46, -56, 88, -88, -31, -5, -76, 212, -439, -61, 99, 1, -49, -39, -54, -53, 70, -664, 569, 61, -9, 68, 81, 19, 98, -62, -50, 51, -10, -43, 485, -51, 82, -246, -554, -85, 14, 53, 47, -1, 72, -66, 66, 95, 87, -82, -68, -9, 70, -375, 37, 45, 51, 649, 90, -23, -31, -636, 80, 20, -93, -207, -32, 32, -81, -22, 3, -88, -22, 79, 31, -108, 8, 340, -81, 141, 73, 27, 309, 91, -88, -112, 79, 83, 307, -469, 715, 85, 63, -25, 9, -76, -789, 56, -38, -270, -7, -23, -97, -60, -43, 31, -31, 72, 967, -39, 98, -23, 57, -74, 98, 97, 747, 12, 56, -68, 61, -61, -49, 530, 66, -49, -98, 36, 64, 31, 18, 851, -77, 77, 212, -24, -88, 11, 8, -839, -18, -78, -84, 22, -22, 56, -56, 47, -47, 72, -72, -84, -70, -46, 21, 18, -277, -60, -2, -23, 29, -28, -78, -19, 22, -70, 71, 996, 86, 14, 26, 74, 21, 79, -57, -13, -50, -44, 64, 15, -115, -32, -27, -139, -902, -62, -81, 56, 4, 77, 60, -81, -73, 94, -94, -37, 229, 69, -25, -53, -83, 574, 857, -31, -127, -573, 508, 92, -746, -654, -51, 12, 75, -36, 768, 310, 30, 85, -46, -847, -80, -62, 42, 311, 259, 793, -46, 81, 33, 747, 422, -75, 75, 6, -6, 41, -949, -92, -101, 68, -75, 28, 465, -54, 66, -97, -55, 50, 623, -88, -936, -94, -35, -570, 5, -61, 67, 62, -36, 56, -88, 43, 11, -81, -47, -20, -506, 16, -16, 727, -55, -34, -840, -72, -19, -7, 96, -96, -23, 23, 54, -94, -94, -28, -48, -5, -8, 11, -88, -20, 620, 18, -34, 16, 104, 96, 38, 54, 408, -7, -24, -20, 91, -72, 883, -51, 63, -174, -89, 8, -8, 446, 68, -81, -46, -401, -77, -9, -86, -26, -792, 77, 163, 821, -848, 91, -642, 60, 29, -83, 71, -506, -53, -76, 93, -142, -951, -6, -91, 15, 77, -95, 72, -776, -96, -62, -55, 850, -72, -64, 3, -2, 2, 93, 39, -68, 36, 8, -57, -33, 82, -477, 77, 437, 63, -94, 59, 2, -40, -34, -65, -25, 97, 73, 27, -1, -14, -84, 724, 75, -91, 91, 363, -63, 297, -29, -79, 511, 366, 34, 34, 27, 60, 49, -370, 274, 50, -124, -5, 5, -5, 5, 91, -46, -57, -88, -338, -30, -6, 66, 77, 31, -43, -57, 18, 79, 5, -34, -68, 550, 199, 51, 495, -95, 74, -51, -23, 31, -83, -99, 723, -49, -71, -28, -124, 76, -72, 96, -18, 580, -99, -33, 70, 65, -39, 74, -91, -470, 96, 65, -20, -80, -19, -81, -36, 29, -93, 90, 44, 29, 209, 28, 3, -1, -45, -107, -33, 96, 14, 8, 265, -43, -33, -24, 98, 2, 537, -411, 77, -93, 290, -332, 20, 12, -84, 884, -39, -706, 8, 16, -79, 23, -23, -728, -72, 5, -5, -97, 51, -34, -20, 57, -62, 305, -51, 5, -496, -14, 40, 654, -38, 71, -89, 18, 183, 17, -66, 4, 62, -75, 15, 60, 21, 79, 32, -73, -7, 52, -313, -8, -6, -853, -7, -17, 72, -72, -14, -50, 51, -91, 91, 18, -12, -93, -64, -36, -23, 36, -13, -26, -62, -5, 293, -943, -50, 17, 79, 95, -21, 86, -251, 8, -82, 362, 3, 60, -63, 48, 1, 11, -60, -52, -229, -83, 43, -79, -20, -5, -75, 927, -27, -82, 266, -14, 30, 63, -34, 171, -32, -68, 93, 7, -12, 177, -86, 21, -31, -69, -318, -85, -71, 70, 72, -34, -97, 80, -117, 9, 91, 99, -99, -64, 74, -51, -60, 79, -42, 818, -54, 614, -695, -19, -979, -35, -486, -51, 81, -28, -92, 19, -29, 13, -82, 12, 99, -95, 53, 293, -95, 38, -53, -302, 19, 10, -57, 47, 25, 74, 53, -65, 13, -41, -68, -67, -70, -25, -50, -90, -89, 763, 863, -48, -67, 82, -58, -98, -537, -95, 37, 45, 716, -26, -98, -279, -66, -59, -75, -24, 424, 30, 15, -45, -70, -77, -353, 25, 35, -56, 96, -49, -751, 21, 47, -43, -67, -58, 72, 31, -86, 54, 29, 868, -68, 25, 90, 42, 54, 89, -27, -73, 33, 412, 62, -87, -47, 22, -53, -66, 96, -73, 1, -99, 20, 784, 795, 13, -613, -708, -61, 69, 17, 83, -54, -546, 799, 801, -84, -31, -78, -22, 89, -43, 74, 59, -64, -911, 53, 11, 347, 11, 14, 68, 7, -31, -69, -501, -98, 99, -85, -388, 40, 8, 389, 5, 65, 871, -798, -61, 54, 26, -26, 47, -33, 95, -83, 804, 26, 948, -9, 5, 75, -12, -18, -45, -18, 9, 9, 266, 34, 55, 83, -94, 41, -185, -47, -74, -79, 91, -7, -84, -36, -964, 46, -546, -9, 9, 89, 40, -1, -53, -475, 70, -8, -62, 40, 60, 60, 91, 49, -53, 34, 19, -10, 56, -50, -34, 538, -92, -908, 12, -12, -90, 88, 3, 2, 56, -65, 6, -65, 317, -152, -7, 7, -60, 56, 25, -992, 47, -13, 48, -52, -656, 15, -753, 57, 701, 82, -45, 467, 19, 54, -24, 32, -37, -2, 31, 61, 91, -521, 58, -242, 89, 90, -46, 920, 77, -77, 5, 82, -87, -404, -16, -44, -48, 112, 416, -216, -7, -6, 522, 91, -25, -437, -38, -892, -74, -634, -31, 36, -63, 18, 40, -4, 504, 40, -40, 3, 777, -455, 75, 87, -4, -83, 58, -747, -69, 58, 19, 81, -10, -90, -66, -50, -2, -82, 7, -7, -366, 866, -37, 27, -90, 2, -202, 79, 906, -16, 31, -52, 64, -84, 36, 710, -40, -19, 22, -611, 57, -53, 64, 14, -8, 6, 76, 589, 33, 48, 748, -11, 96, -85, 12, -46, -94, 70, 55, 273, 67, 881, 87, -4, -1, -97, -90, 87, 4, 96, -62, 62, -78, 28, 1, -67, 216, -19, 19, 39, 75, -714, 97, 3, -99, -96, -8, -499, 47, -57, 41, -73, 33, 14, 1, -45, 63, -86, -47, 20, 91, 98, 102, 87, -22, 36, 86, 24, -211, -217, 44, 30, 42, -98, 199, -34, 34, 50, 90, 28, -32, 64, -57, 27, 105, 47, -22, -35, 301, -49, -17, -22, -778, -606, 6, -25, 708, 36, -79, 4, -31, -13, -92, 392, 22, 78, 63, 81, -2, 8, 49, -808, -37, 67, -507, 86, -20, -75, -260, 26, -79, -39, 47, -65, 806, 33, -57, -17, 31, 96, -15, 54, 56, 608, 997, 42, 31, 31, 69, -84, -516, -81, 11, -33, 3, 802, -642, 40, -74, -49, -91, -886, 89, 11, -18, -82, -26, -252, -40, -98, -79, -60, -845, -1, 1, -25, 24, 807, -55, 11, -66, -73, 72, 5, 513, -68, 485, 70, -81, -19, -86, -72, 46, -88, -59, -41, 373, -73, -49, -751, 430, 70, 74, 726, -5, -95, 67, -666, 699, -67, 70, -82, 19, 360, 77, -899, -68, 66, -376, -78, 78, 97, -97, -58, -73, 86, -55, -9, -91, 78, 5, -38, 15, 639, 1, 51, 66, -84, 59, 8, -334, -55, 72, -82, -93, 92, 330, -94, 64, -487, 87, 65, -566, -670, 24, 10, 42, 95, 38, 366, -4, 29, -29, 91, -94, 48, -660, -40, 86, 769, 904, -4, -76, 78, -45, -73, -14, -70, -58, -69, -873, -234, -38, -90, 46, -98, -93, 37, -18, 88, -44, -553, 97, -469, -57, -58, -42, 37, 370, -331, 299, -49, -85, 85, 180, 918, 302, -128, -72, -11, -26, -63, -25, 25, 5, -47, -14, 56, 69, 525, -994, 533, -633, -1, -53, -46, -10, 98, -53, 78, -13, 66, -66, 49, -49, -9, -66, 18, 857, 72, -72, 189, 11, -57, 29, 81, -51, -702, 1, 45, -62, -29, -9, 54, 64, -330, -749, -85, -8, -81, -309, -388, 82, -88, 92, -58, 98, 43, -49, -934, 894, -94, -47, -34, -819, -741, -859, 6, 92, -73, 75, 21, -965, -90, 34, 252, -588, -64, -738, -96, -66, 66, -28, -19, -65, -86, 32, 21, 457, 22, -356, 378, 635, 31, -67, 79, 96, 604, -65, 43, 47, -65, -60, 975, -75, -30, -70, -53, -73, 91, -50, -927, -51, -41, 49, -89, 41, 3, -680, 829, 335, -84, 21, 553, -774, 90, -90, -90, 11, 49, -781, -82, 93, 267, 82, 51, 22, 78, 97, 813, 990, 34, -34, 82, 77, 69, -63, -114, -85, 7, -73, 27, -11, 5, 79, 88, 12, 95, -815, -80, -952, -748, -375, -87, 62, -79, -21, -49, 49, 48, -48, 2, -2, -328, 6, 9, -98, 29, -18, 35, 66, -77, 76, 58, -58, 540, 12, 48, 687, 65, -937, -13, -2, -378, -98, 57, -985, -23, -9, -64, -90, -10, 28, 172, -97, 450, 3, 8, 6, 88, 92, 60, 66, 29, 82, 59, 44, 48, -99, 60, -369, 88, 22, -66, -63, 89, 40, -24, 58, 26, -234, 83, 688, -37, 87, -987, 55, -55, 35, 11, 78, -12, -95, 25, 58, 49, 77, 74, -266, 66, 99, 11, -777, 58, 54, -7, 62, 77, 59, -84, 48, 41, -41, 68, -67, -29, 74, 54, -83, -90, -92, -87, 52, -32, 934, 57, -70, 21, 46, 44, 52, -52, -147, 94, 69, -19, -47, -89, -95, -57, 16, 60, 92, 72, 16, 45, 80, -90, 245, -69, 124, 58, -11, 71, -78, -40, 94, -83, -11, -43, -39, -50, 30, -54, -7, 932, -769, 34, 266, -80, -276, -2, 758, 22, -622, -701, 50, 63, -12, 58, 543, 99, -6, 6, 808, -587, 102, -95, -55, -34, 570, -9, -16, 2, -20, -63, 30, 67, 7, -69, 64, 98, -3, 3, 13, 64, -241, -4, 68, -62, -6, 68, 49, -84, 35, -23, 23, -85, -15, 52, 548, -35, 48, -52, 571, -432, -59, -41, -11, 1, 10, -79, -60, 39, -49, -950, 14, 94, -51, 42, -678, -22, -60, 82, 78, -41, 885, 74, -61, -23, 39, -44, -43, 14, -9, -91, -69, -31, 45, -80, 77, -72, -76, 78, -72, 87, 113, -40, -761, -9, 91, 82, 78, 41, 424, 24, -39, 9, -15, 15, -84, -16, 290, 899, -37, 54, 79, -25, -63, -61, -36, 55, -65, -94, 51, 53, -20, -71, 91, -16, -84, -798, 16, -11, -7, -95, 533, 81, -33, -22, -64, -5, -605, 10, 67, -36, -31, -13, 92, -421, 91, -19, 501, 43, 72, 6, 48, 31, 69, -13, 48, 89, 76, -18, -33, 75, -24, 32, -32, 11, 821, -32, 81, 19, 304, 296, -2, -98, -50, -11, -51, 972, -32, 87, -15, -601, 646, 80, 75, 680, -80, 11, 89, 13, -85, 42, 97, 896, 27, 71, -62, 180, 61, 360, 552, 65, 171, 12, -68, 68, 30, -830, 90, 10, -81, -56, -163, -28, 45, 11, 32, -16, -44, -161, -6, -90, 57, 59, -59, -54, -897, -43, 72, 584, 38, -64, 39, 23, 902, 74, 40, -93, -821, 46, -46, -62, -52, -86, 56, 44, 71, 336, 93, 151, 64, -61, -554, 50, -37, 11, -624, 68, -68, -42, 8, -54, -992, 28, 638, -585, 11, -16, -30, -66, -27, 27, 92, -93, 43, 458, 12, 88, -85, -26, -2, -87, 138, 62, 682, -82, 8, -47, 15, -58, 7, 67, 27, 33, 48, -194, -485, 293, -44, 30, 4, -4, 53, 38, 10, 96, -14, -83, -10, -31, 23, -10, 38, 2, 88, 52, 21, 27, 270, 42, -92, 73, 823, -590, 47, -79, 7, -79, -26, 626, -790, -73, -67, -50, -442, -38, 15, -51, 74, 51, -46, -97, -8, -40, 340, -61, 61, -35, -65, -511, 40, 58, 62, -19, 70, -798, -27, 748, 68, 864, 45, -367, 67, -25, 62, 63, -13, -75, -352, -62, 85, -83, 81, 39, -41, -79, -2, 2, -265, -83, -52, -84, -16, -36, 435, 27, -70, -50, 37, -14, 71, -6, -94, 302, -333, 31, -46, 46, -34, 134, -89, 95, 94, 2, -2, 8, 92, 365, 35, -225, -75, -12, -47, 559, 65, 51, -16, 76, 24, -47, 97, 50, -28, -889, -2, -19, -62, -63, -456, -81, -89, 486, 31, 724, 48, -74, 31, 69, -26, 301, 31, 652, 42, -261, 35, 50, 79, 171, -7, 7, -386, 86, 26, 395, -48, -55, -18, 555, 23, 59, -37, -25, -64, -51, 3, 837, -29, 229, 91, -406, 70, 99, -978, -76, -19, 89, 78, 47, 22, -17, 47, 53, 13, 53, 87, 4, -257, 586, -63, -463, -60, 5, 95, 66, 34, -195, 47, 6, 2, -39, -21, 56, 44, -83, -61, -770, 547, 5, -53, -66, 881, 85, 615, 19, -13, -179, -47, 320, -53, -41, 94, -95, 78, -819, 36, -36, 969, -9, -44, -89, -36, -7, -25, 8, 69, -41, -94, 769, 866, 907, 39, 3, -17, -86, 50, -50, -51, -718, 23, 50, 50, 230, 70, -94, -60, -914, 68, -36, 56, -20, 37, -37, 382, -11, 895, -66, -51, 87, -39, -9, -88, 27, -52, -24, 672, 5, -96, 74, -89, 993, -12, 28, 39, -465, 12, 31, 22, -65, -32, -865, -89, -77, -37, 9, -9, -37, -378, -85, -14, -86, -45, 45, 40, -40, -40, 507, -88, -59, -85, 65, -99, 929, -30, -75, 647, -72, 301, 40, -24, -81, 54, 10, -93, -2, 23, 92, 657, -73, 16, -79, -341, -941, 45, -4, -14, -19, 75, -42, 69, -69, -35, 20, -593, -93, -607, 8, 4, 167, 29, 52, -52, 574, -34, 53, 7, 808, 98, -499, 45, 8, -52, 16, -52, -73, 812, -11, 18, 63, -72, -9, 3, -3, 92, 17, -809, 44, 56, -318, -61, -68, -93, -9, 12, 46, 83, 51, 510, 47, 7, -307, 62, 86, -48, -71, -222, -6, -8, -82, -33, 22, -37, 47, -6, 14, 86, 96, 147, -47, -15, 66, -98, 77, 61, 98, -789, 82, -978, -804, 79, -79, 97, 903, -43, 717, 26, 32, -82, -708, -42, -380, 80, 57, 42, 61, -60, -96, -4, 34, -14, -14, -3, -203, 61, -45, -16, 299, 29, -28, 8, -11, -354, -74, -22, -75, 28, -10, -90, 99, -12, 13, -179, 48, -73, -46, -83, 43, -10, 73, 27, 52, -83, -69, -83, -80, -98, -495, -7, -37, 446, -14, 68, -65, 65, -30, 111, 67, -95, 94, 91, -84, 92, -44, -491, -11, -5, 96, 9, 352, -34, 12, 13, -98, -31, 86, -3, 3, 83, -54, 71, 743, -43, 44, -69, 25, -90, 440, -96, -524, 70, -33, 933, -819, 4, -18, 57, 76, -254, -8, -38, -49, -53, -33, -76, -22, -867, -37, -68, 5, -392, -39, -97, -72, -52, -848, -14, -83, -91, 88, -24, 24, 285, 50, -49, 14, 28, 85, 605, 47, -93, 43, -15, 56, 44, 33, 83, 12, -92, -956, 81, -61, -244, 31, 31, 27, 10, -55, -59, -8, 44, -77, 834, 66, 50, -50, 7, 33, -40, -43, -37, 63, 8, -204, 613, 21, 879, 32, 856, 12, 45, -18, -98, 24, -53, -82, -49, 88, -57, 2, 36, -80, 24, -82, 68, -773, 5, -26, -815, -638, 968, -24, 835, -93, -95, 88, 27, -23, 76, 596, 24, 61, -62, 1, -2, -98, -613, 2, -66, 37, -60, -35, -79, -47, -242, 93, 64, 94, -67, 19, -28, 63, -35, -83, -432, -85, 64, 36, -871, -29, 542, -42, -975, -88, 5, -45, -3, 72, -19, -25, 78, -95, -54, 65, 57, 27, -56, -44, 42, 29, 29, 37, -89, 63, 5, -72, 41, 15, -12, 45, 27, 43, 97, -16, 17, -68, 67, 21, 12, -2, 50, 92, 4, 56, 33, 68, 2, -36, -41, -99, -19, 34, -9, -86, 20, 81, 32, 21, -41, -19, -18, 3, -12, -13, 42, 31, 17, -32, -2, -39, 41, -25, -44, -29, -29, 43, 45, 34, -26, 50, -32, -38, 22, 19, -45, 41, 9, 33, -27, 16, -9, -10, -8, -7, -40, 15, -23, -46, -42, 33, -18, -45, -2, -8, 14, -15, -26, 15, -39 };
 
1
  #include <stdint.h>
2
+ // #include <stdio.h>
3
 
4
  #define LENGTH 4484
5
  int16_t input[LENGTH] = { 17, 28, 8, -25, 33, -48, 2, 42, 39, -10, 29, -26, 24, 44, -37, -1, -4, 2, -43, -6, -44, 29, 47, -48, 13, -18, 18, 30, -44, 35, 18, 2, -38, 50, -28, 18, 21, 32, -8, 18, -33, 24, 46, -6, -9, 39, 7, 48, 41, -26, -52, 1, -1, -40, -60, 18, -18, -87, 73, -86, -45, 69, -24, -31, -69, -12, -79, 84, 83, 24, 70, -75, -81, -38, 24, 26, -26, -48, -52, -10, -90, 4, 54, -88, 31, -3, 91, -67, 65, -61, -32, 63, 83, -50, -90, 75, -26, -23, -26, -61, -89, -65, 250, 60, 652, -47, 88, 50, -61, -113, 36, 823, 26, -849, -46, 27, 58, 41, 68, -48, -42, 15, -22, 49, 78, 322, 28, -28, -95, -33, 56, -28, 37, 63, 13, -8, -57, 52, -64, -36, -8, -28, -313, 49, -87, -13, 24, 911, -35, -117, 60, -65, 34, -3, 52, 54, 85, -371, -67, -8, 668, -22, 96, 51, 8, -55, 69, 31, 83, -49, -734, 165, 35, 85, -45, 60, 332, 32, 36, -31, -22, 233, -702, 80, -23, 865, -6, -94, 57, 18, 225, 955, 34, -47, 55, -97, -9, 4, 63, 43, -1, 18, 7, 75, -224, -76, 10, 79, -898, -91, -47, -3, -74, 19, 50, -45, 46, 54, 36, 28, 8, -27, 55, 41, -41, 540, 60, 58, 76, -3, -831, -45, -78, -77, -2, -50, 24, -572, 3, -94, -509, -53, -35, 559, 21, -292, 10, 16, -98, 812, -40, 10, 74, 16, 255, 92, 670, -73, 56, -59, -41, -938, -62, -84, -5, 89, -23, 423, 62, -162, -57, -698, -80, 47, -413, -899, -69, 92, 322, -145, 59, 41, 39, -39, 9, -34, -28, -58, 559, -59, -89, -19, -13, 94, 34, 77, -2, -91, -86, -94, -67, -63, 430, -5, 5, 70, 30, -67, 67, -30, -39, -131, -21, 19, 98, -96, 36, 610, 54, -72, -90, -49, 11, -77, -93, -30, -5, 79, 67, 59, -29, 63, 66, -54, -546, -101, -28, 4, -6, 96, -1, 323, 435, -22, -74, -80, 54, 658, 88, -46, 21, -23, -89, -84, 72, 3, 60, 40, 48, -49, 1, -5, -195, 46, -20, 686, 88, -80, 50, 81, -31, -67, 15, -398, -269, -1, -722, -978, 53, -153, 39, 61, 7, 517, -24, -19, 19, 45, 135, 70, 950, 67, -267, -672, 41, 896, -65, -33, 35, 883, -72, -27, -86, -81, 81, -87, 13, 88, -48, 52, -47, -52, 117, -653, -36, -88, 12, -71, 25, 64, 751, -7, -33, 598, -98, 54, 30, 766, 15, -60, 695, -1, -56, 39, 16, -98, 101, 99, -277, -564, 41, -21, -79, -23, 777, 246, 37, 563, 40, 784, -80, 56, -69, -31, 3, 23, -331, -95, -563, 63, -5, -84, -48, 16, 84, -63, 78, -17, -61, -30, 3, 301, 26, 128, -988, -13, -14, 87, 15, 85, -61, 48, -587, 65, 72, 63, -754, 733, -79, 584, -81, 597, -94, -40, -66, -94, 94, 15, -15, 24, 67, 807, 82, 86, -66, 20, -41, 95, 26, 70, 430, -3, 3, -47, 31, -890, 513, -7, 61, 39, -75, 886, -97, 86, 60, 140, -87, 49, 46, 23, -4, 10, -276, -61, 24, 76, -59, -42, -530, -8, 56, -696, -83, -38, -290, 57, -39, 99, 71, 55, -381, 28, -75, -26, 22, 77, -4, -94, 68, -68, -246, 11, -65, -54, -46, -58, 56, -98, 94, -94, -429, 29, 867, 133, 41, 17, -58, -9, 920, -12, 1, -28, -72, 769, 31, 18, 82, 33, 518, -375, -78, -98, 92, -16, -44, 31, -51, 65, 40, -17, 52, -879, 3, 14, 382, 28, 38, 23, 539, 869, -46, -23, -87, -3, 790, 878, 563, -41, -67, 50, 20, 55, 42, -47, -44, -78, -675, 44, -578, -22, -821, 21, 28, 18, -682, 42, 52, 8, -66, -986, -80, -67, 6, -38, -80, -38, -85, -32, -17, 95, -3, 25, -19, 19, -56, 178, -22, 55, -355, -966, 810, -8, -388, -56, 485, 51, -28, -50, -79, -64, -32, -52, -323, 61, -322, -579, -37, 477, 508, 46, 972, -607, -919, -85, -521, 25, 49, 32, 23, 477, 71, 92, -54, -468, 59, -5, 294, -274, 20, 65, 287, 13, -856, -71, -344, 71, 77, -56, 90, 333, 56, -79, 4, 286, 89, -78, 20, 58, -313, 822, -5, 5, 92, 82, 17, 41, -38, 50, -71, -882, -75, 75, 298, -43, 45, 5, 21, 74, -55, 58, -36, 633, 57, 43, 15, -8, 93, 376, -781, 50, 55, -68, 56, -17, -71, 52, 435, 73, 69, -70, 97, 850, 44, -50, -8, 62, 18, -272, 15, 85, -14, 214, 46, -46, -51, 751, 37, 363, -18, -82, 288, -68, -94, -3, 2, 82, -21, 32, 82, -37, 37, -33, 81, 52, 51, 74, 75, -51, -44, 52, 43, 547, 753, 185, 78, 83, 54, -22, 25, -71, -32, -47, 60, 46, 80, -81, -35, 894, 14, 69, -54, 74, -24, -6, 5, -565, -30, -93, -7, 28, -85, -39, -63, 59, -30, -345, -674, 75, -354, -908, 622, 10, 4, -48, 55, -2, 99, -3, -1, -31, -54, 60, 3, 84, 40, 228, 92, -95, -177, -50, -71, 60, -38, 27, 75, 47, -126, 12, 287, 71, 95, -39, -9, 441, -92, -158, 36, 5, 49, 51, 877, -503, 241, -38, 74, 975, 49, -17, 19, -53, 53, 26, -41, -85, 22, 260, -7, -19, -70, -48, 270, 9, 71, -88, -87, 87, 2, 14, 84, -67, -33, -38, 75, -37, 13, -13, 43, -1, 51, 7, 63, -29, 15, -563, 58, -19, 50, -275, -10, 71, 42, -83, -20, -62, 88, -26, -99, -1, 93, -95, -36, -62, 29, -61, 43, 89, -10, 65, 781, 64, 84, 16, 76, 19, 98, -730, -63, 921, 83, -4, -16, -84, 77, -57, 91, 46, 89, -546, 17, 55, 51, -31, -92, -63, 47, 16, 20, 23, -43, 18, 20, -35, 97, 662, 28, 26, -16, -18, 88, 4, 29, -3, -53, 132, 21, -36, -59, 95, 15, -70, -80, 35, 66, -66, 63, 27, -358, 68, -23, 423, 62, -25, 63, -212, 12, 50, -27, 16, 23, 36, -98, -13, 85, 52, -302, 78, 398, -198, 96, -50, -46, 82, -129, -80, -13, 5, -73, -89, -58, -335, 25, 88, -164, -15, 61, 95, 69, 1, 30, 272, -221, -79, 165, 28, 43, 6, -96, 82, 82, -582, 18, 82, -637, -70, -93, -471, -633, -41, 97, -252, 59, 63, -38, 16, -41, 61, 80, 337, 94, 69, -58, 36, 15, 83, 924, 62, -48, -14, -40, -43, 46, 67, -33, -20, 23, 28, -737, 9, 77, -77, 53, 34, -87, -70, 70, 67, -49, 979, -87, -94, 45, -701, -18, 58, 59, -40, 81, 76, 243, 77, 540, -5, 869, 12, 901, 87, 40, -640, 3, -522, -134, -47, 54, -54, 884, -19, -265, 14, 143, 43, -629, 19, 86, 78, -47, -7, -59, 55, 11, -402, -29, 265, -90, -62, 11, 99, 101, -852, -48, 92, 81, -73, -41, 1, 55, -64, -20, -31, -169, -192, 65, 96, 532, 90, 15, 33, 236, 16, 94, 63, 2, 19, 949, 51, 20, 6, -71, 45, 840, -2, 92, 670, -26, 426, 18, -55, 63, -802, 89, 91, -65, 60, 1, -95, -97, -8, 15, -19, 58, 78, -32, -89, 27, -48, 68, -91, -673, 207, -2, -999, -2, -998, -66, 66, 22, 30, -35, 83, -93, -150, 5, -39, -23, -88, -28, 87, -471, 68, -468, -83, -17, -85, -39, 71, -947, 83, -33, 36, 89, 25, 897, -57, -40, 67, 733, -19, -756, 81, 849, 53, -89, -50, 35, -226, 618, -68, -82, -946, -742, -4, -58, -98, 13, 70, -81, 85, 15, -10, -41, 43, 968, 194, 46, 578, 22, -58, -763, 99, 53, -10, -21, 14, 386, 26, -25, -1, -270, -89, -20, 79, 66, -85, 236, -1, 84, -45, 68, -23, 54, -54, -9, 63, -54, 574, 6, 190, -70, 186, 81, -67, -202, 121, 781, -94, 94, -727, -280, -80, 87, 97, 82, -66, 87, 461, -761, -37, -648, 43, -120, 60, 95, 83, -43, 48, -6, 25, -9, -73, -738, -80, 17, -17, -16, 2, -11, -61, 945, -59, -402, 72, 519, -90, -37, 859, -26, 92, 13, -59, -270, 713, -84, 65, 35, -54, 54, 81, -201, -236, 89, -33, 18, 82, -13, 321, -8, -192, -8, 75, 25, 56, 44, -5, 880, 404, 17, 4, -49, -51, 10, -10, 72, 50, -3, -139, -80, 974, 59, 698, 41, 90, -891, -53, -18, 85, -79, 13, -619, -546, 71, 806, 69, -20, -80, -86, 5, 81, -64, 64, 12, 88, -331, 17, -3, 33, 279, 21, -659, -7, -25, 75, 732, 75, 493, 9, -639, 114, -84, 82, 518, -135, -82, 90, 482, -724, 7, -31, -46, -12, 92, 33, -40, 189, 77, -746, 34, 412, -9, 954, -945, -3, -40, 43, 20, 80, -81, 6, 16, -432, -9, -6, -94, -88, -43, -69, 91, 930, 29, -625, -98, 73, -86, 20, 557, 9, -55, 40, 15, -42, 42, 63, 68, 57, 58, 26, -93, -60, 5, 6, -35, -68, -27, -87, 54, -81, 14, -130, -15, 650, 95, -22, -278, -79, -321, 64, 36, 96, -46, 5, -59, 62, 42, 82, 13, 305, -62, -38, 15, 85, 15, -172, -129, -4, 90, -62, -38, -83, -32, -85, 89, -89, 963, -13, 85, 65, -98, -43, 72, -759, 52, 3, -975, 59, -11, -79, -221, 90, 29, 81, -19, 658, 71, 28, -38, -45, 45, -197, 7, -10, 96, 889, -85, 717, 59, -76, 797, 3, -24, 24, -24, 305, 65, -46, -623, -77, 429, -29, 13, -131, -82, 14, -85, 266, -53, -82, 56, -7, 91, 533, 67, -45, -75, -92, 103, -5, 14, 19, 90, -409, 938, -38, 58, 72, 57, 73, 48, -55, 21, 34, -52, 860, -8, -908, -64, -84, -52, 11, 77, -9, 21, -97, 97, -38, 38, -981, -56, 85, -6, -42, -231, 29, -88, 89, 1, 376, 24, 27, -27, 86, 14, 64, 96, 1, 39, 31, -9, 65, -91, -95, -901, 644, 56, 9, 8, -17, 21, 9, 79, 91, -289, 62, 71, 21, 35, -719, 22, 597, -11, 86, 88, 73, 32, 32, -84, 82, 2, 3, 9, -12, -32, 22, -90, -53, 53, -17, -83, 42, 30, -72, 38, -936, -502, 621, -25, 65, 935, 904, 90, -90, -53, -47, -19, 39, -41, 557, -62, 26, 316, -23, -32, 39, 215, -15, -45, 23, 33, -47, -78, -16, 20, -944, 54, -19, 19, -25, -23, -52, 347, 53, 96, 603, -99, -20, 999, 87, -66, -2, 23, 76, 3, -4, 69, -565, 41, 745, -852, 66, -2, 503, 99, -990, 90, 310, -5, 94, -36, 6, -605, 61, -26, 607, -93, 2, 985, -915, 15, -699, -1, 83, -87, -296, 49, 51, 69, -363, -734, 28, 8, -35, -556, 12, -29, 635, -36, 1, 46, -98, 52, -27, -643, 70, 739, 24, -4, -959, 470, 30, -46, -54, -44, 79, -535, 67, 676, -43, 98, -90, -8, 44, -52, -92, -799, -91, -610, -2, 2, 52, 45, 123, -20, 66, 67, 67, 90, 946, 91, 39, 69, 65, -51, 61, 46, -56, 88, -88, -31, -5, -76, 212, -439, -61, 99, 1, -49, -39, -54, -53, 70, -664, 569, 61, -9, 68, 81, 19, 98, -62, -50, 51, -10, -43, 485, -51, 82, -246, -554, -85, 14, 53, 47, -1, 72, -66, 66, 95, 87, -82, -68, -9, 70, -375, 37, 45, 51, 649, 90, -23, -31, -636, 80, 20, -93, -207, -32, 32, -81, -22, 3, -88, -22, 79, 31, -108, 8, 340, -81, 141, 73, 27, 309, 91, -88, -112, 79, 83, 307, -469, 715, 85, 63, -25, 9, -76, -789, 56, -38, -270, -7, -23, -97, -60, -43, 31, -31, 72, 967, -39, 98, -23, 57, -74, 98, 97, 747, 12, 56, -68, 61, -61, -49, 530, 66, -49, -98, 36, 64, 31, 18, 851, -77, 77, 212, -24, -88, 11, 8, -839, -18, -78, -84, 22, -22, 56, -56, 47, -47, 72, -72, -84, -70, -46, 21, 18, -277, -60, -2, -23, 29, -28, -78, -19, 22, -70, 71, 996, 86, 14, 26, 74, 21, 79, -57, -13, -50, -44, 64, 15, -115, -32, -27, -139, -902, -62, -81, 56, 4, 77, 60, -81, -73, 94, -94, -37, 229, 69, -25, -53, -83, 574, 857, -31, -127, -573, 508, 92, -746, -654, -51, 12, 75, -36, 768, 310, 30, 85, -46, -847, -80, -62, 42, 311, 259, 793, -46, 81, 33, 747, 422, -75, 75, 6, -6, 41, -949, -92, -101, 68, -75, 28, 465, -54, 66, -97, -55, 50, 623, -88, -936, -94, -35, -570, 5, -61, 67, 62, -36, 56, -88, 43, 11, -81, -47, -20, -506, 16, -16, 727, -55, -34, -840, -72, -19, -7, 96, -96, -23, 23, 54, -94, -94, -28, -48, -5, -8, 11, -88, -20, 620, 18, -34, 16, 104, 96, 38, 54, 408, -7, -24, -20, 91, -72, 883, -51, 63, -174, -89, 8, -8, 446, 68, -81, -46, -401, -77, -9, -86, -26, -792, 77, 163, 821, -848, 91, -642, 60, 29, -83, 71, -506, -53, -76, 93, -142, -951, -6, -91, 15, 77, -95, 72, -776, -96, -62, -55, 850, -72, -64, 3, -2, 2, 93, 39, -68, 36, 8, -57, -33, 82, -477, 77, 437, 63, -94, 59, 2, -40, -34, -65, -25, 97, 73, 27, -1, -14, -84, 724, 75, -91, 91, 363, -63, 297, -29, -79, 511, 366, 34, 34, 27, 60, 49, -370, 274, 50, -124, -5, 5, -5, 5, 91, -46, -57, -88, -338, -30, -6, 66, 77, 31, -43, -57, 18, 79, 5, -34, -68, 550, 199, 51, 495, -95, 74, -51, -23, 31, -83, -99, 723, -49, -71, -28, -124, 76, -72, 96, -18, 580, -99, -33, 70, 65, -39, 74, -91, -470, 96, 65, -20, -80, -19, -81, -36, 29, -93, 90, 44, 29, 209, 28, 3, -1, -45, -107, -33, 96, 14, 8, 265, -43, -33, -24, 98, 2, 537, -411, 77, -93, 290, -332, 20, 12, -84, 884, -39, -706, 8, 16, -79, 23, -23, -728, -72, 5, -5, -97, 51, -34, -20, 57, -62, 305, -51, 5, -496, -14, 40, 654, -38, 71, -89, 18, 183, 17, -66, 4, 62, -75, 15, 60, 21, 79, 32, -73, -7, 52, -313, -8, -6, -853, -7, -17, 72, -72, -14, -50, 51, -91, 91, 18, -12, -93, -64, -36, -23, 36, -13, -26, -62, -5, 293, -943, -50, 17, 79, 95, -21, 86, -251, 8, -82, 362, 3, 60, -63, 48, 1, 11, -60, -52, -229, -83, 43, -79, -20, -5, -75, 927, -27, -82, 266, -14, 30, 63, -34, 171, -32, -68, 93, 7, -12, 177, -86, 21, -31, -69, -318, -85, -71, 70, 72, -34, -97, 80, -117, 9, 91, 99, -99, -64, 74, -51, -60, 79, -42, 818, -54, 614, -695, -19, -979, -35, -486, -51, 81, -28, -92, 19, -29, 13, -82, 12, 99, -95, 53, 293, -95, 38, -53, -302, 19, 10, -57, 47, 25, 74, 53, -65, 13, -41, -68, -67, -70, -25, -50, -90, -89, 763, 863, -48, -67, 82, -58, -98, -537, -95, 37, 45, 716, -26, -98, -279, -66, -59, -75, -24, 424, 30, 15, -45, -70, -77, -353, 25, 35, -56, 96, -49, -751, 21, 47, -43, -67, -58, 72, 31, -86, 54, 29, 868, -68, 25, 90, 42, 54, 89, -27, -73, 33, 412, 62, -87, -47, 22, -53, -66, 96, -73, 1, -99, 20, 784, 795, 13, -613, -708, -61, 69, 17, 83, -54, -546, 799, 801, -84, -31, -78, -22, 89, -43, 74, 59, -64, -911, 53, 11, 347, 11, 14, 68, 7, -31, -69, -501, -98, 99, -85, -388, 40, 8, 389, 5, 65, 871, -798, -61, 54, 26, -26, 47, -33, 95, -83, 804, 26, 948, -9, 5, 75, -12, -18, -45, -18, 9, 9, 266, 34, 55, 83, -94, 41, -185, -47, -74, -79, 91, -7, -84, -36, -964, 46, -546, -9, 9, 89, 40, -1, -53, -475, 70, -8, -62, 40, 60, 60, 91, 49, -53, 34, 19, -10, 56, -50, -34, 538, -92, -908, 12, -12, -90, 88, 3, 2, 56, -65, 6, -65, 317, -152, -7, 7, -60, 56, 25, -992, 47, -13, 48, -52, -656, 15, -753, 57, 701, 82, -45, 467, 19, 54, -24, 32, -37, -2, 31, 61, 91, -521, 58, -242, 89, 90, -46, 920, 77, -77, 5, 82, -87, -404, -16, -44, -48, 112, 416, -216, -7, -6, 522, 91, -25, -437, -38, -892, -74, -634, -31, 36, -63, 18, 40, -4, 504, 40, -40, 3, 777, -455, 75, 87, -4, -83, 58, -747, -69, 58, 19, 81, -10, -90, -66, -50, -2, -82, 7, -7, -366, 866, -37, 27, -90, 2, -202, 79, 906, -16, 31, -52, 64, -84, 36, 710, -40, -19, 22, -611, 57, -53, 64, 14, -8, 6, 76, 589, 33, 48, 748, -11, 96, -85, 12, -46, -94, 70, 55, 273, 67, 881, 87, -4, -1, -97, -90, 87, 4, 96, -62, 62, -78, 28, 1, -67, 216, -19, 19, 39, 75, -714, 97, 3, -99, -96, -8, -499, 47, -57, 41, -73, 33, 14, 1, -45, 63, -86, -47, 20, 91, 98, 102, 87, -22, 36, 86, 24, -211, -217, 44, 30, 42, -98, 199, -34, 34, 50, 90, 28, -32, 64, -57, 27, 105, 47, -22, -35, 301, -49, -17, -22, -778, -606, 6, -25, 708, 36, -79, 4, -31, -13, -92, 392, 22, 78, 63, 81, -2, 8, 49, -808, -37, 67, -507, 86, -20, -75, -260, 26, -79, -39, 47, -65, 806, 33, -57, -17, 31, 96, -15, 54, 56, 608, 997, 42, 31, 31, 69, -84, -516, -81, 11, -33, 3, 802, -642, 40, -74, -49, -91, -886, 89, 11, -18, -82, -26, -252, -40, -98, -79, -60, -845, -1, 1, -25, 24, 807, -55, 11, -66, -73, 72, 5, 513, -68, 485, 70, -81, -19, -86, -72, 46, -88, -59, -41, 373, -73, -49, -751, 430, 70, 74, 726, -5, -95, 67, -666, 699, -67, 70, -82, 19, 360, 77, -899, -68, 66, -376, -78, 78, 97, -97, -58, -73, 86, -55, -9, -91, 78, 5, -38, 15, 639, 1, 51, 66, -84, 59, 8, -334, -55, 72, -82, -93, 92, 330, -94, 64, -487, 87, 65, -566, -670, 24, 10, 42, 95, 38, 366, -4, 29, -29, 91, -94, 48, -660, -40, 86, 769, 904, -4, -76, 78, -45, -73, -14, -70, -58, -69, -873, -234, -38, -90, 46, -98, -93, 37, -18, 88, -44, -553, 97, -469, -57, -58, -42, 37, 370, -331, 299, -49, -85, 85, 180, 918, 302, -128, -72, -11, -26, -63, -25, 25, 5, -47, -14, 56, 69, 525, -994, 533, -633, -1, -53, -46, -10, 98, -53, 78, -13, 66, -66, 49, -49, -9, -66, 18, 857, 72, -72, 189, 11, -57, 29, 81, -51, -702, 1, 45, -62, -29, -9, 54, 64, -330, -749, -85, -8, -81, -309, -388, 82, -88, 92, -58, 98, 43, -49, -934, 894, -94, -47, -34, -819, -741, -859, 6, 92, -73, 75, 21, -965, -90, 34, 252, -588, -64, -738, -96, -66, 66, -28, -19, -65, -86, 32, 21, 457, 22, -356, 378, 635, 31, -67, 79, 96, 604, -65, 43, 47, -65, -60, 975, -75, -30, -70, -53, -73, 91, -50, -927, -51, -41, 49, -89, 41, 3, -680, 829, 335, -84, 21, 553, -774, 90, -90, -90, 11, 49, -781, -82, 93, 267, 82, 51, 22, 78, 97, 813, 990, 34, -34, 82, 77, 69, -63, -114, -85, 7, -73, 27, -11, 5, 79, 88, 12, 95, -815, -80, -952, -748, -375, -87, 62, -79, -21, -49, 49, 48, -48, 2, -2, -328, 6, 9, -98, 29, -18, 35, 66, -77, 76, 58, -58, 540, 12, 48, 687, 65, -937, -13, -2, -378, -98, 57, -985, -23, -9, -64, -90, -10, 28, 172, -97, 450, 3, 8, 6, 88, 92, 60, 66, 29, 82, 59, 44, 48, -99, 60, -369, 88, 22, -66, -63, 89, 40, -24, 58, 26, -234, 83, 688, -37, 87, -987, 55, -55, 35, 11, 78, -12, -95, 25, 58, 49, 77, 74, -266, 66, 99, 11, -777, 58, 54, -7, 62, 77, 59, -84, 48, 41, -41, 68, -67, -29, 74, 54, -83, -90, -92, -87, 52, -32, 934, 57, -70, 21, 46, 44, 52, -52, -147, 94, 69, -19, -47, -89, -95, -57, 16, 60, 92, 72, 16, 45, 80, -90, 245, -69, 124, 58, -11, 71, -78, -40, 94, -83, -11, -43, -39, -50, 30, -54, -7, 932, -769, 34, 266, -80, -276, -2, 758, 22, -622, -701, 50, 63, -12, 58, 543, 99, -6, 6, 808, -587, 102, -95, -55, -34, 570, -9, -16, 2, -20, -63, 30, 67, 7, -69, 64, 98, -3, 3, 13, 64, -241, -4, 68, -62, -6, 68, 49, -84, 35, -23, 23, -85, -15, 52, 548, -35, 48, -52, 571, -432, -59, -41, -11, 1, 10, -79, -60, 39, -49, -950, 14, 94, -51, 42, -678, -22, -60, 82, 78, -41, 885, 74, -61, -23, 39, -44, -43, 14, -9, -91, -69, -31, 45, -80, 77, -72, -76, 78, -72, 87, 113, -40, -761, -9, 91, 82, 78, 41, 424, 24, -39, 9, -15, 15, -84, -16, 290, 899, -37, 54, 79, -25, -63, -61, -36, 55, -65, -94, 51, 53, -20, -71, 91, -16, -84, -798, 16, -11, -7, -95, 533, 81, -33, -22, -64, -5, -605, 10, 67, -36, -31, -13, 92, -421, 91, -19, 501, 43, 72, 6, 48, 31, 69, -13, 48, 89, 76, -18, -33, 75, -24, 32, -32, 11, 821, -32, 81, 19, 304, 296, -2, -98, -50, -11, -51, 972, -32, 87, -15, -601, 646, 80, 75, 680, -80, 11, 89, 13, -85, 42, 97, 896, 27, 71, -62, 180, 61, 360, 552, 65, 171, 12, -68, 68, 30, -830, 90, 10, -81, -56, -163, -28, 45, 11, 32, -16, -44, -161, -6, -90, 57, 59, -59, -54, -897, -43, 72, 584, 38, -64, 39, 23, 902, 74, 40, -93, -821, 46, -46, -62, -52, -86, 56, 44, 71, 336, 93, 151, 64, -61, -554, 50, -37, 11, -624, 68, -68, -42, 8, -54, -992, 28, 638, -585, 11, -16, -30, -66, -27, 27, 92, -93, 43, 458, 12, 88, -85, -26, -2, -87, 138, 62, 682, -82, 8, -47, 15, -58, 7, 67, 27, 33, 48, -194, -485, 293, -44, 30, 4, -4, 53, 38, 10, 96, -14, -83, -10, -31, 23, -10, 38, 2, 88, 52, 21, 27, 270, 42, -92, 73, 823, -590, 47, -79, 7, -79, -26, 626, -790, -73, -67, -50, -442, -38, 15, -51, 74, 51, -46, -97, -8, -40, 340, -61, 61, -35, -65, -511, 40, 58, 62, -19, 70, -798, -27, 748, 68, 864, 45, -367, 67, -25, 62, 63, -13, -75, -352, -62, 85, -83, 81, 39, -41, -79, -2, 2, -265, -83, -52, -84, -16, -36, 435, 27, -70, -50, 37, -14, 71, -6, -94, 302, -333, 31, -46, 46, -34, 134, -89, 95, 94, 2, -2, 8, 92, 365, 35, -225, -75, -12, -47, 559, 65, 51, -16, 76, 24, -47, 97, 50, -28, -889, -2, -19, -62, -63, -456, -81, -89, 486, 31, 724, 48, -74, 31, 69, -26, 301, 31, 652, 42, -261, 35, 50, 79, 171, -7, 7, -386, 86, 26, 395, -48, -55, -18, 555, 23, 59, -37, -25, -64, -51, 3, 837, -29, 229, 91, -406, 70, 99, -978, -76, -19, 89, 78, 47, 22, -17, 47, 53, 13, 53, 87, 4, -257, 586, -63, -463, -60, 5, 95, 66, 34, -195, 47, 6, 2, -39, -21, 56, 44, -83, -61, -770, 547, 5, -53, -66, 881, 85, 615, 19, -13, -179, -47, 320, -53, -41, 94, -95, 78, -819, 36, -36, 969, -9, -44, -89, -36, -7, -25, 8, 69, -41, -94, 769, 866, 907, 39, 3, -17, -86, 50, -50, -51, -718, 23, 50, 50, 230, 70, -94, -60, -914, 68, -36, 56, -20, 37, -37, 382, -11, 895, -66, -51, 87, -39, -9, -88, 27, -52, -24, 672, 5, -96, 74, -89, 993, -12, 28, 39, -465, 12, 31, 22, -65, -32, -865, -89, -77, -37, 9, -9, -37, -378, -85, -14, -86, -45, 45, 40, -40, -40, 507, -88, -59, -85, 65, -99, 929, -30, -75, 647, -72, 301, 40, -24, -81, 54, 10, -93, -2, 23, 92, 657, -73, 16, -79, -341, -941, 45, -4, -14, -19, 75, -42, 69, -69, -35, 20, -593, -93, -607, 8, 4, 167, 29, 52, -52, 574, -34, 53, 7, 808, 98, -499, 45, 8, -52, 16, -52, -73, 812, -11, 18, 63, -72, -9, 3, -3, 92, 17, -809, 44, 56, -318, -61, -68, -93, -9, 12, 46, 83, 51, 510, 47, 7, -307, 62, 86, -48, -71, -222, -6, -8, -82, -33, 22, -37, 47, -6, 14, 86, 96, 147, -47, -15, 66, -98, 77, 61, 98, -789, 82, -978, -804, 79, -79, 97, 903, -43, 717, 26, 32, -82, -708, -42, -380, 80, 57, 42, 61, -60, -96, -4, 34, -14, -14, -3, -203, 61, -45, -16, 299, 29, -28, 8, -11, -354, -74, -22, -75, 28, -10, -90, 99, -12, 13, -179, 48, -73, -46, -83, 43, -10, 73, 27, 52, -83, -69, -83, -80, -98, -495, -7, -37, 446, -14, 68, -65, 65, -30, 111, 67, -95, 94, 91, -84, 92, -44, -491, -11, -5, 96, 9, 352, -34, 12, 13, -98, -31, 86, -3, 3, 83, -54, 71, 743, -43, 44, -69, 25, -90, 440, -96, -524, 70, -33, 933, -819, 4, -18, 57, 76, -254, -8, -38, -49, -53, -33, -76, -22, -867, -37, -68, 5, -392, -39, -97, -72, -52, -848, -14, -83, -91, 88, -24, 24, 285, 50, -49, 14, 28, 85, 605, 47, -93, 43, -15, 56, 44, 33, 83, 12, -92, -956, 81, -61, -244, 31, 31, 27, 10, -55, -59, -8, 44, -77, 834, 66, 50, -50, 7, 33, -40, -43, -37, 63, 8, -204, 613, 21, 879, 32, 856, 12, 45, -18, -98, 24, -53, -82, -49, 88, -57, 2, 36, -80, 24, -82, 68, -773, 5, -26, -815, -638, 968, -24, 835, -93, -95, 88, 27, -23, 76, 596, 24, 61, -62, 1, -2, -98, -613, 2, -66, 37, -60, -35, -79, -47, -242, 93, 64, 94, -67, 19, -28, 63, -35, -83, -432, -85, 64, 36, -871, -29, 542, -42, -975, -88, 5, -45, -3, 72, -19, -25, 78, -95, -54, 65, 57, 27, -56, -44, 42, 29, 29, 37, -89, 63, 5, -72, 41, 15, -12, 45, 27, 43, 97, -16, 17, -68, 67, 21, 12, -2, 50, 92, 4, 56, 33, 68, 2, -36, -41, -99, -19, 34, -9, -86, 20, 81, 32, 21, -41, -19, -18, 3, -12, -13, 42, 31, 17, -32, -2, -39, 41, -25, -44, -29, -29, 43, 45, 34, -26, 50, -32, -38, 22, 19, -45, 41, 9, 33, -27, 16, -9, -10, -8, -7, -40, 15, -23, -46, -42, 33, -18, -45, -2, -8, 14, -15, -26, 15, -39 };
toolchain/compile ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env bash
2
+
3
+ # compile and link
4
+ riscv-elf-gcc -march=rv32i -mabi=ilp32 -nostdlib -ffreestanding -O3 resources/start.s "$1" -T resources/linker.ld -o resources/output.elf
5
+
6
+ # extract binary
7
+ riscv-elf-objcopy -O binary resources/output.elf resources/output.bin
toolchain/compile.sh DELETED
@@ -1,5 +0,0 @@
1
- #!/usr/bin/env bash
2
-
3
- riscv-elf-gcc -march=rv32i -mabi=ilp32 -nostdlib -ffreestanding -O2 start.s main.c -T linker.ld -o prog.elf
4
- riscv-elf-objcopy -O binary prog.elf prog.bin
5
- python process.py
 
 
 
 
 
 
toolchain/dump ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ #!/bin/env bash
2
+
3
+ od -An -tx4 -w4 resources/output.bin
toolchain/inspect ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ #!/bin/env bash
2
+
3
+ riscv-elf-objdump -D resources/output.elf -j .text -j .rodata -j .data -j .bss | less -
toolchain/process.py DELETED
@@ -1,24 +0,0 @@
1
- #!/usr/bin/env python
2
-
3
- SIZE=4096
4
- LINE=8
5
- DEFAULTWORD = 'X"00000000"'
6
-
7
- data=[]
8
-
9
- inputdata = open('prog.bin','rb').read()
10
- pad = (-len(inputdata)) % 4
11
- inputdata += b'\x00' * pad
12
- for i in range(0, len(inputdata), 4):
13
- w = inputdata[i:i+4]
14
- val = int.from_bytes(w, 'little')
15
- data.append(f'X"{val:08x}"')
16
-
17
- oldsize = len(data)
18
- for i in range(oldsize, SIZE):
19
- data.append(DEFAULTWORD)
20
-
21
- i = 0
22
- while i < SIZE:
23
- print(', '.join(data[i:i+LINE]) + ('' if i + LINE >= len(data) else ','))
24
- i += LINE
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
toolchain/program ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/env python3
2
+
3
+ BINARY_FILE_PATH = 'resources/output.bin'
4
+ WORDS_PER_LINE = 8
5
+ LOGSIZE2 = 14
6
+
7
+ SOURCE_FILE_PATH = '../src/bram.vhd'
8
+ START_MARKER = '-- START PROGMEM'
9
+ END_MARKER = '-- END PROGMEM'
10
+
11
+
12
+ MEMORY_SIZE = 1 << LOGSIZE2
13
+ WORDS_LEN = 1 << (LOGSIZE2 - 2)
14
+
15
+
16
+ # load binary to buffer
17
+
18
+ buffer = [0] * WORDS_LEN
19
+ with open(BINARY_FILE_PATH, 'rb') as f:
20
+ i = 0
21
+ j = 0
22
+ while True:
23
+ word = f.read(4)
24
+
25
+ if not word:
26
+ break
27
+
28
+ if len(word) < 4:
29
+ raise ValueError(f"Incomplete 32-bit word at offset {i}")
30
+
31
+ buffer[j] = int.from_bytes(word)
32
+ i += 4
33
+ j += 1
34
+
35
+ i = 0
36
+ lines = ['\ttype ram_type is array (0 to 4095) of std_logic_vector(31 downto 0);', '\tshared variable RAM: ram_type := (']
37
+ while i < WORDS_LEN:
38
+ lines.append('\t\t' + ', '.join(map(lambda x: f'X"{x:08x}"', buffer[i:i+WORDS_PER_LINE]))
39
+ + (',' if (i + WORDS_PER_LINE) < WORDS_LEN else ''))
40
+ i += WORDS_PER_LINE
41
+ lines.append('\t);')
42
+
43
+
44
+ # put the binary in the source file
45
+
46
+ text = [line.rstrip("\n") for line in open(SOURCE_FILE_PATH)]
47
+ start_idx, end_idx = text.index(START_MARKER), text.index(END_MARKER)
48
+ assert 0 < start_idx and start_idx < end_idx
49
+
50
+ open(SOURCE_FILE_PATH, 'w').write('\n'.join(text[0 : start_idx + 1] + lines + text[end_idx :]))
toolchain/{linker.ld → resources/linker.ld} RENAMED
@@ -9,4 +9,3 @@ SECTIONS {
9
  .data : { *(.data*) }
10
  .bss : { *(.bss*) }
11
  }
12
-
 
9
  .data : { *(.data*) }
10
  .bss : { *(.bss*) }
11
  }
 
toolchain/resources/start.s ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ .section .text
2
+ .global _start
3
+ .type _start, @function
4
+
5
+ _start:
6
+ call main
7
+ 1: j 1b
toolchain/start.s DELETED
@@ -1,8 +0,0 @@
1
- .section .text,"ax",@progbits
2
- .global _start
3
- .type _start, @function
4
-
5
- _start:
6
- call main
7
- .p2align 2
8
- .word 0x0000006f
 
 
 
 
 
 
 
 
 

...

src/constants.vhd CHANGED
@@ -1,5 +1,6 @@
1
  library ieee;
2
  use ieee.std_logic_1164.all;
 
3
 
4
  use work.types.all;
5
 
@@ -16,4 +17,8 @@ package constants is
16
  active => '0',
17
  address => (others => '0')
18
  );
 
 
 
 
19
  end package constants;
 
1
  library ieee;
2
  use ieee.std_logic_1164.all;
3
+ use ieee.numeric_std.all;
4
 
5
  use work.types.all;
6
 
 
17
  active => '0',
18
  address => (others => '0')
19
  );
20
+
21
+ constant MEM_ADDRESS_BITS: integer := 14;
22
+ constant MEM_ADDRESS_MIN: std_logic_vector(31 downto 0) := (others => '0');
23
+ constant MEM_ADDRESS_MAX: std_logic_vector(31 downto 0) := std_logic_vector(to_unsigned((2**MEM_ADDRESS_BITS) - 1, 32));
24
  end package constants;
src/core/constants.vhd CHANGED
@@ -14,12 +14,14 @@ package core_constants is
14
  constant DEFAULT_DECODE_OUTPUT: decode_output_t := (
15
  is_active => '0',
16
  is_invalid => '0',
 
17
  operation => OP_ADD,
18
  operand1 => (others => '0'),
19
  operand2 => (others => '0'),
20
  operand3 => (others => '0'),
21
  destination_reg => (others => '0'),
22
- csr_read_only => '0'
 
23
  );
24
 
25
  constant DEFAULT_EXECUTE_OUTPUT: execute_output_t := (
@@ -77,4 +79,14 @@ package core_constants is
77
  constant MCONFIGPTR_VALUE: std_logic_vector(31 downto 0) := X"00000000";
78
 
79
  constant MISA_VALUE: std_logic_vector(31 downto 0) := X"40000100"; -- 32-bit RVI
 
 
 
 
 
 
 
 
 
 
80
  end package core_constants;
 
14
  constant DEFAULT_DECODE_OUTPUT: decode_output_t := (
15
  is_active => '0',
16
  is_invalid => '0',
17
+ is_invalid_address => '0',
18
  operation => OP_ADD,
19
  operand1 => (others => '0'),
20
  operand2 => (others => '0'),
21
  operand3 => (others => '0'),
22
  destination_reg => (others => '0'),
23
+ csr_read_only => '0',
24
+ pc => (others => '0')
25
  );
26
 
27
  constant DEFAULT_EXECUTE_OUTPUT: execute_output_t := (
 
79
  constant MCONFIGPTR_VALUE: std_logic_vector(31 downto 0) := X"00000000";
80
 
81
  constant MISA_VALUE: std_logic_vector(31 downto 0) := X"40000100"; -- 32-bit RVI
82
+
83
+ constant EX_CAUSE_INSTRUCTION_ADDRESS_MISALIGNED: std_logic_vector(3 downto 0) := "0000";
84
+ constant EX_CAUSE_INSTRUCTION_ACCESS_FAULT: std_logic_vector(3 downto 0) := "0001";
85
+ constant EX_CAUSE_ILLEGAL_INSTRUCTION: std_logic_vector(3 downto 0) := "0010";
86
+ constant EX_CAUSE_BREAKPOINT: std_logic_vector(3 downto 0) := "0011";
87
+ constant EX_CAUSE_LOAD_ADDRESS_MISALIGNED: std_logic_vector(3 downto 0) := "0100";
88
+ constant EX_CAUSE_LOAD_ACCESS_FAULT: std_logic_vector(3 downto 0) := "0101";
89
+ constant EX_CAUSE_STORE_ADDRESS_MISALIGNED: std_logic_vector(3 downto 0) := "0110";
90
+ constant EX_CAUSE_STORE_ACCESS_FAULT: std_logic_vector(3 downto 0) := "0111";
91
+ constant EX_CAUSE_ENVIRONMENT_CALL: std_logic_vector(3 downto 0) := "1011";
92
  end package core_constants;
src/core/decode_write.vhd CHANGED
@@ -2,6 +2,9 @@ library ieee;
2
  use ieee.std_logic_1164.all;
3
  use ieee.numeric_std.all;
4
 
 
 
 
5
  use work.core_types.all;
6
  use work.core_constants.all;
7
 
@@ -116,9 +119,11 @@ begin
116
 
117
  if decode_input.is_active = '1' then
118
  v_decode_output.is_active := '1';
119
- v_decode_output.is_invalid := '0';
120
 
121
- if opcode = "0110111" then
 
 
122
  -- LUI
123
  v_decode_output.operation := OP_ADD;
124
  v_decode_output.operand1 := (others => '0');
@@ -298,8 +303,10 @@ begin
298
  -- FENCE (implemented as NOP)
299
  elsif i_imm = "000000000000" and rs1 = "00000" and funct3 = "000" and rd = "00000" and opcode = "1110011" then
300
  -- ECALL
 
301
  elsif i_imm = "000000000001" and rs1 = "00000" and funct3 = "000" and rd = "00000" and opcode = "1110011" then
302
  -- EBREAK
 
303
  elsif funct7 = "0011000" and rs2 = "00010" and rs1 = "00000" and rd = "00000" and opcode = "1110011" then
304
  -- MRET
305
  v_decode_output.operation := OP_MRET;
 
2
  use ieee.std_logic_1164.all;
3
  use ieee.numeric_std.all;
4
 
5
+ use work.types.all;
6
+ use work.constants.all;
7
+
8
  use work.core_types.all;
9
  use work.core_constants.all;
10
 
 
119
 
120
  if decode_input.is_active = '1' then
121
  v_decode_output.is_active := '1';
122
+ v_decode_output.pc := decode_input.pc;
123
 
124
+ if not (MEM_ADDRESS_MIN <= decode_input.pc and decode_input.pc <= MEM_ADDRESS_MAX) then
125
+ v_decode_output.is_invalid_address := '1';
126
+ elsif opcode = "0110111" then
127
  -- LUI
128
  v_decode_output.operation := OP_ADD;
129
  v_decode_output.operand1 := (others => '0');
 
303
  -- FENCE (implemented as NOP)
304
  elsif i_imm = "000000000000" and rs1 = "00000" and funct3 = "000" and rd = "00000" and opcode = "1110011" then
305
  -- ECALL
306
+ v_decode_output.operation := OP_ECALL;
307
  elsif i_imm = "000000000001" and rs1 = "00000" and funct3 = "000" and rd = "00000" and opcode = "1110011" then
308
  -- EBREAK
309
+ v_decode_output.operation := OP_EBREAK;
310
  elsif funct7 = "0011000" and rs2 = "00010" and rs1 = "00000" and rd = "00000" and opcode = "1110011" then
311
  -- MRET
312
  v_decode_output.operation := OP_MRET;
src/core/execute.vhd CHANGED
@@ -31,7 +31,7 @@ architecture rtl of execute is
31
  signal mscratch: std_logic_vector(31 downto 0) := (others => '0');
32
  signal mepc: std_logic_vector(29 downto 0) := (others => '0');
33
  signal mcause_int: std_logic := '0';
34
- signal mcause_code: std_logic_vector(5 downto 0) := (others => '0');
35
  signal mtval: std_logic_vector(31 downto 0) := (others => '0');
36
  signal mip: std_logic_vector(15 downto 0) := (others => '0');
37
  signal mcycle: std_logic_vector(31 downto 0) := (others => '0');
@@ -46,12 +46,22 @@ begin
46
  variable v_jump: std_logic;
47
  variable v_jump_address: std_logic_vector(31 downto 0);
48
  variable v_mem_req: mem_req_t;
49
- variable v_mcycle_next, v_mcycleh_next: std_logic_vector(31 downto 0);
50
- variable v_minstret_next, v_minstreth_next: std_logic_vector(31 downto 0);
 
 
 
 
 
 
 
51
 
52
  variable csr_set_bits, csr_clear_bits: std_logic_vector(31 downto 0);
53
  variable v_temp: unsigned(63 downto 0);
54
 
 
 
 
55
  begin
56
  if rising_edge(clk) then
57
  v_output := DEFAULT_EXECUTE_OUTPUT;
@@ -61,281 +71,370 @@ begin
61
  v_jump_address := (others => '0');
62
 
63
  v_temp := unsigned(mcycleh & mcycle) + 1;
64
- v_mcycle_next := std_logic_vector(v_temp(31 downto 0));
65
- v_mcycleh_next := std_logic_vector(v_temp(63 downto 32));
 
 
 
 
 
 
 
 
66
 
67
  v_temp := unsigned(minstreth & minstret);
68
  if instr_retire = '1' then
69
  v_temp := v_temp + 1;
70
  end if;
71
 
72
- v_minstret_next := std_logic_vector(v_temp(31 downto 0));
73
- v_minstreth_next := std_logic_vector(v_temp(63 downto 32));
74
-
75
- if input.is_active = '1' and input.is_invalid = '0' then
76
- if input.operation = OP_ADD then
77
- v_output.result := std_logic_vector(unsigned(input.operand1) + unsigned(input.operand2));
78
- elsif input.operation = OP_SUB then
79
- v_output.result := std_logic_vector(unsigned(input.operand1) - unsigned(input.operand2));
80
- elsif input.operation = OP_SLT then
81
- if signed(input.operand1) < signed(input.operand2) then
82
- v_output.result := std_logic_vector(to_unsigned(1, 32));
83
- else
84
- v_output.result := (others => '0');
85
- end if;
86
- elsif input.operation = OP_SLTU then
87
- if unsigned(input.operand1) < unsigned(input.operand2) then
88
- v_output.result := std_logic_vector(to_unsigned(1, 32));
89
- else
90
- v_output.result := (others => '0');
91
- end if;
92
- elsif input.operation = OP_XOR then
93
- v_output.result := input.operand1 xor input.operand2;
94
- elsif input.operation = OP_OR then
95
- v_output.result := input.operand1 or input.operand2;
96
- elsif input.operation = OP_AND then
97
- v_output.result := input.operand1 and input.operand2;
98
- elsif input.operation = OP_SLL then
99
- v_output.result := input.operand1;
100
-
101
- if input.operand2(4) = '1' then
102
- v_output.result := v_output.result(15 downto 0) & "0000000000000000";
103
- end if;
104
- if input.operand2(3) = '1' then
105
- v_output.result := v_output.result(23 downto 0) & "00000000";
106
- end if;
107
- if input.operand2(2) = '1' then
108
- v_output.result := v_output.result(27 downto 0) & "0000";
109
- end if;
110
- if input.operand2(1) = '1' then
111
- v_output.result := v_output.result(29 downto 0) & "00";
112
- end if;
113
- if input.operand2(0) = '1' then
114
- v_output.result := v_output.result(30 downto 0) & "0";
115
- end if;
116
- elsif input.operation = OP_SRL or input.operation = OP_SRA then
117
- v_output.result := input.operand1;
118
 
119
- if input.operation = OP_SRL then
120
- v_sign := (others => '0');
121
- else
122
- v_sign := (others => input.operand1(31));
123
- end if;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
124
 
125
- if input.operand2(4) = '1' then
126
- v_output.result := v_sign(15 downto 0) & v_output.result(31 downto 16);
127
- end if;
128
- if input.operand2(3) = '1' then
129
- v_output.result := v_sign(7 downto 0) & v_output.result(31 downto 8);
130
- end if;
131
- if input.operand2(2) = '1' then
132
- v_output.result := v_sign(3 downto 0) & v_output.result(31 downto 4);
133
- end if;
134
- if input.operand2(1) = '1' then
135
- v_output.result := v_sign(2 downto 0) & v_output.result(31 downto 3);
136
- end if;
137
- if input.operand2(0) = '1' then
138
- v_output.result := v_sign(1 downto 0) & v_output.result(31 downto 2);
139
- end if;
140
- elsif input.operation = OP_JAL then
141
- v_jump := '1';
142
- v_jump_address := std_logic_vector(unsigned(input.operand1) + unsigned(input.operand2));
143
- v_output.result := input.operand3;
144
- elsif input.operation = OP_BEQ then
145
- if input.operand1 = input.operand2 then
146
- v_jump := '1';
147
- v_jump_address := input.operand3;
148
- end if;
149
- elsif input.operation = OP_BNE then
150
- if input.operand1 /= input.operand2 then
151
- v_jump := '1';
152
- v_jump_address := input.operand3;
153
- end if;
154
- elsif input.operation = OP_BLT then
155
- if signed(input.operand1) < signed(input.operand2) then
156
- v_jump := '1';
157
- v_jump_address := input.operand3;
158
- end if;
159
- elsif input.operation = OP_BGE then
160
- if signed(input.operand1) >= signed(input.operand2) then
161
- v_jump := '1';
162
- v_jump_address := input.operand3;
163
- end if;
164
- elsif input.operation = OP_BLTU then
165
- if unsigned(input.operand1) < unsigned(input.operand2) then
166
- v_jump := '1';
167
- v_jump_address := input.operand3;
168
- end if;
169
- elsif input.operation = OP_BGEU then
170
- if unsigned(input.operand1) >= unsigned(input.operand2) then
171
  v_jump := '1';
172
- v_jump_address := input.operand3;
173
- end if;
174
- elsif input.operation = OP_SB then
175
- v_mem_req.active := '1';
176
- v_mem_req.address := input.operand1;
177
-
178
- if input.operand1(1 downto 0) = "00" then
179
- v_mem_req.value := x"000000" & input.operand2(7 downto 0);
180
- v_mem_req.write_enable := "0001";
181
- elsif input.operand1(1 downto 0) = "01" then
182
- v_mem_req.value := x"0000" & input.operand2(7 downto 0) & x"00";
183
- v_mem_req.write_enable := "0010";
184
- elsif input.operand1(1 downto 0) = "10" then
185
- v_mem_req.value := x"00" & input.operand2(7 downto 0) & x"0000";
186
- v_mem_req.write_enable := "0100";
187
- else
188
- v_mem_req.value := input.operand2(7 downto 0) & x"000000";
189
- v_mem_req.write_enable := "1000";
190
- end if;
191
- elsif input.operation = OP_SH then
192
- -- TODO: a misaligned store should generate an exception
193
- v_mem_req.active := '1';
194
- v_mem_req.address := input.operand1;
195
-
196
- if input.operand1(1 downto 0) = "00" then
197
- v_mem_req.value := x"0000" & input.operand2(15 downto 0);
198
- v_mem_req.write_enable := "0011";
199
- else
200
- v_mem_req.value := input.operand2(15 downto 0) & x"0000";
201
- v_mem_req.write_enable := "1100";
202
- end if;
203
- elsif input.operation = OP_SW then
204
- -- TODO: a misaligned store should generate an exception
205
- v_mem_req.active := '1';
206
- v_mem_req.write_enable := "1111";
207
- v_mem_req.address := input.operand1;
208
- v_mem_req.value := input.operand2;
209
- elsif input.operation = OP_LB or input.operation = OP_LH or input.operation = OP_LW or
210
- input.operation = OP_LBU or input.operation = OP_LHU then
211
- -- TODO: a misaligned load should generate an exception
212
- v_output.use_mem := '1';
213
- v_output.mem_addr := input.operand1(1 downto 0);
214
-
215
- v_mem_req.active := '1';
216
- v_mem_req.address := input.operand1;
217
-
218
- if input.operation = OP_LB or input.operation = OP_LH then
219
- v_output.mem_sign_extend := '1';
220
- end if;
221
 
222
- if input.operation = OP_LB or input.operation = OP_LBU then
223
- v_output.mem_size := SIZE_BYTE;
224
- elsif input.operation = OP_LH or input.operation = OP_LHU then
225
- v_output.mem_size := SIZE_HALFWORD;
226
- else
227
- v_output.mem_size := SIZE_WORD;
228
- end if;
229
- elsif input.operation = OP_CSRRW or input.operation = OP_CSRRS or input.operation = OP_CSRRC then
230
- if input.operation = OP_CSRRW then
231
- csr_set_bits := input.operand1;
232
- csr_clear_bits := input.operand1;
233
- elsif input.operation = OP_CSRRS then
234
- csr_set_bits := input.operand1;
235
- csr_clear_bits := (others => '1');
236
- elsif input.operation = OP_CSRRC then
237
- csr_clear_bits := not input.operand1;
238
- else
239
- assert false report "Unhandled CSR operation in execute stage" severity failure;
240
- end if;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
241
 
242
- -- TODO: implementations for CSR read-write registers
243
-
244
- if input.operand2(11 downto 0) = CSR_MSTATUS then
245
- v_output.result := "000000000000000000011000" & mstatus_mpie & "000" & mstatus_mie & "000";
246
- mstatus_mie <= (mstatus_mie or csr_set_bits(3)) and csr_clear_bits(3);
247
- mstatus_mpie <= (mstatus_mpie or csr_set_bits(7)) and csr_clear_bits(7);
248
- elsif input.operand2(11 downto 0) = CSR_MISA then
249
- v_output.result := MISA_VALUE;
250
- elsif input.operand2(11 downto 0) = CSR_MIE then
251
- v_output.result := x"0000" & mie;
252
- mie <= (mie or csr_set_bits(15 downto 0)) and csr_clear_bits(15 downto 0);
253
- elsif input.operand2(11 downto 0) = CSR_MTVEC then
254
- v_output.result := mtvec_address & "0" & mtvec_mode;
255
- mtvec_address <= (mtvec_address or csr_set_bits(31 downto 2)) and csr_clear_bits(31 downto 2);
256
- mtvec_mode <= (mtvec_mode or csr_set_bits(0)) and csr_clear_bits(0);
257
- elsif input.operand2(11 downto 0) = CSR_MSTATUSH then
258
- v_output.result := (others => '0');
259
- elsif input.operand2(11 downto 0) = CSR_MSCRATCH then
260
- v_output.result := mscratch;
261
- mscratch <= (mscratch or csr_set_bits) and csr_clear_bits;
262
- elsif input.operand2(11 downto 0) = CSR_MEPC then
263
- v_output.result := mepc & "00";
264
- mepc <= (mepc or csr_set_bits(31 downto 2)) and csr_clear_bits(31 downto 2);
265
- elsif input.operand2(11 downto 0) = CSR_MCAUSE then
266
- v_output.result := mcause_int & "0000000000000000000000000" & mcause_code;
267
- mcause_int <= (mcause_int or csr_set_bits(31)) and csr_clear_bits(31);
268
- mcause_code <= (mcause_code or csr_set_bits(5 downto 0)) and csr_clear_bits(5 downto 0);
269
- elsif input.operand2(11 downto 0) = CSR_MTVAL then
270
- v_output.result := mtval;
271
- mtval <= (mtval or csr_set_bits) and csr_clear_bits;
272
- elsif input.operand2(11 downto 0) = CSR_MIP then
273
- v_output.result := x"0000" & mip;
274
- mip <= (mip or csr_set_bits(15 downto 0)) and csr_clear_bits(15 downto 0);
275
- elsif input.operand2(11 downto 0) = CSR_MCYCLE then
276
- v_output.result := mcycle;
277
- v_mcycle_next := (mcycle or csr_set_bits) and csr_clear_bits;
278
- elsif input.operand2(11 downto 0) = CSR_MINSTRET then
279
- v_output.result := minstret;
280
- v_minstret_next := (minstret or csr_set_bits) and csr_clear_bits;
281
- elsif unsigned(CSR_MHPMCOUNTER3) <= unsigned(input.operand2(11 downto 0)) and unsigned(input.operand2(11 downto 0)) <= unsigned(CSR_MHPMCOUNTER31) then
282
- v_output.result := (others => '0');
283
- elsif input.operand2(11 downto 0) = CSR_MCYCLEH then
284
- v_output.result := mcycleh;
285
- v_mcycleh_next := (mcycleh or csr_set_bits) and csr_clear_bits;
286
- elsif input.operand2(11 downto 0) = CSR_MINSTRETH then
287
- v_output.result := minstreth;
288
- v_minstreth_next := (minstreth or csr_set_bits) and csr_clear_bits;
289
- elsif unsigned(CSR_MHPMCOUNTER3H) <= unsigned(input.operand2(11 downto 0)) and unsigned(input.operand2(11 downto 0)) <= unsigned(CSR_MHPMCOUNTER31H) then
290
- v_output.result := (others => '0');
291
- elsif unsigned(CSR_MHPMEVENT3) <= unsigned(input.operand2(11 downto 0)) and unsigned(input.operand2(11 downto 0)) <= unsigned(CSR_MHPMEVENT31) then
292
- v_output.result := (others => '0');
293
- elsif unsigned(CSR_MHPMEVENT3H) <= unsigned(input.operand2(11 downto 0)) and unsigned(input.operand2(11 downto 0)) <= unsigned(CSR_MHPMEVENT31H) then
294
- v_output.result := (others => '0');
295
- elsif input.csr_read_only = '1' then
296
- -- read-only CSRs
297
- if input.operand2(11 downto 0) = CSR_MVENDORID then
298
- v_output.result := MVENDORID_VALUE;
299
- elsif input.operand2(11 downto 0) = CSR_MARCHID then
300
- v_output.result := MARCHID_VALUE;
301
- elsif input.operand2(11 downto 0) = CSR_MIMPID then
302
- v_output.result := MIMPID_VALUE;
303
- elsif input.operand2(11 downto 0) = CSR_MHARTID then
304
- v_output.result := MHARTID_VALUE;
305
- elsif input.operand2(11 downto 0) = CSR_MCONFIGPTR then
306
- v_output.result := MCONFIGPTR_VALUE;
 
 
 
307
  else
308
- -- TODO: exception; trying to read non-existent CSR
 
 
309
  end if;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
310
  else
311
- -- TODO: exception; trying to write to non-existent or read-only CSR
312
  end if;
313
- elsif input.operation = OP_MRET then
314
- mstatus_mie <= mstatus_mpie;
315
- mstatus_mpie <= '1';
316
- v_jump := '1';
317
- v_jump_address := mepc & "00";
318
- elsif input.operation = OP_LED then
319
- led <= input.operand1(7 downto 0);
320
- else
321
- assert false report "Unhandled operation value in execute stage" severity failure;
322
  end if;
323
 
324
- v_output.destination_reg := input.destination_reg;
 
 
 
 
 
 
 
 
 
 
 
 
 
325
  end if;
326
 
327
  output <= v_output;
328
-
329
  mem_req <= v_mem_req;
330
-
331
  jump <= v_jump;
332
  jump_address <= v_jump_address(31 downto 1) & "0";
333
-
334
- mcycle <= v_mcycle_next;
335
- mcycleh <= v_mcycleh_next;
336
-
337
- minstret <= v_minstret_next;
338
- minstreth <= v_minstreth_next;
 
339
  end if;
340
  end process;
341
 
 
31
  signal mscratch: std_logic_vector(31 downto 0) := (others => '0');
32
  signal mepc: std_logic_vector(29 downto 0) := (others => '0');
33
  signal mcause_int: std_logic := '0';
34
+ signal mcause_code: std_logic_vector(3 downto 0) := (others => '0');
35
  signal mtval: std_logic_vector(31 downto 0) := (others => '0');
36
  signal mip: std_logic_vector(15 downto 0) := (others => '0');
37
  signal mcycle: std_logic_vector(31 downto 0) := (others => '0');
 
46
  variable v_jump: std_logic;
47
  variable v_jump_address: std_logic_vector(31 downto 0);
48
  variable v_mem_req: mem_req_t;
49
+ variable v_mcycle_inc, v_mcycleh_inc: std_logic_vector(31 downto 0);
50
+ variable v_mcycle, v_mcycleh: std_logic_vector(31 downto 0);
51
+ variable v_minstret_inc, v_minstreth_inc: std_logic_vector(31 downto 0);
52
+ variable v_minstret, v_minstreth: std_logic_vector(31 downto 0);
53
+ variable v_mepc: std_logic_vector(29 downto 0);
54
+ variable v_mcause_int: std_logic;
55
+ variable v_mcause_code: std_logic_vector(3 downto 0);
56
+
57
+ variable v_address, v_value: std_logic_vector(31 downto 0);
58
 
59
  variable csr_set_bits, csr_clear_bits: std_logic_vector(31 downto 0);
60
  variable v_temp: unsigned(63 downto 0);
61
 
62
+ variable has_exception: boolean;
63
+ variable exception_cause: std_logic_vector(3 downto 0);
64
+
65
  begin
66
  if rising_edge(clk) then
67
  v_output := DEFAULT_EXECUTE_OUTPUT;
 
71
  v_jump_address := (others => '0');
72
 
73
  v_temp := unsigned(mcycleh & mcycle) + 1;
74
+ v_mcycle_inc := std_logic_vector(v_temp(31 downto 0));
75
+ v_mcycle := v_mcycle_inc;
76
+ v_mcycleh_inc := std_logic_vector(v_temp(63 downto 32));
77
+ v_mcycleh := v_mcycleh_inc;
78
+ v_mepc := mepc;
79
+ v_mcause_int := mcause_int;
80
+ v_mcause_code := mcause_code;
81
+
82
+ has_exception := false;
83
+ exception_cause := (others => '0');
84
 
85
  v_temp := unsigned(minstreth & minstret);
86
  if instr_retire = '1' then
87
  v_temp := v_temp + 1;
88
  end if;
89
 
90
+ v_minstret := std_logic_vector(v_temp(31 downto 0));
91
+ v_minstreth := std_logic_vector(v_temp(63 downto 32));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92
 
93
+ if input.is_active = '1' then
94
+ if input.is_invalid_address = '1' then
95
+ has_exception := true;
96
+ exception_cause := EX_CAUSE_INSTRUCTION_ACCESS_FAULT;
97
+ elsif input.is_invalid = '1' then
98
+ has_exception := true;
99
+ exception_cause := EX_CAUSE_ILLEGAL_INSTRUCTION;
100
+ else
101
+ if input.operation = OP_ADD then
102
+ v_output.result := std_logic_vector(unsigned(input.operand1) + unsigned(input.operand2));
103
+ elsif input.operation = OP_SUB then
104
+ v_output.result := std_logic_vector(unsigned(input.operand1) - unsigned(input.operand2));
105
+ elsif input.operation = OP_SLT then
106
+ if signed(input.operand1) < signed(input.operand2) then
107
+ v_output.result := std_logic_vector(to_unsigned(1, 32));
108
+ else
109
+ v_output.result := (others => '0');
110
+ end if;
111
+ elsif input.operation = OP_SLTU then
112
+ if unsigned(input.operand1) < unsigned(input.operand2) then
113
+ v_output.result := std_logic_vector(to_unsigned(1, 32));
114
+ else
115
+ v_output.result := (others => '0');
116
+ end if;
117
+ elsif input.operation = OP_XOR then
118
+ v_output.result := input.operand1 xor input.operand2;
119
+ elsif input.operation = OP_OR then
120
+ v_output.result := input.operand1 or input.operand2;
121
+ elsif input.operation = OP_AND then
122
+ v_output.result := input.operand1 and input.operand2;
123
+ elsif input.operation = OP_SLL then
124
+ v_output.result := input.operand1;
125
 
126
+ if input.operand2(4) = '1' then
127
+ v_output.result := v_output.result(15 downto 0) & "0000000000000000";
128
+ end if;
129
+ if input.operand2(3) = '1' then
130
+ v_output.result := v_output.result(23 downto 0) & "00000000";
131
+ end if;
132
+ if input.operand2(2) = '1' then
133
+ v_output.result := v_output.result(27 downto 0) & "0000";
134
+ end if;
135
+ if input.operand2(1) = '1' then
136
+ v_output.result := v_output.result(29 downto 0) & "00";
137
+ end if;
138
+ if input.operand2(0) = '1' then
139
+ v_output.result := v_output.result(30 downto 0) & "0";
140
+ end if;
141
+ elsif input.operation = OP_SRL or input.operation = OP_SRA then
142
+ v_output.result := input.operand1;
143
+
144
+ if input.operation = OP_SRL then
145
+ v_sign := (others => '0');
146
+ else
147
+ v_sign := (others => input.operand1(31));
148
+ end if;
149
+
150
+ if input.operand2(4) = '1' then
151
+ v_output.result := v_sign(15 downto 0) & v_output.result(31 downto 16);
152
+ end if;
153
+ if input.operand2(3) = '1' then
154
+ v_output.result := v_sign(7 downto 0) & v_output.result(31 downto 8);
155
+ end if;
156
+ if input.operand2(2) = '1' then
157
+ v_output.result := v_sign(3 downto 0) & v_output.result(31 downto 4);
158
+ end if;
159
+ if input.operand2(1) = '1' then
160
+ v_output.result := v_sign(2 downto 0) & v_output.result(31 downto 3);
161
+ end if;
162
+ if input.operand2(0) = '1' then
163
+ v_output.result := v_sign(1 downto 0) & v_output.result(31 downto 2);
164
+ end if;
165
+ elsif input.operation = OP_JAL then
 
 
 
 
 
 
166
  v_jump := '1';
167
+ v_jump_address := std_logic_vector(unsigned(input.operand1) + unsigned(input.operand2));
168
+ v_output.result := input.operand3;
169
+ elsif input.operation = OP_BEQ then
170
+ if input.operand1 = input.operand2 then
171
+ v_jump := '1';
172
+ v_jump_address := input.operand3;
173
+ end if;
174
+ elsif input.operation = OP_BNE then
175
+ if input.operand1 /= input.operand2 then
176
+ v_jump := '1';
177
+ v_jump_address := input.operand3;
178
+ end if;
179
+ elsif input.operation = OP_BLT then
180
+ if signed(input.operand1) < signed(input.operand2) then
181
+ v_jump := '1';
182
+ v_jump_address := input.operand3;
183
+ end if;
184
+ elsif input.operation = OP_BGE then
185
+ if signed(input.operand1) >= signed(input.operand2) then
186
+ v_jump := '1';
187
+ v_jump_address := input.operand3;
188
+ end if;
189
+ elsif input.operation = OP_BLTU then
190
+ if unsigned(input.operand1) < unsigned(input.operand2) then
191
+ v_jump := '1';
192
+ v_jump_address := input.operand3;
193
+ end if;
194
+ elsif input.operation = OP_BGEU then
195
+ if unsigned(input.operand1) >= unsigned(input.operand2) then
196
+ v_jump := '1';
197
+ v_jump_address := input.operand3;
198
+ end if;
199
+ elsif input.operation = OP_SB then
200
+ v_address := input.operand1;
201
+ v_value := input.operand2;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
202
 
203
+ v_mem_req.active := '1';
204
+ v_mem_req.address := v_address;
205
+
206
+ if v_address(1 downto 0) = "00" then
207
+ v_mem_req.value := x"000000" & v_value(7 downto 0);
208
+ v_mem_req.write_enable := "0001";
209
+ elsif v_address(1 downto 0) = "01" then
210
+ v_mem_req.value := x"0000" & v_value(7 downto 0) & x"00";
211
+ v_mem_req.write_enable := "0010";
212
+ elsif v_address(1 downto 0) = "10" then
213
+ v_mem_req.value := x"00" & v_value(7 downto 0) & x"0000";
214
+ v_mem_req.write_enable := "0100";
215
+ else
216
+ v_mem_req.value := v_value(7 downto 0) & x"000000";
217
+ v_mem_req.write_enable := "1000";
218
+ end if;
219
+
220
+ if not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
221
+ has_exception := true;
222
+ exception_cause := EX_CAUSE_STORE_ACCESS_FAULT;
223
+ end if;
224
+ elsif input.operation = OP_SH then
225
+ v_address := input.operand1;
226
+ v_value := input.operand2;
227
+
228
+ v_mem_req.active := '1';
229
+ v_mem_req.address := v_address;
230
+
231
+ if input.operand1(1 downto 0) = "00" then
232
+ v_mem_req.value := x"0000" & v_value(15 downto 0);
233
+ v_mem_req.write_enable := "0011";
234
+ else
235
+ v_mem_req.value := v_value(15 downto 0) & x"0000";
236
+ v_mem_req.write_enable := "1100";
237
+ end if;
238
+
239
+ if v_address(0) /= '0' then
240
+ has_exception := true;
241
+ exception_cause := EX_CAUSE_STORE_ADDRESS_MISALIGNED;
242
+ elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
243
+ has_exception := true;
244
+ exception_cause := EX_CAUSE_STORE_ACCESS_FAULT;
245
+ end if;
246
+ elsif input.operation = OP_SW then
247
+ v_mem_req.active := '1';
248
+ v_mem_req.write_enable := "1111";
249
+ v_mem_req.address := input.operand1;
250
+ v_mem_req.value := input.operand2;
251
+
252
+ if v_address(1 downto 0) /= "00" then
253
+ has_exception := true;
254
+ exception_cause := EX_CAUSE_STORE_ADDRESS_MISALIGNED;
255
+ elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
256
+ has_exception := true;
257
+ exception_cause := EX_CAUSE_STORE_ACCESS_FAULT;
258
+ end if;
259
+ elsif input.operation = OP_LB or input.operation = OP_LH or input.operation = OP_LW or input.operation = OP_LBU or input.operation = OP_LHU then
260
+ v_address := input.operand1;
261
+
262
+ v_output.use_mem := '1';
263
+ v_output.mem_addr := v_address(1 downto 0);
264
+
265
+ v_mem_req.active := '1';
266
+ v_mem_req.address := v_address;
267
+
268
+ if input.operation = OP_LB or input.operation = OP_LH then
269
+ v_output.mem_sign_extend := '1';
270
+ end if;
271
+
272
+ if input.operation = OP_LB or input.operation = OP_LBU then
273
+ v_output.mem_size := SIZE_BYTE;
274
+ if not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
275
+ has_exception := true;
276
+ exception_cause := EX_CAUSE_LOAD_ACCESS_FAULT;
277
+ end if;
278
+ elsif input.operation = OP_LH or input.operation = OP_LHU then
279
+ v_output.mem_size := SIZE_HALFWORD;
280
+ if v_address(0) /= '0' then
281
+ has_exception := true;
282
+ exception_cause := EX_CAUSE_LOAD_ADDRESS_MISALIGNED;
283
+ elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
284
+ has_exception := true;
285
+ exception_cause := EX_CAUSE_LOAD_ACCESS_FAULT;
286
+ end if;
287
+ else
288
+ v_output.mem_size := SIZE_WORD;
289
+ if v_address(1 downto 0) /= "00" then
290
+ has_exception := true;
291
+ exception_cause := EX_CAUSE_LOAD_ADDRESS_MISALIGNED;
292
+ elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
293
+ has_exception := true;
294
+ exception_cause := EX_CAUSE_LOAD_ACCESS_FAULT;
295
+ end if;
296
+ end if;
297
+ elsif input.operation = OP_CSRRW or input.operation = OP_CSRRS or input.operation = OP_CSRRC then
298
+ if input.operation = OP_CSRRW then
299
+ csr_set_bits := input.operand1;
300
+ csr_clear_bits := input.operand1;
301
+ elsif input.operation = OP_CSRRS then
302
+ csr_set_bits := input.operand1;
303
+ csr_clear_bits := (others => '1');
304
+ elsif input.operation = OP_CSRRC then
305
+ csr_clear_bits := not input.operand1;
306
+ else
307
+ assert false report "Unhandled CSR operation in execute stage" severity failure;
308
+ end if;
309
+
310
+ -- TODO: implementations for CSR read-write registers
311
 
312
+ if input.operand2(11 downto 0) = CSR_MSTATUS then
313
+ v_output.result := "000000000000000000011000" & mstatus_mpie & "000" & mstatus_mie & "000";
314
+ mstatus_mie <= (mstatus_mie or csr_set_bits(3)) and csr_clear_bits(3);
315
+ mstatus_mpie <= (mstatus_mpie or csr_set_bits(7)) and csr_clear_bits(7);
316
+ elsif input.operand2(11 downto 0) = CSR_MISA then
317
+ v_output.result := MISA_VALUE;
318
+ elsif input.operand2(11 downto 0) = CSR_MIE then
319
+ v_output.result := x"0000" & mie;
320
+ mie <= (mie or csr_set_bits(15 downto 0)) and csr_clear_bits(15 downto 0);
321
+ elsif input.operand2(11 downto 0) = CSR_MTVEC then
322
+ v_output.result := mtvec_address & "0" & mtvec_mode;
323
+ mtvec_address <= (mtvec_address or csr_set_bits(31 downto 2)) and csr_clear_bits(31 downto 2);
324
+ mtvec_mode <= (mtvec_mode or csr_set_bits(0)) and csr_clear_bits(0);
325
+ elsif input.operand2(11 downto 0) = CSR_MSTATUSH then
326
+ v_output.result := (others => '0');
327
+ elsif input.operand2(11 downto 0) = CSR_MSCRATCH then
328
+ v_output.result := mscratch;
329
+ mscratch <= (mscratch or csr_set_bits) and csr_clear_bits;
330
+ elsif input.operand2(11 downto 0) = CSR_MEPC then
331
+ v_output.result := mepc & "00";
332
+ v_mepc := (mepc or csr_set_bits(31 downto 2)) and csr_clear_bits(31 downto 2);
333
+ elsif input.operand2(11 downto 0) = CSR_MCAUSE then
334
+ v_output.result := mcause_int & "000000000000000000000000000" & mcause_code;
335
+ mcause_int <= (mcause_int or csr_set_bits(31)) and csr_clear_bits(31);
336
+ mcause_code <= (mcause_code or csr_set_bits(5 downto 0)) and csr_clear_bits(5 downto 0);
337
+ elsif input.operand2(11 downto 0) = CSR_MTVAL then
338
+ v_output.result := mtval;
339
+ mtval <= (mtval or csr_set_bits) and csr_clear_bits;
340
+ elsif input.operand2(11 downto 0) = CSR_MIP then
341
+ v_output.result := x"0000" & mip;
342
+ mip <= (mip or csr_set_bits(15 downto 0)) and csr_clear_bits(15 downto 0);
343
+ elsif input.operand2(11 downto 0) = CSR_MCYCLE then
344
+ v_output.result := mcycle;
345
+ v_mcycle := (mcycle or csr_set_bits) and csr_clear_bits;
346
+ elsif input.operand2(11 downto 0) = CSR_MINSTRET then
347
+ v_output.result := minstret;
348
+ v_minstret := (minstret or csr_set_bits) and csr_clear_bits;
349
+ elsif unsigned(CSR_MHPMCOUNTER3) <= unsigned(input.operand2(11 downto 0)) and unsigned(input.operand2(11 downto 0)) <= unsigned(CSR_MHPMCOUNTER31) then
350
+ v_output.result := (others => '0');
351
+ elsif input.operand2(11 downto 0) = CSR_MCYCLEH then
352
+ v_output.result := mcycleh;
353
+ v_mcycleh := (mcycleh or csr_set_bits) and csr_clear_bits;
354
+ elsif input.operand2(11 downto 0) = CSR_MINSTRETH then
355
+ v_output.result := minstreth;
356
+ v_minstreth := (minstreth or csr_set_bits) and csr_clear_bits;
357
+ elsif unsigned(CSR_MHPMCOUNTER3H) <= unsigned(input.operand2(11 downto 0)) and unsigned(input.operand2(11 downto 0)) <= unsigned(CSR_MHPMCOUNTER31H) then
358
+ v_output.result := (others => '0');
359
+ elsif unsigned(CSR_MHPMEVENT3) <= unsigned(input.operand2(11 downto 0)) and unsigned(input.operand2(11 downto 0)) <= unsigned(CSR_MHPMEVENT31) then
360
+ v_output.result := (others => '0');
361
+ elsif unsigned(CSR_MHPMEVENT3H) <= unsigned(input.operand2(11 downto 0)) and unsigned(input.operand2(11 downto 0)) <= unsigned(CSR_MHPMEVENT31H) then
362
+ v_output.result := (others => '0');
363
+ elsif input.csr_read_only = '1' then
364
+ -- read-only CSRs
365
+ if input.operand2(11 downto 0) = CSR_MVENDORID then
366
+ v_output.result := MVENDORID_VALUE;
367
+ elsif input.operand2(11 downto 0) = CSR_MARCHID then
368
+ v_output.result := MARCHID_VALUE;
369
+ elsif input.operand2(11 downto 0) = CSR_MIMPID then
370
+ v_output.result := MIMPID_VALUE;
371
+ elsif input.operand2(11 downto 0) = CSR_MHARTID then
372
+ v_output.result := MHARTID_VALUE;
373
+ elsif input.operand2(11 downto 0) = CSR_MCONFIGPTR then
374
+ v_output.result := MCONFIGPTR_VALUE;
375
+ else
376
+ -- trying to read non-existent CSR
377
+ has_exception := true;
378
+ exception_cause := EX_CAUSE_ILLEGAL_INSTRUCTION;
379
+ end if;
380
  else
381
+ -- trying to write to non-existent or read-only CSR
382
+ has_exception := true;
383
+ exception_cause := EX_CAUSE_ILLEGAL_INSTRUCTION;
384
  end if;
385
+ elsif input.operation = OP_MRET then
386
+ mstatus_mie <= mstatus_mpie;
387
+ mstatus_mpie <= '1';
388
+ v_jump := '1';
389
+ v_jump_address := mepc & "00";
390
+ -- TODO: reset mepc?
391
+ elsif input.operation = OP_ECALL then
392
+ has_exception := true;
393
+ exception_cause := EX_CAUSE_ENVIRONMENT_CALL;
394
+ elsif input.operation = OP_EBREAK then
395
+ has_exception := true;
396
+ exception_cause := EX_CAUSE_BREAKPOINT;
397
+ elsif input.operation = OP_LED then
398
+ led <= input.operand1(7 downto 0);
399
  else
400
+ assert false report "Unhandled operation value in execute stage" severity failure;
401
  end if;
402
+
403
+ v_output.destination_reg := input.destination_reg;
404
+ end if;
405
+
406
+ if v_jump = '1' and v_jump_address(1) /= '0' then
407
+ has_exception := true;
408
+ exception_cause := EX_CAUSE_INSTRUCTION_ADDRESS_MISALIGNED;
 
 
409
  end if;
410
 
411
+ if has_exception then
412
+ v_output := DEFAULT_EXECUTE_OUTPUT;
413
+ v_output.is_active := '1'; -- needed to trigger the next instruction
414
+ v_mem_req := DEFAULT_MEM_REQ;
415
+ v_jump := '1';
416
+ v_jump_address := mtvec_address & "00";
417
+ v_mcycle := v_mcycle_inc;
418
+ v_mcycleh := v_mcycleh_inc;
419
+ v_minstret := v_minstret_inc;
420
+ v_minstreth := v_minstreth_inc;
421
+ v_mepc := input.pc(31 downto 2);
422
+ v_mcause_int := '0';
423
+ v_mcause_code := exception_cause;
424
+ end if;
425
  end if;
426
 
427
  output <= v_output;
 
428
  mem_req <= v_mem_req;
 
429
  jump <= v_jump;
430
  jump_address <= v_jump_address(31 downto 1) & "0";
431
+ mcycle <= v_mcycle;
432
+ mcycleh <= v_mcycleh;
433
+ minstret <= v_minstret;
434
+ minstreth <= v_minstreth;
435
+ mepc <= v_mepc;
436
+ mcause_int <= v_mcause_int;
437
+ mcause_code <= v_mcause_code;
438
  end if;
439
  end process;
440
 
src/core/types.vhd CHANGED
@@ -33,6 +33,8 @@ package core_types is
33
  OP_CSRRS,
34
  OP_CSRRC,
35
  OP_MRET,
 
 
36
  OP_LED
37
  );
38
 
@@ -45,12 +47,14 @@ package core_types is
45
  type decode_output_t is record
46
  is_active: std_logic;
47
  is_invalid: std_logic;
 
48
  operation: operation_t;
49
  operand1: std_logic_vector(31 downto 0);
50
  operand2: std_logic_vector(31 downto 0);
51
  operand3: std_logic_vector(31 downto 0);
52
  destination_reg: std_logic_vector(4 downto 0);
53
  csr_read_only: std_logic;
 
54
  end record decode_output_t;
55
 
56
  type read_size_t is (SIZE_WORD, SIZE_HALFWORD, SIZE_BYTE);
 
33
  OP_CSRRS,
34
  OP_CSRRC,
35
  OP_MRET,
36
+ OP_ECALL,
37
+ OP_EBREAK,
38
  OP_LED
39
  );
40
 
 
47
  type decode_output_t is record
48
  is_active: std_logic;
49
  is_invalid: std_logic;
50
+ is_invalid_address: std_logic;
51
  operation: operation_t;
52
  operand1: std_logic_vector(31 downto 0);
53
  operand2: std_logic_vector(31 downto 0);
54
  operand3: std_logic_vector(31 downto 0);
55
  destination_reg: std_logic_vector(4 downto 0);
56
  csr_read_only: std_logic;
57
+ pc: std_logic_vector(31 downto 0);
58
  end record decode_output_t;
59
 
60
  type read_size_t is (SIZE_WORD, SIZE_HALFWORD, SIZE_BYTE);

...

src/core/constants.vhd CHANGED
@@ -80,6 +80,9 @@ package core_constants is
80
 
81
  constant MISA_VALUE: std_logic_vector(31 downto 0) := X"40000100"; -- 32-bit RVI
82
 
 
 
 
83
  constant EX_CAUSE_INSTRUCTION_ADDRESS_MISALIGNED: std_logic_vector(3 downto 0) := "0000";
84
  constant EX_CAUSE_INSTRUCTION_ACCESS_FAULT: std_logic_vector(3 downto 0) := "0001";
85
  constant EX_CAUSE_ILLEGAL_INSTRUCTION: std_logic_vector(3 downto 0) := "0010";
 
80
 
81
  constant MISA_VALUE: std_logic_vector(31 downto 0) := X"40000100"; -- 32-bit RVI
82
 
83
+ constant MTIME_ADDRESS: std_logic_vector(31 downto 0) := X"0200BFF8";
84
+ constant MTIMEH_ADDRESS: std_logic_vector(31 downto 0) := X"0200BFFC";
85
+
86
  constant EX_CAUSE_INSTRUCTION_ADDRESS_MISALIGNED: std_logic_vector(3 downto 0) := "0000";
87
  constant EX_CAUSE_INSTRUCTION_ACCESS_FAULT: std_logic_vector(3 downto 0) := "0001";
88
  constant EX_CAUSE_ILLEGAL_INSTRUCTION: std_logic_vector(3 downto 0) := "0010";
src/core/execute.vhd CHANGED
@@ -38,6 +38,8 @@ architecture rtl of execute is
38
  signal minstret: std_logic_vector(31 downto 0) := (others => '0');
39
  signal mcycleh: std_logic_vector(31 downto 0) := (others => '0');
40
  signal minstreth: std_logic_vector(31 downto 0) := (others => '0');
 
 
41
  begin
42
 
43
  process (clk)
@@ -53,6 +55,8 @@ begin
53
  variable v_mepc: std_logic_vector(29 downto 0);
54
  variable v_mcause_int: std_logic;
55
  variable v_mcause_code: std_logic_vector(3 downto 0);
 
 
56
 
57
  variable v_address, v_value: std_logic_vector(31 downto 0);
58
 
@@ -75,10 +79,17 @@ begin
75
  v_mcycle := v_mcycle_inc;
76
  v_mcycleh_inc := std_logic_vector(v_temp(63 downto 32));
77
  v_mcycleh := v_mcycleh_inc;
 
78
  v_mepc := mepc;
79
  v_mcause_int := mcause_int;
80
  v_mcause_code := mcause_code;
81
 
 
 
 
 
 
 
82
  has_exception := false;
83
  exception_cause := (others => '0');
84
 
@@ -244,54 +255,66 @@ begin
244
  exception_cause := EX_CAUSE_STORE_ACCESS_FAULT;
245
  end if;
246
  elsif input.operation = OP_SW then
247
- v_mem_req.active := '1';
248
- v_mem_req.write_enable := "1111";
249
  v_mem_req.address := input.operand1;
250
- v_mem_req.value := input.operand2;
251
 
252
- if v_address(1 downto 0) /= "00" then
253
- has_exception := true;
254
- exception_cause := EX_CAUSE_STORE_ADDRESS_MISALIGNED;
255
- elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
256
- has_exception := true;
257
- exception_cause := EX_CAUSE_STORE_ACCESS_FAULT;
258
- end if;
259
- elsif input.operation = OP_LB or input.operation = OP_LH or input.operation = OP_LW or input.operation = OP_LBU or input.operation = OP_LHU then
260
- v_address := input.operand1;
261
-
262
- v_output.use_mem := '1';
263
- v_output.mem_addr := v_address(1 downto 0);
264
-
265
- v_mem_req.active := '1';
266
- v_mem_req.address := v_address;
267
-
268
- if input.operation = OP_LB or input.operation = OP_LH then
269
- v_output.mem_sign_extend := '1';
270
- end if;
271
 
272
- if input.operation = OP_LB or input.operation = OP_LBU then
273
- v_output.mem_size := SIZE_BYTE;
274
- if not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
275
- has_exception := true;
276
- exception_cause := EX_CAUSE_LOAD_ACCESS_FAULT;
277
- end if;
278
- elsif input.operation = OP_LH or input.operation = OP_LHU then
279
- v_output.mem_size := SIZE_HALFWORD;
280
- if v_address(0) /= '0' then
281
  has_exception := true;
282
- exception_cause := EX_CAUSE_LOAD_ADDRESS_MISALIGNED;
283
  elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
284
  has_exception := true;
285
- exception_cause := EX_CAUSE_LOAD_ACCESS_FAULT;
286
  end if;
 
 
 
 
 
 
 
 
287
  else
288
- v_output.mem_size := SIZE_WORD;
289
- if v_address(1 downto 0) /= "00" then
290
- has_exception := true;
291
- exception_cause := EX_CAUSE_LOAD_ADDRESS_MISALIGNED;
292
- elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
293
- has_exception := true;
294
- exception_cause := EX_CAUSE_LOAD_ACCESS_FAULT;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
295
  end if;
296
  end if;
297
  elsif input.operation = OP_CSRRW or input.operation = OP_CSRRS or input.operation = OP_CSRRC then
@@ -416,6 +439,8 @@ begin
416
  v_jump_address := mtvec_address & "00";
417
  v_mcycle := v_mcycle_inc;
418
  v_mcycleh := v_mcycleh_inc;
 
 
419
  v_minstret := v_minstret_inc;
420
  v_minstreth := v_minstreth_inc;
421
  v_mepc := input.pc(31 downto 2);
@@ -430,6 +455,8 @@ begin
430
  jump_address <= v_jump_address(31 downto 1) & "0";
431
  mcycle <= v_mcycle;
432
  mcycleh <= v_mcycleh;
 
 
433
  minstret <= v_minstret;
434
  minstreth <= v_minstreth;
435
  mepc <= v_mepc;
 
38
  signal minstret: std_logic_vector(31 downto 0) := (others => '0');
39
  signal mcycleh: std_logic_vector(31 downto 0) := (others => '0');
40
  signal minstreth: std_logic_vector(31 downto 0) := (others => '0');
41
+ signal mtime: std_logic_vector(31 downto 0) := (others => '0');
42
+ signal mtimeh: std_logic_vector(31 downto 0) := (others => '0');
43
  begin
44
 
45
  process (clk)
 
55
  variable v_mepc: std_logic_vector(29 downto 0);
56
  variable v_mcause_int: std_logic;
57
  variable v_mcause_code: std_logic_vector(3 downto 0);
58
+ variable v_mtime_inc, v_mtimeh_inc: std_logic_vector(31 downto 0);
59
+ variable v_mtime, v_mtimeh: std_logic_vector(31 downto 0);
60
 
61
  variable v_address, v_value: std_logic_vector(31 downto 0);
62
 
 
79
  v_mcycle := v_mcycle_inc;
80
  v_mcycleh_inc := std_logic_vector(v_temp(63 downto 32));
81
  v_mcycleh := v_mcycleh_inc;
82
+
83
  v_mepc := mepc;
84
  v_mcause_int := mcause_int;
85
  v_mcause_code := mcause_code;
86
 
87
+ v_temp := unsigned(mtimeh & mtime) + 1;
88
+ v_mtime_inc := std_logic_vector(v_temp(31 downto 0));
89
+ v_mtime := v_mtime_inc;
90
+ v_mtimeh_inc := std_logic_vector(v_temp(63 downto 32));
91
+ v_mtimeh := v_mtimeh_inc;
92
+
93
  has_exception := false;
94
  exception_cause := (others => '0');
95
 
 
255
  exception_cause := EX_CAUSE_STORE_ACCESS_FAULT;
256
  end if;
257
  elsif input.operation = OP_SW then
 
 
258
  v_mem_req.address := input.operand1;
 
259
 
260
+ if v_address = MTIME_ADDRESS then
261
+ v_mtime := input.operand2;
262
+ elsif v_address = MTIMEH_ADDRESS then
263
+ v_mtimeh := input.operand2;
264
+ else
265
+ v_mem_req.active := '1';
266
+ v_mem_req.write_enable := "1111";
267
+ v_mem_req.value := input.operand2;
 
 
 
 
 
 
 
 
 
 
 
268
 
269
+ if v_address(1 downto 0) /= "00" then
 
 
 
 
 
 
 
 
270
  has_exception := true;
271
+ exception_cause := EX_CAUSE_STORE_ADDRESS_MISALIGNED;
272
  elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
273
  has_exception := true;
274
+ exception_cause := EX_CAUSE_STORE_ACCESS_FAULT;
275
  end if;
276
+ end if;
277
+ elsif input.operation = OP_LB or input.operation = OP_LH or input.operation = OP_LW or input.operation = OP_LBU or input.operation = OP_LHU then
278
+ v_address := input.operand1;
279
+
280
+ if input.operation = OP_LW and v_address = MTIME_ADDRESS then
281
+ v_output.result := mtime;
282
+ elsif input.operation = OP_LW and v_address = MTIMEH_ADDRESS then
283
+ v_output.result := mtimeh;
284
  else
285
+ v_output.use_mem := '1';
286
+ v_output.mem_addr := v_address(1 downto 0);
287
+ v_mem_req.active := '1';
288
+ v_mem_req.address := v_address;
289
+
290
+ if input.operation = OP_LB or input.operation = OP_LH then
291
+ v_output.mem_sign_extend := '1';
292
+ end if;
293
+
294
+ if input.operation = OP_LB or input.operation = OP_LBU then
295
+ v_output.mem_size := SIZE_BYTE;
296
+ if not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
297
+ has_exception := true;
298
+ exception_cause := EX_CAUSE_LOAD_ACCESS_FAULT;
299
+ end if;
300
+ elsif input.operation = OP_LH or input.operation = OP_LHU then
301
+ v_output.mem_size := SIZE_HALFWORD;
302
+ if v_address(0) /= '0' then
303
+ has_exception := true;
304
+ exception_cause := EX_CAUSE_LOAD_ADDRESS_MISALIGNED;
305
+ elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
306
+ has_exception := true;
307
+ exception_cause := EX_CAUSE_LOAD_ACCESS_FAULT;
308
+ end if;
309
+ else
310
+ v_output.mem_size := SIZE_WORD;
311
+ if v_address(1 downto 0) /= "00" then
312
+ has_exception := true;
313
+ exception_cause := EX_CAUSE_LOAD_ADDRESS_MISALIGNED;
314
+ elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
315
+ has_exception := true;
316
+ exception_cause := EX_CAUSE_LOAD_ACCESS_FAULT;
317
+ end if;
318
  end if;
319
  end if;
320
  elsif input.operation = OP_CSRRW or input.operation = OP_CSRRS or input.operation = OP_CSRRC then
 
439
  v_jump_address := mtvec_address & "00";
440
  v_mcycle := v_mcycle_inc;
441
  v_mcycleh := v_mcycleh_inc;
442
+ v_mtime := v_mtime_inc;
443
+ v_mtimeh := v_mtimeh_inc;
444
  v_minstret := v_minstret_inc;
445
  v_minstreth := v_minstreth_inc;
446
  v_mepc := input.pc(31 downto 2);
 
455
  jump_address <= v_jump_address(31 downto 1) & "0";
456
  mcycle <= v_mcycle;
457
  mcycleh <= v_mcycleh;
458
+ mtime <= v_mtime;
459
+ mtimeh <= v_mtimeh;
460
  minstret <= v_minstret;
461
  minstreth <= v_minstreth;
462
  mepc <= v_mepc;

...

src/bram.vhd CHANGED
@@ -2,538 +2,543 @@ library ieee;
2
  use ieee.std_logic_1164.all;
3
  use ieee.std_logic_unsigned.all;
4
 
 
 
 
 
5
  entity bram is
6
  port(
7
  clka: in std_logic;
8
  ena: in std_logic;
9
  wea: in std_logic_vector(3 downto 0);
10
- addra: in std_logic_vector(11 downto 0);
11
  dia: in std_logic_vector(31 downto 0);
12
  doa: out std_logic_vector(31 downto 0);
13
  clkb: in std_logic;
14
  enb: in std_logic;
15
- addrb: in std_logic_vector(11 downto 0);
16
  dob: out std_logic_vector(31 downto 0)
17
  );
18
  end bram;
19
 
20
  architecture rtl of bram is
 
21
  type ram_type is array (0 to 4095) of std_logic_vector(31 downto 0);
22
  shared variable RAM: ram_type := (
23
- X"008000ef", X"0000006f", X"000025b7", X"05800693", X"30858593", X"00b685b3", X"00000513", X"03200793",
24
- X"06300713", X"00069603", X"00c787b3", X"0207d063", X"06478793", X"fe07cee3", X"0017b613", X"00268693",
25
- X"00c50533", X"fed590e3", X"00008067", X"fef756e3", X"f9c78793", X"ff9ff06f", X"001c0011", X"ffe70008",
26
- X"ffd00021", X"002a0002", X"fff60027", X"ffe6001d", X"002c0018", X"ffffffdb", X"0002fffc", X"fffaffd5",
27
- X"001dffd4", X"ffd0002f", X"ffee000d", X"001e0012", X"0023ffd4", X"00020012", X"0032ffda", X"0012ffe4",
28
- X"00200015", X"0012fff8", X"0018ffdf", X"fffa002e", X"0027fff7", X"00300007", X"ffe60029", X"0001ffcc",
29
- X"ffd8ffff", X"0012ffc4", X"ffa9ffee", X"ffaa0049", X"0045ffd3", X"ffe1ffe8", X"fff4ffbb", X"0054ffb1",
30
- X"00180053", X"ffb50046", X"ffdaffaf", X"001a0018", X"ffd0ffe6", X"fff6ffcc", X"0004ffa6", X"ffa80036",
31
- X"fffd001f", X"ffbd005b", X"ffc30041", X"003fffe0", X"ffce0053", X"004bffa6", X"ffe9ffe6", X"ffc3ffe6",
32
- X"ffbfffa7", X"003c00fa", X"ffd1028c", X"00320058", X"ff8fffc3", X"03370024", X"fcaf001a", X"001bffd2",
33
- X"0029003a", X"ffd00044", X"000fffd6", X"0031ffea", X"0142004e", X"ffe4001c", X"ffdfffa1", X"ffe40038",
34
- X"003f0025", X"fff8000d", X"0034ffc7", X"ffdcffc0", X"ffe4fff8", X"0031fec7", X"fff3ffa9", X"038f0018",
35
- X"ff8bffdd", X"ffbf003c", X"fffd0022", X"00360034", X"fe8d0055", X"fff8ffbd", X"ffea029c", X"00330060",
36
- X"ffc90008", X"001f0045", X"ffcf0053", X"00a5fd22", X"00550023", X"003cffd3", X"0020014c", X"ffe10024",
37
- X"00e9ffea", X"0050fd42", X"0361ffe9", X"ffa2fffa", X"00120039", X"03bb00e1", X"ffd10022", X"ff9f0037",
38
- X"0004fff7", X"002b003f", X"0012ffff", X"004b0007", X"ffb4ff20", X"004f000a", X"ffa5fc7e", X"fffdffd1",
39
- X"0013ffb6", X"ffd30032", X"0036002e", X"001c0024", X"ffe50008", X"00290037", X"021cffd7", X"003a003c",
40
- X"fffd004c", X"ffd3fcc1", X"ffb3ffb2", X"ffcefffe", X"fdc40018", X"ffa20003", X"ffcbfe03", X"022fffdd",
41
- X"fedc0015", X"0010000a", X"032cff9e", X"000affd8", X"0010004a", X"005c00ff", X"ffb7029e", X"ffc50038",
42
- X"fc56ffd7", X"ffacffc2", X"0059fffb", X"01a7ffe9", X"ff5e003e", X"fd46ffc7", X"002fffb0", X"fc7dfe63",
43
- X"005cffbb", X"ff6f0142", X"0029003b", X"ffd90027", X"ffde0009", X"ffc6ffe4", X"ffc5022f", X"ffedffa7",
44
- X"005efff3", X"004d0022", X"ffa5fffe", X"ffa2ffaa", X"ffc1ffbd", X"fffb01ae", X"00460005", X"ffbd001e",
45
- X"ffe20043", X"ff7dffd9", X"0013ffeb", X"ffa00062", X"02620024", X"ffb80036", X"ffcfffa6", X"ffb3000b",
46
- X"ffe2ffa3", X"004ffffb", X"003b0043", X"003fffe3", X"ffca0042", X"ff9bfdde", X"0004ffe4", X"0060fffa",
47
- X"0143ffff", X"ffea01b3", X"ffb0ffb6", X"02920036", X"ffd20058", X"ffe90015", X"ffacffa7", X"00030048",
48
- X"0028003c", X"ffcf0030", X"fffb0001", X"002eff3d", X"02aeffec", X"ffb00058", X"00510032", X"ffbdffe1",
49
- X"fe72000f", X"fffffef3", X"fc2efd2e", X"ff670035", X"003d0027", X"02050007", X"ffedffe8", X"002d0013",
50
- X"00460087", X"004303b6", X"fd60fef5", X"03800029", X"ffdfffbf", X"03730023", X"ffe5ffb8", X"ffafffaa",
51
- X"ffa90051", X"0058000d", X"0034ffd0", X"ffccffd1", X"fd730075", X"ffa8ffdc", X"ffb9000c", X"00400019",
52
- X"fff902ef", X"0256ffdf", X"0036ff9e", X"02fe001e", X"ffc4000f", X"ffff02b7", X"0027ffc8", X"ff9e0010",
53
- X"00630065", X"fdccfeeb", X"ffeb0029", X"ffe9ffb1", X"00f60309", X"02330025", X"03100028", X"0038ffb0",
54
- X"ffe1ffbb", X"00170003", X"ffa1feb5", X"003ffdcd", X"ffacfffb", X"0010ffd0", X"ffc10054", X"ffef004e",
55
- X"ffe2ffc3", X"012d0003", X"0080001a", X"fff3fc24", X"0057fff2", X"0055000f", X"0030ffc3", X"0041fdb5",
56
- X"003f0048", X"02ddfd0e", X"0248ffb1", X"0255ffaf", X"ffd8ffa2", X"ffa2ffbe", X"000f005e", X"0018fff1",
57
- X"03270043", X"00560052", X"0014ffbe", X"005fffd7", X"0046001a", X"fffd01ae", X"ffd10003", X"fc86001f",
58
- X"fff90201", X"0027003d", X"0376ffb5", X"0056ff9f", X"008c003c", X"0031ffa9", X"0017002e", X"000afffc",
59
- X"ffc3feec", X"004c0018", X"ffd6ffc5", X"fff8fdee", X"fd480038", X"ffdaffad", X"0039fede", X"0063ffd9",
60
- X"00370047", X"001cfe83", X"ffe6ffb5", X"004d0016", X"ffa2fffc", X"ffbc0044", X"000bff0a", X"ffcaffbf",
61
- X"ffc6ffd2", X"ff9e0038", X"ffa2005e", X"001dfe53", X"00850363", X"00110029", X"fff7ffc6", X"fff40398",
62
- X"ffe40001", X"0301ffb8", X"0012001f", X"00210052", X"fe890206", X"ff9effb2", X"fff0005c", X"001fffd4",
63
- X"0041ffcd", X"ffef0028", X"fc910034", X"000e0003", X"001c017e", X"00170026", X"0365021b", X"ffe9ffd2",
64
- X"fffdffa9", X"036e0316", X"ffd70233", X"0032ffbd", X"00370014", X"ffd1002a", X"ffb2ffd4", X"002cfd5d",
65
- X"ffeafdbe", X"0015fccb", X"0012001c", X"002afd56", X"00080034", X"fc26ffbe", X"ffbdffb0", X"ffda0006",
66
- X"ffdaffb0", X"ffe0ffab", X"005fffef", X"0019fffd", X"0013ffed", X"00b2ffc8", X"0037ffea", X"fc3afe9d",
67
- X"fff8032a", X"ffc8fe7c", X"003301e5", X"ffceffe4", X"ffc0ffb1", X"ffccffe0", X"003dfebd", X"fdbdfebe",
68
- X"01ddffdb", X"002e01fc", X"fda103cc", X"ffabfc69", X"0019fdf7", X"00200031", X"01dd0017", X"005c0047",
69
- X"fe2cffca", X"fffb003b", X"feee0126", X"00410014", X"000d011f", X"ffb9fca8", X"0047fea8", X"ffc8004d",
70
- X"014d005a", X"ffb10038", X"011e0004", X"ffb20059", X"003a0014", X"0336fec7", X"0005fffb", X"0052005c",
71
- X"00290011", X"0032ffda", X"fc8effb9", X"004bffb5", X"ffd5012a", X"0005002d", X"004a0015", X"003affc9",
72
- X"0279ffdc", X"002b0039", X"fff8000f", X"0178005d", X"0032fcf3", X"ffbc0037", X"ffef0038", X"0034ffb9",
73
- X"004901b3", X"ffba0045", X"03520061", X"ffce002c", X"003efff8", X"fef00012", X"0055000f", X"00d6fff2",
74
- X"ffd2002e", X"02efffcd", X"016b0025", X"ffaeffee", X"ffbc0120", X"fffdffa2", X"00520002", X"0020ffeb",
75
- X"ffdb0052", X"ffdf0025", X"00340051", X"004a0033", X"ffcd004b", X"0034ffd4", X"0223002b", X"00b902f1",
76
- X"0053004e", X"ffea0036", X"ffb90019", X"ffd1ffe0", X"002e003c", X"ffaf0050", X"037effdd", X"0045000e",
77
- X"004affca", X"fffaffe8", X"fdcb0005", X"ffa3ffe2", X"001cfff9", X"ffd9ffab", X"003bffc1", X"fea7ffe2",
78
- X"004bfd5e", X"fc74fe9e", X"000a026e", X"ffd00004", X"fffe0037", X"fffd0063", X"ffe1ffff", X"003cffca",
79
- X"00540003", X"00e40028", X"ffa1005c", X"ffceff4f", X"003cffb9", X"001bffda", X"002f004b", X"000cff82",
80
- X"0047011f", X"ffd9005f", X"01b9fff7", X"ff62ffa4", X"00050024", X"00330031", X"fe09036d", X"ffda00f1",
81
- X"03cf004a", X"ffef0031", X"ffcb0013", X"001a0035", X"ffabffd7", X"01040016", X"ffedfff9", X"ffd0ffba",
82
- X"0009010e", X"ffa80047", X"0057ffa9", X"000e0002", X"ffbd0054", X"ffdaffdf", X"ffdb004b", X"fff3000d",
83
- X"ffff002b", X"00070033", X"ffe3003f", X"fdcd000f", X"ffed003a", X"feed0032", X"0047fff6", X"ffad002a",
84
- X"ffc2ffec", X"ffe60058", X"ffffff9d", X"ffa1005d", X"ffc2ffdc", X"ffc3001d", X"0059002b", X"0041fff6",
85
- X"0040030d", X"00100054", X"0013004c", X"fd260062", X"0399ffc1", X"fffc0053", X"ffacfff0", X"ffc7004d",
86
- X"002e005b", X"fdde0059", X"00370011", X"ffe10033", X"ffc1ffa4", X"0010002f", X"00170014", X"0012ffd5",
87
- X"ffdd0014", X"02960061", X"001a001c", X"ffeefff0", X"00040058", X"fffd001d", X"0084ffcb", X"ffdc0015",
88
- X"005fffc5", X"ffba000f", X"0023ffb0", X"ffbe0042", X"001b003f", X"0044fe9a", X"01a7ffe9", X"ffe7003e",
89
- X"ff2c003f", X"0032000c", X"0010ffe5", X"00240017", X"fff3ff9e", X"00340055", X"004efed2", X"ff3a018e",
90
- X"ffce0060", X"0052ffd2", X"ffb0ff7f", X"0005fff3", X"ffa7ffb7", X"feb1ffc6", X"00580019", X"fff1ff5c",
91
- X"005f003d", X"00010045", X"0110001e", X"ffb1ff23", X"001c00a5", X"0006002b", X"0052ffa0", X"fdba0052",
92
- X"00520012", X"ffbafd83", X"fe29ffa3", X"ffd7fd87", X"ff040061", X"003f003b", X"0010ffda", X"003dffd7",
93
- X"01510050", X"0045005e", X"0024ffc6", X"0053000f", X"003e039c", X"fff2ffd0", X"ffd5ffd8", X"0043002e",
94
- X"ffecffdf", X"001c0017", X"0009fd1f", X"ffb3004d", X"00220035", X"ffbaffa9", X"00430046", X"03d3ffcf",
95
- X"ffa2ffa9", X"fd43002d", X"003affee", X"ffd8003b", X"004c0051", X"004d00f3", X"fffb021c", X"000c0365",
96
- X"00570385", X"fd800028", X"fdf60003", X"ffd1ff7a", X"ffca0036", X"ffed0374", X"000efef7", X"002b008f",
97
- X"0013fd8b", X"004e0056", X"fff9ffd1", X"0037ffc5", X"fe6e000b", X"0109ffe3", X"ffc2ffa6", X"0063000b",
98
- X"fcac0065", X"005cffd0", X"ffb70051", X"0001ffd7", X"ffc00037", X"ffe1ffec", X"ff40ff57", X"00600041",
99
- X"005a0214", X"0021000f", X"001000ec", X"003f005e", X"00130002", X"003303b5", X"00060014", X"002dffb9",
100
- X"fffe0348", X"029e005c", X"01aaffe6", X"ffc90012", X"fcde003f", X"005b0059", X"003cffbf", X"ffa10001",
101
- X"fff8ff9f", X"ffed000f", X"004e003a", X"ffa7ffe0", X"ffd0001b", X"ffa50044", X"00cffd5f", X"fc19fffe",
102
- X"fc1afffe", X"0042ffbe", X"001e0016", X"0053ffdd", X"ff6affa3", X"ffd90005", X"ffa8ffe9", X"0057ffe4",
103
- X"0044fe29", X"ffadfe2c", X"ffabffef", X"0047ffd9", X"0053fc4d", X"0024ffdf", X"00190059", X"ffc70381",
104
- X"0043ffd8", X"ffed02dd", X"0051fd0c", X"00350351", X"ffceffa7", X"ff1e0023", X"ffbc026a", X"fc4effae",
105
- X"fffcfd1a", X"ff9effc6", X"0046000d", X"0055ffaf", X"fff6000f", X"002bffd7", X"00c203c8", X"0242002e",
106
- X"ffc60016", X"0063fd05", X"fff60035", X"000effeb", X"001a0182", X"ffffffe7", X"ffa7fef2", X"004fffec",
107
- X"ffab0042", X"ffff00ec", X"ffd30054", X"ffe90044", X"ffca0036", X"003ffff7", X"023effca", X"00be0006",
108
- X"00baffba", X"ffbd0051", X"0079ff36", X"ffa2030d", X"fd29005e", X"ffb0fee8", X"00610057", X"ffbe0052",
109
- X"01cd0057", X"ffdbfd07", X"002bfd78", X"003cff88", X"0053005f", X"0030ffd5", X"0019fffa", X"ffb7fff7",
110
- X"ffb0fd1e", X"ffef0011", X"0002fff0", X"ffc3fff5", X"ffc503b1", X"0048fe6e", X"ffa60207", X"035bffdb",
111
- X"005cffe6", X"ffc5000d", X"02c9fef2", X"0041ffac", X"ffca0023", X"00510036", X"ff14ff37", X"ffdf0059",
112
- X"00520012", X"0141fff3", X"ff40fff8", X"004bfff8", X"00380019", X"fffb002c", X"01940370", X"00040011",
113
- X"ffcdffcf", X"fff6000a", X"00320048", X"ff75fffd", X"03ceffb0", X"02ba003b", X"005a0029", X"ffcbfc85",
114
- X"0055ffee", X"000dffb1", X"fddefd95", X"03260047", X"ffec0045", X"ffaaffb0", X"00510005", X"0040ffc0",
115
- X"0058000c", X"0011feb5", X"0021fffd", X"00150117", X"fff9fd6d", X"004bffe7", X"004b02dc", X"000901ed",
116
- X"0072fd81", X"0052ffac", X"ff790206", X"005affae", X"fd2c01e2", X"ffe10007", X"fff4ffd2", X"0021005c",
117
- X"00bdffd8", X"fd16004d", X"019c0022", X"03bafff7", X"fffdfc4f", X"002bffd8", X"00500014", X"0006ffaf",
118
- X"fe500010", X"fffafff7", X"ffa8ffa2", X"ffbbffd5", X"03a2005b", X"fd8f001d", X"0049ff9e", X"0014ffaa",
119
- X"0009022d", X"0028ffc9", X"ffd6000f", X"003f002a", X"00390044", X"001a003a", X"ffc4ffa3", X"00060005",
120
- X"ffbcffdd", X"ffa9ffe5", X"ffaf0036", X"ff7e000e", X"028afff1", X"ffea005f", X"ffb1feea", X"0040febf",
121
- X"00600024", X"0005ffd2", X"003effc5", X"0052002a", X"0131000d", X"ffdaffc2", X"0055000f", X"ff54000f",
122
- X"fffcff7f", X"ffc2005a", X"ffadffda", X"ffabffe0", X"ffa70059", X"fff303c3", X"00410055", X"ffd5ff9e",
123
- X"fd090048", X"00030034", X"003bfc31", X"ffb1fff5", X"005aff23", X"0051001d", X"0292ffed", X"001c0047",
124
- X"ffd3ffda", X"ff3b002d", X"fff60007", X"03790060", X"02cdffab", X"ffb4003b", X"0003031d", X"0018ffe8",
125
- X"0131ffe8", X"ffd20041", X"ffb3fd91", X"ffe301ad", X"ff7d000d", X"000effae", X"010affab", X"ffaeffcb",
126
- X"fff90038", X"0215005b", X"ffd30043", X"ffa4ffb5", X"fffb0067", X"0013000e", X"fe67005a", X"ffda03aa",
127
- X"0048003a", X"00490039", X"ffc90030", X"00220015", X"035cffcc", X"fc74fff8", X"ffacffc0", X"000bffcc",
128
- X"fff7004d", X"ff9f0015", X"ffda0061", X"fc2b0026", X"0055ffc8", X"ffd6fffa", X"001dff19", X"0059ffa8",
129
- X"01780001", X"001b0018", X"0056ffe5", X"0040000e", X"00010060", X"001f0027", X"0041fff7", X"ffa1ffa5",
130
- X"0284fc7b", X"00090038", X"ffef0008", X"00090015", X"005b004f", X"003efedf", X"00150047", X"fd310023",
131
- X"02550016", X"0056fff5", X"00490058", X"00200020", X"0052ffac", X"00030002", X"fff40009", X"0016ffe0",
132
- X"ffcbffa6", X"ffef0035", X"002affad", X"ffb8001e", X"fc580026", X"026dfe0a", X"0041ffe7", X"038803a7",
133
- X"ffa6005a", X"ffd1ffcb", X"0027ffed", X"022dffd7", X"001affc2", X"ffe9013c", X"0027ffe0", X"fff100d7",
134
- X"0017ffd3", X"ffd10021", X"fff0ffb2", X"fc500014", X"ffed0036", X"ffe70013", X"ffccffe9", X"0035015b",
135
- X"025b0060", X"ffecff9d", X"005703e7", X"fffeffbe", X"004c0017", X"fffc0003", X"fdcb0045", X"02e90029",
136
- X"0042fcac", X"01f7fffe", X"fc220063", X"0136005a", X"005efffb", X"0006ffdc", X"003dfda3", X"025fffe6",
137
- X"0002ffa3", X"fc6d03d9", X"fd45000f", X"0053ffff", X"fed8ffa9", X"00330031", X"fe950045", X"001cfd22",
138
- X"ffdd0008", X"000cfdd4", X"027bffe3", X"0001ffdc", X"ff9e002e", X"ffe50034", X"0046fd7d", X"001802e3",
139
- X"fc41fffc", X"001e01d6", X"ffcaffd2", X"004fffd4", X"0043fde9", X"ffd502a4", X"ffa60062", X"002cfff8",
140
- X"ffa4ffcc", X"ffa5fce1", X"fffefd9e", X"00340002", X"007b002d", X"0042ffec", X"00430043", X"03b2005a",
141
- X"0027005b", X"00410045", X"003dffcd", X"ffc8002e", X"ffa80058", X"fffbffe1", X"00d4ffb4", X"ffc3fe49",
142
- X"00010063", X"ffd9ffcf", X"ffcbffca", X"fd680046", X"003d0239", X"0044fff7", X"00130051", X"ffc20062",
143
- X"0033ffce", X"ffd5fff6", X"ffcd01e5", X"ff0a0052", X"ffabfdd6", X"0035000e", X"ffff002f", X"ffbe0048",
144
- X"005f0042", X"ffae0057", X"fff7ffbc", X"fe890046", X"002d0025", X"02890033", X"ffe9005a", X"fd84ffe1",
145
- X"00140050", X"ff31ffa3", X"0020ffe0", X"ffeaffaf", X"ffa80003", X"004fffea", X"ff94001f", X"01540008",
146
- X"008dffaf", X"001b0049", X"005b0135", X"ff90ffa8", X"0053004f", X"fe2b0133", X"005502cb", X"ffe7003f",
147
- X"ffb40009", X"0038fceb", X"fef2ffda", X"ffe9fff9", X"ffc4ff9f", X"001fffd5", X"0048ffe1", X"ffd903c7",
148
- X"ffe90062", X"ffb60039", X"00610062", X"000c02eb", X"ffbc0038", X"ffc3003d", X"0212ffcf", X"ffcf0042",
149
- X"0024ff9e", X"001f0040", X"03530012", X"004dffb3", X"ffe800d4", X"000bffa8", X"fcb90008", X"ffb2ffee",
150
- X"0016ffac", X"0038ffea", X"002fffc8", X"0048ffd1", X"ffacffb8", X"ffd2ffba", X"00120015", X"ffc4feeb",
151
- X"ffe9fffe", X"ffe4001d", X"ffedffb2", X"ffba0016", X"03e40047", X"000e0056", X"004a001a", X"004f0015",
152
- X"fff3ffc7", X"ffd4ffce", X"000f0040", X"ffe0ff8d", X"ff75ffe5", X"ffc2fc7a", X"0038ffaf", X"004d0004",
153
- X"ffaf003c", X"005effb7", X"ffdbffa2", X"004500e5", X"ffcbffe7", X"023effad", X"ffe10359", X"fdc3ff81",
154
- X"005c01fc", X"fd72fd16", X"000cffcd", X"ffdc004b", X"01360300", X"0055001e", X"fcb1ffd2", X"ffc2ffb0",
155
- X"0137002a", X"03190103", X"0051ffd2", X"02eb0021", X"ffb501a6", X"0006004b", X"0029fffa", X"ffa4fc4b",
156
- X"0044ff9b", X"001cffb5", X"ffca01d1", X"ff9f0042", X"0032ffc9", X"ffa8026f", X"ffa2fc58", X"fdc6ffdd",
157
- X"ffc30005", X"003e0043", X"0038ffdc", X"002bffa8", X"ffaf000b", X"ffecffd1", X"0010fe06", X"02d7fff0",
158
- X"ffdeffc9", X"ffb8fcb8", X"fff9ffed", X"ffa00060", X"0017ffe9", X"ffa20036", X"ffe4ffa2", X"fffbffd0",
159
- X"000bfff8", X"ffecffa8", X"0012026c", X"0010ffde", X"00600068", X"00360026", X"fff90198", X"ffecffe8",
160
- X"ffb8005b", X"ffcd0373", X"ff52003f", X"0008ffa7", X"01befff8", X"ffaf0044", X"fe6fffd2", X"fff7ffb3",
161
- X"ffe6ffaa", X"004dfce8", X"033500a3", X"005bfcb0", X"003cfd7e", X"ffad001d", X"fe060047", X"ffb4ffcb",
162
- X"ff72005d", X"fffafc49", X"000fffa5", X"ffa1004d", X"fcf80048", X"ffc2ffa0", X"0352ffc9", X"ffc0ffb8",
163
- X"fffe0003", X"005d0002", X"ffbc0027", X"00080024", X"ffdfffc7", X"fe230052", X"01b5004d", X"ffa2003f",
164
- X"0002003b", X"ffdeffd8", X"ffe7ffbf", X"00490061", X"ffff001b", X"ffacfff2", X"004b02d4", X"005bffa5",
165
- X"ffc1016b", X"ffe30129", X"01ffffb1", X"0022016e", X"001b0022", X"0031003c", X"0112fe8e", X"ff840032",
166
- X"0005fffb", X"0005fffb", X"ffd2005b", X"ffa8ffc7", X"ffe2feae", X"0042fffa", X"001f004d", X"ffc7ffd5",
167
- X"004f0012", X"ffde0005", X"0226ffbc", X"003300c7", X"ffa101ef", X"ffcd004a", X"001fffe9", X"ff9dffad",
168
- X"ffcf02d3", X"ffe4ffb9", X"004cff84", X"0060ffb8", X"0244ffee", X"ffdfff9d", X"00410046", X"004affd9",
169
- X"fe2affa5", X"00410060", X"ffb0ffec", X"ffafffed", X"001dffdc", X"005affa3", X"001d002c", X"001c00d1",
170
- X"ffff0003", X"ff95ffd3", X"0060ffdf", X"0008000e", X"ffd50109", X"ffe8ffdf", X"00020062", X"fe650219",
171
- X"ffa3004d", X"feb40122", X"000c0014", X"0374ffac", X"fd3effd9", X"00100008", X"0017ffb1", X"fd28ffe9",
172
- X"0005ffb8", X"ff9ffffb", X"ffde0033", X"0039ffec", X"0131ffc2", X"0005ffcd", X"fff2fe10", X"028e0028",
173
- X"0047ffda", X"0012ffa7", X"001100b7", X"0004ffbe", X"ffb5003e", X"003c000f", X"004f0015", X"ffb70020",
174
- X"0034fff9", X"fff8fec7", X"fcabfffa", X"ffeffff9", X"ffb80048", X"ffcefff2", X"ffa50033", X"0012005b",
175
- X"ffa3fff4", X"ffdcffc0", X"0024ffe9", X"ffe6fff3", X"fffbffc2", X"fc510125", X"0011ffce", X"005f004f",
176
- X"0056ffeb", X"0008ff05", X"016affae", X"003c0003", X"0030ffc1", X"000b0001", X"ffccffc4", X"ffadff1b",
177
- X"ffb1002b", X"fffbffec", X"039fffb5", X"ffaeffe5", X"fff2010a", X"003f001e", X"00abffde", X"ffbcffe0",
178
- X"0007005d", X"00b1fff4", X"0015ffaa", X"ffbbffe1", X"ffabfec2", X"0046ffb9", X"ffde0048", X"0050ff9f",
179
- X"0009ff8b", X"0063005b", X"ffc0ff9d", X"ffcd004a", X"004fffc4", X"0332ffd6", X"0266ffca", X"ffedfd49",
180
- X"ffddfc2d", X"ffcdfe1a", X"ffe40051", X"0013ffa4", X"000dffe3", X"000cffae", X"ffa10063", X"01250035",
181
- X"0026ffa1", X"fed2ffcb", X"000a0013", X"002fffc7", X"004a0019", X"ffbf0035", X"ffd7000d", X"ffbdffbc",
182
- X"ffe7ffba", X"ffa6ffce", X"02fbffa7", X"ffd0035f", X"0052ffbd", X"ff9effc6", X"ffa1fde7", X"002d0025",
183
- X"ffe602cc", X"fee9ff9e", X"ffc5ffbe", X"ffe8ffb5", X"001e01a8", X"ffd3000f", X"ffb3ffba", X"0019fe9f",
184
- X"ffc80023", X"ffcf0060", X"0015fd11", X"ffd5002f", X"ffc6ffbd", X"001f0048", X"0036ffaa", X"0364001d",
185
- X"0019ffbc", X"002a005a", X"00590036", X"ffb7ffe5", X"019c0021", X"ffa9003e", X"0016ffd1", X"ffbeffcb",
186
- X"ffb70060", X"ff9d0001", X"03100014", X"000d031b", X"fd3cfd9b", X"0045ffc3", X"00530011", X"fddeffca",
187
- X"0321031f", X"ffe1ffac", X"ffeaffb2", X"ffd50059", X"003b004a", X"fc71ffc0", X"000b0035", X"000b015b",
188
- X"0044000e", X"ffe10007", X"fe0bffbb", X"0063ff9e", X"fe7cffab", X"00080028", X"00050185", X"03670041",
189
- X"ffc3fce2", X"001a0036", X"002fffe6", X"005fffdf", X"0324ffad", X"03b4001a", X"0005fff7", X"fff4004b",
190
- X"ffd3ffee", X"0009ffee", X"010a0009", X"00370022", X"ffa20053", X"ff470029", X"ffb6ffd1", X"005bffb1",
191
- X"ffacfff9", X"fc3cffdc", X"fdde002e", X"0009fff7", X"00280059", X"ffcbffff", X"0046fe25", X"ffc2fff8",
192
- X"003c0028", X"005b003c", X"ffcb0031", X"00130022", X"0038fff6", X"ffdeffce", X"ffa4021a", X"000cfc74",
193
- X"ffa6fff4", X"00030058", X"00380002", X"0006ffbf", X"013dffbf", X"fff9ff68", X"ffc40007", X"00190038",
194
- X"002ffc20", X"0030fff3", X"fd70ffcc", X"fd0f000f", X"02bd0039", X"ffd30052", X"001301d3", X"ffe80036",
195
- X"ffdb0020", X"001ffffe", X"005b003d", X"003afdf7", X"0059ff0e", X"ffd2005a", X"004d0398", X"0005ffb3",
196
- X"ffa90052", X"fff0fe6c", X"ffd0ffd4", X"01a00070", X"fff9ff28", X"020afffa", X"ffe7005b", X"ffdafe4b",
197
- X"ffb6fc84", X"ffe1fd86", X"ffc10024", X"00280012", X"01f8fffc", X"ffd80028", X"03090003", X"004bfe39",
198
- X"fffc0057", X"003affad", X"ffbbfd15", X"0013003a", X"fff60051", X"ffbeffa6", X"fffeffce", X"0007ffae",
199
- X"fe92fff9", X"ffdb0362", X"ffa6001b", X"ff360002", X"038a004f", X"001ffff0", X"0040ffcc", X"0024ffac",
200
- X"ffd802c6", X"0016ffed", X"0039fd9d", X"0040ffcb", X"fff8000e", X"004c0006", X"0021024d", X"02ec0030",
201
- X"0060fff5", X"000cffab", X"ffa2ffd2", X"00370046", X"00430111", X"00570371", X"fffffffc", X"ffa6ff9f",
202
- X"00040057", X"ffc20060", X"ffb2003e", X"0001001c", X"00d8ffbd", X"0013ffed", X"004b0027", X"0061fd36",
203
- X"ff9d0003", X"fff8ffa0", X"002ffe0d", X"0029ffc7", X"0021ffb7", X"0001000e", X"003fffd3", X"ffd1ffaa",
204
- X"005b0014", X"00660062", X"ffea0057", X"00560024", X"ff2d0018", X"002cff27", X"002a001e", X"00c7ff9e",
205
- X"0022ffde", X"005a0032", X"ffe0001c", X"ffc70040", X"0069001b", X"ffea002f", X"012dffdd", X"ffefffcf",
206
- X"fcf6ffea", X"0006fda2", X"02c4ffe7", X"ffb10024", X"ffe10004", X"ffa4fff3", X"00160188", X"003f004e",
207
- X"fffe0051", X"00310008", X"ffdbfcd8", X"fe050043", X"ffec0056", X"fefcffb5", X"ffb1001a", X"002fffd9",
208
- X"0326ffbf", X"ffc70021", X"001fffef", X"fff10060", X"00380036", X"03e50260", X"001f002a", X"0045001f",
209
- X"fdfcffac", X"000bffaf", X"0003ffdf", X"fd7e0322", X"ffb60028", X"ffa5ffcf", X"0059fc8a", X"ffee000b",
210
- X"ffe6ffae", X"ffd8ff04", X"ffb1ff9e", X"fcb3ffc4", X"0001ffff", X"0018ffe7", X"ffc90327", X"ffbe000b",
211
- X"0048ffb7", X"02010005", X"01e5ffbc", X"ffaf0046", X"ffaaffed", X"002effb8", X"ffc5ffa8", X"0175ffd7",
212
- X"ffcfffb7", X"01aefd11", X"004a0046", X"fffb02d6", X"0043ffa1", X"02bbfd66", X"0046ffbd", X"0013ffae",
213
- X"004d0168", X"ffbcfc7d", X"fe880042", X"004effb2", X"ff9f0061", X"ffb7ffc6", X"ffc90056", X"ffa5fff7",
214
- X"0005004e", X"000fffda", X"0001027f", X"00420033", X"003bffac", X"feb20008", X"0048ffc9", X"ffa3ffae",
215
- X"014a005c", X"0040ffa2", X"0057fe19", X"fdca0041", X"0018fd62", X"002a000a", X"0026005f", X"fffc016e",
216
- X"ffe3001d", X"ffa2005b", X"fd6c0030", X"0056ffd8", X"03880301", X"ffb4fffc", X"ffd3004e", X"fff2ffb7",
217
- X"ffc6ffba", X"fc97ffbb", X"ffdaff16", X"002effa6", X"ffa3ff9e", X"ffee0025", X"ffd40058", X"0061fdd7",
218
- X"ffc7fe2b", X"ffd6ffc6", X"01720025", X"012bfeb5", X"ffabffcf", X"00b40055", X"012e0396", X"ffb8ff80",
219
- X"ffe6fff5", X"ffe7ffc1", X"00050019", X"fff2ffd1", X"00450038", X"fc1e020d", X"fd870215", X"ffcbffff",
220
- X"fff6ffd2", X"ffcb0062", X"fff3004e", X"ffbe0042", X"ffcf0031", X"ffbefff7", X"03590012", X"ffb80048",
221
- X"000b00bd", X"001dffc7", X"ffcd0051", X"0001fd42", X"ffc2002d", X"fff7ffe3", X"00400036", X"fd13feb6",
222
- X"fff8ffab", X"fecbffaf", X"0052fe7c", X"005cffa8", X"0062ffc6", X"ffcf002b", X"037efc5a", X"ffd1ffa2",
223
- X"fccdffde", X"fca5fd1b", X"005c0006", X"004bffb7", X"fc3b0015", X"0022ffa6", X"fdb400fc", X"fd1effc0",
224
- X"ffbeffa0", X"ffe40042", X"ffbfffed", X"0020ffaa", X"01c90015", X"fe9c0016", X"027b017a", X"ffbd001f",
225
- X"0060004f", X"ffbf025c", X"002f002b", X"ffc4ffbf", X"ffb503cf", X"ffbaffe2", X"ffb7ffcb", X"ffce005b",
226
- X"ffcdfc61", X"0031ffd7", X"0029ffa7", X"fd580003", X"014f033d", X"0015ffac", X"fcfa0229", X"ffa6005a",
227
- X"000bffa6", X"fcf30031", X"005dffae", X"0052010b", X"00160033", X"0061004e", X"03de032d", X"ffde0022",
228
- X"004d0052", X"ffc10045", X"ffabff8e", X"ffb70007", X"fff5001b", X"004f0005", X"000c0058", X"fcd1005f",
229
- X"fc48ffb0", X"fe89fd14", X"003effa9", X"ffebffb1", X"0031ffcf", X"ffd00030", X"fffe0002", X"0006feb8",
230
- X"ff9e0009", X"ffee001d", X"00420023", X"004cffb3", X"ffc6003a", X"000c021c", X"02af0030", X"fc570041",
231
- X"fffefff3", X"ff9efe86", X"fc270039", X"fff7ffe9", X"ffa6ffc0", X"001cfff6", X"ff9f00ac", X"000301c2",
232
- X"00060008", X"005c0058", X"0042003c", X"0052001d", X"002c003b", X"ff9d0030", X"fe8f003c", X"00160058",
233
- X"ffc1ffbe", X"00280059", X"003affe8", X"ff16001a", X"02b00053", X"0057ffdb", X"0037fc25", X"0023ffc9",
234
- X"004e000b", X"ffa1fff4", X"003a0019", X"004d0031", X"fef6004a", X"00630042", X"fcf7000b", X"0036003a",
235
- X"003efff9", X"003b004d", X"0030ffac", X"ffd70029", X"ffbd0044", X"004affe3", X"ffad0036", X"ffa4ffa6",
236
- X"0034ffa9", X"03a6ffe0", X"ffba0039", X"002e0015", X"0034002c", X"ff6dffcc", X"0045005e", X"ffd1ffed",
237
- X"ffa1ffa7", X"0010ffc7", X"005c003c", X"00100048", X"0050002d", X"00f5ffa6", X"007cffbb", X"fff5003a",
238
- X"ffb20047", X"005effd8", X"fff5ffad", X"ffd9ffd5", X"001effce", X"fff9ffca", X"fcff03a4", X"010a0022",
239
- X"feecffb0", X"02f6fffe", X"fd920016", X"0032fd43", X"fff4003f", X"021f003a", X"fffa0063", X"03280006",
240
- X"0066fdb5", X"ffc9ffa1", X"023affde", X"fff0fff7", X"ffec0002", X"001effc1", X"00070043", X"0040ffbb",
241
- X"fffd0062", X"000d0003", X"ff0f0040", X"0044fffc", X"fffaffc2", X"00310044", X"0023ffac", X"0017ffe9",
242
- X"fff1ffab", X"02240034", X"0030ffdd", X"023bffcc", X"ffc5fe50", X"fff5ffd7", X"000a0001", X"ffc4ffb1",
243
- X"ffcf0027", X"000efc4a", X"ffcd005e", X"fd5a002a", X"ffc4ffea", X"004e0052", X"0375ffd7", X"ffc3004a",
244
- X"0027ffe9", X"ffd5ffd4", X"fff7000e", X"ffbbffa5", X"002dffe1", X"004dffb0", X"ffb4ffb8", X"ffb8004e",
245
- X"00710057", X"fd07ffd8", X"005bfff7", X"004e0052", X"01a80029", X"ffd90018", X"fff10009", X"ffac000f",
246
- X"0122fff0", X"ffdb0383", X"004f0036", X"ffc1ffe7", X"ffdcffc3", X"ffbf0037", X"0033ffa2", X"ffec0035",
247
- X"005bffb9", X"ffacfff0", X"0010fce2", X"fff9fff5", X"0215ffa1", X"ffdf0051", X"ffc0ffea", X"fda3fffb",
248
- X"0043000a", X"ffe1ffdc", X"005cfff3", X"005bfe5b", X"01f5ffed", X"0048002b", X"00300006", X"0045001f",
249
- X"0030fff3", X"004c0059", X"ffdfffee", X"ffe8004b", X"ffe00020", X"0335000b", X"0051ffe0", X"01300013",
250
- X"fffe0128", X"ffceff9e", X"ffcdfff5", X"ffe003cc", X"fff10057", X"0286fda7", X"004b0050", X"ffb002a8",
251
- X"0059000b", X"ffab000d", X"0061002a", X"001b0380", X"ffc20047", X"003d00b4", X"02280168", X"00ab0041",
252
- X"ffbc000c", X"001e0044", X"005afcc2", X"ffaf000a", X"ff5dffc8", X"002dffe4", X"0020000b", X"ffd4fff0",
253
- X"fffaff5f", X"0039ffa6", X"ffc5003b", X"fc7fffca", X"0048ffd5", X"00260248", X"0027ffc0", X"03860017",
254
- X"0028004a", X"fccbffa3", X"ffd2002e", X"ffccffc2", X"0038ffaa", X"0047002c", X"005d0150", X"00400097",
255
- X"fdd6ffc3", X"ffdb0032", X"fd90000b", X"ffbc0044", X"0008ffd6", X"fc20ffca", X"027e001c", X"000bfdb7",
256
- X"ffe2fff0", X"ffe5ffbe", X"005c001b", X"002bffa3", X"000c01ca", X"ffab0058", X"fffeffe6", X"008affa9",
257
- X"02aa003e", X"0008ffae", X"000fffd1", X"0007ffc6", X"001b0043", X"00300021", X"fe1bff3e", X"ffd40125",
258
- X"0004001e", X"0035fffc", X"000a0026", X"fff20060", X"fff6ffad", X"0017ffe1", X"0026fff6", X"00580002",
259
- X"00150034", X"010e001b", X"ffa4002a", X"03370049", X"002ffdb2", X"0007ffb1", X"ffe6ffb1", X"fcea0272",
260
- X"ffbdffb7", X"fe46ffce", X"000fffda", X"004affcd", X"ffd20033", X"fff8ff9f", X"0154ffd8", X"003dffc3",
261
- X"ffbfffdd", X"0028fe01", X"003e003a", X"0046ffed", X"ffe5fce2", X"004402ec", X"002d0360", X"0043fe91",
262
- X"003effe7", X"fff3003f", X"fea0ffb5", X"0055ffc2", X"0051ffad", X"ffd70027", X"fffeffb1", X"fef70002",
263
- X"ffccffad", X"fff0ffac", X"01b3ffdc", X"ffba001b", X"0025ffce", X"0047fff2", X"ffa2fffa", X"feb3012e",
264
- X"ffd2001f", X"ffde002e", X"ffa70086", X"005e005f", X"fffe0002", X"005c0008", X"0023016d", X"ffb5ff1f",
265
- X"ffd1fff4", X"0041022f", X"fff00033", X"0018004c", X"0061ffd1", X"ffe40032", X"fffefc87", X"ffc2ffed",
266
- X"fe38ffc1", X"ffa7ffaf", X"001f01e6", X"003002d4", X"001fffb6", X"ffe60045", X"001f012d", X"002a028c",
267
- X"0023fefb", X"004f0032", X"fff900ab", X"fe7e0007", X"001a0056", X"ffd0018b", X"ffeeffc9", X"0017022b",
268
- X"ffdb003b", X"ffc0ffe7", X"0003ffcd", X"ffe30345", X"005b00e5", X"0046fe6a", X"fc2e0063", X"ffedffb4",
269
- X"004e0059", X"0016002f", X"002fffef", X"000d0035", X"00570035", X"feff0004", X"ffc1024a", X"ffc4fe31",
270
- X"005f0005", X"00220042", X"002fff3d", X"00020006", X"ffebffd9", X"002c0038", X"ffc3ffad", X"0223fcfe",
271
- X"ffcb0005", X"0371ffbe", X"02670055", X"fff30013", X"ffd1ff4d", X"ffcb0140", X"005effd7", X"004effa1",
272
- X"0024fccd", X"03c9ffdc", X"ffd4fff7", X"ffdcffa7", X"ffe7fff9", X"00450008", X"ffa2ffd7", X"03620301",
273
- X"0027038b", X"ffef0003", X"0032ffaa", X"ffcdffce", X"0017fd32", X"00320032", X"004600e6", X"ffc4ffa2",
274
- X"0044fc6e", X"0038ffdc", X"0025ffec", X"017effdb", X"037ffff5", X"ffcdffbe", X"ffd90057", X"ffa8fff7",
275
- X"ffcc001b", X"02a0ffe8", X"ffa00005", X"ffa7004a", X"fff403e1", X"0027001c", X"000cfe2f", X"0016001f",
276
- X"ffe0ffbf", X"ffa7fc9f", X"ffdbffb3", X"fff70009", X"fe86ffdb", X"fff2ffab", X"ffd3ffaa", X"0028002d",
277
- X"ffd8ffd8", X"ffa801fb", X"ffabffc5", X"ff9d0041", X"ffe203a1", X"0287ffb5", X"012dffb8", X"ffe80028",
278
- X"0036ffaf", X"ffa3000a", X"0017fffe", X"0291005c", X"0010ffb7", X"feabffb1", X"002dfc53", X"fff2fffc",
279
- X"004bffed", X"0045ffd6", X"ffddffbb", X"fdaf0014", X"fda1ffa3", X"00040008", X"001d00a7", X"ffcc0034",
280
- X"ffde023e", X"00070035", X"00620328", X"002dfe0d", X"ffcc0008", X"ffcc0010", X"032cffb7", X"0012fff5",
281
- X"ffb8003f", X"0003fff7", X"005cfffd", X"fcd70011", X"0038002c", X"ffc3fec2", X"ffa3ffbc", X"000cfff7",
282
- X"0053002e", X"01fe0033", X"0007002f", X"003efecd", X"ffd00056", X"ff22ffb9", X"fff8fffa", X"ffdfffae",
283
- X"ffdb0016", X"fffa002f", X"0056000e", X"00930060", X"fff1ffd1", X"ff9e0042", X"003d004d", X"fceb0062",
284
- X"fc2e0052", X"004ffcdc", X"0061ffb1", X"ffd50387", X"001a02cd", X"ffae0020", X"ffd6fd3c", X"0050fe84",
285
- X"002a0039", X"ffc4003d", X"fffcffa0", X"fff20022", X"fffdfff2", X"003dff35", X"fff0ffd3", X"001d012b",
286
- X"0008ffe4", X"fe9efff5", X"ffeaffb6", X"001cffb5", X"ffa6fff6", X"fff40063", X"ff4d000d", X"ffb70030",
287
- X"ffadffd2", X"fff6002b", X"001b0049", X"ffad0034", X"ffadffbb", X"ff9effb0", X"fff9fe11", X"01beffdb",
288
- X"0044fff2", X"0041ffbf", X"006fffe2", X"ffa10043", X"005b005e", X"005cffac", X"fe15ffd4", X"fffbfff5",
289
- X"00090060", X"ffde0160", X"000d000c", X"ffe1ff9e", X"fffd0056", X"00530003", X"0047ffca", X"ffd502e7",
290
- X"ffbb002c", X"ffa60019", X"ffa001b8", X"0046fdf4", X"03a5ffdf", X"0004fccd", X"0039ffee", X"ff02004c",
291
- X"ffdafff8", X"ffcbffcf", X"ffb4ffdf", X"fc9dffea", X"ffbcffdb", X"fe780005", X"ff9fffd9", X"ffccffb8",
292
- X"fff2fcb0", X"ffa5ffad", X"ffe80058", X"011d0018", X"ffcf0032", X"001c000e", X"025d0055", X"ffa3002f",
293
- X"fff1002b", X"002c0038", X"00530021", X"ffa4000c", X"0051fc44", X"ff0cffc3", X"001f001f", X"000a001b",
294
- X"ffc5ffc9", X"002cfff8", X"0342ffb3", X"00320042", X"0007ffce", X"ffd80021", X"ffdbffd5", X"0008003f",
295
- X"0265ff34", X"036f0015", X"03580020", X"002d000c", X"ff9effee", X"ffcb0018", X"ffcfffae", X"ffc70058",
296
- X"00240002", X"0018ffb0", X"0044ffae", X"0005fcfb", X"fcd1ffe6", X"03c8fd82", X"0343ffe8", X"ffa1ffa3",
297
- X"001b0058", X"004cffe9", X"00180254", X"ffc2003d", X"fffe0001", X"fd9bff9e", X"ffbe0002", X"ffc40025",
298
- X"ffb1ffdd", X"ff0effd1", X"0040005d", X"ffbd005e", X"ffe40013", X"ffdd003f", X"fe50ffad", X"0040ffab",
299
- X"fc990024", X"021effe3", X"fc31ffd6", X"0005ffa8", X"fffdffd3", X"ffed0048", X"004effe7", X"ffcaffa1",
300
- X"00390041", X"ffc8001b", X"002affd4", X"001d001d", X"ffa70025", X"0005003f", X"0029ffb8", X"fff4000f",
301
- X"001b002d", X"0061002b", X"0011fff0", X"0043ffbc", X"000c0015", X"0032fffe", X"0004005c", X"00210038",
302
- X"00020044", X"ffd7ffdc", X"ffedff9d", X"fff70022", X"0014ffaa", X"00200051", X"ffd70015", X"ffeeffed",
303
- X"fff40003", X"002afff3", X"0011001f", X"fffeffe0", X"0029ffd9", X"ffd4ffe7", X"ffe3ffe3", X"002d002b",
304
- X"ffe60022", X"ffe00032", X"0016ffda", X"ffd30013", X"00090029", X"ffe50021", X"fff70010", X"fff8fff6",
305
- X"ffd8fff9", X"ffe9000f", X"ffd6ffd2", X"ffee0021", X"fffeffd3", X"000efff8", X"ffe6fff1", X"ffd9000f",
306
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
307
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
308
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
309
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
310
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
311
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
312
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
313
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
314
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
315
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
316
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
317
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
318
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
319
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
320
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
321
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
322
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
323
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
324
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
325
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
326
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
327
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
328
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
329
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
330
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
331
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
332
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
333
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
334
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
335
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
336
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
337
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
338
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
339
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
340
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
341
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
342
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
343
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
344
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
345
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
346
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
347
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
348
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
349
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
350
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
351
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
352
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
353
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
354
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
355
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
356
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
357
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
358
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
359
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
360
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
361
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
362
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
363
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
364
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
365
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
366
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
367
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
368
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
369
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
370
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
371
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
372
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
373
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
374
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
375
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
376
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
377
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
378
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
379
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
380
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
381
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
382
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
383
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
384
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
385
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
386
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
387
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
388
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
389
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
390
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
391
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
392
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
393
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
394
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
395
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
396
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
397
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
398
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
399
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
400
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
401
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
402
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
403
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
404
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
405
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
406
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
407
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
408
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
409
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
410
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
411
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
412
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
413
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
414
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
415
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
416
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
417
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
418
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
419
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
420
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
421
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
422
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
423
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
424
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
425
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
426
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
427
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
428
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
429
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
430
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
431
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
432
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
433
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
434
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
435
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
436
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
437
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
438
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
439
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
440
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
441
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
442
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
443
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
444
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
445
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
446
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
447
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
448
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
449
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
450
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
451
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
452
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
453
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
454
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
455
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
456
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
457
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
458
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
459
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
460
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
461
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
462
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
463
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
464
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
465
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
466
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
467
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
468
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
469
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
470
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
471
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
472
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
473
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
474
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
475
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
476
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
477
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
478
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
479
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
480
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
481
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
482
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
483
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
484
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
485
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
486
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
487
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
488
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
489
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
490
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
491
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
492
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
493
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
494
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
495
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
496
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
497
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
498
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
499
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
500
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
501
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
502
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
503
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
504
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
505
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
506
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
507
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
508
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
509
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
510
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
511
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
512
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
513
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
514
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
515
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
516
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
517
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
518
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
519
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
520
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
521
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
522
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
523
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
524
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
525
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
526
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
527
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
528
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
529
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
530
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
531
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
532
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
533
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
534
- X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000"
535
  );
536
-
537
  begin
538
 
539
  -- port A
@@ -560,4 +565,4 @@ begin
560
  end if;
561
  end if;
562
  end process;
563
- end rtl;
 
2
  use ieee.std_logic_1164.all;
3
  use ieee.std_logic_unsigned.all;
4
 
5
+ use work.types.all;
6
+ use work.constants.all;
7
+
8
+
9
  entity bram is
10
  port(
11
  clka: in std_logic;
12
  ena: in std_logic;
13
  wea: in std_logic_vector(3 downto 0);
14
+ addra: in std_logic_vector(MEM_ADDRESS_BITS - 3 downto 0);
15
  dia: in std_logic_vector(31 downto 0);
16
  doa: out std_logic_vector(31 downto 0);
17
  clkb: in std_logic;
18
  enb: in std_logic;
19
+ addrb: in std_logic_vector(MEM_ADDRESS_BITS - 3 downto 0);
20
  dob: out std_logic_vector(31 downto 0)
21
  );
22
  end bram;
23
 
24
  architecture rtl of bram is
25
+ -- START PROGMEM
26
  type ram_type is array (0 to 4095) of std_logic_vector(31 downto 0);
27
  shared variable RAM: ram_type := (
28
+ X"93020000", X"73930234", X"93028000", X"f3a30234", X"93028000", X"73be0234", X"73600434", X"73700434",
29
+ X"f32e0034", X"736f0034", X"b7220000", X"93820280", X"f39f0234", X"6f000000", X"00000000", X"00000000",
30
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
31
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
32
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
33
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
34
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
35
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
36
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
37
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
38
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
39
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
40
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
41
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
42
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
43
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
44
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
45
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
46
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
47
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
48
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
49
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
50
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
51
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
52
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
53
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
54
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
55
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
56
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
57
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
58
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
59
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
60
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
61
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
62
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
63
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
64
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
65
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
66
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
67
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
68
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
69
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
70
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
71
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
72
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
73
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
74
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
75
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
76
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
77
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
78
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
79
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
80
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
81
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
82
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
83
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
84
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
85
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
86
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
87
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
88
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
89
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
90
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
91
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
92
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
93
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
94
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
95
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
96
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
97
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
98
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
99
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
100
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
101
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
102
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
103
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
104
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
105
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
106
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
107
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
108
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
109
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
110
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
111
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
112
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
113
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
114
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
115
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
116
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
117
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
118
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
119
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
120
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
121
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
122
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
123
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
124
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
125
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
126
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
127
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
128
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
129
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
130
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
131
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
132
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
133
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
134
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
135
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
136
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
137
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
138
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
139
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
140
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
141
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
142
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
143
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
144
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
145
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
146
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
147
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
148
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
149
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
150
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
151
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
152
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
153
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
154
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
155
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
156
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
157
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
158
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
159
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
160
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
161
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
162
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
163
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
164
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
165
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
166
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
167
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
168
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
169
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
170
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
171
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
172
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
173
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
174
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
175
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
176
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
177
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
178
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
179
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
180
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
181
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
182
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
183
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
184
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
185
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
186
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
187
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
188
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
189
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
190
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
191
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
192
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
193
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
194
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
195
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
196
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
197
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
198
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
199
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
200
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
201
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
202
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
203
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
204
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
205
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
206
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
207
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
208
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
209
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
210
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
211
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
212
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
213
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
214
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
215
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
216
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
217
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
218
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
219
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
220
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
221
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
222
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
223
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
224
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
225
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
226
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
227
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
228
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
229
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
230
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
231
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
232
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
233
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
234
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
235
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
236
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
237
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
238
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
239
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
240
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
241
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
242
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
243
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
244
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
245
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
246
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
247
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
248
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
249
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
250
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
251
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
252
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
253
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
254
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
255
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
256
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
257
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
258
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
259
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
260
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
261
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
262
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
263
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
264
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
265
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
266
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
267
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
268
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
269
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
270
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
271
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
272
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
273
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
274
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
275
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
276
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
277
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
278
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
279
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
280
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
281
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
282
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
283
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
284
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
285
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
286
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
287
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
288
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
289
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
290
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
291
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
292
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
293
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
294
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
295
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
296
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
297
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
298
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
299
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
300
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
301
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
302
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
303
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
304
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
305
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
306
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
307
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
308
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
309
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
310
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
311
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
312
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
313
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
314
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
315
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
316
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
317
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
318
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
319
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
320
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
321
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
322
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
323
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
324
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
325
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
326
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
327
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
328
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
329
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
330
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
331
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
332
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
333
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
334
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
335
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
336
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
337
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
338
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
339
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
340
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
341
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
342
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
343
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
344
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
345
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
346
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
347
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
348
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
349
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
350
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
351
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
352
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
353
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
354
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
355
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
356
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
357
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
358
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
359
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
360
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
361
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
362
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
363
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
364
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
365
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
366
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
367
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
368
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
369
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
370
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
371
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
372
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
373
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
374
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
375
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
376
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
377
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
378
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
379
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
380
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
381
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
382
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
383
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
384
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
385
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
386
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
387
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
388
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
389
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
390
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
391
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
392
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
393
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
394
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
395
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
396
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
397
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
398
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
399
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
400
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
401
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
402
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
403
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
404
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
405
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
406
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
407
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
408
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
409
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
410
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
411
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
412
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
413
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
414
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
415
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
416
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
417
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
418
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
419
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
420
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
421
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
422
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
423
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
424
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
425
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
426
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
427
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
428
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
429
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
430
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
431
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
432
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
433
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
434
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
435
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
436
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
437
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
438
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
439
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
440
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
441
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
442
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
443
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
444
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
445
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
446
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
447
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
448
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
449
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
450
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
451
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
452
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
453
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
454
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
455
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
456
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
457
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
458
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
459
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
460
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
461
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
462
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
463
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
464
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
465
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
466
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
467
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
468
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
469
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
470
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
471
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
472
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
473
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
474
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
475
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
476
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
477
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
478
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
479
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
480
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
481
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
482
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
483
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
484
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
485
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
486
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
487
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
488
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
489
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
490
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
491
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
492
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
493
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
494
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
495
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
496
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
497
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
498
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
499
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
500
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
501
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
502
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
503
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
504
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
505
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
506
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
507
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
508
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
509
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
510
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
511
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
512
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
513
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
514
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
515
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
516
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
517
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
518
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
519
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
520
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
521
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
522
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
523
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
524
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
525
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
526
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
527
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
528
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
529
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
530
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
531
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
532
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
533
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
534
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
535
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
536
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
537
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
538
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000",
539
+ X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000", X"00000000"
540
  );
541
+ -- END PROGMEM
542
  begin
543
 
544
  -- port A
 
565
  end if;
566
  end if;
567
  end process;
568
+ end rtl;

...

src/core/constants.vhd CHANGED
@@ -82,6 +82,8 @@ package core_constants is
82
 
83
  constant MTIME_ADDRESS: std_logic_vector(31 downto 0) := X"0200BFF8";
84
  constant MTIMEH_ADDRESS: std_logic_vector(31 downto 0) := X"0200BFFC";
 
 
85
 
86
  constant EX_CAUSE_INSTRUCTION_ADDRESS_MISALIGNED: std_logic_vector(3 downto 0) := "0000";
87
  constant EX_CAUSE_INSTRUCTION_ACCESS_FAULT: std_logic_vector(3 downto 0) := "0001";
 
82
 
83
  constant MTIME_ADDRESS: std_logic_vector(31 downto 0) := X"0200BFF8";
84
  constant MTIMEH_ADDRESS: std_logic_vector(31 downto 0) := X"0200BFFC";
85
+ constant MTIMECMP_ADDRESS: std_logic_vector(31 downto 0) := X"02004000";
86
+ constant MTIMECMPH_ADDRESS: std_logic_vector(31 downto 0) := X"02004004";
87
 
88
  constant EX_CAUSE_INSTRUCTION_ADDRESS_MISALIGNED: std_logic_vector(3 downto 0) := "0000";
89
  constant EX_CAUSE_INSTRUCTION_ACCESS_FAULT: std_logic_vector(3 downto 0) := "0001";
src/core/execute.vhd CHANGED
@@ -40,6 +40,8 @@ architecture rtl of execute is
40
  signal minstreth: std_logic_vector(31 downto 0) := (others => '0');
41
  signal mtime: std_logic_vector(31 downto 0) := (others => '0');
42
  signal mtimeh: std_logic_vector(31 downto 0) := (others => '0');
 
 
43
  begin
44
 
45
  process (clk)
@@ -57,6 +59,7 @@ begin
57
  variable v_mcause_code: std_logic_vector(3 downto 0);
58
  variable v_mtime_inc, v_mtimeh_inc: std_logic_vector(31 downto 0);
59
  variable v_mtime, v_mtimeh: std_logic_vector(31 downto 0);
 
60
 
61
  variable v_address, v_value: std_logic_vector(31 downto 0);
62
 
@@ -89,6 +92,8 @@ begin
89
  v_mtime := v_mtime_inc;
90
  v_mtimeh_inc := std_logic_vector(v_temp(63 downto 32));
91
  v_mtimeh := v_mtimeh_inc;
 
 
92
 
93
  has_exception := false;
94
  exception_cause := (others => '0');
@@ -261,6 +266,10 @@ begin
261
  v_mtime := input.operand2;
262
  elsif v_address = MTIMEH_ADDRESS then
263
  v_mtimeh := input.operand2;
 
 
 
 
264
  else
265
  v_mem_req.active := '1';
266
  v_mem_req.write_enable := "1111";
@@ -281,6 +290,10 @@ begin
281
  v_output.result := mtime;
282
  elsif input.operation = OP_LW and v_address = MTIMEH_ADDRESS then
283
  v_output.result := mtimeh;
 
 
 
 
284
  else
285
  v_output.use_mem := '1';
286
  v_output.mem_addr := v_address(1 downto 0);
@@ -441,6 +454,8 @@ begin
441
  v_mcycleh := v_mcycleh_inc;
442
  v_mtime := v_mtime_inc;
443
  v_mtimeh := v_mtimeh_inc;
 
 
444
  v_minstret := v_minstret_inc;
445
  v_minstreth := v_minstreth_inc;
446
  v_mepc := input.pc(31 downto 2);
@@ -457,6 +472,8 @@ begin
457
  mcycleh <= v_mcycleh;
458
  mtime <= v_mtime;
459
  mtimeh <= v_mtimeh;
 
 
460
  minstret <= v_minstret;
461
  minstreth <= v_minstreth;
462
  mepc <= v_mepc;
 
40
  signal minstreth: std_logic_vector(31 downto 0) := (others => '0');
41
  signal mtime: std_logic_vector(31 downto 0) := (others => '0');
42
  signal mtimeh: std_logic_vector(31 downto 0) := (others => '0');
43
+ signal mtimecmp: std_logic_vector(31 downto 0) := (others => '0');
44
+ signal mtimecmph: std_logic_vector(31 downto 0) := (others => '0');
45
  begin
46
 
47
  process (clk)
 
59
  variable v_mcause_code: std_logic_vector(3 downto 0);
60
  variable v_mtime_inc, v_mtimeh_inc: std_logic_vector(31 downto 0);
61
  variable v_mtime, v_mtimeh: std_logic_vector(31 downto 0);
62
+ variable v_mtimecmp, v_mtimecmph: std_logic_vector(31 downto 0);
63
 
64
  variable v_address, v_value: std_logic_vector(31 downto 0);
65
 
 
92
  v_mtime := v_mtime_inc;
93
  v_mtimeh_inc := std_logic_vector(v_temp(63 downto 32));
94
  v_mtimeh := v_mtimeh_inc;
95
+ v_mtimecmp := mtimecmp;
96
+ v_mtimecmph := mtimecmph;
97
 
98
  has_exception := false;
99
  exception_cause := (others => '0');
 
266
  v_mtime := input.operand2;
267
  elsif v_address = MTIMEH_ADDRESS then
268
  v_mtimeh := input.operand2;
269
+ elsif v_address = MTIMECMP_ADDRESS then
270
+ v_mtimecmp := input.operand2;
271
+ elsif v_address = MTIMECMPH_ADDRESS then
272
+ v_mtimecmph := input.operand2;
273
  else
274
  v_mem_req.active := '1';
275
  v_mem_req.write_enable := "1111";
 
290
  v_output.result := mtime;
291
  elsif input.operation = OP_LW and v_address = MTIMEH_ADDRESS then
292
  v_output.result := mtimeh;
293
+ elsif input.operation = OP_LW and v_address = MTIMECMP_ADDRESS then
294
+ v_output.result := mtimecmp;
295
+ elsif input.operation = OP_LW and v_address = MTIMECMPH_ADDRESS then
296
+ v_output.result := mtimecmph;
297
  else
298
  v_output.use_mem := '1';
299
  v_output.mem_addr := v_address(1 downto 0);
 
454
  v_mcycleh := v_mcycleh_inc;
455
  v_mtime := v_mtime_inc;
456
  v_mtimeh := v_mtimeh_inc;
457
+ v_mtimecmp := mtimecmp;
458
+ v_mtimecmph := mtimecmph;
459
  v_minstret := v_minstret_inc;
460
  v_minstreth := v_minstreth_inc;
461
  v_mepc := input.pc(31 downto 2);
 
472
  mcycleh <= v_mcycleh;
473
  mtime <= v_mtime;
474
  mtimeh <= v_mtimeh;
475
+ mtimecmp <= v_mtimecmp;
476
+ mtimecmph <= v_mtimecmph;
477
  minstret <= v_minstret;
478
  minstreth <= v_minstreth;
479
  mepc <= v_mepc;

...

toolchain/program CHANGED
@@ -28,7 +28,7 @@ with open(BINARY_FILE_PATH, 'rb') as f:
28
  if len(word) < 4:
29
  raise ValueError(f"Incomplete 32-bit word at offset {i}")
30
 
31
- buffer[j] = int.from_bytes(word)
32
  i += 4
33
  j += 1
34
 
 
28
  if len(word) < 4:
29
  raise ValueError(f"Incomplete 32-bit word at offset {i}")
30
 
31
+ buffer[j] = int.from_bytes(word, byteorder='little')
32
  i += 4
33
  j += 1
34
 

...

src/core/constants.vhd CHANGED
@@ -94,4 +94,6 @@ package core_constants is
94
  constant EX_CAUSE_STORE_ADDRESS_MISALIGNED: std_logic_vector(3 downto 0) := "0110";
95
  constant EX_CAUSE_STORE_ACCESS_FAULT: std_logic_vector(3 downto 0) := "0111";
96
  constant EX_CAUSE_ENVIRONMENT_CALL: std_logic_vector(3 downto 0) := "1011";
 
 
97
  end package core_constants;
 
94
  constant EX_CAUSE_STORE_ADDRESS_MISALIGNED: std_logic_vector(3 downto 0) := "0110";
95
  constant EX_CAUSE_STORE_ACCESS_FAULT: std_logic_vector(3 downto 0) := "0111";
96
  constant EX_CAUSE_ENVIRONMENT_CALL: std_logic_vector(3 downto 0) := "1011";
97
+
98
+ constant INT_CAUSE_MACHINE_TIMER_INTERRUPT: std_logic_vector(3 downto 0) := "0111";
99
  end package core_constants;
src/core/execute.vhd CHANGED
@@ -25,7 +25,7 @@ end execute;
25
 
26
  architecture rtl of execute is
27
  signal mstatus_mpie, mstatus_mie: std_logic := '0';
28
- signal mie: std_logic_vector(15 downto 0) := (others => '0');
29
  signal mtvec_address: std_logic_vector(29 downto 0) := (others => '0');
30
  signal mtvec_mode: std_logic := '0';
31
  signal mscratch: std_logic_vector(31 downto 0) := (others => '0');
@@ -33,7 +33,6 @@ architecture rtl of execute is
33
  signal mcause_int: std_logic := '0';
34
  signal mcause_code: std_logic_vector(3 downto 0) := (others => '0');
35
  signal mtval: std_logic_vector(31 downto 0) := (others => '0');
36
- signal mip: std_logic_vector(15 downto 0) := (others => '0');
37
  signal mcycle: std_logic_vector(31 downto 0) := (others => '0');
38
  signal minstret: std_logic_vector(31 downto 0) := (others => '0');
39
  signal mcycleh: std_logic_vector(31 downto 0) := (others => '0');
@@ -50,6 +49,7 @@ begin
50
  variable v_jump: std_logic;
51
  variable v_jump_address: std_logic_vector(31 downto 0);
52
  variable v_mem_req: mem_req_t;
 
53
  variable v_mcycle_inc, v_mcycleh_inc: std_logic_vector(31 downto 0);
54
  variable v_mcycle, v_mcycleh: std_logic_vector(31 downto 0);
55
  variable v_minstret_inc, v_minstreth_inc: std_logic_vector(31 downto 0);
@@ -60,6 +60,12 @@ begin
60
  variable v_mtime_inc, v_mtimeh_inc: std_logic_vector(31 downto 0);
61
  variable v_mtime, v_mtimeh: std_logic_vector(31 downto 0);
62
  variable v_mtimecmp, v_mtimecmph: std_logic_vector(31 downto 0);
 
 
 
 
 
 
63
 
64
  variable v_address, v_value: std_logic_vector(31 downto 0);
65
 
@@ -67,7 +73,6 @@ begin
67
  variable v_temp: unsigned(63 downto 0);
68
 
69
  variable has_exception: boolean;
70
- variable exception_cause: std_logic_vector(3 downto 0);
71
 
72
  begin
73
  if rising_edge(clk) then
@@ -77,6 +82,9 @@ begin
77
  v_jump := '0';
78
  v_jump_address := (others => '0');
79
 
 
 
 
80
  v_temp := unsigned(mcycleh & mcycle) + 1;
81
  v_mcycle_inc := std_logic_vector(v_temp(31 downto 0));
82
  v_mcycle := v_mcycle_inc;
@@ -94,25 +102,37 @@ begin
94
  v_mtimeh := v_mtimeh_inc;
95
  v_mtimecmp := mtimecmp;
96
  v_mtimecmph := mtimecmph;
 
 
 
 
 
97
 
98
  has_exception := false;
99
- exception_cause := (others => '0');
100
 
101
  v_temp := unsigned(minstreth & minstret);
102
  if instr_retire = '1' then
103
  v_temp := v_temp + 1;
104
  end if;
105
 
106
- v_minstret := std_logic_vector(v_temp(31 downto 0));
107
- v_minstreth := std_logic_vector(v_temp(63 downto 32));
 
 
 
 
 
 
 
 
108
 
109
  if input.is_active = '1' then
110
  if input.is_invalid_address = '1' then
111
  has_exception := true;
112
- exception_cause := EX_CAUSE_INSTRUCTION_ACCESS_FAULT;
113
  elsif input.is_invalid = '1' then
114
  has_exception := true;
115
- exception_cause := EX_CAUSE_ILLEGAL_INSTRUCTION;
116
  else
117
  if input.operation = OP_ADD then
118
  v_output.result := std_logic_vector(unsigned(input.operand1) + unsigned(input.operand2));
@@ -235,7 +255,7 @@ begin
235
 
236
  if not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
237
  has_exception := true;
238
- exception_cause := EX_CAUSE_STORE_ACCESS_FAULT;
239
  end if;
240
  elsif input.operation = OP_SH then
241
  v_address := input.operand1;
@@ -254,13 +274,13 @@ begin
254
 
255
  if v_address(0) /= '0' then
256
  has_exception := true;
257
- exception_cause := EX_CAUSE_STORE_ADDRESS_MISALIGNED;
258
  elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
259
  has_exception := true;
260
- exception_cause := EX_CAUSE_STORE_ACCESS_FAULT;
261
  end if;
262
  elsif input.operation = OP_SW then
263
- v_mem_req.address := input.operand1;
264
 
265
  if v_address = MTIME_ADDRESS then
266
  v_mtime := input.operand2;
@@ -272,15 +292,16 @@ begin
272
  v_mtimecmph := input.operand2;
273
  else
274
  v_mem_req.active := '1';
 
275
  v_mem_req.write_enable := "1111";
276
  v_mem_req.value := input.operand2;
277
 
278
  if v_address(1 downto 0) /= "00" then
279
  has_exception := true;
280
- exception_cause := EX_CAUSE_STORE_ADDRESS_MISALIGNED;
281
  elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
282
  has_exception := true;
283
- exception_cause := EX_CAUSE_STORE_ACCESS_FAULT;
284
  end if;
285
  end if;
286
  elsif input.operation = OP_LB or input.operation = OP_LH or input.operation = OP_LW or input.operation = OP_LBU or input.operation = OP_LHU then
@@ -308,25 +329,25 @@ begin
308
  v_output.mem_size := SIZE_BYTE;
309
  if not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
310
  has_exception := true;
311
- exception_cause := EX_CAUSE_LOAD_ACCESS_FAULT;
312
  end if;
313
  elsif input.operation = OP_LH or input.operation = OP_LHU then
314
  v_output.mem_size := SIZE_HALFWORD;
315
  if v_address(0) /= '0' then
316
  has_exception := true;
317
- exception_cause := EX_CAUSE_LOAD_ADDRESS_MISALIGNED;
318
  elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
319
  has_exception := true;
320
- exception_cause := EX_CAUSE_LOAD_ACCESS_FAULT;
321
  end if;
322
  else
323
  v_output.mem_size := SIZE_WORD;
324
  if v_address(1 downto 0) /= "00" then
325
  has_exception := true;
326
- exception_cause := EX_CAUSE_LOAD_ADDRESS_MISALIGNED;
327
  elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
328
  has_exception := true;
329
- exception_cause := EX_CAUSE_LOAD_ACCESS_FAULT;
330
  end if;
331
  end if;
332
  end if;
@@ -347,22 +368,22 @@ begin
347
 
348
  if input.operand2(11 downto 0) = CSR_MSTATUS then
349
  v_output.result := "000000000000000000011000" & mstatus_mpie & "000" & mstatus_mie & "000";
350
- mstatus_mie <= (mstatus_mie or csr_set_bits(3)) and csr_clear_bits(3);
351
- mstatus_mpie <= (mstatus_mpie or csr_set_bits(7)) and csr_clear_bits(7);
352
  elsif input.operand2(11 downto 0) = CSR_MISA then
353
  v_output.result := MISA_VALUE;
354
  elsif input.operand2(11 downto 0) = CSR_MIE then
355
- v_output.result := x"0000" & mie;
356
- mie <= (mie or csr_set_bits(15 downto 0)) and csr_clear_bits(15 downto 0);
357
  elsif input.operand2(11 downto 0) = CSR_MTVEC then
358
  v_output.result := mtvec_address & "0" & mtvec_mode;
359
- mtvec_address <= (mtvec_address or csr_set_bits(31 downto 2)) and csr_clear_bits(31 downto 2);
360
- mtvec_mode <= (mtvec_mode or csr_set_bits(0)) and csr_clear_bits(0);
361
  elsif input.operand2(11 downto 0) = CSR_MSTATUSH then
362
  v_output.result := (others => '0');
363
  elsif input.operand2(11 downto 0) = CSR_MSCRATCH then
364
  v_output.result := mscratch;
365
- mscratch <= (mscratch or csr_set_bits) and csr_clear_bits;
366
  elsif input.operand2(11 downto 0) = CSR_MEPC then
367
  v_output.result := mepc & "00";
368
  v_mepc := (mepc or csr_set_bits(31 downto 2)) and csr_clear_bits(31 downto 2);
@@ -372,10 +393,9 @@ begin
372
  mcause_code <= (mcause_code or csr_set_bits(5 downto 0)) and csr_clear_bits(5 downto 0);
373
  elsif input.operand2(11 downto 0) = CSR_MTVAL then
374
  v_output.result := mtval;
375
- mtval <= (mtval or csr_set_bits) and csr_clear_bits;
376
  elsif input.operand2(11 downto 0) = CSR_MIP then
377
- v_output.result := x"0000" & mip;
378
- mip <= (mip or csr_set_bits(15 downto 0)) and csr_clear_bits(15 downto 0);
379
  elsif input.operand2(11 downto 0) = CSR_MCYCLE then
380
  v_output.result := mcycle;
381
  v_mcycle := (mcycle or csr_set_bits) and csr_clear_bits;
@@ -411,25 +431,25 @@ begin
411
  else
412
  -- trying to read non-existent CSR
413
  has_exception := true;
414
- exception_cause := EX_CAUSE_ILLEGAL_INSTRUCTION;
415
  end if;
416
  else
417
  -- trying to write to non-existent or read-only CSR
418
  has_exception := true;
419
- exception_cause := EX_CAUSE_ILLEGAL_INSTRUCTION;
420
  end if;
421
  elsif input.operation = OP_MRET then
422
- mstatus_mie <= mstatus_mpie;
423
- mstatus_mpie <= '1';
424
  v_jump := '1';
425
  v_jump_address := mepc & "00";
426
  -- TODO: reset mepc?
427
  elsif input.operation = OP_ECALL then
428
  has_exception := true;
429
- exception_cause := EX_CAUSE_ENVIRONMENT_CALL;
430
  elsif input.operation = OP_EBREAK then
431
  has_exception := true;
432
- exception_cause := EX_CAUSE_BREAKPOINT;
433
  elsif input.operation = OP_LED then
434
  led <= input.operand1(7 downto 0);
435
  else
@@ -439,9 +459,13 @@ begin
439
  v_output.destination_reg := input.destination_reg;
440
  end if;
441
 
442
- if v_jump = '1' and v_jump_address(1) /= '0' then
 
 
 
 
443
  has_exception := true;
444
- exception_cause := EX_CAUSE_INSTRUCTION_ADDRESS_MISALIGNED;
445
  end if;
446
 
447
  if has_exception then
@@ -459,8 +483,15 @@ begin
459
  v_minstret := v_minstret_inc;
460
  v_minstreth := v_minstreth_inc;
461
  v_mepc := input.pc(31 downto 2);
462
- v_mcause_int := '0';
463
- v_mcause_code := exception_cause;
 
 
 
 
 
 
 
464
  end if;
465
  end if;
466
 
@@ -479,6 +510,15 @@ begin
479
  mepc <= v_mepc;
480
  mcause_int <= v_mcause_int;
481
  mcause_code <= v_mcause_code;
 
 
 
 
 
 
 
 
 
482
  end if;
483
  end process;
484
 
 
25
 
26
  architecture rtl of execute is
27
  signal mstatus_mpie, mstatus_mie: std_logic := '0';
28
+ signal mtie: std_logic := '0';
29
  signal mtvec_address: std_logic_vector(29 downto 0) := (others => '0');
30
  signal mtvec_mode: std_logic := '0';
31
  signal mscratch: std_logic_vector(31 downto 0) := (others => '0');
 
33
  signal mcause_int: std_logic := '0';
34
  signal mcause_code: std_logic_vector(3 downto 0) := (others => '0');
35
  signal mtval: std_logic_vector(31 downto 0) := (others => '0');
 
36
  signal mcycle: std_logic_vector(31 downto 0) := (others => '0');
37
  signal minstret: std_logic_vector(31 downto 0) := (others => '0');
38
  signal mcycleh: std_logic_vector(31 downto 0) := (others => '0');
 
49
  variable v_jump: std_logic;
50
  variable v_jump_address: std_logic_vector(31 downto 0);
51
  variable v_mem_req: mem_req_t;
52
+ variable v_mstatus_mpie, v_mstatus_mie: std_logic;
53
  variable v_mcycle_inc, v_mcycleh_inc: std_logic_vector(31 downto 0);
54
  variable v_mcycle, v_mcycleh: std_logic_vector(31 downto 0);
55
  variable v_minstret_inc, v_minstreth_inc: std_logic_vector(31 downto 0);
 
60
  variable v_mtime_inc, v_mtimeh_inc: std_logic_vector(31 downto 0);
61
  variable v_mtime, v_mtimeh: std_logic_vector(31 downto 0);
62
  variable v_mtimecmp, v_mtimecmph: std_logic_vector(31 downto 0);
63
+ variable v_mtip: std_logic;
64
+ variable v_mtval: std_logic_vector(31 downto 0);
65
+ variable v_mtie: std_logic;
66
+ variable v_mtvec_address: std_logic_vector(29 downto 0);
67
+ variable v_mtvec_mode: std_logic;
68
+ variable v_mscratch: std_logic_vector(31 downto 0);
69
 
70
  variable v_address, v_value: std_logic_vector(31 downto 0);
71
 
 
73
  variable v_temp: unsigned(63 downto 0);
74
 
75
  variable has_exception: boolean;
 
76
 
77
  begin
78
  if rising_edge(clk) then
 
82
  v_jump := '0';
83
  v_jump_address := (others => '0');
84
 
85
+ v_mstatus_mie := mstatus_mie;
86
+ v_mstatus_mpie := mstatus_mpie;
87
+
88
  v_temp := unsigned(mcycleh & mcycle) + 1;
89
  v_mcycle_inc := std_logic_vector(v_temp(31 downto 0));
90
  v_mcycle := v_mcycle_inc;
 
102
  v_mtimeh := v_mtimeh_inc;
103
  v_mtimecmp := mtimecmp;
104
  v_mtimecmph := mtimecmph;
105
+ v_mtval := mtval;
106
+ v_mtie := mtie;
107
+ v_mtvec_address := mtvec_address;
108
+ v_mtvec_mode := mtvec_mode;
109
+ v_mscratch := mscratch;
110
 
111
  has_exception := false;
 
112
 
113
  v_temp := unsigned(minstreth & minstret);
114
  if instr_retire = '1' then
115
  v_temp := v_temp + 1;
116
  end if;
117
 
118
+ v_minstret_inc := std_logic_vector(v_temp(31 downto 0));
119
+ v_minstreth_inc := std_logic_vector(v_temp(63 downto 32));
120
+ v_minstret := v_minstret_inc;
121
+ v_minstreth := v_minstret_inc;
122
+
123
+ if unsigned(mtimeh & mtime) > unsigned(mtimecmph & mtimecmp) then
124
+ v_mtip := '1';
125
+ else
126
+ v_mtip := '0';
127
+ end if;
128
 
129
  if input.is_active = '1' then
130
  if input.is_invalid_address = '1' then
131
  has_exception := true;
132
+ v_mcause_code := EX_CAUSE_INSTRUCTION_ACCESS_FAULT;
133
  elsif input.is_invalid = '1' then
134
  has_exception := true;
135
+ v_mcause_code := EX_CAUSE_ILLEGAL_INSTRUCTION;
136
  else
137
  if input.operation = OP_ADD then
138
  v_output.result := std_logic_vector(unsigned(input.operand1) + unsigned(input.operand2));
 
255
 
256
  if not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
257
  has_exception := true;
258
+ v_mcause_code := EX_CAUSE_STORE_ACCESS_FAULT;
259
  end if;
260
  elsif input.operation = OP_SH then
261
  v_address := input.operand1;
 
274
 
275
  if v_address(0) /= '0' then
276
  has_exception := true;
277
+ v_mcause_code := EX_CAUSE_STORE_ADDRESS_MISALIGNED;
278
  elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
279
  has_exception := true;
280
+ v_mcause_code := EX_CAUSE_STORE_ACCESS_FAULT;
281
  end if;
282
  elsif input.operation = OP_SW then
283
+ v_address := input.operand1;
284
 
285
  if v_address = MTIME_ADDRESS then
286
  v_mtime := input.operand2;
 
292
  v_mtimecmph := input.operand2;
293
  else
294
  v_mem_req.active := '1';
295
+ v_mem_req.address := v_address;
296
  v_mem_req.write_enable := "1111";
297
  v_mem_req.value := input.operand2;
298
 
299
  if v_address(1 downto 0) /= "00" then
300
  has_exception := true;
301
+ v_mcause_code := EX_CAUSE_STORE_ADDRESS_MISALIGNED;
302
  elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
303
  has_exception := true;
304
+ v_mcause_code := EX_CAUSE_STORE_ACCESS_FAULT;
305
  end if;
306
  end if;
307
  elsif input.operation = OP_LB or input.operation = OP_LH or input.operation = OP_LW or input.operation = OP_LBU or input.operation = OP_LHU then
 
329
  v_output.mem_size := SIZE_BYTE;
330
  if not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
331
  has_exception := true;
332
+ v_mcause_code := EX_CAUSE_LOAD_ACCESS_FAULT;
333
  end if;
334
  elsif input.operation = OP_LH or input.operation = OP_LHU then
335
  v_output.mem_size := SIZE_HALFWORD;
336
  if v_address(0) /= '0' then
337
  has_exception := true;
338
+ v_mcause_code := EX_CAUSE_LOAD_ADDRESS_MISALIGNED;
339
  elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
340
  has_exception := true;
341
+ v_mcause_code := EX_CAUSE_LOAD_ACCESS_FAULT;
342
  end if;
343
  else
344
  v_output.mem_size := SIZE_WORD;
345
  if v_address(1 downto 0) /= "00" then
346
  has_exception := true;
347
+ v_mcause_code := EX_CAUSE_LOAD_ADDRESS_MISALIGNED;
348
  elsif not (MEM_ADDRESS_MIN <= v_address and v_address <= MEM_ADDRESS_MAX) then
349
  has_exception := true;
350
+ v_mcause_code := EX_CAUSE_LOAD_ACCESS_FAULT;
351
  end if;
352
  end if;
353
  end if;
 
368
 
369
  if input.operand2(11 downto 0) = CSR_MSTATUS then
370
  v_output.result := "000000000000000000011000" & mstatus_mpie & "000" & mstatus_mie & "000";
371
+ v_mstatus_mie := (mstatus_mie or csr_set_bits(3)) and csr_clear_bits(3);
372
+ v_mstatus_mpie := (mstatus_mpie or csr_set_bits(7)) and csr_clear_bits(7);
373
  elsif input.operand2(11 downto 0) = CSR_MISA then
374
  v_output.result := MISA_VALUE;
375
  elsif input.operand2(11 downto 0) = CSR_MIE then
376
+ v_output.result := "000000000000000000000000" & mtie & "0000000";
377
+ v_mtie := (mtie or csr_set_bits(7)) and csr_clear_bits(7);
378
  elsif input.operand2(11 downto 0) = CSR_MTVEC then
379
  v_output.result := mtvec_address & "0" & mtvec_mode;
380
+ v_mtvec_address := (mtvec_address or csr_set_bits(31 downto 2)) and csr_clear_bits(31 downto 2);
381
+ v_mtvec_mode := (mtvec_mode or csr_set_bits(0)) and csr_clear_bits(0);
382
  elsif input.operand2(11 downto 0) = CSR_MSTATUSH then
383
  v_output.result := (others => '0');
384
  elsif input.operand2(11 downto 0) = CSR_MSCRATCH then
385
  v_output.result := mscratch;
386
+ v_mscratch := (mscratch or csr_set_bits) and csr_clear_bits;
387
  elsif input.operand2(11 downto 0) = CSR_MEPC then
388
  v_output.result := mepc & "00";
389
  v_mepc := (mepc or csr_set_bits(31 downto 2)) and csr_clear_bits(31 downto 2);
 
393
  mcause_code <= (mcause_code or csr_set_bits(5 downto 0)) and csr_clear_bits(5 downto 0);
394
  elsif input.operand2(11 downto 0) = CSR_MTVAL then
395
  v_output.result := mtval;
396
+ v_mtval := (mtval or csr_set_bits) and csr_clear_bits;
397
  elsif input.operand2(11 downto 0) = CSR_MIP then
398
+ v_output.result := "000000000000000000000000" & v_mtip & "0000000";
 
399
  elsif input.operand2(11 downto 0) = CSR_MCYCLE then
400
  v_output.result := mcycle;
401
  v_mcycle := (mcycle or csr_set_bits) and csr_clear_bits;
 
431
  else
432
  -- trying to read non-existent CSR
433
  has_exception := true;
434
+ v_mcause_code := EX_CAUSE_ILLEGAL_INSTRUCTION;
435
  end if;
436
  else
437
  -- trying to write to non-existent or read-only CSR
438
  has_exception := true;
439
+ v_mcause_code := EX_CAUSE_ILLEGAL_INSTRUCTION;
440
  end if;
441
  elsif input.operation = OP_MRET then
442
+ v_mstatus_mie := mstatus_mpie;
443
+ v_mstatus_mpie := '1';
444
  v_jump := '1';
445
  v_jump_address := mepc & "00";
446
  -- TODO: reset mepc?
447
  elsif input.operation = OP_ECALL then
448
  has_exception := true;
449
+ v_mcause_code := EX_CAUSE_ENVIRONMENT_CALL;
450
  elsif input.operation = OP_EBREAK then
451
  has_exception := true;
452
+ v_mcause_code := EX_CAUSE_BREAKPOINT;
453
  elsif input.operation = OP_LED then
454
  led <= input.operand1(7 downto 0);
455
  else
 
459
  v_output.destination_reg := input.destination_reg;
460
  end if;
461
 
462
+ if mstatus_mie = '1' and mtie = '1' and v_mtip = '1' then
463
+ has_exception := true;
464
+ v_mcause_int := '1';
465
+ v_mcause_code := INT_CAUSE_MACHINE_TIMER_INTERRUPT;
466
+ elsif v_jump = '1' and v_jump_address(1) /= '0' then
467
  has_exception := true;
468
+ v_mcause_code := EX_CAUSE_INSTRUCTION_ADDRESS_MISALIGNED;
469
  end if;
470
 
471
  if has_exception then
 
483
  v_minstret := v_minstret_inc;
484
  v_minstreth := v_minstreth_inc;
485
  v_mepc := input.pc(31 downto 2);
486
+ v_mtval := (others => '0');
487
+ v_mstatus_mie := '0';
488
+ v_mstatus_mpie := mstatus_mie;
489
+ v_mtie := mtie;
490
+ v_mtvec_address := mtvec_address;
491
+ v_mtvec_mode := mtvec_mode;
492
+ v_mscratch := mscratch;
493
+ v_mcause_int := mcause_int;
494
+ v_mcause_code := mcause_code;
495
  end if;
496
  end if;
497
 
 
510
  mepc <= v_mepc;
511
  mcause_int <= v_mcause_int;
512
  mcause_code <= v_mcause_code;
513
+ mtval <= v_mtval;
514
+ mstatus_mie <= v_mstatus_mie;
515
+ mstatus_mpie <= v_mstatus_mpie;
516
+ mtie <= v_mtie;
517
+ mtvec_address <= v_mtvec_address;
518
+ mtvec_mode <= v_mtvec_mode;
519
+ mscratch <= v_mscratch;
520
+ mcause_int <= v_mcause_int;
521
+ mcause_code <= v_mcause_code;
522
  end if;
523
  end process;
524
 

...

src/core/execute.vhd CHANGED
@@ -41,8 +41,11 @@ architecture rtl of execute is
41
  signal mtimeh: std_logic_vector(31 downto 0) := (others => '0');
42
  signal mtimecmp: std_logic_vector(31 downto 0) := (others => '0');
43
  signal mtimecmph: std_logic_vector(31 downto 0) := (others => '0');
 
44
  begin
45
 
 
 
46
  process (clk)
47
  variable v_output: execute_output_t;
48
  variable v_sign: std_logic_vector(31 downto 0);
@@ -66,6 +69,7 @@ begin
66
  variable v_mtvec_address: std_logic_vector(29 downto 0);
67
  variable v_mtvec_mode: std_logic;
68
  variable v_mscratch: std_logic_vector(31 downto 0);
 
69
 
70
  variable v_address, v_value: std_logic_vector(31 downto 0);
71
 
@@ -389,8 +393,8 @@ begin
389
  v_mepc := (mepc or csr_set_bits(31 downto 2)) and csr_clear_bits(31 downto 2);
390
  elsif input.operand2(11 downto 0) = CSR_MCAUSE then
391
  v_output.result := mcause_int & "000000000000000000000000000" & mcause_code;
392
- mcause_int <= (mcause_int or csr_set_bits(31)) and csr_clear_bits(31);
393
- mcause_code <= (mcause_code or csr_set_bits(5 downto 0)) and csr_clear_bits(5 downto 0);
394
  elsif input.operand2(11 downto 0) = CSR_MTVAL then
395
  v_output.result := mtval;
396
  v_mtval := (mtval or csr_set_bits) and csr_clear_bits;
@@ -451,7 +455,7 @@ begin
451
  has_exception := true;
452
  v_mcause_code := EX_CAUSE_BREAKPOINT;
453
  elsif input.operation = OP_LED then
454
- led <= input.operand1(7 downto 0);
455
  else
456
  assert false report "Unhandled operation value in execute stage" severity failure;
457
  end if;
@@ -492,6 +496,7 @@ begin
492
  v_mscratch := mscratch;
493
  v_mcause_int := mcause_int;
494
  v_mcause_code := mcause_code;
 
495
  end if;
496
  end if;
497
 
@@ -519,6 +524,7 @@ begin
519
  mscratch <= v_mscratch;
520
  mcause_int <= v_mcause_int;
521
  mcause_code <= v_mcause_code;
 
522
  end if;
523
  end process;
524
 
 
41
  signal mtimeh: std_logic_vector(31 downto 0) := (others => '0');
42
  signal mtimecmp: std_logic_vector(31 downto 0) := (others => '0');
43
  signal mtimecmph: std_logic_vector(31 downto 0) := (others => '0');
44
+ signal s_led: std_logic_vector(7 downto 0) := (others => '0');
45
  begin
46
 
47
+ led <= s_led;
48
+
49
  process (clk)
50
  variable v_output: execute_output_t;
51
  variable v_sign: std_logic_vector(31 downto 0);
 
69
  variable v_mtvec_address: std_logic_vector(29 downto 0);
70
  variable v_mtvec_mode: std_logic;
71
  variable v_mscratch: std_logic_vector(31 downto 0);
72
+ variable v_led: std_logic_vector(7 downto 0);
73
 
74
  variable v_address, v_value: std_logic_vector(31 downto 0);
75
 
 
393
  v_mepc := (mepc or csr_set_bits(31 downto 2)) and csr_clear_bits(31 downto 2);
394
  elsif input.operand2(11 downto 0) = CSR_MCAUSE then
395
  v_output.result := mcause_int & "000000000000000000000000000" & mcause_code;
396
+ v_mcause_int := (mcause_int or csr_set_bits(31)) and csr_clear_bits(31);
397
+ v_mcause_code := (mcause_code or csr_set_bits(5 downto 0)) and csr_clear_bits(5 downto 0);
398
  elsif input.operand2(11 downto 0) = CSR_MTVAL then
399
  v_output.result := mtval;
400
  v_mtval := (mtval or csr_set_bits) and csr_clear_bits;
 
455
  has_exception := true;
456
  v_mcause_code := EX_CAUSE_BREAKPOINT;
457
  elsif input.operation = OP_LED then
458
+ v_led := input.operand1(7 downto 0);
459
  else
460
  assert false report "Unhandled operation value in execute stage" severity failure;
461
  end if;
 
496
  v_mscratch := mscratch;
497
  v_mcause_int := mcause_int;
498
  v_mcause_code := mcause_code;
499
+ v_led := s_led;
500
  end if;
501
  end if;
502
 
 
524
  mscratch <= v_mscratch;
525
  mcause_int <= v_mcause_int;
526
  mcause_code <= v_mcause_code;
527
+ s_led <= v_led;
528
  end if;
529
  end process;
530