From 74b5af185290ecfc954483410b975413097c82c9 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Mon, 23 Aug 2021 21:45:45 +0800 Subject: [PATCH 01/56] add lcd define --- resources/tft-lcd/LCD.sv | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 resources/tft-lcd/LCD.sv diff --git a/resources/tft-lcd/LCD.sv b/resources/tft-lcd/LCD.sv new file mode 100644 index 0000000..05ed4d6 --- /dev/null +++ b/resources/tft-lcd/LCD.sv @@ -0,0 +1,28 @@ +module LCD ( + input logic clk, + input logic rst, + + // TFT-LCD + output logic CS, // 片选 低有效 + output logic RS, // 0命令 1数据 + output logic WR, // 写使能 低有效 + output logic RD, // 读使能 低有效 + output logic RSTN, // 复位 低有效 + inout logic [15:0] DATA, // 双向数据总线 + output logic BL_CTR, // 背光控制引脚 高点亮, 低关闭 + inout logic SDA , // I2C SDA + input logic PEN, // 触摸中断 + output logic CT_RST, // 触摸屏复位 + output logic SCL, // I2C SCL + + // CPU + output logic intr // To CPU中断信号 +); + // 复位同步 + assign RSTN = ~rst; + assign CT_RST = ~rst; + // 点亮背光 + assign BL_CTR = 1'b1; + + +endmodule \ No newline at end of file From 44d64ca579ecb555d9feb6e7631e7c28d6fafa74 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Mon, 23 Aug 2021 21:46:36 +0800 Subject: [PATCH 02/56] clean up --- resources/pic/Cache.dot | 11 - resources/pic/Cache.svg | 59 - resources/pic/drState.dot | 23 - resources/pic/drState.svg | 161 -- resources/pic/dwState.dot | 29 - resources/pic/dwState.svg | 176 -- resources/pic/dwaState.dot | 9 - resources/pic/dwaState.svg | 40 - resources/pic/iState.dot | 20 - resources/pic/iState.svg | 132 -- resources/project/.gitignore | 7 - resources/project/Makefile | 69 - resources/project/bin.lds.S | 54 - resources/project/convert.c | 84 - resources/project/include/asm/asm.h | 254 --- resources/project/include/asm/mipsregs.h | 1586 ----------------- resources/project/include/asm/regdef.h | 113 -- resources/project/include/cpu_cde.h | 35 - resources/project/include/tiny.h | 13 - resources/project/lib/io.S | 79 - resources/project/lib/stdio.c | 110 -- resources/project/src/main.c | 6 - resources/project/src/soc.h | 6 - resources/project/start.S | 39 - .../rtl/AMBA/axi2apb.v | 0 .../rtl/AMBA/axi_mux.v | 0 .../rtl/APB_DEV/UART2/UART.v | 0 .../rtl/APB_DEV/UART2/UART_RX.v | 0 .../rtl/APB_DEV/UART2/UART_TX.v | 0 .../rtl/APB_DEV/URT/raminfr.v | 0 .../rtl/APB_DEV/URT/uart_defines.h | 0 .../rtl/APB_DEV/URT/uart_receiver.v | 0 .../rtl/APB_DEV/URT/uart_regs.v | 0 .../rtl/APB_DEV/URT/uart_rfifo.v | 0 .../rtl/APB_DEV/URT/uart_sync_flops.v | 0 .../rtl/APB_DEV/URT/uart_tfifo.v | 0 .../rtl/APB_DEV/URT/uart_top.v | 0 .../rtl/APB_DEV/URT/uart_transmitter.v | 0 .../rtl/APB_DEV/apb_dev_top.v | 0 .../rtl/APB_DEV/apb_mux2.v | 0 .../rtl/CONFREG/confreg.v | 0 .../rtl/SPI/godson_sbridge_spi.v | 0 .../rtl/TOP/config.h | 0 .../rtl/TOP/soc_up_top.v | 0 .../axi_clock_converter.xci | 0 .../rtl/xilinx_ip/clk_pll/clk_pll.xci | 0 .../rtl/xilinx_ip/clk_wiz_0/clk_wiz_0.xci | 0 .../rtl/xilinx_ip/mig_axi_32/mig_a.prj | 0 .../rtl/xilinx_ip/mig_axi_32/mig_axi_32.xci | 0 .../rtl/xilinx_ip/mig_axi_32/mig_b.prj | 0 .../run_vivado/project_1/project_1.xpr | 0 .../run_vivado/soc_up.xdc | 0 .../testbench/MX25L6405D.v | 0 .../testbench/ddr3_model.sv | 0 .../testbench/ddr3_model_parameters.vh | 0 .../testbench/godson_system.v | 0 .../testbench/uart_dev.v | 0 57 files changed, 3115 deletions(-) delete mode 100644 resources/pic/Cache.dot delete mode 100644 resources/pic/Cache.svg delete mode 100644 resources/pic/drState.dot delete mode 100644 resources/pic/drState.svg delete mode 100644 resources/pic/dwState.dot delete mode 100644 resources/pic/dwState.svg delete mode 100644 resources/pic/dwaState.dot delete mode 100644 resources/pic/dwaState.svg delete mode 100644 resources/pic/iState.dot delete mode 100644 resources/pic/iState.svg delete mode 100644 resources/project/.gitignore delete mode 100644 resources/project/Makefile delete mode 100644 resources/project/bin.lds.S delete mode 100644 resources/project/convert.c delete mode 100644 resources/project/include/asm/asm.h delete mode 100644 resources/project/include/asm/mipsregs.h delete mode 100644 resources/project/include/asm/regdef.h delete mode 100644 resources/project/include/cpu_cde.h delete mode 100644 resources/project/include/tiny.h delete mode 100644 resources/project/lib/io.S delete mode 100644 resources/project/lib/stdio.c delete mode 100644 resources/project/src/main.c delete mode 100644 resources/project/src/soc.h delete mode 100644 resources/project/start.S rename resources/{soc_axi_system => system_top}/rtl/AMBA/axi2apb.v (100%) rename resources/{soc_axi_system => system_top}/rtl/AMBA/axi_mux.v (100%) rename resources/{soc_axi_system => system_top}/rtl/APB_DEV/UART2/UART.v (100%) rename resources/{soc_axi_system => system_top}/rtl/APB_DEV/UART2/UART_RX.v (100%) rename resources/{soc_axi_system => system_top}/rtl/APB_DEV/UART2/UART_TX.v (100%) rename resources/{soc_axi_system => system_top}/rtl/APB_DEV/URT/raminfr.v (100%) rename resources/{soc_axi_system => system_top}/rtl/APB_DEV/URT/uart_defines.h (100%) rename resources/{soc_axi_system => system_top}/rtl/APB_DEV/URT/uart_receiver.v (100%) rename resources/{soc_axi_system => system_top}/rtl/APB_DEV/URT/uart_regs.v (100%) rename resources/{soc_axi_system => system_top}/rtl/APB_DEV/URT/uart_rfifo.v (100%) rename resources/{soc_axi_system => system_top}/rtl/APB_DEV/URT/uart_sync_flops.v (100%) rename resources/{soc_axi_system => system_top}/rtl/APB_DEV/URT/uart_tfifo.v (100%) rename resources/{soc_axi_system => system_top}/rtl/APB_DEV/URT/uart_top.v (100%) rename resources/{soc_axi_system => system_top}/rtl/APB_DEV/URT/uart_transmitter.v (100%) rename resources/{soc_axi_system => system_top}/rtl/APB_DEV/apb_dev_top.v (100%) rename resources/{soc_axi_system => system_top}/rtl/APB_DEV/apb_mux2.v (100%) rename resources/{soc_axi_system => system_top}/rtl/CONFREG/confreg.v (100%) rename resources/{soc_axi_system => system_top}/rtl/SPI/godson_sbridge_spi.v (100%) rename resources/{soc_axi_system => system_top}/rtl/TOP/config.h (100%) rename resources/{soc_axi_system => system_top}/rtl/TOP/soc_up_top.v (100%) rename resources/{soc_axi_system => system_top}/rtl/xilinx_ip/axi_clock_converter/axi_clock_converter.xci (100%) rename resources/{soc_axi_system => system_top}/rtl/xilinx_ip/clk_pll/clk_pll.xci (100%) rename resources/{soc_axi_system => system_top}/rtl/xilinx_ip/clk_wiz_0/clk_wiz_0.xci (100%) rename resources/{soc_axi_system => system_top}/rtl/xilinx_ip/mig_axi_32/mig_a.prj (100%) rename resources/{soc_axi_system => system_top}/rtl/xilinx_ip/mig_axi_32/mig_axi_32.xci (100%) rename resources/{soc_axi_system => system_top}/rtl/xilinx_ip/mig_axi_32/mig_b.prj (100%) rename resources/{soc_axi_system => system_top}/run_vivado/project_1/project_1.xpr (100%) rename resources/{soc_axi_system => system_top}/run_vivado/soc_up.xdc (100%) rename resources/{soc_axi_system => system_top}/testbench/MX25L6405D.v (100%) rename resources/{soc_axi_system => system_top}/testbench/ddr3_model.sv (100%) rename resources/{soc_axi_system => system_top}/testbench/ddr3_model_parameters.vh (100%) rename resources/{soc_axi_system => system_top}/testbench/godson_system.v (100%) rename resources/{soc_axi_system => system_top}/testbench/uart_dev.v (100%) diff --git a/resources/pic/Cache.dot b/resources/pic/Cache.dot deleted file mode 100644 index e12ae74..0000000 --- a/resources/pic/Cache.dot +++ /dev/null @@ -1,11 +0,0 @@ -digraph ICache{ - splines=ortho - compound=true - node [shape=Mrecord] - edge [arrowhead=normal] - - IDLE->LOOKUP[xlabel="req" weight=5 color=green] - LOOKUP->REPLACE[xlabel="~hit" color=blue] - LOOKUP->IDLE[xlabel="hit" color=red] - REPLACE->IDLE[xlabel="refilled" color=orange] -} \ No newline at end of file diff --git a/resources/pic/Cache.svg b/resources/pic/Cache.svg deleted file mode 100644 index ae3658b..0000000 --- a/resources/pic/Cache.svg +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - -ICache - - - -IDLE - -IDLE - - - -LOOKUP - -LOOKUP - - - -IDLE->LOOKUP - - -req - - - -LOOKUP->IDLE - - -hit - - - -REPLACE - -REPLACE - - - -LOOKUP->REPLACE - - -~hit - - - -REPLACE->IDLE - - -refilled - - - diff --git a/resources/pic/drState.dot b/resources/pic/drState.dot deleted file mode 100644 index 9765a80..0000000 --- a/resources/pic/drState.dot +++ /dev/null @@ -1,23 +0,0 @@ -digraph drState{ - splines=polyline - compound=true - node [shape=Mrecord] - edge [arrowhead=normal] - - IDLE -> REFILL [label= ~cached or hit>] - IDLE -> IDLE [label= & hit>] - IDLE -> WA [label= ~hit
~axi.addr_ok>] - IDLE -> WD1 [label= ~hit
axi.addr_ok>] - - WA -> WA [label="~axi.addr_ok"] - WA -> WD1 [label="~axi.rvalid"] - WA -> WD2 [label=& cached>] - WA -> IDLE [label=& ~cached>] - - WD1 -> IDLE [label="axi.rvalid & ~cached"] - WD1 -> WD2 [label="axi.rvalid & cached"] - WD2 -> WD3 [label="axi.rvalid"] - WD3 -> WD4 [label="axi.rvalid"] - WD4 -> REFILL [label="axi.rvalid"] - REFILL -> IDLE [label="sync with dwState"] -} \ No newline at end of file diff --git a/resources/pic/drState.svg b/resources/pic/drState.svg deleted file mode 100644 index b6edfe0..0000000 --- a/resources/pic/drState.svg +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - -drState - - - -IDLE - -IDLE - - - -IDLE->IDLE - - -cached - & hit - - - -REFILL - -REFILL - - - -IDLE->REFILL - - -write - ~cached or hit - - - -WA - -WA - - - -IDLE->WA - - -cached - ~hit - ~axi.addr_ok - - - -WD1 - -WD1 - - - -IDLE->WD1 - - -cached - ~hit - axi.addr_ok - - - -REFILL->IDLE - - -sync with dwState - - - -WA->IDLE - - -axi.rvalid -& ~cached - - - -WA->WA - - -~axi.addr_ok - - - -WA->WD1 - - -~axi.rvalid - - - -WD2 - -WD2 - - - -WA->WD2 - - -axi.rvalid -& cached - - - -WD1->IDLE - - -axi.rvalid & ~cached - - - -WD1->WD2 - - -axi.rvalid & cached - - - -WD3 - -WD3 - - - -WD2->WD3 - - -axi.rvalid - - - -WD4 - -WD4 - - - -WD3->WD4 - - -axi.rvalid - - - -WD4->REFILL - - -axi.rvalid - - - diff --git a/resources/pic/dwState.dot b/resources/pic/dwState.dot deleted file mode 100644 index 5e7011d..0000000 --- a/resources/pic/dwState.dot +++ /dev/null @@ -1,29 +0,0 @@ -digraph dwState{ - splines=polyline - compound=true - node [shape=Mrecord] - edge [arrowhead=normal] - - IDLE -> WD1 [label="~axi.wready"] - IDLE -> WD2 [label= & cached>] - IDLE -> WB [label= & ~cached
& ~axi.data_ok>] - IDLE -> WAITR [label="sync with drState"] - - WD1 -> WD2 [label= & cached>] - WD1 -> WB [label= & ~cached
& ~axi.data_ok>] - WD1 -> IDLE [label= & ~cached
& axi.data_ok>] - - WD2 -> WD3 [label="axi.wready"] - - WD3 -> WD4 [label="axi.wready"] - - WD4 -> WB [label= & ~axi.data_ok>] - WD4 -> IDLE [label="sync with drState"] - WD4 -> WAITR [label="sync with drState"] - - WB -> IDLE [label="sync with drState"] - WB -> IDLE [label="sync with drState"] - WB -> WAITR [label="sync with drState"] - - WAITR -> IDLE [label="sync with drState"] -} \ No newline at end of file diff --git a/resources/pic/dwState.svg b/resources/pic/dwState.svg deleted file mode 100644 index 068c2ca..0000000 --- a/resources/pic/dwState.svg +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - -dwState - - - -IDLE - -IDLE - - - -WD1 - -WD1 - - - -IDLE->WD1 - - -~axi.wready - - - -WD2 - -WD2 - - - -IDLE->WD2 - - -axi.wready - & cached - - - -WB - -WB - - - -IDLE->WB - - -axi.wready - & ~cached - & ~axi.data_ok - - - -WAITR - -WAITR - - - -IDLE->WAITR - - -sync with drState - - - -WD1->IDLE - - -axi.wready - & ~cached - & axi.data_ok - - - -WD1->WD2 - - -axi.wready - & cached - - - -WD1->WB - - -axi.wready - & ~cached - & ~axi.data_ok - - - -WD3 - -WD3 - - - -WD2->WD3 - - -axi.wready - - - -WB->IDLE - - -sync with drState - - - -WB->IDLE - - -sync with drState - - - -WB->WAITR - - -sync with drState - - - -WAITR->IDLE - - -sync with drState - - - -WD4 - -WD4 - - - -WD3->WD4 - - -axi.wready - - - -WD4->IDLE - - -sync with drState - - - -WD4->WB - - -axi.wready - & ~axi.data_ok - - - -WD4->WAITR - - -sync with drState - - - diff --git a/resources/pic/dwaState.dot b/resources/pic/dwaState.dot deleted file mode 100644 index 7fb79b6..0000000 --- a/resources/pic/dwaState.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph dwaState{ - splines=polyline - compound=true - node [shape=Mrecord] - edge [arrowhead=normal] - - IDLE -> WA [label= & ~axi.addr_ok>] - WA -> IDLE [label="axi.addr_ok"] -} \ No newline at end of file diff --git a/resources/pic/dwaState.svg b/resources/pic/dwaState.svg deleted file mode 100644 index 23bb81a..0000000 --- a/resources/pic/dwaState.svg +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - -dwaState - - - -IDLE - -IDLE - - - -WA - -WA - - - -IDLE->WA - - -req - & ~axi.addr_ok - - - -WA->IDLE - - -axi.addr_ok - - - diff --git a/resources/pic/iState.dot b/resources/pic/iState.dot deleted file mode 100644 index cc274b2..0000000 --- a/resources/pic/iState.dot +++ /dev/null @@ -1,20 +0,0 @@ -digraph iState{ - splines=polyline - compound=true - node [shape=Mrecord] - edge [arrowhead=normal] - - IDLE -> WA [label=& ~hit
& ~axi.addr_ok>] - IDLE -> WD1 [label=& ~hit
& axi.addr_ok>] - - WA -> WD1 [label=&~axi.rvalid>] - WA -> WD2 [label=&axi.rvalid>] - - WD1 -> WD2 [label="axi.rvalid"] - - WD2 -> WD3 [label=& cached>] - WD2 -> IDLE [label=& ~cached>] - WD3 -> WD8 [style=dashed label="axi.rvalid"] - WD8 -> REFILL [label="sync with dwState"] - REFILL -> IDLE -} \ No newline at end of file diff --git a/resources/pic/iState.svg b/resources/pic/iState.svg deleted file mode 100644 index 18a161d..0000000 --- a/resources/pic/iState.svg +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - -iState - - - -IDLE - -IDLE - - - -WA - -WA - - - -IDLE->WA - - -cached -& ~hit -& ~axi.addr_ok - - - -WD1 - -WD1 - - - -IDLE->WD1 - - -cached -& ~hit -& axi.addr_ok - - - -WA->WD1 - - -axi.addr_ok -&~axi.rvalid - - - -WD2 - -WD2 - - - -WA->WD2 - - -axi.addr_ok -&axi.rvalid - - - -WD1->WD2 - - -axi.rvalid - - - -WD2->IDLE - - -axi.rvalid -& ~cached - - - -WD3 - -WD3 - - - -WD2->WD3 - - -axi.rvalid -& cached - - - -WD8 - -WD8 - - - -WD3->WD8 - - -axi.rvalid - - - -REFILL - -REFILL - - - -WD8->REFILL - - -sync with dwState - - - -REFILL->IDLE - - - - - diff --git a/resources/project/.gitignore b/resources/project/.gitignore deleted file mode 100644 index e28454a..0000000 --- a/resources/project/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -.idea/ -obj/ -*.a -*.o -bin.lds -convert -compile_commands.json \ No newline at end of file diff --git a/resources/project/Makefile b/resources/project/Makefile deleted file mode 100644 index 07c0a6e..0000000 --- a/resources/project/Makefile +++ /dev/null @@ -1,69 +0,0 @@ -CROSS_COMPILE ?= mipsel-linux-gnu- -CC = ${CROSS_COMPILE}gcc -LD = ${CROSS_COMPILE}ld -OBJCOPY = ${CROSS_COMPILE}objcopy -OBJDUMP = ${CROSS_COMPILE}objdump -AR = ${CROSS_COMPILE}ar - -CFLAGS = -O3 -fno-pic -mno-branch-likely -mno-abicalls -msoft-float -fno-builtin -mno-shared -mips1 -EL -nostdinc -nostdlib - -OBJ_DIR = obj - -USER_DIR = src -USER_OBJ_DIR = obj/user -USER_SRC = $(wildcard $(USER_DIR)/*.S) $(wildcard $(USER_DIR)/*.c) -USER_OBJ := $(patsubst $(USER_DIR)/%.S, $(USER_OBJ_DIR)/%.o, $(USER_SRC)) -USER_OBJ := $(patsubst $(USER_DIR)/%.c, $(USER_OBJ_DIR)/%.o, $(USER_OBJ)) - -TINY_C_DIR = lib -TINY_C_OBJ_DIR = obj/tinyc -TINY_C_SRC = $(wildcard $(TINY_C_DIR)/*.S) $(wildcard $(TINY_C_DIR)/*.c) -TINY_C_OBJ := $(patsubst $(TINY_C_DIR)/%.S, $(TINY_C_OBJ_DIR)/%.o, $(TINY_C_SRC)) -TINY_C_OBJ := $(patsubst $(TINY_C_DIR)/%.c, $(TINY_C_OBJ_DIR)/%.o, $(TINY_C_OBJ)) -TINY_C_TARGET = $(TINY_C_OBJ_DIR)/libtinyc.a - -default: all - -%.o : %.S - $(CC) -c -I include $(CFLAGS) -o $@ $< - -%.o : %.c - $(CC) -c -I include $(CFLAGS) -o $@ $< - -$(TINY_C_TARGET): $(TINY_C_OBJ) - $(AR) -cr $@ $^ - -bin.lds: bin.lds.S - $(CC) -EL -E -P -o $@ $< - -main.elf: start.o bin.lds $(TINY_C_TARGET) $(USER_OBJ) - $(LD) -g -EL -T bin.lds start.o $(USER_OBJ) $(TINY_C_TARGET) -o $(OBJ_DIR)/$@ - $(OBJDUMP) -alD $(OBJ_DIR)/$@ > $(OBJ_DIR)/test.s - -axi_ram.bin: main.elf - $(OBJCOPY) -O binary -j .text -j .data $(OBJ_DIR)/$< $(OBJ_DIR)/$@ - -all: env convert axi_ram.bin - ./convert axi_ram.bin $(OBJ_DIR)/ - -convert: convert.c - clang -o convert convert.c - -env: - mkdir -p $(USER_OBJ_DIR) - mkdir -p $(TINY_C_OBJ_DIR) - -clean: - rm -f *.o *.bin *.elf *.a testbin *.s *.vlog *.coe *.data *.mif - rm -f bin.lds convert - rm -rf obj - -help: - @echo "####################################################################" - @echo "### help for compiling our awesome project ###" - @echo "####################################################################" - @echo "### options: ###" - @echo "### make : get compiled result, which is saved in ./obj ###" - @echo "### make clean: remove *.o, *.a, and ./obj ###" - @echo "### make help : show help information ###" - @echo "####################################################################" diff --git a/resources/project/bin.lds.S b/resources/project/bin.lds.S deleted file mode 100644 index 5384ca1..0000000 --- a/resources/project/bin.lds.S +++ /dev/null @@ -1,54 +0,0 @@ -ENTRY(_init) -OUTPUT("main.elf") -OUTPUT_ARCH("mips:isa32r2") -OUTPUT_FORMAT("elf32-tradlittlemips") - -PROVIDE(MEM_SIZE = 0x88000000); -SECTIONS -{ - /* SPI-FLASH mapped to bfc0_0000 */ - . = 0x80000000; - .text : { - *(.text.init) - - . = 0x380; - *(.text.exception) - - . = 0x1000; - _text_ebase_begin = .; - *(.text.ebase) - _text_ebase_end = .; - - . = ALIGN(0x1000); - _text_code_begin = .; - *(.text) - _text_code_end = .; - } - - /* . = 0x807F0000; */ - .data : { - *(.rodata*) - *(.data) - _gp = ALIGN(16) + 0x7ff0; - *(.got.plt) *(.got) - *(.sdata) *(.sdata.*) *(.lit8) *(.lit4) - . = ALIGN(16); - } - .bss : { - _sbss = .; - *(.bss) - *(COMMON) - . = ALIGN(4); - _ebss = .; - } - - . = ALIGN(0x1000); - _heap = . ; - - _stack = MEM_SIZE - 4; - - - /DISCARD/ : { - *(.MIPS.abiflags) - } -} diff --git a/resources/project/convert.c b/resources/project/convert.c deleted file mode 100644 index ab7a1f4..0000000 --- a/resources/project/convert.c +++ /dev/null @@ -1,84 +0,0 @@ -#include -#include -#include - -void binary_out(FILE* out,unsigned char* mem) -{ - char tmp; - unsigned char num[8]; - num[0] = 1; - num[1] = 2; - num[2] = 4; - num[3] = 8; - num[4] = 16; - num[5] = 32; - num[6] = 64; - num[7] = 128; - for(int i=3;i>=0;i--) - { - for(int j=7;j>=0;j--) - { - if( (mem[i] & num[j] ) != 0) - tmp = '1'; - else - tmp = '0'; - fprintf(out,"%c",tmp); - } - } - fprintf(out,"\n"); - return; -} - -int main(int argc, char** argv) -{ - FILE *in; - FILE *out; - - if(argc < 3){ - fprintf(stderr, "Usage: convert main.bin main.data directory\n"); - return 1; - } - - char str_bin[256]; - char str_coe[256], str_mif[256]; - strncpy(str_bin, argv[2], 256); - strncpy(str_coe, argv[2], 256); - strncpy(str_mif, argv[2], 256); - strncat(str_bin, argv[1], 256); - strncat(str_coe, "axi_ram.coe", 256); - strncat(str_mif, "axi_ram.mif", 256); - //printf("%s\n%s\n%s\n%s\n%s\n%s\n", str_bin, str_data, str_inst_coe, str_inst_mif, str_data_coe, str_data_mif); - - int i,j,k; - unsigned char mem[32]; - - in = fopen(str_bin, "rb"); - out = fopen(str_coe,"w"); - - fprintf(out, "memory_initialization_radix = 16;\n"); - fprintf(out, "memory_initialization_vector =\n"); - while(!feof(in)) { - if(fread(mem,1,4,in)!=4) { - fprintf(out, "%02x%02x%02x%02x\n", mem[3], mem[2], mem[1], mem[0]); - break; - } - fprintf(out, "%02x%02x%02x%02x\n", mem[3], mem[2], mem[1],mem[0]); - } - fclose(in); - fclose(out); - - in = fopen(str_bin, "rb"); - out = fopen(str_mif,"w"); - - while(!feof(in)) { - if(fread(mem,1,4,in)!=4) { - binary_out(out,mem); - break; - } - binary_out(out,mem); - } - fclose(in); - fclose(out); - - return 0; -} diff --git a/resources/project/include/asm/asm.h b/resources/project/include/asm/asm.h deleted file mode 100644 index 00aa7f4..0000000 --- a/resources/project/include/asm/asm.h +++ /dev/null @@ -1,254 +0,0 @@ -/* $OpenBSD: asm.h,v 1.2 1998/03/16 09:03:02 pefo Exp $ */ - -/* - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Ralph Campbell. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * Copyright (C) 1989 Digital Equipment Corporation. - * Permission to use, copy, modify, and distribute this software and - * its documentation for any purpose and without fee is hereby granted, - * provided that the above copyright notice appears in all copies. - * Digital Equipment Corporation makes no representations about the - * suitability of this software for any purpose. It is provided "as is" - * without express or implied warranty. - */ - -#ifndef _MIPS_ASM_H -#define _MIPS_ASM_H - -#include - -#ifndef ABICALLS -#define ABICALLS .abicalls -#endif - -#if defined(ABICALLS) && !defined(_KERNEL) - ABICALLS -#endif - -#define RCSID(x) - -/* - * Define how to access unaligned data word - */ -#if defined(__MIPSEL__) -#define LWLO lwl -#define LWHI lwr -#define SWLO swl -#define SWHI swr -#else -#if defined(__MIPSEB__) -#define LWLO lwr -#define LWHI lwl -#define SWLO swr -#define SWHI swl -#else -#error "__MIPSEL__ or __MIPSEB__ must be defined" -#endif -#endif - -/* - * Code for setting gp reg if abicalls are used. - */ -#if defined(ABICALLS) && !defined(_KERNEL) -#define ABISETUP \ - .set noreorder; \ - .cpload t9; \ - .set reorder; -#else -#define ABISETUP -#endif - -/* - * Define -pg profile entry code. - */ -#if defined(GPROF) || defined(PROF) -#define MCOUNT \ - subu sp, sp, 32; \ - .cprestore 16; \ - sw ra, 28(sp); \ - sw gp, 24(sp); \ - .set noat; \ - .set noreorder; \ - move AT, ra; \ - jal _mcount; \ - subu sp, sp, 8; \ - lw ra, 28(sp); \ - addu sp, sp, 32; \ - .set reorder; \ - .set at; -#else -#define MCOUNT -#endif - -/* - * LEAF(x) - * - * Declare a leaf routine. - */ -#define LEAF(x) \ - .align 3; \ - .globl x; \ - .ent x, 0; \ -x: ; \ - .frame sp, 0, ra; \ - ABISETUP \ - MCOUNT - -#define ALEAF(x) \ - .globl x; \ -x: - -/* - * NLEAF(x) - * - * Declare a non-profiled leaf routine. - */ -#define NLEAF(x) \ - .align 3; \ - .globl x; \ - .ent x, 0; \ -x: ; \ - .frame sp, 0, ra; \ - ABISETUP - -/* - * NON_LEAF(x) - * - * Declare a non-leaf routine (a routine that makes other C calls). - */ -#define NON_LEAF(x, fsize, retpc) \ - .align 3; \ - .globl x; \ - .ent x, 0; \ -x: ; \ - .frame sp, fsize, retpc; \ - ABISETUP \ - MCOUNT - -/* - * NNON_LEAF(x) - * - * Declare a non-profiled non-leaf routine - * (a routine that makes other C calls). - */ -#define NNON_LEAF(x, fsize, retpc) \ - .align 3; \ - .globl x; \ - .ent x, 0; \ -x: ; \ - .frame sp, fsize, retpc \ - ABISETUP - -/* - * END(x) - * - * Mark end of a procedure. - */ -#define END(x) \ - .end x - -/* - * Macros to panic and printf from assembly language. - */ -#define PANIC(msg) \ - la a0, 9f; \ - jal panic; \ - MSG(msg) - -#define PRINTF(msg) \ - la a0, 9f; \ - jal printf; \ - MSG(msg) - -#define MSG(msg) \ - .rdata; \ -9: .asciiz msg; \ - .text - -#define ASMSTR(str) \ - .asciiz str; \ - .align 3 - -#if (_MIPS_SZPTR == 32) -#define PTR_ADD add -#define PTR_ADDU addu -#define PTR_ADDI addi -#define PTR_ADDIU addiu -#define PTR_SUB sub -#define PTR_SUBU subu -#define PTR_L lw -#define PTR_S sw -#define PTR_LA la -#define PTR_LI li -#define PTR_SLL sll -#define PTR_SLLV sllv -#define PTR_SRL srl -#define PTR_SRLV srlv -#define PTR_SRA sra -#define PTR_SRAV srav - -#define PTR_SCALESHIFT 2 - -#define PTR .word -#define PTRSIZE 4 -#define PTRLOG 2 -#endif - -#if (_MIPS_SZPTR == 64) -#define PTR_ADD dadd -#define PTR_ADDU daddu -#define PTR_ADDI daddi -#define PTR_ADDIU daddiu -#define PTR_SUB dsub -#define PTR_SUBU dsubu -#define PTR_L ld -#define PTR_S sd -#define PTR_LA dla -#define PTR_LI dli -#define PTR_SLL dsll -#define PTR_SLLV dsllv -#define PTR_SRL dsrl -#define PTR_SRLV dsrlv -#define PTR_SRA dsra -#define PTR_SRAV dsrav - -#define PTR_SCALESHIFT 3 - -#define PTR .dword -#define PTRSIZE 8 -#define PTRLOG 3 -#endif - -#endif /* !_MIPS_ASM_H */ diff --git a/resources/project/include/asm/mipsregs.h b/resources/project/include/asm/mipsregs.h deleted file mode 100644 index 6b6d937..0000000 --- a/resources/project/include/asm/mipsregs.h +++ /dev/null @@ -1,1586 +0,0 @@ -/* - * This file is subject to the terms and conditions of the GNU General Public - * License. See the file "COPYING" in the main directory of this archive - * for more details. - * - * Copyright (C) 1994, 1995, 1996, 1997, 2000, 2001 by Ralf Baechle - * Copyright (C) 2000 Silicon Graphics, Inc. - * Modified for further R[236]000 support by Paul M. Antoine, 1996. - * Kevin D. Kissell, kevink@mips.com and Carsten Langgaard, carstenl@mips.com - * Copyright (C) 2000, 07 MIPS Technologies, Inc. - * Copyright (C) 2003, 2004 Maciej W. Rozycki - */ -#ifndef _ASM_MIPSREGS_H -#define _ASM_MIPSREGS_H - -//#include -//#include -//#include - -/* - * The following macros are especially useful for __asm__ - * inline assembler. - */ -#ifndef __STR -#define __STR(x) #x -#endif -#ifndef STR -#define STR(x) __STR(x) -#endif - -/* - * Configure language - */ -#ifdef __ASSEMBLY__ -#define _ULCAST_ -#else -#define _ULCAST_ (unsigned long) -#endif - -/* - * Coprocessor 0 register names - */ -#define CP0_INDEX $0 -#define CP0_RANDOM $1 -#define CP0_ENTRYLO0 $2 -#define CP0_ENTRYLO1 $3 -#define CP0_CONF $3 -#define CP0_CONTEXT $4 -#define CP0_PAGEMASK $5 -#define CP0_WIRED $6 -#define CP0_INFO $7 -#define CP0_BADVADDR $8 -#define CP0_COUNT $9 -#define CP0_ENTRYHI $10 -#define CP0_COMPARE $11 -#define CP0_STATUS $12 -#define CP0_CAUSE $13 -#define CP0_EPC $14 -#define CP0_PRID $15 -#define CP0_CONFIG $16 -#define CP0_LLADDR $17 -#define CP0_WATCHLO $18 -#define CP0_WATCHHI $19 -#define CP0_XCONTEXT $20 -#define CP0_FRAMEMASK $21 -#define CP0_DIAGNOSTIC $22 -#define CP0_DEBUG $23 -#define CP0_DEPC $24 -#define CP0_PERFORMANCE $25 -#define CP0_ECC $26 -#define CP0_CACHEERR $27 -#define CP0_TAGLO $28 -#define CP0_TAGHI $29 -#define CP0_ERROREPC $30 -#define CP0_DESAVE $31 - -/* - * R4640/R4650 cp0 register names. These registers are listed - * here only for completeness; without MMU these CPUs are not useable - * by Linux. A future ELKS port might take make Linux run on them - * though ... - */ -#define CP0_IBASE $0 -#define CP0_IBOUND $1 -#define CP0_DBASE $2 -#define CP0_DBOUND $3 -#define CP0_CALG $17 -#define CP0_IWATCH $18 -#define CP0_DWATCH $19 - -/* - * Coprocessor 0 Set 1 register names - */ -#define CP0_S1_DERRADDR0 $26 -#define CP0_S1_DERRADDR1 $27 -#define CP0_S1_INTCONTROL $20 - -/* - * Coprocessor 0 Set 2 register names - */ -#define CP0_S2_SRSCTL $12 /* MIPSR2 */ - -/* - * Coprocessor 0 Set 3 register names - */ -#define CP0_S3_SRSMAP $12 /* MIPSR2 */ - -/* - * TX39 Series - */ -#define CP0_TX39_CACHE $7 - -/* - * Coprocessor 1 (FPU) register names - */ -#define CP1_REVISION $0 -#define CP1_STATUS $31 - -/* - * FPU Status Register Values - */ -/* - * Status Register Values - */ - -#define FPU_CSR_FLUSH 0x01000000 /* flush denormalised results to 0 */ -#define FPU_CSR_COND 0x00800000 /* $fcc0 */ -#define FPU_CSR_COND0 0x00800000 /* $fcc0 */ -#define FPU_CSR_COND1 0x02000000 /* $fcc1 */ -#define FPU_CSR_COND2 0x04000000 /* $fcc2 */ -#define FPU_CSR_COND3 0x08000000 /* $fcc3 */ -#define FPU_CSR_COND4 0x10000000 /* $fcc4 */ -#define FPU_CSR_COND5 0x20000000 /* $fcc5 */ -#define FPU_CSR_COND6 0x40000000 /* $fcc6 */ -#define FPU_CSR_COND7 0x80000000 /* $fcc7 */ - -/* - * Bits 18 - 20 of the FPU Status Register will be read as 0, - * and should be written as zero. - */ -#define FPU_CSR_RSVD 0x001c0000 - -/* - * X the exception cause indicator - * E the exception enable - * S the sticky/flag bit -*/ -#define FPU_CSR_ALL_X 0x0003f000 -#define FPU_CSR_UNI_X 0x00020000 -#define FPU_CSR_INV_X 0x00010000 -#define FPU_CSR_DIV_X 0x00008000 -#define FPU_CSR_OVF_X 0x00004000 -#define FPU_CSR_UDF_X 0x00002000 -#define FPU_CSR_INE_X 0x00001000 - -#define FPU_CSR_ALL_E 0x00000f80 -#define FPU_CSR_INV_E 0x00000800 -#define FPU_CSR_DIV_E 0x00000400 -#define FPU_CSR_OVF_E 0x00000200 -#define FPU_CSR_UDF_E 0x00000100 -#define FPU_CSR_INE_E 0x00000080 - -#define FPU_CSR_ALL_S 0x0000007c -#define FPU_CSR_INV_S 0x00000040 -#define FPU_CSR_DIV_S 0x00000020 -#define FPU_CSR_OVF_S 0x00000010 -#define FPU_CSR_UDF_S 0x00000008 -#define FPU_CSR_INE_S 0x00000004 - -/* Bits 0 and 1 of FPU Status Register specify the rounding mode */ -#define FPU_CSR_RM 0x00000003 -#define FPU_CSR_RN 0x0 /* nearest */ -#define FPU_CSR_RZ 0x1 /* towards zero */ -#define FPU_CSR_RU 0x2 /* towards +Infinity */ -#define FPU_CSR_RD 0x3 /* towards -Infinity */ - - -/* - * Values for PageMask register - */ -#ifdef CONFIG_CPU_VR41XX - -/* Why doesn't stupidity hurt ... */ - -#define PM_1K 0x00000000 -#define PM_4K 0x00001800 -#define PM_16K 0x00007800 -#define PM_64K 0x0001f800 -#define PM_256K 0x0007f800 - -#else - -#define PM_4K 0x00000000 -#define PM_8K 0x00002000 -#define PM_16K 0x00006000 -#define PM_32K 0x0000e000 -#define PM_64K 0x0001e000 -#define PM_128K 0x0003e000 -#define PM_256K 0x0007e000 -#define PM_512K 0x000fe000 -#define PM_1M 0x001fe000 -#define PM_2M 0x003fe000 -#define PM_4M 0x007fe000 -#define PM_8M 0x00ffe000 -#define PM_16M 0x01ffe000 -#define PM_32M 0x03ffe000 -#define PM_64M 0x07ffe000 -#define PM_256M 0x1fffe000 -#define PM_1G 0x7fffe000 - -#endif - -/* - * Default page size for a given kernel configuration - */ -#ifdef CONFIG_PAGE_SIZE_4KB -#define PM_DEFAULT_MASK PM_4K -#elif defined(CONFIG_PAGE_SIZE_8KB) -#define PM_DEFAULT_MASK PM_8K -#elif defined(CONFIG_PAGE_SIZE_16KB) -#define PM_DEFAULT_MASK PM_16K -#elif defined(CONFIG_PAGE_SIZE_32KB) -#define PM_DEFAULT_MASK PM_32K -#elif defined(CONFIG_PAGE_SIZE_64KB) -#define PM_DEFAULT_MASK PM_64K -#else -#error Bad page size configuration! -#endif - -/* - * Default huge tlb size for a given kernel configuration - */ -#ifdef CONFIG_PAGE_SIZE_4KB -#define PM_HUGE_MASK PM_1M -#elif defined(CONFIG_PAGE_SIZE_8KB) -#define PM_HUGE_MASK PM_4M -#elif defined(CONFIG_PAGE_SIZE_16KB) -#define PM_HUGE_MASK PM_16M -#elif defined(CONFIG_PAGE_SIZE_32KB) -#define PM_HUGE_MASK PM_64M -#elif defined(CONFIG_PAGE_SIZE_64KB) -#define PM_HUGE_MASK PM_256M -#elif defined(CONFIG_HUGETLB_PAGE) -#error Bad page size configuration for hugetlbfs! -#endif - -/* - * Values used for computation of new tlb entries - */ -#define PL_4K 12 -#define PL_16K 14 -#define PL_64K 16 -#define PL_256K 18 -#define PL_1M 20 -#define PL_4M 22 -#define PL_16M 24 -#define PL_64M 26 -#define PL_256M 28 - -/* - * R4x00 interrupt enable / cause bits - */ -#define IE_SW0 (_ULCAST_(1) << 8) -#define IE_SW1 (_ULCAST_(1) << 9) -#define IE_IRQ0 (_ULCAST_(1) << 10) -#define IE_IRQ1 (_ULCAST_(1) << 11) -#define IE_IRQ2 (_ULCAST_(1) << 12) -#define IE_IRQ3 (_ULCAST_(1) << 13) -#define IE_IRQ4 (_ULCAST_(1) << 14) -#define IE_IRQ5 (_ULCAST_(1) << 15) - -/* - * R4x00 interrupt cause bits - */ -#define C_SW0 (_ULCAST_(1) << 8) -#define C_SW1 (_ULCAST_(1) << 9) -#define C_IRQ0 (_ULCAST_(1) << 10) -#define C_IRQ1 (_ULCAST_(1) << 11) -#define C_IRQ2 (_ULCAST_(1) << 12) -#define C_IRQ3 (_ULCAST_(1) << 13) -#define C_IRQ4 (_ULCAST_(1) << 14) -#define C_IRQ5 (_ULCAST_(1) << 15) - -/* - * Bitfields in the R4xx0 cp0 status register - */ -#define ST0_IE 0x00000001 -#define ST0_EXL 0x00000002 -#define ST0_ERL 0x00000004 -#define ST0_KSU 0x00000018 -# define KSU_USER 0x00000010 -# define KSU_SUPERVISOR 0x00000008 -# define KSU_KERNEL 0x00000000 -#define ST0_UX 0x00000020 -#define ST0_SX 0x00000040 -#define ST0_KX 0x00000080 -#define ST0_DE 0x00010000 -#define ST0_CE 0x00020000 - -/* - * Setting c0_status.co enables Hit_Writeback and Hit_Writeback_Invalidate - * cacheops in userspace. This bit exists only on RM7000 and RM9000 - * processors. - */ -#define ST0_CO 0x08000000 - -/* - * Bitfields in the R[23]000 cp0 status register. - */ -#define ST0_IEC 0x00000001 -#define ST0_KUC 0x00000002 -#define ST0_IEP 0x00000004 -#define ST0_KUP 0x00000008 -#define ST0_IEO 0x00000010 -#define ST0_KUO 0x00000020 -/* bits 6 & 7 are reserved on R[23]000 */ -#define ST0_ISC 0x00010000 -#define ST0_SWC 0x00020000 -#define ST0_CM 0x00080000 - -/* - * Bits specific to the R4640/R4650 - */ -#define ST0_UM (_ULCAST_(1) << 4) -#define ST0_IL (_ULCAST_(1) << 23) -#define ST0_DL (_ULCAST_(1) << 24) - -/* - * Enable the MIPS MDMX and DSP ASEs - */ -#define ST0_MX 0x01000000 - -/* - * Bitfields in the TX39 family CP0 Configuration Register 3 - */ -#define TX39_CONF_ICS_SHIFT 19 -#define TX39_CONF_ICS_MASK 0x00380000 -#define TX39_CONF_ICS_1KB 0x00000000 -#define TX39_CONF_ICS_2KB 0x00080000 -#define TX39_CONF_ICS_4KB 0x00100000 -#define TX39_CONF_ICS_8KB 0x00180000 -#define TX39_CONF_ICS_16KB 0x00200000 - -#define TX39_CONF_DCS_SHIFT 16 -#define TX39_CONF_DCS_MASK 0x00070000 -#define TX39_CONF_DCS_1KB 0x00000000 -#define TX39_CONF_DCS_2KB 0x00010000 -#define TX39_CONF_DCS_4KB 0x00020000 -#define TX39_CONF_DCS_8KB 0x00030000 -#define TX39_CONF_DCS_16KB 0x00040000 - -#define TX39_CONF_CWFON 0x00004000 -#define TX39_CONF_WBON 0x00002000 -#define TX39_CONF_RF_SHIFT 10 -#define TX39_CONF_RF_MASK 0x00000c00 -#define TX39_CONF_DOZE 0x00000200 -#define TX39_CONF_HALT 0x00000100 -#define TX39_CONF_LOCK 0x00000080 -#define TX39_CONF_ICE 0x00000020 -#define TX39_CONF_DCE 0x00000010 -#define TX39_CONF_IRSIZE_SHIFT 2 -#define TX39_CONF_IRSIZE_MASK 0x0000000c -#define TX39_CONF_DRSIZE_SHIFT 0 -#define TX39_CONF_DRSIZE_MASK 0x00000003 - -/* - * Status register bits available in all MIPS CPUs. - */ -#define ST0_IM 0x0000ff00 -#define STATUSB_IP0 8 -#define STATUSF_IP0 (_ULCAST_(1) << 8) -#define STATUSB_IP1 9 -#define STATUSF_IP1 (_ULCAST_(1) << 9) -#define STATUSB_IP2 10 -#define STATUSF_IP2 (_ULCAST_(1) << 10) -#define STATUSB_IP3 11 -#define STATUSF_IP3 (_ULCAST_(1) << 11) -#define STATUSB_IP4 12 -#define STATUSF_IP4 (_ULCAST_(1) << 12) -#define STATUSB_IP5 13 -#define STATUSF_IP5 (_ULCAST_(1) << 13) -#define STATUSB_IP6 14 -#define STATUSF_IP6 (_ULCAST_(1) << 14) -#define STATUSB_IP7 15 -#define STATUSF_IP7 (_ULCAST_(1) << 15) -#define STATUSB_IP8 0 -#define STATUSF_IP8 (_ULCAST_(1) << 0) -#define STATUSB_IP9 1 -#define STATUSF_IP9 (_ULCAST_(1) << 1) -#define STATUSB_IP10 2 -#define STATUSF_IP10 (_ULCAST_(1) << 2) -#define STATUSB_IP11 3 -#define STATUSF_IP11 (_ULCAST_(1) << 3) -#define STATUSB_IP12 4 -#define STATUSF_IP12 (_ULCAST_(1) << 4) -#define STATUSB_IP13 5 -#define STATUSF_IP13 (_ULCAST_(1) << 5) -#define STATUSB_IP14 6 -#define STATUSF_IP14 (_ULCAST_(1) << 6) -#define STATUSB_IP15 7 -#define STATUSF_IP15 (_ULCAST_(1) << 7) -#define ST0_CH 0x00040000 -#define ST0_SR 0x00100000 -#define ST0_TS 0x00200000 -#define ST0_BEV 0x00400000 -#define ST0_RE 0x02000000 -#define ST0_FR 0x04000000 -#define ST0_CU 0xf0000000 -#define ST0_CU0 0x10000000 -#define ST0_CU1 0x20000000 -#define ST0_CU2 0x40000000 -#define ST0_CU3 0x80000000 -#define ST0_XX 0x80000000 /* MIPS IV naming */ - -/* - * Bitfields and bit numbers in the coprocessor 0 cause register. - * - * Refer to your MIPS R4xx0 manual, chapter 5 for explanation. - */ -#define CAUSEB_EXCCODE 2 -#define CAUSEF_EXCCODE (_ULCAST_(31) << 2) -#define CAUSEB_IP 8 -#define CAUSEF_IP (_ULCAST_(255) << 8) -#define CAUSEB_IP0 8 -#define CAUSEF_IP0 (_ULCAST_(1) << 8) -#define CAUSEB_IP1 9 -#define CAUSEF_IP1 (_ULCAST_(1) << 9) -#define CAUSEB_IP2 10 -#define CAUSEF_IP2 (_ULCAST_(1) << 10) -#define CAUSEB_IP3 11 -#define CAUSEF_IP3 (_ULCAST_(1) << 11) -#define CAUSEB_IP4 12 -#define CAUSEF_IP4 (_ULCAST_(1) << 12) -#define CAUSEB_IP5 13 -#define CAUSEF_IP5 (_ULCAST_(1) << 13) -#define CAUSEB_IP6 14 -#define CAUSEF_IP6 (_ULCAST_(1) << 14) -#define CAUSEB_IP7 15 -#define CAUSEF_IP7 (_ULCAST_(1) << 15) -#define CAUSEB_IV 23 -#define CAUSEF_IV (_ULCAST_(1) << 23) -#define CAUSEB_CE 28 -#define CAUSEF_CE (_ULCAST_(3) << 28) -#define CAUSEB_BD 31 -#define CAUSEF_BD (_ULCAST_(1) << 31) - -/* - * Bits in the coprocessor 0 config register. - */ -/* Generic bits. */ -#define CONF_CM_CACHABLE_NO_WA 0 -#define CONF_CM_CACHABLE_WA 1 -#define CONF_CM_UNCACHED 2 -#define CONF_CM_CACHABLE_NONCOHERENT 3 -#define CONF_CM_CACHABLE_CE 4 -#define CONF_CM_CACHABLE_COW 5 -#define CONF_CM_CACHABLE_CUW 6 -#define CONF_CM_CACHABLE_ACCELERATED 7 -#define CONF_CM_CMASK 7 -#define CONF_BE (_ULCAST_(1) << 15) - -/* Bits common to various processors. */ -#define CONF_CU (_ULCAST_(1) << 3) -#define CONF_DB (_ULCAST_(1) << 4) -#define CONF_IB (_ULCAST_(1) << 5) -#define CONF_DC (_ULCAST_(7) << 6) -#define CONF_IC (_ULCAST_(7) << 9) -#define CONF_EB (_ULCAST_(1) << 13) -#define CONF_EM (_ULCAST_(1) << 14) -#define CONF_SM (_ULCAST_(1) << 16) -#define CONF_SC (_ULCAST_(1) << 17) -#define CONF_EW (_ULCAST_(3) << 18) -#define CONF_EP (_ULCAST_(15)<< 24) -#define CONF_EC (_ULCAST_(7) << 28) -#define CONF_CM (_ULCAST_(1) << 31) - -/* Bits specific to the R4xx0. */ -#define R4K_CONF_SW (_ULCAST_(1) << 20) -#define R4K_CONF_SS (_ULCAST_(1) << 21) -#define R4K_CONF_SB (_ULCAST_(3) << 22) - -/* Bits specific to the R5000. */ -#define R5K_CONF_SE (_ULCAST_(1) << 12) -#define R5K_CONF_SS (_ULCAST_(3) << 20) - -/* Bits specific to the RM7000. */ -#define RM7K_CONF_SE (_ULCAST_(1) << 3) -#define RM7K_CONF_TE (_ULCAST_(1) << 12) -#define RM7K_CONF_CLK (_ULCAST_(1) << 16) -#define RM7K_CONF_TC (_ULCAST_(1) << 17) -#define RM7K_CONF_SI (_ULCAST_(3) << 20) -#define RM7K_CONF_SC (_ULCAST_(1) << 31) - -/* Bits specific to the R10000. */ -#define R10K_CONF_DN (_ULCAST_(3) << 3) -#define R10K_CONF_CT (_ULCAST_(1) << 5) -#define R10K_CONF_PE (_ULCAST_(1) << 6) -#define R10K_CONF_PM (_ULCAST_(3) << 7) -#define R10K_CONF_EC (_ULCAST_(15)<< 9) -#define R10K_CONF_SB (_ULCAST_(1) << 13) -#define R10K_CONF_SK (_ULCAST_(1) << 14) -#define R10K_CONF_SS (_ULCAST_(7) << 16) -#define R10K_CONF_SC (_ULCAST_(7) << 19) -#define R10K_CONF_DC (_ULCAST_(7) << 26) -#define R10K_CONF_IC (_ULCAST_(7) << 29) - -/* Bits specific to the VR41xx. */ -#define VR41_CONF_CS (_ULCAST_(1) << 12) -#define VR41_CONF_P4K (_ULCAST_(1) << 13) -#define VR41_CONF_BP (_ULCAST_(1) << 16) -#define VR41_CONF_M16 (_ULCAST_(1) << 20) -#define VR41_CONF_AD (_ULCAST_(1) << 23) - -/* Bits specific to the R30xx. */ -#define R30XX_CONF_FDM (_ULCAST_(1) << 19) -#define R30XX_CONF_REV (_ULCAST_(1) << 22) -#define R30XX_CONF_AC (_ULCAST_(1) << 23) -#define R30XX_CONF_RF (_ULCAST_(1) << 24) -#define R30XX_CONF_HALT (_ULCAST_(1) << 25) -#define R30XX_CONF_FPINT (_ULCAST_(7) << 26) -#define R30XX_CONF_DBR (_ULCAST_(1) << 29) -#define R30XX_CONF_SB (_ULCAST_(1) << 30) -#define R30XX_CONF_LOCK (_ULCAST_(1) << 31) - -/* Bits specific to the TX49. */ -#define TX49_CONF_DC (_ULCAST_(1) << 16) -#define TX49_CONF_IC (_ULCAST_(1) << 17) /* conflict with CONF_SC */ -#define TX49_CONF_HALT (_ULCAST_(1) << 18) -#define TX49_CONF_CWFON (_ULCAST_(1) << 27) - -/* Bits specific to the MIPS32/64 PRA. */ -#define MIPS_CONF_MT (_ULCAST_(7) << 7) -#define MIPS_CONF_AR (_ULCAST_(7) << 10) -#define MIPS_CONF_AT (_ULCAST_(3) << 13) -#define MIPS_CONF_M (_ULCAST_(1) << 31) - -/* - * Bits in the MIPS32/64 PRA coprocessor 0 config registers 1 and above. - */ -#define MIPS_CONF1_FP (_ULCAST_(1) << 0) -#define MIPS_CONF1_EP (_ULCAST_(1) << 1) -#define MIPS_CONF1_CA (_ULCAST_(1) << 2) -#define MIPS_CONF1_WR (_ULCAST_(1) << 3) -#define MIPS_CONF1_PC (_ULCAST_(1) << 4) -#define MIPS_CONF1_MD (_ULCAST_(1) << 5) -#define MIPS_CONF1_C2 (_ULCAST_(1) << 6) -#define MIPS_CONF1_DA (_ULCAST_(7) << 7) -#define MIPS_CONF1_DL (_ULCAST_(7) << 10) -#define MIPS_CONF1_DS (_ULCAST_(7) << 13) -#define MIPS_CONF1_IA (_ULCAST_(7) << 16) -#define MIPS_CONF1_IL (_ULCAST_(7) << 19) -#define MIPS_CONF1_IS (_ULCAST_(7) << 22) -#define MIPS_CONF1_TLBS (_ULCAST_(63)<< 25) - -#define MIPS_CONF2_SA (_ULCAST_(15)<< 0) -#define MIPS_CONF2_SL (_ULCAST_(15)<< 4) -#define MIPS_CONF2_SS (_ULCAST_(15)<< 8) -#define MIPS_CONF2_SU (_ULCAST_(15)<< 12) -#define MIPS_CONF2_TA (_ULCAST_(15)<< 16) -#define MIPS_CONF2_TL (_ULCAST_(15)<< 20) -#define MIPS_CONF2_TS (_ULCAST_(15)<< 24) -#define MIPS_CONF2_TU (_ULCAST_(7) << 28) - -#define MIPS_CONF3_TL (_ULCAST_(1) << 0) -#define MIPS_CONF3_SM (_ULCAST_(1) << 1) -#define MIPS_CONF3_MT (_ULCAST_(1) << 2) -#define MIPS_CONF3_SP (_ULCAST_(1) << 4) -#define MIPS_CONF3_VINT (_ULCAST_(1) << 5) -#define MIPS_CONF3_VEIC (_ULCAST_(1) << 6) -#define MIPS_CONF3_LPA (_ULCAST_(1) << 7) -#define MIPS_CONF3_DSP (_ULCAST_(1) << 10) -#define MIPS_CONF3_ULRI (_ULCAST_(1) << 13) - -#define MIPS_CONF7_WII (_ULCAST_(1) << 31) - -#define MIPS_CONF7_RPS (_ULCAST_(1) << 2) - - -/* - * Bits in the MIPS32/64 coprocessor 1 (FPU) revision register. - */ -#define MIPS_FPIR_S (_ULCAST_(1) << 16) -#define MIPS_FPIR_D (_ULCAST_(1) << 17) -#define MIPS_FPIR_PS (_ULCAST_(1) << 18) -#define MIPS_FPIR_3D (_ULCAST_(1) << 19) -#define MIPS_FPIR_W (_ULCAST_(1) << 20) -#define MIPS_FPIR_L (_ULCAST_(1) << 21) -#define MIPS_FPIR_F64 (_ULCAST_(1) << 22) - -#ifndef __ASSEMBLY__ - -/* - * Functions to access the R10000 performance counters. These are basically - * mfc0 and mtc0 instructions from and to coprocessor register with a 5-bit - * performance counter number encoded into bits 1 ... 5 of the instruction. - * Only performance counters 0 to 1 actually exist, so for a non-R10000 aware - * disassembler these will look like an access to sel 0 or 1. - */ -#define read_r10k_perf_cntr(counter) \ -({ \ - unsigned int __res; \ - __asm__ __volatile__( \ - "mfpc\t%0, %1" \ - : "=r" (__res) \ - : "i" (counter)); \ - \ - __res; \ -}) - -#define write_r10k_perf_cntr(counter,val) \ -do { \ - __asm__ __volatile__( \ - "mtpc\t%0, %1" \ - : \ - : "r" (val), "i" (counter)); \ -} while (0) - -#define read_r10k_perf_event(counter) \ -({ \ - unsigned int __res; \ - __asm__ __volatile__( \ - "mfps\t%0, %1" \ - : "=r" (__res) \ - : "i" (counter)); \ - \ - __res; \ -}) - -#define write_r10k_perf_cntl(counter,val) \ -do { \ - __asm__ __volatile__( \ - "mtps\t%0, %1" \ - : \ - : "r" (val), "i" (counter)); \ -} while (0) - - -/* - * Macros to access the system control coprocessor - */ - -#define __read_32bit_c0_register(source, sel) \ -({ int __res; \ - if (sel == 0) \ - __asm__ __volatile__( \ - "mfc0\t%0, " #source "\n\t" \ - : "=r" (__res)); \ - else \ - __asm__ __volatile__( \ - ".set\tmips32\n\t" \ - "mfc0\t%0, " #source ", " #sel "\n\t" \ - ".set\tmips0\n\t" \ - : "=r" (__res)); \ - __res; \ -}) - -#define __read_64bit_c0_register(source, sel) \ -({ unsigned long long __res; \ - if (sizeof(unsigned long) == 4) \ - __res = __read_64bit_c0_split(source, sel); \ - else if (sel == 0) \ - __asm__ __volatile__( \ - ".set\tmips3\n\t" \ - "dmfc0\t%0, " #source "\n\t" \ - ".set\tmips0" \ - : "=r" (__res)); \ - else \ - __asm__ __volatile__( \ - ".set\tmips64\n\t" \ - "dmfc0\t%0, " #source ", " #sel "\n\t" \ - ".set\tmips0" \ - : "=r" (__res)); \ - __res; \ -}) - -#define __write_32bit_c0_register(register, sel, value) \ -do { \ - if (sel == 0) \ - __asm__ __volatile__( \ - "mtc0\t%z0, " #register "\n\t" \ - : : "Jr" ((unsigned int)(value))); \ - else \ - __asm__ __volatile__( \ - ".set\tmips32\n\t" \ - "mtc0\t%z0, " #register ", " #sel "\n\t" \ - ".set\tmips0" \ - : : "Jr" ((unsigned int)(value))); \ -} while (0) - -#define __write_64bit_c0_register(register, sel, value) \ -do { \ - if (sizeof(unsigned long) == 4) \ - __write_64bit_c0_split(register, sel, value); \ - else if (sel == 0) \ - __asm__ __volatile__( \ - ".set\tmips3\n\t" \ - "dmtc0\t%z0, " #register "\n\t" \ - ".set\tmips0" \ - : : "Jr" (value)); \ - else \ - __asm__ __volatile__( \ - ".set\tmips64\n\t" \ - "dmtc0\t%z0, " #register ", " #sel "\n\t" \ - ".set\tmips0" \ - : : "Jr" (value)); \ -} while (0) - -#define __read_ulong_c0_register(reg, sel) \ - ((sizeof(unsigned long) == 4) ? \ - (unsigned long) __read_32bit_c0_register(reg, sel) : \ - (unsigned long) __read_64bit_c0_register(reg, sel)) - -#define __write_ulong_c0_register(reg, sel, val) \ -do { \ - if (sizeof(unsigned long) == 4) \ - __write_32bit_c0_register(reg, sel, val); \ - else \ - __write_64bit_c0_register(reg, sel, val); \ -} while (0) - -/* - * On RM7000/RM9000 these are uses to access cop0 set 1 registers - */ -#define __read_32bit_c0_ctrl_register(source) \ -({ int __res; \ - __asm__ __volatile__( \ - "cfc0\t%0, " #source "\n\t" \ - : "=r" (__res)); \ - __res; \ -}) - -#define __write_32bit_c0_ctrl_register(register, value) \ -do { \ - __asm__ __volatile__( \ - "ctc0\t%z0, " #register "\n\t" \ - : : "Jr" ((unsigned int)(value))); \ -} while (0) - -/* - * These versions are only needed for systems with more than 38 bits of - * physical address space running the 32-bit kernel. That's none atm :-) - */ -#define __read_64bit_c0_split(source, sel) \ -({ \ - unsigned long long __val; \ - unsigned long __flags; \ - \ - local_irq_save(__flags); \ - if (sel == 0) \ - __asm__ __volatile__( \ - ".set\tmips64\n\t" \ - "dmfc0\t%M0, " #source "\n\t" \ - "dsll\t%L0, %M0, 32\n\t" \ - "dsra\t%M0, %M0, 32\n\t" \ - "dsra\t%L0, %L0, 32\n\t" \ - ".set\tmips0" \ - : "=r" (__val)); \ - else \ - __asm__ __volatile__( \ - ".set\tmips64\n\t" \ - "dmfc0\t%M0, " #source ", " #sel "\n\t" \ - "dsll\t%L0, %M0, 32\n\t" \ - "dsra\t%M0, %M0, 32\n\t" \ - "dsra\t%L0, %L0, 32\n\t" \ - ".set\tmips0" \ - : "=r" (__val)); \ - local_irq_restore(__flags); \ - \ - __val; \ -}) - -#define __write_64bit_c0_split(source, sel, val) \ -do { \ - unsigned long __flags; \ - \ - local_irq_save(__flags); \ - if (sel == 0) \ - __asm__ __volatile__( \ - ".set\tmips64\n\t" \ - "dsll\t%L0, %L0, 32\n\t" \ - "dsrl\t%L0, %L0, 32\n\t" \ - "dsll\t%M0, %M0, 32\n\t" \ - "or\t%L0, %L0, %M0\n\t" \ - "dmtc0\t%L0, " #source "\n\t" \ - ".set\tmips0" \ - : : "r" (val)); \ - else \ - __asm__ __volatile__( \ - ".set\tmips64\n\t" \ - "dsll\t%L0, %L0, 32\n\t" \ - "dsrl\t%L0, %L0, 32\n\t" \ - "dsll\t%M0, %M0, 32\n\t" \ - "or\t%L0, %L0, %M0\n\t" \ - "dmtc0\t%L0, " #source ", " #sel "\n\t" \ - ".set\tmips0" \ - : : "r" (val)); \ - local_irq_restore(__flags); \ -} while (0) - -#define read_c0_index() __read_32bit_c0_register($0, 0) -#define write_c0_index(val) __write_32bit_c0_register($0, 0, val) - -#define read_c0_random() __read_32bit_c0_register($1, 0) -#define write_c0_random(val) __write_32bit_c0_register($1, 0, val) - -#define read_c0_entrylo0() __read_ulong_c0_register($2, 0) -#define write_c0_entrylo0(val) __write_ulong_c0_register($2, 0, val) - -#define read_c0_entrylo1() __read_ulong_c0_register($3, 0) -#define write_c0_entrylo1(val) __write_ulong_c0_register($3, 0, val) - -#define read_c0_conf() __read_32bit_c0_register($3, 0) -#define write_c0_conf(val) __write_32bit_c0_register($3, 0, val) - -#define read_c0_context() __read_ulong_c0_register($4, 0) -#define write_c0_context(val) __write_ulong_c0_register($4, 0, val) - -#define read_c0_userlocal() __read_ulong_c0_register($4, 2) -#define write_c0_userlocal(val) __write_ulong_c0_register($4, 2, val) - -#define read_c0_pagemask() __read_32bit_c0_register($5, 0) -#define write_c0_pagemask(val) __write_32bit_c0_register($5, 0, val) - -#define read_c0_wired() __read_32bit_c0_register($6, 0) -#define write_c0_wired(val) __write_32bit_c0_register($6, 0, val) - -#define read_c0_info() __read_32bit_c0_register($7, 0) - -#define read_c0_cache() __read_32bit_c0_register($7, 0) /* TX39xx */ -#define write_c0_cache(val) __write_32bit_c0_register($7, 0, val) - -#define read_c0_badvaddr() __read_ulong_c0_register($8, 0) -#define write_c0_badvaddr(val) __write_ulong_c0_register($8, 0, val) - -#define read_c0_count() __read_32bit_c0_register($9, 0) -#define write_c0_count(val) __write_32bit_c0_register($9, 0, val) - -#define read_c0_count2() __read_32bit_c0_register($9, 6) /* pnx8550 */ -#define write_c0_count2(val) __write_32bit_c0_register($9, 6, val) - -#define read_c0_count3() __read_32bit_c0_register($9, 7) /* pnx8550 */ -#define write_c0_count3(val) __write_32bit_c0_register($9, 7, val) - -#define read_c0_entryhi() __read_ulong_c0_register($10, 0) -#define write_c0_entryhi(val) __write_ulong_c0_register($10, 0, val) - -#define read_c0_compare() __read_32bit_c0_register($11, 0) -#define write_c0_compare(val) __write_32bit_c0_register($11, 0, val) - -#define read_c0_compare2() __read_32bit_c0_register($11, 6) /* pnx8550 */ -#define write_c0_compare2(val) __write_32bit_c0_register($11, 6, val) - -#define read_c0_compare3() __read_32bit_c0_register($11, 7) /* pnx8550 */ -#define write_c0_compare3(val) __write_32bit_c0_register($11, 7, val) - -#define read_c0_status() __read_32bit_c0_register($12, 0) -#ifdef CONFIG_MIPS_MT_SMTC -#define write_c0_status(val) \ -do { \ - __write_32bit_c0_register($12, 0, val); \ - __ehb(); \ -} while (0) -#else -/* - * Legacy non-SMTC code, which may be hazardous - * but which might not support EHB - */ -#define write_c0_status(val) __write_32bit_c0_register($12, 0, val) -#endif /* CONFIG_MIPS_MT_SMTC */ - -#define read_c0_cause() __read_32bit_c0_register($13, 0) -#define write_c0_cause(val) __write_32bit_c0_register($13, 0, val) - -#define read_c0_epc() __read_ulong_c0_register($14, 0) -#define write_c0_epc(val) __write_ulong_c0_register($14, 0, val) - -#define read_c0_prid() __read_32bit_c0_register($15, 0) - -#define read_c0_config() __read_32bit_c0_register($16, 0) -#define read_c0_config1() __read_32bit_c0_register($16, 1) -#define read_c0_config2() __read_32bit_c0_register($16, 2) -#define read_c0_config3() __read_32bit_c0_register($16, 3) -#define read_c0_config4() __read_32bit_c0_register($16, 4) -#define read_c0_config5() __read_32bit_c0_register($16, 5) -#define read_c0_config6() __read_32bit_c0_register($16, 6) -#define read_c0_config7() __read_32bit_c0_register($16, 7) -#define write_c0_config(val) __write_32bit_c0_register($16, 0, val) -#define write_c0_config1(val) __write_32bit_c0_register($16, 1, val) -#define write_c0_config2(val) __write_32bit_c0_register($16, 2, val) -#define write_c0_config3(val) __write_32bit_c0_register($16, 3, val) -#define write_c0_config4(val) __write_32bit_c0_register($16, 4, val) -#define write_c0_config5(val) __write_32bit_c0_register($16, 5, val) -#define write_c0_config6(val) __write_32bit_c0_register($16, 6, val) -#define write_c0_config7(val) __write_32bit_c0_register($16, 7, val) - -/* - * The WatchLo register. There may be upto 8 of them. - */ -#define read_c0_watchlo0() __read_ulong_c0_register($18, 0) -#define read_c0_watchlo1() __read_ulong_c0_register($18, 1) -#define read_c0_watchlo2() __read_ulong_c0_register($18, 2) -#define read_c0_watchlo3() __read_ulong_c0_register($18, 3) -#define read_c0_watchlo4() __read_ulong_c0_register($18, 4) -#define read_c0_watchlo5() __read_ulong_c0_register($18, 5) -#define read_c0_watchlo6() __read_ulong_c0_register($18, 6) -#define read_c0_watchlo7() __read_ulong_c0_register($18, 7) -#define write_c0_watchlo0(val) __write_ulong_c0_register($18, 0, val) -#define write_c0_watchlo1(val) __write_ulong_c0_register($18, 1, val) -#define write_c0_watchlo2(val) __write_ulong_c0_register($18, 2, val) -#define write_c0_watchlo3(val) __write_ulong_c0_register($18, 3, val) -#define write_c0_watchlo4(val) __write_ulong_c0_register($18, 4, val) -#define write_c0_watchlo5(val) __write_ulong_c0_register($18, 5, val) -#define write_c0_watchlo6(val) __write_ulong_c0_register($18, 6, val) -#define write_c0_watchlo7(val) __write_ulong_c0_register($18, 7, val) - -/* - * The WatchHi register. There may be upto 8 of them. - */ -#define read_c0_watchhi0() __read_32bit_c0_register($19, 0) -#define read_c0_watchhi1() __read_32bit_c0_register($19, 1) -#define read_c0_watchhi2() __read_32bit_c0_register($19, 2) -#define read_c0_watchhi3() __read_32bit_c0_register($19, 3) -#define read_c0_watchhi4() __read_32bit_c0_register($19, 4) -#define read_c0_watchhi5() __read_32bit_c0_register($19, 5) -#define read_c0_watchhi6() __read_32bit_c0_register($19, 6) -#define read_c0_watchhi7() __read_32bit_c0_register($19, 7) - -#define write_c0_watchhi0(val) __write_32bit_c0_register($19, 0, val) -#define write_c0_watchhi1(val) __write_32bit_c0_register($19, 1, val) -#define write_c0_watchhi2(val) __write_32bit_c0_register($19, 2, val) -#define write_c0_watchhi3(val) __write_32bit_c0_register($19, 3, val) -#define write_c0_watchhi4(val) __write_32bit_c0_register($19, 4, val) -#define write_c0_watchhi5(val) __write_32bit_c0_register($19, 5, val) -#define write_c0_watchhi6(val) __write_32bit_c0_register($19, 6, val) -#define write_c0_watchhi7(val) __write_32bit_c0_register($19, 7, val) - -#define read_c0_xcontext() __read_ulong_c0_register($20, 0) -#define write_c0_xcontext(val) __write_ulong_c0_register($20, 0, val) - -#define read_c0_intcontrol() __read_32bit_c0_ctrl_register($20) -#define write_c0_intcontrol(val) __write_32bit_c0_ctrl_register($20, val) - -#define read_c0_framemask() __read_32bit_c0_register($21, 0) -#define write_c0_framemask(val) __write_32bit_c0_register($21, 0, val) - -/* RM9000 PerfControl performance counter control register */ -#define read_c0_perfcontrol() __read_32bit_c0_register($22, 0) -#define write_c0_perfcontrol(val) __write_32bit_c0_register($22, 0, val) - -#define read_c0_diag() __read_32bit_c0_register($22, 0) -#define write_c0_diag(val) __write_32bit_c0_register($22, 0, val) - -#define read_c0_diag1() __read_32bit_c0_register($22, 1) -#define write_c0_diag1(val) __write_32bit_c0_register($22, 1, val) - -#define read_c0_diag2() __read_32bit_c0_register($22, 2) -#define write_c0_diag2(val) __write_32bit_c0_register($22, 2, val) - -#define read_c0_diag3() __read_32bit_c0_register($22, 3) -#define write_c0_diag3(val) __write_32bit_c0_register($22, 3, val) - -#define read_c0_diag4() __read_32bit_c0_register($22, 4) -#define write_c0_diag4(val) __write_32bit_c0_register($22, 4, val) - -#define read_c0_diag5() __read_32bit_c0_register($22, 5) -#define write_c0_diag5(val) __write_32bit_c0_register($22, 5, val) - -#define read_c0_debug() __read_32bit_c0_register($23, 0) -#define write_c0_debug(val) __write_32bit_c0_register($23, 0, val) - -#define read_c0_depc() __read_ulong_c0_register($24, 0) -#define write_c0_depc(val) __write_ulong_c0_register($24, 0, val) - -/* - * MIPS32 / MIPS64 performance counters - */ -#define read_c0_perfctrl0() __read_32bit_c0_register($25, 0) -#define write_c0_perfctrl0(val) __write_32bit_c0_register($25, 0, val) -#define read_c0_perfcntr0() __read_32bit_c0_register($25, 1) -#define write_c0_perfcntr0(val) __write_32bit_c0_register($25, 1, val) -#define read_c0_perfctrl1() __read_32bit_c0_register($25, 2) -#define write_c0_perfctrl1(val) __write_32bit_c0_register($25, 2, val) -#define read_c0_perfcntr1() __read_32bit_c0_register($25, 3) -#define write_c0_perfcntr1(val) __write_32bit_c0_register($25, 3, val) -#define read_c0_perfctrl2() __read_32bit_c0_register($25, 4) -#define write_c0_perfctrl2(val) __write_32bit_c0_register($25, 4, val) -#define read_c0_perfcntr2() __read_32bit_c0_register($25, 5) -#define write_c0_perfcntr2(val) __write_32bit_c0_register($25, 5, val) -#define read_c0_perfctrl3() __read_32bit_c0_register($25, 6) -#define write_c0_perfctrl3(val) __write_32bit_c0_register($25, 6, val) -#define read_c0_perfcntr3() __read_32bit_c0_register($25, 7) -#define write_c0_perfcntr3(val) __write_32bit_c0_register($25, 7, val) - -/* RM9000 PerfCount performance counter register */ -#define read_c0_perfcount() __read_64bit_c0_register($25, 0) -#define write_c0_perfcount(val) __write_64bit_c0_register($25, 0, val) - -#define read_c0_ecc() __read_32bit_c0_register($26, 0) -#define write_c0_ecc(val) __write_32bit_c0_register($26, 0, val) - -#define read_c0_derraddr0() __read_ulong_c0_register($26, 1) -#define write_c0_derraddr0(val) __write_ulong_c0_register($26, 1, val) - -#define read_c0_cacheerr() __read_32bit_c0_register($27, 0) - -#define read_c0_derraddr1() __read_ulong_c0_register($27, 1) -#define write_c0_derraddr1(val) __write_ulong_c0_register($27, 1, val) - -#define read_c0_taglo() __read_32bit_c0_register($28, 0) -#define write_c0_taglo(val) __write_32bit_c0_register($28, 0, val) - -#define read_c0_dtaglo() __read_32bit_c0_register($28, 2) -#define write_c0_dtaglo(val) __write_32bit_c0_register($28, 2, val) - -#define read_c0_taghi() __read_32bit_c0_register($29, 0) -#define write_c0_taghi(val) __write_32bit_c0_register($29, 0, val) - -#define read_c0_errorepc() __read_ulong_c0_register($30, 0) -#define write_c0_errorepc(val) __write_ulong_c0_register($30, 0, val) - -/* MIPSR2 */ -#define read_c0_hwrena() __read_32bit_c0_register($7, 0) -#define write_c0_hwrena(val) __write_32bit_c0_register($7, 0, val) - -#define read_c0_intctl() __read_32bit_c0_register($12, 1) -#define write_c0_intctl(val) __write_32bit_c0_register($12, 1, val) - -#define read_c0_srsctl() __read_32bit_c0_register($12, 2) -#define write_c0_srsctl(val) __write_32bit_c0_register($12, 2, val) - -#define read_c0_srsmap() __read_32bit_c0_register($12, 3) -#define write_c0_srsmap(val) __write_32bit_c0_register($12, 3, val) - -#define read_c0_ebase() __read_32bit_c0_register($15, 1) -#define write_c0_ebase(val) __write_32bit_c0_register($15, 1, val) - - -/* Cavium OCTEON (cnMIPS) */ -#define read_c0_cvmcount() __read_ulong_c0_register($9, 6) -#define write_c0_cvmcount(val) __write_ulong_c0_register($9, 6, val) - -#define read_c0_cvmctl() __read_64bit_c0_register($9, 7) -#define write_c0_cvmctl(val) __write_64bit_c0_register($9, 7, val) - -#define read_c0_cvmmemctl() __read_64bit_c0_register($11, 7) -#define write_c0_cvmmemctl(val) __write_64bit_c0_register($11, 7, val) -/* - * The cacheerr registers are not standardized. On OCTEON, they are - * 64 bits wide. - */ -#define read_octeon_c0_icacheerr() __read_64bit_c0_register($27, 0) -#define write_octeon_c0_icacheerr(val) __write_64bit_c0_register($27, 0, val) - -#define read_octeon_c0_dcacheerr() __read_64bit_c0_register($27, 1) -#define write_octeon_c0_dcacheerr(val) __write_64bit_c0_register($27, 1, val) - -/* - * Macros to access the floating point coprocessor control registers - */ -#define read_32bit_cp1_register(source) \ -({ int __res; \ - __asm__ __volatile__( \ - ".set\tpush\n\t" \ - ".set\treorder\n\t" \ - /* gas fails to assemble cfc1 for some archs (octeon).*/ \ - ".set\tmips1\n\t" \ - "cfc1\t%0,"STR(source)"\n\t" \ - ".set\tpop" \ - : "=r" (__res)); \ - __res;}) - -#define rddsp(mask) \ -({ \ - unsigned int __res; \ - \ - __asm__ __volatile__( \ - " .set push \n" \ - " .set noat \n" \ - " # rddsp $1, %x1 \n" \ - " .word 0x7c000cb8 | (%x1 << 16) \n" \ - " move %0, $1 \n" \ - " .set pop \n" \ - : "=r" (__res) \ - : "i" (mask)); \ - __res; \ -}) - -#define wrdsp(val, mask) \ -do { \ - __asm__ __volatile__( \ - " .set push \n" \ - " .set noat \n" \ - " move $1, %0 \n" \ - " # wrdsp $1, %x1 \n" \ - " .word 0x7c2004f8 | (%x1 << 11) \n" \ - " .set pop \n" \ - : \ - : "r" (val), "i" (mask)); \ -} while (0) - -#if 0 /* Need DSP ASE capable assembler ... */ -#define mflo0() ({ long mflo0; __asm__("mflo %0, $ac0" : "=r" (mflo0)); mflo0;}) -#define mflo1() ({ long mflo1; __asm__("mflo %0, $ac1" : "=r" (mflo1)); mflo1;}) -#define mflo2() ({ long mflo2; __asm__("mflo %0, $ac2" : "=r" (mflo2)); mflo2;}) -#define mflo3() ({ long mflo3; __asm__("mflo %0, $ac3" : "=r" (mflo3)); mflo3;}) - -#define mfhi0() ({ long mfhi0; __asm__("mfhi %0, $ac0" : "=r" (mfhi0)); mfhi0;}) -#define mfhi1() ({ long mfhi1; __asm__("mfhi %0, $ac1" : "=r" (mfhi1)); mfhi1;}) -#define mfhi2() ({ long mfhi2; __asm__("mfhi %0, $ac2" : "=r" (mfhi2)); mfhi2;}) -#define mfhi3() ({ long mfhi3; __asm__("mfhi %0, $ac3" : "=r" (mfhi3)); mfhi3;}) - -#define mtlo0(x) __asm__("mtlo %0, $ac0" ::"r" (x)) -#define mtlo1(x) __asm__("mtlo %0, $ac1" ::"r" (x)) -#define mtlo2(x) __asm__("mtlo %0, $ac2" ::"r" (x)) -#define mtlo3(x) __asm__("mtlo %0, $ac3" ::"r" (x)) - -#define mthi0(x) __asm__("mthi %0, $ac0" ::"r" (x)) -#define mthi1(x) __asm__("mthi %0, $ac1" ::"r" (x)) -#define mthi2(x) __asm__("mthi %0, $ac2" ::"r" (x)) -#define mthi3(x) __asm__("mthi %0, $ac3" ::"r" (x)) - -#else - -#define mfhi0() \ -({ \ - unsigned long __treg; \ - \ - __asm__ __volatile__( \ - " .set push \n" \ - " .set noat \n" \ - " # mfhi %0, $ac0 \n" \ - " .word 0x00000810 \n" \ - " move %0, $1 \n" \ - " .set pop \n" \ - : "=r" (__treg)); \ - __treg; \ -}) - -#define mfhi1() \ -({ \ - unsigned long __treg; \ - \ - __asm__ __volatile__( \ - " .set push \n" \ - " .set noat \n" \ - " # mfhi %0, $ac1 \n" \ - " .word 0x00200810 \n" \ - " move %0, $1 \n" \ - " .set pop \n" \ - : "=r" (__treg)); \ - __treg; \ -}) - -#define mfhi2() \ -({ \ - unsigned long __treg; \ - \ - __asm__ __volatile__( \ - " .set push \n" \ - " .set noat \n" \ - " # mfhi %0, $ac2 \n" \ - " .word 0x00400810 \n" \ - " move %0, $1 \n" \ - " .set pop \n" \ - : "=r" (__treg)); \ - __treg; \ -}) - -#define mfhi3() \ -({ \ - unsigned long __treg; \ - \ - __asm__ __volatile__( \ - " .set push \n" \ - " .set noat \n" \ - " # mfhi %0, $ac3 \n" \ - " .word 0x00600810 \n" \ - " move %0, $1 \n" \ - " .set pop \n" \ - : "=r" (__treg)); \ - __treg; \ -}) - -#define mflo0() \ -({ \ - unsigned long __treg; \ - \ - __asm__ __volatile__( \ - " .set push \n" \ - " .set noat \n" \ - " # mflo %0, $ac0 \n" \ - " .word 0x00000812 \n" \ - " move %0, $1 \n" \ - " .set pop \n" \ - : "=r" (__treg)); \ - __treg; \ -}) - -#define mflo1() \ -({ \ - unsigned long __treg; \ - \ - __asm__ __volatile__( \ - " .set push \n" \ - " .set noat \n" \ - " # mflo %0, $ac1 \n" \ - " .word 0x00200812 \n" \ - " move %0, $1 \n" \ - " .set pop \n" \ - : "=r" (__treg)); \ - __treg; \ -}) - -#define mflo2() \ -({ \ - unsigned long __treg; \ - \ - __asm__ __volatile__( \ - " .set push \n" \ - " .set noat \n" \ - " # mflo %0, $ac2 \n" \ - " .word 0x00400812 \n" \ - " move %0, $1 \n" \ - " .set pop \n" \ - : "=r" (__treg)); \ - __treg; \ -}) - -#define mflo3() \ -({ \ - unsigned long __treg; \ - \ - __asm__ __volatile__( \ - " .set push \n" \ - " .set noat \n" \ - " # mflo %0, $ac3 \n" \ - " .word 0x00600812 \n" \ - " move %0, $1 \n" \ - " .set pop \n" \ - : "=r" (__treg)); \ - __treg; \ -}) - -#define mthi0(x) \ -do { \ - __asm__ __volatile__( \ - " .set push \n" \ - " .set noat \n" \ - " move $1, %0 \n" \ - " # mthi $1, $ac0 \n" \ - " .word 0x00200011 \n" \ - " .set pop \n" \ - : \ - : "r" (x)); \ -} while (0) - -#define mthi1(x) \ -do { \ - __asm__ __volatile__( \ - " .set push \n" \ - " .set noat \n" \ - " move $1, %0 \n" \ - " # mthi $1, $ac1 \n" \ - " .word 0x00200811 \n" \ - " .set pop \n" \ - : \ - : "r" (x)); \ -} while (0) - -#define mthi2(x) \ -do { \ - __asm__ __volatile__( \ - " .set push \n" \ - " .set noat \n" \ - " move $1, %0 \n" \ - " # mthi $1, $ac2 \n" \ - " .word 0x00201011 \n" \ - " .set pop \n" \ - : \ - : "r" (x)); \ -} while (0) - -#define mthi3(x) \ -do { \ - __asm__ __volatile__( \ - " .set push \n" \ - " .set noat \n" \ - " move $1, %0 \n" \ - " # mthi $1, $ac3 \n" \ - " .word 0x00201811 \n" \ - " .set pop \n" \ - : \ - : "r" (x)); \ -} while (0) - -#define mtlo0(x) \ -do { \ - __asm__ __volatile__( \ - " .set push \n" \ - " .set noat \n" \ - " move $1, %0 \n" \ - " # mtlo $1, $ac0 \n" \ - " .word 0x00200013 \n" \ - " .set pop \n" \ - : \ - : "r" (x)); \ -} while (0) - -#define mtlo1(x) \ -do { \ - __asm__ __volatile__( \ - " .set push \n" \ - " .set noat \n" \ - " move $1, %0 \n" \ - " # mtlo $1, $ac1 \n" \ - " .word 0x00200813 \n" \ - " .set pop \n" \ - : \ - : "r" (x)); \ -} while (0) - -#define mtlo2(x) \ -do { \ - __asm__ __volatile__( \ - " .set push \n" \ - " .set noat \n" \ - " move $1, %0 \n" \ - " # mtlo $1, $ac2 \n" \ - " .word 0x00201013 \n" \ - " .set pop \n" \ - : \ - : "r" (x)); \ -} while (0) - -#define mtlo3(x) \ -do { \ - __asm__ __volatile__( \ - " .set push \n" \ - " .set noat \n" \ - " move $1, %0 \n" \ - " # mtlo $1, $ac3 \n" \ - " .word 0x00201813 \n" \ - " .set pop \n" \ - : \ - : "r" (x)); \ -} while (0) - -#endif - -/* - * TLB operations. - * - * It is responsibility of the caller to take care of any TLB hazards. - */ -static inline void tlb_probe(void) -{ - __asm__ __volatile__( - ".set noreorder\n\t" - "tlbp\n\t" - ".set reorder"); -} - -static inline void tlb_read(void) -{ -#if MIPS34K_MISSED_ITLB_WAR - int res = 0; - - __asm__ __volatile__( - " .set push \n" - " .set noreorder \n" - " .set noat \n" - " .set mips32r2 \n" - " .word 0x41610001 # dvpe $1 \n" - " move %0, $1 \n" - " ehb \n" - " .set pop \n" - : "=r" (res)); - - instruction_hazard(); -#endif - - __asm__ __volatile__( - ".set noreorder\n\t" - "tlbr\n\t" - ".set reorder"); - -#if MIPS34K_MISSED_ITLB_WAR - if ((res & _ULCAST_(1))) - __asm__ __volatile__( - " .set push \n" - " .set noreorder \n" - " .set noat \n" - " .set mips32r2 \n" - " .word 0x41600021 # evpe \n" - " ehb \n" - " .set pop \n"); -#endif -} - -static inline void tlb_write_indexed(void) -{ - __asm__ __volatile__( - ".set noreorder\n\t" - "tlbwi\n\t" - ".set reorder"); -} - -static inline void tlb_write_random(void) -{ - __asm__ __volatile__( - ".set noreorder\n\t" - "tlbwr\n\t" - ".set reorder"); -} - -/* - * Manipulate bits in a c0 register. - */ -#ifndef CONFIG_MIPS_MT_SMTC -/* - * SMTC Linux requires shutting-down microthread scheduling - * during CP0 register read-modify-write sequences. - */ -#define __BUILD_SET_C0(name) \ -static inline unsigned int \ -set_c0_##name(unsigned int set) \ -{ \ - unsigned int res, new; \ - \ - res = read_c0_##name(); \ - new = res | set; \ - write_c0_##name(new); \ - \ - return res; \ -} \ - \ -static inline unsigned int \ -clear_c0_##name(unsigned int clear) \ -{ \ - unsigned int res, new; \ - \ - res = read_c0_##name(); \ - new = res & ~clear; \ - write_c0_##name(new); \ - \ - return res; \ -} \ - \ -static inline unsigned int \ -change_c0_##name(unsigned int change, unsigned int val) \ -{ \ - unsigned int res, new; \ - \ - res = read_c0_##name(); \ - new = res & ~change; \ - new |= (val & change); \ - write_c0_##name(new); \ - \ - return res; \ -} - -#else /* SMTC versions that manage MT scheduling */ - -#include - -/* - * This is a duplicate of dmt() in mipsmtregs.h to avoid problems with - * header file recursion. - */ -static inline unsigned int __dmt(void) -{ - int res; - - __asm__ __volatile__( - " .set push \n" - " .set mips32r2 \n" - " .set noat \n" - " .word 0x41610BC1 # dmt $1 \n" - " ehb \n" - " move %0, $1 \n" - " .set pop \n" - : "=r" (res)); - - instruction_hazard(); - - return res; -} - -#define __VPECONTROL_TE_SHIFT 15 -#define __VPECONTROL_TE (1UL << __VPECONTROL_TE_SHIFT) - -#define __EMT_ENABLE __VPECONTROL_TE - -static inline void __emt(unsigned int previous) -{ - if ((previous & __EMT_ENABLE)) - __asm__ __volatile__( - " .set mips32r2 \n" - " .word 0x41600be1 # emt \n" - " ehb \n" - " .set mips0 \n"); -} - -static inline void __ehb(void) -{ - __asm__ __volatile__( - " .set mips32r2 \n" - " ehb \n" " .set mips0 \n"); -} - -/* - * Note that local_irq_save/restore affect TC-specific IXMT state, - * not Status.IE as in non-SMTC kernel. - */ - -#define __BUILD_SET_C0(name) \ -static inline unsigned int \ -set_c0_##name(unsigned int set) \ -{ \ - unsigned int res; \ - unsigned int new; \ - unsigned int omt; \ - unsigned long flags; \ - \ - local_irq_save(flags); \ - omt = __dmt(); \ - res = read_c0_##name(); \ - new = res | set; \ - write_c0_##name(new); \ - __emt(omt); \ - local_irq_restore(flags); \ - \ - return res; \ -} \ - \ -static inline unsigned int \ -clear_c0_##name(unsigned int clear) \ -{ \ - unsigned int res; \ - unsigned int new; \ - unsigned int omt; \ - unsigned long flags; \ - \ - local_irq_save(flags); \ - omt = __dmt(); \ - res = read_c0_##name(); \ - new = res & ~clear; \ - write_c0_##name(new); \ - __emt(omt); \ - local_irq_restore(flags); \ - \ - return res; \ -} \ - \ -static inline unsigned int \ -change_c0_##name(unsigned int change, unsigned int newbits) \ -{ \ - unsigned int res; \ - unsigned int new; \ - unsigned int omt; \ - unsigned long flags; \ - \ - local_irq_save(flags); \ - \ - omt = __dmt(); \ - res = read_c0_##name(); \ - new = res & ~change; \ - new |= (newbits & change); \ - write_c0_##name(new); \ - __emt(omt); \ - local_irq_restore(flags); \ - \ - return res; \ -} -#endif - -__BUILD_SET_C0(status) -__BUILD_SET_C0(cause) -__BUILD_SET_C0(config) -__BUILD_SET_C0(intcontrol) -__BUILD_SET_C0(intctl) -__BUILD_SET_C0(srsmap) - -#endif /* !__ASSEMBLY__ */ - -#endif /* _ASM_MIPSREGS_H */ diff --git a/resources/project/include/asm/regdef.h b/resources/project/include/asm/regdef.h deleted file mode 100644 index 5bdf816..0000000 --- a/resources/project/include/asm/regdef.h +++ /dev/null @@ -1,113 +0,0 @@ -/* $OpenBSD: regdef.h,v 1.3 1999/01/27 04:46:06 imp Exp $ */ - -/* - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Ralph Campbell. This file is derived from the MIPS RISC - * Architecture book by Gerry Kane. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)regdef.h 8.1 (Berkeley) 6/10/93 - */ -#ifndef _MIPS_REGDEF_H_ -#define _MIPS_REGDEF_H_ - -#define zero $0 /* always zero */ -#define AT $at /* assembler temp */ -#define v0 $2 /* return value */ -#define v1 $3 -#define a0 $4 /* argument registers */ -#define a1 $5 -#define a2 $6 -#define a3 $7 -#define t0 $8 /* temp registers (not saved across subroutine calls) */ -#define t1 $9 -#define t2 $10 -#define t3 $11 -#define t4 $12 -#define t5 $13 -#define t6 $14 -#define t7 $15 -#define s0 $16 /* saved across subroutine calls (callee saved) */ -#define s1 $17 -#define s2 $18 -#define s3 $19 -#define s4 $20 -#define s5 $21 -#define s6 $22 -#define s7 $23 -#define t8 $24 /* two more temp registers */ -#define t9 $25 -#define k0 $26 /* kernel temporary */ -#define k1 $27 -#define gp $28 /* global pointer */ -#define sp $29 /* stack pointer */ -#define s8 $30 /* one more callee saved */ -#define ra $31 /* return address */ -#define fp $30 - -#define c0_index $0 -#define c0_random $1 -#define c0_entrylo0 $2 -#define c0_entrylo1 $3 -#define c0_conf $3 -#define c0_context $4 -#define c0_pagemask $5 -#define c0_wired $6 -#define c0_info $7 -#define c0_badvaddr $8 -#define c0_count $9 -#define c0_entryhi $10 -#define c0_compare $11 -#define c0_status $12 -#define c0_cause $13 -#define c0_epc $14 -#define c0_prid $15 -#define c0_config $16 -#define c0_lladdr $17 -#define c0_watchlo $18 -#define c0_watchhi $19 -#define c0_xcontext $20 -#define c0_framemask $21 -#define c0_diagnostic $22 -#define c0_debug $23 -#define c0_depc $24 -#define c0_performance $25 -#define c0_ecc $26 -#define c0_cacheerr $27 -#define c0_taglo $28 -#define c0_taghi $29 -#define c0_errorepc $30 -#define c0_desave $31 - - -#endif /* !_MIPS_REGDEF_H_ */ diff --git a/resources/project/include/cpu_cde.h b/resources/project/include/cpu_cde.h deleted file mode 100644 index e889b89..0000000 --- a/resources/project/include/cpu_cde.h +++ /dev/null @@ -1,35 +0,0 @@ -//soc confreg - -#define CONFREG_CR0 0xbfd00000 -#define CONFREG_CR1 0xbfd00004 -#define CONFREG_CR2 0xbfd00008 -#define CONFREG_CR3 0xbfd0000c -#define CONFREG_CR4 0xbfd00010 -#define CONFREG_CR5 0xbfd00014 -#define CONFREG_CR6 0xbfd00018 -#define CONFREG_CR7 0xbfd0001c - -#define UART_ADDR 0xbfe40000 -#define LED_ADDR 0xbfd0f000 -#define LED_RG0_ADDR 0xbfd0f004 -#define LED_RG1_ADDR 0xbfd0f008 -#define NUM_ADDR 0xbfd0f010 -#define SWITCH_ADDR 0xbfd0f020 -#define BTN_KEY_ADDR 0xbfd0f024 -#define BTN_STEP_ADDR 0xbfd0f028 -#define TIMER_ADDR 0xbfd0e000 - -#define SOC_LED (* (volatile unsigned *) LED_ADDR ) -#define SOC_LED_RG0 (* (volatile unsigned *) LED_RG0_ADDR ) -#define SOC_LED_RG1 (* (volatile unsigned *) LED_RG1_ADDR ) -#define SOC_NUM (* (volatile unsigned *) NUM_ADDR ) -#define SOC_SWITCHE (* (volatile unsigned *) SWITCH_ADDR ) -#define SOC_BTN_KEY (* (volatile unsigned *) BTN_KEY_ADDR ) -#define SOC_BTN_STEP (* (volatile unsigned *) BTN_STEP_ADDR ) -#define SOC_TIMER (* (volatile unsigned *) TIMER_ADDR ) - -#define write_confreg_cr(num,data) *((volatile int *)(CONFREG_CR0+4*num)) = data -#define read_confreg_cr(num,data) data=*((volatile int *)(CONFREG_CR0+4*num)) -#define NOP addu zero, zero, zero -#define LI(reg, imm) \ - li reg, imm diff --git a/resources/project/include/tiny.h b/resources/project/include/tiny.h deleted file mode 100644 index c2da0e1..0000000 --- a/resources/project/include/tiny.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef PROJECT_INCLUDE_TINY_H_ -#define PROJECT_INCLUDE_TINY_H_ - -void WRITESERIAL(char); -char READSERIAL(); -unsigned READSERIALWORD(); - -char* itoa(int num, char* str, int base); -int putchar(char c); -int vsprintf(char* buf, const char* fmt, va_list args); -int printf(const char* fmt, ...); - -#endif //PROJECT_INCLUDE_TINY_H_ diff --git a/resources/project/lib/io.S b/resources/project/lib/io.S deleted file mode 100644 index a2ffa76..0000000 --- a/resources/project/lib/io.S +++ /dev/null @@ -1,79 +0,0 @@ -#include -#include -#include - - .text - .set noreorder - .set noat - .p2align 2 - .global WRITESERIAL - .global READSERIAL - .global READSERIALWORD - -WRITESERIAL: // 写串口:将a0的低八位写入串口 - li t1, UART_ADDR -.TESTW: - lb t0, 5(t1) // 查看串口状态, LSR - andi t0, t0, 0x20 // 截取写状态位, TXRDY - beq t0, zero, .TESTW // 状态位为零则循环检测 - nop -.WSERIAL: // 否则可写入 - sb a0, 0(t1) // 写入, DATA - jr ra - nop - -READSERIAL: // 读串口:将读到的数据写入v0低八位 - li t1, UART_ADDR -.TESTR: - lb t0, 5(t1) // 查看串口状态, LSR - andi t0, t0, 0x01 // 截取读状态位, RXRDY - bne t0, zero, .RSERIAL // 状态位非零可读进入读 - nop - j .TESTR // 检测验证 - nop -.RSERIAL: - lb v0, 0(t1) // 读出, DATA - jr ra - nop - -READSERIALWORD: - addiu sp, sp, -0x14 // 保存ra,s0 - sw ra, 0x0(sp) - sw s0, 0x4(sp) - sw s1, 0x8(sp) - sw s2, 0xC(sp) - sw s3, 0x10(sp) - - jal READSERIAL // 读串口获得八个比特 - nop - or s0, zero, v0 // 结果存入s0 - jal READSERIAL // 读串口获得八个比特 - nop - or s1, zero, v0 // 结果存入s1 - jal READSERIAL // 读串口获得八个比特 - nop - or s2, zero, v0 // 结果存入s2 - jal READSERIAL // 读串口获得八个比特 - nop - or s3, zero, v0 // 结果存入s3 - - andi s0, s0, 0x00FF // 截取低八位 - andi s3, s3, 0x00FF - andi s2, s2, 0x00FF - andi s1, s1, 0x00FF - or v0, zero, s3 // 存高八位 - sll v0, v0, 8 // 左移 - or v0, v0, s2 // 存八位 - sll v0, v0, 8 // 左移 - or v0, v0, s1 // 存八位 - sll v0, v0, 8 // 左移 - or v0, v0, s0 // 存低八位 - - lw ra, 0x0(sp) // 恢复ra,s0 - lw s0, 0x4(sp) - lw s1, 0x8(sp) - lw s2, 0xC(sp) - lw s3, 0x10(sp) - addiu sp, sp, 0x14 - jr ra - nop \ No newline at end of file diff --git a/resources/project/lib/stdio.c b/resources/project/lib/stdio.c deleted file mode 100644 index 9e70c3d..0000000 --- a/resources/project/lib/stdio.c +++ /dev/null @@ -1,110 +0,0 @@ -#include "tiny.h" - -int putchar(char c) -{ - WRITESERIAL(c); - return c; -} - -char* itoa(int num, char* str, int base) -{ - if (num == 0 || base <= 1) - { - str[0] = '0'; - str[1] = '\0'; - return str; - } - - int neg = 0, i = 0; - if (num < 0 && base == 10) - { - neg = 1; - num = -num; - } - - while (num != 0) - { - int rem = num % base; - str[i] = (rem > 9) ? (rem - 10) + 'A' : rem + '0'; - num /= base; - i++; - } - - if (neg == 1) - { - str[i++] = '-'; - str[i] = '\0'; - } - else - str[i] = '\0'; - - i--; - - int start = 0; - while (start < i) - { - char tmp = *(str + i); - *(str + i) = *(str + start); - *(str + start) = tmp; - start++; - i--; - } - - return str; -} - -int vsprintf(char* buf, const char* fmt, va_list args) -{ - char* p; - char tmp[256]; - va_list p_next_arg = args; - - for (p = buf; *fmt; fmt++) - { - if (*fmt != '%') - { - *p++ = *fmt; - continue; - } - - fmt++; - - switch (*fmt) - { - case 'x': - // itoa(tmp, *((int *)p_next_arg)); - itox(*((int*)p_next_arg), tmp, 16); - strcpy(p, tmp); - p_next_arg += 4; - p += strlen(tmp); - break; - case 'd': - itox(*((int*)p_next_arg), tmp, 10); - strcpy(p, tmp); - p_next_arg += 4; - p += strlen(tmp); - break; - case 's': - strcpy(p, (char*)(*((unsigned*)p_next_arg))); - p += strlen((char*)(*((unsigned*)p_next_arg))); - p_next_arg += 4; - break; - default: - break; - } - } - - return (p - buf); -} - -int printf(const char* fmt, ...) -{ - int i; - char buf[256]; - - va_list arg = (va_list)((char*)(&fmt) + 4); /*4是参数fmt所占堆栈中的大小*/ - i = vsprintf(buf, fmt, arg); - write(buf, i); - - return i; -} \ No newline at end of file diff --git a/resources/project/src/main.c b/resources/project/src/main.c deleted file mode 100644 index 6939616..0000000 --- a/resources/project/src/main.c +++ /dev/null @@ -1,6 +0,0 @@ -#include "soc.h" - -int main() -{ - return 0; -} diff --git a/resources/project/src/soc.h b/resources/project/src/soc.h deleted file mode 100644 index cb28261..0000000 --- a/resources/project/src/soc.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef PROJECT_SRC_SOC_H_ -#define PROJECT_SRC_SOC_H_ - -#include "cpu_cde.h" - -#endif //PROJECT_SRC_SOC_H_ diff --git a/resources/project/start.S b/resources/project/start.S deleted file mode 100644 index 66d5f4a..0000000 --- a/resources/project/start.S +++ /dev/null @@ -1,39 +0,0 @@ -#include -#include -#include - - .set noreorder - .section .text.init - .globl _init -_init: - lui t2, 0x0040 - mtc0 t2, c0_status # turn off timer interrupt - mtc0 zero, c0_cause # clear cause - la sp, _stack # setup stack - la gp, _gp # setup small data - - # Copy text to a000_0000 -> 8000_0000 - la t0, _text_code_begin - la t1, _text_code_end - li t2, 0xa0000000 - or t0, t0, t2 - or t1, t1, t2 - li t2, 0xbfc00000 - or t2, t2, t0 -copy: - lw t3, 0(t2) - addiu t2, t2, 4 - sw t3, 0(t0) - addiu t0, t0, 4 - bne t0, t1, copy - nop - - lui k0, %hi(main) - addiu k0, %lo(main) - jr k0 - nop - - .section .text.exception -_EXCEPTION: - b _EXCEPTION - nop \ No newline at end of file diff --git a/resources/soc_axi_system/rtl/AMBA/axi2apb.v b/resources/system_top/rtl/AMBA/axi2apb.v similarity index 100% rename from resources/soc_axi_system/rtl/AMBA/axi2apb.v rename to resources/system_top/rtl/AMBA/axi2apb.v diff --git a/resources/soc_axi_system/rtl/AMBA/axi_mux.v b/resources/system_top/rtl/AMBA/axi_mux.v similarity index 100% rename from resources/soc_axi_system/rtl/AMBA/axi_mux.v rename to resources/system_top/rtl/AMBA/axi_mux.v diff --git a/resources/soc_axi_system/rtl/APB_DEV/UART2/UART.v b/resources/system_top/rtl/APB_DEV/UART2/UART.v similarity index 100% rename from resources/soc_axi_system/rtl/APB_DEV/UART2/UART.v rename to resources/system_top/rtl/APB_DEV/UART2/UART.v diff --git a/resources/soc_axi_system/rtl/APB_DEV/UART2/UART_RX.v b/resources/system_top/rtl/APB_DEV/UART2/UART_RX.v similarity index 100% rename from resources/soc_axi_system/rtl/APB_DEV/UART2/UART_RX.v rename to resources/system_top/rtl/APB_DEV/UART2/UART_RX.v diff --git a/resources/soc_axi_system/rtl/APB_DEV/UART2/UART_TX.v b/resources/system_top/rtl/APB_DEV/UART2/UART_TX.v similarity index 100% rename from resources/soc_axi_system/rtl/APB_DEV/UART2/UART_TX.v rename to resources/system_top/rtl/APB_DEV/UART2/UART_TX.v diff --git a/resources/soc_axi_system/rtl/APB_DEV/URT/raminfr.v b/resources/system_top/rtl/APB_DEV/URT/raminfr.v similarity index 100% rename from resources/soc_axi_system/rtl/APB_DEV/URT/raminfr.v rename to resources/system_top/rtl/APB_DEV/URT/raminfr.v diff --git a/resources/soc_axi_system/rtl/APB_DEV/URT/uart_defines.h b/resources/system_top/rtl/APB_DEV/URT/uart_defines.h similarity index 100% rename from resources/soc_axi_system/rtl/APB_DEV/URT/uart_defines.h rename to resources/system_top/rtl/APB_DEV/URT/uart_defines.h diff --git a/resources/soc_axi_system/rtl/APB_DEV/URT/uart_receiver.v b/resources/system_top/rtl/APB_DEV/URT/uart_receiver.v similarity index 100% rename from resources/soc_axi_system/rtl/APB_DEV/URT/uart_receiver.v rename to resources/system_top/rtl/APB_DEV/URT/uart_receiver.v diff --git a/resources/soc_axi_system/rtl/APB_DEV/URT/uart_regs.v b/resources/system_top/rtl/APB_DEV/URT/uart_regs.v similarity index 100% rename from resources/soc_axi_system/rtl/APB_DEV/URT/uart_regs.v rename to resources/system_top/rtl/APB_DEV/URT/uart_regs.v diff --git a/resources/soc_axi_system/rtl/APB_DEV/URT/uart_rfifo.v b/resources/system_top/rtl/APB_DEV/URT/uart_rfifo.v similarity index 100% rename from resources/soc_axi_system/rtl/APB_DEV/URT/uart_rfifo.v rename to resources/system_top/rtl/APB_DEV/URT/uart_rfifo.v diff --git a/resources/soc_axi_system/rtl/APB_DEV/URT/uart_sync_flops.v b/resources/system_top/rtl/APB_DEV/URT/uart_sync_flops.v similarity index 100% rename from resources/soc_axi_system/rtl/APB_DEV/URT/uart_sync_flops.v rename to resources/system_top/rtl/APB_DEV/URT/uart_sync_flops.v diff --git a/resources/soc_axi_system/rtl/APB_DEV/URT/uart_tfifo.v b/resources/system_top/rtl/APB_DEV/URT/uart_tfifo.v similarity index 100% rename from resources/soc_axi_system/rtl/APB_DEV/URT/uart_tfifo.v rename to resources/system_top/rtl/APB_DEV/URT/uart_tfifo.v diff --git a/resources/soc_axi_system/rtl/APB_DEV/URT/uart_top.v b/resources/system_top/rtl/APB_DEV/URT/uart_top.v similarity index 100% rename from resources/soc_axi_system/rtl/APB_DEV/URT/uart_top.v rename to resources/system_top/rtl/APB_DEV/URT/uart_top.v diff --git a/resources/soc_axi_system/rtl/APB_DEV/URT/uart_transmitter.v b/resources/system_top/rtl/APB_DEV/URT/uart_transmitter.v similarity index 100% rename from resources/soc_axi_system/rtl/APB_DEV/URT/uart_transmitter.v rename to resources/system_top/rtl/APB_DEV/URT/uart_transmitter.v diff --git a/resources/soc_axi_system/rtl/APB_DEV/apb_dev_top.v b/resources/system_top/rtl/APB_DEV/apb_dev_top.v similarity index 100% rename from resources/soc_axi_system/rtl/APB_DEV/apb_dev_top.v rename to resources/system_top/rtl/APB_DEV/apb_dev_top.v diff --git a/resources/soc_axi_system/rtl/APB_DEV/apb_mux2.v b/resources/system_top/rtl/APB_DEV/apb_mux2.v similarity index 100% rename from resources/soc_axi_system/rtl/APB_DEV/apb_mux2.v rename to resources/system_top/rtl/APB_DEV/apb_mux2.v diff --git a/resources/soc_axi_system/rtl/CONFREG/confreg.v b/resources/system_top/rtl/CONFREG/confreg.v similarity index 100% rename from resources/soc_axi_system/rtl/CONFREG/confreg.v rename to resources/system_top/rtl/CONFREG/confreg.v diff --git a/resources/soc_axi_system/rtl/SPI/godson_sbridge_spi.v b/resources/system_top/rtl/SPI/godson_sbridge_spi.v similarity index 100% rename from resources/soc_axi_system/rtl/SPI/godson_sbridge_spi.v rename to resources/system_top/rtl/SPI/godson_sbridge_spi.v diff --git a/resources/soc_axi_system/rtl/TOP/config.h b/resources/system_top/rtl/TOP/config.h similarity index 100% rename from resources/soc_axi_system/rtl/TOP/config.h rename to resources/system_top/rtl/TOP/config.h diff --git a/resources/soc_axi_system/rtl/TOP/soc_up_top.v b/resources/system_top/rtl/TOP/soc_up_top.v similarity index 100% rename from resources/soc_axi_system/rtl/TOP/soc_up_top.v rename to resources/system_top/rtl/TOP/soc_up_top.v diff --git a/resources/soc_axi_system/rtl/xilinx_ip/axi_clock_converter/axi_clock_converter.xci b/resources/system_top/rtl/xilinx_ip/axi_clock_converter/axi_clock_converter.xci similarity index 100% rename from resources/soc_axi_system/rtl/xilinx_ip/axi_clock_converter/axi_clock_converter.xci rename to resources/system_top/rtl/xilinx_ip/axi_clock_converter/axi_clock_converter.xci diff --git a/resources/soc_axi_system/rtl/xilinx_ip/clk_pll/clk_pll.xci b/resources/system_top/rtl/xilinx_ip/clk_pll/clk_pll.xci similarity index 100% rename from resources/soc_axi_system/rtl/xilinx_ip/clk_pll/clk_pll.xci rename to resources/system_top/rtl/xilinx_ip/clk_pll/clk_pll.xci diff --git a/resources/soc_axi_system/rtl/xilinx_ip/clk_wiz_0/clk_wiz_0.xci b/resources/system_top/rtl/xilinx_ip/clk_wiz_0/clk_wiz_0.xci similarity index 100% rename from resources/soc_axi_system/rtl/xilinx_ip/clk_wiz_0/clk_wiz_0.xci rename to resources/system_top/rtl/xilinx_ip/clk_wiz_0/clk_wiz_0.xci diff --git a/resources/soc_axi_system/rtl/xilinx_ip/mig_axi_32/mig_a.prj b/resources/system_top/rtl/xilinx_ip/mig_axi_32/mig_a.prj similarity index 100% rename from resources/soc_axi_system/rtl/xilinx_ip/mig_axi_32/mig_a.prj rename to resources/system_top/rtl/xilinx_ip/mig_axi_32/mig_a.prj diff --git a/resources/soc_axi_system/rtl/xilinx_ip/mig_axi_32/mig_axi_32.xci b/resources/system_top/rtl/xilinx_ip/mig_axi_32/mig_axi_32.xci similarity index 100% rename from resources/soc_axi_system/rtl/xilinx_ip/mig_axi_32/mig_axi_32.xci rename to resources/system_top/rtl/xilinx_ip/mig_axi_32/mig_axi_32.xci diff --git a/resources/soc_axi_system/rtl/xilinx_ip/mig_axi_32/mig_b.prj b/resources/system_top/rtl/xilinx_ip/mig_axi_32/mig_b.prj similarity index 100% rename from resources/soc_axi_system/rtl/xilinx_ip/mig_axi_32/mig_b.prj rename to resources/system_top/rtl/xilinx_ip/mig_axi_32/mig_b.prj diff --git a/resources/soc_axi_system/run_vivado/project_1/project_1.xpr b/resources/system_top/run_vivado/project_1/project_1.xpr similarity index 100% rename from resources/soc_axi_system/run_vivado/project_1/project_1.xpr rename to resources/system_top/run_vivado/project_1/project_1.xpr diff --git a/resources/soc_axi_system/run_vivado/soc_up.xdc b/resources/system_top/run_vivado/soc_up.xdc similarity index 100% rename from resources/soc_axi_system/run_vivado/soc_up.xdc rename to resources/system_top/run_vivado/soc_up.xdc diff --git a/resources/soc_axi_system/testbench/MX25L6405D.v b/resources/system_top/testbench/MX25L6405D.v similarity index 100% rename from resources/soc_axi_system/testbench/MX25L6405D.v rename to resources/system_top/testbench/MX25L6405D.v diff --git a/resources/soc_axi_system/testbench/ddr3_model.sv b/resources/system_top/testbench/ddr3_model.sv similarity index 100% rename from resources/soc_axi_system/testbench/ddr3_model.sv rename to resources/system_top/testbench/ddr3_model.sv diff --git a/resources/soc_axi_system/testbench/ddr3_model_parameters.vh b/resources/system_top/testbench/ddr3_model_parameters.vh similarity index 100% rename from resources/soc_axi_system/testbench/ddr3_model_parameters.vh rename to resources/system_top/testbench/ddr3_model_parameters.vh diff --git a/resources/soc_axi_system/testbench/godson_system.v b/resources/system_top/testbench/godson_system.v similarity index 100% rename from resources/soc_axi_system/testbench/godson_system.v rename to resources/system_top/testbench/godson_system.v diff --git a/resources/soc_axi_system/testbench/uart_dev.v b/resources/system_top/testbench/uart_dev.v similarity index 100% rename from resources/soc_axi_system/testbench/uart_dev.v rename to resources/system_top/testbench/uart_dev.v From c73a8278afe630ddef09e4f0b2a83c8eb8f1f8d4 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Mon, 23 Aug 2021 21:49:32 +0800 Subject: [PATCH 03/56] add resource from loongson --- resources/soc/rtl/AMBA/axi2apb.v | 542 + resources/soc/rtl/AMBA/axi_mux.v | 1102 + resources/soc/rtl/APB_DEV/NAND/nand.v | 1430 + resources/soc/rtl/APB_DEV/URT/raminfr.v | 62 + resources/soc/rtl/APB_DEV/URT/uart_defines.h | 119 + resources/soc/rtl/APB_DEV/URT/uart_receiver.v | 288 + resources/soc/rtl/APB_DEV/URT/uart_regs.v | 711 + resources/soc/rtl/APB_DEV/URT/uart_rfifo.v | 193 + .../soc/rtl/APB_DEV/URT/uart_sync_flops.v | 76 + resources/soc/rtl/APB_DEV/URT/uart_tfifo.v | 129 + resources/soc/rtl/APB_DEV/URT/uart_top.v | 107 + .../soc/rtl/APB_DEV/URT/uart_transmitter.v | 281 + resources/soc/rtl/APB_DEV/apb_dev_top.v | 416 + resources/soc/rtl/APB_DEV/apb_mux2.v | 203 + resources/soc/rtl/APB_DEV/nand_module.v | 140 + resources/soc/rtl/CONFREG/confreg.v | 695 + resources/soc/rtl/DMA/dma.v | 778 + resources/soc/rtl/MAC/bd.v | 372 + resources/soc/rtl/MAC/csr.v | 2530 ++ resources/soc/rtl/MAC/dma.v | 646 + resources/soc/rtl/MAC/ethernet_top.v | 368 + resources/soc/rtl/MAC/mac.v | 862 + resources/soc/rtl/MAC/mac2axi.v | 355 + resources/soc/rtl/MAC/mac_axi.v | 522 + resources/soc/rtl/MAC/mac_top.v | 445 + resources/soc/rtl/MAC/maccsr2axi.v | 291 + resources/soc/rtl/MAC/macdata2axi.v | 248 + resources/soc/rtl/MAC/rc.v | 1749 ++ resources/soc/rtl/MAC/rfifo.v | 439 + resources/soc/rtl/MAC/rlsm.v | 1328 + resources/soc/rtl/MAC/rstc.v | 158 + resources/soc/rtl/MAC/tc.v | 1296 + resources/soc/rtl/MAC/tfifo.v | 815 + resources/soc/rtl/MAC/tlsm.v | 2197 ++ resources/soc/rtl/MAC/utility.v | 282 + resources/soc/rtl/SPI/godson_sbridge_spi.v | 896 + resources/soc/rtl/TOP/config.h | 98 + resources/soc/rtl/TOP/soc_up_top.v | 1504 ++ ...理器gs232源码,目前缺少,请联系龙芯开源获得.txt | 7 + resources/soc/simu/run/run_func/lib.list | 82 + resources/soc/simu/run/run_func/ncompile | 3 + resources/soc/simu/run/run_func/rtl.list | 117 + resources/soc/simu/run/run_func/run.f | 28 + resources/soc/simu/run/run_func/sys.list | 11 + resources/soc/simu/soft/func/Makefile | 48 + resources/soc/simu/soft/func/config.h | 179 + resources/soc/simu/soft/func/convert.c | 29 + .../soc/simu/soft/func/include/Calendar.h | 12 + .../soc/simu/soft/func/include/Infrare.h | 1 + .../soc/simu/soft/func/include/Interrupt.h | 9 + .../soc/simu/soft/func/include/MonthData.h | 23 + .../soc/simu/soft/func/include/SystemInit.h | 4 + resources/soc/simu/soft/func/include/adc.h | 2 + .../simu/soft/func/include/asm/interrupt.h | 287 + .../soc/simu/soft/func/include/asm/mipsregs.h | 38 + .../soc/simu/soft/func/include/asm/ns16550.h | 135 + .../soc/simu/soft/func/include/asm/regdef.h | 39 + .../soc/simu/soft/func/include/battery.h | 4 + .../soc/simu/soft/func/include/cmdline.h | 9 + resources/soc/simu/soft/func/include/common.h | 5 + .../soc/simu/soft/func/include/dg_rs232.h | 1 + resources/soc/simu/soft/func/include/flash.h | 6 + resources/soc/simu/soft/func/include/frame.h | 43 + resources/soc/simu/soft/func/include/isp.h | 10 + resources/soc/simu/soft/func/include/key.h | 1 + resources/soc/simu/soft/func/include/lcd.h | 132 + resources/soc/simu/soft/func/include/ls1d.h | 158 + .../soc/simu/soft/func/include/temp_flow.h | 11 + resources/soc/simu/soft/func/include/xmodem.h | 16 + resources/soc/simu/soft/func/lib/Makefile | 12 + resources/soc/simu/soft/func/lib/memcmp.c | 16 + resources/soc/simu/soft/func/lib/memcpy.c | 16 + resources/soc/simu/soft/func/lib/memset.c | 10 + resources/soc/simu/soft/func/lib/printbase.c | 28 + resources/soc/simu/soft/func/lib/printf.c | 79 + resources/soc/simu/soft/func/lib/printhex.c | 11 + resources/soc/simu/soft/func/lib/putchar.c | 5 + resources/soc/simu/soft/func/lib/puts.c | 13 + resources/soc/simu/soft/func/lib/strcat.c | 48 + resources/soc/simu/soft/func/lib/strchr.c | 44 + resources/soc/simu/soft/func/lib/strcmp.c | 11 + resources/soc/simu/soft/func/lib/strcspn.c | 48 + resources/soc/simu/soft/func/lib/strspn.c | 51 + resources/soc/simu/soft/func/lib/strtok.c | 51 + resources/soc/simu/soft/func/lib/udelay.c | 13 + resources/soc/simu/soft/func/main.c | 7 + resources/soc/simu/soft/func/nand_test.S | 284 + .../soc/simu/soft/func/source/Calendar.c | 154 + resources/soc/simu/soft/func/source/Infrare.c | 33 + .../soc/simu/soft/func/source/Interrupt.c | 6 + .../soc/simu/soft/func/source/MonthData.c | 62 + .../soc/simu/soft/func/source/SystemInit.c | 118 + resources/soc/simu/soft/func/source/adc.c | 49 + resources/soc/simu/soft/func/source/battery.c | 148 + resources/soc/simu/soft/func/source/cmdline.c | 326 + resources/soc/simu/soft/func/source/common.c | 125 + .../soc/simu/soft/func/source/dg_rs232.c | 193 + resources/soc/simu/soft/func/source/flash.c | 255 + resources/soc/simu/soft/func/source/frame.c | 449 + resources/soc/simu/soft/func/source/isp.c | 279 + resources/soc/simu/soft/func/source/key.c | 77 + resources/soc/simu/soft/func/source/lcd.c | 414 + .../soc/simu/soft/func/source/temp_flow.c | 416 + resources/soc/simu/soft/func/source/xmodem.c | 233 + resources/soc/simu/soft/func/start.S | 657 + resources/soc/simu/soft/func/test.lds | 72 + resources/soc/simu/testbench/MX25L6405D.v | 2154 ++ resources/soc/simu/testbench/ddr3_model.sv | 2937 +++ .../simu/testbench/ddr3_model_parameters.vh | 3412 +++ .../soc/simu/testbench/ejtag_virtual_host.v | 235 + resources/soc/simu/testbench/godson_system.v | 310 + resources/soc/simu/testbench/nand_sim.v | 3680 +++ resources/soc/simu/testbench/uart_dev.v | 527 + .../soc/simu/testbench/vmac/mac2ahb_package.v | 98 + resources/soc/simu/testbench/vmac/mac_ram.v | 989 + resources/soc/simu/testbench/vmac/mac_top.v | 13548 ++++++++++ resources/soc/simu/testbench/vmac/ram.vlog | 22018 ++++++++++++++++ .../soc/simu/testbench/vmac/virtual_mac.v | 406 + .../project_1/project_1/project_1.xpr | 1154 + .../axi_interconnect_0/axi_interconnect_0.xci | 1520 ++ .../xilinx_ip/clk_pll_33/clk_pll_33.xci | 716 + .../xilinx_ip/clk_wiz_0/clk_wiz_0.xci | 716 + .../xilinx_ip/dpram_512x32/dpram_512x32.xci | 315 + .../project_1/xilinx_ip/mig_axi_32/mig_a.prj | 131 + .../xilinx_ip/mig_axi_32/mig_axi_32.xci | 2647 ++ .../project_1/xilinx_ip/mig_axi_32/mig_b.prj | 131 + .../xilinx_ip/sram_128x22/sram_128x22.xci | 309 + .../xilinx_ip/sram_128x32/sram_128x32.xci | 309 + .../xilinx_ip/sram_128x64/sram_128x64.xci | 311 + .../xilinx_ip/sram_32x52bit/sram_32x52bit.xci | 309 + resources/soc/vivado_xpr/soc_up.xdc | 197 + 131 files changed, 90015 insertions(+) create mode 100644 resources/soc/rtl/AMBA/axi2apb.v create mode 100644 resources/soc/rtl/AMBA/axi_mux.v create mode 100644 resources/soc/rtl/APB_DEV/NAND/nand.v create mode 100644 resources/soc/rtl/APB_DEV/URT/raminfr.v create mode 100644 resources/soc/rtl/APB_DEV/URT/uart_defines.h create mode 100644 resources/soc/rtl/APB_DEV/URT/uart_receiver.v create mode 100644 resources/soc/rtl/APB_DEV/URT/uart_regs.v create mode 100644 resources/soc/rtl/APB_DEV/URT/uart_rfifo.v create mode 100644 resources/soc/rtl/APB_DEV/URT/uart_sync_flops.v create mode 100644 resources/soc/rtl/APB_DEV/URT/uart_tfifo.v create mode 100644 resources/soc/rtl/APB_DEV/URT/uart_top.v create mode 100644 resources/soc/rtl/APB_DEV/URT/uart_transmitter.v create mode 100644 resources/soc/rtl/APB_DEV/apb_dev_top.v create mode 100644 resources/soc/rtl/APB_DEV/apb_mux2.v create mode 100644 resources/soc/rtl/APB_DEV/nand_module.v create mode 100644 resources/soc/rtl/CONFREG/confreg.v create mode 100644 resources/soc/rtl/DMA/dma.v create mode 100644 resources/soc/rtl/MAC/bd.v create mode 100644 resources/soc/rtl/MAC/csr.v create mode 100644 resources/soc/rtl/MAC/dma.v create mode 100644 resources/soc/rtl/MAC/ethernet_top.v create mode 100644 resources/soc/rtl/MAC/mac.v create mode 100644 resources/soc/rtl/MAC/mac2axi.v create mode 100644 resources/soc/rtl/MAC/mac_axi.v create mode 100644 resources/soc/rtl/MAC/mac_top.v create mode 100644 resources/soc/rtl/MAC/maccsr2axi.v create mode 100644 resources/soc/rtl/MAC/macdata2axi.v create mode 100644 resources/soc/rtl/MAC/rc.v create mode 100644 resources/soc/rtl/MAC/rfifo.v create mode 100644 resources/soc/rtl/MAC/rlsm.v create mode 100644 resources/soc/rtl/MAC/rstc.v create mode 100644 resources/soc/rtl/MAC/tc.v create mode 100644 resources/soc/rtl/MAC/tfifo.v create mode 100644 resources/soc/rtl/MAC/tlsm.v create mode 100644 resources/soc/rtl/MAC/utility.v create mode 100644 resources/soc/rtl/SPI/godson_sbridge_spi.v create mode 100644 resources/soc/rtl/TOP/config.h create mode 100644 resources/soc/rtl/TOP/soc_up_top.v create mode 100644 resources/soc/rtl/cpu232/龙芯开源处理器gs232源码,目前缺少,请联系龙芯开源获得.txt create mode 100644 resources/soc/simu/run/run_func/lib.list create mode 100644 resources/soc/simu/run/run_func/ncompile create mode 100644 resources/soc/simu/run/run_func/rtl.list create mode 100644 resources/soc/simu/run/run_func/run.f create mode 100644 resources/soc/simu/run/run_func/sys.list create mode 100644 resources/soc/simu/soft/func/Makefile create mode 100644 resources/soc/simu/soft/func/config.h create mode 100644 resources/soc/simu/soft/func/convert.c create mode 100644 resources/soc/simu/soft/func/include/Calendar.h create mode 100644 resources/soc/simu/soft/func/include/Infrare.h create mode 100644 resources/soc/simu/soft/func/include/Interrupt.h create mode 100644 resources/soc/simu/soft/func/include/MonthData.h create mode 100644 resources/soc/simu/soft/func/include/SystemInit.h create mode 100644 resources/soc/simu/soft/func/include/adc.h create mode 100644 resources/soc/simu/soft/func/include/asm/interrupt.h create mode 100644 resources/soc/simu/soft/func/include/asm/mipsregs.h create mode 100644 resources/soc/simu/soft/func/include/asm/ns16550.h create mode 100644 resources/soc/simu/soft/func/include/asm/regdef.h create mode 100644 resources/soc/simu/soft/func/include/battery.h create mode 100644 resources/soc/simu/soft/func/include/cmdline.h create mode 100644 resources/soc/simu/soft/func/include/common.h create mode 100644 resources/soc/simu/soft/func/include/dg_rs232.h create mode 100644 resources/soc/simu/soft/func/include/flash.h create mode 100644 resources/soc/simu/soft/func/include/frame.h create mode 100644 resources/soc/simu/soft/func/include/isp.h create mode 100644 resources/soc/simu/soft/func/include/key.h create mode 100644 resources/soc/simu/soft/func/include/lcd.h create mode 100644 resources/soc/simu/soft/func/include/ls1d.h create mode 100644 resources/soc/simu/soft/func/include/temp_flow.h create mode 100644 resources/soc/simu/soft/func/include/xmodem.h create mode 100644 resources/soc/simu/soft/func/lib/Makefile create mode 100644 resources/soc/simu/soft/func/lib/memcmp.c create mode 100644 resources/soc/simu/soft/func/lib/memcpy.c create mode 100644 resources/soc/simu/soft/func/lib/memset.c create mode 100644 resources/soc/simu/soft/func/lib/printbase.c create mode 100644 resources/soc/simu/soft/func/lib/printf.c create mode 100644 resources/soc/simu/soft/func/lib/printhex.c create mode 100644 resources/soc/simu/soft/func/lib/putchar.c create mode 100644 resources/soc/simu/soft/func/lib/puts.c create mode 100644 resources/soc/simu/soft/func/lib/strcat.c create mode 100644 resources/soc/simu/soft/func/lib/strchr.c create mode 100644 resources/soc/simu/soft/func/lib/strcmp.c create mode 100644 resources/soc/simu/soft/func/lib/strcspn.c create mode 100644 resources/soc/simu/soft/func/lib/strspn.c create mode 100644 resources/soc/simu/soft/func/lib/strtok.c create mode 100644 resources/soc/simu/soft/func/lib/udelay.c create mode 100644 resources/soc/simu/soft/func/main.c create mode 100644 resources/soc/simu/soft/func/nand_test.S create mode 100644 resources/soc/simu/soft/func/source/Calendar.c create mode 100644 resources/soc/simu/soft/func/source/Infrare.c create mode 100644 resources/soc/simu/soft/func/source/Interrupt.c create mode 100644 resources/soc/simu/soft/func/source/MonthData.c create mode 100644 resources/soc/simu/soft/func/source/SystemInit.c create mode 100644 resources/soc/simu/soft/func/source/adc.c create mode 100644 resources/soc/simu/soft/func/source/battery.c create mode 100644 resources/soc/simu/soft/func/source/cmdline.c create mode 100644 resources/soc/simu/soft/func/source/common.c create mode 100644 resources/soc/simu/soft/func/source/dg_rs232.c create mode 100644 resources/soc/simu/soft/func/source/flash.c create mode 100644 resources/soc/simu/soft/func/source/frame.c create mode 100644 resources/soc/simu/soft/func/source/isp.c create mode 100644 resources/soc/simu/soft/func/source/key.c create mode 100644 resources/soc/simu/soft/func/source/lcd.c create mode 100644 resources/soc/simu/soft/func/source/temp_flow.c create mode 100644 resources/soc/simu/soft/func/source/xmodem.c create mode 100644 resources/soc/simu/soft/func/start.S create mode 100644 resources/soc/simu/soft/func/test.lds create mode 100644 resources/soc/simu/testbench/MX25L6405D.v create mode 100644 resources/soc/simu/testbench/ddr3_model.sv create mode 100644 resources/soc/simu/testbench/ddr3_model_parameters.vh create mode 100644 resources/soc/simu/testbench/ejtag_virtual_host.v create mode 100644 resources/soc/simu/testbench/godson_system.v create mode 100644 resources/soc/simu/testbench/nand_sim.v create mode 100644 resources/soc/simu/testbench/uart_dev.v create mode 100644 resources/soc/simu/testbench/vmac/mac2ahb_package.v create mode 100644 resources/soc/simu/testbench/vmac/mac_ram.v create mode 100644 resources/soc/simu/testbench/vmac/mac_top.v create mode 100644 resources/soc/simu/testbench/vmac/ram.vlog create mode 100644 resources/soc/simu/testbench/vmac/virtual_mac.v create mode 100644 resources/soc/vivado_xpr/project_1/project_1/project_1.xpr create mode 100644 resources/soc/vivado_xpr/project_1/xilinx_ip/axi_interconnect_0/axi_interconnect_0.xci create mode 100644 resources/soc/vivado_xpr/project_1/xilinx_ip/clk_pll_33/clk_pll_33.xci create mode 100644 resources/soc/vivado_xpr/project_1/xilinx_ip/clk_wiz_0/clk_wiz_0.xci create mode 100644 resources/soc/vivado_xpr/project_1/xilinx_ip/dpram_512x32/dpram_512x32.xci create mode 100644 resources/soc/vivado_xpr/project_1/xilinx_ip/mig_axi_32/mig_a.prj create mode 100644 resources/soc/vivado_xpr/project_1/xilinx_ip/mig_axi_32/mig_axi_32.xci create mode 100644 resources/soc/vivado_xpr/project_1/xilinx_ip/mig_axi_32/mig_b.prj create mode 100644 resources/soc/vivado_xpr/project_1/xilinx_ip/sram_128x22/sram_128x22.xci create mode 100644 resources/soc/vivado_xpr/project_1/xilinx_ip/sram_128x32/sram_128x32.xci create mode 100644 resources/soc/vivado_xpr/project_1/xilinx_ip/sram_128x64/sram_128x64.xci create mode 100644 resources/soc/vivado_xpr/project_1/xilinx_ip/sram_32x52bit/sram_32x52bit.xci create mode 100644 resources/soc/vivado_xpr/soc_up.xdc diff --git a/resources/soc/rtl/AMBA/axi2apb.v b/resources/soc/rtl/AMBA/axi2apb.v new file mode 100644 index 0000000..79c32a6 --- /dev/null +++ b/resources/soc/rtl/AMBA/axi2apb.v @@ -0,0 +1,542 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +`include "config.h" + +module axi2apb_bridge( +clk, +rst_n, +axi_s_awid, +axi_s_awaddr, +axi_s_awlen, +axi_s_awsize, +axi_s_awburst, +axi_s_awlock, +axi_s_awcache, +axi_s_awprot, +axi_s_awvalid, +axi_s_awready, +axi_s_wid, +axi_s_wdata, +axi_s_wstrb, +axi_s_wlast, +axi_s_wvalid, +axi_s_wready, +axi_s_bid, +axi_s_bresp, +axi_s_bvalid, +axi_s_bready, +axi_s_arid, +axi_s_araddr, +axi_s_arlen, +axi_s_arsize, +axi_s_arburst, +axi_s_arlock, +axi_s_arcache, +axi_s_arprot, +axi_s_arvalid, +axi_s_arready, +axi_s_rid, +axi_s_rdata, +axi_s_rresp, +axi_s_rlast, +axi_s_rvalid, +axi_s_rready, + +apb_valid_cpu, +cpu_grant, +apb_word_trans, +apb_high_24b_rd, +apb_high_24b_wr, +apb_clk, +apb_reset_n, +reg_psel, +reg_enable, +reg_rw, +reg_addr, +reg_datai, +reg_ready_1, +reg_datao +); +parameter L_ADDR_APB = 20; + +input clk; +input rst_n; + +input [`LID -1 :0] axi_s_awid; +input [`Lawaddr -1 :0] axi_s_awaddr; +input [`Lawlen -1 :0] axi_s_awlen; +input [`Lawsize -1 :0] axi_s_awsize; +input [`Lawburst -1 :0] axi_s_awburst; +input [`Lawlock -1 :0] axi_s_awlock; +input [`Lawcache -1 :0] axi_s_awcache; +input [`Lawprot -1 :0] axi_s_awprot; +input axi_s_awvalid; +output axi_s_awready; +input [`LID -1 :0] axi_s_wid; +input [`Lwdata -1 :0] axi_s_wdata; +input [`Lwstrb -1 :0] axi_s_wstrb; +input axi_s_wlast; +input axi_s_wvalid; +output axi_s_wready; +output [`LID -1 :0] axi_s_bid; +output [`Lbresp -1 :0] axi_s_bresp; +output axi_s_bvalid; +input axi_s_bready; +input [`LID -1 :0] axi_s_arid; +input [`Laraddr -1 :0] axi_s_araddr; +input [`Larlen -1 :0] axi_s_arlen; +input [`Larsize -1 :0] axi_s_arsize; +input [`Larburst -1 :0] axi_s_arburst; +input [`Larlock -1 :0] axi_s_arlock; +input [`Larcache -1 :0] axi_s_arcache; +input [`Larprot -1 :0] axi_s_arprot; +input axi_s_arvalid; +output axi_s_arready; +output [`LID -1 :0] axi_s_rid; +output [`Lrdata -1 :0] axi_s_rdata; +output [`Lrresp -1 :0] axi_s_rresp; +output axi_s_rlast; +output axi_s_rvalid; +input axi_s_rready; +input apb_word_trans; +input cpu_grant; +output apb_valid_cpu; +input [23:0] apb_high_24b_rd; +output [23:0] apb_high_24b_wr; +output apb_clk; +output apb_reset_n; +output reg_psel; +output reg_enable; +output reg_rw; +output[L_ADDR_APB-1:0] reg_addr; +output[7:0] reg_datai; +input [7:0] reg_datao; +input reg_ready_1; + +wire csr_rw_send_axi_rsp_done; +wire reg_ready; + +parameter CSR_RW_SM_IDLE = 4'b0001, + CSR_RW_SM_GET_AXI_ADDR = 4'b0010, + CSR_RW_SM_SEND_AXI_RSP = 4'b1000; + +reg reg_psel; +reg reg_enable; +reg axi_s_sel_rd; +reg axi_s_sel_wr; +reg[3:0] csr_rw_sm; +reg[3:0] csr_rw_sm_nxt; +reg[L_ADDR_APB-1:0] axi_s_req_addr; +reg[`LID-1:0] axi_s_w_id; +reg[`LID-1:0] axi_s_r_id; +reg[23:0] apb_high_24b_wr; + +assign apb_clk = clk; +assign apb_reset_n = rst_n; +assign reg_rw = axi_s_sel_wr; +assign reg_addr = axi_s_req_addr; +assign reg_ready = reg_enable & reg_ready_1; +assign apb_valid_cpu = axi_s_sel_wr | axi_s_sel_rd | axi_s_awvalid | axi_s_arvalid; +reg axi_s_rlast; +reg axi_s_rvalid; +reg axi_s_wready; +reg axi_s_awready; +reg axi_s_arready; + +reg [1:0]axi_s_rstrb; +reg [3:0]apb_s_wstrb; +reg [31:0]reg_datai_32; +reg [31:0]reg_datao_32; +reg [2:0] rd_count; +reg [2:0] apb_rd_size; +reg [2:0] apb_wr_size; +reg [7:0] reg_datai; +reg axi_s_bvalid; + +always@(posedge clk) +begin + if(!rst_n) + begin + reg_datai_32 <= 32'h0; + reg_datao_32 <= 32'h0; + axi_s_req_addr <= 20'h0; + apb_s_wstrb <= 4'b0; + axi_s_rstrb <= 2'b0; + axi_s_wready <= 1'b0; + reg_enable <= 1'b0; + reg_psel <= 1'b0; + rd_count <= 3'b0; + apb_rd_size <= 3'b0; + apb_wr_size <= 3'b0; + axi_s_rlast <= 1'b0; + axi_s_rvalid <= 1'b0; + reg_datai <= 8'b0; + axi_s_awready <= 1'b0; + axi_s_arready <= 1'b0; + axi_s_bvalid <= 1'b0; + axi_s_sel_wr <= 1'b0; + axi_s_sel_rd <= 1'b0; + axi_s_w_id <= 'h0; + axi_s_r_id <= 'h0; + apb_high_24b_wr <= 24'h0; + end + else begin + if(axi_s_awvalid & ~axi_s_bvalid & ~axi_s_sel_rd & (csr_rw_sm == CSR_RW_SM_IDLE) &cpu_grant) begin + axi_s_req_addr <= axi_s_awaddr[L_ADDR_APB-1:0]; + axi_s_awready <= 1'b1; + axi_s_sel_wr <= 1'b1; + apb_wr_size <= axi_s_awsize; + end + else if(axi_s_sel_wr) begin + axi_s_awready <= 1'b0; + if(axi_s_wvalid && ~axi_s_wready) begin + axi_s_req_addr <= (axi_s_wstrb[3:0]==4'h2)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 2'h1): + (axi_s_wstrb[3:0]==4'h4)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 2'h2): + (axi_s_wstrb[3:0]==4'h8)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 2'h3): + (axi_s_wstrb[3:0]==4'h6)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 2'h1): + (axi_s_wstrb[3:0]==4'hc)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 2'h2): axi_s_req_addr ; + axi_s_wready <= 1'b1; + reg_psel <= 1'b0; + reg_enable <= 1'b0; + axi_s_w_id <= axi_s_wid; + case({axi_s_req_addr[1:0]}) + 2'b00: begin apb_s_wstrb <= axi_s_wstrb[3:0]; reg_datai_32 <=axi_s_wdata[31:0]; end + 2'b01: begin apb_s_wstrb <= {1'b0,axi_s_wstrb[3:1]}; reg_datai_32 <={8'h0,axi_s_wdata[31:8]}; end + 2'b10: begin apb_s_wstrb <= {2'b0,axi_s_wstrb[3:2]}; reg_datai_32 <={16'b0,axi_s_wdata[31:16]}; end + 2'b11: begin apb_s_wstrb <= {3'b0,axi_s_wstrb[3]}; reg_datai_32 <={24'b0,axi_s_wdata[31:24]}; end + default: begin apb_s_wstrb <= 4'b0; reg_datai_32 <=32'h0; end + endcase + end + else if((~reg_psel) && (apb_s_wstrb!=4'h0) ) begin + reg_psel <= 1'b1; + reg_enable <= 1'b0; + reg_datai <= (apb_s_wstrb == 4'h1) ? reg_datai_32[7:0]: + (apb_s_wstrb == 4'h2) ? reg_datai_32[15:8]: + (apb_s_wstrb == 4'h6) ? reg_datai_32[15:8]: + (apb_s_wstrb == 4'h4) ? reg_datai_32[23:16]: + (apb_s_wstrb == 4'h8) ? reg_datai_32[31:24]: reg_datai_32[7:0]; + apb_high_24b_wr <= reg_datai_32[31:8]; + if(axi_s_bready) axi_s_bvalid <= 1'b0; + end + else if(apb_word_trans & apb_s_wstrb==4'hf ) begin + if(~reg_ready)begin + reg_psel <= 1'b1; + reg_enable <= 1'b1; + end + else begin + reg_psel <= 1'b0; + reg_enable <= 1'b0; + axi_s_sel_wr <= 1'b0; + axi_s_bvalid <= 1'b1; + apb_s_wstrb <= 4'b0; + end + reg_datai <= reg_datai_32[7:0]; + apb_high_24b_wr <= reg_datai_32[31:8]; + axi_s_wready <= 1'b0; + end + else if(apb_s_wstrb[0]) begin + if(~reg_ready)begin + reg_psel <= 1'b1; + reg_enable <= 1'b1; + reg_datai <= reg_datai_32[7:0]; + end + else begin + if(apb_s_wstrb[3:1] ==3'b0) + begin + reg_psel <= 1'b0; + axi_s_sel_wr<= 1'b0; + axi_s_bvalid <= 1'b1; + end + else + reg_psel <= 1'b1; + reg_enable <= 1'b0; + apb_s_wstrb[0] <= 1'b0; + axi_s_req_addr <= axi_s_req_addr +1'b1; + reg_datai <= reg_datai_32[15:8]; + end + axi_s_wready <= 1'b0; + end + else if (apb_s_wstrb[1]) begin + if(~reg_ready)begin + reg_psel <= 1'b1; + reg_enable <= 1'b1; + end + else begin + if(apb_s_wstrb[3:2] ==2'b0) + begin + reg_psel <= 1'b0; + axi_s_sel_wr <= 1'b0; + axi_s_bvalid <= 1'b1; + end + else + reg_psel <= 1'b1; + reg_enable <= 1'b0; + apb_s_wstrb[1] <= 1'b0; + axi_s_req_addr <= axi_s_req_addr +1'b1; + reg_datai <= reg_datai_32[23:16]; + end + axi_s_wready <= 1'b0; + end + else if (apb_s_wstrb[2]) begin + if(~reg_ready)begin + reg_psel <= 1'b1; + reg_enable <= 1'b1; + end + else begin + if(apb_s_wstrb[3] ==1'b0) + begin + reg_psel <= 1'b0; + axi_s_sel_wr <= 1'b0; + axi_s_bvalid <= 1'b1; + end + else + reg_psel <= 1'b1; + reg_enable <= 1'b0; + apb_s_wstrb[2] <= 1'b0; + axi_s_req_addr <= axi_s_req_addr +1'b1; + reg_datai <= reg_datai_32[31:24]; + end + axi_s_wready <= 1'b0; + end + else if (apb_s_wstrb[3]) begin + if(~reg_ready)begin + reg_psel <= 1'b1; + reg_enable <= 1'b1; + end + else begin + reg_psel <= 1'b0; + reg_enable <= 1'b0; + axi_s_sel_wr <= 1'b0; + axi_s_bvalid <= 1'b1; + apb_s_wstrb[3] <= 1'b0; + end + axi_s_wready <= 1'b0; + end + else begin + reg_psel <= 1'b0; + reg_enable <= 1'b0; + reg_datai <= 8'h0; + apb_s_wstrb <= 4'h0; + axi_s_wready <= 1'b0; + if(csr_rw_sm == CSR_RW_SM_IDLE) axi_s_sel_wr <= 1'b0; + end + end + else if(axi_s_arvalid & ~axi_s_arready & ~axi_s_bvalid & (csr_rw_sm == CSR_RW_SM_IDLE)&cpu_grant) + begin + reg_enable <= 1'b0; + reg_psel <= 1'b1; + axi_s_arready <= 1'b1; + axi_s_sel_rd <= 1'b1; + axi_s_r_id <= axi_s_arid; + apb_rd_size <= axi_s_arsize; + axi_s_req_addr <= axi_s_araddr[L_ADDR_APB-1:0]; + axi_s_rstrb <= axi_s_araddr[1:0]; + if(axi_s_arsize==3'b010) + rd_count<= 3'h4; + else if(axi_s_arsize==3'b01) + rd_count<= 3'h2; + else if(axi_s_arsize==3'b0) + rd_count<= 3'h1; + end + else if(axi_s_sel_rd) + begin + axi_s_arready <= 1'b0; + if(apb_word_trans) + begin + if(reg_ready) + begin + reg_psel <= rd_count==3'b10; + reg_enable <= 1'b0; + rd_count <= rd_count-3'b1; + axi_s_rlast <= apb_rd_size==3'h2|rd_count==2'b1; + axi_s_rvalid <= apb_rd_size==3'h2|rd_count==2'b1; + axi_s_sel_rd <= rd_count==3'b10; + reg_datao_32 <= {apb_high_24b_rd,reg_datao}; + end + else begin + reg_psel <= 1'b1; + reg_enable <= 1'b1; + end + end + else if(rd_count==3'h4) + begin + if(reg_ready) + begin + reg_psel <= 1'b1; + reg_enable <= 1'b0; + rd_count <= rd_count-3'h1; + reg_datao_32[7:0] <= reg_datao; + axi_s_req_addr <= axi_s_req_addr +1'b1; + end + else begin + reg_psel <= 1'b1; + reg_enable <= 1'b1; + end + end + else if(rd_count==3'h3) + begin + if(reg_ready) + begin + reg_psel <= 1'b1; + reg_enable <= 1'b0; + rd_count <= rd_count-3'h1; + reg_datao_32[15:8] <= reg_datao; + axi_s_req_addr <= axi_s_req_addr +1'b1; + end + else begin + reg_psel <= 1'b1; + reg_enable <= 1'b1; + end + end + else if(rd_count==3'h2) + begin + if(reg_ready) + begin + reg_psel <= 1'b1; + reg_enable <= 1'b0; + rd_count <= rd_count-3'h1; + axi_s_req_addr <= axi_s_req_addr +1'b1; + if(apb_rd_size==3'h2 ) + reg_datao_32[23:16] <= reg_datao; + else if(apb_rd_size==3'h1) + reg_datao_32[7:0] <= reg_datao; + end + else begin + reg_psel <= 1'b1; + reg_enable <= 1'b1; + end + end + else if(rd_count==3'h1) + begin + if(reg_ready) + begin + reg_psel <= 1'b0; + reg_enable <= 1'b0; + axi_s_rlast <= 1'b1; + axi_s_rvalid <= 1'b1; + axi_s_sel_rd <= 1'b0; + if(apb_rd_size==3'h2 ) + reg_datao_32[31:24] <= reg_datao; + else if(apb_rd_size==3'h1) + reg_datao_32[15:8] <= reg_datao; + else if(apb_rd_size==3'h0) + reg_datao_32[7:0] <= reg_datao; + end + else begin + reg_psel <= 1'b1; + reg_enable <= 1'b1; + end + end// end if(rd_count) + else begin + axi_s_arready <= 1'b0; + axi_s_rlast <= 1'b1; + axi_s_rvalid <= 1'b1; + reg_psel <= 1'b0; + reg_enable <= 1'b0; + if(axi_s_rvalid && axi_s_rready) + begin + reg_datao_32 <= 32'h0; + axi_s_rlast <= 1'b0; + axi_s_rvalid <= 1'b0; + end + if(csr_rw_sm == CSR_RW_SM_IDLE) axi_s_sel_rd <= 1'b0; + if(axi_s_bready) axi_s_bvalid <= 1'b0; + end + end//end if(axi_s_sel_rd) + else begin + reg_psel <= 1'b0; + reg_enable <= 1'b0; + axi_s_sel_wr <= 1'b0; + axi_s_sel_rd <= 1'b0; + axi_s_wready <= 1'b0; + axi_s_arready <= 1'b0; + axi_s_req_addr <= 32'h0; + reg_datai_32 <= 32'h0; + if(axi_s_bready) axi_s_bvalid <= 1'b0; + if(axi_s_rvalid && axi_s_rready) + begin + reg_datao_32 <= 32'h0; + axi_s_rlast <= 1'b0; + axi_s_rvalid <= 1'b0; + end + end + end//end if(rst_n) +end//end always + +assign csr_rw_send_axi_rsp_done = csr_rw_sm == CSR_RW_SM_SEND_AXI_RSP && axi_s_rlast && axi_s_rready || axi_s_bvalid && axi_s_bready; + +assign axi_s_bid = axi_s_w_id; +assign axi_s_rid = axi_s_r_id; +assign axi_s_bresp = 2'b00; +assign axi_s_rresp = 2'b00; + +assign axi_s_rdata= ( axi_s_rstrb == 2'h0) ? { reg_datao_32 } : + ( axi_s_rstrb == 2'h1) ? {reg_datao_32[23:0], 8'h0} : + ( axi_s_rstrb == 2'h2) ? {reg_datao_32[15:0],16'h0} : + ( axi_s_rstrb == 2'h3) ? {reg_datao_32[7:0], 24'h0} : 32'h0; + +always@(csr_rw_sm or axi_s_awvalid or axi_s_arvalid or axi_s_sel_rd or axi_s_sel_wr or + axi_s_wready or csr_rw_send_axi_rsp_done or cpu_grant) begin + case(csr_rw_sm) + CSR_RW_SM_IDLE: + if((axi_s_awvalid || axi_s_arvalid)&&~(axi_s_sel_wr||axi_s_sel_rd)&cpu_grant) + csr_rw_sm_nxt = CSR_RW_SM_GET_AXI_ADDR; + else + csr_rw_sm_nxt = CSR_RW_SM_IDLE; + CSR_RW_SM_GET_AXI_ADDR: + if(axi_s_sel_wr) + csr_rw_sm_nxt = CSR_RW_SM_SEND_AXI_RSP; + else if(axi_s_sel_rd) + csr_rw_sm_nxt = CSR_RW_SM_SEND_AXI_RSP; + else + csr_rw_sm_nxt = CSR_RW_SM_GET_AXI_ADDR; + CSR_RW_SM_SEND_AXI_RSP: + if(csr_rw_send_axi_rsp_done) + csr_rw_sm_nxt = CSR_RW_SM_IDLE; + else + csr_rw_sm_nxt = CSR_RW_SM_SEND_AXI_RSP; + default: + csr_rw_sm_nxt = CSR_RW_SM_IDLE; + endcase +end + +always@(posedge clk) begin + if(!rst_n) + csr_rw_sm <= CSR_RW_SM_IDLE; + else + csr_rw_sm <= csr_rw_sm_nxt; +end + +endmodule + diff --git a/resources/soc/rtl/AMBA/axi_mux.v b/resources/soc/rtl/AMBA/axi_mux.v new file mode 100644 index 0000000..6e965f4 --- /dev/null +++ b/resources/soc/rtl/AMBA/axi_mux.v @@ -0,0 +1,1102 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +`define SLV_MUX_5 +`define SLV_MUX_NUM 5 +`include "config.h" +module axi_slave_mux( +spi_boot, +axi_s_aclk, +axi_s_awid, +axi_s_awaddr, +axi_s_awlen, +axi_s_awsize, +axi_s_awburst, +axi_s_awlock, +axi_s_awcache, +axi_s_awprot, +axi_s_awvalid, +axi_s_awready, +axi_s_wready, +axi_s_wid, +axi_s_wdata, +axi_s_wstrb, +axi_s_wlast, +axi_s_wvalid, +axi_s_bid, +axi_s_bresp, +axi_s_bvalid, +axi_s_bready, +axi_s_arid, +axi_s_araddr, +axi_s_arlen, +axi_s_arsize, +axi_s_arburst, +axi_s_arlock, +axi_s_arcache, +axi_s_arprot, +axi_s_arvalid, +axi_s_arready, +axi_s_rready, +axi_s_rid, +axi_s_rdata, +axi_s_rresp, +axi_s_rlast, +axi_s_rvalid, + +s0_awid, +s0_awaddr, +s0_awlen, +s0_awsize, +s0_awburst, +s0_awlock, +s0_awcache, +s0_awprot, +s0_awvalid, +s0_awready, +s0_wid, +s0_wdata, +s0_wstrb, +s0_wlast, +s0_wvalid, +s0_wready, +s0_bid, +s0_bresp, +s0_bvalid, +s0_bready, +s0_arid, +s0_araddr, +s0_arlen, +s0_arsize, +s0_arburst, +s0_arlock, +s0_arcache, +s0_arprot, +s0_arvalid, +s0_arready, +s0_rid, +s0_rdata, +s0_rresp, +s0_rlast, +s0_rvalid, +s0_rready, + +s1_awid, +s1_awaddr, +s1_awlen, +s1_awsize, +s1_awburst, +s1_awlock, +s1_awcache, +s1_awprot, +s1_awvalid, +s1_awready, +s1_wid, +s1_wdata, +s1_wstrb, +s1_wlast, +s1_wvalid, +s1_wready, +s1_bid, +s1_bresp, +s1_bvalid, +s1_bready, +s1_arid, +s1_araddr, +s1_arlen, +s1_arsize, +s1_arburst, +s1_arlock, +s1_arcache, +s1_arprot, +s1_arvalid, +s1_arready, +s1_rid, +s1_rdata, +s1_rresp, +s1_rlast, +s1_rvalid, +s1_rready, + +s2_awid, +s2_awaddr, +s2_awlen, +s2_awsize, +s2_awburst, +s2_awlock, +s2_awcache, +s2_awprot, +s2_awvalid, +s2_awready, +s2_wid, +s2_wdata, +s2_wstrb, +s2_wlast, +s2_wvalid, +s2_wready, +s2_bid, +s2_bresp, +s2_bvalid, +s2_bready, +s2_arid, +s2_araddr, +s2_arlen, +s2_arsize, +s2_arburst, +s2_arlock, +s2_arcache, +s2_arprot, +s2_arvalid, +s2_arready, +s2_rid, +s2_rdata, +s2_rresp, +s2_rlast, +s2_rvalid, +s2_rready, +s3_awid, +s3_awaddr, +s3_awlen, +s3_awsize, +s3_awburst, +s3_awlock, +s3_awcache, +s3_awprot, +s3_awvalid, +s3_awready, +s3_wid, +s3_wdata, +s3_wstrb, +s3_wlast, +s3_wvalid, +s3_wready, +s3_bid, +s3_bresp, +s3_bvalid, +s3_bready, +s3_arid, +s3_araddr, +s3_arlen, +s3_arsize, +s3_arburst, +s3_arlock, +s3_arcache, +s3_arprot, +s3_arvalid, +s3_arready, +s3_rid, +s3_rdata, +s3_rresp, +s3_rlast, +s3_rvalid, +s3_rready, +s4_awid, +s4_awaddr, +s4_awlen, +s4_awsize, +s4_awburst, +s4_awlock, +s4_awcache, +s4_awprot, +s4_awvalid, +s4_awready, +s4_wid, +s4_wdata, +s4_wstrb, +s4_wlast, +s4_wvalid, +s4_wready, +s4_bid, +s4_bresp, +s4_bvalid, +s4_bready, +s4_arid, +s4_araddr, +s4_arlen, +s4_arsize, +s4_arburst, +s4_arlock, +s4_arcache, +s4_arprot, +s4_arvalid, +s4_arready, +s4_rid, +s4_rdata, +s4_rresp, +s4_rlast, +s4_rvalid, +s4_rready, + +axi_s_aresetn +); + +input spi_boot; +input axi_s_aclk; +input axi_s_aresetn; + +input [`LID -1 :0] axi_s_awid; +input [`Lawaddr -1 :0] axi_s_awaddr; +input [`Lawlen -1 :0] axi_s_awlen; +input [`Lawsize -1 :0] axi_s_awsize; +input [`Lawburst -1 :0] axi_s_awburst; +input [`Lawlock -1 :0] axi_s_awlock; +input [`Lawcache -1 :0] axi_s_awcache; +input [`Lawprot -1 :0] axi_s_awprot; +input axi_s_awvalid; +output axi_s_awready; +input [`LID -1 :0] axi_s_wid; +input [`Lwdata -1 :0] axi_s_wdata; +input [`Lwstrb -1 :0] axi_s_wstrb; +input axi_s_wlast; +input axi_s_wvalid; +output axi_s_wready; +output [`LID -1 :0] axi_s_bid; +output [`Lbresp -1 :0] axi_s_bresp; +output axi_s_bvalid; +input axi_s_bready; +input [`LID -1 :0] axi_s_arid; +input [`Laraddr -1 :0] axi_s_araddr; +input [`Larlen -1 :0] axi_s_arlen; +input [`Larsize -1 :0] axi_s_arsize; +input [`Larburst -1 :0] axi_s_arburst; +input [`Larlock -1 :0] axi_s_arlock; +input [`Larcache -1 :0] axi_s_arcache; +input [`Larprot -1 :0] axi_s_arprot; +input axi_s_arvalid; +output axi_s_arready; +output [`LID -1 :0] axi_s_rid; +output [`Lrdata -1 :0] axi_s_rdata; +output [`Lrresp -1 :0] axi_s_rresp; +output axi_s_rlast; +output axi_s_rvalid; +input axi_s_rready; + + + + +output [`LID -1 :0] s0_awid; +output [`Lawaddr -1 :0] s0_awaddr; +output [`Lawlen -1 :0] s0_awlen; +output [`Lawsize -1 :0] s0_awsize; +output [`Lawburst -1 :0] s0_awburst; +output [`Lawlock -1 :0] s0_awlock; +output [`Lawcache -1 :0] s0_awcache; +output [`Lawprot -1 :0] s0_awprot; +output s0_awvalid; +input s0_awready; +output [`LID -1 :0] s0_wid; +output [`Lwdata -1 :0] s0_wdata; +output [`Lwstrb -1 :0] s0_wstrb; +output s0_wlast; +output s0_wvalid; +input s0_wready; +input [`LID -1 :0] s0_bid; +input [`Lbresp -1 :0] s0_bresp; +input s0_bvalid; +output s0_bready; +output [`LID -1 :0] s0_arid; +output [`Laraddr -1 :0] s0_araddr; +output [`Larlen -1 :0] s0_arlen; +output [`Larsize -1 :0] s0_arsize; +output [`Larburst -1 :0] s0_arburst; +output [`Larlock -1 :0] s0_arlock; +output [`Larcache -1 :0] s0_arcache; +output [`Larprot -1 :0] s0_arprot; +output s0_arvalid; +input s0_arready; +input [`LID -1 :0] s0_rid; +input [`Lrdata -1 :0] s0_rdata; +input [`Lrresp -1 :0] s0_rresp; +input s0_rlast; +input s0_rvalid; +output s0_rready; + +output [`LID -1 :0] s1_awid; +output [`Lawaddr -1 :0] s1_awaddr; +output [`Lawlen -1 :0] s1_awlen; +output [`Lawsize -1 :0] s1_awsize; +output [`Lawburst -1 :0] s1_awburst; +output [`Lawlock -1 :0] s1_awlock; +output [`Lawcache -1 :0] s1_awcache; +output [`Lawprot -1 :0] s1_awprot; +output s1_awvalid; +input s1_awready; +output [`LID -1 :0] s1_wid; +output [`Lwdata -1 :0] s1_wdata; +output [`Lwstrb -1 :0] s1_wstrb; +output s1_wlast; +output s1_wvalid; +input s1_wready; +input [`LID -1 :0] s1_bid; +input [`Lbresp -1 :0] s1_bresp; +input s1_bvalid; +output s1_bready; +output [`LID -1 :0] s1_arid; +output [`Laraddr -1 :0] s1_araddr; +output [`Larlen -1 :0] s1_arlen; +output [`Larsize -1 :0] s1_arsize; +output [`Larburst -1 :0] s1_arburst; +output [`Larlock -1 :0] s1_arlock; +output [`Larcache -1 :0] s1_arcache; +output [`Larprot -1 :0] s1_arprot; +output s1_arvalid; +input s1_arready; +input [`LID -1 :0] s1_rid; +input [`Lrdata -1 :0] s1_rdata; +input [`Lrresp -1 :0] s1_rresp; +input s1_rlast; +input s1_rvalid; +output s1_rready; + + +output [`LID -1 :0] s2_awid; +output [`Lawaddr -1 :0] s2_awaddr; +output [`Lawlen -1 :0] s2_awlen; +output [`Lawsize -1 :0] s2_awsize; +output [`Lawburst -1 :0] s2_awburst; +output [`Lawlock -1 :0] s2_awlock; +output [`Lawcache -1 :0] s2_awcache; +output [`Lawprot -1 :0] s2_awprot; +output s2_awvalid; +input s2_awready; +output [`LID -1 :0] s2_wid; +output [`Lwdata -1 :0] s2_wdata; +output [`Lwstrb -1 :0] s2_wstrb; +output s2_wlast; +output s2_wvalid; +input s2_wready; +input [`LID -1 :0] s2_bid; +input [`Lbresp -1 :0] s2_bresp; +input s2_bvalid; +output s2_bready; +output [`LID -1 :0] s2_arid; +output [`Laraddr -1 :0] s2_araddr; +output [`Larlen -1 :0] s2_arlen; +output [`Larsize -1 :0] s2_arsize; +output [`Larburst -1 :0] s2_arburst; +output [`Larlock -1 :0] s2_arlock; +output [`Larcache -1 :0] s2_arcache; +output [`Larprot -1 :0] s2_arprot; +output s2_arvalid; +input s2_arready; +input [`LID -1 :0] s2_rid; +input [`Lrdata -1 :0] s2_rdata; +input [`Lrresp -1 :0] s2_rresp; +input s2_rlast; +input s2_rvalid; +output s2_rready; + +output [`LID -1 :0] s3_awid; +output [`Lawaddr -1 :0] s3_awaddr; +output [`Lawlen -1 :0] s3_awlen; +output [`Lawsize -1 :0] s3_awsize; +output [`Lawburst -1 :0] s3_awburst; +output [`Lawlock -1 :0] s3_awlock; +output [`Lawcache -1 :0] s3_awcache; +output [`Lawprot -1 :0] s3_awprot; +output s3_awvalid; +input s3_awready; +output [`LID -1 :0] s3_wid; +output [`Lwdata -1 :0] s3_wdata; +output [`Lwstrb -1 :0] s3_wstrb; +output s3_wlast; +output s3_wvalid; +input s3_wready; +input [`LID -1 :0] s3_bid; +input [`Lbresp -1 :0] s3_bresp; +input s3_bvalid; +output s3_bready; +output [`LID -1 :0] s3_arid; +output [`Laraddr -1 :0] s3_araddr; +output [`Larlen -1 :0] s3_arlen; +output [`Larsize -1 :0] s3_arsize; +output [`Larburst -1 :0] s3_arburst; +output [`Larlock -1 :0] s3_arlock; +output [`Larcache -1 :0] s3_arcache; +output [`Larprot -1 :0] s3_arprot; +output s3_arvalid; +input s3_arready; +input [`LID -1 :0] s3_rid; +input [`Lrdata -1 :0] s3_rdata; +input [`Lrresp -1 :0] s3_rresp; +input s3_rlast; +input s3_rvalid; +output s3_rready; + + +output [`LID -1 :0] s4_awid; +output [`Lawaddr -1 :0] s4_awaddr; +output [`Lawlen -1 :0] s4_awlen; +output [`Lawsize -1 :0] s4_awsize; +output [`Lawburst -1 :0] s4_awburst; +output [`Lawlock -1 :0] s4_awlock; +output [`Lawcache -1 :0] s4_awcache; +output [`Lawprot -1 :0] s4_awprot; +output s4_awvalid; +input s4_awready; +output [`LID -1 :0] s4_wid; +output [`Lwdata -1 :0] s4_wdata; +output [`Lwstrb -1 :0] s4_wstrb; +output s4_wlast; +output s4_wvalid; +input s4_wready; +input [`LID -1 :0] s4_bid; +input [`Lbresp -1 :0] s4_bresp; +input s4_bvalid; +output s4_bready; +output [`LID -1 :0] s4_arid; +output [`Laraddr -1 :0] s4_araddr; +output [`Larlen -1 :0] s4_arlen; +output [`Larsize -1 :0] s4_arsize; +output [`Larburst -1 :0] s4_arburst; +output [`Larlock -1 :0] s4_arlock; +output [`Larcache -1 :0] s4_arcache; +output [`Larprot -1 :0] s4_arprot; +output s4_arvalid; +input s4_arready; +input [`LID -1 :0] s4_rid; +input [`Lrdata -1 :0] s4_rdata; +input [`Lrresp -1 :0] s4_rresp; +input s4_rlast; +input s4_rvalid; +output s4_rready; + +wire clk; +wire rst_n; + + +reg [`LID -1:0] axi_s_rid; +reg [`Lrdata-1:0]axi_s_rdata; +reg [1:0]axi_s_rresp; +reg axi_s_rlast; +reg axi_s_rvalid; +reg axi_s_arready; + +reg [`SLV_MUX_NUM-1:0]wr_data_s_hit; + +wire [`SLV_MUX_NUM-1:0]rd_addr_hit; +wire [`SLV_MUX_NUM-1:0]wr_addr_hit; +reg [`SLV_MUX_NUM-1:0]wr_resp_s_hit ; + +wire [`SLV_MUX_NUM-1:0]s_awready ; +wire [`SLV_MUX_NUM-1:0]s_wready ; +wire [`SLV_MUX_NUM-1:0]s_bvalid ; +wire [`SLV_MUX_NUM-1:0]s_arready ; +wire [`SLV_MUX_NUM-1:0]s_rlast ; +wire [`SLV_MUX_NUM-1:0]s_rvalid ; + +wire [`LID -1:0] s_bid [`SLV_MUX_NUM-1:0]; +wire [1:0] s_bresp [`SLV_MUX_NUM-1:0]; +wire [`LID -1:0] s_rid [`SLV_MUX_NUM-1:0]; +wire [`Lrdata-1:0] s_rdata [`SLV_MUX_NUM-1:0]; +wire [1:0] s_rresp [`SLV_MUX_NUM-1:0]; + +wire s0_awvalid ; +wire s0_wvalid ; +wire s0_bready ; +wire s0_arvalid ; +wire s0_rready ; + + +assign s0_awid = axi_s_awid; +assign s0_awaddr = axi_s_awaddr; +assign s0_awlen = axi_s_awlen; +assign s0_awsize = axi_s_awsize; +assign s0_awburst = axi_s_awburst; +assign s0_awlock = axi_s_awlock; +assign s0_awcache = axi_s_awcache; +assign s0_awprot = axi_s_awprot; +assign s0_wid = axi_s_wid; +assign s0_wdata = axi_s_wdata; +assign s0_wstrb = axi_s_wstrb; +assign s0_wlast = axi_s_wlast; +assign s0_arid = axi_s_arid; +assign s0_araddr = axi_s_araddr; +assign s0_arlen = axi_s_arlen; +assign s0_arsize = axi_s_arsize; +assign s0_arburst = axi_s_arburst; +assign s0_arlock = axi_s_arlock; +assign s0_arcache = axi_s_arcache; +assign s0_arprot = axi_s_arprot; + +wire s1_awvalid ; +wire s1_wvalid ; +wire s1_bready ; +wire s1_arvalid ; +wire s1_rready ; + +assign s1_awid = axi_s_awid; +assign s1_awaddr = axi_s_awaddr; +assign s1_awlen = axi_s_awlen; +assign s1_awsize = axi_s_awsize; +assign s1_awburst = axi_s_awburst; +assign s1_awlock = axi_s_awlock; +assign s1_awcache = axi_s_awcache; +assign s1_awprot = axi_s_awprot; +assign s1_wid = axi_s_wid; +assign s1_wdata = axi_s_wdata; +assign s1_wstrb = axi_s_wstrb; +assign s1_wlast = axi_s_wlast; +assign s1_arid = axi_s_arid; +assign s1_araddr = axi_s_araddr; +assign s1_arlen = axi_s_arlen; +assign s1_arsize = axi_s_arsize; +assign s1_arburst = axi_s_arburst; +assign s1_arlock = axi_s_arlock; +assign s1_arcache = axi_s_arcache; +assign s1_arprot = axi_s_arprot; + +wire s2_awvalid ; +wire s2_wvalid ; +wire s2_bready ; +wire s2_arvalid ; +wire s2_rready ; +assign s2_awid = axi_s_awid; +assign s2_awaddr = axi_s_awaddr; +assign s2_awlen = axi_s_awlen; +assign s2_awsize = axi_s_awsize; +assign s2_awburst = axi_s_awburst; +assign s2_awlock = axi_s_awlock; +assign s2_awcache = axi_s_awcache; +assign s2_awprot = axi_s_awprot; +assign s2_wid = axi_s_wid; +assign s2_wdata = axi_s_wdata; +assign s2_wstrb = axi_s_wstrb; +assign s2_wlast = axi_s_wlast; +assign s2_arid = axi_s_arid; +assign s2_araddr = axi_s_araddr; +assign s2_arlen = axi_s_arlen; +assign s2_arsize = axi_s_arsize; +assign s2_arburst = axi_s_arburst; +assign s2_arlock = axi_s_arlock; +assign s2_arcache = axi_s_arcache; +assign s2_arprot = axi_s_arprot; +wire s3_awvalid ; +wire s3_wvalid ; +wire s3_bready ; +wire s3_arvalid ; +wire s3_rready ; +assign s3_awid = axi_s_awid; +assign s3_awaddr = axi_s_awaddr; +assign s3_awlen = axi_s_awlen; +assign s3_awsize = axi_s_awsize; +assign s3_awburst = axi_s_awburst; +assign s3_awlock = axi_s_awlock; +assign s3_awcache = axi_s_awcache; +assign s3_awprot = axi_s_awprot; +assign s3_wid = axi_s_wid; +assign s3_wdata = axi_s_wdata; +assign s3_wstrb = axi_s_wstrb; +assign s3_wlast = axi_s_wlast; +assign s3_arid = axi_s_arid; +assign s3_araddr = axi_s_araddr; +assign s3_arlen = axi_s_arlen; +assign s3_arsize = axi_s_arsize; +assign s3_arburst = axi_s_arburst; +assign s3_arlock = axi_s_arlock; +assign s3_arcache = axi_s_arcache; +assign s3_arprot = axi_s_arprot; +wire s4_awvalid ; +wire s4_wvalid ; +wire s4_bready ; +wire s4_arvalid ; +wire s4_rready ; +assign s4_awid = axi_s_awid; +assign s4_awaddr = axi_s_awaddr; +assign s4_awlen = axi_s_awlen; +assign s4_awsize = axi_s_awsize; +assign s4_awburst = axi_s_awburst; +assign s4_awlock = axi_s_awlock; +assign s4_awcache = axi_s_awcache; +assign s4_awprot = axi_s_awprot; +assign s4_wid = axi_s_wid; +assign s4_wdata = axi_s_wdata; +assign s4_wstrb = axi_s_wstrb; +assign s4_wlast = axi_s_wlast; +assign s4_arid = axi_s_arid; +assign s4_araddr = axi_s_araddr; +assign s4_arlen = axi_s_arlen; +assign s4_arsize = axi_s_arsize; +assign s4_arburst = axi_s_arburst; +assign s4_arlock = axi_s_arlock; +assign s4_arcache = axi_s_arcache; +assign s4_arprot = axi_s_arprot; + +reg [`SLV_MUX_NUM-1:0] s_awvalid; +reg [`SLV_MUX_NUM-1:0] s_wvalid ; +reg [`SLV_MUX_NUM-1:0] s_bready ; +reg [`SLV_MUX_NUM-1:0] s_arvalid; +reg [`SLV_MUX_NUM-1:0] s_rready ; + +assign s0_awvalid = s_awvalid[0] ; +assign s0_wvalid = s_wvalid [0] ; +assign s0_bready = s_bready [0] ; +assign s0_arvalid = s_arvalid[0] ; +assign s0_rready = s_rready [0] ; + +assign s1_awvalid = s_awvalid[1] ; +assign s1_wvalid = s_wvalid [1] ; +assign s1_bready = s_bready [1] ; +assign s1_arvalid = s_arvalid[1] ; +assign s1_rready = s_rready [1] ; + +assign s2_awvalid = s_awvalid[2] ; +assign s2_wvalid = s_wvalid [2] ; +assign s2_bready = s_bready [2] ; +assign s2_arvalid = s_arvalid[2] ; +assign s2_rready = s_rready [2] ; +assign s3_awvalid = s_awvalid[3] ; +assign s3_wvalid = s_wvalid [3] ; +assign s3_bready = s_bready [3] ; +assign s3_arvalid = s_arvalid[3] ; +assign s3_rready = s_rready [3] ; +assign s4_awvalid = s_awvalid[4] ; +assign s4_wvalid = s_wvalid [4] ; +assign s4_bready = s_bready [4] ; +assign s4_arvalid = s_arvalid[4] ; +assign s4_rready = s_rready [4] ; + +assign s_awready[0] = s0_awready ; +assign s_wready[0] = s0_wready ; +assign s_bid[0] = s0_bid ; +assign s_bresp[0] = s0_bresp ; +assign s_bvalid[0] = s0_bvalid ; +assign s_arready[0] = s0_arready ; +assign s_rid[0] = s0_rid ; +assign s_rdata[0] = s0_rdata ; +assign s_rresp[0] = s0_rresp ; +assign s_rlast[0] = s0_rlast ; +assign s_rvalid[0] = s0_rvalid ; +assign s_awready[1] = s1_awready ; +assign s_wready[1] = s1_wready ; +assign s_bid[1] = s1_bid ; +assign s_bresp[1] = s1_bresp ; +assign s_bvalid[1] = s1_bvalid ; +assign s_arready[1] = s1_arready ; +assign s_rid[1] = s1_rid ; +assign s_rdata[1] = s1_rdata ; +assign s_rresp[1] = s1_rresp ; +assign s_rlast[1] = s1_rlast ; +assign s_rvalid[1] = s1_rvalid ; + +assign s_awready[2] = s2_awready ; +assign s_wready[2] = s2_wready ; +assign s_bid[2] = s2_bid ; +assign s_bresp[2] = s2_bresp ; +assign s_bvalid[2] = s2_bvalid ; +assign s_arready[2] = s2_arready ; +assign s_rid[2] = s2_rid ; +assign s_rdata[2] = s2_rdata ; +assign s_rresp[2] = s2_rresp ; +assign s_rlast[2] = s2_rlast ; +assign s_rvalid[2] = s2_rvalid ; +assign s_awready[3] = s3_awready ; +assign s_wready[3] = s3_wready ; +assign s_bid[3] = s3_bid ; +assign s_bresp[3] = s3_bresp ; +assign s_bvalid[3] = s3_bvalid ; +assign s_arready[3] = s3_arready ; +assign s_rid[3] = s3_rid ; +assign s_rdata[3] = s3_rdata ; +assign s_rresp[3] = s3_rresp ; +assign s_rlast[3] = s3_rlast ; +assign s_rvalid[3] = s3_rvalid ; +assign s_awready[4] = s4_awready ; +assign s_wready[4] = s4_wready ; +assign s_bid[4] = s4_bid ; +assign s_bresp[4] = s4_bresp ; +assign s_bvalid[4] = s4_bvalid ; +assign s_arready[4] = s4_arready ; +assign s_rid[4] = s4_rid ; +assign s_rdata[4] = s4_rdata ; +assign s_rresp[4] = s4_rresp ; +assign s_rlast[4] = s4_rlast ; +assign s_rvalid[4] = s4_rvalid ; + +wire [4:0]BASE_ADDR [`SLV_MUX_NUM-1:0]; +wire [2:0]wr_sel_group_0; +wire [2:0]wr_sel_group_1; +wire [2:0]bvalid_group_0; +wire [2:0]bvalid_group_1; + +wire [2:0]rd_sel_group_0; +wire [2:0]rd_sel_group_1; +wire [2:0]rd_valid_group_0; +wire [2:0]rd_valid_group_1; + +assign bvalid_group_0 = s_bvalid[2:0]; +assign bvalid_group_1 = {1'b0,s_bvalid[4:3]}; +assign rd_valid_group_0 = s_rvalid[2:0]; +assign rd_valid_group_1 = {1'b0,s_rvalid[4:3]}; + +wire wr_fifo_empty; +wire wr_fifo_full; +wire rd_fifo_empty; +wire rd_fifo_full; + +assign clk = axi_s_aclk; +assign rst_n = axi_s_aresetn; + +reg axi_s_awready ; +reg axi_s_wready ; +reg axi_s_bvalid; +reg [`LID -1:0] axi_s_bid; +reg [1:0] axi_s_bresp; +wire wr_dir_ins; +wire wr_dir_del; +wire [2:0] wr_data_dir; +reg [2:0] wr_addr_dir; +reg [2:0] wr_resp_pre_sel; +reg wr_resp_prog; +reg [2:0] wr_resp_sel_reg; +wire [2:0] wr_resp_sel; + +integer axi_s_awready_int; +always @(s_awready or wr_fifo_full or wr_addr_hit) +begin + axi_s_awready = 1'b0; + for(axi_s_awready_int= 0 ; axi_s_awready_int< `SLV_MUX_NUM ;axi_s_awready_int=axi_s_awready_int+ 1) + begin + if(!wr_fifo_full & wr_addr_hit[axi_s_awready_int]) + axi_s_awready = s_awready[axi_s_awready_int]; + end +end + +integer awvlid_int; +always @(axi_s_awvalid or wr_fifo_full or wr_addr_hit) +begin + for(awvlid_int= 0 ; awvlid_int< `SLV_MUX_NUM ;awvlid_int=awvlid_int+ 1) + s_awvalid [awvlid_int] = !wr_fifo_full && wr_addr_hit[awvlid_int] && axi_s_awvalid; +end + +integer resp_int; +always @(wr_resp_prog or wr_resp_sel or wr_resp_sel_reg ) +begin + for(resp_int= 0 ; resp_int< `SLV_MUX_NUM ;resp_int= resp_int+ 1) + wr_resp_s_hit [resp_int] = !wr_resp_prog && wr_resp_sel == resp_int|| wr_resp_prog && wr_resp_sel_reg == resp_int; +end + +assign wr_sel_group_0=get_num(bvalid_group_0,wr_resp_pre_sel,2'h0); +assign wr_sel_group_1=get_num(bvalid_group_1,wr_resp_pre_sel,2'h3); +assign wr_resp_sel= ((wr_sel_group_0== 3'h7) && (wr_sel_group_1== 3'h7) ) ? 3'h7: + ((wr_sel_group_0!= 3'h7) && (wr_sel_group_1== 3'h7) ) ?wr_sel_group_0: + ((wr_sel_group_0== 3'h7) && (wr_sel_group_1!= 3'h7) ) ?wr_sel_group_1: + (wr_resp_pre_sel > 2'h2) ? wr_sel_group_0 : wr_sel_group_1; + +integer axi_s_resp_int; +always @(*) +begin + axi_s_bid =8'h0; + axi_s_bresp =2'h0; + axi_s_bvalid =1'h0; + for(axi_s_resp_int= 0 ; axi_s_resp_int< `SLV_MUX_NUM ;axi_s_resp_int=axi_s_resp_int+ 1) + begin + s_bready [axi_s_resp_int] = 1'b0; + if(wr_resp_s_hit[axi_s_resp_int]) + begin + axi_s_bid = s_bid[axi_s_resp_int]; + axi_s_bresp = s_bresp[axi_s_resp_int]; + axi_s_bvalid = s_bvalid[axi_s_resp_int]; + s_bready [axi_s_resp_int] = axi_s_bready; + end + end +end + +assign wr_dir_ins = !wr_fifo_full && axi_s_awvalid && axi_s_awready; +assign wr_dir_del = !wr_fifo_empty && axi_s_wvalid && axi_s_wready && axi_s_wlast; + +integer w_addr_dir_int; +always @(wr_addr_hit) +begin + wr_addr_dir = 3'b0; + for(w_addr_dir_int= 0 ; w_addr_dir_int< `SLV_MUX_NUM ;w_addr_dir_int= w_addr_dir_int+ 1) + if(wr_addr_hit[w_addr_dir_int]) + wr_addr_dir =w_addr_dir_int; +end + +integer w_ad_int; +always @(wr_fifo_empty or wr_data_dir ) +begin + for(w_ad_int = 0 ; w_ad_int < `SLV_MUX_NUM ;w_ad_int = w_ad_int + 1) + wr_data_s_hit[w_ad_int] = (!wr_fifo_empty && wr_data_dir == w_ad_int); +end + +assign wr_addr_hit[1] = axi_s_awaddr[31:20]==12'h1fc || + axi_s_awaddr[31:16]==16'h1fe8; //SPI +assign wr_addr_hit[2] = axi_s_awaddr[31:16]==16'h1fe4 || + axi_s_awaddr[31:16]==16'h1fe7 ; //APB: uart and nand +assign wr_addr_hit[3] = axi_s_awaddr[31:16]==16'h1fd0; //CONF +assign wr_addr_hit[4] = axi_s_awaddr[31:16]==16'h1ff0; //MAC +assign wr_addr_hit[0] = ~|wr_addr_hit[4:1]; //DDR3 + +nb_sync_fifo_mux wr_fifo +( +.clk(clk), +.rst_n(rst_n), + +.empty(wr_fifo_empty), +.full(wr_fifo_full), + +.shift_in(wr_dir_ins), +.data_in(wr_addr_dir), + +.shift_out(wr_dir_del), +.data_out(wr_data_dir) +); + +always@(posedge clk) begin + if(!rst_n) + wr_resp_pre_sel <= 3'b0; + else if(axi_s_bvalid && axi_s_bready) + wr_resp_pre_sel <= wr_resp_sel; +end + + +always@(posedge clk) begin + if(!rst_n || axi_s_bvalid && axi_s_bready) + wr_resp_prog <= 1'b0; + else if(!wr_resp_prog && (|s_bvalid) ) + wr_resp_prog <= 1'b1; +end + +always@(posedge clk) begin + if(!rst_n) + wr_resp_sel_reg <= 3'b0; + else if(!wr_resp_prog && (|s_bvalid) ) + wr_resp_sel_reg <= wr_resp_sel; +end + +integer axi_s_wready_int; +always @(s_wready or wr_data_s_hit) +begin + axi_s_wready = 1'b0; + for(axi_s_wready_int= 0 ; axi_s_wready_int< `SLV_MUX_NUM ;axi_s_wready_int=axi_s_wready_int+ 1) + begin + if(wr_data_s_hit[axi_s_wready_int]) + begin + axi_s_wready = s_wready [axi_s_wready_int]; + end + end +end + +integer wvalid_int; +always @(wr_data_s_hit or axi_s_wvalid ) +begin + for(wvalid_int= 0 ; wvalid_int< `SLV_MUX_NUM ;wvalid_int= wvalid_int+ 1) + s_wvalid[wvalid_int] = axi_s_wvalid && wr_data_s_hit[wvalid_int]; +end + + +wire [2:0] rd_data_sel; +wire rd_dir_ins; +wire rd_dir_del; +wire [2:0] rd_data_dir; +reg [2:0] rd_addr_dir; +reg [2:0] rd_data_pre_sel; +integer rd_arready_int; +integer rd_arvalid_int; +integer rd_addr_hit_int; + +always @(s_arready or rd_fifo_full or rd_addr_hit) +begin + axi_s_arready ='h0; + for(rd_arready_int= 0 ; rd_arready_int< `SLV_MUX_NUM ;rd_arready_int=rd_arready_int+ 1) + if(!rd_fifo_full && rd_addr_hit[rd_arready_int]) + begin + axi_s_arready =s_arready[rd_arready_int]; + end +end + +always @(axi_s_arvalid or rd_fifo_full or rd_addr_hit) +begin + for(rd_arvalid_int= 0 ; rd_arvalid_int< `SLV_MUX_NUM ;rd_arvalid_int=rd_arvalid_int+ 1) + s_arvalid [rd_arvalid_int] = !rd_fifo_full && rd_addr_hit[rd_arvalid_int] && axi_s_arvalid; +end + +assign rd_addr_hit[1] = ((axi_s_araddr[31:16]) ==16'h1fe8) || ((axi_s_araddr[31:20])==12'h1fc); //SPI +assign rd_addr_hit[2] = (axi_s_araddr[31:16]) ==16'h1fe4 || + (axi_s_araddr[31:16]) ==16'h1fe7 ;//APB:uart and nand +assign rd_addr_hit[3] = (axi_s_araddr[31:16]) ==16'h1fd0; //CONF +assign rd_addr_hit[4] = (axi_s_araddr[31:16]) == 16'h1ff0; //MAC +assign rd_addr_hit[0] = ~|rd_addr_hit[4:1]; //DDR3 + +integer rd_addr_dir_int; +always @(rd_addr_hit) +begin + rd_addr_dir = 3'b0; + for(rd_addr_dir_int= 0 ; rd_addr_dir_int< `SLV_MUX_NUM ;rd_addr_dir_int= rd_addr_dir_int+ 1) + if(rd_addr_hit[rd_addr_dir_int]) + rd_addr_dir =rd_addr_dir_int; +end + +integer axi_rd_data_int; +always @(*) +begin + axi_s_rid =8'h0; + axi_s_rdata =128'h0; + axi_s_rresp =2'h0; + axi_s_rlast =1'h0; + axi_s_rvalid =1'h0; + for(axi_rd_data_int= 0 ; axi_rd_data_int< `SLV_MUX_NUM ;axi_rd_data_int=axi_rd_data_int+ 1) + begin + s_rready [axi_rd_data_int] = 1'b0; + if(rd_data_sel==axi_rd_data_int) begin + s_rready [axi_rd_data_int] = axi_s_rready; + axi_s_rid =s_rid [axi_rd_data_int]; + axi_s_rdata =s_rdata [axi_rd_data_int]; + axi_s_rresp =s_rresp [axi_rd_data_int]; + axi_s_rlast =s_rlast [axi_rd_data_int]; + axi_s_rvalid =s_rvalid [axi_rd_data_int]; + end + end +end + +always@(posedge clk) begin + if(!rst_n) + begin + rd_data_pre_sel<= 3'b0; + end + else if(axi_s_rvalid && axi_s_rready) + begin + rd_data_pre_sel <= rd_data_sel; + end +end + +assign rd_data_sel =rd_data_dir; + +nb_sync_fifo_mux rd_fifo +( +.clk(clk), +.rst_n(rst_n), + +.empty(rd_fifo_empty), +.full(rd_fifo_full), + +.shift_in(rd_dir_ins), +.data_in(rd_addr_dir), + +.shift_out(rd_dir_del), +.data_out(rd_data_dir) +); + +assign rd_dir_ins = !rd_fifo_full && axi_s_arvalid && axi_s_arready; +assign rd_dir_del = !rd_fifo_empty && axi_s_rvalid && axi_s_rready && axi_s_rlast; + +function [2:0] get_num; +input [2:0] valid; +input [2:0] pre_num; +input [1:0] group; +begin +get_num=(valid == 3'b001)? (3'h0+group) : + (valid == 3'b010)? (3'h1+group) : + (valid == 3'b100)? (3'h2+group) : + (valid == 3'b011)? (pre_num!=(3'h0+group))?(3'h0+group):(3'h1+group) : + (valid == 3'b110)? (pre_num!=(3'h1+group))?(3'h1+group):(3'h2+group) : + (valid == 3'b101)? (pre_num!=(3'h2+group))?(3'h2+group):(3'h0+group) : + (valid == 3'b111)?((pre_num==(3'h0+group))?(3'h1+group):(pre_num==(3'h1+group))?(3'h2+group):(3'h0+group)):3'h7; +end +endfunction +endmodule + +`undef SLV_MUX_5 +`undef SLV_MUX_NUM + +module nb_sync_fifo_mux +( +clk, +rst_n, + +empty, +full, + +shift_in, +data_in, + +shift_out, +data_out +); +parameter FIFO_WIDTH = 3; + +input clk; +input rst_n; + +output empty; +output full; + +input shift_in; +input [FIFO_WIDTH-1:0] data_in; + +input shift_out; +output[FIFO_WIDTH-1:0] data_out; + + +reg [FIFO_WIDTH-1:0] fifo_ram [1:0]; +reg [1:0] wr_ptr; +reg [1:0] rd_ptr; + +wire [0:0] mem_wr_pos; +wire [0:0] mem_rd_pos; + +always@(posedge clk) begin + if(!rst_n) + wr_ptr <= 2'h0; + else if(~full && shift_in) + wr_ptr <= wr_ptr + 2'h1; +end + +always@(posedge clk) begin + if(!rst_n) + rd_ptr <= 2'h0; + else if(~empty && shift_out) + rd_ptr <= rd_ptr + 2'h1; +end + +assign full = wr_ptr == {~rd_ptr[1],rd_ptr[0]}; +assign empty = wr_ptr == rd_ptr; + +assign mem_wr_pos = wr_ptr[0:0]; +assign mem_rd_pos = rd_ptr[0:0]; + +assign data_out = fifo_ram[mem_rd_pos]; + +integer i; + +always@(posedge clk) begin + if(!rst_n) + for(i=0;i<2;i=i+1) + fifo_ram[i] <= 2'b0; + else if(shift_in && ~full) + fifo_ram[mem_wr_pos] <= data_in; +end + +endmodule diff --git a/resources/soc/rtl/APB_DEV/NAND/nand.v b/resources/soc/rtl/APB_DEV/NAND/nand.v new file mode 100644 index 0000000..f17408f --- /dev/null +++ b/resources/soc/rtl/APB_DEV/NAND/nand.v @@ -0,0 +1,1430 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module NAND_top( + nand_type, + + pclk, + prst_, + psel, + penable, + pwrite, + ADDR, + DAT_I, + DAT_O, + + NAND_CE_o, + NAND_REQ, + NAND_I, + NAND_O, + NAND_EN_, + NAND_ALE, + NAND_CLE, + NAND_WR_, + NAND_RD_, + NAND_IORDY_i, + + nand_int +); +input [1:0]nand_type; + +input pclk; +input prst_; +input pwrite; +input psel; +input penable; +input [10:0]ADDR; +input [31:0]DAT_I; +output [31:0]DAT_O; + +output [3:0]NAND_CE_o; +output NAND_REQ; +input [7:0]NAND_I; +output [7:0]NAND_O; +output NAND_EN_; +output NAND_ALE; +output NAND_CLE; +output NAND_WR_; +output NAND_RD_; +input [3:0]NAND_IORDY_i; +output nand_int; + +/************************************************************/ + +reg [31:0]REG_DAT_T; +reg [13:0]nand_addr_c; +reg [24:0]nand_addr_r; +reg [31:0]nand_op_num; +reg [31:0]nand_parameter; +reg [31:0]nand_ce_map0; +reg [31:0]nand_ce_map1; +reg [31:0]nand_rdy_map0; +reg [31:0]nand_rdy_map1; +reg [31:0]nand_command; +reg [15:0] nand_timing; +reg [37:0] addr_in_die; +reg [4:0] NAND_STATE; +reg [31:0] NAND_OP_NUM; +reg [13:0] WRITE_MAX_COUNT; +reg [13:0] READ_MAX_COUNT; +reg nand_clr_ack; +reg NAND_DONE; +reg NAND_CE_; +reg nand_int; + +wire [13:0] op_scope; +wire [2:0] nand_id_num; +wire [3:0] nand_size; +wire main_op; +wire spare_op; +wire nand_int_en; +wire nand_dma_ack_i; +wire NANDtag; +wire NAND_IORDY; + + +wire HIT0 =psel & ADDR[10:0] == 11'h00; +wire HIT1 =psel & ADDR[10:0] == 11'h04; +wire HIT2 =psel & ADDR[10:0] == 11'h08; +wire HIT3 =psel & ADDR[10:0] == 11'h0c; +wire HIT4 =psel & ADDR[10:0] == 11'h10; +wire HIT5 =psel & ADDR[10:0] == 11'h14; +wire HIT6 =psel & ADDR[10:0] == 11'h18; +wire HIT7 =psel & ADDR[10:0] == 11'h1c; +wire HIT8 =psel & ADDR[10:0] == 11'h20; +wire HIT9 =psel & ADDR[10:0] == 11'h24; +wire HIT10=psel & ADDR[10:0] == 11'h28; +wire HIT11=psel & ADDR[10:0] == 11'h2c; +wire NAND_HIT =penable & ADDR[10:0] == 11'h40; +assign nand_dma_ack_i=psel & ADDR[10:0] == 11'h40; + +assign DAT_O = REG_DAT_T; +reg NAND_DMA_REQ; +reg nand_cmd_valid; + +always @(posedge pclk) +begin + if(~prst_) + begin + nand_int <= 1'b0; + end + else + begin + nand_int <= NAND_DONE&nand_int_en; + end +end + + + +always @(posedge pclk) +begin + if(~prst_) + begin + nand_clr_ack <= 1'b1; + nand_command <= {1'b0,1'b0,1'b0,1'b0,9'b0,1'b0,NANDtag}; + nand_timing <= {8'h4,8'h12}; + nand_op_num <= 2048; + nand_addr_c <= 14'h0; + nand_addr_r <= 25'h0; + nand_parameter<= (nand_type==2'h3) ? 32'h800_5100: + (nand_type==2'h2) ? 32'h800_5000: //2'h2 means 1Gbit + (nand_type==2'h1) ? 32'h200_4b00:32'h200_4c00; + nand_ce_map0 <= 32'h0; + nand_ce_map1 <= 32'h0; + nand_rdy_map0 <= 32'h0; + nand_rdy_map1 <= 32'h0; + nand_cmd_valid<=nand_command[0]; + end + else + begin + nand_cmd_valid<=nand_command[0]; + if(pwrite& HIT0) begin + nand_command[15:0] <= DAT_I[15:0]; + end + else if(NAND_DONE && nand_command[0]) begin + nand_command [0] <= 1'b0; + nand_command [10] <= 1'b1; + nand_clr_ack <= 1'b1; + end + else begin + nand_command[31:16] <={NAND_DMA_REQ,1'b0,1'b0,NAND_STATE,NAND_CE_o,NAND_IORDY_i}; + if(~NAND_DONE) nand_clr_ack <= 1'b0; + end + + if(pwrite& HIT1) nand_addr_c <= DAT_I[13:0]; + if(pwrite& HIT2) nand_addr_r <= DAT_I[24:0]; + if(pwrite& HIT3) begin + nand_timing[7:0] <= (DAT_I[7:0]<5) ? 8'h5: DAT_I[7:0]; + nand_timing[15:8] <= (DAT_I[15:8]<2) ? 8'h2: DAT_I[15:8]; + end + if(pwrite& HIT6) nand_parameter<= DAT_I; + if(pwrite& HIT7) nand_op_num <= DAT_I; + if(pwrite& HIT8) nand_ce_map0 <= DAT_I; + if(pwrite& HIT9) nand_ce_map1 <= DAT_I; + else nand_ce_map1 <= {READ_MAX_COUNT,NAND_OP_NUM[15:0]}; + if(pwrite& HIT10) nand_rdy_map0 <= DAT_I; + if(pwrite& HIT11) nand_rdy_map1 <= DAT_I; + else nand_rdy_map1 <= {WRITE_MAX_COUNT,NAND_OP_NUM[15:0]}; + end +end + + +assign NANDtag = ~prst_ ? 1'b0 : nand_cmd_valid; +assign op_scope = nand_parameter[29:16]; +assign nand_id_num = nand_parameter[14:12]; +assign nand_size = nand_parameter[11:8]; +assign main_op = nand_command[8]; +assign spare_op = nand_command[9]; +assign nand_int_en = nand_command[13]; + +reg [7:0] status; +reg [1:0] nand_number; +reg [47:0] ID_INFORM; +reg [31:0] NAND_DAT_O_RD; +wire [3:0] NAND_CE_pre_o; +wire [3:0] NAND_IORDY_post_i; + +always @(posedge pclk) +begin + if(~prst_) + begin + addr_in_die <= 38'h0; + nand_number <= 2'h0; + end + else begin + case(nand_size) + 4'h0: begin + nand_number <= nand_addr_r[17:16]; // 1Gb in a single die , page 2048 + addr_in_die <= {9'h0,nand_addr_r[15:0],4'b0,nand_addr_c[11:0]}; + end + 4'h1: begin + nand_number <= nand_addr_r[18:17]; + addr_in_die <= {5'h0,nand_addr_r[16:0],4'b0,nand_addr_c[11:0]}; + end + 4'h2: begin + nand_number <= nand_addr_r[19:18]; + addr_in_die <= {4'h0,nand_addr_r[17:0],4'b0,nand_addr_c[11:0]}; + end + 4'h3: begin + nand_number <= nand_addr_r[20:19]; + addr_in_die <= {3'h0,nand_addr_r[18:0],4'b0,nand_addr_c[11:0]}; + end + 4'h4: begin + nand_number <= nand_addr_r[20:19]; + addr_in_die <= {3'h0,nand_addr_r[18:0],3'b0,nand_addr_c[12:0]}; + end + 4'h5: begin + nand_number <= nand_addr_r[20:19]; + addr_in_die <= {3'h0,nand_addr_r[18:0],2'b0,nand_addr_c[13:0]}; + end + 4'h6: begin + nand_number <= nand_addr_r[21:20]; + addr_in_die <= {2'h0,nand_addr_r[19:0],2'b0,nand_addr_c[13:0]}; + end + 4'h7: begin + nand_number <= nand_addr_r[22:21]; + addr_in_die <= {1'h0,nand_addr_r[20:0],2'b0,nand_addr_c[13:0]}; + end + 4'h9: begin + nand_number <= nand_addr_r[15:14]; + addr_in_die <= {15'h0,nand_addr_r[13:0],nand_addr_c[8:0]}; + end + 4'ha: begin + nand_number <= nand_addr_r[16:15]; + addr_in_die <= {14'h0,nand_addr_r[14:0],nand_addr_c[8:0]}; + end + 4'hb: begin + nand_number <= nand_addr_r[17:16]; + addr_in_die <= {13'h0,nand_addr_r[15:0],nand_addr_c[8:0]}; + end + 4'hc: begin + nand_number <= nand_addr_r[18:17]; + addr_in_die <= {12'h0,nand_addr_r[16:0],nand_addr_c[8:0]}; + end + 4'hd: begin + nand_number <= nand_addr_r[19:18]; + addr_in_die <= {11'h0,nand_addr_r[17:0],nand_addr_c[8:0]}; + end + default: begin + nand_number <= 2'b0; + addr_in_die <= 38'b0; + end + endcase + end +end + +assign NAND_CE_pre_o[0] = (nand_number ==4'h0) ? NAND_CE_ : 1'b1; +assign NAND_CE_pre_o[1] = (nand_number ==4'h1) ? NAND_CE_ : 1'b1; +assign NAND_CE_pre_o[2] = (nand_number ==4'h2) ? NAND_CE_ : 1'b1; +assign NAND_CE_pre_o[3] = (nand_number ==4'h3) ? NAND_CE_ : 1'b1; +assign NAND_IORDY = (nand_number ==4'h0) ? NAND_IORDY_post_i[0]: + (nand_number ==4'h1) ? NAND_IORDY_post_i[1]: + (nand_number ==4'h2) ? NAND_IORDY_post_i[2]: + (nand_number ==4'h3) ? NAND_IORDY_post_i[3]:1'b1; + +assign NAND_CE_o[0] = NAND_CE_pre_o[0]; +assign NAND_IORDY_post_i[0] = NAND_IORDY_i[0]; +assign NAND_CE_o[1] = nand_ce_map0[8 ] ? NAND_CE_pre_o[0]: + nand_ce_map0[9 ] ? NAND_CE_pre_o[1]: + nand_ce_map0[10] ? NAND_CE_pre_o[2]: + nand_ce_map0[11] ? NAND_CE_pre_o[3]:1'b1; + + +assign NAND_IORDY_post_i[1] = nand_ce_map0[12] ? NAND_IORDY_i[0]: + nand_ce_map0[13] ? NAND_IORDY_i[1]: + nand_ce_map0[14] ? NAND_IORDY_i[2]: + nand_ce_map0[15] ? NAND_IORDY_i[3]:1'b1; + +assign NAND_CE_o[2] = nand_ce_map0[16] ? NAND_CE_pre_o[0]: + nand_ce_map0[17] ? NAND_CE_pre_o[1]: + nand_ce_map0[18] ? NAND_CE_pre_o[2]: + nand_ce_map0[19] ? NAND_CE_pre_o[3]:1'b1; + +assign NAND_IORDY_post_i[2] = nand_ce_map0[20] ? NAND_IORDY_i[0]: + nand_ce_map0[21] ? NAND_IORDY_i[1]: + nand_ce_map0[22] ? NAND_IORDY_i[2]: + nand_ce_map0[23] ? NAND_IORDY_i[3]:1'b1; + +assign NAND_CE_o[3] = nand_ce_map0[24] ? NAND_CE_pre_o[0]: + nand_ce_map0[25] ? NAND_CE_pre_o[1]: + nand_ce_map0[26] ? NAND_CE_pre_o[2]: + nand_ce_map0[27] ? NAND_CE_pre_o[3]:1'b1; + +assign NAND_IORDY_post_i[3] = nand_ce_map0[28] ? NAND_IORDY_i[0]: + nand_ce_map0[29] ? NAND_IORDY_i[1]: + nand_ce_map0[30] ? NAND_IORDY_i[2]: + nand_ce_map0[31] ? NAND_IORDY_i[3]:1'b1; + +always @(pwrite or penable or NAND_HIT or + HIT0 or HIT1 or HIT2 or HIT3 or + HIT4 or HIT5 or HIT6 or HIT7 or + HIT8 or HIT9 or HIT10 or HIT11 or + nand_command or nand_op_num or nand_addr_c or nand_addr_r or + nand_ce_map0 or nand_ce_map1 or nand_rdy_map0 or nand_rdy_map1 or + nand_timing or nand_parameter or status or ID_INFORM or NAND_DAT_O_RD) +begin + if(~pwrite & HIT0 &penable) + REG_DAT_T = nand_command; + else if(~pwrite & HIT1&penable) + REG_DAT_T = {20'b0,nand_addr_c}; + else if(~pwrite & HIT2&penable) + REG_DAT_T = {7'b0,nand_addr_r}; + else if(~pwrite & HIT3&penable) + REG_DAT_T = nand_timing; + else if(~pwrite & HIT4&penable) + REG_DAT_T = ID_INFORM[31:0]; + else if(~pwrite & HIT5&penable) + REG_DAT_T = {status,ID_INFORM[47:32]}; + else if(~pwrite & HIT6&penable) + REG_DAT_T = nand_parameter; + else if(~pwrite & HIT7&penable) + REG_DAT_T = nand_op_num; + else if(~pwrite & HIT8&penable) + REG_DAT_T = nand_ce_map0 ; + else if(~pwrite & HIT9&penable) + REG_DAT_T = nand_ce_map1; + else if(~pwrite & HIT10&penable) + REG_DAT_T = nand_rdy_map0 ; + else if(~pwrite & HIT11&penable) + REG_DAT_T = nand_rdy_map1 ; + else if(~pwrite & NAND_HIT &penable) + REG_DAT_T = NAND_DAT_O_RD; + else REG_DAT_T = 0; +end + +reg [1:0] ADDR_pointer; +reg [7:0] NAND_O; +reg [2:0] NAND_ADDR_COUNT; +reg [7:0] WAIT_NUM; +reg [7:0] HOLD_NUM; +reg [7:0] COMMAND; +reg [4:0] PRE_STATE; +reg [2:0] READ_ID_NUM; +reg [13:0] data_count; +reg [37:0] NAND_ADDR; +reg [31:0] NAND_DAT_I_WR; + +reg NAND_WR_; +reg NAND_RD_; +reg NAND_CLE; +reg NAND_ALE; +reg NAND_GO; +reg NAND_ACK; +reg DMA_OP_DONE; +reg ERASE_SERIAL; +reg NAND_EN_; + +reg now_up_half; +reg now_oob; +assign NAND_REQ =NAND_DMA_REQ; + +parameter + NAND_IDLE = 5'b00000, + COMMAND_IN = 5'b00001, + + ADDR_4_RD_WR = 5'b00010, + ADDR_4_ERASE_ID = 5'b01010, + + READ_START = 5'b00011, + READ_WAIT = 5'b00100, + READ_WAIT_2 = 5'b00110, + READ_TRANSFER = 5'b00111, + + WRITE_START = 5'b10000, + WRITE_DATA = 5'b10001, + PROGRAM = 5'b10010, + PROGRAM_FAIL = 5'b10011, + + READ_ID = 5'b10100, + READ_STATUS = 5'b10101, + ID_TO_STATUS = 5'b10110, + + ERASE = 5'b10111, + WAIT_ERASE = 5'b11000, + ERASE_FAIL = 5'b11001, + + RESET = 5'b11010, + WAIT_RESET = 5'b11011; +always @(posedge pclk) +begin + if (~prst_||~NANDtag) + begin + now_up_half <= 1'b0; + now_oob <= 1'b0; + NAND_ACK <= 1'b0; + NAND_CLE <= 1'b0; + NAND_ALE <= 1'b0; + NAND_CE_ <= 1'b1; + NAND_WR_ <= 1'b1; + NAND_RD_ <= 1'b1; + NAND_O <= 8'b0; + COMMAND <= 8'h55; + data_count <= 14'b0; + NAND_ADDR <= 38'b0; + NAND_DONE <= 1'b0; + NAND_GO <= 1'b0; + if(~prst_) status <= 8'b0; + if(~prst_) ID_INFORM <= 48'h0; + WAIT_NUM <= 8'h14; + HOLD_NUM <= 8'h4; + PRE_STATE <= 5'b0; + ADDR_pointer <= 2'b0; + NAND_DMA_REQ <= 1'b0; + ERASE_SERIAL <= 1'b0; + NAND_OP_NUM <= 32'h0; + NAND_EN_ <= 1'b0; + NAND_ADDR_COUNT <= 3'b0; + READ_MAX_COUNT <= 14'b0; + WRITE_MAX_COUNT <= 14'b0; + DMA_OP_DONE <= 1'b0; + NAND_DAT_I_WR <= 32'b0; + NAND_DAT_O_RD <= 32'h12345678; + READ_ID_NUM <= 3'b100; + NAND_STATE <= NAND_IDLE; + end + else + begin + case(NAND_STATE) + NAND_IDLE: + begin + HOLD_NUM <= nand_timing[15:8]; + if(nand_command[0]) + begin + DMA_OP_DONE <= 1'b0; + if(nand_clr_ack) + NAND_DONE <= 1'b0; + if(NAND_OP_NUM==32'b0) begin + NAND_ADDR <= addr_in_die; + NAND_OP_NUM <= nand_op_num; + end + if(nand_command[1] &&NAND_GO && ~NAND_DONE&& (nand_size[3])&&(~main_op||main_op&&NAND_ADDR[8]&&now_up_half)&&spare_op) + begin + COMMAND <= 8'h50; + NAND_EN_ <= 1'b0; + NAND_GO <= 1'b0; + now_oob <= 1'b1; + now_up_half <= 1'b0; + end + else if(nand_command[1] && NAND_ADDR[8]&&nand_size[3]&&NAND_GO && ~NAND_DONE) + begin + COMMAND <= 8'h01; + NAND_EN_ <= 1'b0; + NAND_GO <= 1'b0; + now_oob <= 1'b0; + now_up_half <= main_op&spare_op; + end + else if(nand_command[1] && NAND_GO && ~NAND_DONE) + begin + COMMAND <= 8'h00; + NAND_EN_ <= 1'b0; + NAND_GO <= 1'b0; + now_oob <= 1'b0; + now_up_half <= 1'b0; + end + else if(nand_command[2]&&NAND_GO && ~NAND_DONE&& nand_size[3]&&(~main_op||main_op&&NAND_ADDR[8]&&now_up_half)&&spare_op) + begin + COMMAND <= 8'h50; + NAND_GO <= 1'b0; + now_oob <= 1'b1; + now_up_half <= 1'b0; + end + else if(nand_command[2]&&NAND_GO && ~NAND_DONE&& nand_size[3]&&NAND_ADDR[8]) + begin + COMMAND <= 8'h01; + NAND_GO <= 1'b0; + now_oob <= 1'b0; + now_up_half <= main_op&spare_op; + end + else if(nand_command[2]&&NAND_GO && ~NAND_DONE&& nand_size[3]&&~NAND_ADDR[8]) + begin + COMMAND <= 8'h0; + NAND_GO <= 1'b0; + now_oob <= 1'b0; + now_up_half <= 1'b0; + end + else if(nand_command[2]&&NAND_GO && ~NAND_DONE) + begin + COMMAND <= 8'h80; + NAND_GO <= 1'b0; + end + else if(nand_command[3]&&NAND_GO&& ~NAND_DONE ) + begin + COMMAND <= 8'h60; + NAND_GO <= 1'b0; + ERASE_SERIAL <= nand_command[4]; + end + else if(nand_command[5]&&NAND_GO&& ~NAND_DONE) + begin + COMMAND <= 8'h90; + NAND_GO <= 1'b0; + end + else if(nand_command[6]&&NAND_GO&& ~NAND_DONE) + begin + COMMAND <= 8'hFF; + NAND_GO <= 1'b0; + end + else if(nand_command[7]&&NAND_GO&& ~NAND_DONE) + begin + COMMAND <= 8'h70; + NAND_GO <= 1'b0; + end + else if((COMMAND==8'h00 || COMMAND==8'h70 || COMMAND==8'h80 || COMMAND==8'h01 || COMMAND==8'h50 || + COMMAND==8'h60 || COMMAND==8'h90 || COMMAND==8'hFF)&& ~NAND_DONE) begin + NAND_STATE<= COMMAND_IN; + PRE_STATE <= NAND_IDLE; + WAIT_NUM <= nand_timing[7:0]; + NAND_CE_ <= 1'b0; + NAND_CLE <= 1'b0; + NAND_ALE <= 1'b0; + NAND_WR_ <= 1'b1; + NAND_RD_ <= 1'b1; + NAND_EN_ <= 1'b0; + end + else begin + COMMAND <= 8'h55; + NAND_GO <= ~NAND_DONE & nand_command[0]; + if (~nand_command[0]) NAND_DONE <=1'b0; + end + end else begin + COMMAND <= 8'h55; + NAND_CE_ <= 1'b1; + NAND_WR_ <= 1'b1; + NAND_RD_ <= 1'b1; + NAND_STATE <= NAND_IDLE; + NAND_GO <= ~NAND_DONE&nand_command[0]; + if(~NAND_GO) begin + NAND_ADDR <= nand_command[0] ? addr_in_die : 38'h3f_ffff_ffff; + NAND_OP_NUM <= nand_command[0] ? nand_op_num : 32'b0; + end + if(nand_clr_ack) + NAND_DONE <= 1'b0; + end + end + COMMAND_IN: + begin + if(WAIT_NUM == nand_timing[7:0]) begin + NAND_CLE <= 1'b0; + NAND_WR_ <= 1'b1; + WAIT_NUM <= WAIT_NUM - 1'b1; + end + else if(WAIT_NUM == (nand_timing[7:0]-1)) begin + NAND_CLE <= 1'b1; + NAND_WR_ <= 1'b1; + WAIT_NUM <= WAIT_NUM - 1'b1; + end + else if(WAIT_NUM < nand_timing[7:0] && WAIT_NUM>HOLD_NUM) begin + NAND_O <= COMMAND; + NAND_CLE <= 1'b1; + NAND_WR_ <= 1'b0; + WAIT_NUM <= WAIT_NUM - 1'b1; + end + else if(WAIT_NUM<=HOLD_NUM && WAIT_NUM) begin + NAND_CLE <= 1'b1; + NAND_WR_ <= 1'b1; + WAIT_NUM <= WAIT_NUM - 1'b1; + end + else + begin + if(PRE_STATE==NAND_IDLE) begin + NAND_CE_ <= 1'b0; + NAND_CLE <= 1'b0; + NAND_WR_ <= 1'b1; + NAND_ALE <= 1'b0; + NAND_DONE <= 1'b0; + NAND_O <= 8'b0; + PRE_STATE <= COMMAND_IN; + if((nand_command[1]||nand_command[2])&&(COMMAND==8'h00||COMMAND==8'h01||COMMAND==8'h50)) begin + NAND_STATE <= nand_command[1] ? READ_START:WRITE_START; + WAIT_NUM <= nand_timing[7:0]; + end + else if(nand_command[2]&&(COMMAND==8'h80)) begin + NAND_STATE <= WRITE_START; + WAIT_NUM <= nand_timing[7:0]; + end + else if((COMMAND==8'h60)) begin + NAND_STATE <= ERASE; + PRE_STATE <= COMMAND_IN; + WAIT_NUM <= nand_timing[7:0]+2'b11; + end + else if((COMMAND==8'h70)) begin + NAND_STATE <= READ_STATUS; + WAIT_NUM <= nand_timing[7:0]+2'b11; + end + else if((COMMAND==8'h90)) begin + NAND_STATE <= READ_ID; + WAIT_NUM <= nand_timing[7:0]+2'b11; + end + else if((COMMAND==8'hFF)) begin + NAND_STATE <= RESET; + WAIT_NUM <= nand_timing[7:0]+2'b11; + end + else begin + NAND_STATE <= NAND_IDLE; + NAND_OP_NUM <= 32'b0; + NAND_CE_ <= 1'b1; + NAND_DONE <= 1'b1; + end + end + else + begin + NAND_CLE <= 1'b0; + NAND_ALE <= 1'b0; + NAND_WR_ <= 1'b1; + NAND_GO <= 1'b1; + NAND_STATE <= PRE_STATE; + PRE_STATE <= COMMAND_IN; + WAIT_NUM <= nand_timing[7:0]; + end + end + end + ADDR_4_ERASE_ID: + begin + if(NAND_ADDR_COUNT != 3'b0) + begin + if(WAIT_NUM > (nand_timing[7:0] - HOLD_NUM+1'b1)) + begin + NAND_ALE <= 1'b0; + NAND_WR_ <= 1'b1; + WAIT_NUM <= WAIT_NUM - 1'b1; + end + else if(WAIT_NUM > (nand_timing[7:0] - HOLD_NUM)) + begin + NAND_ALE <= 1'b1; + NAND_WR_ <= 1'b1; + WAIT_NUM <= WAIT_NUM - 1'b1; + end + else if(WAIT_NUM>=HOLD_NUM) + begin + NAND_ALE <= 1'b1; + NAND_WR_ <= 1'b0; + WAIT_NUM <= WAIT_NUM - 1'b1; + if(NAND_ADDR_COUNT == 2'b11) begin + if(nand_size==4'hc||nand_size==4'hd) NAND_O <= NAND_ADDR[16:9]; + else NAND_O <= NAND_ADDR[23:16]; + end + else if(NAND_ADDR_COUNT==2'b10) begin + if(nand_size==4'h9||nand_size==4'ha||nand_size==4'hb) NAND_O <= NAND_ADDR[16:9]; + else if(nand_size==4'hc||nand_size==4'hd) NAND_O <= NAND_ADDR[24:17]; + else if(nand_size==4'h0) NAND_O <= NAND_ADDR[23:16]; + else NAND_O <= NAND_ADDR[31:24]; + end + else if(NAND_ADDR_COUNT==3'b001) begin + if(PRE_STATE == READ_ID) + NAND_O <= NAND_ADDR[7:0]; + else + if(nand_size==4'h9||nand_size==4'ha||nand_size==4'hb) NAND_O <= NAND_ADDR[24:17]; + else if(nand_size==4'hc||nand_size==4'hd) NAND_O <= NAND_ADDR[32:25]; + else if(nand_size==4'h0) NAND_O <= NAND_ADDR[31:24]; + else NAND_O <= NAND_ADDR[35:32]; + end + end + else if((WAIT_NUM (nand_timing[7:0] - HOLD_NUM + 1'b1)) begin + NAND_ALE <= 1'b0; + NAND_WR_ <= 1'b1; + WAIT_NUM <= WAIT_NUM - 1'b1; + end + else if(WAIT_NUM > (nand_timing[7:0]- HOLD_NUM)) begin + NAND_ALE <= 1'b1; + NAND_WR_ <= 1'b1; + WAIT_NUM <= WAIT_NUM - 1'b1; + end + else if(WAIT_NUM>=HOLD_NUM) begin + NAND_ALE <= 1'b1; + NAND_WR_ <= 1'b0; + WAIT_NUM <= WAIT_NUM - 1'b1; + if(NAND_ADDR_COUNT==3'b101) + NAND_O <= NAND_ADDR[7:0]; + else if(NAND_ADDR_COUNT==3'b100) begin + if(nand_size==4'hc||nand_size==4'hd) NAND_O <= NAND_ADDR[7:0]; + else if(nand_size==4'h0) NAND_O <= NAND_ADDR[7:0]; + else NAND_O <= NAND_ADDR[15:8]; + end + else if(NAND_ADDR_COUNT==3'b11) begin + if(nand_size==4'h9||nand_size==4'ha||nand_size==4'hb) NAND_O <= NAND_ADDR[7:0]; + else if(nand_size==4'hc||nand_size==4'hd) NAND_O <= NAND_ADDR[16:9]; + else if(nand_size==4'h0) NAND_O <= NAND_ADDR[15:8]; + else NAND_O <= NAND_ADDR[23:16]; + end + else if(NAND_ADDR_COUNT==3'b10)begin + if(nand_size==4'h9||nand_size==4'ha||nand_size==4'hb) NAND_O <= NAND_ADDR[16:9]; + else if(nand_size==4'hc||nand_size==4'hd) NAND_O <= NAND_ADDR[24:17]; + else if(nand_size==4'h0) NAND_O <= NAND_ADDR[23:16]; + else NAND_O <= NAND_ADDR[31:24]; + end + else if(NAND_ADDR_COUNT==3'b1) begin + if(nand_size==4'h9||nand_size==4'ha||nand_size==4'hb) NAND_O <= NAND_ADDR[24:17]; + else if(nand_size==4'hc||nand_size==4'hd) NAND_O <= NAND_ADDR[32:25]; + else if(nand_size==4'h0) NAND_O <= NAND_ADDR[31:24]; + else NAND_O <= NAND_ADDR[37:32]; + end + end + else if((WAIT_NUM(256-NAND_ADDR[7:0]))? (256-NAND_ADDR[7:0]) : NAND_OP_NUM; + else if(now_oob) + READ_MAX_COUNT <= (NAND_OP_NUM>(16-NAND_ADDR[3:0]))? (16-NAND_ADDR[3:0]) : NAND_OP_NUM; + else + READ_MAX_COUNT <= (NAND_OP_NUM>(256-NAND_ADDR[7:0]))? (256-NAND_ADDR[7:0]) : NAND_OP_NUM; + end + + 4'h0, + 4'h1, + 4'h2, + 4'h3: begin + NAND_ADDR[10:0] <= 11'h0; + NAND_ADDR[11] <= spare_op&(~main_op); + NAND_ADDR[35:16] <= NAND_ADDR[35:16] +1'b1; + if(spare_op && main_op) + READ_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[11:0]))? (op_scope-NAND_ADDR[11:0]) : NAND_OP_NUM; + else if(spare_op) + READ_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[5:0])) ? (op_scope-NAND_ADDR[5:0]) : NAND_OP_NUM; + else + READ_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[10:0]))? (op_scope-NAND_ADDR[10:0]) : NAND_OP_NUM; + end + 4'h4: begin + NAND_ADDR[11:0] <= 12'h0; + NAND_ADDR[12] <= spare_op&(~main_op); + NAND_ADDR[35:16] <= NAND_ADDR[35:16] +1'b1; + if(spare_op && main_op) + READ_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[12:0]))? (op_scope-NAND_ADDR[12:0]) : NAND_OP_NUM; + else if(spare_op) + READ_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[6:0])) ? (op_scope-NAND_ADDR[6:0]) : NAND_OP_NUM; + else + READ_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[11:0]))? (op_scope-NAND_ADDR[11:0]) : NAND_OP_NUM; + end + 4'h5, + 4'h6, + 4'h7: begin + NAND_ADDR[12:0] <= 13'h0; + NAND_ADDR[13] <= spare_op&(~main_op); + NAND_ADDR[35:16] <= NAND_ADDR[35:16] +1'b1; + if(spare_op && main_op) + READ_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[13:0]))? (op_scope-NAND_ADDR[13:0]) : NAND_OP_NUM; + else if(spare_op) + READ_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[7:0])) ? (op_scope-NAND_ADDR[7:0]) : NAND_OP_NUM; + else + READ_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[12:0]))? (op_scope-NAND_ADDR[12:0]) : NAND_OP_NUM; + end + default: begin end + endcase + end + + READ_TRANSFER: + begin + if(~NAND_IORDY) + begin + if (~DMA_OP_DONE && ~NAND_HIT) + begin + NAND_DMA_REQ <= 1'b1; + end + else if(NAND_DMA_REQ && NAND_HIT) + begin + NAND_DMA_REQ <= 1'b0; + DMA_OP_DONE <= 1'b1; + ADDR_pointer <= 2'b0; + WAIT_NUM <= nand_timing[7:0]; + end + end + else if((data_count != READ_MAX_COUNT) && ~NAND_CE_) + begin + if ((~DMA_OP_DONE||DMA_OP_DONE &&ADDR_pointer==2'h3&&WAIT_NUM==2&&(data_count < (READ_MAX_COUNT-3'h4))) && ~NAND_HIT ) + begin + NAND_DMA_REQ <= 1'b1; + end + else if(NAND_HIT && NAND_DMA_REQ) begin + NAND_DMA_REQ <= 1'b0; + DMA_OP_DONE <= 1'b1; + if(data_count == READ_MAX_COUNT -1'b1) begin + data_count <= READ_MAX_COUNT; + end + end + + if ((WAIT_NUM > (nand_timing[7:0]-HOLD_NUM+1'b1))&&(DMA_OP_DONE||NAND_HIT)) begin + NAND_RD_ <= 1'b1; + WAIT_NUM <= WAIT_NUM - 1'b1; + end + else if ((WAIT_NUM > 1) && (DMA_OP_DONE&&~NAND_DMA_REQ) ) + begin + NAND_RD_ <= 1'b0; + WAIT_NUM <= WAIT_NUM - 1'b1; + end + else if((WAIT_NUM==1)&& (DMA_OP_DONE)) + begin + NAND_RD_ <= 1'b1; + WAIT_NUM <= nand_timing[7:0]; + ADDR_pointer <= ADDR_pointer + 1'b1; + if(data_count!=READ_MAX_COUNT -1'b1) data_count <= data_count + 1'b1; + if(NAND_OP_NUM!=32'b0) NAND_OP_NUM <= NAND_OP_NUM - 1'b1; + if(ADDR_pointer==2'b0) NAND_DAT_O_RD[7:0] <= NAND_I; + else if(ADDR_pointer==2'b01) NAND_DAT_O_RD[15:8] <= NAND_I; + else if(ADDR_pointer==2'b10) NAND_DAT_O_RD[23:16] <= NAND_I; + else if(ADDR_pointer==2'b11) begin + NAND_DAT_O_RD[31:24] <= NAND_I; + DMA_OP_DONE <= 1'b0; + end + end + end + else + begin + NAND_DMA_REQ <= 1'b0; + data_count <= 14'b0; + NAND_STATE <= NAND_IDLE; + WAIT_NUM <= nand_timing[7:0]; + if(NAND_OP_NUM==32'b0) begin + NAND_GO <= 1'b0; + NAND_DONE <= 1'b1; + NAND_CE_ <= 1'b1; + end + else begin + NAND_GO <= 1'b1; + NAND_DONE <= 1'b0; + NAND_CE_ <= 1'b0; + end + end + end + + WRITE_START: begin + if(PRE_STATE == COMMAND_IN&&COMMAND!=8'h80) begin + NAND_CE_ <= 1'b0; + NAND_CLE <= 1'b0; + NAND_ALE <= 1'b0; + NAND_WR_ <= 1'b1; + WAIT_NUM <= nand_timing[7:0]; + PRE_STATE <= WRITE_START; + NAND_STATE<= COMMAND_IN; + COMMAND <= 8'h80; + end + else if(PRE_STATE == COMMAND_IN) begin + NAND_CE_ <= 1'b0; + NAND_CLE <= 1'b0; + NAND_ALE <= 1'b0; + NAND_WR_ <= 1'b1; + WAIT_NUM <= nand_timing[7:0]; + PRE_STATE <= WRITE_START; + NAND_STATE<= ADDR_4_RD_WR; + NAND_ADDR_COUNT <= (nand_size==4'h9||nand_size==4'ha||nand_size==4'hb) ? 3'b011 : (nand_size==4'h0||nand_size==4'hc||nand_size==4'hd) ? 3'b100:3'b101; + end + else if(PRE_STATE==ADDR_4_RD_WR) begin + NAND_CE_ <= 1'b0; + NAND_CLE <= 1'b0; + NAND_ALE <= 1'b0; + NAND_WR_ <= 1'b1; + ADDR_pointer<= 2'b0; + data_count <= 14'h0; + WAIT_NUM <= nand_timing[7:0]; + NAND_STATE <= WRITE_DATA; + case(nand_size) + 4'h9, + 4'ha, + 4'hb, + 4'hc, + 4'hd: + begin + NAND_ADDR[7:0] <= 8'h0; + NAND_ADDR[30:8] <= spare_op&& (~main_op)? (NAND_ADDR[30:8] +2'b10) : now_up_half ? NAND_ADDR[30:8] : (NAND_ADDR[30:8] +1'b1); + if(spare_op && main_op&&~now_oob) + WRITE_MAX_COUNT <= (NAND_OP_NUM>(256-NAND_ADDR[7:0]))? (256-NAND_ADDR[7:0]) : NAND_OP_NUM; + else if(now_oob) + WRITE_MAX_COUNT <= (NAND_OP_NUM>(16-NAND_ADDR[3:0])) ? (16-NAND_ADDR[3:0]) : NAND_OP_NUM; + else + WRITE_MAX_COUNT <= (NAND_OP_NUM>(256-NAND_ADDR[7:0]))? (256-NAND_ADDR[7:0]) : NAND_OP_NUM; + end + + 4'h0, + 4'h1, + 4'h2, + 4'h3: begin + NAND_ADDR[10:0] <= 11'h0; + NAND_ADDR[11] <= spare_op&(~main_op); + NAND_ADDR[35:16] <= NAND_ADDR[35:16] +1'b1; + if(spare_op && main_op) + WRITE_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[11:0]))? (op_scope-NAND_ADDR[11:0]) : NAND_OP_NUM; + else if(spare_op) + WRITE_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[5:0])) ? (op_scope-NAND_ADDR[5:0]) : NAND_OP_NUM; + else + WRITE_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[10:0]))? (op_scope-NAND_ADDR[10:0]) : NAND_OP_NUM; + end + 4'h4: begin + NAND_ADDR[11:0] <= 12'h0; + NAND_ADDR[12] <= spare_op&(~main_op); + NAND_ADDR[35:16] <= NAND_ADDR[35:16] +1'b1; + if(spare_op && main_op) + WRITE_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[12:0]))? (op_scope-NAND_ADDR[12:0]) : NAND_OP_NUM; + else if(spare_op) + WRITE_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[6:0])) ? (op_scope-NAND_ADDR[6:0]) : NAND_OP_NUM; + else + WRITE_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[11:0]))? (op_scope-NAND_ADDR[11:0]) : NAND_OP_NUM; + end + 4'h5, + 4'h6, + 4'h7: begin + NAND_ADDR[12:0] <= 13'h0; + NAND_ADDR[13] <= spare_op&(~main_op); + NAND_ADDR[35:16] <= NAND_ADDR[35:16] +1'b1; + if(spare_op && main_op) + WRITE_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[13:0]))? (op_scope-NAND_ADDR[13:0]) : NAND_OP_NUM; + else if(spare_op) + WRITE_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[7:0])) ? (op_scope-NAND_ADDR[7:0]) : NAND_OP_NUM; + else + WRITE_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[12:0]))? (op_scope-NAND_ADDR[12:0]) : NAND_OP_NUM; + end + default: begin end + endcase + + end + end + + WRITE_DATA: + begin + if(data_count != WRITE_MAX_COUNT ) + begin + if(~DMA_OP_DONE&&~NAND_HIT) + NAND_DMA_REQ <= 1'b1; + else if(DMA_OP_DONE&&~NAND_HIT&&ADDR_pointer==2'h3&&WAIT_NUM==2&&(data_count < (WRITE_MAX_COUNT-3'h4))) + NAND_DMA_REQ <= 1'b1; + else if(NAND_DMA_REQ && NAND_HIT) begin + NAND_DMA_REQ <= 1'b0; + ADDR_pointer <= 2'b0; + DMA_OP_DONE <= 1'b1; + NAND_DAT_I_WR <= DAT_I; + end + + if ((WAIT_NUM > (nand_timing[7:0]-HOLD_NUM+1'b1))&&(DMA_OP_DONE||NAND_HIT)) begin + NAND_WR_ <= 1'b1; + WAIT_NUM <= WAIT_NUM - 1'b1; + end + else if ((WAIT_NUM > 1'b1) && DMA_OP_DONE) begin + NAND_WR_ <= 1'b0; + WAIT_NUM <= WAIT_NUM - 1'b1; + if (ADDR_pointer ==2'b0) + NAND_O <= NAND_DAT_I_WR[7:0]; + else if (ADDR_pointer ==2'b1) + NAND_O <= NAND_DAT_I_WR[15:8]; + else if (ADDR_pointer ==2'b10) + NAND_O<= NAND_DAT_I_WR[23:16]; + else if (ADDR_pointer ==2'b11) + begin + NAND_O <= NAND_DAT_I_WR[31:24]; + end + end + else if((WAIT_NUM == 1'b1)&&DMA_OP_DONE) begin + NAND_WR_ <= 1'b1; + WAIT_NUM <= nand_timing[7:0]; + ADDR_pointer <= ADDR_pointer + 1'b1; + if(ADDR_pointer ==2'b11) begin + DMA_OP_DONE <= 1'b0; + if(NAND_OP_NUM >=32'h4) + NAND_OP_NUM <= NAND_OP_NUM - 3'b100; + else + NAND_OP_NUM <= 32'h0; + if(NAND_OP_NUM == 32'h4) + data_count <= WRITE_MAX_COUNT; + else + data_count <= data_count + 3'b100; + end + end + end + else if(PRE_STATE != COMMAND_IN && COMMAND==8'h80) + begin + NAND_CE_ <= 1'b0; + NAND_CLE <= 1'b0; + NAND_ALE <= 1'b0; + NAND_WR_ <= 1'b1; + NAND_STATE <= COMMAND_IN; + PRE_STATE <= WRITE_DATA; + COMMAND <= 8'h10; + DMA_OP_DONE <= 1'b0; + WAIT_NUM <= nand_timing[7:0]; + end + else if(PRE_STATE == COMMAND_IN && COMMAND==8'h10) begin + NAND_CE_ <= 1'b0; + NAND_STATE <= NAND_IORDY ? WRITE_DATA:PROGRAM; + end + else if(PRE_STATE == PROGRAM && COMMAND==8'h10) begin + NAND_STATE <= COMMAND_IN; + PRE_STATE <= WRITE_DATA; + COMMAND <= 8'h70; + WAIT_NUM <= nand_timing[7:0]; + NAND_CE_ <= 1'b0; + end + else if(PRE_STATE == COMMAND_IN && COMMAND==8'h70) begin + NAND_CE_ <= 1'b0; + NAND_CLE <= 1'b0; + NAND_ALE <= 1'b0; + NAND_WR_ <= 1'b1; + NAND_RD_ <= 1'b1; + NAND_STATE<= READ_STATUS; + PRE_STATE <= WRITE_DATA; + WAIT_NUM <= nand_timing[7:0]+2'b11; + NAND_EN_ <= 1'b1; + end + else if(PRE_STATE == READ_STATUS) + begin + if(status[0]==0 && NAND_OP_NUM ==32'b0) + begin + NAND_STATE <= NAND_IDLE; + NAND_DONE <= 1'b1; + NAND_DMA_REQ <= 1'b0; + end + else if(status[0]==0) + begin + NAND_STATE <= NAND_IDLE; + NAND_DONE <= 1'b0; + end + else + begin + NAND_STATE <= PROGRAM_FAIL; + NAND_DONE <= 1'b1; + NAND_DMA_REQ<= 1'b0; + end + end + else + begin + NAND_STATE <= NAND_IDLE; + NAND_DONE <=1; + NAND_DMA_REQ <= 1'b0; + end + end + PROGRAM: + begin + if(NAND_IORDY==1'b0) begin + NAND_STATE <= PROGRAM; + end + else begin + PRE_STATE <= PROGRAM; + NAND_STATE <= WRITE_DATA; + DMA_OP_DONE <= 1'b0; + end + end + RESET: + begin + if(NAND_IORDY==1'b1) begin + NAND_STATE <= RESET; + end + else begin + NAND_STATE <= WAIT_RESET; + PRE_STATE <= RESET; + end + end + WAIT_RESET: + begin + if(NAND_IORDY) begin + NAND_STATE <= NAND_IDLE; + PRE_STATE <= WAIT_RESET; + NAND_CE_ <= 1'b1; + NAND_DONE <= 1'b1; + NAND_GO <= 1'b0; + end + else + NAND_STATE <= WAIT_RESET; + end + + READ_STATUS: + begin + if(WAIT_NUM >= (nand_timing[7:0]- HOLD_NUM+1'b1)) begin + WAIT_NUM <= WAIT_NUM - 1'b1; + NAND_STATE <= READ_STATUS; + NAND_RD_ <= 1'b1; + NAND_EN_ <= 1'b1; + end + else if(WAIT_NUM && WAIT_NUM >1 ) begin + WAIT_NUM <= WAIT_NUM - 1'b1; + NAND_STATE <= READ_STATUS; + NAND_RD_ <= 1'b0; + NAND_EN_ <= 1'b1; + end + else if(WAIT_NUM == 1) begin + WAIT_NUM <= WAIT_NUM - 1'b1; + NAND_STATE <= READ_STATUS; + status <= NAND_I; + NAND_RD_ <= 1'b1; + NAND_EN_ <= 1'b1; + end + else if(WAIT_NUM==8'b0) begin + NAND_RD_ <= 1'b1; + NAND_CE_ <= 1'b0; + PRE_STATE <= READ_STATUS; + NAND_STATE <= PRE_STATE; + WAIT_NUM <= nand_timing[7:0]; + if(PRE_STATE == 5'h1) + NAND_DONE <= 1'b1; + end + else begin + WAIT_NUM <= WAIT_NUM - 1'b1; + NAND_STATE <= READ_STATUS; + NAND_RD_ <= 1'b1; + NAND_EN_ <= 1'b1; + end + end + + PROGRAM_FAIL,ERASE_FAIL: + begin + NAND_STATE <= NAND_IDLE; + NAND_CE_ <= 1'b1; + NAND_DONE <= 1'b1; + end + ERASE: + begin + if( (PRE_STATE != ADDR_4_ERASE_ID) && (COMMAND == 8'h60) ) + begin + NAND_STATE <= ADDR_4_ERASE_ID; + PRE_STATE <= ERASE; + WAIT_NUM <= nand_timing[7:0]; + NAND_ADDR_COUNT <= (nand_size==4'h9||nand_size==4'ha||nand_size==4'hb||nand_size==4'h0) ? 3'b10:3'b011; + end + else if( (PRE_STATE != COMMAND_IN) && (COMMAND == 8'h60) ) + begin + NAND_STATE <= COMMAND_IN; + PRE_STATE <= ERASE; + COMMAND <= 8'hD0; + WAIT_NUM <= nand_timing[7:0]; + end + else if(PRE_STATE==COMMAND_IN && COMMAND== 8'hd0) + begin + NAND_STATE <= NAND_IORDY ? ERASE : WAIT_ERASE; + end + end + WAIT_ERASE: + begin + if(NAND_IORDY==1'b0) begin + NAND_STATE <= WAIT_ERASE; + end + else if(NAND_IORDY && PRE_STATE == COMMAND_IN && COMMAND == 8'h60) + begin + NAND_STATE <= ERASE; + PRE_STATE <= WAIT_ERASE; + end + else if(NAND_IORDY && COMMAND ==8'hd0 ) + begin + NAND_OP_NUM <= NAND_OP_NUM - 1'b1; + NAND_STATE <= COMMAND_IN; + PRE_STATE <= WAIT_ERASE; + COMMAND <= 8'h70; + WAIT_NUM <= nand_timing[7:0]; + NAND_CE_ <= 1'b0; + end + else if(NAND_IORDY && PRE_STATE == COMMAND_IN && COMMAND==8'h70) + begin + NAND_CE_ <= 1'b0; + NAND_CLE <= 1'b0; + NAND_ALE <= 1'b0; + NAND_WR_ <= 1'b1; + NAND_RD_ <= 1'b1; + NAND_STATE<= READ_STATUS; + PRE_STATE <= WAIT_ERASE; + WAIT_NUM <= nand_timing[7:0]+2'b11; + NAND_EN_ <= 1'b1; + end + else if(NAND_IORDY && PRE_STATE == READ_STATUS) + begin + if(status[0]==1'b0 && (NAND_OP_NUM==32'b0 || ERASE_SERIAL == 1'b0) ) + begin + NAND_STATE <= NAND_IDLE; + NAND_CE_ <= 1'b1; + NAND_DONE <= 1'b1; + NAND_ADDR <= 36'h0; + ERASE_SERIAL<= 1'b0; + end + else if(status[0]== 1'b0 && NAND_OP_NUM!=32'b0) + begin + NAND_STATE <= COMMAND_IN; + PRE_STATE <= WAIT_ERASE; + COMMAND <= 8'h60; + NAND_DONE <= 1'b0; + WAIT_NUM <= nand_timing[7:0]; + NAND_CE_ <= 1'b0; + NAND_EN_ <= 1'b0; + if(nand_size[3]) NAND_ADDR[27:14] <= NAND_ADDR[27:14] + 1'b1; + else if(nand_size==4'h1||nand_size==4'h2||nand_size==4'h3) NAND_ADDR[35:22] <= NAND_ADDR[35:22] + 1'b1; + else if(nand_size==4'h4) NAND_ADDR[33:22] <= NAND_ADDR[33:22] + 1'b1; + else if(nand_size==4'h5) NAND_ADDR[33:24] <= NAND_ADDR[33:24] + 1'b1; + else NAND_ADDR[35:25] <= NAND_ADDR[35:25] + 1'b1; + end + else + begin + NAND_STATE <= ERASE_FAIL; + NAND_DONE <= 1'b1; + end + end + else begin + NAND_STATE <= NAND_IDLE; + NAND_CE_ <= 1'b1; + NAND_DONE <= 1'b1; + end + end + READ_ID: + begin + if((PRE_STATE != ADDR_4_ERASE_ID) && COMMAND == 8'h90) + begin + NAND_STATE <= ADDR_4_ERASE_ID; + PRE_STATE <= READ_ID; + WAIT_NUM <= nand_timing[7:0]+1'b1; + READ_ID_NUM <= nand_id_num; + NAND_ADDR_COUNT <= 3'b1; + end + else if (COMMAND != 8'h70) + begin + if (READ_ID_NUM!=3'b0) + begin + NAND_EN_ <= 1'b1; + if(WAIT_NUM>(nand_timing[7:0]+1'b1-HOLD_NUM)) + begin + NAND_RD_ <= 1'b1; + WAIT_NUM <= WAIT_NUM - 1'b1; + NAND_STATE<= READ_ID; + end + else if (WAIT_NUM > 1) + begin + WAIT_NUM <= WAIT_NUM - 1'b1; + NAND_RD_ <= 1'b0; + NAND_STATE<= READ_ID; + end + else if(WAIT_NUM==1) + begin + NAND_STATE <= READ_ID; + NAND_RD_ <= 1'b1; + WAIT_NUM <= nand_timing[7:0]; + READ_ID_NUM <= READ_ID_NUM - 2'b1; + if (READ_ID_NUM==3'b01) + ID_INFORM[7:0] <= NAND_I; + else if (READ_ID_NUM==3'b10) + ID_INFORM[15:8] <= NAND_I; + else if (READ_ID_NUM==3'b11) + ID_INFORM[23:16] <= NAND_I; + else if (READ_ID_NUM==3'b100) + ID_INFORM[31:24] <= NAND_I; + else if (READ_ID_NUM==3'b101) + ID_INFORM[39:32] <= NAND_I; + else if (READ_ID_NUM==3'b110) + ID_INFORM[47:40] <= NAND_I; + end + end + else + begin + NAND_STATE <= COMMAND_IN; + PRE_STATE <= READ_ID; + COMMAND <= 8'h70; + WAIT_NUM <= nand_timing[7:0]; + NAND_CE_ <= 1'b0; + NAND_EN_ <= 1'b0; + end + end + else + begin + NAND_STATE <= ID_TO_STATUS; + PRE_STATE <= READ_ID; + NAND_EN_ <= 1'b1; + COMMAND <= 8'h70; + end + end + ID_TO_STATUS: + begin + if(PRE_STATE != READ_STATUS) + begin + NAND_CE_ <= 1'b0; + NAND_CLE <= 1'b0; + NAND_ALE <= 1'b0; + NAND_WR_ <= 1'b1; + NAND_RD_ <= 1'b1; + NAND_STATE<= READ_STATUS; + PRE_STATE <= ID_TO_STATUS; + WAIT_NUM <= nand_timing[7:0]+2'b11; + NAND_EN_ <= 1'b1; + end + else + begin + NAND_DONE <= 1'b1; + NAND_GO <= 1'b0; + NAND_STATE <= NAND_IDLE; + NAND_CE_ <= 1'b1; + end + end + default : + begin + NAND_STATE <= NAND_IDLE; + NAND_CE_ <= 1'b1; + NAND_GO <= 1'b0; + NAND_DONE <= 1'b0; + NAND_DMA_REQ <= 1'b0; + end + endcase + end +end +endmodule diff --git a/resources/soc/rtl/APB_DEV/URT/raminfr.v b/resources/soc/rtl/APB_DEV/URT/raminfr.v new file mode 100644 index 0000000..ddb6ae5 --- /dev/null +++ b/resources/soc/rtl/APB_DEV/URT/raminfr.v @@ -0,0 +1,62 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module raminfr(clk, we, a, dpra, di, dpo); + +parameter addr_width = 4; +parameter data_width = 8; +parameter depth = 16; + +input clk; +input we; +input [addr_width-1:0] a; +input [addr_width-1:0] dpra; +input [data_width-1:0] di; +output [data_width-1:0] dpo; +reg [data_width-1:0] ram [depth-1:0]; + +wire [data_width-1:0] di; +wire [addr_width-1:0] a; +wire [addr_width-1:0] dpra; + +always @(posedge clk) begin + if (we) + ram[a] <= di; +end +reg [data_width-1:0] dpo; + +always @(posedge clk) + dpo <= ram[dpra]; + +endmodule + diff --git a/resources/soc/rtl/APB_DEV/URT/uart_defines.h b/resources/soc/rtl/APB_DEV/URT/uart_defines.h new file mode 100644 index 0000000..76cd1dd --- /dev/null +++ b/resources/soc/rtl/APB_DEV/URT/uart_defines.h @@ -0,0 +1,119 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +`define UART_ADDR_WIDTH 3 +`define UART_DATA_WIDTH 8 + +// Register addresses +`define UART_REG_RB `UART_ADDR_WIDTH'd0 // receiver buffer +`define UART_REG_TR `UART_ADDR_WIDTH'd0 // transmitter +`define UART_REG_IE `UART_ADDR_WIDTH'd1 // Interrupt enable +`define UART_REG_II `UART_ADDR_WIDTH'd2 // Interrupt identification +`define UART_REG_FC `UART_ADDR_WIDTH'd2 // FIFO control +`define UART_REG_LC `UART_ADDR_WIDTH'd3 // Line Control +`define UART_REG_MC `UART_ADDR_WIDTH'd4 // Modem control +`define UART_REG_LS `UART_ADDR_WIDTH'd5 // Line status +`define UART_REG_MS `UART_ADDR_WIDTH'd6 // Modem status +`define UART_REG_SR `UART_ADDR_WIDTH'd7 // Scratch register +`define UART_REG_DL1 `UART_ADDR_WIDTH'd0 // Divisor latch bytes (1-2) +`define UART_REG_DL2 `UART_ADDR_WIDTH'd1 + +// Interrupt Enable register bits +`define UART_IE_RDA 0 // Received Data available interrupt +`define UART_IE_THRE 1 // Transmitter Holding Register empty interrupt +`define UART_IE_RLS 2 // Receiver Line Status Interrupt +`define UART_IE_MS 3 // Modem Status Interrupt + +// Interrupt Identification register bits +`define UART_II_IP 0 // Interrupt pending when 0 +`define UART_II_II 3:1 // Interrupt identification + +// Interrupt identification values for bits 3:1 +`define UART_II_RLS 3'b011 // Receiver Line Status +`define UART_II_RDA 3'b010 // Receiver Data available +`define UART_II_TI 3'b110 // Timeout Indication +`define UART_II_THRE 3'b001 // Transmitter Holding Register empty +`define UART_II_MS 3'b000 // Modem Status + +// FIFO Control Register bits +`define UART_FC_TL 1:0 // Trigger level + +// FIFO trigger level values +`define UART_FC_1 2'b00 +`define UART_FC_4 2'b01 +`define UART_FC_8 2'b10 +`define UART_FC_14 2'b11 + +// Line Control register bits +`define UART_LC_BITS 1:0 // bits in character +`define UART_LC_SB 2 // stop bits +`define UART_LC_PE 3 // parity enable +`define UART_LC_EP 4 // even parity +`define UART_LC_SP 5 // stick parity +`define UART_LC_BC 6 // Break control +`define UART_LC_DL 7 // Divisor Latch access bit + +// Modem Control register bits +`define UART_MC_DTR 0 +`define UART_MC_RTS 1 +`define UART_MC_OUT1 2 +`define UART_MC_OUT2 3 +`define UART_MC_LB 4 // Loopback mode + +// Line Status Register bits +`define UART_LS_DR 0 // Data ready +`define UART_LS_OE 1 // Overrun Error +`define UART_LS_PE 2 // Parity Error +`define UART_LS_FE 3 // Framing Error +`define UART_LS_BI 4 // Break interrupt +`define UART_LS_TFE 5 // Transmit FIFO is empty +`define UART_LS_TE 6 // Transmitter Empty indicator +`define UART_LS_EI 7 // Error indicator + +// Modem Status Register bits +`define UART_MS_DCTS 0 // Delta signals +`define UART_MS_DDSR 1 +`define UART_MS_TERI 2 +`define UART_MS_DDCD 3 +`define UART_MS_CCTS 4 // Complement signals +`define UART_MS_CDSR 5 +`define UART_MS_CRI 6 +`define UART_MS_CDCD 7 + +// FIFO parameter defines + +`define UART_FIFO_WIDTH 8 +`define UART_FIFO_DEPTH 16 +`define UART_FIFO_POINTER_W 4 +`define UART_FIFO_COUNTER_W 5 +`define UART_FIFO_REC_WIDTH 11 diff --git a/resources/soc/rtl/APB_DEV/URT/uart_receiver.v b/resources/soc/rtl/APB_DEV/URT/uart_receiver.v new file mode 100644 index 0000000..e09d50d --- /dev/null +++ b/resources/soc/rtl/APB_DEV/URT/uart_receiver.v @@ -0,0 +1,288 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +`include "uart_defines.h" + +module uart_receiver (clk, wb_rst_i, lcr, rf_pop, srx_pad_i, enable, + counter_t, rf_count, rf_data_out, rf_error_bit, + rf_overrun, rx_reset, lsr_mask, rstate, rf_push_pulse); + +input clk; +input wb_rst_i; +input [7:0] lcr; +input rf_pop; +input srx_pad_i; +input enable; +input rx_reset; +input lsr_mask; + +output [9:0] counter_t; +output [`UART_FIFO_COUNTER_W-1:0] rf_count; +output [`UART_FIFO_REC_WIDTH-1:0] rf_data_out; +output rf_overrun; +output rf_error_bit; +output [3:0] rstate; +output rf_push_pulse; + +reg [3:0] rstate; +reg [3:0] rcounter16; +reg [2:0] rbit_counter; +reg [7:0] rshift; +reg rparity; +reg rparity_error; +reg rframing_error; +reg rbit_in; +reg rparity_xor; +reg [7:0] counter_b; +reg rf_push_q; + +reg [`UART_FIFO_REC_WIDTH-1:0] rf_data_in; +wire[`UART_FIFO_REC_WIDTH-1:0] rf_data_out; +wire rf_push_pulse; +reg rf_push; +wire rf_pop; +wire rf_overrun; +wire[`UART_FIFO_COUNTER_W-1:0] rf_count; +wire rf_error_bit; +wire break_error = (counter_b == 0); + +uart_rfifo #(`UART_FIFO_REC_WIDTH) fifo_rx( + .clk ( clk ), + .wb_rst_i ( wb_rst_i ), + .data_in ( rf_data_in ), + .data_out ( rf_data_out ), + .push ( rf_push_pulse), + .pop ( rf_pop ), + .overrun ( rf_overrun ), + .count ( rf_count ), + .error_bit ( rf_error_bit ), + .fifo_reset ( rx_reset ), + .reset_status( lsr_mask ) +); + +wire rcounter16_eq_7 = (rcounter16 == 4'd7); +wire rcounter16_eq_0 = (rcounter16 == 4'd0); +wire rcounter16_eq_1 = (rcounter16 == 4'd1); + +wire [3:0] rcounter16_minus_1 = rcounter16 - 1'b1; + +parameter sr_idle = 4'd0; +parameter sr_rec_start = 4'd1; +parameter sr_rec_bit = 4'd2; +parameter sr_rec_parity = 4'd3; +parameter sr_rec_stop = 4'd4; +parameter sr_check_parity = 4'd5; +parameter sr_rec_prepare = 4'd6; +parameter sr_end_bit = 4'd7; +parameter sr_ca_lc_parity = 4'd8; +parameter sr_wait1 = 4'd9; +parameter sr_push = 4'd10; + + +always @(posedge clk ) begin + if (wb_rst_i) begin + rstate <= sr_idle; + rbit_in <= 1'b0; + rcounter16 <= 0; + rbit_counter <= 0; + rparity_xor <= 1'b0; + rframing_error <= 1'b0; + rparity_error <= 1'b0; + rparity <= 1'b0; + rshift <= 0; + rf_push <= 1'b0; + rf_data_in <= 0; + end + else if (enable) begin + case (rstate) + sr_idle : begin + rf_push <= 1'b0; + rf_data_in <= 0; + rcounter16 <= 4'b1110; + if (srx_pad_i==1'b0 & ~break_error) begin + rstate <= sr_rec_start; + end + end + sr_rec_start : begin + rf_push <= 1'b0; + if (rcounter16_eq_7) + if (srx_pad_i==1'b1) + rstate <= sr_idle; + else + rstate <= sr_rec_prepare; + else rstate<=rstate; + rcounter16 <= rcounter16_minus_1; + end + sr_rec_prepare: begin + case (lcr[1:0]) + 2'b00 : rbit_counter <= 3'b100; + 2'b01 : rbit_counter <= 3'b101; + 2'b10 : rbit_counter <= 3'b110; + 2'b11 : rbit_counter <= 3'b111; + endcase + if (rcounter16_eq_0) begin + rstate <= sr_rec_bit; + rcounter16 <= 4'b1110; + rshift <= 0; + end + else + rstate <= sr_rec_prepare; + rcounter16 <= rcounter16_minus_1; + end + sr_rec_bit : begin + if (rcounter16_eq_0) rstate <= sr_end_bit; + if (rcounter16_eq_7) + case (lcr[1:0]) + 2'b00 : rshift[4:0] <= {srx_pad_i, rshift[4:1]}; + 2'b01 : rshift[5:0] <= {srx_pad_i, rshift[5:1]}; + 2'b10 : rshift[6:0] <= {srx_pad_i, rshift[6:1]}; + 2'b11 : rshift[7:0] <= {srx_pad_i, rshift[7:1]}; + endcase + rcounter16 <= rcounter16_minus_1; + end + sr_end_bit : begin + if (rbit_counter==3'b0) + if (lcr[`UART_LC_PE]) + rstate <= sr_rec_parity; + else begin + rstate <= sr_rec_stop; + rparity_error<= 1'b0; + end + else begin + rstate <= sr_rec_bit; + rbit_counter <= rbit_counter - 1'b1; + end + rcounter16 <= 4'b1110; + end + sr_rec_parity : begin + if (rcounter16_eq_7) begin + rparity <= srx_pad_i; + rstate <= sr_ca_lc_parity; + end + rcounter16 <= rcounter16_minus_1; + end + sr_ca_lc_parity:begin + rcounter16 <= rcounter16_minus_1; + rparity_xor <= ^{rshift,rparity}; + rstate <= sr_check_parity; + end + sr_check_parity: begin + case ({lcr[`UART_LC_EP],lcr[`UART_LC_SP]}) + 2'b00: rparity_error <= rparity_xor == 0; + 2'b01: rparity_error <= ~rparity; + 2'b10: rparity_error <= rparity_xor == 1; + 2'b11: rparity_error <= rparity; + endcase + rcounter16 <= rcounter16_minus_1; + rstate <= sr_wait1; + end + sr_wait1 : + if (rcounter16_eq_0) begin + rstate <= sr_rec_stop; + rcounter16 <= 4'b1110; + end + else rcounter16 <= rcounter16_minus_1; + sr_rec_stop : begin + if (rcounter16_eq_7) begin + rframing_error <= !srx_pad_i; + rstate <= sr_push; + end + rcounter16 <= rcounter16_minus_1; + end + sr_push : begin + if(srx_pad_i | break_error) begin + if(break_error) + rf_data_in <= {8'b0, 3'b100}; + else + rf_data_in <= {rshift, 1'b0, rparity_error, rframing_error}; + rf_push <= 1'b1; + rstate <= sr_idle; + end + else if(~rframing_error) begin + rf_data_in <= {rshift, 1'b0, rparity_error, rframing_error}; + rf_push <= 1'b1; + rcounter16 <= 4'b1110; + rstate <= sr_rec_start; + end + + end + default : rstate <= sr_idle; + endcase + end +end + +always @ (posedge clk ) begin + if(wb_rst_i) rf_push_q <= 0; + else rf_push_q <= rf_push; +end + +assign rf_push_pulse = rf_push & ~rf_push_q; + + +reg [9:0] toc_value; + +always @(lcr) + case (lcr[3:0]) + 4'b0000 : toc_value = 447; + 4'b0100 : toc_value = 479; + 4'b0001, 4'b1000 : toc_value = 511; + 4'b1100 : toc_value = 543; + 4'b0010, 4'b0101, 4'b1001 : toc_value = 575; + 4'b0011, 4'b0110, 4'b1010, 4'b1101 : toc_value = 639; + 4'b0111, 4'b1011, 4'b1110 : toc_value = 703; + 4'b1111 : toc_value = 767; + endcase + +wire [7:0] brc_value; +assign brc_value = toc_value[9:2]; + +always @(posedge clk ) begin + if (wb_rst_i) counter_b <= 8'd159; + else if (srx_pad_i) counter_b <= brc_value; + else if (enable & counter_b != 8'b0) + counter_b <= counter_b - 1; +end + + +reg [9:0] counter_t; + +always @(posedge clk ) begin + if (wb_rst_i) counter_t <= 10'd639; + else if(rf_push_pulse || rf_pop || rf_count == 0) + counter_t <= toc_value; + else if (enable && counter_t != 10'b0) + counter_t <= counter_t - 1; +end + +endmodule + diff --git a/resources/soc/rtl/APB_DEV/URT/uart_regs.v b/resources/soc/rtl/APB_DEV/URT/uart_regs.v new file mode 100644 index 0000000..63757cd --- /dev/null +++ b/resources/soc/rtl/APB_DEV/URT/uart_regs.v @@ -0,0 +1,711 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +`include "uart_defines.h" + +`define UART_DL1 7:0 +`define UART_DL2 15:8 +`define UART_DL3 23:16 +module uart_regs (clk, rst, clk_carrier, + addr, dat_i, dat_o, we, re, + + modem_inputs, + rts_pad_o, dtr_pad_o, + stx_pad_o,TXD_i,srx_pad_i,RXD_o, + int_o, + usart_mode, + rx_en, + tx2rx_en +); +input clk; +input rst ; +input clk_carrier; +input [2:0] addr; +input [7:0] dat_i; +output [7:0] dat_o; +input we; +input re; + +output stx_pad_o; +input srx_pad_i; +input TXD_i; +output RXD_o; + +input [3:0] modem_inputs; +output rts_pad_o; +output dtr_pad_o; +output int_o; + +output usart_mode; +output tx2rx_en; +output rx_en; + +wire [3:0] modem_inputs; +reg enable; + +wire stx_pad_o; +wire srx_pad_i; +wire srx_pad; + +reg [7:0] dat_o; + +wire [2:0] addr; +wire [7:0] dat_i; + +reg [3:0] ier; +reg [3:0] iir; +reg [1:0] fcr; +reg [4:0] mcr; +reg infrared; +reg rx_pol; +reg [7:0] lcr; +reg [7:0] msr; +reg [23:0] dl; +reg start_dlc; +reg lsr_mask_d; +reg msi_reset; + +reg [15:0] dlc; +reg int_o; + +reg [3:0] trigger_level; +reg rx_reset; +reg tx_reset; +wire dlab; + +wire usart_mode; +wire usart_rx_en; +wire usart_tx_en; +wire tx2rx_en; +reg sclk_reg; +reg sclk_en_reg; +reg [7:0] mode_reg; +reg [7:0] fi_di_reg; +reg [7:0] sclk_count; +reg [2:0] repeat_reg; + +wire usart_normal; +wire usart_irda; +wire usart_t0; +wire usart_t1; +wire rx_en; +wire tx_en; +wire sclk_por; + +assign usart_normal = mode_reg[1:0]==2'h0; +assign usart_irda = mode_reg[1:0]==2'h1; +assign usart_t0 = mode_reg[1:0]==2'h2; +assign usart_t1 = mode_reg[1:0]==2'h3; +assign usart_tx_en = mode_reg[2]==1'b0; +assign usart_rx_en = mode_reg[2]==1'b1; +assign sclk_por = mode_reg[3]; +assign RXD_o = sclk_reg^sclk_por; + +assign usart_mode = usart_t0 || usart_t1; +assign rx_en = usart_normal || usart_irda || usart_mode && usart_rx_en; +assign tx_en = usart_normal || usart_irda || usart_mode && usart_tx_en; + + +always @(posedge clk ) +begin + if (rst) begin + mode_reg <= 8'h0; + fi_di_reg <= 8'h0; + repeat_reg<= 3'h4; + sclk_en_reg<= 1'b0; + end + else if (we && addr==`UART_REG_SR)begin + if(dlab) + fi_di_reg <= dat_i; + else + mode_reg <= dat_i; + end + else begin + if(enable) sclk_en_reg <= mode_reg[4]; + repeat_reg <= mode_reg[7:5]; + end +end + +always @(posedge clk) +begin + if(rst) begin + sclk_count <= 8'b0; + sclk_reg <=1'b0; + end + else if(usart_mode&&(fi_di_reg>8'h1)&&sclk_en_reg) begin + if(sclk_count == fi_di_reg[7:1]) begin + sclk_reg <= 1'b1; + sclk_count <= sclk_count + 1'b1; + end + else if(sclk_count == fi_di_reg) begin + sclk_reg <= 1'b0; + sclk_count <= 8'b0; + end + else begin + sclk_count <= sclk_count + 1'b1; + end + end + else begin + sclk_reg <=1'b0; + sclk_count <= 8'b0; + end +end + +wire cts_pad_i, dsr_pad_i, ri_pad_i, dcd_pad_i; +wire loopback; +wire cts, dsr, ri, dcd; +wire cts_c, dsr_c, ri_c, dcd_c; +wire rts_pad_o, dtr_pad_o; + +wire [7:0] lsr; +wire lsr0, lsr1, lsr2, lsr3, lsr4, lsr5, lsr6, lsr7; +reg lsr0r, lsr1r, lsr2r, lsr3r, lsr4r, lsr5r, lsr6r, lsr7r; +wire lsr_mask; + +assign lsr[7:0] = { lsr7r, lsr6r, lsr5r, lsr4r, lsr3r, lsr2r, lsr1r, lsr0r }; + +assign {cts_pad_i, dsr_pad_i, ri_pad_i, dcd_pad_i} = modem_inputs; +assign {cts, dsr, ri, dcd} = ~{cts_pad_i,dsr_pad_i,ri_pad_i,dcd_pad_i}; + +assign {cts_c, dsr_c, ri_c, dcd_c} = loopback ? {mcr[`UART_MC_RTS],mcr[`UART_MC_DTR],mcr[`UART_MC_OUT1],mcr[`UART_MC_OUT2]} + : {cts_pad_i,dsr_pad_i,ri_pad_i,dcd_pad_i}; + +assign dlab = lcr[`UART_LC_DL]; +assign loopback = mcr[4]; + +assign rts_pad_o = mcr[`UART_MC_RTS]; +assign dtr_pad_o = mcr[`UART_MC_DTR]; + +wire rls_int; +wire rda_int; +wire ti_int; +wire thre_int; +wire ms_int; + +wire tf_push; +reg rf_pop; +wire [`UART_FIFO_REC_WIDTH-1:0] rf_data_out; +wire rf_error_bit; +wire [`UART_FIFO_COUNTER_W-1:0] rf_count; +wire [`UART_FIFO_COUNTER_W-1:0] tf_count; +wire [2:0] tstate; +wire [3:0] rstate; +wire [9:0] counter_t; + +wire thre_set_en; +reg [7:0] block_cnt; +reg [7:0] block_value; +wire current_finish; +wire max_repeat_time; + +wire serial_out; +wire serial_out_modulated = ~ (clk_carrier & serial_out); + +uart_transmitter transmitter(.clk(clk), .wb_rst_i(rst), .lcr(lcr), .tf_push(tf_push), .wb_dat_i(dat_i), + + .tx2rx_en (tx2rx_en), + .usart_mode(usart_mode), + .srx_pad_i(TXD_i), + .enable (enable && tx_en), + .usart_t0(usart_t0), + .repeat_time(repeat_reg ), + .current_finish(current_finish), + .max_repeat_time(max_repeat_time), + + .stx_pad_o(serial_out), .tstate(tstate), .tf_count(tf_count), + .tx_reset(tx_reset), .lsr_mask(lsr_mask)); +wire rcv_pad_i; +assign rcv_pad_i = ~usart_mode ? srx_pad_i : (rx_en ? TXD_i : 1'b1); + +uart_sync_flops i_uart_sync_flops( + .rst_i (rst), + .clk_i (clk), + .stage1_rst_i (1'b0), + .stage1_clk_en_i (1'b1), + .async_dat_i (rcv_pad_i), + .sync_dat_o (srx_pad) + ); + + defparam i_uart_sync_flops.width = 1; + defparam i_uart_sync_flops.init_value = 1'b1; +wire serial_in = loopback ? serial_out : rx_pol ? ~srx_pad : srx_pad; +assign stx_pad_o = loopback ? 1'b1 : infrared ? serial_out_modulated : serial_out; + +wire rf_overrun; +wire rf_push_pulse; +uart_receiver receiver(.clk(clk), .wb_rst_i(rst), .lcr(lcr), .rf_pop(rf_pop), .srx_pad_i(serial_in), + .enable(enable && rx_en), + .counter_t(counter_t), .rf_count(rf_count), .rf_data_out(rf_data_out), .rf_error_bit(rf_error_bit), + .rf_overrun(rf_overrun), .rx_reset(rx_reset), .lsr_mask(lsr_mask), .rstate(rstate), .rf_push_pulse(rf_push_pulse)); + + +always @(dl or dlab or ier or iir or fi_di_reg or mode_reg + or lcr or lsr or msr or rf_data_out or addr ) +begin + case (addr) + `UART_REG_RB : dat_o = dlab ? dl[`UART_DL1] : rf_data_out[10:3]; + `UART_REG_IE : dat_o = dlab ? dl[`UART_DL2] : ier; + `UART_REG_II : dat_o = dlab ? dl[`UART_DL3] : {4'b1100,iir}; + `UART_REG_LC : dat_o = lcr; + `UART_REG_LS : dat_o = lsr; + `UART_REG_MS : dat_o = msr; + `UART_REG_SR : dat_o = dlab ? fi_di_reg : mode_reg; + default : dat_o = 8'b0; + endcase +end + +always @(posedge clk ) +begin + if (rst) + rf_pop <= 0; + else + if (rf_pop) + rf_pop <= 0; + else + if (re && addr == `UART_REG_RB && !dlab) + rf_pop <= 1; +end + +wire lsr_mask_condition; +wire iir_read; +wire msr_read; +wire fifo_read; +wire fifo_write; + +assign lsr_mask_condition = (re && addr == `UART_REG_LS && !dlab); +assign iir_read = (re && addr == `UART_REG_II && !dlab); +assign msr_read = (re && addr == `UART_REG_MS && !dlab); +assign fifo_read = (re && addr == `UART_REG_RB && !dlab); +assign fifo_write = (we && addr == `UART_REG_TR && !dlab); + +always @(posedge clk ) +begin + if (rst) + lsr_mask_d <= 0; + else + lsr_mask_d <= lsr_mask_condition; +end + +assign lsr_mask = lsr_mask_condition && ~lsr_mask_d; + +always @(posedge clk ) +begin + if (rst) + msi_reset <= 1; + else + if (msi_reset) + msi_reset <= 0; + else + if (msr_read) + msi_reset <= 1; +end + +always @(posedge clk ) + if (rst) + lcr <= 8'b00000011; + else + if (we && addr==`UART_REG_LC) + lcr <= dat_i; + +always @(posedge clk ) + if (rst) + begin + ier <= 4'b0000; + dl[`UART_DL2] <= 8'b0; + end + else + if (we && addr==`UART_REG_IE) + if (dlab) + begin + dl[`UART_DL2] <= dat_i; + end + else + ier <= dat_i[3:0]; + else + ier<= ier; + +always @(posedge clk ) + if (rst) begin + fcr <= 2'b11; + rx_reset <= 0; + tx_reset <= 0; + dl[`UART_DL3] <= 8'h0; + end else + if (we && addr==`UART_REG_FC) begin + if(dlab) dl[`UART_DL3] <= dat_i; + else begin + fcr <= dat_i[7:6]; + rx_reset <= dat_i[1]; + tx_reset <= dat_i[2]; + end + end else begin + rx_reset <= 0; + tx_reset <= 0; + end + +always @(posedge clk ) + if (rst) begin + mcr <= 5'b0; + infrared <= 1'b0; + rx_pol <= 1'b0; end + else + if(we && addr==`UART_REG_MC) begin + mcr <= dat_i[4:0]; + infrared <= dat_i[7]; + rx_pol <= dat_i[6]; end + +assign tf_push = we & addr==`UART_REG_TR & !dlab; +always @(posedge clk ) + if (rst) + begin + dl[`UART_DL1] <= 8'b0; + start_dlc <= 1'b0; + end + else + if (we && addr==`UART_REG_TR) + if (dlab) + begin + dl[`UART_DL1] <= dat_i; + start_dlc <= 1'b1; + end + else + begin + start_dlc <= 1'b0; + end + else + begin + start_dlc <= 1'b0; + end + +always @(fcr) + case (fcr[`UART_FC_TL]) + 2'b00 : trigger_level = 1; + 2'b01 : trigger_level = 4; + 2'b10 : trigger_level = 8; + 2'b11 : trigger_level = 14; + endcase + +reg [3:0] delayed_modem_signals; +always @(posedge clk ) +begin + if (rst) + begin + msr <= 0; + delayed_modem_signals[3:0] <= 0; + end + else begin + msr[`UART_MS_DDCD:`UART_MS_DCTS] <= msi_reset ? 4'b0 : + msr[`UART_MS_DDCD:`UART_MS_DCTS] | ({dcd, ri, dsr, cts} ^ delayed_modem_signals[3:0]); + msr[`UART_MS_CDCD:`UART_MS_CCTS] <= {dcd_c, ri_c, dsr_c, cts_c}; + delayed_modem_signals[3:0] <= {dcd, ri, dsr, cts}; + end +end + +assign lsr0 = (rf_count==0 && rf_push_pulse); +assign lsr1 = rf_overrun; +assign lsr2 = rf_data_out[1]; +assign lsr3 = rf_data_out[0]; +assign lsr4 = rf_data_out[2]; +assign lsr5 = current_finish && (tf_count==5'b0 && thre_set_en); +assign lsr6 = (tf_count==5'b0 && thre_set_en && (tstate == 3'd0)); +assign lsr7 = rf_error_bit | rf_overrun; + +reg lsr0_d; + +always @(posedge clk ) + if (rst) lsr0_d <= 0; + else lsr0_d <= lsr0; + +always @(posedge clk ) + if (rst) lsr0r <= 0; + else lsr0r <= (rf_count==1 && rf_pop && !rf_push_pulse || rx_reset) ? 0 : + lsr0r || (lsr0 && ~lsr0_d); + +reg lsr1_d; + +always @(posedge clk ) + if (rst) lsr1_d <= 0; + else lsr1_d <= lsr1; + +always @(posedge clk ) + if (rst) lsr1r <= 0; + else lsr1r <= lsr_mask ? 0 : lsr1r || (lsr1 && ~lsr1_d); + +reg lsr2_d; + +always @(posedge clk ) + if (rst) lsr2_d <= 0; + else lsr2_d <= lsr2; + +always @(posedge clk ) + if (rst) lsr2r <= 0; + else lsr2r <= lsr_mask ? 0 : lsr2r || (lsr2 && ~lsr2_d); + +reg lsr3_d; + +always @(posedge clk ) + if (rst) lsr3_d <= 0; + else lsr3_d <= lsr3; + +always @(posedge clk ) + if (rst) lsr3r <= 0; + else lsr3r <= lsr_mask ? 0 : lsr3r || (lsr3 && ~lsr3_d); + +reg lsr4_d; + +always @(posedge clk ) + if (rst) lsr4_d <= 0; + else lsr4_d <= lsr4; + +always @(posedge clk ) + if (rst) lsr4r <= 0; + else lsr4r <= lsr_mask ? 0 : lsr4r || (lsr4 && ~lsr4_d); + +reg lsr5_d; +always @(posedge clk ) + if (rst) lsr5_d <= 1; + else lsr5_d <= lsr5; + +always @(posedge clk ) + if (rst) lsr5r <= 1; + else lsr5r <= (fifo_write) ? 0 : lsr5r || (lsr5 && ~lsr5_d); + +reg lsr6_d; + +always @(posedge clk ) + if (rst) lsr6_d <= 1; + else lsr6_d <= lsr6; + +always @(posedge clk ) + if (rst) lsr6r <= 1; + else lsr6r <= (fifo_write) ? 0 : lsr6r || (lsr6 && ~lsr6_d); + +reg lsr7_d; + +always @(posedge clk ) + if (rst) lsr7_d <= 0; + else lsr7_d <= lsr7; + +always @(posedge clk ) + if (rst) lsr7r <= 0; + else lsr7r <= lsr_mask ? 0 : lsr7r || (lsr7 && ~lsr7_d); + +reg [8:0] M_cnt; +wire [8:0] M_next = M_cnt + dl[`UART_DL3]; +wire M_toggle = M_cnt[8] ^ M_next[8]; + +always @(posedge clk ) +begin + if (rst) begin + dlc <= 0; + M_cnt <= 8'h0; + end + else if (start_dlc | ~ (|dlc)) begin + dlc <= dl - 1 + M_toggle; + M_cnt <= M_next; + end + else + dlc <= dlc - 1; +end + +always @(posedge clk ) +begin + if (rst) + enable <= 1'b0; + else if (|dl & ~(|dlc)) + enable <= 1'b1; + else + enable <= 1'b0; +end + +always @(lcr) + case (lcr[3:0]) + 4'b0000 : block_value = 95; + 4'b0100 : block_value = 103; + 4'b0001, 4'b1000 : block_value = 111; + 4'b1100 : block_value = 119; + 4'b0010, 4'b0101, 4'b1001 : block_value = 127; + 4'b0011, 4'b0110, 4'b1010, 4'b1101 : block_value = 143; + 4'b0111, 4'b1011, 4'b1110 : block_value = 159; + 4'b1111 : block_value = 175; + endcase + +always @(posedge clk ) +begin + if (rst) + block_cnt <= 8'd0; + else + if(lsr5r & fifo_write) + block_cnt <= usart_t0 ? (block_value + 8'h16) : block_value; + else + if (enable & block_cnt != 8'b0) + block_cnt <= block_cnt - 1; +end + +assign thre_set_en = ~(|block_cnt); + +assign rls_int = ier[`UART_IE_RLS] && (lsr[`UART_LS_OE] || lsr[`UART_LS_PE] || lsr[`UART_LS_FE] || lsr[`UART_LS_BI]); +assign rda_int = ier[`UART_IE_RDA] && (rf_count >= {1'b0,trigger_level}); +assign thre_int = ier[`UART_IE_THRE]&& lsr[`UART_LS_TFE]; +assign ms_int = ier[`UART_IE_MS] && (usart_t0 ? max_repeat_time : (| msr[3:0])); +assign ti_int = ier[`UART_IE_RDA] && (counter_t == 10'b0) && (|rf_count); + +reg rls_int_d; +reg thre_int_d; +reg ms_int_d; +reg ti_int_d; +reg rda_int_d; + +always @(posedge clk ) + if (rst) rls_int_d <= 0; + else rls_int_d <= rls_int; + +always @(posedge clk ) + if (rst) rda_int_d <= 0; + else rda_int_d <= rda_int; + +always @(posedge clk ) + if (rst) thre_int_d <= 0; + else thre_int_d <= thre_int; + +always @(posedge clk ) + if (rst) ms_int_d <= 0; + else ms_int_d <= ms_int; + +always @(posedge clk ) + if (rst) ti_int_d <= 0; + else ti_int_d <= ti_int; + + +wire rls_int_rise; +wire thre_int_rise; +wire ms_int_rise; +wire ti_int_rise; +wire rda_int_rise; + +assign rda_int_rise = rda_int & ~rda_int_d; +assign rls_int_rise = rls_int & ~rls_int_d; +assign thre_int_rise = thre_int & ~thre_int_d; +assign ms_int_rise = ms_int & ~ms_int_d; +assign ti_int_rise = ti_int & ~ti_int_d; + +reg rls_int_pnd; +reg rda_int_pnd; +reg thre_int_pnd; +reg ms_int_pnd; +reg ti_int_pnd; + +always @(posedge clk ) + if (rst) rls_int_pnd <= 0; + else + rls_int_pnd <= lsr_mask ? 0 : + rls_int_rise ? 1 : + rls_int_pnd && ier[`UART_IE_RLS]; + +reg d1_fifo_read; +always @( posedge clk ) d1_fifo_read <= fifo_read; + +always @(posedge clk) + if (rst) rda_int_pnd <= 0; + else rda_int_pnd <= ((rf_count == {1'b0,trigger_level}) && d1_fifo_read) ? 0 : + rda_int_rise ? 1 : + rda_int_pnd && ier[`UART_IE_RDA]; + +always @(posedge clk ) + if (rst) thre_int_pnd <= 0; + else + thre_int_pnd <= fifo_write || (iir_read & ~iir[`UART_II_IP] & iir[`UART_II_II] == `UART_II_THRE)? 0 : + thre_int_rise ? 1 : + thre_int_pnd && ier[`UART_IE_THRE]; + +always @(posedge clk ) + if (rst) ms_int_pnd <= 0; + else + ms_int_pnd <= msr_read ? 0 : ms_int_rise ? 1 : + ms_int_pnd && ier[`UART_IE_MS]; + +always @(posedge clk ) + if (rst) ti_int_pnd <= 0; + else + ti_int_pnd <= fifo_read ? 0 : ti_int_rise ? 1 : + ti_int_pnd && ier[`UART_IE_RDA]; + +always @(posedge clk ) +begin + if (rst) int_o <= 1'b0; + else int_o <= rls_int_pnd ? ~lsr_mask : + rda_int_pnd ? 1 : + ti_int_pnd ? ~fifo_read: + thre_int_pnd? !(fifo_write & iir_read) : + ms_int_pnd ? ~msr_read : + 0; +end + + +always @(posedge clk ) +begin + if (rst) + iir <= 1; + else + if (rls_int_pnd) + begin + iir[`UART_II_II] <= `UART_II_RLS; + iir[`UART_II_IP] <= 1'b0; + end else + if (rda_int_pnd) + begin + iir[`UART_II_II] <= `UART_II_RDA; + iir[`UART_II_IP] <= 1'b0; + end + else if (ti_int_pnd) + begin + iir[`UART_II_II] <= `UART_II_TI; + iir[`UART_II_IP] <= 1'b0; + end + else if (thre_int_pnd) + begin + iir[`UART_II_II] <= `UART_II_THRE; + iir[`UART_II_IP] <= 1'b0; + end + else if (ms_int_pnd) + begin + iir[`UART_II_II] <= `UART_II_MS; + iir[`UART_II_IP] <= 1'b0; + end else + begin + iir[`UART_II_II] <= 0; + iir[`UART_II_IP] <= 1'b1; + end +end + +endmodule diff --git a/resources/soc/rtl/APB_DEV/URT/uart_rfifo.v b/resources/soc/rtl/APB_DEV/URT/uart_rfifo.v new file mode 100644 index 0000000..ba5dcb9 --- /dev/null +++ b/resources/soc/rtl/APB_DEV/URT/uart_rfifo.v @@ -0,0 +1,193 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +`include "uart_defines.h" + +module uart_rfifo (clk, + wb_rst_i, data_in, data_out, + push, + pop, + overrun, + count, + error_bit, + fifo_reset, + reset_status +); + +parameter fifo_width = `UART_FIFO_WIDTH; +parameter fifo_depth = `UART_FIFO_DEPTH; +parameter fifo_pointer_w = `UART_FIFO_POINTER_W; +parameter fifo_counter_w = `UART_FIFO_COUNTER_W; + +input clk; +input wb_rst_i; +input push; +input pop; +input [fifo_width-1:0] data_in; +input fifo_reset; +input reset_status; + +output [fifo_width-1:0] data_out; +output overrun; +output [fifo_counter_w-1:0] count; +output error_bit; + +wire [fifo_width-1:0] data_out; +wire [7:0] data8_out; +reg [2:0] fifo[fifo_depth-1:0]; + +reg [fifo_pointer_w-1:0] top; +reg [fifo_pointer_w-1:0] bottom; + +reg [fifo_counter_w-1:0] count; +reg overrun; + +wire [fifo_pointer_w-1:0] top_plus_1 = top + 1'b1; + +raminfr #(fifo_pointer_w,8,fifo_depth) rfifo (.clk(clk), + .we(push), + .a(top), + .dpra(bottom), + .di(data_in[fifo_width-1:fifo_width-8]), + .dpo(data8_out) +); + +always @(posedge clk) +begin + if (wb_rst_i) + begin + top <= 0; + bottom <= 1'b0; + count <= 0; + fifo[0] <= 0; + fifo[1] <= 0; + fifo[2] <= 0; + fifo[3] <= 0; + fifo[4] <= 0; + fifo[5] <= 0; + fifo[6] <= 0; + fifo[7] <= 0; + fifo[8] <= 0; + fifo[9] <= 0; + fifo[10]<= 0; + fifo[11]<= 0; + fifo[12]<= 0; + fifo[13]<= 0; + fifo[14]<= 0; + fifo[15]<= 0; + end + else + if (fifo_reset) begin + top <= 0; + bottom <= 1'b0; + count <= 0; + fifo[0] <= 0; + fifo[1] <= 0; + fifo[2] <= 0; + fifo[3] <= 0; + fifo[4] <= 0; + fifo[5] <= 0; + fifo[6] <= 0; + fifo[7] <= 0; + fifo[8] <= 0; + fifo[9] <= 0; + fifo[10]<= 0; + fifo[11]<= 0; + fifo[12]<= 0; + fifo[13]<= 0; + fifo[14]<= 0; + fifo[15]<= 0; + end + else + begin + case ({push, pop}) + 2'b10 : if (count0) + begin + fifo[bottom] <= 0; + bottom <= bottom + 1'b1; + count <= count - 1'b1; + end + 2'b11 : begin + bottom <= bottom + 1'b1; + top <= top_plus_1; + fifo[top] <= data_in[2:0]; + end + default: ; + endcase + end +end + +always @(posedge clk) +begin + if (wb_rst_i) + overrun <= 1'b0; + else + if(fifo_reset | reset_status) + overrun <= 1'b0; + else + if(push & ~pop & (count==fifo_depth)) + overrun <= 1'b1; +end + +assign data_out = {data8_out,fifo[bottom]}; + +wire [2:0] word0 = fifo[0]; +wire [2:0] word1 = fifo[1]; +wire [2:0] word2 = fifo[2]; +wire [2:0] word3 = fifo[3]; +wire [2:0] word4 = fifo[4]; +wire [2:0] word5 = fifo[5]; +wire [2:0] word6 = fifo[6]; +wire [2:0] word7 = fifo[7]; + +wire [2:0] word8 = fifo[8]; +wire [2:0] word9 = fifo[9]; +wire [2:0] word10 = fifo[10]; +wire [2:0] word11 = fifo[11]; +wire [2:0] word12 = fifo[12]; +wire [2:0] word13 = fifo[13]; +wire [2:0] word14 = fifo[14]; +wire [2:0] word15 = fifo[15]; + +assign error_bit = |(word0[2:0] | word1[2:0] | word2[2:0] | word3[2:0] | + word4[2:0] | word5[2:0] | word6[2:0] | word7[2:0] | + word8[2:0] | word9[2:0] | word10[2:0] | word11[2:0] | + word12[2:0] | word13[2:0] | word14[2:0] | word15[2:0] ); + +endmodule diff --git a/resources/soc/rtl/APB_DEV/URT/uart_sync_flops.v b/resources/soc/rtl/APB_DEV/URT/uart_sync_flops.v new file mode 100644 index 0000000..12d87b6 --- /dev/null +++ b/resources/soc/rtl/APB_DEV/URT/uart_sync_flops.v @@ -0,0 +1,76 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module uart_sync_flops +( + rst_i, + clk_i, + stage1_rst_i, + stage1_clk_en_i, + async_dat_i, + sync_dat_o +); + +parameter Tp = 1; +parameter width = 1; +parameter init_value = 1'b0; + +input rst_i; +input clk_i; +input stage1_rst_i; +input stage1_clk_en_i; +input [width-1:0] async_dat_i; +output [width-1:0] sync_dat_o; + +reg [width-1:0] sync_dat_o; +reg [width-1:0] flop_0; + +always @ (posedge clk_i) +begin + if (rst_i) + flop_0 <= {width{init_value}}; + else + flop_0 <= async_dat_i; +end + +always @ (posedge clk_i) +begin + if (rst_i) + sync_dat_o <= {width{init_value}}; + else if (stage1_rst_i) + sync_dat_o <= {width{init_value}}; + else if (stage1_clk_en_i) + sync_dat_o <= flop_0; +end + +endmodule diff --git a/resources/soc/rtl/APB_DEV/URT/uart_tfifo.v b/resources/soc/rtl/APB_DEV/URT/uart_tfifo.v new file mode 100644 index 0000000..ce658a7 --- /dev/null +++ b/resources/soc/rtl/APB_DEV/URT/uart_tfifo.v @@ -0,0 +1,129 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +`include "uart_defines.h" + +module uart_tfifo (clk, + wb_rst_i, data_in, data_out, + push, + pop, + overrun, + count, + fifo_reset, + reset_status +); + +parameter fifo_width = `UART_FIFO_WIDTH; +parameter fifo_depth = `UART_FIFO_DEPTH; +parameter fifo_pointer_w = `UART_FIFO_POINTER_W; +parameter fifo_counter_w = `UART_FIFO_COUNTER_W; + +input clk; +input wb_rst_i; +input push; +input pop; +input [fifo_width-1:0] data_in; +input fifo_reset; +input reset_status; + +output [fifo_width-1:0] data_out; +output overrun; +output [fifo_counter_w-1:0] count; + +wire [fifo_width-1:0] data_out; + +reg [fifo_pointer_w-1:0] top; +reg [fifo_pointer_w-1:0] bottom; + +reg [fifo_counter_w-1:0] count; +reg overrun; +wire [fifo_pointer_w-1:0] top_plus_1 = top + 1'b1; + +raminfr #(fifo_pointer_w,fifo_width,fifo_depth) tfifo (.clk(clk), + .we(push), + .a(top), + .dpra(bottom), + .di(data_in), + .dpo(data_out) +); + + +always @(posedge clk) +begin + if (wb_rst_i) + begin + top <= 0; + bottom <= 1'b0; + count <= 0; + end + else + if (fifo_reset) begin + top <= 0; + bottom <= 1'b0; + count <= 0; + end + else + begin + case ({push, pop}) + 2'b10 : if (count0) + begin + bottom <= bottom + 1'b1; + count <= count - 1'b1; + end + 2'b11 : begin + bottom <= bottom + 1'b1; + top <= top_plus_1; + end + default: ; + endcase + end +end + +always @(posedge clk) +begin + if (wb_rst_i) + overrun <= 1'b0; + else + if(fifo_reset | reset_status) + overrun <= 1'b0; + else + if(push & (count==fifo_depth)) + overrun <= 1'b1; +end + +endmodule diff --git a/resources/soc/rtl/APB_DEV/URT/uart_top.v b/resources/soc/rtl/APB_DEV/URT/uart_top.v new file mode 100644 index 0000000..2d1237f --- /dev/null +++ b/resources/soc/rtl/APB_DEV/URT/uart_top.v @@ -0,0 +1,107 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +`include "uart_defines.h" + +module UART_TOP( + PCLK, PRST_, + PSEL, PENABLE, PADDR, PWRITE, + PWDATA, URT_PRDATA, + + INT, clk_carrier, + + TXD_i, TXD_o, TXD_oe, + RXD_i, RXD_o, RXD_oe, + + RTS, CTS, DSR, + DCD, DTR, RI + ); + +input PCLK, PRST_; +input PSEL, PENABLE, PWRITE; +input [7:0] PADDR; +input [7:0] PWDATA; +output [7:0] URT_PRDATA; + +output INT; +input clk_carrier; + +input TXD_i; +output TXD_o; +output TXD_oe; +input RXD_i; +output RXD_o; +output RXD_oe; + +output RTS; +input CTS, DSR, DCD; +output DTR; +input RI; + +wire prst = !PRST_; +wire we = PSEL & PENABLE & PWRITE; +wire re = PSEL & PENABLE & !PWRITE; + +wire rx_en; +wire tx2rx_en; +wire isomode; + +assign TXD_oe = isomode&&(rx_en||tx2rx_en) ? 1'b1:1'b0; +assign RXD_oe =~isomode; + +uart_regs regs( + .clk (PCLK ), + .rst (prst ), + .clk_carrier (clk_carrier), + .addr (PADDR[2:0] ), + .dat_i (PWDATA ), + .dat_o (URT_PRDATA ), + .we (we ), + .re (re ), + + .modem_inputs({ CTS, DSR, RI, DCD } ), + .rts_pad_o (RTS ), + .dtr_pad_o (DTR ), + .stx_pad_o (TXD_o ), + .TXD_i (TXD_i ), + .srx_pad_i (RXD_i ), + .RXD_o (RXD_o ), + .int_o ( INT ), + .tx2rx_en (tx2rx_en ), + .rx_en (rx_en ), + .usart_mode (isomode ) + +); + + +endmodule diff --git a/resources/soc/rtl/APB_DEV/URT/uart_transmitter.v b/resources/soc/rtl/APB_DEV/URT/uart_transmitter.v new file mode 100644 index 0000000..000cc4b --- /dev/null +++ b/resources/soc/rtl/APB_DEV/URT/uart_transmitter.v @@ -0,0 +1,281 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +`include "uart_defines.h" + +module uart_transmitter (clk, wb_rst_i, lcr, tf_push, wb_dat_i, + enable,stx_pad_o, tstate, tf_count, tx_reset, lsr_mask, + usart_t0,srx_pad_i,repeat_time,max_repeat_time,current_finish, + usart_mode,tx2rx_en); + +input clk; +input wb_rst_i; +input [7:0] lcr; +input tf_push; +input [7:0] wb_dat_i; +input enable; +input tx_reset; +input lsr_mask; +input usart_mode; +input usart_t0,srx_pad_i; +input [2:0] repeat_time; +output current_finish; +output max_repeat_time; + +output tx2rx_en; +reg tx2rx_en; +output stx_pad_o; +output [2:0] tstate; +output [`UART_FIFO_COUNTER_W-1:0] tf_count; + +reg [2:0] tstate; +reg [4:0] counter; +reg [2:0] bit_counter; +reg [6:0] shift_out; +reg stx_o_tmp; +reg parity_xor; +reg tf_pop; +reg bit_out; +reg tx_error; +reg [2:0] error_time; + +wire [`UART_FIFO_WIDTH-1:0] tf_data_in; +wire [`UART_FIFO_WIDTH-1:0] tf_data_out; +wire tf_push; +wire tf_overrun; +wire [`UART_FIFO_COUNTER_W-1:0]tf_count; + +assign tf_data_in = wb_dat_i; + +uart_tfifo fifo_tx( + .clk ( clk ), + .wb_rst_i( wb_rst_i ), + .data_in ( tf_data_in ), + .data_out( tf_data_out ), + .push ( tf_push ), + .pop ( tf_pop ), + .overrun ( tf_overrun ), + .count ( tf_count ), + .fifo_reset ( tx_reset), + .reset_status(lsr_mask ) +); + +parameter s_idle = 3'd0; +parameter s_send_start = 3'd1; +parameter s_send_byte = 3'd2; +parameter s_send_parity = 3'd3; +parameter s_send_stop = 3'd4; +parameter s_pop_byte = 3'd5; +parameter s_send_guard1 = 3'd6; +reg [7:0]tf_data_bak; + +wire max_repeat_time = (error_time==(repeat_time+1'b1)) & usart_mode & usart_t0; + +always @(posedge clk ) +begin + if (wb_rst_i) + begin + tx_error <= 1'b0; + error_time <= 3'b0; + tstate <= s_idle; + stx_o_tmp <= 1'b1; + counter <= 5'b0; + shift_out <= 7'b0; + bit_out <= 1'b0; + parity_xor <= 1'b0; + tf_pop <= 1'b0; + bit_counter <= 3'b0; + tx2rx_en <= 1'b0; + tf_data_bak <= 8'h0; + end + else + if (enable) + begin + case (tstate) + s_idle :if ((~|tf_count)&(error_time==(repeat_time+1'b1)||~tx_error||~usart_mode)) + begin + tstate <= s_idle; + stx_o_tmp <= 1'b1; + tx_error <= 1'b0; + end + else begin + tf_pop <= 1'b0; + stx_o_tmp <= 1'b1; + tstate <= s_pop_byte; + end + s_pop_byte : begin + + if(tx_error&(error_time !=(repeat_time+1'b1))) + begin + tf_pop <= 1'b0; + case (lcr[1:0]) + 2'b00 : begin + bit_counter <= 3'b100; + parity_xor <= ^tf_data_bak[4:0]; + end + 2'b01 : begin + bit_counter <= 3'b101; + parity_xor <= ^tf_data_bak[5:0]; + end + 2'b10 : begin + bit_counter <= 3'b110; + parity_xor <= ^tf_data_bak[6:0]; + end + 2'b11 : begin + bit_counter <= 3'b111; + parity_xor <= ^tf_data_bak[7:0]; + end + endcase + {shift_out[6:0], bit_out} <= tf_data_bak; + end + else begin + tf_pop <= 1'b1; + error_time <= 3'h0; + case (lcr[1:0]) + 2'b00 : begin + bit_counter <= 3'b100; + parity_xor <= ^tf_data_out[4:0]; + end + 2'b01 : begin + bit_counter <= 3'b101; + parity_xor <= ^tf_data_out[5:0]; + end + 2'b10 : begin + bit_counter <= 3'b110; + parity_xor <= ^tf_data_out[6:0]; + end + 2'b11 : begin + bit_counter <= 3'b111; + parity_xor <= ^tf_data_out[7:0]; + end + endcase + {shift_out[6:0], bit_out} <= tf_data_out; + tf_data_bak <= tf_data_out; + end + tstate <= s_send_start; + end + s_send_start : begin + tf_pop <= 1'b0; + if (~|counter) + counter <= 5'b01111; + else if (counter == 5'b00001) + begin + counter <= 0; + tstate <= s_send_byte; + end + else + counter <= counter - 1'b1; + stx_o_tmp <= 1'b0; + end + s_send_byte : begin + if (~|counter) + counter <= 5'b01111; + else if (counter == 5'b00001) + begin + if (bit_counter > 3'b0) begin + bit_counter <= bit_counter - 1'b1; + {shift_out[5:0],bit_out } <= {shift_out[6:1], shift_out[0]}; + tstate <= s_send_byte; + end + else + if (~lcr[`UART_LC_PE]) begin + tstate <= s_send_stop; + end + else begin + case ({lcr[`UART_LC_EP],lcr[`UART_LC_SP]}) + 2'b00: bit_out <= ~parity_xor; + 2'b01: bit_out <= 1'b1; + 2'b10: bit_out <= parity_xor; + 2'b11: bit_out <= 1'b0; + endcase + tstate <= s_send_parity; + end + counter <= 0; + end + else counter <= counter - 1'b1; + stx_o_tmp <= bit_out; + end + s_send_parity : begin + if (~|counter) counter <= 5'b01111; + else if (counter == 5'b00001) begin + counter <= 4'b0; + tstate <= usart_mode ? s_send_guard1 : s_send_stop; + end + else counter <= counter - 1'b1; + stx_o_tmp <= bit_out; + end + s_send_stop : begin + if (~|counter) begin + if(usart_t0) + counter <= tx_error ? 5'b11101 : 5'b01101; + else + casex ({lcr[`UART_LC_SB],lcr[`UART_LC_BITS]}) + 3'b0xx: counter <= 5'b01101; + 3'b100: counter <= 5'b10101; + default: counter <= 5'b11101; + endcase + end + else if (counter == 5'b00001) begin + counter <= 5'b0; + tx2rx_en<= 1'b0; + tstate <= s_idle; + end + else counter <= counter - 1'b1; + stx_o_tmp <= 1'b1; + end + s_send_guard1:begin + if (~|counter) begin + tx2rx_en <= 1'b1; + counter <= usart_t0 ? 5'b01111:5'b01101; + end + else if (counter == 5'b00001) begin + counter <= 5'b0; + tx_error <= !srx_pad_i; + error_time<= error_time + !srx_pad_i; + tx2rx_en <= usart_t0 ? 1'b1 : 1'b0; + tstate <= usart_t0 ? s_send_stop : s_idle; + end + else counter <= counter - 1'b1; + stx_o_tmp <= 1'b1; + end + default : + tstate <= s_idle; + endcase + end + else tf_pop <= 1'b0; +end + +assign stx_pad_o = lcr[`UART_LC_BC] ? 1'b0 : stx_o_tmp; +assign current_finish = usart_mode ? ( (tstate==3'b0)&(tx_error & (error_time ==repeat_time+1'b1) |~tx_error) ) : 1'b1; + +endmodule diff --git a/resources/soc/rtl/APB_DEV/apb_dev_top.v b/resources/soc/rtl/APB_DEV/apb_dev_top.v new file mode 100644 index 0000000..213f014 --- /dev/null +++ b/resources/soc/rtl/APB_DEV/apb_dev_top.v @@ -0,0 +1,416 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +`include "config.h" + +module axi2apb_misc +( +clk, +rst_n, + +axi_s_awid, +axi_s_awaddr, +axi_s_awlen, +axi_s_awsize, +axi_s_awburst, +axi_s_awlock, +axi_s_awcache, +axi_s_awprot, +axi_s_awvalid, +axi_s_awready, +axi_s_wid, +axi_s_wdata, +axi_s_wstrb, +axi_s_wlast, +axi_s_wvalid, +axi_s_wready, +axi_s_bid, +axi_s_bresp, +axi_s_bvalid, +axi_s_bready, +axi_s_arid, +axi_s_araddr, +axi_s_arlen, +axi_s_arsize, +axi_s_arburst, +axi_s_arlock, +axi_s_arcache, +axi_s_arprot, +axi_s_arvalid, +axi_s_arready, +axi_s_rid, +axi_s_rdata, +axi_s_rresp, +axi_s_rlast, +axi_s_rvalid, +axi_s_rready, + +apb_rw_dma, +apb_psel_dma, +apb_enab_dma, +apb_addr_dma, +apb_valid_dma, +apb_wdata_dma, +apb_rdata_dma, +apb_ready_dma, +dma_grant, + +dma_req_o, +dma_ack_i, + +uart0_txd_i, +uart0_txd_o, +uart0_txd_oe, +uart0_rxd_i, +uart0_rxd_o, +uart0_rxd_oe, +uart0_rts_o, +uart0_dtr_o, +uart0_cts_i, +uart0_dsr_i, +uart0_dcd_i, +uart0_ri_i, + +uart0_int, +nand_int, + +nand_type, +nand_cle , +nand_ale , +nand_rdy , +nand_rd , +nand_ce, +nand_wr , +nand_dat_i , +nand_dat_o , +nand_dat_oe +); + +parameter ADDR_APB = 20, + DATA_APB = 8, + L_ADDR = 64, + L_ID = 8, + L_DATA = 128, + L_MASK = 16; + +input clk; +input rst_n; + +input [`LID -1 :0] axi_s_awid; +input [`Lawaddr -1 :0] axi_s_awaddr; +input [`Lawlen -1 :0] axi_s_awlen; +input [`Lawsize -1 :0] axi_s_awsize; +input [`Lawburst -1 :0] axi_s_awburst; +input [`Lawlock -1 :0] axi_s_awlock; +input [`Lawcache -1 :0] axi_s_awcache; +input [`Lawprot -1 :0] axi_s_awprot; +input axi_s_awvalid; +output axi_s_awready; +input [`LID -1 :0] axi_s_wid; +input [`Lwdata -1 :0] axi_s_wdata; +input [`Lwstrb -1 :0] axi_s_wstrb; +input axi_s_wlast; +input axi_s_wvalid; +output axi_s_wready; +output [`LID -1 :0] axi_s_bid; +output [`Lbresp -1 :0] axi_s_bresp; +output axi_s_bvalid; +input axi_s_bready; +input [`LID -1 :0] axi_s_arid; +input [`Laraddr -1 :0] axi_s_araddr; +input [`Larlen -1 :0] axi_s_arlen; +input [`Larsize -1 :0] axi_s_arsize; +input [`Larburst -1 :0] axi_s_arburst; +input [`Larlock -1 :0] axi_s_arlock; +input [`Larcache -1 :0] axi_s_arcache; +input [`Larprot -1 :0] axi_s_arprot; +input axi_s_arvalid; +output axi_s_arready; +output [`LID -1 :0] axi_s_rid; +output [`Lrdata -1 :0] axi_s_rdata; +output [`Lrresp -1 :0] axi_s_rresp; +output axi_s_rlast; +output axi_s_rvalid; +input axi_s_rready; + +output apb_ready_dma; +input apb_rw_dma; +input apb_psel_dma; +input apb_enab_dma; +input [ADDR_APB-1:0] apb_addr_dma; +input [31:0] apb_wdata_dma; +output[31:0] apb_rdata_dma; +input apb_valid_dma; +output dma_grant; + +output dma_req_o; +input dma_ack_i; + +input uart0_txd_i; +output uart0_txd_o; +output uart0_txd_oe; +input uart0_rxd_i; +output uart0_rxd_o; +output uart0_rxd_oe; +output uart0_rts_o; +output uart0_dtr_o; +input uart0_cts_i; +input uart0_dsr_i; +input uart0_dcd_i; +input uart0_ri_i; + +input [3:0]nand_rdy; +output [3:0]nand_ce; +output nand_cle; +output nand_ale; +output nand_rd; +output nand_wr; +output nand_dat_oe; +input [7:0]nand_dat_i ; +output [7:0]nand_dat_o ; + +output uart0_int; +output nand_int; +input [1:0]nand_type; + +wire nand_dma_req_o; +assign dma_req_o = nand_dma_req_o; +assign nand_dma_ack_i = dma_ack_i; + +wire apb_ready_cpu; +wire apb_rw_cpu; +wire apb_psel_cpu; +wire apb_enab_cpu; +wire [ADDR_APB-1 :0] apb_addr_cpu; +wire [DATA_APB-1:0] apb_datai_cpu; +wire [DATA_APB-1:0] apb_datao_cpu; +wire apb_clk_cpu; +wire apb_reset_n_cpu; +wire apb_word_trans_cpu; +wire apb_valid_cpu; +wire dma_grant; +wire [23:0] apb_high_24b_rd; +wire [23:0] apb_high_24b_wr; + +wire apb_rw_dma; +wire apb_psel_dma; +wire apb_enab_dma; +wire [31:0] apb_wdata_dma; +wire [31:0] apb_rdata_dma; +wire apb_clk_dma; +wire apb_reset_n_dma; + +wire apb_uart0_req; +wire apb_uart0_ack; +wire apb_uart0_rw; +wire apb_uart0_enab; +wire apb_uart0_psel; +wire [ADDR_APB -1:0] apb_uart0_addr; +wire [DATA_APB -1:0] apb_uart0_datai; +wire [DATA_APB -1:0] apb_uart0_datao; + +wire apb_nand_req; +wire apb_nand_ack; +wire apb_nand_rw; +wire apb_nand_enab; +wire apb_nand_psel; +wire [ADDR_APB -1:0] apb_nand_addr; +wire [31:0] apb_nand_datai; +wire [31:0] apb_nand_datao; + +axi2apb_bridge AA_axi2apb_bridge_cpu +( +.clk (clk ), +.rst_n (rst_n ), +.axi_s_awid (axi_s_awid ), +.axi_s_awaddr (axi_s_awaddr ), +.axi_s_awlen (axi_s_awlen ), +.axi_s_awsize (axi_s_awsize ), +.axi_s_awburst (axi_s_awburst ), +.axi_s_awlock (axi_s_awlock ), +.axi_s_awcache (axi_s_awcache ), +.axi_s_awprot (axi_s_awprot ), +.axi_s_awvalid (axi_s_awvalid ), +.axi_s_awready (axi_s_awready ), +.axi_s_wid (axi_s_wid ), +.axi_s_wdata (axi_s_wdata ), +.axi_s_wstrb (axi_s_wstrb ), +.axi_s_wlast (axi_s_wlast ), +.axi_s_wvalid (axi_s_wvalid ), +.axi_s_wready (axi_s_wready ), +.axi_s_bid (axi_s_bid ), +.axi_s_bresp (axi_s_bresp ), +.axi_s_bvalid (axi_s_bvalid ), +.axi_s_bready (axi_s_bready ), +.axi_s_arid (axi_s_arid ), +.axi_s_araddr (axi_s_araddr ), +.axi_s_arlen (axi_s_arlen ), +.axi_s_arsize (axi_s_arsize ), +.axi_s_arburst (axi_s_arburst ), +.axi_s_arlock (axi_s_arlock ), +.axi_s_arcache (axi_s_arcache ), +.axi_s_arprot (axi_s_arprot ), +.axi_s_arvalid (axi_s_arvalid ), +.axi_s_arready (axi_s_arready ), +.axi_s_rid (axi_s_rid ), +.axi_s_rdata (axi_s_rdata ), +.axi_s_rresp (axi_s_rresp ), +.axi_s_rlast (axi_s_rlast ), +.axi_s_rvalid (axi_s_rvalid ), +.axi_s_rready (axi_s_rready ), + +.apb_word_trans (apb_word_trans_cpu ), +.apb_high_24b_rd (apb_high_24b_rd ), +.apb_high_24b_wr (apb_high_24b_wr ), +.apb_valid_cpu (apb_valid_cpu ), +.cpu_grant (~dma_grant ), + +.apb_clk (apb_clk_cpu ), +.apb_reset_n (apb_reset_n_cpu ), +.reg_psel (apb_psel_cpu ), +.reg_enable (apb_enab_cpu ), +.reg_rw (apb_rw_cpu ), +.reg_addr (apb_addr_cpu ), +.reg_datai (apb_datai_cpu ), +.reg_datao (apb_datao_cpu ), +.reg_ready_1 (apb_ready_cpu ) +); + +apb_mux2 AA_apb_mux16 +( +.clk (clk ), +.rst_n (rst_n ), +.apb_ready_dma (apb_ready_dma ), +.apb_rw_dma (apb_rw_dma ), +.apb_addr_dma (apb_addr_dma ), +.apb_psel_dma (apb_psel_dma ), +.apb_enab_dma (apb_enab_dma ), +.apb_wdata_dma (apb_wdata_dma ), +.apb_rdata_dma (apb_rdata_dma ), +.apb_valid_dma (apb_valid_dma ), +.apb_valid_cpu (apb_valid_cpu ), +.dma_grant (dma_grant ), + +.apb_ack_cpu (apb_ready_cpu ), +.apb_rw_cpu (apb_rw_cpu ), +.apb_addr_cpu (apb_addr_cpu ), +.apb_psel_cpu (apb_psel_cpu ), +.apb_enab_cpu (apb_enab_cpu ), +.apb_datai_cpu (apb_datai_cpu ), +.apb_datao_cpu (apb_datao_cpu ), +.apb_high_24b_rd (apb_high_24b_rd), +.apb_high_24b_wr (apb_high_24b_wr), +.apb_word_trans_cpu (apb_word_trans_cpu ), + +.apb0_req (apb_uart0_req ), +.apb0_ack (apb_uart0_ack ), +.apb0_rw (apb_uart0_rw ), +.apb0_psel (apb_uart0_psel ), +.apb0_enab (apb_uart0_enab ), +.apb0_addr (apb_uart0_addr ), +.apb0_datai (apb_uart0_datai ), +.apb0_datao (apb_uart0_datao ), + +.apb1_req (apb_nand_req ), +.apb1_ack (apb_nand_ack ), +.apb1_rw (apb_nand_rw ), +.apb1_enab (apb_nand_enab ), +.apb1_psel (apb_nand_psel ), +.apb1_addr (apb_nand_addr ), +.apb1_datai (apb_nand_datai ), +.apb1_datao (apb_nand_datao ) + +); + +//uart0 +assign apb_uart0_ack = apb_uart0_enab; +UART_TOP uart0 +( +.PCLK (clk ), +.clk_carrier (1'b0 ), +.PRST_ (rst_n ), +.PSEL (apb_uart0_psel ), +.PENABLE (apb_uart0_enab ), +.PADDR (apb_uart0_addr[7:0] ), +.PWRITE (apb_uart0_rw ), +.PWDATA (apb_uart0_datai ), +.URT_PRDATA (apb_uart0_datao ), +.INT (uart0_int ), +.TXD_o (uart0_txd_o ), +.TXD_i (uart0_txd_i ), +.TXD_oe (uart0_txd_oe ), +.RXD_o (uart0_rxd_o ), +.RXD_i (uart0_rxd_i ), +.RXD_oe (uart0_rxd_oe ), +.RTS (uart0_rts_o ), +.CTS (uart0_cts_i ), +.DSR (uart0_dsr_i ), +.DCD (uart0_dcd_i ), +.DTR (uart0_dtr_o ), +.RI (uart0_ri_i ) +); + +//NAND +nand_module nand_module +( +.nand_type (nand_type ), + +.clk (clk ), +.rst_n (rst_n ), + +.apb_psel (apb_nand_psel ), +.apb_enab (apb_nand_enab ), +.apb_rw (apb_nand_rw ), +.apb_addr (apb_nand_addr ), +.apb_datai (apb_nand_datai ), +.apb_datao (apb_nand_datao ), +.apb_ack (apb_nand_ack ), + +.nand_dma_req_o (nand_dma_req_o ), +.nand_dma_ack_i (nand_dma_ack_i ), + +.nand_ce (nand_ce ), +.nand_dat_i (nand_dat_i ), +.nand_dat_o (nand_dat_o ), +.nand_dat_oe (nand_dat_oe ), +.nand_ale (nand_ale ), +.nand_cle (nand_cle ), +.nand_wr (nand_wr ), +.nand_rd (nand_rd ), +.nand_rdy (nand_rdy ), +.nand_int (nand_int ) +); + +endmodule + + diff --git a/resources/soc/rtl/APB_DEV/apb_mux2.v b/resources/soc/rtl/APB_DEV/apb_mux2.v new file mode 100644 index 0000000..38ce4dd --- /dev/null +++ b/resources/soc/rtl/APB_DEV/apb_mux2.v @@ -0,0 +1,203 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +`define APB_DEV0 6'h10 +`define APB_DEV1 6'h1e +module apb_mux2 ( +clk, +rst_n, +apb_ack_cpu, +apb_rw_cpu, +apb_psel_cpu, +apb_enab_cpu, +apb_addr_cpu, +apb_datai_cpu, +apb_datao_cpu, +apb_high_24b_rd, +apb_high_24b_wr, +apb_word_trans_cpu, + +apb_ready_dma, +apb_rw_dma, +apb_psel_dma, +apb_enab_dma, +apb_addr_dma, +apb_wdata_dma, +apb_rdata_dma, +apb_valid_dma, +apb_valid_cpu, +dma_grant, + +apb0_req, +apb0_ack, +apb0_rw, +apb0_psel, +apb0_enab, +apb0_addr, +apb0_datai, +apb0_datao, + +apb1_req, +apb1_ack, +apb1_rw, +apb1_psel, +apb1_enab, +apb1_addr, +apb1_datai, +apb1_datao +); + +parameter ADDR_APB = 20, + DATA_APB = 8, + DATA_APB_32 = 32; +input clk,rst_n; +output apb_ready_dma; +input apb_rw_dma; +input apb_psel_dma; +input apb_enab_dma; +input [ADDR_APB-1:0] apb_addr_dma; +input [31:0] apb_wdata_dma; +output[31:0] apb_rdata_dma; +output dma_grant; +input apb_valid_dma; +input apb_valid_cpu; + +output apb_ack_cpu; +input apb_rw_cpu; +input apb_psel_cpu; +input apb_enab_cpu; +input [ADDR_APB-1:0] apb_addr_cpu; +input [DATA_APB-1:0] apb_datai_cpu; +output[DATA_APB-1:0] apb_datao_cpu; +output [23:0] apb_high_24b_rd; +input [23:0] apb_high_24b_wr; + +output apb_word_trans_cpu; +output apb0_req; +input apb0_ack; +output apb0_rw; +output apb0_psel; +output apb0_enab; +output[ADDR_APB-1:0] apb0_addr; +output[DATA_APB-1:0] apb0_datai; +input [DATA_APB-1:0] apb0_datao; + +output apb1_req; +input apb1_ack; +output apb1_rw; +output apb1_psel; +output apb1_enab; +output[ADDR_APB-1:0] apb1_addr; +output[31:0] apb1_datai; +input [31:0] apb1_datao; + +wire apb_ack; +wire apb_rw; +wire apb_psel; +wire apb_enab; +wire [ADDR_APB-1:0] apb_addr; +wire [DATA_APB-1:0] apb_datai; +wire [23:0]high_24b_wr; +wire [23:0]high_24b_rd; +wire [7:0]apb_datao ; +wire dma_grant; + +arb_2_1 arb_2_1(.clk(clk), .rst_n(rst_n), .valid0(apb_valid_cpu), .valid1(apb_valid_dma), .dma_grant(dma_grant)); + +assign apb_addr = dma_grant ? apb_addr_dma:apb_addr_cpu; +assign apb_rw = dma_grant ? apb_rw_dma:apb_rw_cpu; +assign apb_psel = dma_grant ? apb_psel_dma:apb_psel_cpu; +assign apb_enab = dma_grant ? apb_enab_dma:apb_enab_cpu; +assign apb_datai = dma_grant ? apb_wdata_dma[7:0]:apb_datai_cpu; +assign high_24b_wr = dma_grant ? apb_wdata_dma[31:8]:apb_high_24b_wr; +assign high_24b_rd = apb1_req ? apb1_datao[31:8] : 24'h0; + +assign apb_word_trans_cpu = dma_grant ? 1'h0: apb1_req; + +assign apb_high_24b_rd = dma_grant ? 24'h0: high_24b_rd; +assign apb_datao_cpu = dma_grant ? 8'h0: apb_datao; +assign apb_rdata_dma = dma_grant ? {high_24b_rd,apb_datao }:32'h0; +assign apb_ack_cpu = ~dma_grant & apb_ack; +assign apb_ready_dma = dma_grant & apb_ack; + +assign apb0_req = (apb_addr[ADDR_APB-1:14] ==`APB_DEV0); +assign apb1_req = (apb_addr[ADDR_APB-1:14] ==`APB_DEV1); + +assign apb0_psel = apb_psel && apb0_req ; +assign apb1_psel = apb_psel && apb1_req; + +assign apb0_enab = apb_enab && apb0_req ; +assign apb1_enab = apb_enab && apb1_req; + +assign apb_ack = apb0_req ? apb0_ack : + apb1_req ? apb1_ack : + 1'b0; + +assign apb_datao = apb0_req ? apb0_datao : + apb1_req ? apb1_datao[7:0] : + 8'b0; + + + +assign apb0_addr = apb_addr; +assign apb0_datai = apb_datai; +assign apb0_rw = apb_rw; + +assign apb1_addr = apb_addr; +assign apb1_datai = {high_24b_wr,apb_datai}; +assign apb1_rw = apb_rw; + +endmodule + +module arb_2_1( clk, rst_n, valid0, valid1, dma_grant); +input clk; +input rst_n; +input valid0; +input valid1; +output dma_grant; +reg dma_grant; + +always @(posedge clk) + if(~rst_n) + dma_grant<= 1'b0; + else if(valid0&&~valid1) + dma_grant<= 1'b0; + else if(valid1&&~valid0) + dma_grant<= 1'b1; + else if(valid0&&valid1&&~dma_grant) + dma_grant<= 1'b0; + else if(valid0&&valid1&&dma_grant) + dma_grant<= 1'b1; + else dma_grant<= 1'b0; + +endmodule diff --git a/resources/soc/rtl/APB_DEV/nand_module.v b/resources/soc/rtl/APB_DEV/nand_module.v new file mode 100644 index 0000000..be6cc5d --- /dev/null +++ b/resources/soc/rtl/APB_DEV/nand_module.v @@ -0,0 +1,140 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module nand_module +( +nand_type , + +clk, +rst_n, + +apb_psel, +apb_enab, +apb_rw, +apb_addr, +apb_datai, +apb_datao, +apb_ack, + +nand_dma_req_o, +nand_dma_ack_i, + +nand_ce , +nand_dat_i , +nand_dat_o , +nand_dat_oe, +nand_ale , +nand_cle , +nand_wr , +nand_rd , +nand_rdy , + +nand_int + +); +input [1:0]nand_type; +input clk; +input rst_n; +input apb_psel; +input apb_enab; +input apb_rw; +input [19:0] apb_addr; +input [31:0] apb_datai; +output[31:0] apb_datao; +output apb_ack; + +output nand_dma_req_o; +input nand_dma_ack_i; + +output [3:0] nand_ce; +input [7:0] nand_dat_i ; +output [7:0] nand_dat_o ; +output nand_dat_oe; +output nand_ale; +output nand_cle; +output nand_wr; +output nand_rd; +input [3:0] nand_rdy; +output nand_int; + +wire psel; +wire penable; +wire [10:0] paddr; +wire pwr; +assign apb_ack = apb_enab; +assign psel = apb_psel; +assign penable = apb_enab; +assign paddr = apb_addr[10:0]; +assign pwr = apb_rw; + +reg [3:0] nand_iordy_r0; +reg [3:0] nand_iordy_r1; +always @(posedge clk) begin + nand_iordy_r0 <= nand_rdy; + nand_iordy_r1 <= nand_iordy_r0; +end +reg [1:0] nand_type_r1; +reg [1:0] nand_type_r2; + +always @(posedge clk) +if(~rst_n)begin + nand_type_r1 <= nand_type; + nand_type_r2 <= nand_type_r1; +end + +NAND_top NAND +( +.nand_type (nand_type_r2 ), +.pclk (clk ), +.prst_ (rst_n ), +.psel (psel ), +.penable (penable ), +.pwrite (pwr ), +.ADDR (paddr ), +.DAT_I (apb_datai ), +.DAT_O (apb_datao ), + +.NAND_CE_o (nand_ce ), +.NAND_REQ (nand_dma_req_o ), +.NAND_I (nand_dat_i ), +.NAND_O (nand_dat_o ), +.NAND_EN_ (nand_dat_oe ), +.NAND_ALE (nand_ale ), +.NAND_CLE (nand_cle ), +.NAND_RD_ (nand_rd ), +.NAND_WR_ (nand_wr ), +.NAND_IORDY_i (nand_iordy_r1 ), + +.nand_int (nand_int ) +); +endmodule diff --git a/resources/soc/rtl/CONFREG/confreg.v b/resources/soc/rtl/CONFREG/confreg.v new file mode 100644 index 0000000..5b2745a --- /dev/null +++ b/resources/soc/rtl/CONFREG/confreg.v @@ -0,0 +1,695 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +`define ORDER_REG_ADDR 16'h1160 //32'hbfd0_1160 +`define LED_ADDR 16'hf000 //32'hbfd0_f000 +`define LED_RG0_ADDR 16'hf004 //32'hbfd0_f004 +`define LED_RG1_ADDR 16'hf008 //32'hbfd0_f008 +`define NUM_ADDR 16'hf010 //32'hbfd0_f010 +`define SWITCH_ADDR 16'hf020 //32'hbfd0_f020 +`define BTN_KEY_ADDR 16'hf024 //32'hbfd0_f024 +`define BTN_STEP_ADDR 16'hf028 //32'hbfd0_f028 +`define TIMER_ADDR 16'he000 //32'hbfd0_e000 +module confreg( + aclk, + aresetn, + + s_awid, + s_awaddr, + s_awlen, + s_awsize, + s_awburst, + s_awlock, + s_awcache, + s_awprot, + s_awvalid, + s_awready, + s_wid, + s_wdata, + s_wstrb, + s_wlast, + s_wvalid, + s_wready, + s_bid, + s_bresp, + s_bvalid, + s_bready, + s_arid, + s_araddr, + s_arlen, + s_arsize, + s_arburst, + s_arlock, + s_arcache, + s_arprot, + s_arvalid, + s_arready, + s_rid, + s_rdata, + s_rresp, + s_rlast, + s_rvalid, + s_rready, + + order_addr_reg, + finish_read_order, + write_dma_end, + + cr00, + cr01, + cr02, + cr03, + cr04, + cr05, + cr06, + cr07, + + led, + led_rg0, + led_rg1, + num_csn, + num_a_g, + switch, + btn_key_col, + btn_key_row, + btn_step +); + input aclk; + input aresetn; + + input [3 :0] s_awid; + input [31:0] s_awaddr; + input [7 :0] s_awlen; + input [2 :0] s_awsize; + input [1 :0] s_awburst; + input s_awlock; + input [3 :0] s_awcache; + input [2 :0] s_awprot; + input s_awvalid; + output s_awready; + input [3 :0] s_wid; + input [31:0] s_wdata; + input [3 :0] s_wstrb; + input s_wlast; + input s_wvalid; + output s_wready; + output [3 :0] s_bid; + output [1 :0] s_bresp; + output s_bvalid; + input s_bready; + input [3 :0] s_arid; + input [31:0] s_araddr; + input [7 :0] s_arlen; + input [2 :0] s_arsize; + input [1 :0] s_arburst; + input s_arlock; + input [3 :0] s_arcache; + input [2 :0] s_arprot; + input s_arvalid; + output s_arready; + output [3 :0] s_rid; + output [31:0] s_rdata; + output [1 :0] s_rresp; + output s_rlast; + output s_rvalid; + input s_rready; + + output reg [31:0] order_addr_reg; + input finish_read_order; + input write_dma_end; + + output [31:0] cr00; + output [31:0] cr01; + output [31:0] cr02; + output [31:0] cr03; + output [31:0] cr04; + output [31:0] cr05; + output [31:0] cr06; + output [31:0] cr07; + + output [15:0] led; + output [1 :0] led_rg0; + output [1 :0] led_rg1; + output reg [7 :0] num_csn; + output reg [6 :0] num_a_g; + input [7 :0] switch; + output [3 :0] btn_key_col; + input [3 :0] btn_key_row; + input [1 :0] btn_step; + +// +reg [31:0] led_data; +reg [31:0] led_rg0_data; +reg [31:0] led_rg1_data; +reg [31:0] num_data; +wire [31:0] switch_data; +wire [31:0] btn_key_data; +wire [31:0] btn_step_data; +reg [31:0] timer; + +reg [31:0] cr00,cr01,cr02,cr03,cr04,cr05,cr06,cr07; +reg busy,write,R_or_W; +reg s_wready; + +wire ar_enter = s_arvalid & s_arready; +wire r_retire = s_rvalid & s_rready & s_rlast; +wire aw_enter = s_awvalid & s_awready; +wire w_enter = s_wvalid & s_wready & s_wlast; +wire b_retire = s_bvalid & s_bready; + +wire s_arready = ~busy & (!R_or_W| !s_awvalid); +wire s_awready = ~busy & ( R_or_W| !s_arvalid); + +always@(posedge aclk) + if(~aresetn) busy <= 1'b0; + else if(ar_enter|aw_enter) busy <= 1'b1; + else if(r_retire|b_retire) busy <= 1'b0; + +reg [3 :0] buf_id; +reg [31:0] buf_addr; +reg [7 :0] buf_len; +reg [2 :0] buf_size; +reg [1 :0] buf_burst; +reg buf_lock; +reg [3 :0] buf_cache; +reg [2 :0] buf_prot; + +always@(posedge aclk) + if(~aresetn) begin + R_or_W <= 1'b0; + buf_id <= 'b0; + buf_addr <= 'b0; + buf_len <= 'b0; + buf_size <= 'b0; + buf_burst <= 'b0; + buf_lock <= 'b0; + buf_cache <= 'b0; + buf_prot <= 'b0; + end + else + if(ar_enter | aw_enter) begin + R_or_W <= ar_enter; + buf_id <= ar_enter ? s_arid : s_awid ; + buf_addr <= ar_enter ? s_araddr : s_awaddr ; + buf_len <= ar_enter ? s_arlen : s_awlen ; + buf_size <= ar_enter ? s_arsize : s_awsize ; + buf_burst <= ar_enter ? s_arburst: s_awburst; + buf_lock <= ar_enter ? s_arlock : s_awlock ; + buf_cache <= ar_enter ? s_arcache: s_awcache; + buf_prot <= ar_enter ? s_arprot : s_awprot ; + end + +always@(posedge aclk) + if(~aresetn) write <= 1'b0; + else if(aw_enter) write <= 1'b1; + else if(ar_enter) write <= 1'b0; + +always@(posedge aclk) + if(~aresetn) s_wready <= 1'b0; + else if(aw_enter) s_wready <= 1'b1; + else if(w_enter & s_wlast) s_wready <= 1'b0; + +always@(posedge aclk) + if(~aresetn) begin + cr00 <= 32'd0; + cr01 <= 32'd0; + cr02 <= 32'd0; + cr03 <= 32'd0; + cr04 <= 32'd0; + cr05 <= 32'd0; + cr06 <= 32'd0; + cr07 <= 32'd0; + end + else if(w_enter) begin + case (buf_addr[15:2]) + 14'd0: cr00 <= s_wdata; + 14'd1: cr01 <= s_wdata; + 14'd2: cr02 <= s_wdata; + 14'd3: cr03 <= s_wdata; + 14'd4: cr04 <= s_wdata; + 14'd5: cr05 <= s_wdata; + 14'd6: cr06 <= s_wdata; + 14'd7: cr07 <= s_wdata; + endcase + end + +reg [31:0] s_rdata; +reg s_rvalid,s_rlast; +wire [31:0] rdata_d = buf_addr[15:2] == 14'd0 ? cr00 : + buf_addr[15:2] == 14'd1 ? cr01 : + buf_addr[15:2] == 14'd2 ? cr02 : + buf_addr[15:2] == 14'd3 ? cr03 : + buf_addr[15:2] == 14'd4 ? cr04 : + buf_addr[15:2] == 14'd5 ? cr05 : + buf_addr[15:2] == 14'd6 ? cr06 : + buf_addr[15:2] == 14'd7 ? cr07 : + buf_addr[15:0] == `ORDER_REG_ADDR ? order_addr_reg : + buf_addr[15:0] == `LED_ADDR ? led_data : + buf_addr[15:0] == `LED_RG0_ADDR ? led_rg0_data : + buf_addr[15:0] == `LED_RG1_ADDR ? led_rg1_data : + buf_addr[15:0] == `NUM_ADDR ? num_data : + buf_addr[15:0] == `SWITCH_ADDR ? switch_data : + buf_addr[15:0] == `BTN_KEY_ADDR ? btn_key_data : + buf_addr[15:0] == `BTN_STEP_ADDR ? btn_step_data : + buf_addr[15:0] == `TIMER_ADDR ? timer : 32'd0; + +always@(posedge aclk) + if(~aresetn) begin + s_rdata <= 'b0; + s_rvalid <= 1'b0; + s_rlast <= 1'b0; + end + else if(busy & !write & !r_retire) + begin + s_rdata <= rdata_d; + s_rvalid <= 1'b1; + s_rlast <= 1'b1; + end + else if(r_retire) + begin + s_rvalid <= 1'b0; + end + +reg s_bvalid; +always@(posedge aclk) + if(~aresetn) s_bvalid <= 1'b0; + else if(w_enter) s_bvalid <= 1'b1; + else if(b_retire) s_bvalid <= 1'b0; + +assign s_rid = buf_id; +assign s_bid = buf_id; +assign s_bresp = 2'b0; +assign s_rresp = 2'b0; + +wire write_order_reg = w_enter & (buf_addr[15:0]==`ORDER_REG_ADDR); +always @(posedge aclk) +begin + if(!aresetn) + begin + order_addr_reg <= 32'h0; + end + else if(write_order_reg) + begin + order_addr_reg <= s_wdata[31:0]; + end + else if(write_dma_end | finish_read_order) + begin + order_addr_reg[2] <= write_dma_end ? 1'b0 : order_addr_reg[2]; + order_addr_reg[3] <= finish_read_order ? 1'b0 : order_addr_reg[3]; + end +end +//-------------------------------{timer}begin----------------------------// +wire write_timer = w_enter & (buf_addr[15:0]==`TIMER_ADDR); +always @(posedge aclk) +begin + if(!aresetn) + begin + timer <= 32'd0; + end + else if (write_timer) + begin + timer <= s_wdata[31:0]; + end + else + begin + timer <= timer + 1'b1; + end +end +//--------------------------------{timer}end-----------------------------// + +//--------------------------------{led}begin-----------------------------// +//led display +//led_data[31:0] +wire write_led = w_enter & (buf_addr[15:0]==`LED_ADDR); +assign led = led_data[15:0]; +always @(posedge aclk) +begin + if(!aresetn) + begin + led_data <= 32'h0; + end + else if(write_led) + begin + led_data <= s_wdata[31:0]; + end +end +//---------------------------------{led}end------------------------------// + +//-------------------------------{switch}begin---------------------------// +//switch data +//switch_data[7:0] +assign switch_data = {24'd0,switch}; +//--------------------------------{switch}end----------------------------// + +//------------------------------{btn key}begin---------------------------// +//btn key data +reg [15:0] btn_key_r; +assign btn_key_data = {16'd0,btn_key_r}; + +//state machine +reg [2:0] state; +wire [2:0] next_state; + +//eliminate jitter +reg key_flag; +reg [19:0] key_count; +reg [3:0] state_count; +wire key_start = (state==3'b000) && !(&btn_key_row); +wire key_end = (state==3'b111) && (&btn_key_row); +wire key_sample= key_count[19]; +always @(posedge aclk) +begin + if(!aresetn) + begin + key_flag <= 1'd0; + end + else if (key_sample && state_count[3]) + begin + key_flag <= 1'b0; + end + else if( key_start || key_end ) + begin + key_flag <= 1'b1; + end + + if(!aresetn || !key_flag) + begin + key_count <= 20'd0; + end + else + begin + key_count <= key_count + 1'b1; + end +end + +always @(posedge aclk) +begin + if(!aresetn || state_count[3]) + begin + state_count <= 4'd0; + end + else + begin + state_count <= state_count + 1'b1; + end +end + +always @(posedge aclk) +begin + if(!aresetn) + begin + state <= 3'b000; + end + else if (state_count[3]) + begin + state <= next_state; + end +end + +assign next_state = (state == 3'b000) ? ( (key_sample && !(&btn_key_row)) ? 3'b001 : 3'b000 ) : + (state == 3'b001) ? ( !(&btn_key_row) ? 3'b111 : 3'b010 ) : + (state == 3'b010) ? ( !(&btn_key_row) ? 3'b111 : 3'b011 ) : + (state == 3'b011) ? ( !(&btn_key_row) ? 3'b111 : 3'b100 ) : + (state == 3'b100) ? ( !(&btn_key_row) ? 3'b111 : 3'b000 ) : + (state == 3'b111) ? ( (key_sample && (&btn_key_row)) ? 3'b000 : 3'b111 ) : + 3'b000; +assign btn_key_col = (state == 3'b000) ? 4'b0000: + (state == 3'b001) ? 4'b1110: + (state == 3'b010) ? 4'b1101: + (state == 3'b011) ? 4'b1011: + (state == 3'b100) ? 4'b0111: + 4'b0000; +wire [15:0] btn_key_tmp; +always @(posedge aclk) begin + if(!aresetn) begin + btn_key_r <= 16'd0; + end + else if(next_state==3'b000) + begin + btn_key_r <=16'd0; + end + else if(next_state == 3'b111 && state != 3'b111) begin + btn_key_r <= btn_key_tmp; + end +end + +assign btn_key_tmp = (state == 3'b001)&(btn_key_row == 4'b1110) ? 16'h0001: + (state == 3'b001)&(btn_key_row == 4'b1101) ? 16'h0010: + (state == 3'b001)&(btn_key_row == 4'b1011) ? 16'h0100: + (state == 3'b001)&(btn_key_row == 4'b0111) ? 16'h1000: + (state == 3'b010)&(btn_key_row == 4'b1110) ? 16'h0002: + (state == 3'b010)&(btn_key_row == 4'b1101) ? 16'h0020: + (state == 3'b010)&(btn_key_row == 4'b1011) ? 16'h0200: + (state == 3'b010)&(btn_key_row == 4'b0111) ? 16'h2000: + (state == 3'b011)&(btn_key_row == 4'b1110) ? 16'h0004: + (state == 3'b011)&(btn_key_row == 4'b1101) ? 16'h0040: + (state == 3'b011)&(btn_key_row == 4'b1011) ? 16'h0400: + (state == 3'b011)&(btn_key_row == 4'b0111) ? 16'h4000: + (state == 3'b100)&(btn_key_row == 4'b1110) ? 16'h0008: + (state == 3'b100)&(btn_key_row == 4'b1101) ? 16'h0080: + (state == 3'b100)&(btn_key_row == 4'b1011) ? 16'h0800: + (state == 3'b100)&(btn_key_row == 4'b0111) ? 16'h8000:16'h0000; +//-------------------------------{btn key}end----------------------------// + +//-----------------------------{btn step}begin---------------------------// +//btn step data +reg btn_step0_r; //0:press +reg btn_step1_r; //0:press +assign btn_step_data = {30'd0,~btn_step0_r,~btn_step1_r}; //1:press + +//-----step0 +//eliminate jitter +reg step0_flag; +reg [19:0] step0_count; +wire step0_start = btn_step0_r && !btn_step[0]; +wire step0_end = !btn_step0_r && btn_step[0]; +wire step0_sample= step0_count[19]; +always @(posedge aclk) +begin + if(!aresetn) + begin + step0_flag <= 1'd0; + end + else if (step0_sample) + begin + step0_flag <= 1'b0; + end + else if( step0_start || step0_end ) + begin + step0_flag <= 1'b1; + end + + if(!aresetn || !step0_flag) + begin + step0_count <= 20'd0; + end + else + begin + step0_count <= step0_count + 1'b1; + end + + if(!aresetn) + begin + btn_step0_r <= 1'b1; + end + else if(step0_sample) + begin + btn_step0_r <= btn_step[0]; + end +end + +//-----step1 +//eliminate jitter +reg step1_flag; +reg [19:0] step1_count; +wire step1_start = btn_step1_r && !btn_step[1]; +wire step1_end = !btn_step1_r && btn_step[1]; +wire step1_sample= step1_count[19]; +always @(posedge aclk) +begin + if(!aresetn) + begin + step1_flag <= 1'd0; + end + else if (step1_sample) + begin + step1_flag <= 1'b0; + end + else if( step1_start || step1_end ) + begin + step1_flag <= 1'b1; + end + + if(!aresetn || !step1_flag) + begin + step1_count <= 20'd0; + end + else + begin + step1_count <= step1_count + 1'b1; + end + + if(!aresetn) + begin + btn_step1_r <= 1'b1; + end + else if(step1_sample) + begin + btn_step1_r <= btn_step[1]; + end +end +//------------------------------{btn step}end----------------------------// + +//-------------------------------{led rg}begin---------------------------// +//led_rg0_data[31:0] led_rg0_data[31:0] +//bfd0_f010 bfd0_f014 +wire write_led_rg0 = w_enter & (buf_addr[15:0]==`LED_RG0_ADDR); +wire write_led_rg1 = w_enter & (buf_addr[15:0]==`LED_RG1_ADDR); +assign led_rg0 = led_rg0_data[1:0]; +assign led_rg1 = led_rg1_data[1:0]; +always @(posedge aclk) +begin + if(!aresetn) + begin + led_rg0_data <= 32'h0; + end + else if(write_led_rg0) + begin + led_rg0_data <= s_wdata[31:0]; + end + + if(!aresetn) + begin + led_rg1_data <= 32'h0; + end + else if(write_led_rg1) + begin + led_rg1_data <= s_wdata[31:0]; + end +end +//--------------------------------{led rg}end----------------------------// + +//---------------------------{digital number}begin-----------------------// +//digital number display +//num_data[31:0] +wire write_num = w_enter & (buf_addr[15:0]==`NUM_ADDR); +always @(posedge aclk) +begin + if(!aresetn) + begin + num_data <= 32'h0; + end + else if(write_num) + begin + num_data <= s_wdata[31:0]; + end +end + + +reg [19:0] count; +always @(posedge aclk) +begin + if(!aresetn) + begin + count <= 20'd0; + end + else + begin + count <= count + 1'b1; + end +end +//scan data +reg [3:0] scan_data; +always @ ( posedge aclk ) +begin + if ( !aresetn ) + begin + scan_data <= 32'd0; + num_csn <= 8'b1111_1111; + end + else + begin + case(count[19:17]) + 3'b000 : scan_data <= num_data[31:28]; + 3'b001 : scan_data <= num_data[27:24]; + 3'b010 : scan_data <= num_data[23:20]; + 3'b011 : scan_data <= num_data[19:16]; + 3'b100 : scan_data <= num_data[15:12]; + 3'b101 : scan_data <= num_data[11: 8]; + 3'b110 : scan_data <= num_data[7 : 4]; + 3'b111 : scan_data <= num_data[3 : 0]; + endcase + + case(count[19:17]) + 3'b000 : num_csn <= 8'b0111_1111; + 3'b001 : num_csn <= 8'b1011_1111; + 3'b010 : num_csn <= 8'b1101_1111; + 3'b011 : num_csn <= 8'b1110_1111; + 3'b100 : num_csn <= 8'b1111_0111; + 3'b101 : num_csn <= 8'b1111_1011; + 3'b110 : num_csn <= 8'b1111_1101; + 3'b111 : num_csn <= 8'b1111_1110; + endcase + end +end + +always @(posedge aclk) +begin + if ( !aresetn ) + begin + num_a_g <= 7'b0000000; + end + else + begin + case ( scan_data ) + 4'd0 : num_a_g <= 7'b1111110; //0 + 4'd1 : num_a_g <= 7'b0110000; //1 + 4'd2 : num_a_g <= 7'b1101101; //2 + 4'd3 : num_a_g <= 7'b1111001; //3 + 4'd4 : num_a_g <= 7'b0110011; //4 + 4'd5 : num_a_g <= 7'b1011011; //5 + 4'd6 : num_a_g <= 7'b1011111; //6 + 4'd7 : num_a_g <= 7'b1110000; //7 + 4'd8 : num_a_g <= 7'b1111111; //8 + 4'd9 : num_a_g <= 7'b1111011; //9 + 4'd10: num_a_g <= 7'b1110111; //a + 4'd11: num_a_g <= 7'b0011111; //b + 4'd12: num_a_g <= 7'b1001110; //c + 4'd13: num_a_g <= 7'b0111101; //d + 4'd14: num_a_g <= 7'b1001111; //e + 4'd15: num_a_g <= 7'b1000111; //f + endcase + end +end +//----------------------------{digital number}end------------------------// +endmodule diff --git a/resources/soc/rtl/DMA/dma.v b/resources/soc/rtl/DMA/dma.v new file mode 100644 index 0000000..04ec940 --- /dev/null +++ b/resources/soc/rtl/DMA/dma.v @@ -0,0 +1,778 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +`define DMA_ORDERSIZE 32 +`define DMA_WORDSIZE 32 +`include "config.h" +`define WRITE_LENGTH 16 +`define READ_LENGTH 16 +module dma_master( + clk, + rst_n, + arid, araddr, arlen ,arsize, arburst, arlock, arcache, arprot, arvalid, arready, + rid , rdata , rresp ,rlast , rvalid , rready, + awid, awaddr, awlen ,awsize, awburst, awlock, awcache, awprot, awvalid, awready, + wid , wdata , wstrb ,wlast , wvalid , wready, + bid , bresp , bvalid,bready, + dma_int, order_addr_in,dma_req_in,dma_ack_out, + finish_read_order, write_dma_end,dma_gnt, + apb_valid_req,apb_psel, apb_penable, apb_rw, apb_addr,apb_rdata,apb_wdata + ); +input clk; +input rst_n; +input dma_gnt; + +output [`LID -1 :0] awid; +output [`Lawaddr -1 :0] awaddr; +output [`Lawlen -1 :0] awlen; +output [`Lawsize -1 :0] awsize; +output [`Lawburst -1 :0] awburst; +output [`Lawlock -1 :0] awlock; +output [`Lawcache -1 :0] awcache; +output [`Lawprot -1 :0] awprot; +output awvalid; +input awready; +output [`LID -1 :0] wid; +output [64 -1 :0] wdata; +output [8 -1 :0] wstrb; +output wlast; +output wvalid; +input wready; +input [`LID -1 :0] bid; +input [`Lbresp -1 :0] bresp; +input bvalid; +output bready; +output [`LID -1 :0] arid; +output [`Laraddr -1 :0] araddr; +output [`Larlen -1 :0] arlen; +output [`Larsize -1 :0] arsize; +output [`Larburst -1 :0] arburst; +output [`Larlock -1 :0] arlock; +output [`Larcache -1 :0] arcache; +output [`Larprot -1 :0] arprot; +output arvalid; +input arready; +input [`LID -1 :0] rid; +input [64 -1 :0] rdata; +input [`Lrresp -1 :0] rresp; +input rlast; +input rvalid; +output rready; + +output dma_int; +output dma_ack_out; +input [31:0] order_addr_in; +input dma_req_in; +output finish_read_order; +output write_dma_end; + +output apb_psel; +output apb_valid_req; +output apb_penable; +output apb_rw; +output [31:0] apb_addr; +input [31:0] apb_rdata; +output [31:0] apb_wdata; + +wire read_idle; +wire read_ready; +wire get_order; +wire read_order; +wire finish_read_order; +wire r_ddr_wait; +wire read_ddr; +wire read_ddr_end; +wire read_dev; +wire read_dev_end; +wire read_step_end; +wire write_idle; +wire write_ready; +wire w_ddr_wait; +wire write_ddr; +wire write_ddr_end; +wire w_dma_wait; +wire write_dma; +wire write_dma_end ; +wire write_step_end; +wire rresp_ok = (rresp==2'h0); +wire bresp_ok = (bresp==2'h0); + +wire dma_start; +wire dma_stop; +wire ask_valid; +wire [31:0] ask_addr; +wire [ 1:0] device_num_tmp; +assign device_num_tmp = order_addr_in[1:0]; +assign ask_valid = order_addr_in[2] ; +assign dma_start = order_addr_in[3] ; +assign dma_stop = order_addr_in[4] & + (read_ddr_end | read_dev_end | read_step_end | read_idle ) & + (write_ddr_end | write_dma_end | write_step_end | write_idle); +assign ask_addr = {order_addr_in[31:5], 5'h0}; + +reg [ 3:0] dma_read_state; +reg [ 3:0] dma_write_state; +reg [31:0] count_length; +reg [ 4:0] count_fifo_r; +reg [ 4:0] count_fifo_w; +reg [ 5:0] count_fifo; +reg [31:0] mem [31:0]; +reg dma_r_w; +reg [31:0] dma_order_addr; +reg [31:0] dma_mem_addr; +reg [31:0] dma_dev_addr; +reg [31:0] dma_length; +reg [31:0] dma_step_length; +reg [31:0] dma_step_times; +reg [31:0] dma_state_reg; +reg dma_get_order; + +wire [31:0]mem0 = mem[0]; +wire [31:0]mem1 = mem[1]; +wire [31:0]mem2 = mem[2]; +wire [31:0]mem3 = mem[3]; +wire [31:0]mem4 = mem[4]; +wire [31:0]mem5 = mem[5]; +wire [31:0]mem6 = mem[6]; +wire [31:0]mem7 = mem[7]; +wire [31:0]mem8 = mem[8]; +wire [31:0]mem9 = mem[9]; +wire [31:0]mem10 = mem[10]; +wire [31:0]mem11 = mem[11]; +wire [31:0]mem12 = mem[12]; +wire [31:0]mem13 = mem[13]; +wire [31:0]mem14 = mem[14]; +wire [31:0]mem15 = mem[15]; +wire [31:0]mem16 = mem[16]; +wire [31:0]mem17 = mem[17]; +wire [31:0]mem18 = mem[18]; +wire [31:0]mem19 = mem[19]; +wire [31:0]mem20 = mem[20]; +wire [31:0]mem21 = mem[21]; +wire [31:0]mem22 = mem[22]; +wire [31:0]mem23 = mem[23]; +wire [31:0]mem24 = mem[24]; +wire [31:0]mem25 = mem[25]; +wire [31:0]mem26 = mem[26]; +wire [31:0]mem27 = mem[27]; +wire [31:0]mem28 = mem[28]; +wire [31:0]mem29 = mem[29]; +wire [31:0]mem30 = mem[30]; +wire [31:0]mem31 = mem[31]; + +wire dma_order_en; +wire[ 3:0] dma_next_read_state; +wire[ 3:0] dma_next_write_state; +wire[31:0] count_obj; +wire dma_single_trans_over; +wire dma_trans_over; +wire dma_state_change_en; +wire dma_int_mask; + +assign dma_int_mask = dma_state_reg[0]; +assign dma_int = dma_state_reg[1]; +assign dma_order_en = dma_order_addr[0]; + +reg dma_req_in_reg_1, dma_req_in_reg_2; +reg dma_req_r; +reg dma_req; +always @(posedge clk)begin + if (~rst_n) begin + dma_req_in_reg_1 <= 1'b0; + dma_req_in_reg_2 <= 1'b0; + end else begin + dma_req_in_reg_1 <= dma_req_in; + dma_req_in_reg_2 <= dma_req_in_reg_1; + end +end +always @(posedge clk)begin + if (~rst_n) + dma_req_r <= 1'b0; + else + dma_req_r <= dma_req_in_reg_2; +end +always @(posedge clk)begin + if (~rst_n) + dma_req <= 1'b0; + else if (dma_ack_out | !dma_req_in_reg_2) + dma_req <= 1'b0; + else if (~dma_req_r & dma_req_in_reg_2) + dma_req <= 1'b1; +end + +parameter READ_IDLE = 4'h0; +parameter READ_READY = 4'h1; +parameter GET_ORDER = 4'h2; +parameter READ_ORDER = 4'h3; +parameter FINISH_READ_ORDER = 4'h4; +parameter R_DDR_WAIT = 4'h5; +parameter READ_DDR = 4'h6; +parameter READ_DDR_END = 4'h7; +parameter READ_DEV = 4'h8; +parameter READ_DEV_END = 4'h9; +parameter READ_STEP_END = 4'ha; + +assign read_idle = dma_read_state==READ_IDLE; +assign read_ready = dma_read_state==READ_READY; +assign get_order = dma_read_state==GET_ORDER; +assign read_order = dma_read_state==READ_ORDER; +assign finish_read_order = dma_read_state==FINISH_READ_ORDER; +assign r_ddr_wait = dma_read_state==R_DDR_WAIT; +assign read_ddr = dma_read_state==READ_DDR; +assign read_ddr_end = dma_read_state==READ_DDR_END; +assign read_dev = dma_read_state==READ_DEV; +assign read_dev_end = dma_read_state==READ_DEV_END; +assign read_step_end = dma_read_state==READ_STEP_END; + +assign dma_single_trans_over = (write_step_end | read_step_end & (count_fifo==0)) & (count_length==32'b0) & (dma_step_times==32'b1) ? 1'b1 : 1'b0; +assign dma_trans_over = dma_single_trans_over & !dma_order_en; +reg dma_trans_over_reg; +always @(posedge clk)begin + if(!rst_n) + dma_trans_over_reg <= 1'b0; + else if(dma_trans_over) + dma_trans_over_reg <= 1'b1; + else if((read_idle & write_idle) & dma_start) + dma_trans_over_reg <= 1'b0; +end + +wire [5:0] num_fifo; +wire read_ddr_again = !dma_get_order & dma_r_w & (count_fifo <= `READ_LENGTH) & (count_length!=0) & (num_fifo >6'h0); +wire read_dev_again = !dma_get_order & !dma_r_w & dma_req & (count_fifo < 6'h20); + +assign dma_next_read_state = read_idle ? (dma_start ? READ_READY : READ_IDLE) : + read_ready ? (dma_get_order ? GET_ORDER : read_ddr_again ? R_DDR_WAIT : read_dev_again ? READ_DEV : READ_READY) : + get_order ? (arready ? READ_ORDER : GET_ORDER) : + read_order ? (rvalid & rlast & rready & rresp_ok ? FINISH_READ_ORDER : READ_ORDER) : + finish_read_order ? READ_READY : + r_ddr_wait ? (arready ? READ_DDR : R_DDR_WAIT) : + read_ddr ? (rvalid & rready & rlast & rresp_ok ? READ_DDR_END : READ_DDR) : + read_ddr_end ? ((count_length==0) ? READ_STEP_END : read_ddr_again ? R_DDR_WAIT : READ_DDR_END) : + read_step_end ? ((dma_trans_over | dma_stop) ? READ_IDLE : dma_get_order ? GET_ORDER : read_ddr_again ? R_DDR_WAIT : READ_STEP_END) : + read_dev ? ((dma_trans_over | dma_stop) ? READ_IDLE : dma_get_order ? GET_ORDER : apb_penable ? READ_DEV_END : READ_DEV) : + read_dev_end ? ((dma_trans_over | dma_stop) ? READ_IDLE : dma_get_order ? GET_ORDER : read_dev_again ? READ_DEV : READ_DEV_END) : READ_IDLE; + + +reg [1:0]arb_write_op; +wire aw_empty = (arb_write_op==2'b01) & write_ddr_end || (arb_write_op==2'b00) & write_dma_end || (arb_write_op==2'b11); +wire write_ddr_ok = ((count_fifo >= `WRITE_LENGTH) | (count_fifo >= count_length)) & (count_length!=0); +always @(posedge clk)begin + if(!rst_n | dma_stop) + arb_write_op <= 2'b11; + else if(ask_valid & aw_empty & (arb_write_op!=0)) + arb_write_op <= 2'b00; + else if(!dma_r_w & write_ddr_ok & aw_empty) + arb_write_op <= 2'b01; + else if(aw_empty) + arb_write_op <= 2'b11; +end + +wire write_ddr_again = !dma_get_order & (arb_write_op==2'b01) & write_ddr_ok; +wire write_dma_again = !dma_get_order & (arb_write_op==2'b00); + +parameter WRITE_IDLE = 4'h0; +parameter W_DDR_WAIT = 4'h1; +parameter WRITE_DDR = 4'h2; +parameter WRITE_DDR_END = 4'h3; +parameter W_DMA_WAIT = 4'h4; +parameter WRITE_DMA = 4'h5; +parameter WRITE_DMA_END = 4'h6; +parameter WRITE_STEP_END = 4'h7; +assign write_idle = dma_write_state==WRITE_IDLE; +assign w_ddr_wait = dma_write_state==W_DDR_WAIT; +assign write_ddr = dma_write_state==WRITE_DDR; +assign write_ddr_end = dma_write_state==WRITE_DDR_END; +assign w_dma_wait = dma_write_state==W_DMA_WAIT; +assign write_dma = dma_write_state==WRITE_DMA; +assign write_dma_end = dma_write_state==WRITE_DMA_END; +assign write_step_end = dma_write_state==WRITE_STEP_END; +reg awvalid_dma; +assign dma_next_write_state = write_idle ? (write_dma_again ? W_DMA_WAIT : write_ddr_again ? W_DDR_WAIT : WRITE_IDLE) : + w_ddr_wait ? (awready ? WRITE_DDR : W_DDR_WAIT) : + write_ddr ? (bvalid & bresp_ok & bready ? WRITE_DDR_END : WRITE_DDR) : + write_ddr_end ? (write_dma_again ? W_DMA_WAIT : (count_length==0) ? WRITE_STEP_END : write_ddr_again ? W_DDR_WAIT : WRITE_DDR_END): + w_dma_wait ? (awvalid_dma & awready ? WRITE_DMA : W_DMA_WAIT) : + write_dma ? (bvalid & bresp_ok & bready ? WRITE_DMA_END : WRITE_DMA) : + write_dma_end ? (dma_r_w ? WRITE_IDLE : (count_length==0) ? WRITE_STEP_END : write_ddr_again ? W_DDR_WAIT : WRITE_DMA_END) : + write_step_end ? ((dma_trans_over | dma_stop | (count_length==0)&(dma_step_times==32'h1)) ? WRITE_IDLE : + write_dma_again ? W_DMA_WAIT : write_ddr_again ? W_DDR_WAIT : WRITE_STEP_END) : WRITE_IDLE; + +wire [1:0] ac97_mod = dma_dev_addr[29:28]; +wire byte_mod = (ac97_mod == 2'b00); +wire half_mod = (ac97_mod == 2'b01); +wire word_mod = (ac97_mod == 2'b10); +wire [31:0] mem_0 = mem[count_fifo_w]; +wire [31:0] mem_1 = mem[count_fifo_w+1]; +wire [31:0] wdata_tmp0_tmp = byte_mod ? {mem_1[23:16], mem_1[7 :0], mem_0[23:16], mem_0[7 :0]} : half_mod ? {mem_1[15: 0], mem_0[15: 0]} : mem_0; +wire [31:0] wdata_tmp1_tmp = byte_mod ? {mem_1[31:24], mem_1[15:8], mem_0[31:24], mem_0[15:8]} : half_mod ? {mem_1[31:16], mem_0[31:16]} : mem_1; +wire [31:0] wdata_tmp0 = dma_dev_addr[30] ? wdata_tmp0_tmp : mem_0; +wire [31:0] wdata_tmp1 = dma_dev_addr[30] ? wdata_tmp1_tmp : mem_0; +reg [32:0] reg_ac97; +wire write_dev_ok = ((dma_dev_addr[31:30]==2'b11) ? (reg_ac97[32] | (count_fifo>=6'h2)) : (count_fifo>=6'h1)) & dma_req & dma_r_w; +always@(posedge clk)begin + if(!rst_n) + reg_ac97 <= 33'h0; + else if(apb_penable & dma_dev_addr[31] & !reg_ac97[32]) + reg_ac97 <= {1'b1, wdata_tmp1}; + else if(apb_penable & reg_ac97[32]) + reg_ac97[32] <= 1'b0; +end + +reg arvalid_dev; +always @(posedge clk)begin + if(!rst_n) + arvalid_dev <= 1'b0; + else if(arvalid_dev & apb_penable) + arvalid_dev <= 1'b0; + else if((read_dev & !dma_get_order | read_dev_end) & read_dev_again) + arvalid_dev <= 1'b1; +end + +reg awvalid_dev; +always @(posedge clk)begin + if(!rst_n) + awvalid_dev <= 1'b0; + else if(awvalid_dev & apb_penable) + awvalid_dev <= 1'b0; + else if(write_dev_ok) + awvalid_dev <= 1'b1; +end +assign dma_ack_out = apb_psel; + +assign dma_state_change_en = (dma_read_state !=dma_next_read_state) | (dma_write_state!=dma_next_write_state); +always@(posedge clk)begin + if(!rst_n | dma_trans_over | dma_stop)begin + dma_read_state <= READ_IDLE; + dma_write_state <= WRITE_IDLE; + end else if(dma_state_change_en)begin + dma_read_state <= dma_next_read_state; + dma_write_state <= dma_next_write_state; + end +end + +always@(posedge clk)begin + if(~rst_n | finish_read_order | dma_stop) + dma_get_order <= 1'b0; + else if((read_idle & write_idle) & dma_start | dma_single_trans_over & dma_order_en) + dma_get_order <= 1'b1; +end + +wire [2:0] size_tmp = read_ddr ? arsize : awsize; +wire [1:0] read_size = read_dev ? 2'h1 : (arsize==3'h3) ? 2'h2 : 2'h1; +wire [1:0] write_size = awvalid_dev ? (((dma_dev_addr[31:30]==2'b11) & (count_fifo>32'h1)) ? 2'h2 : 2'h1) : (awsize==3'h3) ? 2'h2 : 2'h1; + +always@(posedge clk)begin + if(~rst_n) + count_length <= 32'b0; + else if (dma_stop) + count_length <= 32'b0; + else if(finish_read_order) + count_length <= dma_length; + else if(dma_get_order) + count_length <= `DMA_ORDERSIZE; + else if(((read_ddr_end | write_ddr_end) & count_length==32'b0) & (dma_step_times > 32'h1)) + count_length <= dma_length; + else if(read_ddr & rvalid & rready & rresp_ok | write_ddr & wvalid & wready) + count_length <= count_length - ((size_tmp==3'h3) ? 2'h2 : 2'h1); +end + +reg [4:0] read_num; +reg [4:0] write_num; +always@(posedge clk)begin + if(~rst_n | dma_single_trans_over | dma_stop)begin + count_fifo_r <= 5'h0; + read_num <= 5'h0; + end else if(read_ddr & rvalid & rready & rresp_ok | read_dev & apb_penable)begin + count_fifo_r <= count_fifo_r + read_size; + read_num <= read_ddr ? (rlast ? 5'h0 : read_num + 1'b1) : read_num; + end +end +always@(posedge clk)begin + if(~rst_n | dma_single_trans_over | dma_stop)begin + count_fifo_w <= 5'h0; + write_num <= 5'h0; + end else if(write_ddr & wvalid & wready | awvalid_dev & apb_penable & !reg_ac97[32])begin + count_fifo_w <= count_fifo_w + write_size; + write_num <= write_ddr ? (wlast ? 5'h0 : write_num + 1'b1) : write_num; + end +end + +reg write_dma_to_ddr; +reg [1:0]dma_num; + +always@(posedge clk)begin + if(~rst_n)begin + dma_num <= 2'h0; + write_dma_to_ddr <= 1'h0; +end + else if(write_dma & wvalid & wready)begin + dma_num <= dma_num + 1'b1; + write_dma_to_ddr <= !write_dma_to_ddr; +end +end + +wire [1:0] fifo_read_add = {2{(read_ddr & rvalid & rready | read_dev & apb_penable)}} & read_size; +wire [1:0] fifo_write_sum = {2{(write_ddr & wvalid & wready | awvalid_dev & apb_penable & !reg_ac97[32])}} & write_size; +always@(posedge clk)begin + if(~rst_n | dma_single_trans_over | dma_stop) + count_fifo <= 6'h0; + else + count_fifo <= count_fifo + fifo_read_add - fifo_write_sum; +end + +reg arvalid_dma; +wire [31:0] araddr_dma; +wire [3 :0] arlen_dma; +wire [2 :0] arsize_dma; +reg getting_dma; +always @(posedge clk)begin + if(!rst_n)begin + arvalid_dma <= 1'b0; + getting_dma <= 1'b0; + end else if(arvalid_dma & arready) + arvalid_dma <= 1'b0; + else if(dma_get_order & !getting_dma)begin + arvalid_dma <= 1'b1; + getting_dma <= 1'b1; + end else if(finish_read_order | dma_stop) + getting_dma <= 1'b0; +end +assign araddr_dma = (dma_start & dma_get_order) ? ask_addr : {dma_order_addr[31:5], 5'h0}; +assign arlen_dma = 4'h3; +assign arsize_dma = 3'h3; + +wire [2:0] arsize_ddr_tmp; +wire [3:0] arlen_ddr_tmp; +wire [5:0] left_fifo = `DMA_WORDSIZE - count_fifo; +wire enough_8; +assign num_fifo = (count_length >= left_fifo) ? left_fifo : count_length; +wire [3:0] arlen_tmp = (num_fifo >= 6'h10) ? 4'hf : (num_fifo-1'b1); +assign enough_8 = (num_fifo >= 6'h2); +assign arsize_ddr_tmp = (dma_mem_addr[2:0]==3'h0) & enough_8 ? 3'h3 : 3'h2; +assign arlen_ddr_tmp = (dma_mem_addr[2:0]==3'h0) & enough_8 ? (num_fifo[5] ? 4'hf : (num_fifo[5:1]-1'b1)): arlen_tmp; + +reg arvalid_ddr; +reg [31:0] araddr_ddr; +reg [3 :0] arlen_ddr; +reg [2: 0] arsize_ddr; +always @(posedge clk)begin + if(!rst_n) + arvalid_ddr <= 1'b0; + else if(arready & arvalid_ddr) + arvalid_ddr <= 1'b0; + else if((read_ready & !dma_get_order | read_ddr_end | read_step_end) & read_ddr_again & !dma_stop) + arvalid_ddr <= 1'b1; +end + +always @(posedge clk)begin + if(!rst_n) + begin + araddr_ddr <= 32'b0; + arsize_ddr <= 3'b0; + arlen_ddr <= 4'b0; + end + else if((read_ready & !dma_get_order | read_ddr_end | read_step_end) & read_ddr_again)begin + araddr_ddr <= dma_mem_addr; + arsize_ddr <= arsize_ddr_tmp; + arlen_ddr <= arlen_ddr_tmp; + end +end + +assign arvalid = dma_get_order ? arvalid_dma : dma_r_w ? arvalid_ddr : 1'b0; +assign araddr = dma_get_order ? {32'h0, araddr_dma} : {32'h0, araddr_ddr}; +assign arsize = dma_get_order ? arsize_dma : arsize_ddr; +assign arlen = dma_get_order ? arlen_dma : arlen_ddr; +assign arid = dma_get_order ? {4'h0, 4'h1} : {4'h0, 4'h2}; +assign arburst = 2'h1; +assign arlock = 2'h0; +assign arprot = 3'h0; +assign arcache = 4'h0; +assign rready = 1'h1; + +wire[31:0] count_sou; +assign count_sou = araddr_ddr + {read_num, 2'h0}; +wire [31:0]read_data_word = !count_sou[2] ? rdata[31:0] : rdata[63:32]; + +integer i; +always@(posedge clk) +begin + if(~rst_n | dma_stop | dma_single_trans_over) + begin + for(i=0;i<=31;i=i+1) mem[i] <= 32'b0; + end + else if(read_ddr & rvalid & rready & rresp_ok & arsize==3'h2) + mem[count_fifo_r] <= read_data_word; + else if(read_ddr & rvalid & rready & rresp_ok & arsize==3'h3) + {mem[count_fifo_r+1], mem[count_fifo_r]} <= rdata; + else if(read_dev & apb_penable) + mem[count_fifo_r] <= apb_rdata; +end + +reg [1:0]reg_num; +always@(posedge clk)begin + if(~rst_n | dma_stop)begin + dma_r_w <= 1'b0; + dma_order_addr <= 32'b0; + dma_mem_addr <= 32'b0; + dma_dev_addr <= 32'b0; + dma_length <= 32'b0; + dma_step_length<= 32'b0; + dma_step_times <= 32'b0; + reg_num <= 2'b0; + end + else begin + if(read_ddr & rvalid & rready & rresp_ok | write_ddr & wvalid & wready) + dma_mem_addr <= dma_mem_addr + ((size_tmp==3'h3) ? 4'h8 : 3'h4); + else if((write_ddr_end | read_ddr_end) & (count_length==32'b0) & dma_step_times>32'b1)begin + dma_step_times <= dma_step_times - 1; + dma_mem_addr <= dma_mem_addr + {dma_step_length, 2'h0}; + end else if(read_order & rvalid & rready & rresp_ok & (reg_num==2'h0))begin + dma_order_addr <= rdata[31 : 0]; + dma_mem_addr <= rdata[63 :32]; + reg_num <= reg_num + 1'b1; + end else if(read_order & rvalid & rready & rresp_ok & (reg_num==2'h1))begin + dma_dev_addr <= rdata[31 : 0]; + dma_length <= rdata[63 :32]; + reg_num <= reg_num + 1'b1; + end else if(read_order & rvalid & rready & rresp_ok & (reg_num==2'h2))begin + dma_step_length<= rdata[31: 0]; + dma_step_times <= rdata[63:32]; + reg_num <= reg_num + 1'b1; + end else if(read_order & rvalid & rready & rresp_ok & rlast)begin + dma_r_w <= rdata[12]; + reg_num <= 2'b0; + end + end +end + +reg dma_int_en; +reg dma_int_i; +always@(posedge clk)begin + if(~rst_n) + dma_state_reg <= 32'b0; + else if(read_order & rvalid & rready & rresp_ok & rlast) + dma_state_reg <= rdata[31:0]; + else if(dma_start == 1'b1) + dma_state_reg[1] <= 1'b0; + else if(dma_int_i & dma_int_en) + dma_state_reg[1] <= 1'b1; + else if(dma_state_reg[1]) + dma_state_reg[1] <= 1'b0; +end + +reg dma_int_tmp; +always@(posedge clk) +begin + if(!rst_n) + dma_int_i <= 1'b0; + else if(dma_single_trans_over & dma_int_mask & !dma_int_i) + dma_int_i <= 1'b1; + else if(dma_int_i & dma_int_en) + dma_int_i <= 1'b0; +end + +always@(posedge clk) +begin + if(!rst_n) + dma_int_tmp <= 1'b0; + else + dma_int_tmp <= dma_int_i; +end +always@(posedge clk) +begin + if(!rst_n) + dma_int_en <= 1'b1; + else if(dma_int_tmp & dma_int_en) + dma_int_en <= 1'b0; + else if(!dma_int_i) + dma_int_en <= 1'b1; +end + +wire [5:0] write_length; +wire enough_8_1; +wire [2:0] awsize_ddr_tmp; +wire [3:0] awlen_ddr_tmp; +wire [3:0] awlen_tmp; +assign write_length = (count_fifo >= count_length) ? count_length[5:0] : count_fifo; +assign enough_8_1 = (write_length >= 3'h2); +assign awlen_tmp = (write_length >= 5'h10) ? 4'hf : (write_length - 1'b1); +assign awsize_ddr_tmp = (dma_mem_addr[2:0]==3'h0) & enough_8_1 ? 3'h3 : 3'h2; +assign awlen_ddr_tmp = (dma_mem_addr[2:0]==3'h0) & enough_8_1 ? (write_length[5]? 4'hf : (write_length[5:1] - 1'b1)) : awlen_tmp; +reg awvalid_ddr; +reg [31:0] awaddr_ddr; +reg [3 :0] awlen_ddr; +reg [2 :0] awsize_ddr; +reg wvalid_ddr; +always @(posedge clk)begin + if(!rst_n) + awvalid_ddr <= 1'b0; + else if(awvalid_ddr & awready) + awvalid_ddr <= 1'b0; + else if(write_ddr_again & !write_dma_again & (write_idle | write_ddr_end | write_dma_end | write_step_end) & !dma_stop) + awvalid_ddr <= 1'b1; +end +always @(posedge clk)begin + if(!rst_n) + begin + awaddr_ddr <= 32'b0; + awsize_ddr <= 3'b0; + awlen_ddr <= 4'b0; + end + else if(write_ddr)begin + awaddr_ddr <= awaddr_ddr; + awsize_ddr <= awsize_ddr; + awlen_ddr <= awlen_ddr; + end else if(write_ddr_again & !write_dma_again & (write_idle | write_ddr_end | write_dma_end | write_step_end))begin + awaddr_ddr <= dma_mem_addr; + awsize_ddr <= awsize_ddr_tmp; + awlen_ddr <= awlen_ddr_tmp; + end +end +always @(posedge clk)begin + if(!rst_n) + wvalid_ddr <= 1'b0; + else if (awvalid_ddr & awready)begin + wvalid_ddr <= 1'b1; + end + else if(write_ddr & wvalid & wready)begin + wvalid_ddr <= !wlast; + end +end +assign count_obj = awaddr_ddr + {write_num, 2'h0}; +wire [63:0] wdata_word = !count_obj[2] ? {32'h0, mem[count_fifo_w]} : {mem[count_fifo_w], 32'h0}; +wire [7 :0] wstrb_word = !count_obj[2] ? 8'h0f : 8'hf0; +wire [63:0] wdata_64 = {mem[count_fifo_w+1], mem[count_fifo_w]}; +wire [63:0] wdata_ddr; +wire [15:0] wstrb_ddr; +wire wlast_ddr; +assign wdata_ddr = (awsize_ddr==3'h2) ? wdata_word : wdata_64; +assign wstrb_ddr = (awsize_ddr==3'h2) ? wstrb_word : 8'hff; +assign wlast_ddr = (write_num==awlen_ddr); + +reg wvalid_dma; +wire [31:0] awaddr_dma; +wire [3 :0] awlen_dma; +wire [2 :0] awsize_dma; +wire [63:0] wdata_dma; +wire [15 :0] wstrb_dma; +wire wlast_dma; +always @(posedge clk)begin + if(!rst_n) + awvalid_dma <= 1'b0; + else if(awvalid_dma & awready) + awvalid_dma <= 1'b0; + else if(write_dma_again & !dma_stop & w_dma_wait) + awvalid_dma <= 1'b1; +end +always @(posedge clk)begin + if(!rst_n) + wvalid_dma <= 1'b0; + else if (awvalid_dma & awready) + wvalid_dma <= 1'b1; + else if(write_dma & wvalid & wready) + wvalid_dma <= !wlast; +end + +wire [63:0] dma_data0; +wire [63:0] dma_data1; +wire [63:0] dma_data2; +wire [63:0] dma_data3; +wire [31:0] dma_state_tmp = {19'h0, dma_r_w, dma_write_state, dma_read_state, dma_trans_over_reg, + dma_single_trans_over, dma_int, dma_int_mask}; + +assign dma_data0 = {dma_mem_addr, dma_order_addr }; +assign dma_data1 = {dma_length, dma_dev_addr }; +assign dma_data2 = {dma_step_times, dma_step_length}; +assign dma_data3 = {32'h0, dma_state_tmp }; + +assign awaddr_dma = ask_addr; +assign awlen_dma = 4'h3; +assign awsize_dma = 3'h3; + +assign wlast_dma = (dma_num== 2'h3); +assign wdata_dma = (dma_num==2'h0) ? dma_data0 : (dma_num==2'h1) ? dma_data1 : (dma_num==2'h2) ? dma_data2 : dma_data3; +assign wstrb_dma = (dma_num!=2'h3) ? 8'hff : 8'h0f; + +assign awvalid = awvalid_dma | awvalid_ddr ; +assign awaddr = awvalid_dma ? {32'h0, awaddr_dma} : {32'h0, awaddr_ddr}; +assign awlen = awvalid_dma ? awlen_dma : awlen_ddr; +assign awsize = awvalid_dma ? awsize_dma : awsize_ddr; +assign awid = awvalid_dma ? {4'h0, 4'h1} : {4'h0, 4'h2}; +assign awburst = 2'h1; +assign awlock = 2'h0; +assign awprot = 3'h0; +assign awcache = 4'h0; +assign wvalid = wvalid_dma | wvalid_ddr ; +assign wid = wvalid_dma ? {4'h0, 4'h1} : {4'h0, 4'h2}; +assign wdata = wvalid_dma ? wdata_dma : wdata_ddr; +assign wstrb = wvalid_dma ? wstrb_dma : wstrb_ddr; +assign wlast = wvalid_dma ? wlast_dma : wlast_ddr; +assign bready = 1'b1; + +wire apb_valid_req; +reg apb_psel; +reg apb_penable; +reg apb_rw; +wire [31:0]apb_addr; +wire [31:0]apb_wdata; +assign apb_valid_req = arvalid_dev || awvalid_dev ; +assign apb_addr = dma_dev_addr[31] ? (reg_ac97[32] ? {24'h1fe600, dma_dev_addr[15:8]} :{24'h1fe600, dma_dev_addr[7:0]}) : dma_dev_addr; +assign apb_wdata= reg_ac97[32] ? reg_ac97[31:0] : wdata_tmp0; +always@(posedge clk) +begin + if(~rst_n)begin + apb_psel<= 1'b0; + apb_penable <= 1'b0; + apb_rw <= 1'b0; + end + else begin + if(dma_gnt) begin + if(apb_penable)begin + apb_psel <= 1'b0; + apb_rw <= 1'b0; + apb_penable <= 1'b0; + end else if(arvalid_dev | awvalid_dev) begin + apb_psel <= 1'b1; + apb_rw <= awvalid_dev ; + apb_penable <= apb_psel; + end else + apb_penable <= apb_psel; + end else begin + apb_psel<= 1'b0; + apb_penable <= 1'b0; + apb_rw <= 1'b0; + end + end +end + +endmodule diff --git a/resources/soc/rtl/MAC/bd.v b/resources/soc/rtl/MAC/bd.v new file mode 100644 index 0000000..2a4146f --- /dev/null +++ b/resources/soc/rtl/MAC/bd.v @@ -0,0 +1,372 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module BD ( + clk, + rst, + col, + crs, + fdp, + tprog, + preamble, + tpend, + winp, + tiack, + coll, + carrier, + bkoff, + lc, + lo, + nc, + ec, + cc + ); + + `include "utility.v" + + input clk; + input rst; + + input col; + input crs; + + input fdp; + + input tprog; + input preamble; + input tpend; + output winp; + wire winp; + input tiack; + output coll; + wire coll; + output carrier; + wire carrier; + output bkoff; + wire bkoff; + output lc; + wire lc; + output lo; + reg lo; + output nc; + wire nc; + output ec; + reg ec; + output [3:0] cc; + wire [3:0] cc; + + + reg crs_r; + reg inc; + + reg ibkoff; + reg ibkoff_r; + reg icoll; + reg ilc; + reg [3:0] ccnt; + reg [9:0] bkcnt; + reg [8:0] slcnt; + reg [9:0] bkrel_c; + wire [9:0] p_rand; + reg [31:0] lfsr; + reg [31:0] lfsr_c; + reg iwinp; + + always @(posedge clk) + begin : crs_reg_proc + if (rst) + begin + crs_r <= 1'b0 ; + lo <= 1'b0 ; + inc <= 1'b0 ; + end + else + begin + if (fdp) + begin + crs_r <= 1'b0 ; + end + else + begin + crs_r <= crs ; + end + + if (tprog & !inc & !crs_r) + begin + lo <= 1'b1 ; + end + else if(!tpend & !tprog) + begin + lo <= 1'b0 ; + end + + if (tprog & crs_r) + begin + inc <= 1'b0 ; + end + else if (!tpend & !tprog) + begin + inc <= 1'b1 ; + end + end + end + + assign nc = inc ; + + always @(ccnt or p_rand) + begin : bkrel_proc + case (ccnt) + 4'b0000 : + begin + bkrel_c <= {9'b000000000, p_rand[0]} ; + end + 4'b0001 : + begin + bkrel_c <= {8'b00000000, p_rand[1:0]} ; + end + 4'b0010 : + begin + bkrel_c <= {7'b0000000, p_rand[2:0]} ; + end + 4'b0011 : + begin + bkrel_c <= {6'b000000, p_rand[3:0]} ; + end + 4'b0100 : + begin + bkrel_c <= {5'b00000, p_rand[4:0]} ; + end + 4'b0101 : + begin + bkrel_c <= {4'b0000, p_rand[5:0]} ; + end + 4'b0110 : + begin + bkrel_c <= {3'b000, p_rand[6:0]} ; + end + 4'b0111 : + begin + bkrel_c <= {2'b00, p_rand[7:0]} ; + end + 4'b1000 : + begin + bkrel_c <= {1'b0, p_rand[8:0]} ; + end + default : + begin + bkrel_c <= p_rand[9:0] ; + end + endcase + end + + always @(posedge clk) + begin : slcnt_reg_proc + if (rst) + begin + slcnt <= {9{1'b1}} ; + end + else + begin + if (tprog & !preamble & !icoll) + begin + if (slcnt != 9'b000000000) + begin + slcnt <= slcnt - 1 ; + end + end + else if (ibkoff) + begin + if (slcnt == 9'b000000000 | icoll) + begin + slcnt <= SLOT_TIME ; + end + else + begin + slcnt <= slcnt - 1 ; + end + end + else + begin + slcnt <= SLOT_TIME ; + end + end + end + + always @(posedge clk) + begin : bkcnt_reg_proc + if (rst) + begin + bkcnt <= {10{1'b1}} ; + end + else + begin + if (icoll & !ibkoff) + begin + bkcnt <= bkrel_c ; + end + else if (slcnt == 9'b000000000) + begin + bkcnt <= bkcnt - 1 ; + end + end + end + + always @(posedge clk) + begin : rand_reg_proc + if (rst) + begin + lfsr <= {31{1'b1}}; + end + else + begin + lfsr <= lfsr_c; + end + end + + always @(lfsr) + begin : lfsr_drv + + reg [31:0] lfsr_n; + + integer i; + for(i=0; i<=30; i=i+1) + begin + lfsr_n[i] = lfsr[i+1]; + end + + lfsr_n[31] = 1'b0; + if(lfsr[0]==1'b1) + begin + lfsr_n = lfsr_n ^ 32'b10000000000000000000111010100110; + end + + lfsr_c <= lfsr_n; + + end + + assign p_rand = lfsr[9:0] ; + + + always @(posedge clk) + begin : ibkoff_reg_proc + if (rst) + begin + ibkoff <= 1'b0 ; + ibkoff_r <= 1'b0 ; + end + else + begin + ibkoff_r <= ibkoff ; + if(icoll & ccnt!=4'b1111 & !iwinp & !ilc) + begin + ibkoff <= 1'b1 ; + end + else if (bkcnt == 10'b0000000000) + begin + ibkoff <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : coll_reg_proc + if (rst) + begin + icoll <= 1'b0 ; + ilc <= 1'b0 ; + ec <= 1'b0 ; + iwinp <= 1'b1 ; + ccnt <= 4'b0000 ; + end + else + begin + if ((preamble | tprog) & col & !fdp) + begin + icoll <= 1'b1 ; + end + else if (!tprog & !preamble) + begin + icoll <= 1'b0 ; + end + + if (tiack) + begin + ilc <= 1'b0 ; + end + else if (tprog & icoll & iwinp) + begin + ilc <= 1'b1 ; + end + + if (tiack) + begin + ec <= 1'b0 ; + end + else if (icoll & ccnt == 4'b1111 & tprog) + begin + ec <= 1'b1 ; + end + + if (slcnt == 9'b000000000 | !tprog) + begin + iwinp <= 1'b1 ; + end + else + begin + iwinp <= 1'b0 ; + end + + if (!tpend & !tprog) + begin + ccnt <= 4'b0000 ; + end + else if (ibkoff & !ibkoff_r) + begin + ccnt <= ccnt + 4'b0001 ; + end + end + end + + assign winp = iwinp ; + + assign lc = ilc; + + assign carrier = crs_r ; + + assign coll = icoll ; + + assign bkoff = ibkoff ; + + assign cc = ccnt ; + +endmodule diff --git a/resources/soc/rtl/MAC/csr.v b/resources/soc/rtl/MAC/csr.v new file mode 100644 index 0000000..46b8e77 --- /dev/null +++ b/resources/soc/rtl/MAC/csr.v @@ -0,0 +1,2530 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module CSR ( + clk, + rst, + interrupt, + csrreq, + csrrw, + csrbe, + csraddr, + csrdatai, + csrack, + csrdatao, + rstsofto, + tprog, + tireq, + unf, + tcsreq, + tiack, + tcsack, + fd, + ic, + etireq, + etiack, + tm, + sf, + tset, + tdes, + tbuf, + tstat, + tu, + tpollack, + ft, + tpoll, + tdbadc, + tdbad, + rcsreq, + rprog, + rcsack, + ren, + ra, + pm, + pr, + pb, + rif, + ho, + hp, + foclack, + mfclack, + oco, + mfo, + focg, + mfcg, + focl, + mfcl, + rireq, + erireq, + ru, + rpollack, + rdes, + rbuf, + rstat, + riack, + eriack, + rpoll, + rdbadc, + rdbad, + ble, + dbo, + dma_priority, + pbl, + dsl, + stoptc, + stoptlsm, + stoptfifo, + stopt, + tps, + stoprc, + stoprlsm, + stopr, + rps, + sdi, + sclk, + scs, + sdo, + mdi, + mdc, + mdo, + mden, + + insert_en_o + ); + + parameter CSRWIDTH = 32; + parameter DATAWIDTH = 32; + parameter DATADEPTH = 32; + parameter RFIFODEPTH = 9; + parameter RCDEPTH = 2; + + `include "utility.v" + + input clk; + input rst; + output interrupt; + wire interrupt; + + input csrreq; + input csrrw; + input [CSRWIDTH / 8 - 1:0] csrbe; + input [CSRDEPTH - 1:0] csraddr; + input [CSRWIDTH - 1:0] csrdatai; + output csrack; + wire csrack; + output [CSRWIDTH - 1:0] csrdatao; + reg [CSRWIDTH - 1:0] csrdatao; + + output rstsofto; + reg rstsofto; + + input tprog; + input tireq; + input unf; + input tcsreq; + output tiack; + wire tiack; + output tcsack; + wire tcsack; + output fd; + wire fd; + + input ic; + input etireq; + output etiack; + wire etiack; + output [2:0] tm; + wire [2:0] tm; + output sf; + wire sf; + + input tset; + input tdes; + input tbuf; + input tstat; + input tu; + input tpollack; + input [1:0] ft; + output tpoll; + wire tpoll; + output tdbadc; + reg tdbadc; + output [DATADEPTH - 1:0] tdbad; + wire [DATADEPTH - 1:0] tdbad; + + input rcsreq; + input rprog; + output rcsack; + wire rcsack; + output ren; + wire ren; + output ra; + wire ra; + output pm; + wire pm; + output pr; + wire pr; + output pb; + wire pb; + output rif; + wire rif; + output ho; + wire ho; + output hp; + wire hp; + + input foclack; + input mfclack; + input oco; + input mfo; + input [10:0] focg; + input [15:0] mfcg; + output focl; + reg focl; + output mfcl; + reg mfcl; + + input rireq; + input erireq; + input ru; + input rpollack; + input rdes; + input rbuf; + input rstat; + output riack; + wire riack; + output eriack; + wire eriack; + output rpoll; + reg rpoll; + output rdbadc; + reg rdbadc; + output [DATADEPTH - 1:0] rdbad; + wire [DATADEPTH - 1:0] rdbad; + + output ble; + wire ble; + output dbo; + wire dbo; + output [1:0] dma_priority; + wire [1:0] dma_priority; + output [5:0] pbl; + wire [5:0] pbl; + output [4:0] dsl; + wire [4:0] dsl; + + input stoptc; + input stoptlsm; + input stoptfifo; + output stopt; + wire stopt; + output tps; + reg tps; + + input stoprc; + input stoprlsm; + output stopr; + wire stopr; + output rps; + reg rps; + + input sdi; + output sclk; + wire sclk; + output scs; + wire scs; + output sdo; + wire sdo; + + input mdi; + output mdc; + wire mdc; + output mdo; + wire mdo; + output mden; + wire mden; + + + output insert_en_o; + wire insert_en_o; + + reg [31:0] csrdata_c; + reg [3:0] csrdbe_c; + wire [1:0] csraddr10; + wire [5:0] csraddr72; + wire [1:0] csrbe10; + wire [31:0] csr0; + wire [31:0] csr5; + wire [31:0] csr6; + wire [31:0] csr7; + wire [31:0] csr8; + wire [31:0] csr9; + wire [31:0] csr10; + wire [31:0] csr11; + + reg csr0_dbo; + reg [2:0] csr0_tap; + reg [5:0] csr0_pbl; + reg csr0_ble; + reg [4:0] csr0_dsl; + reg csr0_bar; + reg csr0_swr; + + reg [31:0] csr3; + + reg [31:0] csr4; + + reg [2:0] csr5_ts; + reg [2:0] csr5_rs; + reg csr5_nis; + reg csr5_ais; + reg csr5_eri; + reg csr5_gte; + reg csr5_eti; + reg csr5_rps; + reg csr5_ru; + reg csr5_ri; + reg csr5_unf; + reg csr5_tu; + reg csr5_tps; + reg csr5_ti; + + reg csr6_ra; + reg csr6_ttm; + reg csr6_sf; + reg [1:0] csr6_tr; + reg csr6_st; + reg csr6_fd; + reg csr6_pm; + reg csr6_pr; + reg csr6_if; + reg csr6_pb; + reg csr6_ho; + reg csr6_sr; + reg csr6_hp; + + reg csr7_nie; + reg csr7_aie; + reg csr7_ere; + reg csr7_gte; + reg csr7_ete; + reg csr7_rse; + reg csr7_rue; + reg csr7_rie; + reg csr7_une; + reg csr7_tue; + reg csr7_tse; + reg csr7_tie; + + reg [10:0] csr8_foc; + reg csr8_oco; + reg [15:0] csr8_mfc; + reg csr8_mfo; + reg csr8read; + + reg csr9_mdi; + reg csr9_mii; + reg csr9_mdo; + reg csr9_mdc; + reg csr9_sdi; + reg csr9_sclk; + reg csr9_scs; + reg csr9_sdo; + + reg csr10_insert_en; + + reg csr11_cs; + reg [3:0] csr11_tt; + reg [2:0] csr11_ntp; + reg [3:0] csr11_rt; + reg [2:0] csr11_nrp; + reg csr11_con; + reg [15:0] csr11_tim; + reg csr11wr; + + reg tapwr; + reg tpollcmd; + reg itpoll; + reg [2:0] tapcnt; + + reg [1:0] tpsm_c; + reg [1:0] tpsm; + reg tstopcmd; + reg tstartcmd; + reg stoptc_r; + reg stoptlsm_r; + reg stoptfifo_r; + wire [2:0] ts_c; + + reg [1:0] rpsm_c; + reg [1:0] rpsm; + reg rstopcmd; + reg rstartcmd; + reg stoprc_r; + reg stoprlsm_r; + wire [2:0] rs_c; + + reg rpollcmd; + + wire csr5wr_c; + reg csr5wr; + reg gte; + reg iint; + reg rireq_r; + reg rireq_r2; + reg eri; + reg erireq_r; + reg erireq_r2; + reg tireq_r; + reg tireq_r2; + reg eti; + reg etireq_r; + reg etireq_r2; + reg unfi; + reg unf_r; + reg unf_r2; + reg tui; + reg tu_r; + reg tu_r2; + reg rui; + reg ru_r; + reg ru_r2; + reg iic; + + reg rcsreq_r; + reg rcsreq_r1; + reg rimprog; + reg [3:0] rcscnt; + reg rcs2048; + reg rcs128; + reg [3:0] rtcnt; + reg [2:0] rcnt; + reg rimex; + + reg timprog; + reg [7:0] ttcnt; + reg [2:0] tcnt; + reg timex; + reg tcsreq_r1; + reg tcsreq_r2; + reg [3:0] tcscnt; + reg tcs2048; + reg tcs128; + + reg [10:0] foc_c; + reg [15:0] mfc_c; + reg [10:0] focg_r; + reg [15:0] mfcg_r; + + reg gstart; + reg gstart_r; + reg [15:0] gcnt; + wire [CSRWIDTH_MAX + 1:0] csrdatai_max; + wire [CSRWIDTH_MAX + 1:0] czero_max; + wire [CSRWIDTH_MAX/8 + 1:0] csrbe_max; + + assign csraddr10 = csraddr[1:0] ; + + assign csraddr72 = csraddr[7:2] ; + + assign csrbe10 = (CSRWIDTH == 16) ? csrbe_max[1:0] : {2{1'b1}} ; + + always @(csrdatai_max or csrbe_max or csraddr or csraddr10 or csrbe10) + begin : csrdata_proc + csrdata_c <= {32{1'b1}} ; + csrdbe_c <= {4{1'b1}} ; + case (CSRWIDTH) + 8 : + begin + if (csrbe_max[0]) + begin + case (csraddr10) + 2'b00 : + begin + csrdata_c[7:0] <= csrdatai_max[CSRWIDTH-1:0] ; + csrdbe_c <= 4'b0001 ; + end + 2'b01 : + begin + csrdata_c[15:8] <= csrdatai_max[CSRWIDTH-1:0] ; + csrdbe_c <= 4'b0010 ; + end + 2'b10 : + begin + csrdata_c[23:16] <= csrdatai_max[CSRWIDTH-1:0] ; + csrdbe_c <= 4'b0100 ; + end + default : + begin + csrdata_c[31:24] <= csrdatai_max[CSRWIDTH-1:0] ; + csrdbe_c <= 4'b1000 ; + end + endcase + end + else + begin + csrdbe_c <= 4'b0000 ; + end + end + 16 : + begin + case (csrbe10) + 2'b11 : + begin + if (csraddr[1]) + begin + csrdata_c[31:16] <= csrdatai_max[CSRWIDTH-1:0] ; + csrdbe_c <= 4'b1100 ; + end + else + begin + csrdata_c[15:0] <= csrdatai_max[CSRWIDTH-1:0] ; + csrdbe_c <= 4'b0011 ; + end + end + 2'b10 : + begin + if (csraddr[1]) + begin + csrdata_c[31:24] <= + csrdatai_max[CSRWIDTH - 1:CSRWIDTH / 2] ; + csrdbe_c <= 4'b1000 ; + end + else + begin + csrdata_c[15: 8] <= + csrdatai_max[CSRWIDTH - 1:CSRWIDTH / 2] ; + csrdbe_c <= 4'b0010 ; + end + end + 2'b01 : + begin + if (csraddr[1]) + begin + csrdata_c[23:16] <= csrdatai_max[7:0] ; + csrdbe_c <= 4'b0100 ; + end + else + begin + csrdata_c[7:0] <= csrdatai_max[7:0] ; + csrdbe_c <= 4'b0001 ; + end + end + default : + begin + csrdbe_c <= 4'b0000 ; + end + endcase + end + default : + begin + csrdata_c <= csrdatai_max[31:0] ; + csrdbe_c <= csrbe_max[3:0] ; + end + endcase + end + + always @(posedge clk) + begin : csr0_reg_proc + if (rst) + begin + csr0_dbo <= CSR0_RV[20] ; + csr0_tap <= CSR0_RV[19:17] ; + csr0_pbl <= CSR0_RV[13:8] ; + csr0_ble <= CSR0_RV[7] ; + csr0_dsl <= CSR0_RV[6:2] ; + csr0_bar <= CSR0_RV[1] ; + csr0_swr <= CSR0_RV[0] ; + tapwr <= 1'b0 ; + end + else + begin + if (!csrrw & csrreq & csraddr72 == CSR0_ID) + begin + if (csrdbe_c[2]) + begin + csr0_dbo <= csrdata_c[20] ; + csr0_tap <= csrdata_c[19:17] ; + tapwr <= 1'b1 ; + end + else + begin + tapwr <= 1'b0 ; + end + if (csrdbe_c[1]) + begin + csr0_pbl <= csrdata_c[13:8] ; + end + if (csrdbe_c[0]) + begin + csr0_ble <= csrdata_c[7] ; + csr0_dsl <= csrdata_c[6:2] ; + csr0_bar <= csrdata_c[1] ; + csr0_swr <= csrdata_c[0] ; + end + end + else + begin + tapwr <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : tpoolcmd_reg_proc + if (rst) + begin + tpollcmd <= 1'b0 ; + end + else + begin + if (!csrrw & csrreq & csraddr72 == CSR1_ID) + begin + tpollcmd <= 1'b1 ; + end + else + begin + tpollcmd <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : rpoolcmd_reg_proc + if (rst) + begin + rpollcmd <= 1'b0 ; + end + else + begin + if (!csrrw & csrreq & csraddr72 == CSR2_ID) + begin + rpollcmd <= 1'b1 ; + end + else + begin + rpollcmd <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : csr3_reg_proc + if (rst) + begin + csr3 <= CSR3_RV ; + end + else + begin + if (!csrrw & csrreq & csraddr72 == CSR3_ID) + begin + if (csrdbe_c[0]) + begin + csr3[7:0] <= csrdata_c[7:0] ; + end + if (csrdbe_c[1]) + begin + csr3[15:8] <= csrdata_c[15:8] ; + end + if (csrdbe_c[2]) + begin + csr3[23:16] <= csrdata_c[23:16] ; + end + if (csrdbe_c[3]) + begin + csr3[31:24] <= csrdata_c[31:24] ; + end + end + end + end + + assign rdbad = csr3[DATADEPTH - 1:0] ; + + always @(posedge clk) + begin : rdbadc_reg_proc + if (rst) + begin + rdbadc <= 1'b1 ; + end + else + begin + if (!csrrw & csrreq & csraddr72 == CSR3_ID & rpsm == PSM_STOP) + begin + rdbadc <= 1'b1 ; + end + else if (rpsm == PSM_RUN) + begin + rdbadc <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : csr4_reg_proc + if (rst) + begin + csr4 <= CSR4_RV ; + end + else + begin + if (!csrrw & csrreq & csraddr72 == CSR4_ID) + begin + if (csrdbe_c[0]) + begin + csr4[7:0] <= csrdata_c[7:0] ; + end + if (csrdbe_c[1]) + begin + csr4[15:8] <= csrdata_c[15:8] ; + end + if (csrdbe_c[2]) + begin + csr4[23:16] <= csrdata_c[23:16] ; + end + if (csrdbe_c[3]) + begin + csr4[31:24] <= csrdata_c[31:24] ; + end + end + end + end + + always @(posedge clk) + begin : tdbadc_reg_proc + if (rst) + begin + tdbadc <= 1'b1 ; + end + else + begin + if (!csrrw & csrreq & csraddr72 == CSR4_ID) + begin + tdbadc <= 1'b1 ; + end + else if (tpsm == PSM_RUN) + begin + tdbadc <= 1'b0 ; + end + end + end + + assign csr5wr_c = (!csrrw & csrreq & csraddr72 == CSR5_ID) ? 1'b1 : + 1'b0 ; + + always @(posedge clk) + begin : csr5wr_reg_proc + if (rst) + begin + csr5wr <= 1'b0 ; + end + else + begin + csr5wr <= csr5wr_c ; + end + end + + always @(posedge clk) + begin : csr5_reg_proc + if (rst) + begin + csr5_ts <= CSR5_RV[22:20] ; + csr5_rs <= CSR5_RV[19:17] ; + csr5_nis <= CSR5_RV[16] ; + csr5_ais <= CSR5_RV[15] ; + csr5_eri <= CSR5_RV[14] ; + csr5_gte <= CSR5_RV[11] ; + csr5_eti <= CSR5_RV[10] ; + csr5_rps <= CSR5_RV[8] ; + csr5_ru <= CSR5_RV[7] ; + csr5_ri <= CSR5_RV[6] ; + csr5_unf <= CSR5_RV[5] ; + csr5_tu <= CSR5_RV[2] ; + csr5_tps <= CSR5_RV[1] ; + csr5_ti <= CSR5_RV[0] ; + end + else + begin + if (csr5wr_c) + begin + if (csrdbe_c[2]) + begin + csr5_nis <= ~csrdata_c[16] & csr5_nis ; + end + if (csrdbe_c[1]) + begin + csr5_ais <= ~csrdata_c[15] & csr5_ais ; + csr5_eri <= ~csrdata_c[14] & csr5_eri ; + csr5_gte <= ~csrdata_c[11] & csr5_gte ; + csr5_eti <= ~csrdata_c[10] & csr5_eti ; + csr5_rps <= ~csrdata_c[8] & csr5_rps ; + end + if (csrdbe_c[0]) + begin + csr5_ru <= ~csrdata_c[7] & csr5_ru ; + csr5_ri <= ~csrdata_c[6] & csr5_ri ; + csr5_unf <= ~csrdata_c[5] & csr5_unf ; + csr5_tu <= ~csrdata_c[2] & csr5_tu ; + csr5_tps <= ~csrdata_c[1] & csr5_tps ; + csr5_ti <= ~csrdata_c[0] & csr5_ti ; + end + end + else + begin + if (timex) + begin + csr5_ti <= 1'b1 ; + end + if (rimex) + begin + csr5_ri <= 1'b1 ; + end + if (eti) + begin + csr5_eti <= 1'b1 ; + end + if (eri) + begin + csr5_eri <= 1'b1 ; + end + if (gte) + begin + csr5_gte <= 1'b1 ; + end + if (tpsm_c == PSM_STOP & + (tpsm == PSM_RUN | tpsm == PSM_SUSPEND)) + begin + csr5_tps <= 1'b1 ; + end + if (rpsm_c == PSM_STOP & + (rpsm == PSM_RUN | rpsm == PSM_SUSPEND)) + begin + csr5_rps <= 1'b1 ; + end + if (rui) + begin + csr5_ru <= 1'b1 ; + end + if (tui) + begin + csr5_tu <= 1'b1 ; + end + if (unfi) + begin + csr5_unf <= 1'b1 ; + end + if ((csr5_ri & csr7_rie) | + (csr5_ti & csr7_tie) | + (csr5_eri & csr7_ere) | + (csr5_tu & csr7_tue) | + (csr5_gte & csr7_gte)) + begin + csr5_nis <= 1'b1 ; + end + else + begin + csr5_nis <= 1'b0 ; + end + if ((csr5_eti & csr7_ete) | + (csr5_rps & csr7_rse) | + (csr5_ru & csr7_rue) | + (csr5_unf & csr7_une) | + (csr5_tps & csr7_tse)) + begin + csr5_ais <= 1'b1 ; + end + else + begin + csr5_ais <= 1'b0 ; + end + csr5_ts <= ts_c ; + csr5_rs <= rs_c ; + end + end + end + + always @(posedge clk) + begin : csr6_reg_proc + if (rst) + begin + csr6_ra <= CSR6_RV[30] ; + csr6_ttm <= CSR6_RV[22] ; + csr6_sf <= CSR6_RV[21] ; + csr6_tr <= CSR6_RV[15:14] ; + csr6_st <= CSR6_RV[13] ; + csr6_fd <= CSR6_RV[9] ; + csr6_pm <= CSR6_RV[7] ; + csr6_pr <= CSR6_RV[6] ; + csr6_if <= CSR6_RV[4] ; + csr6_pb <= CSR6_RV[3] ; + csr6_ho <= CSR6_RV[2] ; + csr6_sr <= CSR6_RV[1] ; + csr6_hp <= CSR6_RV[0] ; + end + else + begin + if (!csrrw & csrreq & csraddr72 == CSR6_ID) + begin + if (csrdbe_c[3]) + begin + csr6_ra <= csrdata_c[30] ; + end + if (csrdbe_c[2]) + begin + csr6_ttm <= csrdata_c[22] ; + if (tpsm == PSM_STOP) + begin + csr6_sf <= csrdata_c[21] ; + end + end + if (csrdbe_c[1]) + begin + csr6_tr <= csrdata_c[15:14] ; + csr6_st <= csrdata_c[13] ; + csr6_fd <= csrdata_c[9] ; + end + if (csrdbe_c[0]) + begin + csr6_pm <= csrdata_c[7] ; + csr6_pr <= csrdata_c[6] ; + csr6_pb <= csrdata_c[3] ; + csr6_sr <= csrdata_c[1] ; + end + end + case (ft) + FT_PERFECT : + begin + csr6_ho <= 1'b0 ; + csr6_if <= 1'b0 ; + csr6_hp <= 1'b0 ; + end + FT_HASH : + begin + csr6_ho <= 1'b0 ; + csr6_if <= 1'b0 ; + csr6_hp <= 1'b1 ; + end + FT_INVERSE : + begin + csr6_ho <= 1'b0 ; + csr6_if <= 1'b1 ; + csr6_hp <= 1'b0 ; + end + default : + begin + csr6_ho <= 1'b1 ; + csr6_if <= 1'b0 ; + csr6_hp <= 1'b1 ; + end + endcase + end + end + + always @(posedge clk) + begin : csr7_reg_proc + if (rst) + begin + csr7_nie <= CSR7_RV[16] ; + csr7_aie <= CSR7_RV[15] ; + csr7_ere <= CSR7_RV[14] ; + csr7_gte <= CSR7_RV[11] ; + csr7_ete <= CSR7_RV[10] ; + csr7_rse <= CSR7_RV[8] ; + csr7_rue <= CSR7_RV[7] ; + csr7_rie <= CSR7_RV[6] ; + csr7_une <= CSR7_RV[5] ; + csr7_tue <= CSR7_RV[2] ; + csr7_tse <= CSR7_RV[1] ; + csr7_tie <= CSR7_RV[0] ; + end + else + begin + if (!csrrw & csrreq & csraddr72 == CSR7_ID) + begin + if (csrdbe_c[2]) + begin + csr7_nie <= csrdata_c[16] ; + end + if (csrdbe_c[1]) + begin + csr7_aie <= csrdata_c[15] ; + csr7_ere <= csrdata_c[14] ; + csr7_gte <= csrdata_c[11] ; + csr7_ete <= csrdata_c[10] ; + csr7_rse <= csrdata_c[8] ; + end + if (csrdbe_c[0]) + begin + csr7_rue <= csrdata_c[7] ; + csr7_rie <= csrdata_c[6] ; + csr7_une <= csrdata_c[5] ; + csr7_tue <= csrdata_c[2] ; + csr7_tse <= csrdata_c[1] ; + csr7_tie <= csrdata_c[0] ; + end + end + end + end + + always @(posedge clk) + begin : csr8_reg_proc + if (rst) + begin + csr8_oco <= 1'b0 ; + csr8_mfo <= 1'b0 ; + csr8_foc <= {11{1'b0}} ; + csr8_mfc <= {16{1'b0}} ; + end + else + begin + if (!(csrrw & csrreq & csraddr72 == CSR8_ID)) + begin + if (!csr8read) + begin + csr8_foc <= foc_c ; + csr8_mfc <= mfc_c ; + csr8_oco <= oco ; + csr8_mfo <= mfo ; + end + end + end + end + + always @(posedge clk) + begin : csr8read_reg_proc + if (rst) + begin + csr8read <= 1'b0 ; + end + else + begin + if (csrrw & csrreq & csraddr72 == CSR8_ID) + begin + csr8read <= csrdbe_c[3] ; + end + else + begin + csr8read <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : csr9_reg_proc + if (rst) + begin + csr9_mdi <= CSR9_RV[19] ; + csr9_mii <= CSR9_RV[18] ; + csr9_mdo <= CSR9_RV[17] ; + csr9_mdc <= CSR9_RV[16] ; + csr9_sdi <= CSR9_RV[2] ; + csr9_sclk <= CSR9_RV[1] ; + csr9_scs <= CSR9_RV[0] ; + csr9_sdo <= CSR9_RV[3] ; + end + else + begin + if (!csrrw & csrreq & csraddr72 == CSR9_ID) + begin + if (csrdbe_c[0]) + begin + csr9_sclk <= csrdata_c[1] ; + csr9_scs <= csrdata_c[0] ; + csr9_sdo <= csrdata_c[3] ; + end + if (csrdbe_c[2]) + begin + csr9_mii <= csrdata_c[18] ; + csr9_mdo <= csrdata_c[17] ; + csr9_mdc <= csrdata_c[16] ; + end + end + csr9_mdi <= mdi ; + csr9_sdi <= sdi ; + end + end + + always @(posedge clk) + begin : csr10_reg_proc + if (rst) + begin + csr10_insert_en <= CSR10_RV[0]; + end + else + begin + if (!csrrw & csrreq & csraddr72 == CSR10_ID) + begin + csr10_insert_en <= csrdata_c[0]; + end + end + end + + always @(posedge clk) + begin : csr11_reg_proc + if (rst) + begin + csr11_cs <= CSR11_RV[31] ; + csr11_tt <= CSR11_RV[30:27] ; + csr11_ntp <= CSR11_RV[26:24] ; + csr11_rt <= CSR11_RV[23:20] ; + csr11_nrp <= CSR11_RV[19:17] ; + csr11_con <= CSR11_RV[16] ; + csr11_tim <= CSR11_RV[15:0] ; + end + else + begin + if (!csrrw & csrreq & csraddr72 == CSR11_ID) + begin + if (csrdbe_c[3]) + begin + csr11_cs <= csrdata_c[31] ; + csr11_tt <= csrdata_c[30:27] ; + csr11_ntp <= csrdata_c[26:24] ; + end + if (csrdbe_c[2]) + begin + csr11_rt <= csrdata_c[23:20] ; + csr11_nrp <= csrdata_c[19:17] ; + csr11_con <= csrdata_c[16] ; + end + if (csrdbe_c[1]) + begin + csr11_tim[15:8] <= csrdata_c[15:8] ; + end + if (csrdbe_c[0]) + begin + csr11_tim[7:0] <= csrdata_c[7:0] ; + end + end + end + end + + always @(posedge clk) + begin : csr11wr_reg_proc + if (rst) + begin + csr11wr <= 1'b0 ; + end + else + begin + if (!csrrw & csrreq & csraddr72 == CSR11_ID) + begin + csr11wr <= 1'b1 ; + end + else + begin + csr11wr <= 1'b0 ; + end + end + end + + assign csr0 = {CSR0_RV[31:26], CSR0_RV[25:21], csr0_dbo, csr0_tap, + CSR0_RV[16:14], csr0_pbl, csr0_ble, + csr0_dsl, csr0_bar, (rst | csr0_swr)} ; + + assign csr5 = {CSR5_RV[31:23], csr5_ts, csr5_rs, csr5_nis, + csr5_ais, csr5_eri, CSR5_RV[13:12], csr5_gte, csr5_eti, + CSR5_RV[9], csr5_rps, csr5_ru, csr5_ri, csr5_unf, + CSR5_RV[4:3], csr5_tu, csr5_tps, csr5_ti} ; + + assign csr6 = {CSR6_RV[31], csr6_ra, CSR6_RV[29:26], + CSR6_RV[25:23], csr6_ttm, csr6_sf, CSR6_RV[20], + CSR6_RV[19], CSR6_RV[18], CSR6_RV[17], CSR6_RV[16], + csr6_tr, csr6_st, CSR6_RV[13], CSR6_RV[12:11], + csr6_fd, CSR6_RV[8], csr6_pm, csr6_pr, CSR6_RV[5], + csr6_if, csr6_pb, csr6_ho, csr6_sr, csr6_hp} ; + + assign csr7 = {CSR7_RV[31:17], csr7_nie, csr7_aie, csr7_ere, + CSR7_RV[13:12], csr7_gte, csr7_ete, CSR6_RV[9], + csr7_rse, csr7_rue, csr7_rie, csr7_une, + CSR7_RV[4:3], csr7_tue, csr7_tse, csr7_tie} ; + + assign csr8 = {CSR8_RV[31:29], csr8_oco, csr8_foc, + csr8_mfo, csr8_mfc} ; + + assign csr9 = {CSR9_RV[31:20], csr9_mdi, csr9_mii, csr9_mdo, + csr9_mdc, CSR9_RV[15:4], csr9_sdo, csr9_sdi, + csr9_sclk, csr9_scs} ; + + assign csr10 = {CSR10_RV[31:1], csr10_insert_en}; + + assign csr11 = {csr11_cs, ttcnt[7:4], tcnt[2:0], rtcnt[3:0], + rcnt[2:0], csr11_con, gcnt} ; + + always @(csr0 or + csr3 or + csr4 or + csr5 or + csr6 or + csr7 or + csr8 or + csr9 or + csr10 or + csr11 or + csraddr or + csraddr72 or + csraddr10) + begin : csrmux_proc + case (CSRWIDTH) + 8 : + begin + case (csraddr10) + 2'b00 : + begin + case (csraddr72) + CSR0_ID : + begin + csrdatao <= csr0[7:0] ; + end + CSR3_ID : + begin + csrdatao <= csr3[7:0] ; + end + CSR4_ID : + begin + csrdatao <= csr4[7:0] ; + end + CSR5_ID : + begin + csrdatao <= csr5[7:0] ; + end + CSR6_ID : + begin + csrdatao <= csr6[7:0] ; + end + CSR7_ID : + begin + csrdatao <= csr7[7:0] ; + end + CSR8_ID : + begin + csrdatao <= csr8[7:0] ; + end + CSR9_ID : + begin + csrdatao <= csr9[7:0] ; + end + CSR10_ID : + begin + csrdatao <= csr10[7:0] ; + end + CSR11_ID : + begin + csrdatao <= csr11[7:0] ; + end + default : + begin + csrdatao <= {CSRWIDTH{1'b0}} ; + end + endcase + end + 2'b01 : + begin + case (csraddr72) + CSR0_ID : + begin + csrdatao <= csr0[15:8] ; + end + CSR3_ID : + begin + csrdatao <= csr3[15:8] ; + end + CSR4_ID : + begin + csrdatao <= csr4[15:8] ; + end + CSR5_ID : + begin + csrdatao <= csr5[15:8] ; + end + CSR6_ID : + begin + csrdatao <= csr6[15:8] ; + end + CSR7_ID : + begin + csrdatao <= csr7[15:8] ; + end + CSR8_ID : + begin + csrdatao <= csr8[15:8] ; + end + CSR9_ID : + begin + csrdatao <= csr9[15:8] ; + end + CSR10_ID : + begin + csrdatao <= csr10[15:8] ; + end + CSR11_ID : + begin + csrdatao <= csr11[15:8] ; + end + default : + begin + csrdatao <= {CSRWIDTH{1'b0}} ; + end + endcase + end + 2'b10 : + begin + case (csraddr72) + CSR0_ID : + begin + csrdatao <= csr0[23:16] ; + end + CSR3_ID : + begin + csrdatao <= csr3[23:16] ; + end + CSR4_ID : + begin + csrdatao <= csr4[23:16] ; + end + CSR5_ID : + begin + csrdatao <= csr5[23:16] ; + end + CSR6_ID : + begin + csrdatao <= csr6[23:16] ; + end + CSR7_ID : + begin + csrdatao <= csr7[23:16] ; + end + CSR8_ID : + begin + csrdatao <= csr8[23:16] ; + end + CSR9_ID : + begin + csrdatao <= csr9[23:16] ; + end + CSR10_ID : + begin + csrdatao <= csr10[23:16] ; + end + CSR11_ID : + begin + csrdatao <= csr11[23:16] ; + end + default : + begin + csrdatao <= {CSRWIDTH{1'b0}} ; + end + endcase + end + 2'b11 : + begin + case (csraddr72) + CSR0_ID : + begin + csrdatao <= csr0[31:24] ; + end + CSR3_ID : + begin + csrdatao <= csr3[31:24] ; + end + CSR4_ID : + begin + csrdatao <= csr4[31:24] ; + end + CSR5_ID : + begin + csrdatao <= csr5[31:24] ; + end + CSR6_ID : + begin + csrdatao <= csr6[31:24] ; + end + CSR7_ID : + begin + csrdatao <= csr7[31:24] ; + end + CSR8_ID : + begin + csrdatao <= csr8[31:24] ; + end + CSR9_ID : + begin + csrdatao <= csr9[31:24] ; + end + CSR10_ID : + begin + csrdatao <= csr10[31:24] ; + end + CSR11_ID : + begin + csrdatao <= csr11[31:24] ; + end + default : + begin + csrdatao <= {CSRWIDTH{1'b0}} ; + end + endcase + end + default : + begin + csrdatao <= {CSRWIDTH{1'b0}} ; + end + endcase + end + 16 : + begin + case (csraddr[1]) + 1'b0 : + begin + case (csraddr72) + CSR0_ID : + begin + csrdatao <= csr0[15:0] ; + end + CSR3_ID : + begin + csrdatao <= csr3[15:0] ; + end + CSR4_ID : + begin + csrdatao <= csr4[15:0] ; + end + CSR5_ID : + begin + csrdatao <= csr5[15:0] ; + end + CSR6_ID : + begin + csrdatao <= csr6[15:0] ; + end + CSR7_ID : + begin + csrdatao <= csr7[15:0] ; + end + CSR8_ID : + begin + csrdatao <= csr8[15:0] ; + end + CSR9_ID : + begin + csrdatao <= csr9[15:0] ; + end + CSR10_ID : + begin + csrdatao <= csr10[15:0] ; + end + CSR11_ID : + begin + csrdatao <= csr11[15:0] ; + end + default : + begin + csrdatao <= {CSRWIDTH{1'b0}} ; + end + endcase + end + 1'b1 : + begin + case (csraddr72) + CSR0_ID : + begin + csrdatao <= csr0[31:16] ; + end + CSR3_ID : + begin + csrdatao <= csr3[31:16] ; + end + CSR4_ID : + begin + csrdatao <= csr4[31:16] ; + end + CSR5_ID : + begin + csrdatao <= csr5[31:16] ; + end + CSR6_ID : + begin + csrdatao <= csr6[31:16] ; + end + CSR7_ID : + begin + csrdatao <= csr7[31:16] ; + end + CSR8_ID : + begin + csrdatao <= csr8[31:16] ; + end + CSR9_ID : + begin + csrdatao <= csr9[31:16] ; + end + CSR10_ID : + begin + csrdatao <= csr10[31:16] ; + end + CSR11_ID : + begin + csrdatao <= csr11[31:16] ; + end + default : + begin + csrdatao <= {CSRWIDTH{1'b0}} ; + end + endcase + end + default : + begin + csrdatao <= {CSRWIDTH{1'b0}} ; + end + endcase + end + default : + begin + case (csraddr72) + CSR0_ID : + begin + csrdatao <= csr0 ; + end + CSR3_ID : + begin + csrdatao <= csr3 ; + end + CSR4_ID : + begin + csrdatao <= csr4 ; + end + CSR5_ID : + begin + csrdatao <= csr5 ; + end + CSR6_ID : + begin + csrdatao <= csr6 ; + end + CSR7_ID : + begin + csrdatao <= csr7 ; + end + CSR8_ID : + begin + csrdatao <= csr8 ; + end + CSR9_ID : + begin + csrdatao <= csr9 ; + end + CSR10_ID : + begin + csrdatao <= csr10 ; + end + CSR11_ID : + begin + csrdatao <= csr11 ; + end + default : + begin + csrdatao <= {CSRWIDTH{1'b0}} ; + end + endcase + end + endcase + end + + assign csrack = 1'b1 ; + + assign dma_priority = (csr0_bar & !tprog) ? 2'b01 : + (csr0_bar & tprog) ? 2'b10 : + 2'b00 ; + + assign dbo = csr0_dbo ; + + assign pbl = csr0_pbl ; + + assign dsl = csr0_dsl ; + + assign ble = csr0_ble ; + + assign tdbad = csr4[DATADEPTH - 1:0] ; + + always @(posedge clk) + begin : itpoll_reg_proc + if (rst) + begin + itpoll <= 1'b0 ; + end + else + begin + if (((((csr0_tap == 3'b001 | + csr0_tap == 3'b010 | + csr0_tap == 3'b011) & tcs2048) | + ((csr0_tap == 3'b100 | + csr0_tap == 3'b101 | + csr0_tap == 3'b110 | + csr0_tap == 3'b111) & tcs128)) & + tapcnt == 3'b000 & tpsm == PSM_SUSPEND) | + tpollcmd | tstartcmd) + begin + itpoll <= 1'b1 ; + end + else if (tpollack) + begin + itpoll <= 1'b0 ; + end + end + end + + assign tpoll = itpoll ; + + always @(posedge clk) + begin : tap_reg_proc + if (rst) + begin + tapcnt <= {3{1'b1}} ; + end + else + begin + if (((csr0_tap == 3'b001 | + csr0_tap == 3'b010 | + csr0_tap == 3'b011) & (tcs2048 | tapwr)) | + ((csr0_tap == 3'b100 | + csr0_tap == 3'b101 | + csr0_tap == 3'b110 | + csr0_tap == 3'b111) & (tcs128 | tapwr))) + begin + if (tapcnt == 3'b000 | tapwr) + begin + case (csr0_tap) + 3'b001 : + begin + tapcnt <= 3'b000 ; + end + 3'b010 : + begin + tapcnt <= 3'b010 ; + end + 3'b011 : + begin + tapcnt <= 3'b110 ; + end + 3'b100 : + begin + tapcnt <= 3'b000 ; + end + 3'b101 : + begin + tapcnt <= 3'b001 ; + end + 3'b110 : + begin + tapcnt <= 3'b010 ; + end + default : + begin + tapcnt <= 3'b111 ; + end + endcase + end + else + begin + tapcnt <= tapcnt - 1 ; + end + end + end + end + + assign tm = {csr6_ttm, csr6_tr} ; + + assign sf = csr6_sf ; + + always @(posedge clk) + begin : tim_reg_proc + if (rst) + begin + timprog <= 1'b0 ; + timex <= 1'b0 ; + ttcnt <= {8{1'b1}} ; + tcnt <= {3{1'b1}} ; + end + else + begin + if (csr5_ti) + begin + timprog <= 1'b0 ; + end + else if (tireq_r & !tireq_r2) + begin + timprog <= 1'b1 ; + end + + if (csr5_ti) + begin + timex <= 1'b0 ; + end + else if (timprog & + ((ttcnt == 8'b00000000 & csr11_tt != 4'b0000) | + (tcnt == 3'b000 & csr11_ntp != 3'b000) | + (iic) | + (csr11_tt == 4'b0000 & csr11_ntp == 3'b000))) + begin + timex <= 1'b1 ; + end + + if ((tireq_r & !tireq_r2) | csr5_ti | csr11wr) + begin + ttcnt <= {csr11_tt, 4'b0000} ; + end + else if (((tcs128 & csr11_cs) | + (tcs2048 & !csr11_cs)) & + ttcnt != 8'b00000000 & timprog) + begin + ttcnt <= ttcnt - 1 ; + end + + if (csr5_ti | csr11wr) + begin + tcnt <= csr11_ntp ; + end + else if (tireq_r & !tireq_r2 & + tcnt != 3'b000 & csr11_ntp != 3'b000) + begin + tcnt <= tcnt - 1 ; + end + end + end + + always @(posedge clk) + begin : tcscnt_reg_proc + if (rst) + begin + tcsreq_r1 <= 1'b0 ; + tcsreq_r2 <= 1'b0 ; + tcs2048 <= 1'b0 ; + tcs128 <= 1'b0 ; + tcscnt <= {4{1'b1}} ; + end + else + begin + tcsreq_r1 <= tcsreq ; + tcsreq_r2 <= tcsreq_r1 ; + + if (tcs128) + begin + if (tcscnt == 4'b0000) + begin + tcscnt <= 4'b1111 ; + end + else + begin + tcscnt <= tcscnt - 1 ; + end + end + + if (tcsreq_r1 & !tcsreq_r2) + begin + tcs128 <= 1'b1 ; + end + else + begin + tcs128 <= 1'b0 ; + end + + if (tcscnt == 4'b0000 & tcs128) + begin + tcs2048 <= 1'b1 ; + end + else + begin + tcs2048 <= 1'b0 ; + end + + end + end + + assign tcsack = tcsreq_r2 ; + + always @(posedge clk) + begin : st_reg_proc + if (rst) + begin + tstopcmd <= 1'b1 ; + tstartcmd <= 1'b0 ; + end + else + begin + if (tstartcmd) + begin + tstopcmd <= 1'b0 ; + end + else if (!csrrw & csrreq & !(csrdata_c[13]) & + csraddr72 == CSR6_ID & (csrdbe_c[1])) + begin + tstopcmd <= 1'b1 ; + end + + if (tpsm == PSM_RUN | tpsm == PSM_SUSPEND) + begin + tstartcmd <= 1'b0 ; + end + else if (!csrrw & csrreq & (csrdata_c[13]) & + csraddr72 == CSR6_ID & (csrdbe_c[1])) + begin + tstartcmd <= 1'b1 ; + end + + end + end + + assign ts_c = (tpsm == PSM_STOP) ? 3'b000 : + (tpsm == PSM_SUSPEND) ? 3'b110 : + (tstat) ? 3'b111 : + (tdes) ? 3'b001 : + (tset) ? 3'b101 : + (tbuf) ? 3'b011 : + (tprog) ? 3'b010 : + csr5_ts ; + + always @(posedge clk) + begin : tpsack_reg_proc + if (rst) + begin + stoptc_r <= 1'b0 ; + stoptlsm_r <= 1'b0 ; + stoptfifo_r <= 1'b0 ; + end + else + begin + stoptc_r <= stoptc ; + stoptlsm_r <= stoptlsm ; + stoptfifo_r <= stoptfifo ; + end + end + + always @(tpsm or + tstartcmd or + tstopcmd or + tu_r or + stoptc_r or + stoptlsm_r or + stoptfifo_r) + begin : tpsm_proc + case (tpsm) + PSM_STOP : + begin + if (tstartcmd & !stoptc_r & !stoptlsm_r & !stoptfifo_r) + begin + tpsm_c <= PSM_RUN ; + end + else + begin + tpsm_c <= PSM_STOP ; + end + end + PSM_SUSPEND : + begin + if (tstopcmd & stoptc_r & stoptlsm_r & stoptfifo_r) + begin + tpsm_c <= PSM_STOP ; + end + else if (!tu_r) + begin + tpsm_c <= PSM_RUN ; + end + else + begin + tpsm_c <= PSM_SUSPEND ; + end + end + default : + begin + if (tstopcmd & stoptc_r & stoptlsm_r & stoptfifo_r) + begin + tpsm_c <= PSM_STOP ; + end + else if (tu_r) + begin + tpsm_c <= PSM_SUSPEND ; + end + else + begin + tpsm_c <= PSM_RUN ; + end + end + endcase + end + + always @(posedge clk) + begin : tpsm_reg_proc + if (rst) + begin + tpsm <= PSM_STOP ; + end + else + begin + tpsm <= tpsm_c ; + end + end + + always @(posedge clk) + begin : tps_reg_proc + if (rst) + begin + tps <= 1'b0 ; + end + else + begin + if (tstartcmd) + begin + tps <= 1'b0 ; + end + else if (tpsm == PSM_STOP) + begin + tps <= 1'b1 ; + end + end + end + + assign stopt = tstopcmd ; + + assign ren = csr6_sr ; + + assign fd = csr6_fd ; + + assign ra = csr6_ra ; + + assign pm = csr6_pm ; + + assign pr = csr6_pr ; + + assign rif = csr6_if ; + + assign pb = csr6_pb ; + + assign ho = csr6_ho ; + + assign hp = csr6_hp ; + + always @(posedge clk) + begin : rpoll_reg_proc + if (rst) + begin + rpoll <= 1'b0 ; + end + else + begin + if (rpollcmd | rstartcmd) + begin + rpoll <= 1'b1 ; + end + else if (rpollack) + begin + rpoll <= 1'b0 ; + end + end + end + + assign rs_c = (rpsm == PSM_STOP) ? 3'b000 : + (rpsm == PSM_SUSPEND) ? 3'b100 : + (rstat) ? 3'b101 : + (rdes) ? 3'b001 : + (rbuf) ? 3'b111 : + (rprog) ? 3'b010 : + 3'b011 ; + + always @(posedge clk) + begin : rpsack_reg_proc + if (rst) + begin + stoprc_r <= 1'b0 ; + stoprlsm_r <= 1'b0 ; + end + else + begin + stoprc_r <= stoprc ; + stoprlsm_r <= stoprlsm ; + end + end + + always @(rpsm or + rstartcmd or + rstopcmd or + rui or + ru_r or + stoprc_r or + stoprlsm_r) + begin : rpsm_proc + case (rpsm) + PSM_STOP : + begin + if (rstartcmd & !stoprc_r & !stoprlsm_r) + begin + rpsm_c <= PSM_RUN ; + end + else + begin + rpsm_c <= PSM_STOP ; + end + end + PSM_SUSPEND : + begin + if (rstopcmd & stoprc_r & stoprlsm_r) + begin + rpsm_c <= PSM_STOP ; + end + else if (!ru_r) + begin + rpsm_c <= PSM_RUN ; + end + else + begin + rpsm_c <= PSM_SUSPEND ; + end + end + default : + begin + if (rstopcmd & stoprc_r & stoprlsm_r) + begin + rpsm_c <= PSM_STOP ; + end + else if (rui) + begin + rpsm_c <= PSM_SUSPEND ; + end + else + begin + rpsm_c <= PSM_RUN ; + end + end + endcase + end + + always @(posedge clk) + begin : rpsm_reg_proc + if (rst) + begin + rpsm <= PSM_STOP ; + end + else + begin + rpsm <= rpsm_c ; + end + end + + always @(posedge clk) + begin : rps_reg_proc + if (rst) + begin + rps <= 1'b0 ; + end + else + begin + if (rstartcmd) + begin + rps <= 1'b0 ; + end + else if (rpsm == PSM_STOP) + begin + rps <= 1'b1 ; + end + end + end + + always @(posedge clk) + begin : rstartcmd_reg_proc + if (rst) + begin + rstartcmd <= 1'b0 ; + rstopcmd <= 1'b0 ; + end + else + begin + if (rpsm == PSM_RUN) + begin + rstartcmd <= 1'b0 ; + end + else if (!csrrw & csrreq & (csrdata_c[1]) & + csraddr72 == CSR6_ID & (csrdbe_c[0])) + begin + rstartcmd <= 1'b1 ; + end + + if (rpsm == PSM_STOP) + begin + rstopcmd <= 1'b0 ; + end + else if (!csrrw & csrreq & !(csrdata_c[1]) & + csraddr72 == CSR6_ID & (csrdbe_c[0])) + begin + rstopcmd <= 1'b1 ; + end + end + end + + assign stopr = rstopcmd ; + + always @(posedge clk) + begin : rim_reg_proc + if (rst) + begin + rimex <= 1'b0 ; + rimprog <= 1'b0 ; + rtcnt <= {4{1'b1}} ; + rcnt <= {3{1'b1}} ; + end + else + begin + if (csr5_ri) + begin + rimex <= 1'b0 ; + end + else if (rimprog & + ((rtcnt == 4'b0000 & csr11_rt != 4'b0000) | + (rcnt == 3'b000 & csr11_nrp != 3'b000) | + (csr11_rt == 4'b0000 & csr11_nrp == 3'b000))) + begin + rimex <= 1'b1 ; + end + + if (csr5_ri) + begin + rimprog <= 1'b0 ; + end + else if (rireq_r & !rireq_r2) + begin + rimprog <= 1'b1 ; + end + + if ((rireq_r & !rireq_r2) | csr5_ri) + begin + rtcnt <= csr11_rt ; + end + else if (((rcs128 & csr11_cs) | + (rcs2048 & !csr11_cs)) & + rtcnt != 4'b0000 & rimprog) + begin + rtcnt <= rtcnt - 1 ; + end + + if (csr5_ri | csr11wr) + begin + rcnt <= csr11_nrp ; + end + else if (rireq_r & !rireq_r2 & + rcnt != 3'b000 & csr11_nrp != 3'b000) + begin + rcnt <= rcnt - 1 ; + end + + end + end + + always @(posedge clk) + begin : rcscnt_reg_proc + if (rst) + begin + rcsreq_r <= 1'b0 ; + rcsreq_r1 <= 1'b0 ; + rcscnt <= {4{1'b1}} ; + rcs128 <= 1'b0 ; + rcs2048 <= 1'b0 ; + end + else + begin + + rcsreq_r <= rcsreq ; + rcsreq_r1 <= rcsreq_r ; + + if (rcs128) + begin + if (rcscnt == 4'b0000) + begin + rcscnt <= 4'b1111 ; + end + else + begin + rcscnt <= rcscnt - 1 ; + end + end + + if (rcsreq_r & !rcsreq_r1) + begin + rcs128 <= 1'b1 ; + end + else + begin + rcs128 <= 1'b0 ; + end + + if (rcscnt == 4'b0000 & rcs128) + begin + rcs2048 <= 1'b1 ; + end + else + begin + rcs2048 <= 1'b0 ; + end + end + end + + assign rcsack = rcsreq_r ; + + always @(posedge clk) + begin : ireq_reg_proc + if (rst) + begin + rireq_r <= 1'b0 ; + rireq_r2 <= 1'b0 ; + erireq_r <= 1'b0 ; + erireq_r2 <= 1'b0 ; + tireq_r <= 1'b0 ; + tireq_r2 <= 1'b0 ; + etireq_r <= 1'b0 ; + etireq_r2 <= 1'b0 ; + unf_r <= 1'b0 ; + unf_r2 <= 1'b0 ; + tu_r <= 1'b0 ; + tu_r2 <= 1'b0 ; + ru_r <= 1'b0 ; + ru_r2 <= 1'b0 ; + end + else + begin + rireq_r <= rireq ; + rireq_r2 <= rireq_r ; + erireq_r <= erireq ; + erireq_r2 <= erireq_r ; + tireq_r <= tireq ; + tireq_r2 <= tireq_r ; + etireq_r <= etireq ; + etireq_r2 <= etireq_r ; + unf_r <= unf ; + unf_r2 <= unf_r ; + tu_r <= tu ; + tu_r2 <= tu_r ; + ru_r <= ru ; + ru_r2 <= ru_r ; + end + end + + always @(posedge clk) + begin : iic_reg_proc + if (rst) + begin + iic <= 1'b0 ; + end + else + begin + if (tireq_r & !tireq_r2) + begin + if (!ic & !iint) + begin + iic <= 1'b0 ; + end + else + begin + iic <= 1'b1 ; + end + end + end + end + + always @(posedge clk) + begin : eti_reg_proc + if (rst) + begin + eti <= 1'b0 ; + end + else + begin + if (etireq_r & !etireq_r2) + begin + eti <= 1'b1 ; + end + else if (!csr5wr_c) + begin + eti <= 1'b0 ; + end + end + end + + assign etiack = etireq_r2 ; + + always @(posedge clk) + begin : eri_reg_proc + if (rst) + begin + eri <= 1'b0 ; + end + else + begin + if (erireq_r & !erireq_r2) + begin + eri <= 1'b1 ; + end + else if (!csr5wr_c) + begin + eri <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : unfi_reg_proc + if (rst) + begin + unfi <= 1'b0 ; + end + else + begin + if (unf_r & !unf_r2) + begin + unfi <= 1'b1 ; + end + else if (!csr5wr_c) + begin + unfi <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : tui_reg_proc + if (rst) + begin + tui <= 1'b0 ; + end + else + begin + if (tu_r & !tu_r2) + begin + tui <= 1'b1 ; + end + else if (!csr5wr_c) + begin + tui <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : rui_reg_proc + if (rst) + begin + rui <= 1'b0 ; + end + else + begin + if (ru_r & !ru_r2) + begin + rui <= 1'b1 ; + end + else if (!csr5wr_c) + begin + rui <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : iint_reg_proc + if (rst) + begin + iint <= 1'b0 ; + end + else + begin + iint <= ((csr5_nis && csr7_nie) || + (csr5_ais && csr7_aie)) && ~csr5wr; + end + end + + assign interrupt = iint ; + + assign riack = rireq_r2 ; + + assign eriack = erireq_r2 ; + + assign tiack = tireq_r2 ; + + always @(focg_r) + begin : foc_proc + reg [10:0] foc_v; + + foc_v[10] = focg_r[10] ; + begin : foc_loop + integer i; + for(i = 9; i >= 0; i = i - 1) + begin + foc_v[i] = foc_v[i + 1] ^ focg_r[i] ; + end + end + foc_c = foc_v; + end + + always @(mfcg_r) + begin : mfc_proc + reg [15:0] mfc_v; + + mfc_v[15] = mfcg_r[10] ; + begin : mfc_loop + integer i; + for(i = 14; i >= 0; i = i - 1) + begin + mfc_v[i] = mfc_v[i + 1] ^ mfcg_r[i] ; + end + end + mfc_c = mfc_v; + end + + always @(posedge clk) + begin : sc_reg_proc + if (rst) + begin + focl <= 1'b0 ; + mfcl <= 1'b0 ; + focg_r <= {11{1'b0}} ; + mfcg_r <= {16{1'b0}} ; + end + else + begin + if (csr8read) + begin + focl <= 1'b1 ; + end + else if (foclack) + begin + focl <= 1'b0 ; + end + + if (csr8read) + begin + mfcl <= 1'b1 ; + end + else if (mfclack) + begin + mfcl <= 1'b0 ; + end + + mfcg_r <= mfcg ; + + focg_r <= focg ; + + end + end + + assign mdo = csr9_mdo ; + + assign mden = csr9_mii ; + + assign mdc = csr9_mdc ; + + assign sclk = csr9_sclk ; + + assign scs = csr9_scs ; + + assign sdo = csr9_sdo ; + + + assign insert_en_o = csr10_insert_en; + + always @(posedge clk) + begin : gpt_reg_proc + if (rst) + begin + gstart <= 1'b0 ; + gstart_r <= 1'b0 ; + gcnt <= {16{1'b0}} ; + gte <= 1'b0 ; + end + else + begin + if (!csrrw & csrreq & (csrdbe_c[3]) & csraddr72 == CSR11_ID) + begin + gstart <= 1'b1 ; + end + else if ((!csr11_con & gte) | + csr11_tim == 16'b0000000000000000) + begin + gstart <= 1'b0 ; + end + + if(csr11_tim != 16'b0000000000000000) + begin + gstart_r <= gstart ; + end + else + begin + gstart_r <= 1'b0 ; + end + + if (gstart & !gstart_r) + begin + gcnt <= csr11_tim ; + end + else if (gcnt == 16'b0000000000000000) + begin + if (csr11_con) + begin + gcnt <= csr11_tim ; + end + end + else if (tcs2048) + begin + gcnt <= gcnt - 1 ; + end + + if (csr5wr_c) + begin + gte <= 1'b0 ; + end + else if (gstart_r & gcnt == 16'b0000000000000000 & + csr11_tim != 16'b0000000000000000) + begin + gte <= 1'b1 ; + end + + end + end + + always @(posedge clk) + begin : rstsofto_reg_proc + rstsofto <= csr0_swr; + end + + assign czero_max = {CSRWIDTH_MAX{1'b0}} ; + + assign csrdatai_max = {czero_max[CSRWIDTH_MAX+1:CSRWIDTH], + csrdatai}; + + assign csrbe_max = {czero_max[CSRWIDTH_MAX/8+1:CSRWIDTH/8], + csrbe}; + +endmodule diff --git a/resources/soc/rtl/MAC/dma.v b/resources/soc/rtl/MAC/dma.v new file mode 100644 index 0000000..62292bb --- /dev/null +++ b/resources/soc/rtl/MAC/dma.v @@ -0,0 +1,646 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module DMA ( + clk, + rst, + dma_priority, + ble, + dbo, + rdes, + rbuf, + rstat, + tdes, + tbuf, + tstat, + dataack, + datai, + datareq, + datareqc, + datarw, + dataeob, + dataeobc, + datao, + dataaddr, + idataaddr, + req1, + write1, + tcnt1, + addr1, + datai1, + ack1, + eob1, + datao1, + req2, + write2, + tcnt2, + addr2, + datai2, + ack2, + eob2, + datao2); + + parameter DATAWIDTH = 32; + parameter DATADEPTH = 32; + + `include "utility.v" + + input clk; + input rst; + + input [1:0] dma_priority; + input ble; + input dbo; + input rdes; + input rbuf; + input rstat; + input tdes; + input tbuf; + input tstat; + + + input dataack; + input [DATAWIDTH - 1:0] datai; + output datareq; + wire datareq; + output datareqc; + wire datareqc; + output datarw; + reg datarw; + output dataeob; + wire dataeob; + output dataeobc; + wire dataeobc; + output [DATAWIDTH - 1:0] datao; + wire [DATAWIDTH - 1:0] datao; + output [DATADEPTH - 1:0] dataaddr; + wire [DATADEPTH - 1:0] dataaddr; + output [DATADEPTH - 1:0] idataaddr; + wire [DATADEPTH - 1:0] idataaddr; + + input req1; + input write1; + input [FIFODEPTH_MAX - 1:0] tcnt1; + input [DATADEPTH - 1:0] addr1; + input [DATAWIDTH - 1:0] datai1; + output ack1; + wire ack1; + output eob1; + wire eob1; + output [DATAWIDTH - 1:0] datao1; + wire [DATAWIDTH - 1:0] datao1; + + input req2; + input write2; + input [FIFODEPTH_MAX - 1:0] tcnt2; + input [DATADEPTH - 1:0] addr2; + input [DATAWIDTH - 1:0] datai2; + output ack2; + wire ack2; + output eob2; + wire eob2; + output [DATAWIDTH - 1:0] datao2; + wire [DATAWIDTH - 1:0] datao2; + + + reg [1:0] dsm_c; + reg [1:0] dsm; + reg hist1; + reg hist2; + wire [1:0] dmareq; + reg [FIFODEPTH_MAX - 1:0] msmbcnt; + reg idatareq; + reg idatareqc; + reg eob; + reg eobc; + reg [DATADEPTH - 1:0] addr_c; + reg [DATADEPTH - 1:0] addr; + reg blesel_c; + reg [DATAWIDTH - 1:0] dataible_c; + reg [DATAWIDTH - 1:0] dataoble_c; + wire [DATAWIDTH_MAX + 1:0] datai_max; + reg req_c; + reg write_c; + reg [FIFODEPTH_MAX - 1:0] tcnt_c; + reg [DATADEPTH - 1:0] saddr_c; + reg [DATAWIDTH_MAX - 1:0] datai_c; + wire [DATAWIDTH_MAX + 1:0] datai_max_c; + wire [FIFODEPTH_MAX - 1:0] fzero; + wire [DATAWIDTH_MAX + 1:0] dzero; + + assign dmareq = {req2, req1} ; + + always @(dsm or + dmareq or + hist1 or + hist2 or + dma_priority or + eob or + dataack) + begin : dsm_proc + case (dsm) + DSM_IDLE : + begin + case (dmareq) + 2'b11 : + begin + case (dma_priority) + 2'b01 : + begin + if (!hist1 & !hist2) + begin + dsm_c <= DSM_CH2 ; + end + else + begin + dsm_c <= DSM_CH1 ; + end + end + 2'b10 : + begin + if (hist1 & hist2) + begin + dsm_c <= DSM_CH1 ; + end + else + begin + dsm_c <= DSM_CH2 ; + end + end + default : + begin + if (hist1) + begin + dsm_c <= DSM_CH1 ; + end + else + begin + dsm_c <= DSM_CH2 ; + end + end + endcase + end + 2'b01 : + begin + dsm_c <= DSM_CH1 ; + end + 2'b10 : + begin + dsm_c <= DSM_CH2 ; + end + default : + begin + dsm_c <= DSM_IDLE ; + end + endcase + end + DSM_CH1 : + begin + if (eob & dataack) + begin + dsm_c <= DSM_IDLE ; + end + else + begin + dsm_c <= DSM_CH1 ; + end + end + default : + begin + if (eob & dataack) + begin + dsm_c <= DSM_IDLE ; + end + else + begin + dsm_c <= DSM_CH2 ; + end + end + endcase + end + + always @(posedge clk) + begin : dsm_reg_proc + if (rst) + begin + dsm <= DSM_IDLE ; + end + else + begin + dsm <= dsm_c ; + end + end + + always @(posedge clk) + begin : hist_reg_proc + if (rst) + begin + hist1 <= 1'b1 ; + hist2 <= 1'b1 ; + end + else + begin + if (eob) + begin + case (dsm) + DSM_CH1 : + begin + hist1 <= 1'b1 ; + end + DSM_CH2 : + begin + hist1 <= 1'b0 ; + end + default : + begin + hist1 <= hist1 ; + end + endcase + end + hist2 <= hist1 ; + end + end + + always @(dbo or + ble or + dsm_c or + dsm or + tdes or + tbuf or + tstat or + rdes or + rbuf or + rstat) + begin : blesel_proc + if (dsm_c == DSM_CH1 | dsm == DSM_CH1) + begin + if ((tbuf & ble) | + ((tdes | tstat) & dbo)) + begin + blesel_c <= 1'b1 ; + end + else + begin + blesel_c <= 1'b0 ; + end + end + else + begin + if ((rbuf & ble) | + ((rdes | rstat) & dbo)) + begin + blesel_c <= 1'b1 ; + end + else + begin + blesel_c <= 1'b0 ; + end + end + end + + always @(dsm_c or + dsm or + req1 or + write1 or + tcnt1 or + addr1 or + datai1 or + req2 or + write2 or + tcnt2 or + addr2 or + datai2) + begin : chmux_proc + if (dsm_c == DSM_CH1 | dsm == DSM_CH1) + begin + req_c <= req1 ; + write_c <= write1 ; + tcnt_c <= tcnt1 ; + saddr_c <= addr1 ; + datai_c <= {{((DATAWIDTH_MAX+1)-DATAWIDTH){1'b0}},datai1} ; + end + else + begin + req_c <= req2 ; + write_c <= write2 ; + tcnt_c <= tcnt2 ; + saddr_c <= addr2 ; + datai_c <= {{((DATAWIDTH_MAX+1)-DATAWIDTH){1'b0}},datai2} ; + end + end + + assign datai_max_c = {dzero[DATAWIDTH_MAX+1:DATAWIDTH],datai_c}; + + always @(datai_max_c or blesel_c) + begin : dataoble_proc + case (DATAWIDTH) + 32 : + begin + if (blesel_c) + begin + dataoble_c <= {datai_max_c[ 7: 0], + datai_max_c[15: 8], + datai_max_c[23:16], + datai_max_c[31:24]}; + end + else + begin + dataoble_c <= datai_max_c[31:0]; + end + end + 16 : + begin + if (blesel_c) + begin + dataoble_c <= {datai_max_c[7 :0], + datai_max_c[15:8]}; + end + else + begin + dataoble_c <= datai_max_c[15:0]; + end + end + default : + begin + dataoble_c <= datai_max_c[7:0]; + end + endcase + end + + assign datai_max = {dzero[DATAWIDTH_MAX+1:DATAWIDTH],datai}; + + always @(datai_max or blesel_c) + begin : dataible_proc + case (DATAWIDTH) + 32 : + begin + if (blesel_c) + begin + dataible_c <= {datai_max[ 7: 0], + datai_max[15: 8], + datai_max[23:16], + datai_max[31:24]}; + end + else + begin + dataible_c <= datai_max[31:0]; + end + end + 16 : + begin + if (blesel_c) + begin + dataible_c <= {datai_max[7 :0], + datai_max[15:8]}; + end + else + begin + dataible_c <= datai_max[15:0]; + end + end + default : + begin + dataible_c <= datai_max[7:0]; + end + endcase + end + + always @(posedge clk) + begin : msmbcnt_reg_proc + if (rst) + begin + msmbcnt <= {FIFODEPTH_MAX{1'b0}} ; + end + else + begin + if (!idatareq) + begin + msmbcnt <= tcnt_c ; + end + else if (dataack & idatareq) + begin + msmbcnt <= msmbcnt - 1 ; + end + end + end + + always @(posedge clk) + begin : datarw_reg_proc + if (rst) + begin + datarw <= 1'b1 ; + end + else + begin + if (req_c) + begin + datarw <= ~write_c ; + end + end + end + + always @(posedge clk) + begin : idatareq_reg_proc + if (rst) + begin + idatareq <= 1'b0 ; + end + else + begin + if (eob & dataack & idatareq) + begin + idatareq <= 1'b0 ; + end + else if (req1 | req2) + begin + idatareq <= 1'b1 ; + end + end + end + + assign datareq = idatareq ; + + always @(idatareq or + dataack or + req1 or + req2 or + eob + ) + begin : idatareqc_comb_proc + if (eob & dataack & idatareq) + begin + idatareqc <= 1'b0 ; + end + else if (req1 | req2) + begin + idatareqc <= 1'b1 ; + end + else + begin + idatareqc <= idatareq ; + end + end + + assign datareqc = idatareqc ; + + assign dataeob = eob ; + + assign dataeobc = eobc ; + + assign datao1 = dataible_c ; + + assign datao2 = dataible_c ; + + assign datao = dataoble_c ; + + always @(dataack or + idatareq or + addr or + saddr_c or + req_c or + dsm) + begin : addr_proc + if (dataack & idatareq) + begin + case (DATAWIDTH) + 8 : + begin + addr_c <= addr + 1 ; + end + 16 : + begin + addr_c <= {addr[DATADEPTH - 1:1] + 1, 1'b0} ; + end + default : + begin + addr_c <= {addr[DATADEPTH - 1:2] + 1, 2'b00} ; + end + endcase + end + else if (req_c & dsm == DSM_IDLE) + begin + addr_c <= saddr_c ; + end + else + begin + addr_c <= addr ; + end + end + + always @(posedge clk) + begin : addr_reg_proc + if (rst) + begin + addr <= {DATADEPTH{1'b1}} ; + end + else + begin + addr <= addr_c ; + end + end + + assign dataaddr = addr ; + + assign idataaddr = addr ; + + assign ack1 = (dataack & dsm == DSM_CH1) ? 1'b1 : 1'b0 ; + + assign ack2 = (dataack & dsm == DSM_CH2) ? 1'b1 : 1'b0 ; + + always @(posedge clk) + begin : eob_reg_proc + if (rst) + begin + eob <= 1'b0 ; + end + else if (req_c | idatareq) + begin + if ((idatareq & + (msmbcnt == fzero | + msmbcnt == {fzero[FIFODEPTH_MAX-1:1], 1'b1} | + (msmbcnt == {fzero[FIFODEPTH_MAX-1:2], 2'b10} & dataack))) + | + (!idatareq & + (tcnt_c == fzero | + tcnt_c == {fzero[FIFODEPTH_MAX-1:1], 1'b1}))) + begin + eob <= 1'b1 ; + end + else + begin + eob <= 1'b0 ; + end + end + end + + always @(req_c or + idatareq or + msmbcnt or + dataack or + tcnt_c or + fzero or + eob) + begin : eob_comb_proc + if (req_c | idatareq) + begin + if ((idatareq & + (msmbcnt == fzero | + msmbcnt == {fzero[FIFODEPTH_MAX-1:1], 1'b1} | + (msmbcnt == {fzero[FIFODEPTH_MAX-1:2], 2'b10} & dataack))) + | + (!idatareq & + (tcnt_c == fzero | + tcnt_c == {fzero[FIFODEPTH_MAX-1:1], 1'b1}))) + begin + eobc <= 1'b1 ; + end + else + begin + eobc <= 1'b0 ; + end + end + else + begin + eobc <= eob; + end + end + + assign eob1 = eob ; + + assign eob2 = eob ; + + assign fzero = {FIFODEPTH_MAX{1'b0}} ; + + assign dzero = {(DATAWIDTH_MAX+1){1'b0}} ; + +endmodule diff --git a/resources/soc/rtl/MAC/ethernet_top.v b/resources/soc/rtl/MAC/ethernet_top.v new file mode 100644 index 0000000..6239f5f --- /dev/null +++ b/resources/soc/rtl/MAC/ethernet_top.v @@ -0,0 +1,368 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module ethernet_top +( + hclk, + hrst_, + mawid_o , + mawaddr_o , + mawlen_o , + mawsize_o , + mawburst_o , + mawlock_o , + mawcache_o , + mawprot_o , + mawvalid_o , + mawready_i , + mwid_o , + mwdata_o , + mwstrb_o , + mwlast_o , + mwvalid_o , + mwready_i , + mbid_i , + mbresp_i , + mbvalid_i , + mbready_o , + marid_o , + maraddr_o , + marlen_o , + marsize_o , + marburst_o , + marlock_o , + marcache_o , + marprot_o , + marvalid_o , + marready_i , + mrid_i , + mrdata_i , + mrresp_i , + mrlast_i , + mrvalid_i , + mrready_o , + sawid_i , + sawaddr_i , + sawlen_i , + sawsize_i , + sawburst_i , + sawlock_i , + sawcache_i , + sawprot_i , + sawvalid_i , + sawready_o , + swid_i , + swdata_i , + swstrb_i , + swlast_i , + swvalid_i , + swready_o , + sbid_o , + sbresp_o , + sbvalid_o , + sbready_i , + sarid_i , + saraddr_i , + sarlen_i , + sarsize_i , + sarburst_i , + sarlock_i , + sarcache_i , + sarprot_i , + sarvalid_i , + sarready_o , + srid_o , + srdata_o , + srresp_o , + srlast_o , + srvalid_o , + srready_i , + + interrupt_0, + + mtxclk_0, + mtxen_0, + mtxd_0, + mtxerr_0, + mrxclk_0, + mrxdv_0, + mrxd_0, + mrxerr_0, + mcoll_0, + mcrs_0, + mdc_0, + md_i_0, + md_o_0, + md_oe_0 +); + +input hclk; +input hrst_; + + output [ 3:0] mawid_o ; + output [ 31:0] mawaddr_o ; + output [ 3:0] mawlen_o ; + output [ 2:0] mawsize_o ; + output [ 1:0] mawburst_o ; + output [ 1:0] mawlock_o ; + output [ 3:0] mawcache_o ; + output [ 2:0] mawprot_o ; + output mawvalid_o ; + input mawready_i ; + output [ 3:0] mwid_o ; + output [ 31:0] mwdata_o ; + output [ 3:0] mwstrb_o ; + output mwlast_o ; + output mwvalid_o ; + input mwready_i ; + input [ 3:0] mbid_i ; + input [ 1:0] mbresp_i ; + input mbvalid_i ; + output mbready_o ; + output [ 3:0] marid_o ; + output [ 31:0] maraddr_o ; + output [ 3:0] marlen_o ; + output [ 2:0] marsize_o ; + output [ 1:0] marburst_o ; + output [ 1:0] marlock_o ; + output [ 3:0] marcache_o ; + output [ 2:0] marprot_o ; + output marvalid_o ; + input marready_i ; + input [ 3:0] mrid_i ; + input [ 31:0] mrdata_i ; + input [ 1:0] mrresp_i ; + input mrlast_i ; + input mrvalid_i ; + output mrready_o ; + + input [ 3:0] sawid_i ; + input [ 31:0] sawaddr_i ; + input [ 3:0] sawlen_i ; + input [ 2:0] sawsize_i ; + input [ 1:0] sawburst_i ; + input [ 1:0] sawlock_i ; + input [ 3:0] sawcache_i ; + input [ 2:0] sawprot_i ; + input sawvalid_i ; + output sawready_o ; + input [ 3:0] swid_i ; + input [ 31:0] swdata_i ; + input [ 3:0] swstrb_i ; + input swlast_i ; + input swvalid_i ; + output swready_o ; + output [ 3:0] sbid_o ; + output [ 1:0] sbresp_o ; + output sbvalid_o ; + input sbready_i ; + input [ 3:0] sarid_i ; + input [ 31:0] saraddr_i ; + input [ 3:0] sarlen_i ; + input [ 2:0] sarsize_i ; + input [ 1:0] sarburst_i ; + input [ 1:0] sarlock_i ; + input [ 3:0] sarcache_i ; + input [ 2:0] sarprot_i ; + input sarvalid_i ; + output sarready_o ; + output [ 3:0] srid_o ; + output [ 31:0] srdata_o ; + output [ 1:0] srresp_o ; + output srlast_o ; + output srvalid_o ; + input srready_i ; + +input mtxclk_0; +output [3:0] mtxd_0; +output mtxen_0; +output mtxerr_0; + +input mrxclk_0; +input [3:0] mrxd_0; +input mrxdv_0; +input mrxerr_0; + +input mcoll_0; +input mcrs_0; + +input md_i_0; +output mdc_0; +output md_o_0; +output md_oe_0; + +output interrupt_0; + + +`define MAHBDATAWIDTH 32 +`define TFIFODEPTH 9 +`define RFIFODEPTH 9 +`define ADDRDEPTH 6 + +wire [`MAHBDATAWIDTH - 1:0] trdata_0; +wire twe_0; +wire [`TFIFODEPTH - 1:0] twaddr_0; +wire [`TFIFODEPTH - 1:0] traddr_0; +wire [`MAHBDATAWIDTH - 1:0] twdata_0; + +wire [`MAHBDATAWIDTH - 1:0] rrdata_0; +wire rwe_0; +wire [`RFIFODEPTH - 1:0] rwaddr_0; +wire [`RFIFODEPTH - 1:0] rraddr_0; +wire [`MAHBDATAWIDTH - 1:0] rwdata_0; + + +mac_top u_mac_top_0 +( + .hclk(hclk), + .hrst_(hrst_), + + .mawid_o (mawid_o ), + .mawaddr_o (mawaddr_o ), + .mawlen_o (mawlen_o ), + .mawsize_o (mawsize_o ), + .mawburst_o (mawburst_o ), + .mawlock_o (mawlock_o ), + .mawcache_o (mawcache_o ), + .mawprot_o (mawprot_o ), + .mawvalid_o (mawvalid_o ), + .mawready_i (mawready_i ), + .mwid_o (mwid_o ), + .mwdata_o (mwdata_o ), + .mwstrb_o (mwstrb_o ), + .mwlast_o (mwlast_o ), + .mwvalid_o (mwvalid_o ), + .mwready_i (mwready_i ), + .mbid_i (mbid_i ), + .mbresp_i (mbresp_i ), + .mbvalid_i (mbvalid_i ), + .mbready_o (mbready_o ), + .marid_o (marid_o ), + .maraddr_o (maraddr_o ), + .marlen_o (marlen_o ), + .marsize_o (marsize_o ), + .marburst_o (marburst_o ), + .marlock_o (marlock_o ), + .marcache_o (marcache_o ), + .marprot_o (marprot_o ), + .marvalid_o (marvalid_o ), + .marready_i (marready_i ), + .mrid_i (mrid_i ), + .mrdata_i (mrdata_i ), + .mrresp_i (mrresp_i ), + .mrlast_i (mrlast_i ), + .mrvalid_i (mrvalid_i ), + .mrready_o (mrready_o ), + .sawid_i (sawid_i ), + .sawaddr_i (sawaddr_i ), + .sawlen_i (sawlen_i ), + .sawsize_i (sawsize_i ), + .sawburst_i (sawburst_i ), + .sawlock_i (sawlock_i ), + .sawcache_i (sawcache_i ), + .sawprot_i (sawprot_i ), + .sawvalid_i (sawvalid_i ), + .sawready_o (sawready_o ), + .swid_i (swid_i ), + .swdata_i (swdata_i ), + .swstrb_i (swstrb_i ), + .swlast_i (swlast_i ), + .swvalid_i (swvalid_i ), + .swready_o (swready_o ), + .sbid_o (sbid_o ), + .sbresp_o (sbresp_o ), + .sbvalid_o (sbvalid_o ), + .sbready_i (sbready_i ), + .sarid_i (sarid_i ), + .saraddr_i (saraddr_i ), + .sarlen_i (sarlen_i ), + .sarsize_i (sarsize_i ), + .sarburst_i (sarburst_i ), + .sarlock_i (sarlock_i ), + .sarcache_i (sarcache_i ), + .sarprot_i (sarprot_i ), + .sarvalid_i (sarvalid_i ), + .sarready_o (sarready_o ), + .srid_o (srid_o ), + .srdata_o (srdata_o ), + .srresp_o (srresp_o ), + .srlast_o (srlast_o ), + .srvalid_o (srvalid_o ), + .srready_i (srready_i ), + + .interrupt(interrupt_0), + + .mtxclk(mtxclk_0), .mtxen(mtxen_0), .mtxd(mtxd_0), .mtxerr(mtxerr_0), + .mrxclk(mrxclk_0), .mrxdv(mrxdv_0), .mrxd(mrxd_0), .mrxerr(mrxerr_0), + .mcoll(mcoll_0), .mcrs(mcrs_0), + .mdc(mdc_0), .md_i(md_i_0), .md_o(md_o_0), .md_oe(md_oe_0), + + .trdata(trdata_0), + .twe(twe_0), + .twaddr(twaddr_0), + .traddr(traddr_0), + .twdata(twdata_0), + + .rrdata(rrdata_0), + .rwe(rwe_0), + .rwaddr(rwaddr_0), + .rraddr(rraddr_0), + .rwdata(rwdata_0) +); + +wire [31:0] douta_nc; +dpram_512x32 dpram_512x32_tx( + .clka (hclk ), + .ena (twe_0 ), + .wea (twe_0 ), + .addra (twaddr_0), + .dina (twdata_0), + .clkb (mtxclk_0), + .addrb (traddr_0), + .doutb (trdata_0) +); + +wire [31:0] doutb_nc; +dpram_512x32 dpram_512x32_rx( + .clka (mrxclk_0), + .ena (rwe_0 ), + .wea (rwe_0 ), + .addra (rwaddr_0), + .dina (rwdata_0), + .clkb (hclk ), + .addrb (rraddr_0), + .doutb (rrdata_0) +); + +endmodule + diff --git a/resources/soc/rtl/MAC/mac.v b/resources/soc/rtl/MAC/mac.v new file mode 100644 index 0000000..278bf28 --- /dev/null +++ b/resources/soc/rtl/MAC/mac.v @@ -0,0 +1,862 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module MAC ( + clkdma, + clkcsr, + rstcsr, + clkt, + clkr, + rsttco, + rstrco, + interrupt, + tps, + rps, + csrreq, + csrrw, + csrbe, + csrdatai, + csraddr, + csrack, + csrdatao, + dataack, + datareq, + datareqc, + datarw, + dataeob, + dataeobc, + datai, + dataaddr, + datao, + trdata, + twe, + twaddr, + traddr, + twdata, + rrdata, + rwe, + rwaddr, + rraddr, + rwdata, + frdata, + fwe, + fwaddr, + fraddr, + fwdata, + match, + matchval, + matchen, + matchdata, + sdi, + sclk, + scs, + sdo, + rxer, + rxdv, + col, + crs, + rxd, + txen, + txer, + txd, + mdc, + mdi, + mdo, + mden + ); + + parameter CSRWIDTH = 32; + parameter DATAWIDTH = 32; + parameter DATADEPTH = 32; + parameter TFIFODEPTH = 9; + parameter RFIFODEPTH = 9; + parameter TCDEPTH = 1; + parameter RCDEPTH = 2; + + `include "utility.v" + + input clkdma; + input clkcsr; + input rstcsr; + input clkt; + input clkr; + output rsttco; + wire rsttco; + output rstrco; + wire rstrco; + + output interrupt; + wire interrupt; + + output tps; + wire tps; + output rps; + wire rps; + + input csrreq; + input csrrw; + input [CSRWIDTH / 8 - 1:0] csrbe; + input [CSRWIDTH - 1:0] csrdatai; + input [7:0] csraddr; + output csrack; + wire csrack; + output [CSRWIDTH - 1:0] csrdatao; + wire [CSRWIDTH - 1:0] csrdatao; + + input dataack; + output datareq; + wire datareq; + output datareqc; + wire datareqc; + output datarw; + wire datarw; + output dataeob; + wire dataeob; + output dataeobc; + wire dataeobc; + input [DATAWIDTH - 1:0] datai; + output [DATADEPTH - 1:0] dataaddr; + wire [DATADEPTH - 1:0] dataaddr; + output [DATAWIDTH - 1:0] datao; + wire [DATAWIDTH - 1:0] datao; + + input [DATAWIDTH - 1:0] trdata; + output twe; + wire twe; + output [TFIFODEPTH - 1:0] twaddr; + wire [TFIFODEPTH - 1:0] twaddr; + output [TFIFODEPTH - 1:0] traddr; + wire [TFIFODEPTH - 1:0] traddr; + output [DATAWIDTH - 1:0] twdata; + wire [DATAWIDTH - 1:0] twdata; + + input [DATAWIDTH - 1:0] rrdata; + output rwe; + wire rwe; + output [RFIFODEPTH - 1:0] rwaddr; + wire [RFIFODEPTH - 1:0] rwaddr; + output [RFIFODEPTH - 1:0] rraddr; + wire [RFIFODEPTH - 1:0] rraddr; + output [DATAWIDTH - 1:0] rwdata; + wire [DATAWIDTH - 1:0] rwdata; + + input [15:0] frdata; + output fwe; + wire fwe; + output [ADDRDEPTH - 1:0] fwaddr; + wire [ADDRDEPTH - 1:0] fwaddr; + output [ADDRDEPTH - 1:0] fraddr; + wire [ADDRDEPTH - 1:0] fraddr; + output [15:0] fwdata; + wire [15:0] fwdata; + + input match; + input matchval; + output matchen; + wire matchen; + output [47:0] matchdata; + wire [47:0] matchdata; + + input sdi; + output sclk; + wire sclk; + output scs; + wire scs; + output sdo; + wire sdo; + + input rxer; + input rxdv; + input col; + input crs; + input [MIIWIDTH - 1:0] rxd; + output txen; + wire txen; + output txer; + wire txer; + output [MIIWIDTH - 1:0] txd; + wire [MIIWIDTH - 1:0] txd; + output mdc; + wire mdc; + input mdi; + output mdo; + wire mdo; + output mden; + wire mden; + + + wire rstsoft; + wire rsttc; + wire rstrc; + wire rstdmao; + wire rstcsro; + + wire [5:0] pbl; + wire ac; + wire dpd; + wire [4:0] dsl; + wire tpoll; + wire [DATADEPTH - 1:0] tdbad; + wire sf; + wire [2:0] tm; + wire fd; + wire ble; + wire dbo; + wire ra; + wire pm; + wire pr; + wire pb; + wire rif; + wire ho; + wire hp; + wire rpoll; + wire rpollack; + wire [DATADEPTH - 1:0] rdbad; + + wire insert_en; + + wire tdes; + wire tbuf; + wire tset; + wire tstat; + wire tu; + wire [1:0] ft; + wire rdes; + wire rstat; + wire ru; + wire rcomp; + wire rcompack; + wire tcomp; + wire tcompack; + + wire [1:0] dma_priority; + wire treq; + wire twrite; + wire [FIFODEPTH_MAX - 1:0] tcnt; + wire [DATADEPTH - 1:0] taddr; + wire [DATAWIDTH - 1:0] tdatai; + wire tack; + wire teob; + wire [DATAWIDTH - 1:0] tdatao; + wire rreq; + wire rwrite; + wire [FIFODEPTH_MAX - 1:0] rcnt; + wire [DATADEPTH - 1:0] raddr; + wire [DATAWIDTH - 1:0] rdatai; + wire rack; + wire reob; + wire [DATAWIDTH - 1:0] rdatao; + wire [DATADEPTH - 1:0] idataaddr; + + wire tfifonf; + wire tfifocnf; + wire tfifoval; + wire tfifowe; + wire tfifoeof; + wire [DATAWIDTH / 8 - 1:0] tfifobe; + wire [DATAWIDTH - 1:0] tfifodata; + wire [TFIFODEPTH - 1:0] tfifolev; + wire [TFIFODEPTH - 1:0] tradg; + + wire etiack; + wire etireq; + wire tcsne; + wire tcachere; + wire ic; + wire ici; + wire aci; + wire dpdi; + wire lo_o; + wire nc_o; + wire lc_o; + wire ec_o; + wire de_o; + wire ur_o; + wire [3:0] cc_o; + wire lo_i; + wire nc_i; + wire lc_i; + wire ec_i; + wire de_i; + wire ur_i; + wire [3:0] cc_i; + + wire tpollack; + wire tdbadc; + wire [DATADEPTH - 1:0] statado; + wire [DATADEPTH - 1:0] statadi; + + wire sofreq; + wire eofreq; + wire [DATAWIDTH / 8 - 1:0] be; + wire [TFIFODEPTH - 1:0] eofad; + wire [TFIFODEPTH - 1:0] twadg; + wire tireq; + wire tiack; + wire winp; + + wire coll; + wire carrier; + wire bkoff; + wire tpend; + wire tprog; + wire preamble; + + wire tcsreq; + wire tcsack; + + wire stopt; + wire stoptc; + wire stoptfifo; + wire stoptlsm; + + wire [RFIFODEPTH - 1:0] rradg; + wire [RFIFODEPTH - 1:0] rwadg; + wire rfifore; + wire [DATAWIDTH - 1:0] rfifodata; + wire rcachere; + wire rcachene; + wire rcachenf; + wire [DATAWIDTH - 1:0] irwdata; + wire irwe; + + wire riack; + wire ren; + wire rireq; + wire ff; + wire rf; + wire mf; + wire db; + wire re; + wire ce; + wire tl; + wire ftp; + wire ov; + wire cs; + wire [13:0] length; + wire rprog; + wire rcpoll; + + + wire ff_o; + wire rf_o; + wire mf_o; + wire tl_o; + wire re_o; + wire db_o; + wire ce_o; + wire ov_o; + wire cs_o; + wire [13:0] fl_o; + + wire rdbadc; + wire erireq; + wire eriack; + wire rbuf; + + wire foclack; + wire mfclack; + wire oco; + wire mfo; + wire [10:0] focg; + wire [15:0] mfcg; + wire focl; + wire mfcl; + + wire stopr; + wire stoprc; + wire stoprfifo; + wire stoprlsm; + + wire rcsack; + wire rcsreq; + + DMA #(DATAWIDTH, DATADEPTH) U_DMA( + .clk (clkdma), + .rst (rstdmao), + .dma_priority (dma_priority), + .ble (ble), + .dbo (dbo), + .rdes (rdes), + .rbuf (rbuf), + .rstat (rstat), + .tdes (tdes), + .tbuf (tbuf), + .tstat (tstat), + .dataack (dataack), + .datai (datai), + .datareq (datareq), + .datareqc (datareqc), + .datarw (datarw), + .dataeob (dataeob), + .dataeobc (dataeobc), + .datao (datao), + .dataaddr (dataaddr), + .idataaddr (idataaddr), + .req1 (treq), + .write1 (twrite), + .tcnt1 (tcnt), + .addr1 (taddr), + .datai1 (tdatao), + .ack1 (tack), + .eob1 (teob), + .datao1 (tdatai), + .req2 (rreq), + .write2 (rwrite), + .tcnt2 (rcnt), + .addr2 (raddr), + .datai2 (rdatao), + .ack2 (rack), + .eob2 (reob), + .datao2 (rdatai) + ); + + TLSM #(DATAWIDTH, DATADEPTH, TFIFODEPTH) U_TLSM( + .clk (clkdma), + .rst (rstdmao), + .fifonf (tfifonf), + .fifocnf (tfifocnf), + .fifoval (tfifoval), + .fifowe (tfifowe), + .fifoeof (tfifoeof), + .fifobe (tfifobe), + .fifodata (tfifodata), + .fifolev (tfifolev), + .ic (ici), + .ac (aci), + .dpd (dpdi), + .statado (statadi), + .csne (tcsne), + .lo (lo_i), + .nc (nc_i), + .lc (lc_i), + .ec (ec_i), + .de (de_i), + .ur (ur_i), + .cc (cc_i), + .cachere (tcachere), + .statadi (statado), + .dmaack (tack), + .dmaeob (teob), + .dmadatai (tdatai), + .dmaaddr (idataaddr), + .dmareq (treq), + .dmawr (twrite), + .dmacnt (tcnt), + .dmaaddro (taddr), + .dmadatao (tdatao), + .fwe (fwe), + .fdata (fwdata), + .faddr (fwaddr), + .dsl (dsl), + .pbl (pbl), + .poll (tpoll), + .dbadc (tdbadc), + .dbad (tdbad), + .pollack (tpollack), + .tcompack (tcompack), + .tcomp (tcomp), + .des (tdes), + .fbuf (tbuf), + .stat (tstat), + .setp (tset), + .tu (tu), + .ft (ft), + .stopi (stopt), + .stopo (stoptlsm) + ); + + TFIFO #(DATAWIDTH, DATADEPTH, TFIFODEPTH, TCDEPTH) U_TFIFO( + .clk (clkdma), + .rst (rstdmao), + .ramwe (twe), + .ramaddr (twaddr), + .ramdata (twdata), + .fifowe (tfifowe), + .fifoeof (tfifoeof), + .fifobe (tfifobe), + .fifodata (tfifodata), + .fifonf (tfifonf), + .fifocnf (tfifocnf), + .fifoval (tfifoval), + .flev (tfifolev), + .ici (ici), + .dpdi (dpdi), + .aci (aci), + .statadi (statadi), + .cachere (tcachere), + .deo (de_i), + .lco (lc_i), + .loo (lo_i), + .nco (nc_i), + .eco (ec_i), + .ico (ic), + .uro (ur_i), + .csne (tcsne), + .cco (cc_i), + .statado (statado), + .sofreq (sofreq), + .eofreq (eofreq), + .dpdo (dpd), + .aco (ac), + .beo (be), + .eofad (eofad), + .wadg (twadg), + .tireq (tireq), + .winp (winp), + .dei (de_o), + .lci (lc_o), + .loi (lo_o), + .nci (nc_o), + .eci (ec_o), + .uri (ur_o), + .cci (cc_o), + .radg (tradg), + .tiack (tiack), + .sf (sf), + .fdp (fd), + .tm (tm), + .pbl (pbl), + .etiack (etiack), + .etireq (etireq), + .stopi (stopt), + .stopo (stoptfifo) + ); + + TC #(TFIFODEPTH, DATAWIDTH) U_TC( + .clk (clkt), + .rst (rsttc), + .txen (txen), + .txer (txer), + .txd (txd), + .ramdata (trdata), + .ramaddr (traddr), + .wadg (twadg), + .radg (tradg), + .dpd (dpd), + .ac (ac), + .sofreq (sofreq), + .eofreq (eofreq), + .tiack (tiack), + .lastbe (be), + .eofadg (eofad), + .tireq (tireq), + .ur (ur_o), + .de (de_o), + .coll (coll), + .carrier (carrier), + .bkoff (bkoff), + .tpend (tpend), + .tprog (tprog), + .preamble (preamble), + .stopi (stopt), + .stopo (stoptc), + .tcsack (tcsack), + .tcsreq (tcsreq) + ); + + BD U_BD( + .clk (clkt), + .rst (rsttc), + .col (col), + .crs (crs), + .fdp (fd), + .tprog (tprog), + .preamble (preamble), + .tpend (tpend), + .winp (winp), + .tiack (tiack), + .coll (coll), + .carrier (carrier), + .bkoff (bkoff), + .lc (lc_o), + .lo (lo_o), + .nc (nc_o), + .ec (ec_o), + .cc (cc_o) + ); + + + RC #(RFIFODEPTH, DATAWIDTH) U_RC( + .clk (clkr), + .rst (rstrc), + .col (col), + .rxdv (rxdv), + .rxer (rxer), + .rxd (rxd), + .ramwe (irwe), + .ramaddr (rwaddr), + .ramdata (irwdata), + .fdata (frdata), + .faddr (fraddr), + .cachenf (rcachenf), + .radg (rradg), + .wadg (rwadg), + .rprog (rprog), + .rcpoll (rcpoll), + .riack (riack), + .ren (ren), + .ra (ra), + .pm (pm), + .pr (pr), + .pb (pb), + .rif (rif), + .ho (ho), + .hp (hp), + .rireq (rireq), + .ff (ff), + .rf (rf), + .mf (mf), + .db (db), + .re (re), + .ce (ce), + .tl (tl), + .ftp (ftp), + .ov (ov), + .cs (cs), + .length (length), + .match (match), + .matchval (matchval), + .matchen (matchen), + .matchdata (matchdata), + .focl (focl), + .foclack (foclack), + .oco (oco), + .focg (focg), + .mfcl (mfcl), + .mfclack (mfclack), + .mfo (mfo), + .mfcg (mfcg), + .stopi (stopr), + .stopo (stoprc), + .rcsack (rcsack), + .rcsreq (rcsreq), + .insert_en_i (insert_en) + ); + + RFIFO #(DATAWIDTH, DATADEPTH, RFIFODEPTH, RCDEPTH) U_RFIFO( + .clk (clkdma), + .rst (rstdmao), + .ramdata (rrdata), + .ramaddr (rraddr), + .fifore (rfifore), + .ffo (ff_o), + .rfo (rf_o), + .mfo (mf_o), + .tlo (tl_o), + .reo (re_o), + .dbo (db_o), + .ceo (ce_o), + .ovo (ov_o), + .cso (cs_o), + .flo (fl_o), + .fifodata (rfifodata), + .cachere (rcachere), + .cachene (rcachene), + .cachenf (rcachenf), + .radg (rradg), + .rireq (rireq), + .ffi (ff), + .rfi (rf), + .mfi (mf), + .tli (tl), + .rei (re), + .dbi (db), + .cei (ce), + .ovi (ov), + .csi (cs), + .fli (length), + .wadg (rwadg), + .riack (riack) + ); + + RLSM #(DATAWIDTH, DATADEPTH, RFIFODEPTH) U_RLSM( + .clk (clkdma), + .rst (rstdmao), + .fifodata (rfifodata), + .fifore (rfifore), + .cachere (rcachere), + .dmaack (rack), + .dmaeob (reob), + .dmadatai (rdatai), + .dmaaddr (idataaddr), + .dmareq (rreq), + .dmawr (rwrite), + .dmacnt (rcnt), + .dmaaddro (raddr), + .dmadatao (rdatao), + .rprog (rprog), + .rcpoll (rcpoll), + .fifocne (rcachene), + .ff (ff_o), + .rf (rf_o), + .mf (mf_o), + .db (db_o), + .re (re_o), + .ce (ce_o), + .tl (tl_o), + .ftp (ftp), + .ov (ov_o), + .cs (cs_o), + .length (fl_o), + .pbl (pbl), + .dsl (dsl), + .rpoll (rpoll), + .rdbadc (rdbadc), + .rdbad (rdbad), + .rpollack (rpollack), + .bufack (eriack), + .rcompack (rcompack), + .des (rdes), + .fbuf (rbuf), + .stat (rstat), + .ru (ru), + .rcomp (rcomp), + .bufcomp (erireq), + .stopi (stopr), + .stopo (stoprlsm), + .insert_en_i (insert_en) + ); + + CSR #(CSRWIDTH, DATAWIDTH, DATADEPTH, RFIFODEPTH, RCDEPTH) U_CSR( + .clk (clkcsr), + .rst (rstcsro), + .interrupt (interrupt), + .rstsofto (rstsoft), + .csrreq (csrreq), + .csrrw (csrrw), + .csrbe (csrbe), + .csraddr (csraddr), + .csrdatai (csrdatai), + .csrack (csrack), + .csrdatao (csrdatao), + .tprog (tprog), + .tireq (tcomp), + .unf (ur_i), + .tiack (tcompack), + .tcsreq (tcsreq), + .tcsack (tcsack), + .fd (fd), + .ic (ic), + .etireq (etireq), + .etiack (etiack), + .tm (tm), + .sf (sf), + .tset (tset), + .tdes (tdes), + .tbuf (tbuf), + .tstat (tstat), + .tu (tu), + .tpollack (tpollack), + .ft (ft), + .tpoll (tpoll), + .tdbadc (tdbadc), + .tdbad (tdbad), + .rireq (rcomp), + .rcsreq (rcsreq), + .rprog (rprog), + .riack (rcompack), + .rcsack (rcsack), + .ren (ren), + .ra (ra), + .pm (pm), + .pr (pr), + .pb (pb), + .rif (rif), + .ho (ho), + .hp (hp), + .foclack (foclack), + .mfclack (mfclack), + .oco (oco), + .mfo (mfo), + .focg (focg), + .mfcg (mfcg), + .focl (focl), + .mfcl (mfcl), + .erireq (erireq), + .ru (ru), + .rpollack (rpollack), + .rdes (rdes), + .rbuf (rbuf), + .rstat (rstat), + .eriack (eriack), + .rpoll (rpoll), + .rdbadc (rdbadc), + .rdbad (rdbad), + .ble (ble), + .dbo (dbo), + .dma_priority (dma_priority), + .pbl (pbl), + .dsl (dsl), + .stoptc (stoptc), + .stoptlsm (stoptlsm), + .stoptfifo (stoptfifo), + .stopt (stopt), + .tps (tps), + .stoprc (stoprc), + .stoprlsm (stoprlsm), + .stopr (stopr), + .rps (rps), + .sdi (sdi), + .sclk (sclk), + .scs (scs), + .sdo (sdo), + .mdi (mdi), + .mdc (mdc), + .mdo (mdo), + .mden (mden), + .insert_en_o (insert_en) + ); + + RSTC U_RSTC ( + .clkdma(clkdma), + .clkcsr(clkcsr), + .clkt(clkt), + .clkr(clkr), + .rstcsr(rstcsr), + .rstsoft(rstsoft), + .rsttc(rsttc), + .rstrc(rstrc), + .rstdmao(rstdmao), + .rstcsro(rstcsro) + ); + + assign rwe = irwe ; + + assign rwdata = irwdata ; + + assign rsttco = rsttc ; + + assign rstrco = rstrc ; + +endmodule diff --git a/resources/soc/rtl/MAC/mac2axi.v b/resources/soc/rtl/MAC/mac2axi.v new file mode 100644 index 0000000..9754451 --- /dev/null +++ b/resources/soc/rtl/MAC/mac2axi.v @@ -0,0 +1,355 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module MAC2AXI ( + mhclk, + mhresetn, + shclk, + shresetn, + + mawid_o , + mawaddr_o , + mawlen_o , + mawsize_o , + mawburst_o , + mawlock_o , + mawcache_o , + mawprot_o , + mawvalid_o , + mawready_i , + mwid_o , + mwdata_o , + mwstrb_o , + mwlast_o , + mwvalid_o , + mwready_i , + mbid_i , + mbresp_i , + mbvalid_i , + mbready_o , + marid_o , + maraddr_o , + marlen_o , + marsize_o , + marburst_o , + marlock_o , + marcache_o , + marprot_o , + marvalid_o , + marready_i , + mrid_i , + mrdata_i , + mrresp_i , + mrlast_i , + mrvalid_i , + mrready_o , + + sawid_i , + sawaddr_i , + sawlen_i , + sawsize_i , + sawburst_i , + sawlock_i , + sawcache_i , + sawprot_i , + sawvalid_i , + sawready_o , + swid_i , + swdata_i , + swstrb_i , + swlast_i , + swvalid_i , + swready_o , + sbid_o , + sbresp_o , + sbvalid_o , + sbready_i , + sarid_i , + saraddr_i , + sarlen_i , + sarsize_i , + sarburst_i , + sarlock_i , + sarcache_i , + sarprot_i , + sarvalid_i , + sarready_o , + srid_o , + srdata_o , + srresp_o , + srlast_o , + srvalid_o , + srready_i , + + datareq, + datareqc, + datarw, + dataeob, + dataeobc, + dataaddr, + datao, + dataack, + datai, + rstcsr, + csrack, + csrdatao, + csrreq, + csrrw, + csrbe, + csrdatai, + csraddr + ); + + parameter MAXIDATAWIDTH = 32; + parameter MAXIADDRESSWIDTH = 32; + + parameter SAXIDATAWIDTH = 32; + parameter SAXIADDRESSWIDTH = 32; + + parameter MACDATAWIDTH = 32; + parameter MACADDRESSWIDTH = 32; + + parameter CSRDATAWIDTH = 32; + parameter CSRADDRESSWIDTH = 8; + + + input mhclk; + input mhresetn; + output [ 3:0] mawid_o ; + output [ 31:0] mawaddr_o ; + output [ 3:0] mawlen_o ; + output [ 2:0] mawsize_o ; + output [ 1:0] mawburst_o ; + output [ 1:0] mawlock_o ; + output [ 3:0] mawcache_o ; + output [ 2:0] mawprot_o ; + output mawvalid_o ; + input mawready_i ; + output [ 3:0] mwid_o ; + output [ 31:0] mwdata_o ; + output [ 3:0] mwstrb_o ; + output mwlast_o ; + output mwvalid_o ; + input mwready_i ; + input [ 3:0] mbid_i ; + input [ 1:0] mbresp_i ; + input mbvalid_i ; + output mbready_o ; + output [ 3:0] marid_o ; + output [ 31:0] maraddr_o ; + output [ 3:0] marlen_o ; + output [ 2:0] marsize_o ; + output [ 1:0] marburst_o ; + output [ 1:0] marlock_o ; + output [ 3:0] marcache_o ; + output [ 2:0] marprot_o ; + output marvalid_o ; + input marready_i ; + input [ 3:0] mrid_i ; + input [ 31:0] mrdata_i ; + input [ 1:0] mrresp_i ; + input mrlast_i ; + input mrvalid_i ; + output mrready_o ; + + input shclk; + input shresetn; + + input [ 3:0] sawid_i ; + input [ 31:0] sawaddr_i ; + input [ 3:0] sawlen_i ; + input [ 2:0] sawsize_i ; + input [ 1:0] sawburst_i ; + input [ 1:0] sawlock_i ; + input [ 3:0] sawcache_i ; + input [ 2:0] sawprot_i ; + input sawvalid_i ; + output sawready_o ; + input [ 3:0] swid_i ; + input [ 31:0] swdata_i ; + input [ 3:0] swstrb_i ; + input swlast_i ; + input swvalid_i ; + output swready_o ; + output [ 3:0] sbid_o ; + output [ 1:0] sbresp_o ; + output sbvalid_o ; + input sbready_i ; + input [ 3:0] sarid_i ; + input [ 31:0] saraddr_i ; + input [ 3:0] sarlen_i ; + input [ 2:0] sarsize_i ; + input [ 1:0] sarburst_i ; + input [ 1:0] sarlock_i ; + input [ 3:0] sarcache_i ; + input [ 2:0] sarprot_i ; + input sarvalid_i ; + output sarready_o ; + output [ 3:0] srid_o ; + output [ 31:0] srdata_o ; + output [ 1:0] srresp_o ; + output srlast_o ; + output srvalid_o ; + input srready_i ; + input datareq; + input datareqc; + input datarw; + input dataeob; + input dataeobc; + input [MACADDRESSWIDTH - 1:0] dataaddr; + input [MACDATAWIDTH - 1:0] datao; + output dataack; + wire dataack; + output [MACDATAWIDTH - 1:0] datai; + wire [MACDATAWIDTH - 1:0] datai; + + + output rstcsr; + wire rstcsr; + input csrack; + input [CSRDATAWIDTH - 1:0] csrdatao; + output csrreq; + wire csrreq; + output csrrw; + wire csrrw; + output [CSRDATAWIDTH / 8 - 1:0] csrbe; + wire [CSRDATAWIDTH / 8 - 1:0] csrbe; + output [CSRDATAWIDTH - 1:0] csrdatai; + wire [CSRDATAWIDTH - 1:0] csrdatai; + output [CSRADDRESSWIDTH - 1:0] csraddr; + wire [CSRADDRESSWIDTH - 1:0] csraddr; + + + MACDATA2AXI + #(MAXIDATAWIDTH, MAXIADDRESSWIDTH, MACDATAWIDTH, MACADDRESSWIDTH) + U_MACDATA2AXI ( + .maclk (mhclk ), + .maresetn (mhresetn ), + .awid_o (mawid_o ), + .awaddr_o (mawaddr_o ), + .awlen_o (mawlen_o ), + .awsize_o (mawsize_o ), + .awburst_o (mawburst_o ), + .awlock_o (mawlock_o ), + .awcache_o (mawcache_o ), + .awprot_o (mawprot_o ), + .awvalid_o (mawvalid_o ), + .awready_i (mawready_i ), + .wid_o (mwid_o ), + .wdata_o (mwdata_o ), + .wstrb_o (mwstrb_o ), + .wlast_o (mwlast_o ), + .wvalid_o (mwvalid_o ), + .wready_i (mwready_i ), + .bid_i (mbid_i ), + .bresp_i (mbresp_i ), + .bvalid_i (mbvalid_i ), + .bready_o (mbready_o ), + .arid_o (marid_o ), + .araddr_o (maraddr_o ), + .arlen_o (marlen_o ), + .arsize_o (marsize_o ), + .arburst_o (marburst_o ), + .arlock_o (marlock_o ), + .arcache_o (marcache_o ), + .arprot_o (marprot_o ), + .arvalid_o (marvalid_o ), + .arready_i (marready_i ), + .rid_i (mrid_i ), + .rdata_i (mrdata_i ), + .rresp_i (mrresp_i ), + .rlast_i (mrlast_i ), + .rvalid_i (mrvalid_i ), + .rready_o (mrready_o ), + .datareq (datareq ), + .datareqc (datareqc ), + .datarw (datarw ), + .dataeob (dataeob ), + .dataeobc (dataeobc ), + .dataaddr (dataaddr ), + .datao (datao ), + .dataack (dataack ), + .datai (datai ) + ); + MACCSR2AXI + #(SAXIDATAWIDTH, SAXIADDRESSWIDTH, CSRDATAWIDTH, CSRADDRESSWIDTH) + U_MACCSR2AXI( + .saclk (shclk ), + .saresetn (shresetn ), + .awid_i (sawid_i ), + .awaddr_i (sawaddr_i ), + .awlen_i (sawlen_i ), + .awsize_i (sawsize_i ), + .awburst_i (sawburst_i), + .awlock_i (sawlock_i ), + .awcache_i (sawcache_i), + .awprot_i (sawprot_i ), + .awvalid_i (sawvalid_i), + .awready_o (sawready_o), + .wid_i (swid_i ), + .wdata_i (swdata_i ), + .wstrb_i (swstrb_i ), + .wlast_i (swlast_i ), + .wvalid_i (swvalid_i ), + .wready_o (swready_o ), + .bid_o (sbid_o ), + .bresp_o (sbresp_o ), + .bvalid_o (sbvalid_o ), + .bready_i (sbready_i ), + .arid_i (sarid_i ), + .araddr_i (saraddr_i ), + .arlen_i (sarlen_i ), + .arsize_i (sarsize_i ), + .arburst_i (sarburst_i), + .arlock_i (sarlock_i ), + .arcache_i (sarcache_i), + .arprot_i (sarprot_i ), + .arvalid_i (sarvalid_i), + .arready_o (sarready_o), + .rid_o (srid_o ), + .rdata_o (srdata_o ), + .rresp_o (srresp_o ), + .rlast_o (srlast_o ), + .rvalid_o (srvalid_o ), + .rready_i (srready_i ), + .rstcsr (rstcsr ) , + .csrack (csrack ) , + .csrdatao (csrdatao ) , + .csrreq (csrreq ) , + .csrrw (csrrw ) , + .csrbe (csrbe ) , + .csrdatai (csrdatai ) , + .csraddr (csraddr ) + ); + +endmodule diff --git a/resources/soc/rtl/MAC/mac_axi.v b/resources/soc/rtl/MAC/mac_axi.v new file mode 100644 index 0000000..3023ec8 --- /dev/null +++ b/resources/soc/rtl/MAC/mac_axi.v @@ -0,0 +1,522 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module MAC_AXI ( + clkt, + clkr, + rsttco, + rstrco, + interrupt, + tps, + rps, + mhclk, + mhresetn, + mawid_o , + mawaddr_o , + mawlen_o , + mawsize_o , + mawburst_o , + mawlock_o , + mawcache_o , + mawprot_o , + mawvalid_o , + mawready_i , + mwid_o , + mwdata_o , + mwstrb_o , + mwlast_o , + mwvalid_o , + mwready_i , + mbid_i , + mbresp_i , + mbvalid_i , + mbready_o , + marid_o , + maraddr_o , + marlen_o , + marsize_o , + marburst_o , + marlock_o , + marcache_o , + marprot_o , + marvalid_o , + marready_i , + mrid_i , + mrdata_i , + mrresp_i , + mrlast_i , + mrvalid_i , + mrready_o , + shclk, + shresetn, + sawid_i , + sawaddr_i , + sawlen_i , + sawsize_i , + sawburst_i , + sawlock_i , + sawcache_i , + sawprot_i , + sawvalid_i , + sawready_o , + swid_i , + swdata_i , + swstrb_i , + swlast_i , + swvalid_i , + swready_o , + sbid_o , + sbresp_o , + sbvalid_o , + sbready_i , + sarid_i , + saraddr_i , + sarlen_i , + sarsize_i , + sarburst_i , + sarlock_i , + sarcache_i , + sarprot_i , + sarvalid_i , + sarready_o , + srid_o , + srdata_o , + srresp_o , + srlast_o , + srvalid_o , + srready_i , + trdata, + twe, + twaddr, + traddr, + twdata, + rrdata, + rwe, + rwaddr, + rraddr, + rwdata, + frdata, + fwe, + fwaddr, + fraddr, + fwdata, + match, + matchval, + matchen, + matchdata, + sdi, + sclk, + scs, + sdo, + rxer, + rxdv, + col, + crs, + rxd, + txen, + txer, + txd, + mdc, + mdi, + mdo, + mden + ); + + parameter MAXIADDRESSWIDTH = 32; + parameter SAXIADDRESSWIDTH = 32; + parameter TFIFODEPTH = 9; + parameter RFIFODEPTH = 9; + parameter TCDEPTH = 1; + parameter RCDEPTH = 2; + parameter MAXIDATAWIDTH = 32; + parameter SAXIDATAWIDTH = 32; + `include "utility.v" + + + input clkt; + input clkr; + output rsttco; + wire rsttco; + output rstrco; + wire rstrco; + + + output interrupt; + wire interrupt; + + output tps; + wire tps; + output rps; + wire rps; + + input mhclk; + input mhresetn; + output [ 3:0] mawid_o ; + output [ 31:0] mawaddr_o ; + output [ 3:0] mawlen_o ; + output [ 2:0] mawsize_o ; + output [ 1:0] mawburst_o ; + output [ 1:0] mawlock_o ; + output [ 3:0] mawcache_o ; + output [ 2:0] mawprot_o ; + output mawvalid_o ; + input mawready_i ; + output [ 3:0] mwid_o ; + output [ 31:0] mwdata_o ; + output [ 3:0] mwstrb_o ; + output mwlast_o ; + output mwvalid_o ; + input mwready_i ; + input [ 3:0] mbid_i ; + input [ 1:0] mbresp_i ; + input mbvalid_i ; + output mbready_o ; + output [ 3:0] marid_o ; + output [ 31:0] maraddr_o ; + output [ 3:0] marlen_o ; + output [ 2:0] marsize_o ; + output [ 1:0] marburst_o ; + output [ 1:0] marlock_o ; + output [ 3:0] marcache_o ; + output [ 2:0] marprot_o ; + output marvalid_o ; + input marready_i ; + input [ 3:0] mrid_i ; + input [ 31:0] mrdata_i ; + input [ 1:0] mrresp_i ; + input mrlast_i ; + input mrvalid_i ; + output mrready_o ; + input shclk; + input shresetn; + + input [ 3:0] sawid_i ; + input [ 31:0] sawaddr_i ; + input [ 3:0] sawlen_i ; + input [ 2:0] sawsize_i ; + input [ 1:0] sawburst_i ; + input [ 1:0] sawlock_i ; + input [ 3:0] sawcache_i ; + input [ 2:0] sawprot_i ; + input sawvalid_i ; + output sawready_o ; + input [ 3:0] swid_i ; + input [ 31:0] swdata_i ; + input [ 3:0] swstrb_i ; + input swlast_i ; + input swvalid_i ; + output swready_o ; + output [ 3:0] sbid_o ; + output [ 1:0] sbresp_o ; + output sbvalid_o ; + input sbready_i ; + input [ 3:0] sarid_i ; + input [ 31:0] saraddr_i ; + input [ 3:0] sarlen_i ; + input [ 2:0] sarsize_i ; + input [ 1:0] sarburst_i ; + input [ 1:0] sarlock_i ; + input [ 3:0] sarcache_i ; + input [ 2:0] sarprot_i ; + input sarvalid_i ; + output sarready_o ; + output [ 3:0] srid_o ; + output [ 31:0] srdata_o ; + output [ 1:0] srresp_o ; + output srlast_o ; + output srvalid_o ; + input srready_i ; + input [MAXIDATAWIDTH - 1:0] trdata; + output twe; + wire twe; + output [TFIFODEPTH - 1:0] twaddr; + wire [TFIFODEPTH - 1:0] twaddr; + output [TFIFODEPTH - 1:0] traddr; + wire [TFIFODEPTH - 1:0] traddr; + output [MAXIDATAWIDTH - 1:0] twdata; + wire [MAXIDATAWIDTH - 1:0] twdata; + + + input [MAXIDATAWIDTH - 1:0] rrdata; + output rwe; + wire rwe; + output [RFIFODEPTH - 1:0] rwaddr; + wire [RFIFODEPTH - 1:0] rwaddr; + output [RFIFODEPTH - 1:0] rraddr; + wire [RFIFODEPTH - 1:0] rraddr; + output [MAXIDATAWIDTH - 1:0] rwdata; + wire [MAXIDATAWIDTH - 1:0] rwdata; + + input [15:0] frdata; + output fwe; + wire fwe; + output [ADDRDEPTH - 1:0] fwaddr; + wire [ADDRDEPTH - 1:0] fwaddr; + output [ADDRDEPTH - 1:0] fraddr; + wire [ADDRDEPTH - 1:0] fraddr; + output [15:0] fwdata; + wire [15:0] fwdata; + + input match; + input matchval; + output matchen; + wire matchen; + output [47:0] matchdata; + wire [47:0] matchdata; + + input sdi; + output sclk; + wire sclk; + output scs; + wire scs; + output sdo; + wire sdo; + + input rxer; + input rxdv; + input col; + input crs; + input [MIIWIDTH - 1:0] rxd; + output txen; + wire txen; + output txer; + wire txer; + output [MIIWIDTH - 1:0] txd; + wire [MIIWIDTH - 1:0] txd; + output mdc; + wire mdc; + input mdi; + output mdo; + wire mdo; + output mden; + wire mden; + + + wire datareq; + wire datareqc; + wire datarw; + wire dataeob; + wire dataeobc; + wire [(MAXIADDRESSWIDTH - 1):0] dataaddr; + wire [(MAXIDATAWIDTH - 1):0] datao; + wire dataack; + wire [(MAXIDATAWIDTH - 1):0] datai; + + wire rstcsr; + wire csrack; + wire [SAXIDATAWIDTH - 1:0] csrdatao; + wire csrreq; + wire csrrw; + wire [SAXIDATAWIDTH / 8 - 1:0] csrbe; + wire [SAXIDATAWIDTH - 1:0] csrdatai; + wire [7:0] csraddr; + + MAC + #(SAXIDATAWIDTH, + MAXIDATAWIDTH, + MAXIADDRESSWIDTH, + TFIFODEPTH, + RFIFODEPTH, + TCDEPTH, + RCDEPTH) + U_MAC ( + .clkdma (mhclk), + .clkcsr (shclk), + .clkt (clkt), + .clkr (clkr), + .rstcsr (rstcsr), + .rsttco (rsttco), + .rstrco (rstrco), + .interrupt (interrupt), + .rps (rps), + .tps (tps), + .csrreq (csrreq), + .csrrw (csrrw), + .csrbe (csrbe), + .csrdatai (csrdatai), + .csrack (csrack), + .csraddr (csraddr), + .csrdatao (csrdatao), + .dataack (dataack), + .datareq (datareq), + .datareqc (datareqc), + .datarw (datarw), + .dataeob (dataeob), + .dataeobc (dataeobc), + .datai (datai), + .dataaddr (dataaddr), + .datao (datao), + .trdata (trdata), + .twe (twe), + .twaddr (twaddr), + .traddr (traddr), + .twdata (twdata), + .rrdata (rrdata), + .rwe (rwe), + .rwaddr (rwaddr), + .rraddr (rraddr), + .rwdata (rwdata), + .frdata (frdata), + .fwe (fwe), + .fraddr (fraddr), + .fwaddr (fwaddr), + .fwdata (fwdata), + .match (match), + .matchval (matchval), + .matchen (matchen), + .matchdata (matchdata), + .sdi (sdi), + .sclk (sclk), + .scs (scs), + .sdo (sdo), + .rxer (rxer), + .rxdv (rxdv), + .col (col), + .crs (crs), + .rxd (rxd), + .txen (txen), + .txer (txer), + .txd (txd), + .mdi (mdi), + .mdo (mdo), + .mden (mden), + .mdc (mdc) + ); + + MAC2AXI + #(MAXIDATAWIDTH, + MAXIADDRESSWIDTH, + SAXIDATAWIDTH, + SAXIADDRESSWIDTH, + MAXIDATAWIDTH, + MAXIADDRESSWIDTH, + SAXIDATAWIDTH, + 8) + U_MAC2AXI ( + + .mhclk (mhclk ), + .mhresetn (mhresetn ), + .shclk (shclk ), + .shresetn (shresetn ), + .mawid_o (mawid_o ), + .mawaddr_o (mawaddr_o ), + .mawlen_o (mawlen_o ), + .mawsize_o (mawsize_o ), + .mawburst_o (mawburst_o ), + .mawlock_o (mawlock_o ), + .mawcache_o (mawcache_o ), + .mawprot_o (mawprot_o ), + .mawvalid_o (mawvalid_o ), + .mawready_i (mawready_i ), + .mwid_o (mwid_o ), + .mwdata_o (mwdata_o ), + .mwstrb_o (mwstrb_o ), + .mwlast_o (mwlast_o ), + .mwvalid_o (mwvalid_o ), + .mwready_i (mwready_i ), + .mbid_i (mbid_i ), + .mbresp_i (mbresp_i ), + .mbvalid_i (mbvalid_i ), + .mbready_o (mbready_o ), + .marid_o (marid_o ), + .maraddr_o (maraddr_o ), + .marlen_o (marlen_o ), + .marsize_o (marsize_o ), + .marburst_o (marburst_o ), + .marlock_o (marlock_o ), + .marcache_o (marcache_o ), + .marprot_o (marprot_o ), + .marvalid_o (marvalid_o ), + .marready_i (marready_i ), + .mrid_i (mrid_i ), + .mrdata_i (mrdata_i ), + .mrresp_i (mrresp_i ), + .mrlast_i (mrlast_i ), + .mrvalid_i (mrvalid_i ), + .mrready_o (mrready_o ), + .sawid_i (sawid_i ), + .sawaddr_i (sawaddr_i ), + .sawlen_i (sawlen_i ), + .sawsize_i (sawsize_i ), + .sawburst_i (sawburst_i ), + .sawlock_i (sawlock_i ), + .sawcache_i (sawcache_i ), + .sawprot_i (sawprot_i ), + .sawvalid_i (sawvalid_i ), + .sawready_o (sawready_o ), + .swid_i (swid_i ), + .swdata_i (swdata_i ), + .swstrb_i (swstrb_i ), + .swlast_i (swlast_i ), + .swvalid_i (swvalid_i ), + .swready_o (swready_o ), + .sbid_o (sbid_o ), + .sbresp_o (sbresp_o ), + .sbvalid_o (sbvalid_o ), + .sbready_i (sbready_i ), + .sarid_i (sarid_i ), + .saraddr_i (saraddr_i ), + .sarlen_i (sarlen_i ), + .sarsize_i (sarsize_i ), + .sarburst_i (sarburst_i ), + .sarlock_i (sarlock_i ), + .sarcache_i (sarcache_i ), + .sarprot_i (sarprot_i ), + .sarvalid_i (sarvalid_i ), + .sarready_o (sarready_o ), + .srid_o (srid_o ), + .srdata_o (srdata_o ), + .srresp_o (srresp_o ), + .srlast_o (srlast_o ), + .srvalid_o (srvalid_o ), + .srready_i (srready_i ), + .datareq (datareq ), + .datareqc (datareqc ), + .datarw (datarw ), + .dataeob (dataeob ), + .dataeobc (dataeobc ), + .dataaddr (dataaddr ), + .datao (datao ), + .dataack (dataack ), + .datai (datai ), + .rstcsr (rstcsr ), + .csrack (csrack ), + .csrdatao (csrdatao ), + .csrreq (csrreq ), + .csrrw (csrrw ), + .csrbe (csrbe ), + .csrdatai (csrdatai ), + .csraddr (csraddr ) + ); + +endmodule diff --git a/resources/soc/rtl/MAC/mac_top.v b/resources/soc/rtl/MAC/mac_top.v new file mode 100644 index 0000000..f20c1df --- /dev/null +++ b/resources/soc/rtl/MAC/mac_top.v @@ -0,0 +1,445 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module mac_top +( + hclk, + hrst_, + + mawid_o , + mawaddr_o , + mawlen_o , + mawsize_o , + mawburst_o , + mawlock_o , + mawcache_o , + mawprot_o , + mawvalid_o , + mawready_i , + mwid_o , + mwdata_o , + mwstrb_o , + mwlast_o , + mwvalid_o , + mwready_i , + mbid_i , + mbresp_i , + mbvalid_i , + mbready_o , + marid_o , + maraddr_o , + marlen_o , + marsize_o , + marburst_o , + marlock_o , + marcache_o , + marprot_o , + marvalid_o , + marready_i , + mrid_i , + mrdata_i , + mrresp_i , + mrlast_i , + mrvalid_i , + mrready_o , + sawid_i , + sawaddr_i , + sawlen_i , + sawsize_i , + sawburst_i , + sawlock_i , + sawcache_i , + sawprot_i , + sawvalid_i , + sawready_o , + swid_i , + swdata_i , + swstrb_i , + swlast_i , + swvalid_i , + swready_o , + sbid_o , + sbresp_o , + sbvalid_o , + sbready_i , + sarid_i , + saraddr_i , + sarlen_i , + sarsize_i , + sarburst_i , + sarlock_i , + sarcache_i , + sarprot_i , + sarvalid_i , + sarready_o , + srid_o , + srdata_o , + srresp_o , + srlast_o , + srvalid_o , + srready_i , + + interrupt , + + mtxclk , + mtxen , + mtxd , + mtxerr , + mrxclk , + mrxdv , + mrxd , + mrxerr , + mcoll , + mcrs , + mdc , + md_i , + md_o , + md_oe , + + trdata , + twe , + twaddr , + traddr , + twdata , + + rrdata , + rwe , + rwaddr , + rraddr , + rwdata + +); + + +input hclk; +input hrst_; + output [ 3:0] mawid_o ; + output [ 31:0] mawaddr_o ; + output [ 3:0] mawlen_o ; + output [ 2:0] mawsize_o ; + output [ 1:0] mawburst_o ; + output [ 1:0] mawlock_o ; + output [ 3:0] mawcache_o ; + output [ 2:0] mawprot_o ; + output mawvalid_o ; + input mawready_i ; + output [ 3:0] mwid_o ; + output [ 31:0] mwdata_o ; + output [ 3:0] mwstrb_o ; + output mwlast_o ; + output mwvalid_o ; + input mwready_i ; + input [ 3:0] mbid_i ; + input [ 1:0] mbresp_i ; + input mbvalid_i ; + output mbready_o ; + output [ 3:0] marid_o ; + output [ 31:0] maraddr_o ; + output [ 3:0] marlen_o ; + output [ 2:0] marsize_o ; + output [ 1:0] marburst_o ; + output [ 1:0] marlock_o ; + output [ 3:0] marcache_o ; + output [ 2:0] marprot_o ; + output marvalid_o ; + input marready_i ; + input [ 3:0] mrid_i ; + input [ 31:0] mrdata_i ; + input [ 1:0] mrresp_i ; + input mrlast_i ; + input mrvalid_i ; + output mrready_o ; + + input [ 3:0] sawid_i ; + input [ 31:0] sawaddr_i ; + input [ 3:0] sawlen_i ; + input [ 2:0] sawsize_i ; + input [ 1:0] sawburst_i ; + input [ 1:0] sawlock_i ; + input [ 3:0] sawcache_i ; + input [ 2:0] sawprot_i ; + input sawvalid_i ; + output sawready_o ; + input [ 3:0] swid_i ; + input [ 31:0] swdata_i ; + input [ 3:0] swstrb_i ; + input swlast_i ; + input swvalid_i ; + output swready_o ; + output [ 3:0] sbid_o ; + output [ 1:0] sbresp_o ; + output sbvalid_o ; + input sbready_i ; + input [ 3:0] sarid_i ; + input [ 31:0] saraddr_i ; + input [ 3:0] sarlen_i ; + input [ 2:0] sarsize_i ; + input [ 1:0] sarburst_i ; + input [ 1:0] sarlock_i ; + input [ 3:0] sarcache_i ; + input [ 2:0] sarprot_i ; + input sarvalid_i ; + output sarready_o ; + output [ 3:0] srid_o ; + output [ 31:0] srdata_o ; + output [ 1:0] srresp_o ; + output srlast_o ; + output srvalid_o ; + input srready_i ; +input mtxclk; +output [3:0] mtxd; +output mtxen; +output mtxerr; + +input mrxclk; +input [3:0] mrxd; +input mrxdv; +input mrxerr; + +input mcoll; +input mcrs; + +input md_i; +output mdc; +output md_o; +output md_oe; + +output interrupt; + + +`define MAHBDATAWIDTH 32 +`define TFIFODEPTH 9 +`define RFIFODEPTH 9 +`define ADDRDEPTH 6 + +input [`MAHBDATAWIDTH - 1:0] trdata; +output twe; +wire twe; +output [`TFIFODEPTH - 1:0] twaddr; +wire [`TFIFODEPTH - 1:0] twaddr; +output [`TFIFODEPTH - 1:0] traddr; +wire [`TFIFODEPTH - 1:0] traddr; +output [`MAHBDATAWIDTH - 1:0] twdata; +wire [`MAHBDATAWIDTH - 1:0] twdata; + +input [`MAHBDATAWIDTH - 1:0] rrdata; +output rwe; +wire rwe; +output [`RFIFODEPTH - 1:0] rwaddr; +wire [`RFIFODEPTH - 1:0] rwaddr; +output [`RFIFODEPTH - 1:0] rraddr; +wire [`RFIFODEPTH - 1:0] rraddr; +output [`MAHBDATAWIDTH - 1:0] rwdata; +wire [`MAHBDATAWIDTH - 1:0] rwdata; + +wire tps,rps,rsttco,rstrco,sclk,scs,sdo; + +wire [15:0] frdata; +wire fwe; +wire [`ADDRDEPTH - 1:0] fwaddr; +wire [`ADDRDEPTH - 1:0] fraddr; +wire [15:0] fwdata; + +wire match; +wire matchval; +wire matchen; +wire [47:0] matchdata; + +assign match = 1'b0; +assign matchval = 1'b0; + +RegFile2_64x16 u_addr_ram +( +.CLKA(mrxclk), .CENA(1'b0), .AA(fraddr), .QA(frdata), +.CLKB(hclk), .CENB(!fwe), .AB(fwaddr), .DB(fwdata) +); + +MAC_AXI u_mac_axi ( + .clkt(mtxclk), + .clkr(mrxclk), + .rsttco(rsttco), + .rstrco(rstrco), + .interrupt(interrupt), + .tps(tps), + .rps(rps), + + .mhclk (hclk ), + .mhresetn (hrst_ ), + .mawid_o (mawid_o ), + .mawaddr_o (mawaddr_o ), + .mawlen_o (mawlen_o ), + .mawsize_o (mawsize_o ), + .mawburst_o (mawburst_o ), + .mawlock_o (mawlock_o ), + .mawcache_o (mawcache_o ), + .mawprot_o (mawprot_o ), + .mawvalid_o (mawvalid_o ), + .mawready_i (mawready_i ), + .mwid_o (mwid_o ), + .mwdata_o (mwdata_o ), + .mwstrb_o (mwstrb_o ), + .mwlast_o (mwlast_o ), + .mwvalid_o (mwvalid_o ), + .mwready_i (mwready_i ), + .mbid_i (mbid_i ), + .mbresp_i (mbresp_i ), + .mbvalid_i (mbvalid_i ), + .mbready_o (mbready_o ), + .marid_o (marid_o ), + .maraddr_o (maraddr_o ), + .marlen_o (marlen_o ), + .marsize_o (marsize_o ), + .marburst_o (marburst_o ), + .marlock_o (marlock_o ), + .marcache_o (marcache_o ), + .marprot_o (marprot_o ), + .marvalid_o (marvalid_o ), + .marready_i (marready_i ), + .mrid_i (mrid_i ), + .mrdata_i (mrdata_i ), + .mrresp_i (mrresp_i ), + .mrlast_i (mrlast_i ), + .mrvalid_i (mrvalid_i ), + .mrready_o (mrready_o ), + .shclk (hclk ), + .shresetn (hrst_ ), + .sawid_i (sawid_i ), + .sawaddr_i (sawaddr_i ), + .sawlen_i (sawlen_i ), + .sawsize_i (sawsize_i ), + .sawburst_i (sawburst_i ), + .sawlock_i (sawlock_i ), + .sawcache_i (sawcache_i ), + .sawprot_i (sawprot_i ), + .sawvalid_i (sawvalid_i ), + .sawready_o (sawready_o ), + .swid_i (swid_i ), + .swdata_i (swdata_i ), + .swstrb_i (swstrb_i ), + .swlast_i (swlast_i ), + .swvalid_i (swvalid_i ), + .swready_o (swready_o ), + .sbid_o (sbid_o ), + .sbresp_o (sbresp_o ), + .sbvalid_o (sbvalid_o ), + .sbready_i (sbready_i ), + .sarid_i (sarid_i ), + .saraddr_i (saraddr_i ), + .sarlen_i (sarlen_i ), + .sarsize_i (sarsize_i ), + .sarburst_i (sarburst_i ), + .sarlock_i (sarlock_i ), + .sarcache_i (sarcache_i ), + .sarprot_i (sarprot_i ), + .sarvalid_i (sarvalid_i ), + .sarready_o (sarready_o ), + .srid_o (srid_o ), + .srdata_o (srdata_o ), + .srresp_o (srresp_o ), + .srlast_o (srlast_o ), + .srvalid_o (srvalid_o ), + .srready_i (srready_i ), + .trdata(trdata), + .twe(twe), + .twaddr(twaddr), + .traddr(traddr), + .twdata(twdata), + .rrdata(rrdata), + .rwe(rwe), + .rwaddr(rwaddr), + .rraddr(rraddr), + .rwdata(rwdata), + .frdata(frdata), + .fwe(fwe), + .fwaddr(fwaddr), + .fraddr(fraddr), + .fwdata(fwdata), + .match(match), + .matchval(matchval), + .matchen(matchen), + .matchdata(matchdata), + .sdi(1'b0), + .sclk(sclk), + .scs(scs), + .sdo(sdo), + .rxer(mrxerr), + .rxdv(mrxdv), + .col(mcoll), + .crs(mcrs), + .rxd(mrxd), + .txen(mtxen), + .txer(mtxerr), + .txd(mtxd), + .mdc(mdc), + .mdi(md_i), + .mdo(md_o), + .mden(md_oe) + ); + +endmodule + +module RegFile2_64x16 ( + QA, + AA, + CLKA, + CENA, + AB, + DB, + CLKB, + CENB +); + parameter BITS = 16; + parameter word_depth = 64; + parameter addr_width = 6; + output [15:0] QA; + input [5:0] AA; + input CLKA; + input CENA; + input [5:0] AB; + input [15:0] DB; + input CLKB; + input CENB; + reg [15:0] QA; + + reg [BITS-1:0] mem [word_depth-1:0]; + + wire NOT_CENA; + wire NOT_CENB; + + not (NOT_CENA, CENA); + always @ ( posedge CLKA ) if ( NOT_CENA ) QA<=mem[AA]; + + not (NOT_CENB, CENB); + always @ ( posedge CLKB ) if ( NOT_CENB ) mem[AB]<=DB; + +endmodule diff --git a/resources/soc/rtl/MAC/maccsr2axi.v b/resources/soc/rtl/MAC/maccsr2axi.v new file mode 100644 index 0000000..15e9d7a --- /dev/null +++ b/resources/soc/rtl/MAC/maccsr2axi.v @@ -0,0 +1,291 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module MACCSR2AXI ( + saclk , + saresetn , + awid_i , + awaddr_i , + awlen_i , + awsize_i , + awburst_i , + awlock_i , + awcache_i , + awprot_i , + awvalid_i , + awready_o , + wid_i , + wdata_i , + wstrb_i , + wlast_i , + wvalid_i , + wready_o , + bid_o , + bresp_o , + bvalid_o , + bready_i , + arid_i , + araddr_i , + arlen_i , + arsize_i , + arburst_i , + arlock_i , + arcache_i , + arprot_i , + arvalid_i , + arready_o , + rid_o , + rdata_o , + rresp_o , + rlast_o , + rvalid_o , + rready_i , + + rstcsr , + csrack , + csrdatao , + csrreq , + csrrw , + csrbe , + csrdatai , + csraddr + ); + + + parameter SAXIDATAWIDTH = 32; + parameter SAXIADDRESSWIDTH = 32; + parameter CSRDATAWIDTH = 32; + parameter CSRADDRESSWIDTH = 8; + + + + input saclk; + input saresetn; + input [ 3:0] awid_i ; + input [ 31:0] awaddr_i ; + input [ 3:0] awlen_i ; + input [ 2:0] awsize_i ; + input [ 1:0] awburst_i ; + input [ 1:0] awlock_i ; + input [ 3:0] awcache_i ; + input [ 2:0] awprot_i ; + input awvalid_i ; + output awready_o ; + input [ 3:0] wid_i ; + input [ 31:0] wdata_i ; + input [ 3:0] wstrb_i ; + input wlast_i ; + input wvalid_i ; + output wready_o ; + output [ 3:0] bid_o ; + output [ 1:0] bresp_o ; + output bvalid_o ; + input bready_i ; + input [ 3:0] arid_i ; + input [ 31:0] araddr_i ; + input [ 3:0] arlen_i ; + input [ 2:0] arsize_i ; + input [ 1:0] arburst_i ; + input [ 1:0] arlock_i ; + input [ 3:0] arcache_i ; + input [ 2:0] arprot_i ; + input arvalid_i ; + output arready_o ; + output [ 3:0] rid_o ; + output [ 31:0] rdata_o ; + output [ 1:0] rresp_o ; + output rlast_o ; + output rvalid_o ; + input rready_i ; + + + output rstcsr; + wire rstcsr; + input csrack; + input [CSRDATAWIDTH - 1:0] csrdatao; + output csrreq; + wire csrreq; + output csrrw; + wire csrrw; + output [CSRDATAWIDTH / 8 - 1:0] csrbe; + wire [CSRDATAWIDTH / 8 - 1:0] csrbe; + output [CSRDATAWIDTH - 1:0] csrdatai; + wire [CSRDATAWIDTH - 1:0] csrdatai; + output [CSRADDRESSWIDTH - 1:0] csraddr; + wire [CSRADDRESSWIDTH - 1:0] csraddr; + + +reg isWriting; +reg isReading; +wire awready; +wire arready; +wire wvalid; +wire wlast; +wire wready; +wire rvalid; +wire rlast; +wire rready; + +assign wvalid = wvalid_i; +assign wlast = wlast_i; + +always @(posedge saclk) +begin + if (!saresetn || (wlast && wvalid && wready)) + begin + isWriting <= 1'b0; + end + else if (awvalid_i && awready) + begin + isWriting <= 1'b1; + end +end +always @(posedge saclk) +begin + if (!saresetn || (rlast && rvalid && rready)) + begin + isReading <= 1'b0; + end + else if (arvalid_i && arready) + begin + isReading <= 1'b1; + end +end + +wire arvalid; +wire rd_valid; +wire [1:0] rresp; +wire [31:0] rdata; +reg [31:0] rd_addr; +reg [3:0] rid; +reg [2:0] rd_size; + + +assign arvalid = arvalid_i; +assign rd_valid = arvalid & arready; +assign rready = rready_i; +assign rresp = 2'b00; + +always @(posedge saclk) + if(rd_valid) begin + rid <= arid_i; + end + +always @(posedge saclk) +begin + if(!saresetn) begin + rd_addr <= 32'h0; + end + else if (rd_valid) begin + rd_addr <= araddr_i; + end +end + +assign arready = csrack & !isWriting & !isReading; +assign rvalid = csrrw & csrack; +assign rlast = 1'b1; +assign rdata = csrdatao; + +reg [31:0] wr_addr; +wire wr_valid; +wire [3:0] wr_strb; +wire awvalid; +wire bready; + +assign awvalid = awvalid_i; +assign awready = csrack & !isWriting & !isReading; +assign wready = !csrrw && csrack; +assign bready = bready_i; +assign wr_strb = {4{wvalid}} & wstrb_i; +assign wr_valid = awvalid & awready; + + +always @(posedge saclk) +begin + if(!saresetn) begin + wr_addr <= 32'h0; + end + else if (wr_valid) begin + wr_addr <= awaddr_i; + end +end + + +wire w_resp_valid; +reg w_resp_valid_r; +reg[3:0] bid_r; +assign w_resp_valid = wvalid & wlast & wready; +always @(posedge saclk) + if(!saresetn) begin + w_resp_valid_r <= 1'b0; + bid_r <= 4'b0; + end + else if(w_resp_valid) begin + w_resp_valid_r <= 1'b1; + bid_r <= wid_i; + end + else if(bready) begin + w_resp_valid_r <= 1'b0; + end + +wire [1:0] bresp = 2'b00; +wire [3:0] bid = bid_r; +wire bvalid = w_resp_valid_r; + +assign csrdatai = wdata_i; + +assign csrbe = wr_strb; + +assign csraddr = csrrw ? rd_addr[7:0]: wr_addr[7:0]; + +assign csrreq = isWriting | isReading; + +assign csrrw = isReading; + +assign rstcsr = ~saresetn; + +assign awready_o = awready; +assign wready_o = wready; + +assign bid_o = bid; +assign bresp_o = bresp; +assign bvalid_o = bvalid; + +assign arready_o = arready; +assign rid_o = rid; +assign rdata_o = rdata; +assign rresp_o = rresp; +assign rlast_o = rlast; +assign rvalid_o = rvalid; + +endmodule diff --git a/resources/soc/rtl/MAC/macdata2axi.v b/resources/soc/rtl/MAC/macdata2axi.v new file mode 100644 index 0000000..ca70bea --- /dev/null +++ b/resources/soc/rtl/MAC/macdata2axi.v @@ -0,0 +1,248 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module MACDATA2AXI ( + maclk , + maresetn , + + awid_o , + awaddr_o , + awlen_o , + awsize_o , + awburst_o , + awlock_o , + awcache_o , + awprot_o , + awvalid_o , + awready_i , + wid_o , + wdata_o , + wstrb_o , + wlast_o , + wvalid_o , + wready_i , + bid_i , + bresp_i , + bvalid_i , + bready_o , + arid_o , + araddr_o , + arlen_o , + arsize_o , + arburst_o , + arlock_o , + arcache_o , + arprot_o , + arvalid_o , + arready_i , + rid_i , + rdata_i , + rresp_i , + rlast_i , + rvalid_i , + rready_o , + datareq , + datareqc , + datarw , + dataeob , + dataeobc , + dataaddr , + datao , + dataack , + datai + ); + + parameter MAXIDATAWIDTH = 32; + parameter MAXIADDRESSWIDTH = 32; + parameter MACDATAWIDTH = 32; + parameter MACADDRESSWIDTH = 32; + + +input maclk; +input maresetn; +output [ 3:0] awid_o ; +output [ 31:0] awaddr_o ; +output [ 3:0] awlen_o ; +output [ 2:0] awsize_o ; +output [ 1:0] awburst_o ; +output [ 1:0] awlock_o ; +output [ 3:0] awcache_o ; +output [ 2:0] awprot_o ; +output awvalid_o ; +input awready_i ; +output [ 3:0] wid_o ; +output [ 31:0] wdata_o ; +output [ 3:0] wstrb_o ; +output wlast_o ; +output wvalid_o ; +input wready_i ; +input [ 3:0] bid_i ; +input [ 1:0] bresp_i ; +input bvalid_i ; +output bready_o ; +output [ 3:0] arid_o ; +output [ 31:0] araddr_o ; +output [ 3:0] arlen_o ; +output [ 2:0] arsize_o ; +output [ 1:0] arburst_o ; +output [ 1:0] arlock_o ; +output [ 3:0] arcache_o ; +output [ 2:0] arprot_o ; +output arvalid_o ; +input arready_i ; +input [ 3:0] rid_i ; +input [ 31:0] rdata_i ; +input [ 1:0] rresp_i ; +input rlast_i ; +input rvalid_i ; +output rready_o ; + + +input datareq; +input datareqc; +input datarw; +input dataeob; +input dataeobc; +input [MACADDRESSWIDTH - 1:0] dataaddr; +input [MACDATAWIDTH - 1:0] datao; +output dataack; +wire dataack; +output [MACDATAWIDTH - 1:0] datai; +wire [MACDATAWIDTH - 1:0] datai; + + +assign arid_o = 4'h1; +assign arsize_o = 3'b010; +assign arlen_o = 4'b0000; +assign arburst_o = 2'b01; +assign arlock_o = 2'b00; +assign arcache_o = 4'b0000; +assign arprot_o = 3'b110; + +reg isWriting; +reg isReading; + +always @(posedge maclk) +begin + if (!maresetn || (wlast_o && wvalid_o && wready_i)) + begin + isWriting <= 1'b0; + end + else if (awvalid_o && awready_i) + begin + isWriting <= 1'b1; + end +end + +always @(posedge maclk) +begin + if (!maresetn || (rlast_i && rvalid_i && rready_o)) + begin + isReading <= 1'b0; + end + else if (arvalid_o && arready_i) + begin + isReading <= 1'b1; + end +end + +reg [MACADDRESSWIDTH-1:0] dataAddr_c_r; +wire [MACADDRESSWIDTH-1:0] dataAddr_c; +wire dataAddr_sel; +reg dataReq_r; + +always @(posedge maclk) +begin + dataReq_r <= datareq; +end + +wire dataAddr_c_r_en; +assign dataAddr_c_r_en = (awvalid_o & awready_i) | + (arvalid_o & arready_i); +always @(posedge maclk) +begin + if (!maresetn) + begin + dataAddr_c_r <= 32'd0; + end + else if ( dataAddr_c_r_en) + begin + dataAddr_c_r <= dataAddr_c; + end +end + +assign dataAddr_sel = datareq & (~dataReq_r | dataeob); +assign dataAddr_c = dataAddr_sel ? dataaddr : dataAddr_c_r+3'b100; + +wire arvalid; +assign arvalid = datareq & datarw & ~isWriting & ~isReading; + +assign araddr_o = dataAddr_c; +assign arvalid_o = arvalid; + +assign rready_o = 1'b1; +assign datai = rdata_i; +wire readDataAck; +assign readDataAck = rvalid_i & rready_o; + +assign awid_o = 4'h1; +assign awsize_o = 3'b010; +assign awlen_o = 4'b0000; +assign awburst_o = 2'b01; +assign awlock_o = 2'b00; +assign awcache_o = 4'b0000; +assign awprot_o = 3'b110; + +wire awvalid; +assign awvalid = datareq & ~datarw & ~isWriting & ~isReading; + +assign awvalid_o = awvalid; +assign awaddr_o = dataAddr_c; + +wire wvalid; +assign wid_o = 4'h1; +assign wlast_o = 1'b1; +assign wdata_o = datao; +assign wstrb_o = 4'b1111; + +assign wvalid = (awvalid_o & awready_i) | isWriting; +assign wvalid_o = wvalid; + +wire writeDataAck; +assign writeDataAck = wvalid & wready_i; + +assign bready_o = 1'b1; + +assign dataack = readDataAck | writeDataAck; + +endmodule diff --git a/resources/soc/rtl/MAC/rc.v b/resources/soc/rtl/MAC/rc.v new file mode 100644 index 0000000..2e26c57 --- /dev/null +++ b/resources/soc/rtl/MAC/rc.v @@ -0,0 +1,1749 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module RC ( + clk, + rst, + rxdv, + rxer, + rxd, + col, + ramwe, + ramaddr, + ramdata, + fdata, + faddr, + cachenf, + radg, + wadg, + rprog, + rcpoll, + riack, + ren, + ra, + pm, + pr, + pb, + rif, + ho, + hp, + rireq, + ff, + rf, + mf, + db, + re, + ce, + tl, + ftp, + ov, + cs, + length, + match, + matchval, + matchen, + matchdata, + focl, + foclack, + oco, + focg, + mfcl, + mfclack, + mfo, + mfcg, + stopi, + stopo, + rcsack, + rcsreq, + insert_en_i +); + + parameter FIFODEPTH = 9; + parameter DATAWIDTH = 32; + + `include "utility.v" + + input clk; + input rst; + + input col; + input rxdv; + input rxer; + input [MIIWIDTH - 1:0] rxd; + + output ramwe; + wire ramwe; + output [FIFODEPTH - 1:0] ramaddr; + wire [FIFODEPTH - 1:0] ramaddr; + output [DATAWIDTH - 1:0] ramdata; + wire [DATAWIDTH - 1:0] ramdata; + + input [ADDRWIDTH - 1:0] fdata; + output [ADDRDEPTH - 1:0] faddr; + wire [ADDRDEPTH - 1:0] faddr; + + input cachenf; + input [FIFODEPTH - 1:0] radg; + output [FIFODEPTH - 1:0] wadg; + wire [FIFODEPTH - 1:0] wadg; + output rprog; + reg rprog; + output rcpoll; + wire rcpoll; + + input riack; + input ren; + input ra; + input pm; + input pr; + input pb; + input rif; + input ho; + input hp; + output rireq; + reg rireq; + output ff; + reg ff; + output rf; + reg rf; + output mf; + reg mf; + output db; + reg db; + output re; + reg re; + output ce; + reg ce; + output tl; + reg tl; + output ftp; + reg ftp; + output cs; + reg cs; + output ov; + reg ov; + output [13:0] length; + reg [13:0] length; + + input match; + input matchval; + output matchen; + reg matchen; + output [47:0] matchdata; + wire [47:0] matchdata; + + input focl; + output foclack; + wire foclack; + output oco; + reg oco; + output [10:0] focg; + reg [10:0] focg; + input mfcl; + output mfclack; + output mfo; + reg mfo; + output [15:0] mfcg; + reg [15:0] mfcg; + + input stopi; + output stopo; + reg stopo; + + input rcsack; + output rcsreq; + reg rcsreq; + + input insert_en_i; + + + reg insert_en_0_r; + reg insert_en_r; + + reg we; + reg full; + reg [FIFODEPTH - 1:0] wad; + reg [FIFODEPTH - 1:0] wadi; + reg [FIFODEPTH - 1:0] iwadg; + reg [FIFODEPTH - 1:0] wadig; + reg [FIFODEPTH - 1:0] radg_0_r; + reg [FIFODEPTH - 1:0] radg_r; + reg [FIFODEPTH - 1:0] isofad; + reg cachenf_r; + reg cachenf_2r; + reg fcfbci; + reg fcfbci_r; + reg eorfff; + + + reg col_r; + reg rxdv_r; + reg rxer_r; + reg [MIIWIDTH - 1:0] rxd_r; + wire [3:0] rxd_r4; + + reg [3:0] rsm_c; + reg [3:0] rsm; + reg [3:0] ncnt; + wire [1:0] ncnt10; + wire [2:0] ncnt20; + reg [DATAWIDTH - 1:0] data_c; + reg [DATAWIDTH - 1:0] data; + reg [31:0] crc_c; + reg [31:0] crc; + reg [6:0] bcnt; + wire [2:0] bcnt20; + reg bz; + reg winp; + wire iri_c; + reg iri; + reg riack_r; + reg [13:0] lcnt; + reg [15:0] lfield; + reg ren_r; + reg irprog; + + reg [2:0] fsm_c; + reg [2:0] fsm; + reg perfm_c; + reg perfm; + reg invm; + reg [8:0] crchash; + reg hash; + reg [47:0] dest; + reg [2:0] flcnt; + reg [ADDRDEPTH - 1:0] fa; + reg [15:0] fdata_r; + + reg rcs; + reg rcsack_r; + reg [7:0] rcscnt; + + reg [10:0] focnt; + reg focl_r; + reg [15:0] mfcnt; + reg mfcl_r; + + reg stop_r; + + wire [FIFODEPTH - 1:0] fzero; + wire [MIIWIDTH_MAX + 1:0] mzero_max; + wire [MIIWIDTH_MAX + 1:0] rxd_r_max; + + always @(posedge clk) + begin : mii_reg_proc + if (rst) + begin + col_r <= 1'b0; + rxdv_r <= 1'b0 ; + rxer_r <= 1'b0 ; + rxd_r <= {MIIWIDTH{1'b0}} ; + data <= {DATAWIDTH{1'b1}} ; + end + else + begin + col_r <= col ; + rxdv_r <= rxdv ; + rxer_r <= rxer ; + rxd_r <= rxd ; + data <= data_c ; + end + end + + assign rxd_r4 = rxd_r_max[MIIWIDTH-1:0]; + + assign ncnt10 = ncnt[1:0] ; + + assign ncnt20 = ncnt[2:0] ; + + wire [2:0] n_offset; + assign n_offset = (insert_en_r) ? ((ncnt20 + 3'b100) & 3'b111) : ncnt20; + + always @(ncnt or ncnt10 or n_offset or rxd_r_max or data) + begin : data_proc + reg[15:0] data16; + reg[31:0] data32; + case (DATAWIDTH) + 8 : + begin + data_c <= data ; + if (!(ncnt[0])) + begin + data_c[3:0] <= rxd_r_max[MIIWIDTH-1:0] ; + end + else + begin + data_c[7:4] <= rxd_r_max[MIIWIDTH-1:0] ; + end + end + 16 : + begin + data16 = data; + case (ncnt10) + 2'b00 : + begin + data16[3:0] = rxd_r_max[MIIWIDTH-1:0]; + end + 2'b01 : + begin + data16[7:4] = rxd_r_max[MIIWIDTH-1:0]; + end + 2'b10 : + begin + data16[11:8] = rxd_r_max[MIIWIDTH-1:0]; + end + default : + begin + data16[15:12] = rxd_r_max[MIIWIDTH-1:0]; + end + endcase + data_c <= data16 ; + end + default : + begin + data32 = data; + case (n_offset) + 3'b000 : + begin + data32[3:0] = rxd_r_max[MIIWIDTH-1:0]; + end + 3'b001 : + begin + data32[7:4] = rxd_r_max[MIIWIDTH-1:0]; + end + 3'b010 : + begin + data32[11:8] = rxd_r_max[MIIWIDTH-1:0]; + end + 3'b011 : + begin + data32[15:12] = rxd_r_max[MIIWIDTH-1:0]; + end + 3'b100 : + begin + data32[19:16] = rxd_r_max[MIIWIDTH-1:0]; + end + 3'b101 : + begin + data32[23:20] = rxd_r_max[MIIWIDTH-1:0]; + end + 3'b110 : + begin + data32[27:24] = rxd_r_max[MIIWIDTH-1:0]; + end + default : + begin + data32[31:28] = rxd_r_max[MIIWIDTH-1:0]; + end + endcase + data_c <= data32 ; + end + endcase + end + + always @(posedge clk) + begin : fifofull_reg_proc + if (rst) + begin + cachenf_r <= 1'b1 ; + cachenf_2r <= 1'b1 ; + full <= 1'b0 ; + end + else + begin + cachenf_r <= cachenf ; + + if(cachenf_2r | + ( + (!rxdv_r & cachenf_r) | + ( rxdv_r & cachenf_r & + (rsm==RSM_IDLE_RCSMT | rsm==RSM_SFD) + ) + ) + ) + begin + cachenf_2r <= cachenf ; + end + + if ((wadig == radg_r) | (iwadg == radg_r & full)) + begin + full <= 1'b1 ; + end + else + begin + full <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : addr_reg_proc + if (rst) + begin + wad <= {FIFODEPTH{1'b0}} ; + wadi <= {fzero[FIFODEPTH - 1:1], 1'b1} ; + iwadg <= {FIFODEPTH{1'b0}} ; + isofad <= {FIFODEPTH{1'b0}} ; + wadig <= {fzero[FIFODEPTH - 1:1],1'b1} ; + radg_0_r <= {FIFODEPTH{1'b0}} ; + radg_r <= {FIFODEPTH{1'b0}} ; + insert_en_0_r <= 1'b0; + insert_en_r <= 1'b0; + end + else + begin + if (rsm == RSM_BAD) + begin + wad <= isofad ; + end + else if (we) + begin + wad <= wad + 1 ; + end + + if (rsm == RSM_BAD) + begin + wadi <= isofad + 1 ; + end + else if (we) + begin + wadi <= wadi + 1 ; + end + + iwadg[FIFODEPTH - 1] <= wad[FIFODEPTH - 1] ; + begin : iwaddrg_loop + integer i; + for(i = FIFODEPTH - 2; i >= 0; i = i - 1) + begin + iwadg[i] <= wad[i + 1] ^ wad[i] ; + end + end + + wadig[FIFODEPTH - 1] <= wadi[FIFODEPTH - 1] ; + begin : waddrig_loop + integer i; + for(i = FIFODEPTH - 2; i >= 0; i = i - 1) + begin + wadig[i] <= wadi[i + 1] ^ wadi[i] ; + end + end + + if (rsm == RSM_IDLE_RCSMT) + begin + isofad <= wad ; + end + + radg_0_r <= radg ; + radg_r <= radg_0_r ; + + insert_en_0_r <= insert_en_i; + insert_en_r <= insert_en_0_r; + + end + end + + always @(posedge clk) + begin : we_reg_proc + if (rst) + begin + we <= 1'b0 ; + end + else + begin + if ((rsm == RSM_INFO | + rsm == RSM_DEST | + rsm == RSM_LENGTH | + rsm == RSM_SOURCE) & + ((rxdv_r & ((DATAWIDTH == 8 & (ncnt[0])) | + (DATAWIDTH == 16 & ncnt[1:0] == 2'b11) | + (DATAWIDTH == 32 & n_offset[2:0] == 3'b111))) | + (!rxdv_r & !we & + ( + (DATAWIDTH==32 & n_offset[2:1]!=2'b00) | + (DATAWIDTH==16 & ncnt[1] !=1'b0) + ) + ) | + (full & !we))) + begin + we <= 1'b1 ; + end + else + begin + we <= 1'b0 ; + end + end + end + + assign ramdata = data ; + + assign ramwe = we ; + + assign ramaddr = wad ; + + assign wadg = iwadg ; + + always @(rsm or + rxdv_r or + rxd_r_max or + rxd_r4 or + stop_r or + bz or + fsm or + ra or + pm or + pb or + dest or + riack_r or + full or + ren_r or + winp or + irprog or + cachenf_r) + begin : rsm_proc + case (rsm) + RSM_IDLE_RCSMT : + begin + if (rxdv_r & !stop_r & ren_r) + begin + if (rxd_r_max[MIIWIDTH-1:0] == 4'b0101) + begin + rsm_c <= RSM_SFD ; + end + else + begin + rsm_c <= RSM_IDLE_RCSMT ; + end + end + else + begin + rsm_c <= RSM_IDLE_RCSMT ; + end + end + RSM_SFD : + begin + if (rxdv_r & !full & cachenf_r) + begin + case (rxd_r4) + 4'b1101 : + begin + rsm_c <= RSM_DEST ; + end + 4'b0101 : + begin + rsm_c <= RSM_SFD ; + end + default : + begin + rsm_c <= RSM_IDLE_RCSMT ; + end + endcase + end + else if (full | !cachenf_r) + begin + rsm_c <= RSM_BAD ; + end + else + begin + rsm_c <= RSM_IDLE_RCSMT ; + end + end + RSM_DEST : + begin + if (!rxdv_r | full | !cachenf_r) + begin + rsm_c <= RSM_BAD ; + end + else if (bz) + begin + rsm_c <= RSM_SOURCE ; + end + else + begin + rsm_c <= RSM_DEST ; + end + end + RSM_SOURCE : + begin + if (!rxdv_r) + begin + if ((pb) & (fsm == FSM_MATCH | ra | (pm & (dest[0])))) + begin + rsm_c <= RSM_SUCC ; + end + else + begin + rsm_c <= RSM_BAD ; + end + end + else if (full | !cachenf_r) + begin + rsm_c <= RSM_BAD ; + end + else if (bz) + begin + rsm_c <= RSM_LENGTH ; + end + else + begin + rsm_c <= RSM_SOURCE ; + end + end + RSM_LENGTH : + begin + if (!rxdv_r) + begin + if ((pb) & (fsm == FSM_MATCH | ra | (pm & (dest[0])))) + begin + rsm_c <= RSM_SUCC ; + end + else + begin + rsm_c <= RSM_BAD ; + end + end + else if (full | !cachenf_r) + begin + rsm_c <= RSM_BAD ; + end + else if (bz) + begin + rsm_c <= RSM_INFO ; + end + else + begin + rsm_c <= RSM_LENGTH ; + end + end + RSM_INFO : + begin + if (!rxdv_r) + begin + if ((winp | pb) & + (fsm == FSM_MATCH | ra | (pm & (dest[0])))) + begin + rsm_c <= RSM_SUCC ; + end + else + begin + rsm_c <= RSM_BAD ; + end + end + else if (full | !cachenf_r) + begin + if (winp) + begin + rsm_c <= RSM_SUCC ; + end + else + begin + rsm_c <= RSM_BAD ; + end + end + else if (fsm == FSM_FAIL & !ra & ~(pm & (dest[0]))) + begin + rsm_c <= RSM_BAD ; + end + else + begin + rsm_c <= RSM_INFO ; + end + end + RSM_SUCC : + begin + rsm_c <= RSM_INT ; + end + RSM_INT : + begin + if (riack_r) + begin + rsm_c <= RSM_INT1 ; + end + else + begin + rsm_c <= RSM_INT ; + end + end + RSM_INT1 : + begin + if (!rxdv_r & !riack_r) + begin + rsm_c <= RSM_IDLE_RCSMT ; + end + else + begin + rsm_c <= RSM_INT1 ; + end + end + default : + begin + if (!rxdv_r & !riack_r & !irprog) + begin + rsm_c <= RSM_IDLE_RCSMT ; + end + else + begin + rsm_c <= RSM_BAD ; + end + end + endcase + end + + always @(posedge clk) + begin : rsm_reg_proc + if (rst) + begin + rsm <= RSM_IDLE_RCSMT ; + end + else + begin + rsm <= rsm_c ; + end + end + + always @(posedge clk) + begin : rprog_reg_proc + if (rst) + begin + irprog <= 1'b0 ; + rprog <= 1'b0 ; + end + else + begin + if (rsm == RSM_IDLE_RCSMT | + rsm == RSM_BAD | + rsm == RSM_INT | + rsm == RSM_INT1) + begin + irprog <= 1'b0 ; + end + else + begin + irprog <= 1'b1 ; + end + + if (winp & irprog) + begin + rprog <= 1'b1 ; + end + else + begin + rprog <= 1'b0 ; + end + end + end + + assign rcpoll = irprog ; + + always @(posedge clk) + begin : bncnt_reg_proc + if (rst) + begin + bcnt <= {7{1'b0}} ; + bz <= 1'b0 ; + ncnt <= 4'b0000 ; + end + else + begin + if(cachenf_r) + begin + if (bz | rsm == RSM_IDLE_RCSMT) + begin + case (rsm) + RSM_IDLE_RCSMT : + begin + bcnt <= 7'b0000101 ; + end + RSM_DEST : + begin + bcnt <= 7'b0000101 ; + end + RSM_SOURCE : + begin + bcnt <= 7'b0000001 ; + end + default : + begin + bcnt <= 7'b0110001 ; + end + endcase + end + else + begin + if (ncnt[0]) + begin + bcnt <= bcnt - 1 ; + end + end + end + else + begin + if(!fcfbci_r) + begin + bcnt <= 7'b0111110 ; + end + else + begin + if (!ncnt[0]) + begin + bcnt <= bcnt - 1 ; + end + end + end + + if (bcnt == 7'b0000000 & !ncnt[0]) + begin + bz <= 1'b1 ; + end + else + begin + bz <= 1'b0 ; + end + + if (rsm == RSM_SFD | rsm == RSM_IDLE_RCSMT) + begin + ncnt <= 4'b0000 ; + end + else + begin + ncnt <= ncnt + 1 ; + end + end + end + + always @(posedge clk) + begin : winp_reg_proc + if (rst) + begin + winp <= 1'b0 ; + end + else + begin + if (rsm == RSM_IDLE_RCSMT) + begin + winp <= 1'b0 ; + end + else if ((rsm == RSM_INFO & bz & cachenf_2r) | + (rsm == RSM_BAD & bz & !cachenf_2r)) + begin + winp <= 1'b1 ; + end + end + end + + always @(crc or rsm or rxd_r_max) + begin : crc_proc + case (rsm) + RSM_IDLE_RCSMT : + begin + crc_c <= {32{1'b1}} ; + end + RSM_DEST, RSM_SOURCE, RSM_LENGTH, RSM_INFO : + begin + crc_c[0] <= crc[28] ^ + rxd_r_max[3] ; + crc_c[1] <= crc[28] ^ crc[29] ^ + rxd_r_max[2] ^ rxd_r_max[3] ; + crc_c[2] <= crc[28] ^ crc[29] ^ crc[30] ^ + rxd_r_max[1] ^ rxd_r_max[2] ^ rxd_r_max[3] ; + crc_c[3] <= crc[29] ^ crc[30] ^ crc[31] ^ + rxd_r_max[0] ^ rxd_r_max[1] ^ rxd_r_max[2] ; + crc_c[4] <= crc[0] ^ crc[28] ^ crc[30] ^ crc[31] ^ + rxd_r_max[0] ^ rxd_r_max[1] ^ rxd_r_max[3] ; + crc_c[5] <= crc[1] ^ crc[28] ^ crc[29] ^ crc[31] ^ + rxd_r_max[0] ^ rxd_r_max[2] ^ rxd_r_max[3] ; + crc_c[6] <= crc[2] ^ crc[29] ^ crc[30] ^ + rxd_r_max[1] ^ rxd_r_max[2] ; + crc_c[7] <= crc[3] ^ crc[28] ^ crc[30] ^ crc[31] ^ + rxd_r_max[0] ^ rxd_r_max[1] ^ rxd_r_max[3] ; + crc_c[8] <= crc[4] ^ crc[28] ^ crc[29] ^ crc[31] ^ + rxd_r_max[0] ^ rxd_r_max[2] ^ rxd_r_max[3] ; + crc_c[9] <= crc[5] ^ crc[29] ^ crc[30] ^ + rxd_r_max[1] ^ rxd_r_max[2] ; + crc_c[10] <= crc[6] ^ crc[28] ^ crc[30] ^ crc[31] ^ + rxd_r_max[0] ^ rxd_r_max[1] ^ rxd_r_max[3] ; + crc_c[11] <= crc[7] ^ crc[28] ^ crc[29] ^ crc[31] ^ + rxd_r_max[0] ^ rxd_r_max[2] ^ rxd_r_max[3] ; + crc_c[12] <= crc[8] ^ crc[28] ^ crc[29] ^ crc[30] ^ + rxd_r_max[1] ^ rxd_r_max[2] ^ rxd_r_max[3] ; + crc_c[13] <= crc[9] ^ crc[29] ^ crc[30] ^ crc[31] ^ + rxd_r_max[0] ^ rxd_r_max[1] ^ rxd_r_max[2] ; + crc_c[14] <= crc[10] ^ crc[30] ^ crc[31] ^ + rxd_r_max[0] ^ rxd_r_max[1] ; + crc_c[15] <= crc[11] ^ crc[31] ^ + rxd_r_max[0] ; + crc_c[16] <= crc[12] ^ crc[28] ^ + rxd_r_max[3] ; + crc_c[17] <= crc[13] ^ crc[29] ^ + rxd_r_max[2] ; + crc_c[18] <= crc[14] ^ crc[30] ^ + rxd_r_max[1] ; + crc_c[19] <= crc[15] ^ crc[31] ^ + rxd_r_max[0] ; + crc_c[20] <= crc[16] ; + crc_c[21] <= crc[17] ; + crc_c[22] <= crc[18] ^ crc[28] ^ + rxd_r_max[3] ; + crc_c[23] <= crc[19] ^ crc[28] ^ crc[29] ^ + rxd_r_max[2] ^ rxd_r_max[3] ; + crc_c[24] <= crc[20] ^ crc[29] ^ crc[30] ^ + rxd_r_max[1] ^ rxd_r_max[2] ; + crc_c[25] <= crc[21] ^ crc[30] ^ crc[31] ^ + rxd_r_max[0] ^ rxd_r_max[1] ; + crc_c[26] <= crc[22] ^ crc[28] ^ crc[31] ^ + rxd_r_max[0] ^ rxd_r_max[3] ; + crc_c[27] <= crc[23] ^ crc[29] ^ + rxd_r_max[2] ; + crc_c[28] <= crc[24] ^ crc[30] ^ + rxd_r_max[1] ; + crc_c[29] <= crc[25] ^ crc[31] ^ + rxd_r_max[0] ; + crc_c[30] <= crc[26] ; + crc_c[31] <= crc[27] ; + end + default : + begin + crc_c <= crc ; + end + endcase + end + + always @(posedge clk) + begin : crc_reg_proc + if (rst) + begin + crc <= {32{1'b1}} ; + end + else + begin + crc <= crc_c ; + end + end + + assign iri_c = (rsm == RSM_INT) ? 1'b1 : 1'b0 ; + + always @(posedge clk) + begin : rint_reg_proc + if (rst) + begin + iri <= 1'b0 ; + riack_r <= 1'b0 ; + rireq <= 1'b0 ; + end + else + begin + iri <= iri_c ; + riack_r <= riack ; + rireq <= iri ; + end + end + + wire [13:0] new_lcnt; + assign new_lcnt = (insert_en_r) ? (lcnt + 2'b10) : lcnt; + + always @(posedge clk) + begin : length_reg_proc + if (rst) + begin + lcnt <= {14{1'b0}} ; + length <= {14{1'b0}} ; + end + else + begin + if ((rsm == RSM_IDLE_RCSMT && cachenf_2r) | + (!fcfbci && !cachenf_2r) | + rsm == RSM_INT1) + begin + lcnt <= {14{1'b0}} ; + end + else if (((rsm == RSM_INFO | + rsm == RSM_LENGTH | + rsm == RSM_DEST | + rsm == RSM_SOURCE) & rxdv_r) | + (fcfbci && !cachenf_2r)) + begin + if (ncnt[0]) + begin + lcnt <= lcnt + 1 ; + end + end + + length[13] <= new_lcnt[13] ; + begin : length_loop + integer i; + for(i = 12; i >= 0; i = i - 1) + begin + length[i] <= new_lcnt[i + 1] ^ new_lcnt[i] ; + end + end + end + end + + always @(posedge clk) + begin : fcfbci_reg_proc + if (rst) + begin + fcfbci <= 1'b0 ; + fcfbci_r <= 1'b0 ; + end + else + begin + + fcfbci_r <= fcfbci ; + + if(!cachenf_2r) + begin + if(rxdv_r && rxd_r4==4'b1101) + begin + fcfbci <= 1'b1 ; + end + else if(!rxdv_r) + begin + fcfbci <= 1'b0 ; + end + end + else + begin + fcfbci <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : eorfff_reg_proc + if (rst) + begin + eorfff <= 1'b0 ; + end + else + begin + if(rsm_c==RSM_IDLE_RCSMT && rsm==RSM_BAD && !cachenf_2r) + begin + eorfff <= 1'b1 ; + end + else + begin + eorfff <= 1'b0 ; + end + end + end + + + always @(posedge clk) + begin : stat_reg_proc + if (rst) + begin + lfield <= {16{1'b0}} ; + ftp <= 1'b0 ; + tl <= 1'b0 ; + ff <= 1'b0 ; + mf <= 1'b0 ; + re <= 1'b0 ; + ce <= 1'b0 ; + db <= 1'b0 ; + rf <= 1'b0 ; + ov <= 1'b0 ; + cs <= 1'b0 ; + end + else + begin + if (rsm == RSM_LENGTH) + begin + if (bcnt[1:0] == 2'b00) + begin + if (!(ncnt[0])) + begin + lfield[3:0] <= rxd_r_max[MIIWIDTH-1:0] ; + end + else + begin + lfield[7:4] <= rxd_r_max[MIIWIDTH-1:0] ; + end + end + else + begin + if (!(ncnt[0])) + begin + lfield[11:8] <= rxd_r_max[MIIWIDTH-1:0] ; + end + else + begin + lfield[15:12] <= rxd_r_max[MIIWIDTH-1:0] ; + end + end + end + + if (lfield > MAX_SIZE) + begin + ftp <= 1'b1 ; + end + else + begin + ftp <= 1'b0 ; + end + + if (lcnt == MAX_FRAME & !iri_c) + begin + tl <= 1'b1 ; + end + else if (rsm == RSM_IDLE_RCSMT) + begin + tl <= 1'b0 ; + end + + if (!iri_c) + begin + if (fsm == FSM_MATCH) + begin + ff <= 1'b0 ; + end + else + begin + ff <= 1'b1 ; + end + end + + if (!iri_c) + begin + mf <= dest[0] ; + end + + if (rxer_r & !iri_c) + begin + re <= 1'b1 ; + end + else if (rsm == RSM_IDLE_RCSMT) + begin + re <= 1'b0 ; + end + + if (rsm == RSM_INFO & !(ncnt[0])) + begin + if (crc == CRCVAL) + begin + ce <= 1'b0 ; + end + else + begin + ce <= 1'b1 ; + end + end + + if (rsm == RSM_INFO) + begin + if (!rxdv_r & (ncnt[0])) + begin + db <= 1'b1 ; + end + else + begin + db <= 1'b0 ; + end + end + + if (!winp & iri_c) + begin + rf <= 1'b1 ; + end + else if (rsm == RSM_IDLE_RCSMT) + begin + rf <= 1'b0 ; + end + + if (rsm == RSM_IDLE_RCSMT) + begin + ov <= 1'b0 ; + end + else if (full | !cachenf_r) + begin + ov <= 1'b1 ; + end + + if (col_r & !iri_c) + begin + cs <= 1'b1 ; + end + else if (rsm == RSM_IDLE_RCSMT) + begin + cs <= 1'b0 ; + end + + + end + end + + always @(posedge clk) + begin : ren_reg_proc + if (rst) + begin + ren_r <= 1'b0 ; + end + else + begin + if (rsm == RSM_IDLE_RCSMT) + begin + ren_r <= ren ; + end + end + end + + always @(fsm or + rsm or + ho or + hp or + dest or + lcnt or + ncnt or + flcnt or + perfm or + hash or + pr or + fa or + invm or + rif or + matchval or + match) + begin : fsm_proc + case (fsm) + FSM_IDLE : + begin + if (lcnt[2:0] == 3'b101 & (ncnt[0])) + begin + if (pr) + begin + fsm_c <= FSM_MATCH ; + end + else if (ho | (hp & (dest[0]))) + begin + fsm_c <= FSM_HASH ; + end + else if (!hp) + begin + fsm_c <= FSM_PERF16 ; + end + else + begin + fsm_c <= FSM_PERF1 ; + end + end + else + begin + fsm_c <= FSM_IDLE ; + end + end + FSM_PERF1 : + begin + if (fa == 6'b101100) + begin + if(perfm | + (matchval & match)) + begin + fsm_c <= FSM_MATCH ; + end + else + begin + fsm_c <= FSM_FAIL ; + end + end + else + begin + fsm_c <= FSM_PERF1 ; + end + end + FSM_PERF16 : + begin + if ((flcnt == 3'b010 & perfm & !rif) | + (fa == 6'b110010 & rif & invm) | + (matchval & match)) + begin + fsm_c <= FSM_MATCH ; + end + else if (fa == 6'b110010) + begin + fsm_c <= FSM_FAIL ; + end + else + begin + fsm_c <= FSM_PERF16 ; + end + end + FSM_HASH : + begin + if (matchval & match) + begin + fsm_c <= FSM_MATCH ; + end + else if (flcnt == 3'b101) + begin + if (hash) + begin + fsm_c <= FSM_MATCH ; + end + else + begin + fsm_c <= FSM_FAIL ; + end + end + else + begin + fsm_c <= FSM_HASH ; + end + end + FSM_MATCH : + begin + if (rsm == RSM_IDLE_RCSMT) + begin + fsm_c <= FSM_IDLE ; + end + else + begin + fsm_c <= FSM_MATCH ; + end + end + default : + begin + if (rsm == RSM_IDLE_RCSMT) + begin + fsm_c <= FSM_IDLE ; + end + else + begin + fsm_c <= FSM_FAIL ; + end + end + endcase + end + + always @(posedge clk) + begin : fsm_reg_proc + if (rst) + begin + fsm <= FSM_IDLE ; + end + else + begin + fsm <= fsm_c ; + end + end + + assign bcnt20 = bcnt[2:0] ; + + always @(posedge clk) + begin : dest_reg_proc + if (rst) + begin + dest <= {48{1'b0}} ; + end + else + begin + if (rsm == RSM_DEST) + begin + if (!(ncnt[0])) + begin + case (bcnt20) + 3'b101 : + begin + dest[3:0] <= rxd_r_max[MIIWIDTH-1:0] ; + end + 3'b100 : + begin + dest[11:8] <= rxd_r_max[MIIWIDTH-1:0] ; + end + 3'b011 : + begin + dest[19:16] <= rxd_r_max[MIIWIDTH-1:0] ; + end + 3'b010 : + begin + dest[27:24] <= rxd_r_max[MIIWIDTH-1:0] ; + end + 3'b001 : + begin + dest[35:32] <= rxd_r_max[MIIWIDTH-1:0] ; + end + default : + begin + dest[43:40] <= rxd_r_max[MIIWIDTH-1:0] ; + end + endcase + end + else + begin + case (bcnt20) + 3'b101 : + begin + dest[7:4] <= rxd_r_max[MIIWIDTH-1:0] ; + end + 3'b100 : + begin + dest[15:12] <= rxd_r_max[MIIWIDTH-1:0] ; + end + 3'b011 : + begin + dest[23:20] <= rxd_r_max[MIIWIDTH-1:0] ; + end + 3'b010 : + begin + dest[31:28] <= rxd_r_max[MIIWIDTH-1:0] ; + end + 3'b001 : + begin + dest[39:36] <= rxd_r_max[MIIWIDTH-1:0] ; + end + default : + begin + dest[47:44] <= rxd_r_max[MIIWIDTH-1:0] ; + end + endcase + end + end + end + end + + always @(posedge clk) + begin : hash_reg_proc + if (rst) + begin + crchash <= {9{1'b0}} ; + hash <= 1'b0 ; + fdata_r <= {16{1'b0}} ; + end + else + begin + if (fsm == FSM_HASH & flcnt == 3'b000) + begin + crchash <= {crc[23], crc[24], crc[25], crc[26], + crc[27], crc[28], crc[29], crc[30], crc[31]} ; + end + + hash <= fdata_r[crchash[3:0]] ; + + fdata_r <= fdata ; + end + end + + always @(perfm or flcnt or fsm or fdata_r or dest) + begin : perfm_proc + if ((flcnt == 3'b001 & fdata_r != dest[47:32]) | + (flcnt == 3'b000 & fdata_r != dest[31:16]) | + (flcnt == 3'b010 & fdata_r != dest[15:0]) | fsm == FSM_IDLE) + begin + perfm_c <= 1'b0 ; + end + else if (flcnt == 3'b010 & fdata_r == dest[15:0]) + begin + perfm_c <= 1'b1 ; + end + else + begin + perfm_c <= perfm ; + end + end + + always @(posedge clk) + begin : perfm_reg_proc + if (rst) + begin + invm <= 1'b0 ; + perfm <= 1'b0 ; + end + else + begin + perfm <= perfm_c ; + + if (fsm == FSM_IDLE) + begin + invm <= 1'b1 ; + end + else if (flcnt == 3'b001 & perfm_c) + begin + invm <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : fa_reg_proc + if (rst) + begin + flcnt <= {3{1'b0}} ; + fa <= {ADDRDEPTH{1'b0}} ; + end + else + begin + case (fsm) + FSM_PERF1, FSM_PERF16 : + begin + fa <= fa + 1 ; + end + FSM_HASH : + begin + fa[5:0] <= {1'b0, crchash[8:4]} ; + end + default : + begin + if (hp & !(dest[0])) + begin + fa <= PERF1_ADDR ; + end + else + begin + fa <= {ADDRDEPTH{1'b0}} ; + end + end + endcase + + if (fsm_c == FSM_IDLE | + (flcnt == 3'b010 & fsm_c == FSM_PERF16) | + (flcnt == 3'b010 & fsm_c == FSM_PERF1)) + begin + flcnt <= {3{1'b0}} ; + end + else if (fsm == FSM_PERF1 | + fsm == FSM_PERF16 | + fsm == FSM_HASH) + begin + flcnt <= flcnt + 1 ; + end + end + end + + assign faddr = fa ; + + assign matchdata = dest ; + + always @(posedge clk) + begin : matchen_reg_proc + if (rst) + begin + matchen <= 1'b0 ; + end + else + begin + if (fsm == FSM_PERF1 | fsm == FSM_HASH | fsm == FSM_PERF16) + begin + matchen <= 1'b1 ; + end + else + begin + matchen <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : stop_reg_proc + if (rst) + begin + stop_r <= 1'b0 ; + stopo <= 1'b0 ; + end + else + begin + stop_r <= stopi ; + + if (stop_r & rsm == RSM_IDLE_RCSMT) + begin + stopo <= 1'b1 ; + end + else + begin + stopo <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : rcscnt_reg_proc + if (rst) + begin + rcscnt <= {8{1'b0}} ; + rcs <= 1'b0 ; + rcsreq <= 1'b0 ; + rcsack_r <= 1'b0 ; + end + else + begin + if (rcscnt == 8'b00000000) + begin + rcscnt <= 8'b10000000 ; + end + else + begin + rcscnt <= rcscnt - 1 ; + end + + if (rcscnt == 8'b00000000) + begin + rcs <= 1'b1 ; + end + else if (rcsack_r) + begin + rcs <= 1'b0 ; + end + + if (rcs & !rcsack_r) + begin + rcsreq <= 1'b1 ; + end + else if (rcsack_r) + begin + rcsreq <= 1'b0 ; + end + + rcsack_r <= rcsack ; + end + end + + always @(posedge clk) + begin : focnt_reg_proc + if (rst) + begin + focnt <= {11{1'b0}} ; + oco <= 1'b0 ; + focl_r <= 1'b0 ; + focg <= {11{1'b0}} ; + end + else + begin + if (focl_r) + begin + focnt <= {11{1'b0}} ; + end + else if ((rsm == RSM_DEST | + rsm == RSM_SOURCE | + rsm == RSM_LENGTH | + rsm == RSM_INFO | + rsm == RSM_SFD) & + full) + begin + focnt <= focnt + 1 ; + end + + if (focl_r) + begin + oco <= 1'b0 ; + end + else if ((rsm == RSM_DEST | + rsm == RSM_SOURCE | + rsm == RSM_LENGTH | + rsm == RSM_INFO) & + focnt == 11'b11111111111 & + (full | !cachenf_r)) + begin + oco <= 1'b1 ; + end + + focl_r <= focl ; + + focg[10] <= focnt[10] ; + begin : focg_loop + integer i; + for(i = 9; i >= 0; i = i - 1) + begin + focg[i] <= focnt[i] ^ focnt[i + 1] ; + end + end + end + end + + assign foclack = focl_r ; + + always @(posedge clk) + begin : mfcnt_reg_proc + if (rst) + begin + mfcnt <= {16{1'b0}} ; + mfo <= 1'b0 ; + mfcl_r <= 1'b0 ; + mfcg <= {16{1'b0}} ; + end + else + begin + if (mfcl_r) + begin + mfcnt <= {16{1'b0}} ; + end + else if ( + eorfff && + (pb | winp) && + ( + fsm==FSM_MATCH | ra | + ( + pm && dest[0] + ) + ) + ) + begin + mfcnt <= mfcnt + 1'b1 ; + end + + if (mfcl_r) + begin + mfo <= 1'b0 ; + end + else if ( + mfcnt=={16{1'b1}} && pb && + ( + fsm==FSM_MATCH | ra | + ( + pm && dest[0] + ) + ) + ) + begin + mfo <= 1'b1 ; + end + + mfcl_r <= mfcl; + + begin : mfcg_reg_write + integer i; + mfcg[15] <= mfcnt[15]; + for(i = 14; i >= 0; i = i - 1) + begin + mfcg[i] <= mfcnt[i] ^ mfcnt[i + 1]; + end + end + end + end + + assign mfclack = mfcl_r ; + + assign fzero = {FIFODEPTH{1'b0}} ; + + assign mzero_max = {(MIIWIDTH_MAX + 1){1'b0}} ; + + assign rxd_r_max = {mzero_max[MIIWIDTH_MAX + 1:MIIWIDTH], + rxd_r}; + +endmodule diff --git a/resources/soc/rtl/MAC/rfifo.v b/resources/soc/rtl/MAC/rfifo.v new file mode 100644 index 0000000..631c9c2 --- /dev/null +++ b/resources/soc/rtl/MAC/rfifo.v @@ -0,0 +1,439 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module RFIFO ( + clk, + rst, + ramdata, + ramaddr, + fifore, + ffo, + rfo, + mfo, + tlo, + reo, + dbo, + ceo, + ovo, + cso, + flo, + fifodata, + cachere, + cachene, + cachenf, + radg, + rireq, + ffi, + rfi, + mfi, + tli, + rei, + dbi, + cei, + ovi, + csi, + fli, + wadg, + riack + ); + + parameter DATAWIDTH = 32; + parameter DATADEPTH = 32; + parameter FIFODEPTH = 9; + parameter CACHEDEPTH = 2; + + input clk; + input rst; + + input [DATAWIDTH - 1:0] ramdata; + output [FIFODEPTH - 1:0] ramaddr; + wire [FIFODEPTH - 1:0] ramaddr; + + input fifore; + output ffo; + wire ffo; + output rfo; + wire rfo; + output mfo; + wire mfo; + output tlo; + wire tlo; + output reo; + wire reo; + output dbo; + wire dbo; + output ceo; + wire ceo; + output ovo; + wire ovo; + output cso; + wire cso; + output [13:0] flo; + wire [13:0] flo; + output [DATAWIDTH - 1:0] fifodata; + wire [DATAWIDTH - 1:0] fifodata; + + input cachere; + output cachene; + wire cachene; + + output cachenf; + wire cachenf; + output [FIFODEPTH - 1:0] radg; + reg [FIFODEPTH - 1:0] radg; + + input rireq; + input ffi; + input rfi; + input mfi; + input tli; + input rei; + input dbi; + input cei; + input ovi; + input csi; + input [13:0] fli; + input [FIFODEPTH - 1:0] wadg; + output riack; + wire riack; + + + parameter CSWIDTH = 23; + reg [CSWIDTH - 1:0] csmem[(1'b1 << CACHEDEPTH) - 1:0]; + wire cswe; + wire csre; + reg csnf; + reg csne; + reg [CACHEDEPTH - 1:0] cswad; + reg [CACHEDEPTH - 1:0] cswadi; + reg [CACHEDEPTH - 1:0] csrad; + reg [CACHEDEPTH - 1:0] csrad_r; + wire [CSWIDTH - 1:0] csdi; + wire [CSWIDTH - 1:0] csdo; + + reg [FIFODEPTH - 1:0] stat; + reg [FIFODEPTH - 1:0] rad_c; + reg [FIFODEPTH - 1:0] rad; + reg [FIFODEPTH - 1:0] wad_c; + reg [FIFODEPTH - 1:0] wad; + reg [FIFODEPTH - 1:0] wadg_0_r; + reg [FIFODEPTH - 1:0] wadg_r; + reg [13:0] flibin_c; + reg [13:0] flibin; + reg [13:0] fli_r; + + reg rireq_r; + reg iriack; + + wire [FIFODEPTH - 1:0] fzero; + + always @(posedge clk) + begin : csmem_reg_proc + if (rst) + begin : csmem_reset + integer i; + for(i = ((1'b1 << CACHEDEPTH) - 1); i >= 0; i = i - 1) + begin + csmem[i] <= {CSWIDTH{1'b0}}; + end + csrad_r <= csrad ; + end + else + begin + csmem[cswad] <= csdi ; + csrad_r <= csrad ; + end + end + + always @(posedge clk) + begin : cswad_reg_proc + if (rst) + begin + cswad <= {CACHEDEPTH{1'b1}} ; + end + else + begin + if (cswe) + begin + cswad <= cswad + 1 ; + end + end + end + + always @(posedge clk) + begin : csrad_reg_proc + if (rst) + begin + csrad <= {CACHEDEPTH{1'b1}} ; + end + else + begin + if (csre) + begin + csrad <= csrad + 1 ; + end + end + end + + always @(posedge clk) + begin : csne_reg_proc + if (rst) + begin + csne <= 1'b0 ; + end + else + begin + if (cswad == csrad) + begin + csne <= 1'b0 ; + end + else + begin + csne <= 1'b1 ; + end + end + end + + always @(cswad) + begin : cswadi_drv + cswadi <= cswad + 1; + end + + always @(posedge clk) + begin : csnf_reg_proc + if (rst) + begin + csnf <= 1'b0 ; + end + else + begin + if (cswadi == csrad) + begin + csnf <= 1'b0 ; + end + else + begin + csnf <= 1'b1 ; + end + end + end + + always @(fli_r) + begin : flibin_proc + reg[13:0] flibin_v; + flibin_v[13] = fli_r[13]; + begin : flibin_loop + integer i; + for(i = 12; i >= 0; i = i - 1) + begin + flibin_v[i] = flibin_v[i + 1] ^ fli_r[i]; + end + end + flibin_c = flibin_v ; + end + + always @(posedge clk) + begin : flibin_reg_proc + if (rst) + begin + flibin <= {14{1'b0}} ; + fli_r <= {14{1'b0}} ; + end + else + begin + flibin <= flibin_c ; + fli_r <= fli ; + end + end + + assign cachene = csne ; + + assign cachenf = csnf ; + + assign cswe = rireq_r & ~iriack ; + + assign csdo = csmem[csrad_r] ; + + assign csdi = {ffi, rfi, mfi, tli, rei, dbi, cei, ovi, csi, flibin} ; + + assign ffo = csdo[CSWIDTH - 1] ; + + assign rfo = csdo[CSWIDTH - 2] ; + + assign mfo = csdo[CSWIDTH - 3] ; + + assign tlo = csdo[CSWIDTH - 4] ; + + assign reo = csdo[CSWIDTH - 5] ; + + assign dbo = csdo[CSWIDTH - 6] ; + + assign ceo = csdo[CSWIDTH - 7] ; + + assign ovo = csdo[CSWIDTH - 8] ; + + assign cso = csdo[CSWIDTH - 9]; + + assign flo = csdo[13:0] ; + + assign csre = cachere ; + + always @(posedge clk) + begin : rireq_reg_proc + if (rst) + begin + rireq_r <= 1'b0 ; + end + else + begin + rireq_r <= rireq ; + end + end + + always @(posedge clk) + begin : irecack_reg_proc + if (rst) + begin + iriack <= 1'b0 ; + end + else + begin + iriack <= rireq_r ; + end + end + + assign riack = iriack ; + + always @(rad or fifore) + begin : rad_proc + if (fifore) + begin + rad_c <= rad + 1 ; + end + else + begin + rad_c <= rad ; + end + end + + always @(posedge clk) + begin : rad_reg_proc + if (rst) + begin + rad <= {FIFODEPTH{1'b0}} ; + end + else + begin + rad <= rad_c ; + end + end + + always @(posedge clk) + begin : radg_reg_proc + if (rst) + begin + radg <= {FIFODEPTH{1'b0}} ; + end + else + begin + radg[FIFODEPTH - 1] <= rad[FIFODEPTH - 1] ; + begin : radg_loop + integer i; + for(i = FIFODEPTH - 2; i >= 0; i = i - 1) + begin + radg[i] <= rad[i] ^ rad[i + 1] ; + end + end + end + end + + always @(posedge clk) + begin : wadg_reg_proc + if (rst) + begin + wadg_0_r <= {FIFODEPTH{1'b0}} ; + wadg_r <= {FIFODEPTH{1'b0}} ; + end + else + begin + wadg_0_r <= wadg; + wadg_r <= wadg_0_r; + end + end + + always @(wadg_r) + begin : wad_proc + reg[FIFODEPTH - 1:0] wad_v; + wad_v[FIFODEPTH - 1] = wadg_r[FIFODEPTH - 1]; + begin : wad_loop + integer i; + for(i = FIFODEPTH - 2; i >= 0; i = i - 1) + begin + wad_v[i] = wad_v[i + 1] ^ wadg_r[i]; + end + end + wad_c = wad_v ; + end + + always @(posedge clk) + begin : ad_reg_proc + if (rst) + begin + wad <= {FIFODEPTH{1'b0}} ; + end + else + begin + wad <= wad_c ; + end + end + + always @(posedge clk) + begin : stat_reg_proc + if (rst) + begin + stat <= {FIFODEPTH{1'b0}} ; + end + else + begin + stat <= wad - rad ; + end + end + + assign ramaddr = rad_c ; + + assign fifodata = ramdata ; + + + assign fzero = {FIFODEPTH{1'b0}}; + +endmodule diff --git a/resources/soc/rtl/MAC/rlsm.v b/resources/soc/rtl/MAC/rlsm.v new file mode 100644 index 0000000..72bad4d --- /dev/null +++ b/resources/soc/rtl/MAC/rlsm.v @@ -0,0 +1,1328 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module RLSM ( + clk, + rst, + fifodata, + fifore, + cachere, + dmaack, + dmaeob, + dmadatai, + dmaaddr, + dmareq, + dmawr, + dmacnt, + dmaaddro, + dmadatao, + rprog, + rcpoll, + fifocne, + ff, + rf, + mf, + db, + re, + ce, + tl, + ftp, + ov, + cs, + length, + pbl, + dsl, + rpoll, + rdbadc, + rdbad, + rpollack, + rcompack, + bufack, + des, + fbuf, + stat, + ru, + rcomp, + bufcomp, + stopi, + stopo, + insert_en_i + ); + + parameter DATAWIDTH = 32; + parameter DATADEPTH = 32; + parameter FIFODEPTH = 9; + + `include "utility.v" + + input clk; + input rst; + + input [DATAWIDTH - 1:0] fifodata; + output fifore; + wire fifore; + output cachere; + wire cachere; + + input dmaack; + input dmaeob; + input [DATAWIDTH - 1:0] dmadatai; + input [DATADEPTH - 1:0] dmaaddr; + output dmareq; + wire dmareq; + output dmawr; + wire dmawr; + output [FIFODEPTH_MAX - 1:0] dmacnt; + reg [FIFODEPTH_MAX - 1:0] dmacnt; + output [DATADEPTH - 1:0] dmaaddro; + reg [DATADEPTH - 1:0] dmaaddro; + output [DATAWIDTH - 1:0] dmadatao; + reg [DATAWIDTH - 1:0] dmadatao; + + input rprog; + input rcpoll; + input fifocne; + input ff; + input rf; + input mf; + input db; + input re; + input ce; + input tl; + input ftp; + input ov; + input cs; + input [13:0] length; + + input [5:0] pbl; + input [4:0] dsl; + input rpoll; + input rdbadc; + input [DATADEPTH - 1:0] rdbad; + output rpollack; + reg rpollack; + + input rcompack; + input bufack; + output des; + reg des; + output fbuf; + reg fbuf; + output stat; + reg stat; + output ru; + reg ru; + output rcomp; + reg rcomp; + output bufcomp; + reg bufcomp; + + input stopi; + output stopo; + reg stopo; + + input insert_en_i; + + + + reg [3:0] lsm_c; + reg [3:0] lsm; + reg [3:0] lsm_r; + reg own_c; + reg own; + reg rch; + reg rer; + reg rls; + reg rfs; + reg rde; + wire res_c; + reg [10:0] bs1; + reg [10:0] bs2; + + reg adwrite; + reg [DATADEPTH - 1:0] bad; + reg [DATADEPTH - 1:0] dad; + reg [10:0] bcnt; + reg [DATADEPTH - 1:0] statad; + reg [DATADEPTH - 1:0] tstatad; + reg dbadc_r; + + reg req_c; + reg req; + wire [2:0] dmaaddr20; + wire [1:0] addr10; + reg [DATADEPTH_MAX - 1:0] dataimax_r; + wire [31:0] fstat; + + reg rprog_r; + reg rcpoll_r; + reg rcpoll_r2; + reg whole; + + reg [13:0] fifolev_r; + reg [13:0] fbcnt; + reg [13:0] fbcnt_c; + reg [13:0] length_r; + wire ififore; + reg ififore_r; + reg icachere; + wire [FIFODEPTH_MAX - 1:0] bsmax; + wire [FIFODEPTH_MAX - 1:0] flmax; + wire [FIFODEPTH_MAX - 1:0] blmax; + reg fl_g_16; + reg fl_g_bs; + reg fl_g_bl; + reg bl_g_bs; + reg pblz; + + reg stop_r; + + wire [FIFODEPTH_MAX - 1:0] fzero_max; + wire [DATAWIDTH_MAX + 1:0] dmadatai_max; + wire [DATAWIDTH_MAX + 1:0] dzero_max; + + always @(posedge clk) + begin : dataimax_reg_proc + if (rst) + begin + dataimax_r <= {DATADEPTH_MAX{1'b1}} ; + end + else + begin + case (DATAWIDTH) + 8 : + begin + case (dmaaddr20) + 3'b000, 3'b100 : + begin + dataimax_r[7:0] <= dmadatai_max[DATAWIDTH-1:0] ; + end + 3'b001, 3'b101 : + begin + dataimax_r[15:8] <= dmadatai_max[DATAWIDTH-1:0] ; + end + 3'b010, 3'b110 : + begin + dataimax_r[23:16] <= dmadatai_max[DATAWIDTH-1:0] ; + end + default : + begin + dataimax_r[31:24] <= dmadatai_max[DATAWIDTH-1:0] ; + end + endcase + end + 16 : + begin + if (!(dmaaddr[1])) + begin + dataimax_r[15:0] <= dmadatai_max[DATAWIDTH-1:0] ; + end + else + begin + dataimax_r[31:16] <= dmadatai_max[DATAWIDTH-1:0] ; + end + end + default : + begin + dataimax_r <= dmadatai_max[31:0] ; + end + endcase + end + end + + always @(posedge clk) + begin : fifolev_reg_proc + if (rst) + begin + length_r <= {14{1'b0}} ; + fifolev_r <= {14{1'b0}} ; + fl_g_bs <= 1'b0 ; + fl_g_16 <= 1'b0 ; + fl_g_bl <= 1'b0 ; + bl_g_bs <= 1'b0 ; + pblz <= 1'b0 ; + end + else + begin + length_r <= length; + + fifolev_r <= length_r - fbcnt_c ; + + if (flmax >= bsmax) + begin + fl_g_bs <= 1'b1 ; + end + else + begin + fl_g_bs <= 1'b0 ; + end + + case (DATAWIDTH) + 8 : + begin + if (flmax > ({fzero_max[FIFODEPTH_MAX - 1:6], + 6'b111111})) + begin + fl_g_16 <= 1'b1 ; + end + else + begin + fl_g_16 <= 1'b0 ; + end + end + 16 : + begin + if (flmax > ({fzero_max[FIFODEPTH_MAX - 1:5], + 5'b11111})) + begin + fl_g_16 <= 1'b1 ; + end + else + begin + fl_g_16 <= 1'b0 ; + end + end + default : + begin + if (flmax > ({fzero_max[FIFODEPTH_MAX - 1:4], + 4'b1111})) + begin + fl_g_16 <= 1'b1 ; + end + else + begin + fl_g_16 <= 1'b0 ; + end + end + endcase + + if (flmax >= (blmax + 1'b1)) + begin + fl_g_bl <= 1'b1 ; + end + else + begin + fl_g_bl <= 1'b0 ; + end + + if (blmax >= bsmax) + begin + bl_g_bs <= 1'b1 ; + end + else + begin + bl_g_bs <= 1'b0 ; + end + + if (pbl == 6'b000000) + begin + pblz <= 1'b1 ; + end + else + begin + pblz <= 1'b0 ; + end + end + end + + assign flmax = (DATAWIDTH == 8) ? {fzero_max[FIFODEPTH_MAX - 1:14], + fifolev_r} : + (DATAWIDTH == 16) ? {fzero_max[FIFODEPTH_MAX - 1:13], + fifolev_r[13:1]} : + {fzero_max[FIFODEPTH_MAX - 1:12], + fifolev_r[13:2]} ; + + assign blmax = {fzero_max[FIFODEPTH_MAX - 1:6], pbl} ; + + assign bsmax = (DATAWIDTH == 8) ? {fzero_max[FIFODEPTH_MAX - 1:11], + bcnt} : + (DATAWIDTH == 16) ? {fzero_max[FIFODEPTH_MAX - 1:10], + bcnt[10:1]} : + {fzero_max[FIFODEPTH_MAX - 1:9], + bcnt[10:2]} ; + + always @(lsm or + fl_g_bs or + fl_g_bl or + bl_g_bs or + pblz or + blmax or + bsmax or + flmax or + fzero_max) + begin : dmacnt_proc + if (lsm == LSM_DES0 | + lsm == LSM_DES1 | + lsm == LSM_DES2 | + lsm == LSM_DES3 | + lsm == LSM_STAT | + lsm == LSM_FSTAT | + lsm == LSM_DES0P) + begin + case (DATAWIDTH) + 8 : + begin + dmacnt <= {fzero_max[FIFODEPTH_MAX - 1:3], 3'b100} ; + end + 16 : + begin + dmacnt <= {fzero_max[FIFODEPTH_MAX - 1:3], 3'b010} ; + end + default : + begin + dmacnt <= {fzero_max[FIFODEPTH_MAX - 1:3], 3'b001} ; + end + endcase + end + else + begin + if (pblz) + begin + if (fl_g_bs) + begin + dmacnt <= bsmax ; + end + else + begin + dmacnt <= flmax ; + end + end + else + begin + if (fl_g_bl) + begin + if (bl_g_bs) + begin + dmacnt <= bsmax ; + end + else + begin + dmacnt <= blmax ; + end + end + else + begin + if (fl_g_bs) + begin + dmacnt <= bsmax ; + end + else + begin + dmacnt <= flmax ; + end + end + end + end + end + + always @(req or + lsm or + lsm_c or + fifocne or + fl_g_bl or + fl_g_16 or + pblz or + whole or + rprog_r or + dmaack or + dmaeob or + flmax or + fzero_max) + begin : req_proc + case (lsm) + LSM_BUF1, LSM_BUF2 : + begin + if ((dmaack & dmaeob) | lsm_c==LSM_NXT) + begin + req_c <= 1'b0 ; + end + else if (fifocne | (rprog_r & ((fl_g_bl & !pblz) | + (fl_g_16 & pblz)))) + begin + req_c <= 1'b1 ; + end + else + begin + req_c <= req ; + end + end + LSM_DES0, LSM_DES1, LSM_DES2, + LSM_DES3, LSM_STAT, LSM_DES0P : + begin + if (dmaack) + begin + req_c <= 1'b0 ; + end + else + begin + req_c <= 1'b1 ; + end + end + LSM_FSTAT : + begin + if (dmaack | !whole | + (DATAWIDTH == 8 & flmax[1:0] != fzero_max[1:0]) + | + (DATAWIDTH == 16 & flmax[ 1] != fzero_max[1])) + begin + req_c <= 1'b0 ; + end + else + begin + req_c <= 1'b1 ; + end + end + default : + begin + req_c <= 1'b0 ; + end + endcase + end + + always @(posedge clk) + begin : req_reg_proc + if (rst) + begin + req <= 1'b0 ; + end + else + begin + req <= req_c ; + end + end + + always @(lsm or bad or dad or statad) + begin : dmaaddro_proc + case (lsm) + LSM_BUF1, LSM_BUF2 : + begin + dmaaddro <= bad ; + end + LSM_STAT, LSM_FSTAT : + begin + dmaaddro <= statad ; + end + default : + begin + dmaaddro <= dad ; + end + endcase + end + + wire [13:0] real_length; + assign real_length = (insert_en_i) ? (length - 2'b10) : length; + + assign fstat = {1'b0, ff, real_length, res_c, rde, + RDES0_RV[13:12], rf, mf, rfs, rls, tl, + cs, ftp, RDES0_RV[4], re, db, ce, ov} ; + + assign dmawr = (lsm == LSM_STAT | + lsm == LSM_FSTAT | + lsm == LSM_BUF1 | + lsm == LSM_BUF2) ? 1'b1 : 1'b0 ; + + always @(fifodata or lsm or addr10 or fstat) + begin : dmadatao_proc + if (lsm == LSM_BUF1 | lsm == LSM_BUF2) + begin + dmadatao <= fifodata ; + end + else + begin + case (DATAWIDTH) + 8 : + begin + case (addr10) + 2'b00 : + begin + dmadatao <= fstat[7:0] ; + end + 2'b01 : + begin + dmadatao <= fstat[15:8] ; + end + 2'b10 : + begin + dmadatao <= fstat[23:16] ; + end + default : + begin + dmadatao <= fstat[31:24] ; + end + endcase + end + 16 : + begin + if (addr10 == 2'b00) + begin + dmadatao <= fstat[15:0] ; + end + else + begin + dmadatao <= fstat[31:16] ; + end + end + default : + begin + dmadatao <= fstat ; + end + endcase + end + end + + assign dmareq = req ; + + always @(lsm or + rcpoll_r or + rcpoll_r2 or + rpoll or + dmaack or + dmaeob or + own_c or + bs1 or + bs2 or + whole or + rch or + stop_r or + own or + bcnt or + dbadc_r) + begin : lsm_proc + case (lsm) + LSM_IDLE : + begin + if (!dbadc_r & !stop_r & ((rcpoll_r & !rcpoll_r2) | rpoll)) + begin + lsm_c <= LSM_DES0 ; + end + else + begin + lsm_c <= LSM_IDLE ; + end + end + LSM_DES0 : + begin + if (dmaack & dmaeob) + begin + if (own_c) + begin + lsm_c <= LSM_DES1 ; + end + else + begin + lsm_c <= LSM_IDLE ; + end + end + else + begin + lsm_c <= LSM_DES0 ; + end + end + LSM_DES0P : + begin + if (dmaack & dmaeob) + begin + if (!own_c | whole) + begin + lsm_c <= LSM_FSTAT ; + end + else + begin + lsm_c <= LSM_STAT ; + end + end + else + begin + lsm_c <= LSM_DES0P ; + end + end + LSM_DES1 : + begin + if (dmaack & dmaeob) + begin + lsm_c <= LSM_DES2 ; + end + else + begin + lsm_c <= LSM_DES1 ; + end + end + LSM_DES2 : + begin + if (dmaack & dmaeob) + begin + if (bs1 == 11'b00000000000) + begin + lsm_c <= LSM_DES3 ; + end + else + begin + lsm_c <= LSM_BUF1 ; + end + end + else + begin + lsm_c <= LSM_DES2 ; + end + end + LSM_DES3 : + begin + if (dmaack & dmaeob) + begin + if (bs2 != 11'b00000000000 & !rch) + begin + lsm_c <= LSM_BUF2 ; + end + else + begin + lsm_c <= LSM_NXT ; + end + end + else + begin + lsm_c <= LSM_DES3 ; + end + end + LSM_BUF1 : + begin + if (whole | bcnt == 11'b00000000000) + begin + lsm_c <= LSM_DES3 ; + end + else if(dbadc_r) + begin + lsm_c <= LSM_IDLE ; + end + else + begin + lsm_c <= LSM_BUF1 ; + end + end + LSM_BUF2 : + begin + if (whole | bcnt == 11'b00000000000) + begin + lsm_c <= LSM_NXT ; + end + else if(dbadc_r) + begin + lsm_c <= LSM_IDLE ; + end + else + begin + lsm_c <= LSM_BUF2 ; + end + end + LSM_NXT : + begin + if (whole) + begin + if (stop_r) + begin + lsm_c <= LSM_FSTAT ; + end + else + begin + lsm_c <= LSM_DES0P ; + end + end + else + begin + lsm_c <= LSM_DES0P ; + end + end + LSM_STAT : + begin + if (dmaack & dmaeob) + begin + lsm_c <= LSM_DES1 ; + end + else + begin + lsm_c <= LSM_STAT ; + end + end + default : + begin + if (dmaack & dmaeob) + begin + if (own & !stop_r) + begin + lsm_c <= LSM_DES1 ; + end + else + begin + lsm_c <= LSM_IDLE ; + end + end + else + begin + lsm_c <= LSM_FSTAT ; + end + end + endcase + end + + always @(posedge clk) + begin : rlsm_reg_proc + if (rst) + begin + lsm <= LSM_IDLE ; + lsm_r <= LSM_IDLE ; + end + else + begin + lsm <= lsm_c ; + lsm_r <= lsm ; + end + end + + always @(posedge clk) + begin : rpollack_reg_proc + if (rst) + begin + rpollack <= 1'b0 ; + end + else + begin + if (rpoll & !dbadc_r) + begin + rpollack <= 1'b1 ; + end + else if (!rpoll) + begin + rpollack <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : bcnt_reg_proc + if (rst) + begin + bcnt <= {11{1'b1}} ; + end + else + begin + if (lsm == LSM_DES2) + begin + bcnt <= bs1 ; + end + else if (lsm == LSM_DES3) + begin + bcnt <= bs2 ; + end + else + begin + if (dmaack) + begin + case (DATAWIDTH) + 8 : + begin + bcnt <= bcnt - 1 ; + end + 16 : + begin + bcnt <= {(bcnt[10:1] - 1), 1'b0} ; + end + default : + begin + bcnt <= {(bcnt[10:2] - 1), 2'b00} ; + end + endcase + end + end + end + end + + always @(own or + dmaack or + dmaeob or + lsm or + dmadatai_max) + begin : own_proc + if (dmaack & dmaeob & (lsm == LSM_DES0 | lsm == LSM_DES0P)) + begin + own_c <= dmadatai_max[DATAWIDTH - 1] ; + end + else + begin + own_c <= own ; + end + end + + always @(posedge clk) + begin : des1_reg_proc + reg ft22; + if (rst) + begin + rer <= 1'b0 ; + rch <= 1'b0 ; + bs2 <= {11{1'b0}} ; + bs1 <= {11{1'b0}} ; + end + else + begin + if (lsm == LSM_DES1 & dmaack) + begin + case (DATAWIDTH) + 8 : + begin + case (dmaaddr20) + 3'b000, 3'b100 : + begin + bs1[7:0] <= dmadatai_max[7:0] ; + end + 3'b001, 3'b101 : + begin + bs1[10:8] <= dmadatai_max[2:0] ; + bs2[4:0] <= dmadatai_max[7:3] ; + end + 3'b010, 3'b110 : + begin + bs2[10:5] <= dmadatai_max[5:0] ; + end + default : + begin + rer <= dmadatai_max[1] ; + rch <= dmadatai_max[0] ; + end + endcase + end + 16 : + begin + case (dmaaddr20) + 3'b000, 3'b100 : + begin + bs1[10:0] <= dmadatai_max[10:0] ; + bs2[4:0] <= dmadatai_max[15:11] ; + end + default : + begin + bs2[10:5] <= dmadatai_max[5:0] ; + rer <= dmadatai_max[9] ; + rch <= dmadatai_max[8] ; + end + endcase + end + default : + begin + rer <= dmadatai_max[25] ; + rch <= dmadatai_max[24] ; + bs2 <= dmadatai_max[21:11] ; + bs1 <= dmadatai_max[10:0] ; + end + endcase + end + end + end + + always @(posedge clk) + begin : rdes_reg_proc + if (rst) + begin + own <= 1'b0 ; + rfs <= 1'b1 ; + rls <= 1'b0 ; + rde <= 1'b0 ; + end + else + begin + if (lsm == LSM_FSTAT & dmaack & dmaeob) + begin + rfs <= 1'b1 ; + end + else if (lsm == LSM_STAT & dmaack & dmaeob) + begin + rfs <= 1'b0 ; + end + + if (lsm == LSM_FSTAT) + begin + rls <= 1'b1 ; + end + else + begin + rls <= 1'b0 ; + end + + if (lsm == LSM_FSTAT & !whole) + begin + rde <= 1'b1 ; + end + else if (lsm == LSM_IDLE) + begin + rde <= 1'b0 ; + end + + own <= own_c ; + end + end + + assign res_c = rf | ce | rde | cs | tl ; + + always @(posedge clk) + begin : adwrite_reg_proc + if (rst) + begin + adwrite <= 1'b0 ; + dbadc_r <= 1'b0 ; + end + else + begin + if (dmaack & dmaeob) + begin + adwrite <= 1'b1 ; + end + else + begin + adwrite <= 1'b0 ; + end + + dbadc_r <= rdbadc ; + end + end + + always @(posedge clk) + begin : dad_reg_proc + if (rst) + begin + dad <= {DATADEPTH{1'b1}} ; + end + else + begin + if (dbadc_r) + begin + dad <= rdbad ; + end + else if (adwrite & lsm == LSM_NXT & rch) + begin + dad <= dataimax_r[DATADEPTH - 1:0] ; + end + else if (adwrite) + begin + case (lsm_r) + LSM_DES3 : + begin + if (rer) + begin + dad <= rdbad ; + end + else + begin + dad <= dmaaddr + ({dsl, 2'b00}) ; + end + end + LSM_DES0, LSM_DES0P : + begin + if (own) + begin + dad <= dmaaddr ; + end + end + LSM_DES2 : + begin + dad <= dmaaddr ; + end + LSM_DES1 : + begin + dad <= dmaaddr ; + end + default : + begin + dad <= dad ; + end + endcase + end + end + end + + always @(posedge clk) + begin : bad_reg_proc + if (rst) + begin + bad <= {DATADEPTH{1'b1}} ; + end + else + begin + if (adwrite) + begin + if (lsm_r == LSM_BUF1 | lsm_r == LSM_BUF2) + begin + bad <= dmaaddr ; + end + else + begin + bad <= dataimax_r[DATADEPTH - 1:0] ; + end + end + end + end + + always @(posedge clk) + begin : stataddr_reg_proc + if (rst) + begin + tstatad <= {DATADEPTH{1'b1}} ; + statad <= {DATADEPTH{1'b1}} ; + end + else + begin + if (lsm == LSM_DES1 & adwrite) + begin + statad <= tstatad ; + end + + if ((lsm == LSM_DES0 | lsm == LSM_DES0P) & dmaack & dmaeob) + begin + tstatad <= dad ; + end + end + end + + always @(fbcnt or icachere or ififore) + begin : fbcnt_proc + if (icachere) + begin + fbcnt_c <= {14{1'b0}} ; + end + else + begin + if (ififore) + begin + case (DATAWIDTH) + 8 : + begin + fbcnt_c <= fbcnt + 1 ; + end + 16 : + begin + fbcnt_c <= fbcnt + 2'b10 ; + end + default : + begin + fbcnt_c <= fbcnt + 3'b100 ; + end + endcase + end + else + begin + fbcnt_c <= fbcnt; + end + end + end + + always @(posedge clk) + begin : fbcnt_reg_proc + if(rst) + begin + fbcnt <= {14{1'b0}}; + end + else + begin + fbcnt <= fbcnt_c; + end + end + + always @(fbcnt or length or fifocne) + begin : whole_proc + if (fbcnt >= length & fifocne) + begin + whole <= 1'b1 ; + end + else + begin + whole <= 1'b0 ; + end + end + + assign ififore = (((lsm == LSM_BUF1 | lsm == LSM_BUF2) & dmaack) | + (lsm == LSM_FSTAT & !whole & + flmax != fzero_max[14:0] & !ififore_r) | + (lsm == LSM_FSTAT & !whole & + fifocne & !ififore_r)) ? 1'b1 : 1'b0 ; + + always @(posedge clk) + begin : ififore_reg_proc + if (rst) + begin + ififore_r <= 1'b0 ; + icachere <= 1'b0 ; + end + else + begin + ififore_r <= ififore ; + + if (lsm == LSM_FSTAT & dmaack & dmaeob) + begin + icachere <= 1'b1 ; + end + else + begin + icachere <= 1'b0 ; + end + end + end + + assign fifore = ififore ; + + assign cachere = icachere ; + + always @(posedge clk) + begin : rprog_reg_proc + if (rst) + begin + rprog_r <= 1'b0 ; + rcpoll_r <= 1'b0 ; + rcpoll_r2 <= 1'b0 ; + end + else + begin + rprog_r <= rprog ; + rcpoll_r <= rcpoll ; + if (lsm == LSM_IDLE) + begin + rcpoll_r2 <= rcpoll_r ; + end + end + end + + always @(posedge clk) + begin : stat_reg_drv + if (rst) + begin + des <= 1'b0 ; + fbuf <= 1'b0 ; + stat <= 1'b0 ; + rcomp <= 1'b0 ; + bufcomp <= 1'b0 ; + ru <= 1'b0 ; + end + else + begin + if (lsm == LSM_DES0 | + lsm == LSM_DES1 | + lsm == LSM_DES2 | + lsm == LSM_DES3 | + lsm == LSM_DES0P) + begin + des <= 1'b1 ; + end + else + begin + des <= 1'b0 ; + end + + if ((lsm == LSM_BUF1 | lsm == LSM_BUF2) & req) + begin + fbuf <= 1'b1 ; + end + else + begin + fbuf <= 1'b0 ; + end + + if (lsm == LSM_STAT | lsm == LSM_FSTAT) + begin + stat <= 1'b1 ; + end + else + begin + stat <= 1'b0 ; + end + + if (lsm == LSM_FSTAT & dmaack & dmaeob) + begin + rcomp <= 1'b1 ; + end + else if (rcompack) + begin + rcomp <= 1'b0 ; + end + + if (lsm == LSM_STAT & dmaack & dmaeob) + begin + bufcomp <= 1'b1 ; + end + else if (bufack) + begin + bufcomp <= 1'b0 ; + end + + if (own & !own_c) + begin + ru <= 1'b1 ; + end + else if (own) + begin + ru <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : stop_reg_proc + if (rst) + begin + stop_r <= 1'b1 ; + stopo <= 1'b1 ; + end + else + begin + stop_r <= stopi ; + + if (stop_r & (lsm == LSM_IDLE | + ((lsm == LSM_BUF1 | lsm == LSM_BUF2) & + !fifocne & !rprog_r))) + begin + stopo <= 1'b1 ; + end + else + begin + stopo <= 1'b0 ; + end + end + end + + assign dzero_max = {DATAWIDTH_MAX{1'b0}} ; + + assign fzero_max = {FIFODEPTH_MAX{1'b0}} ; + + assign dmadatai_max = {dzero_max[DATAWIDTH_MAX+1:DATAWIDTH], + dmadatai}; + + assign dmaaddr20 = dmaaddr[2:0] ; + + assign addr10 = dmaaddr[1:0] ; + +endmodule diff --git a/resources/soc/rtl/MAC/rstc.v b/resources/soc/rtl/MAC/rstc.v new file mode 100644 index 0000000..7bedc55 --- /dev/null +++ b/resources/soc/rtl/MAC/rstc.v @@ -0,0 +1,158 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module RSTC ( + clkdma, + clkcsr, + clkt, + clkr, + rstcsr, + rstsoft, + rsttc, + rstrc, + rstdmao, + rstcsro + ); + + input clkdma; + input clkcsr; + input clkt; + input clkr; + + input rstcsr; + input rstsoft; + output rsttc; + reg rsttc; + output rstrc; + reg rstrc; + output rstdmao; + reg rstdmao; + output rstcsro; + reg rstcsro; + + + reg rstsoft_rc1; + reg rstsoft_rc2; + reg rstsoft_rc3; + reg rstsoft_tc1; + reg rstsoft_tc2; + reg rstsoft_tc3; + reg rstsoft_dma1; + reg rstsoft_dma2; + reg rstsoft_dma3; + reg rstsoft_csr; + reg rstsoft_dma_csr1; + reg rstsoft_dma_csr2; + reg rstsoft_rc_csr1; + reg rstsoft_rc_csr2; + reg rstsoft_tc_csr1; + reg rstsoft_tc_csr2; + reg rstcsr_r1; + reg rstcsr_r2; + reg rstcsr_tc1; + reg rstcsr_tc2; + reg rstcsr_rc1; + reg rstcsr_rc2; + reg rstcsr_dma1; + reg rstcsr_dma2; + + + always @(posedge clkcsr) + begin : rstsoft_csr_reg_proc + if (rstcsr_r2) + begin + rstsoft_csr <= 1'b0 ; + rstsoft_dma_csr1 <= 1'b0 ; + rstsoft_dma_csr2 <= 1'b0 ; + rstsoft_tc_csr1 <= 1'b0 ; + rstsoft_tc_csr2 <= 1'b0 ; + rstsoft_rc_csr1 <= 1'b0 ; + rstsoft_rc_csr2 <= 1'b0 ; + end + else + begin + if (rstsoft) + begin + rstsoft_csr <= 1'b1 ; + end + else if (rstsoft_rc_csr2 & rstsoft_tc_csr2 & rstsoft_dma_csr2) + begin + rstsoft_csr <= 1'b0 ; + end + rstsoft_dma_csr1 <= rstsoft_dma3; + rstsoft_dma_csr2 <= rstsoft_dma_csr1; + rstsoft_tc_csr1 <= rstsoft_tc3; + rstsoft_tc_csr2 <= rstsoft_tc_csr1; + rstsoft_rc_csr1 <= rstsoft_rc3; + rstsoft_rc_csr2 <= rstsoft_rc_csr1; + end + end + + always @(posedge clkcsr) + begin : rstcsro_reg_proc + rstcsr_r1 <= rstcsr; + rstcsr_r2 <= rstcsr_r1; + rstcsro <= rstcsr_r2 | rstsoft_csr; + end + + always @(posedge clkr) + begin : rstrc_reg_proc + rstcsr_rc1 <= rstcsr; + rstcsr_rc2 <= rstcsr_rc1; + rstsoft_rc1 <= rstsoft_csr; + rstsoft_rc2 <= rstsoft_rc1; + rstsoft_rc3 <= rstsoft_rc2; + rstrc <= rstcsr_rc2 | rstsoft_rc2; + end + + always @(posedge clkt) + begin : rsttc_proc + rstcsr_tc1 <= rstcsr; + rstcsr_tc2 <= rstcsr_tc1; + rstsoft_tc1 <= rstsoft_csr; + rstsoft_tc2 <= rstsoft_tc1; + rstsoft_tc3 <= rstsoft_tc2; + rsttc <= rstcsr_tc2 | rstsoft_tc2; + end + + always @(posedge clkdma) + begin : rstdma_reg_proc + rstcsr_dma1 <= rstcsr; + rstcsr_dma2 <= rstcsr_dma1; + rstsoft_dma1 <= rstsoft_csr; + rstsoft_dma2 <= rstsoft_dma1; + rstsoft_dma3 <= rstsoft_dma2; + rstdmao <= rstcsr_dma2 | rstsoft_dma2; + end + +endmodule diff --git a/resources/soc/rtl/MAC/tc.v b/resources/soc/rtl/MAC/tc.v new file mode 100644 index 0000000..337157a --- /dev/null +++ b/resources/soc/rtl/MAC/tc.v @@ -0,0 +1,1296 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module TC ( + clk, + rst, + txen, + txer, + txd, + ramdata, + ramaddr, + wadg, + radg, + dpd, + ac, + sofreq, + eofreq, + tiack, + lastbe, + eofadg, + tireq, + ur, + de, + coll, + carrier, + bkoff, + tpend, + tprog, + preamble, + stopi, + stopo, + tcsack, + tcsreq + ); + + parameter FIFODEPTH = 9; + parameter DATAWIDTH = 32; + + `include "utility.v" + + input clk; + input rst; + + output txen; + reg txen; + output txer; + wire txer; + output [MIIWIDTH - 1:0] txd; + reg [MIIWIDTH - 1:0] txd; + + input [DATAWIDTH - 1:0] ramdata; + output [FIFODEPTH - 1:0] ramaddr; + wire [FIFODEPTH - 1:0] ramaddr; + + input [FIFODEPTH - 1:0] wadg; + output [FIFODEPTH - 1:0] radg; + wire [FIFODEPTH - 1:0] radg; + + input dpd; + input ac; + input sofreq; + input eofreq; + input tiack; + input [DATAWIDTH / 8 - 1:0] lastbe; + input [FIFODEPTH - 1:0] eofadg; + output tireq; + reg tireq; + output ur; + wire ur; + output de; + reg de; + + input coll; + input carrier; + input bkoff; + output tpend; + wire tpend; + output tprog; + reg tprog; + output preamble; + reg preamble; + + input stopi; + output stopo; + reg stopo; + + input tcsack; + output tcsreq; + reg tcsreq; + + + reg re_c; + reg re; + reg empty_c; + reg empty; + reg [FIFODEPTH - 1:0] rad_r; + reg [FIFODEPTH - 1:0] rad; + reg [FIFODEPTH - 1:0] iradg; + reg [FIFODEPTH - 1:0] wadg_0_r; + reg [FIFODEPTH - 1:0] iwadg; + reg [FIFODEPTH - 1:0] iwad_c; + reg [FIFODEPTH - 1:0] iwad; + reg [FIFODEPTH - 1:0] sofad; + reg [FIFODEPTH - 1:0] eofadg_r; + reg sofreq_r; + reg eofreq_r; + reg whole; + reg eof; + reg [DATAWIDTH - 1:0] ramdata_r; + + reg [MIIWIDTH - 1:0] itxd0; + reg [DATAWIDTH - 1:0] pmux; + reg [DATAWIDTH - 1:0] datamux_c; + wire [DATAWIDTH_MAX + 1:0] datamux_c_max; + reg txen1; + reg txen_rise; + reg [MIIWIDTH - 1:0] txd_rise; + + reg [3:0] tsm_c; + reg [3:0] tsm; + reg nset; + reg [3:0] ncnt; + wire [1:0] ncnt10; + wire [2:0] ncnt20; + reg [6:0] brel; + reg bset; + reg [6:0] bcnt; + reg bz; + reg nopad; + reg crcgen; + reg crcsend; + reg [31:0] crc_c; + reg [31:0] crc; + reg [31:0] crcneg_c; + reg itprog; + reg itpend; + reg iur; + reg iti; + reg tiack_r; + reg [3:0] ifscnt; + + reg tcsack_r; + reg [7:0] tcscnt; + reg tcs; + + reg ifs1p; + reg ifs2p; + wire defer; + + reg bkoff_r; + + reg stop_r; + wire [3:0] hnibble; + wire [MIIWIDTH_MAX + 1:0] itxd0_max; + wire [MIIWIDTH_MAX + 1:0] itxd0zero_max; + wire [DATAWIDTH_MAX + 1:0] dzero_max; + + always @(posedge clk) + begin : faddr_reg_proc + if (rst) + begin + rad <= {FIFODEPTH{1'b0}} ; + rad_r <= {FIFODEPTH{1'b0}} ; + iradg <= {FIFODEPTH{1'b0}} ; + sofad <= {FIFODEPTH{1'b0}} ; + eofadg_r <= {FIFODEPTH{1'b0}} ; + iwad <= {FIFODEPTH{1'b0}} ; + wadg_0_r <= {FIFODEPTH{1'b0}} ; + iwadg <= {FIFODEPTH{1'b0}} ; + end + else + begin + if (bkoff_r) + begin + rad <= sofad ; + end + else if (re_c) + begin + rad <= rad + 1 ; + end + else if (eof & tsm == TSM_FLUSH) + begin + rad <= iwad ; + end + + rad_r <= rad ; + + iradg <= rad ^ {1'b0, rad[FIFODEPTH - 1:1]} ; + + if (tsm == TSM_IDLE_TCSMT) + begin + sofad <= rad_r ; + end + + eofadg_r <= eofadg ; + + iwad <= iwad_c ; + + wadg_0_r <= wadg; + if (eofreq_r) + begin + iwadg <= eofadg_r ; + end + else + begin + iwadg <= wadg_0_r ; + end + end + end + + always @(iwadg) + begin : iwad_proc + reg[FIFODEPTH - 1:0] wad_v; + wad_v[FIFODEPTH - 1] = iwadg[FIFODEPTH - 1]; + begin : iwad_loop + integer i; + for(i = FIFODEPTH - 2; i >= 0; i = i - 1) + begin + wad_v[i] = wad_v[i + 1] ^ iwadg[i]; + end + end + iwad_c = wad_v ; + end + + always @(rad or iwad) + begin : empty_proc + if (rad == iwad) + begin + empty_c <= 1'b1 ; + end + else + begin + empty_c <= 1'b0 ; + end + end + + always @(posedge clk) + begin : empty_reg_proc + if (rst) + begin + empty <= 1'b1 ; + end + else + begin + empty <= empty_c ; + end + end + + always @(tsm or empty_c or ncnt) + begin : re_proc + if ((tsm == TSM_INFO | + tsm == TSM_SFD | + tsm == TSM_FLUSH) & !empty_c & + ((DATAWIDTH == 8 & !(ncnt[0])) | + (DATAWIDTH == 16 & ncnt[1:0] == 2'b10) | + (DATAWIDTH == 32 & ncnt[2:0] == 3'b110))) + begin + re_c <= 1'b1 ; + end + else + begin + re_c <= 1'b0 ; + end + end + + always @(posedge clk) + begin : re_reg_proc + if (rst) + begin + re <= 1'b0 ; + end + else + begin + re <= re_c ; + end + end + + assign ramaddr = rad ; + + assign radg = iradg ; + + always @(posedge clk) + begin : whole_reg_proc + if (rst) + begin + whole <= 1'b0 ; + end + else + begin + if (iti) + begin + whole <= 1'b0 ; + end + else if (eofreq_r) + begin + whole <= 1'b1 ; + end + end + end + + always @(posedge clk) + begin : se_reg_proc + if (rst) + begin + sofreq_r <= 1'b0 ; + eofreq_r <= 1'b0 ; + end + else + begin + sofreq_r <= sofreq ; + eofreq_r <= eofreq ; + end + end + + always @(tsm or + itpend or + bkoff_r or + defer or bz or + ncnt or dpd or + iur or + hnibble or + ac or + empty or + whole or + tiack_r or + nopad or + coll or + eof) + begin : tsm_proc + case (tsm) + TSM_IDLE_TCSMT : + begin + if (itpend & !bkoff_r & !defer) + begin + tsm_c <= TSM_PREA ; + end + else + begin + tsm_c <= TSM_IDLE_TCSMT ; + end + end + TSM_PREA : + begin + if (bz & (ncnt[0])) + begin + tsm_c <= TSM_SFD ; + end + else + begin + tsm_c <= TSM_PREA ; + end + end + TSM_SFD : + begin + if (bz & (ncnt[0])) + begin + tsm_c <= TSM_INFO ; + end + else + begin + tsm_c <= TSM_SFD ; + end + end + TSM_INFO : + begin + if (coll) + begin + tsm_c <= TSM_JAM ; + end + else if (empty) + begin + if (!whole & ncnt == hnibble) + begin + tsm_c <= TSM_JAM ; + end + else if (eof & (nopad | dpd)) + begin + if (ac) + begin + tsm_c <= TSM_INT ; + end + else + begin + tsm_c <= TSM_CRC ; + end + end + else if (eof) + begin + tsm_c <= TSM_PAD ; + end + else + begin + tsm_c <= TSM_INFO ; + end + end + else + begin + tsm_c <= TSM_INFO ; + end + end + TSM_PAD : + begin + if (coll) + begin + tsm_c <= TSM_JAM ; + end + else if (nopad & (ncnt[0])) + begin + tsm_c <= TSM_CRC ; + end + else + begin + tsm_c <= TSM_PAD ; + end + end + TSM_CRC : + begin + if (coll) + begin + tsm_c <= TSM_JAM ; + end + else if (bz & (ncnt[0])) + begin + tsm_c <= TSM_INT ; + end + else + begin + tsm_c <= TSM_CRC ; + end + end + TSM_JAM : + begin + if (bz & (ncnt[0])) + begin + if (!bkoff_r | iur) + begin + tsm_c <= TSM_FLUSH ; + end + else + begin + tsm_c <= TSM_IDLE_TCSMT ; + end + end + else + begin + tsm_c <= TSM_JAM ; + end + end + TSM_FLUSH : + begin + if (whole & empty) + begin + tsm_c <= TSM_INT ; + end + else + begin + tsm_c <= TSM_FLUSH ; + end + end + default : + begin + if (tiack_r) + begin + tsm_c <= TSM_IDLE_TCSMT ; + end + else + begin + tsm_c <= TSM_INT ; + end + end + endcase + end + + always @(posedge clk) + begin : tsm_reg_proc + if (rst) + begin + tsm <= TSM_IDLE_TCSMT ; + end + else + begin + tsm <= tsm_c ; + end + end + + assign defer = ifs1p | ifs2p ; + + always @(posedge clk) + begin : ifs_reg_proc + if (rst) + begin + ifs1p <= 1'b0 ; + ifs2p <= 1'b0 ; + ifscnt <= IFS1_TIME ; + end + else + begin + if (!itprog & !ifs1p & !ifs2p & ifscnt != 4'b0000) + begin + ifs1p <= 1'b1 ; + end + else if (ifscnt == 4'b0000 | ifs2p) + begin + ifs1p <= 1'b0 ; + end + + if (ifs1p & ifscnt == 4'b0000) + begin + ifs2p <= 1'b1 ; + end + else if (ifs2p & ifscnt == 4'b0000) + begin + ifs2p <= 1'b0 ; + end + + if (itprog | + (carrier & ifs1p) | + (carrier & ifscnt == 4'b0000 & !itpend) | + (carrier & ifscnt == 4'b0000 & bkoff_r)) + begin + ifscnt <= IFS1_TIME ; + end + else if (ifs1p & ifscnt == 4'b0000) + begin + ifscnt <= IFS2_TIME ; + end + else if (ifscnt != 4'b0000) + begin + ifscnt <= ifscnt - 1 ; + end + end + end + + always @(posedge clk) + begin : de_reg_proc + if (rst) + begin + de <= 1'b0 ; + end + else + begin + if (ifs1p & itpend & carrier & tsm == TSM_IDLE_TCSMT) + begin + de <= 1'b1 ; + end + else if (tiack_r) + begin + de <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : eof_reg_proc + if (rst) + begin + eof <= 1'b0 ; + end + else + begin + case (DATAWIDTH) + 8 : + begin + if (whole & !(ncnt[0])) + begin + eof <= 1'b1 ; + end + else + begin + eof <= 1'b0 ; + end + end + 16 : + begin + if (whole & ((lastbe == 2'b11 & ncnt[1:0] == 2'b10) | + (lastbe == 2'b01 & ncnt[1:0] == 2'b00))) + begin + eof <= 1'b1 ; + end + else + begin + eof <= 1'b0 ; + end + end + default : + begin + if (whole & ((lastbe == 4'b1111 & ncnt[2:0] == 3'b110) | + (lastbe == 4'b0111 & ncnt[2:0] == 3'b100) | + (lastbe == 4'b0011 & ncnt[2:0] == 3'b010) | + (lastbe == 4'b0001 & ncnt[2:0] == 3'b000))) + begin + eof <= 1'b1 ; + end + else + begin + eof <= 1'b0 ; + end + end + endcase + end + end + + always @(coll or tsm or ncnt or bz or empty or eof or nopad) + begin : bset_reg_proc + if ((coll & (tsm == TSM_INFO | + tsm == TSM_PAD | + tsm == TSM_CRC)) | + (tsm == TSM_PAD & nopad & !(ncnt[0])) | + (tsm == TSM_PREA & bz & !(ncnt[0])) | + (tsm == TSM_SFD & (ncnt[0])) | + (tsm == TSM_INFO & empty & eof & nopad) | + (tsm == TSM_IDLE_TCSMT)) + begin + bset <= 1'b1 ; + end + else + begin + bset <= 1'b0 ; + end + end + + always @(posedge clk) + begin : bcnt_reg_proc + if (rst) + begin + bcnt <= {7{1'b1}} ; + brel <= 7'b0000110 ; + bz <= 1'b0 ; + end + else + begin + if (bset) + begin + if(coll & tsm==TSM_INFO) + begin + bcnt <= 7'b0000011; + end + else + begin + bcnt <= brel ; + end + end + else if ((ncnt[0]) & !bz) + begin + bcnt <= bcnt - 1 ; + end + + case (tsm) + TSM_IDLE_TCSMT : + begin + brel <= 7'b0000110 ; + end + TSM_PREA : + begin + brel <= 7'b0000000 ; + end + TSM_SFD : + begin + if (coll) + begin + brel <= 7'b0000011 ; + end + else + begin + brel <= MIN_FRAME - 1 ; + end + end + default : + begin + brel <= 7'b0000011 ; + end + endcase + + if (bset & brel != 7'b0000000) + begin + bz <= 1'b0 ; + end + else if (bcnt == 7'b0000001 & (ncnt[0]) & !bz) + begin + bz <= 1'b1 ; + end + end + end + + always @(posedge clk) + begin : nopad_reg_proc + if (rst) + begin + nopad <= 1'b0 ; + end + else + begin + if ((tsm == TSM_INFO & bcnt == 7'b0000100 & !ac) | + (tsm == TSM_INFO & bcnt == 7'b0000001 & ac) | + (tsm == TSM_PAD & bcnt == 7'b0000100) | (dpd & !ac)) + begin + nopad <= 1'b1 ; + end + else if (tsm == TSM_IDLE_TCSMT) + begin + nopad <= 1'b0 ; + end + end + end + + always @(tsm or + itpend or + bkoff_r or + defer or + ncnt or + eof or + empty or + nopad) + begin : nset_proc + if ((tsm == TSM_IDLE_TCSMT & ~(itpend & !bkoff_r & !defer)) | + (tsm == TSM_INFO & empty & eof) | + (tsm == TSM_PAD & nopad & (ncnt[0]))) + begin + nset <= 1'b1 ; + end + else + begin + nset <= 1'b0 ; + end + end + + always @(posedge clk) + begin : ncnt_reg_proc + if (rst) + begin + ncnt <= {4{1'b0}} ; + end + else + begin + if (nset) + begin + ncnt <= {4{1'b0}} ; + end + else if (tsm != TSM_IDLE_TCSMT) + begin + ncnt <= ncnt + 1 ; + end + end + end + + always @(tsm or crc or itxd0_max or crcgen) + begin : crc_proc + if (tsm == TSM_PREA) + begin + crc_c <= {32{1'b1}} ; + end + else if (crcgen) + begin + crc_c[0] <= crc[28] ^ + itxd0_max[3] ; + crc_c[1] <= crc[28] ^ crc[29] ^ + itxd0_max[2] ^ itxd0_max[3] ; + crc_c[2] <= crc[28] ^ crc[29] ^ crc[30] ^ + itxd0_max[1] ^ itxd0_max[2] ^ itxd0_max[3] ; + crc_c[3] <= crc[29] ^ crc[30] ^ crc[31] ^ + itxd0_max[0] ^ itxd0_max[1] ^ itxd0_max[2] ; + crc_c[4] <= crc[0] ^ crc[28] ^ crc[30] ^ crc[31] ^ + itxd0_max[0] ^ itxd0_max[1] ^ itxd0_max[3] ; + crc_c[5] <= crc[1] ^ crc[28] ^ crc[29] ^ crc[31] ^ + itxd0_max[0] ^ itxd0_max[2] ^ itxd0_max[3] ; + crc_c[6] <= crc[2] ^ crc[29] ^ crc[30] ^ + itxd0_max[1] ^ itxd0_max[2] ; + crc_c[7] <= crc[3] ^ crc[28] ^ crc[30] ^ crc[31] ^ + itxd0_max[0] ^ itxd0_max[1] ^ itxd0_max[3] ; + crc_c[8] <= crc[4] ^ crc[28] ^ crc[29] ^ crc[31] ^ + itxd0_max[0] ^ itxd0_max[2] ^ itxd0_max[3] ; + crc_c[9] <= crc[5] ^ crc[29] ^ crc[30] ^ + itxd0_max[1] ^ itxd0_max[2] ; + crc_c[10] <= crc[6] ^ crc[28] ^ crc[30] ^ crc[31] ^ + itxd0_max[0] ^ itxd0_max[1] ^ itxd0_max[3] ; + crc_c[11] <= crc[7] ^ crc[28] ^ crc[29] ^ crc[31] ^ + itxd0_max[0] ^ itxd0_max[2] ^ itxd0_max[3] ; + crc_c[12] <= crc[8] ^ crc[28] ^ crc[29] ^ crc[30] ^ + itxd0_max[1] ^ itxd0_max[2] ^ itxd0_max[3] ; + crc_c[13] <= crc[9] ^ crc[29] ^ crc[30] ^ crc[31] ^ + itxd0_max[0] ^ itxd0_max[1] ^ itxd0_max[2] ; + crc_c[14] <= crc[10] ^ crc[30] ^ crc[31] ^ + itxd0_max[0] ^ itxd0_max[1] ; + crc_c[15] <= crc[11] ^ crc[31] ^ + itxd0_max[0] ; + crc_c[16] <= crc[12] ^ crc[28] ^ + itxd0_max[3] ; + crc_c[17] <= crc[13] ^ crc[29] ^ + itxd0_max[2] ; + crc_c[18] <= crc[14] ^ crc[30] ^ + itxd0_max[1] ; + crc_c[19] <= crc[15] ^ crc[31] ^ + itxd0_max[0] ; + crc_c[20] <= crc[16] ; + crc_c[21] <= crc[17] ; + crc_c[22] <= crc[18] ^ crc[28] ^ + itxd0_max[3] ; + crc_c[23] <= crc[19] ^ crc[28] ^ crc[29] ^ + itxd0_max[2] ^ itxd0_max[3] ; + crc_c[24] <= crc[20] ^ crc[29] ^ crc[30] ^ + itxd0_max[1] ^ itxd0_max[2] ; + crc_c[25] <= crc[21] ^ crc[30] ^ crc[31] ^ + itxd0_max[0] ^ itxd0_max[1] ; + crc_c[26] <= crc[22] ^ crc[28] ^ crc[31] ^ + itxd0_max[0] ^ itxd0_max[3] ; + crc_c[27] <= crc[23] ^ crc[29] ^ + itxd0_max[2] ; + crc_c[28] <= crc[24] ^ crc[30] ^ + itxd0_max[1] ; + crc_c[29] <= crc[25] ^ crc[31] ^ + itxd0_max[0] ; + crc_c[30] <= crc[26] ; + crc_c[31] <= crc[27] ; + end + else + begin + crc_c <= crc ; + end + end + + always @(posedge clk) + begin : crc_reg_proc + if (rst) + begin + crcgen <= 1'b0 ; + crcsend <= 1'b0 ; + crc <= {32{1'b1}} ; + end + else + begin + crc <= crc_c ; + + if (tsm == TSM_INFO | tsm == TSM_PAD) + begin + crcgen <= 1'b1 ; + end + else + begin + crcgen <= 1'b0 ; + end + + if (tsm == TSM_CRC) + begin + crcsend <= 1'b1 ; + end + else + begin + crcsend <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : tstate_reg_proc + if (rst) + begin + itprog <= 1'b0 ; + itpend <= 1'b0 ; + tprog <= 1'b0 ; + preamble <= 1'b0 ; + end + else + begin + if (tsm == TSM_INFO | tsm == TSM_PAD | tsm == TSM_CRC | + tsm == TSM_JAM) + begin + itprog <= 1'b1 ; + end + else + begin + itprog <= 1'b0 ; + end + + if (sofreq_r) + begin + itpend <= 1'b1 ; + end + else + begin + itpend <= 1'b0 ; + end + + if (tsm == TSM_PREA | + tsm == TSM_SFD | + tsm == TSM_INFO | + tsm == TSM_PAD | + tsm == TSM_CRC | + tsm == TSM_JAM) + begin + tprog <= 1'b1 ; + end + else + begin + tprog <= 1'b0 ; + end + + if (tsm == TSM_PREA | tsm == TSM_SFD) + begin + preamble <= 1'b1 ; + end + else + begin + preamble <= 1'b0 ; + end + end + end + + assign tpend = itpend ; + + always @(posedge clk) + begin : iti_reg_proc + if (rst) + begin + iti <= 1'b0 ; + tireq <= 1'b0 ; + tiack_r <= 1'b0 ; + end + else + begin + if (tsm == TSM_INT) + begin + iti <= 1'b1 ; + end + else if (tiack) + begin + iti <= 1'b0 ; + end + + tireq <= iti ; + tiack_r <= tiack ; + end + end + + always @(posedge clk) + begin : iur_reg_proc + if (rst) + begin + iur <= 1'b0 ; + end + else + begin + if (itprog & empty & !whole) + begin + iur <= 1'b1 ; + end + else if (tiack_r) + begin + iur <= 1'b0 ; + end + end + end + + assign ur = iur ; + + always @(tsm or ramdata_r or pmux) + begin : datamux_proc + if (tsm == TSM_INFO) + begin + datamux_c <= ramdata_r ; + end + else + begin + datamux_c <= pmux ; + end + end + + assign ncnt10 = ncnt[1:0] ; + + assign ncnt20 = ncnt[2:0] ; + + assign datamux_c_max = {dzero_max[DATAWIDTH_MAX + 1:DATAWIDTH], + datamux_c}; + + always @(crc) + begin : crcneg_proc + begin : crcneg_loop + integer i; + for(i = 31; i >= 0; i = i - 1) + begin + crcneg_c[i] <= ~crc[31 - i] ; + end + end + end + + always @(posedge clk) + begin : txd_proc + if (rst) + begin + txd_rise <= {MIIWIDTH{1'b1}} ; + pmux <= {DATAWIDTH{1'b1}} ; + itxd0 <= {MIIWIDTH{1'b1}} ; + ramdata_r <= {DATAWIDTH{1'b0}} ; + end + else + begin + case (tsm_c) + TSM_PAD : + begin + pmux <= PAD_PATTERN[63:64 - DATAWIDTH] ; + end + TSM_JAM : + begin + pmux <= JAM_PATTERN[63:64 - DATAWIDTH] ; + end + TSM_PREA : + begin + pmux <= PRE_PATTERN[63:64 - DATAWIDTH] ; + end + TSM_SFD : + begin + pmux <= SFD_PATTERN[63:64 - DATAWIDTH] ; + end + default : + begin + pmux <= {DATAWIDTH{1'b1}} ; + end + endcase + + case (DATAWIDTH) + 32 : + begin + case (ncnt20) + 3'b000 : + begin + itxd0 <= datamux_c_max[3:0] ; + end + 3'b001 : + begin + itxd0 <= datamux_c_max[7:4] ; + end + 3'b010 : + begin + itxd0 <= datamux_c_max[11:8] ; + end + 3'b011 : + begin + itxd0 <= datamux_c_max[15:12] ; + end + 3'b100 : + begin + itxd0 <= datamux_c_max[19:16] ; + end + 3'b101 : + begin + itxd0 <= datamux_c_max[23:20] ; + end + 3'b110 : + begin + itxd0 <= datamux_c_max[27:24] ; + end + default : + begin + itxd0 <= datamux_c_max[31:28] ; + end + endcase + end + 16 : + begin + case (ncnt10) + 2'b00 : + begin + itxd0 <= datamux_c_max[3:0] ; + end + 2'b01 : + begin + itxd0 <= datamux_c_max[7:4] ; + end + 2'b10 : + begin + itxd0 <= datamux_c_max[11:8] ; + end + default : + begin + itxd0 <= datamux_c_max[15:12] ; + end + endcase + end + default : + begin + if (!(ncnt[0])) + begin + itxd0 <= datamux_c_max[3:0] ; + end + else + begin + itxd0 <= datamux_c_max[7:4] ; + end + end + endcase + + if (re) + begin + ramdata_r <= ramdata ; + end + + if (crcsend) + begin + case (ncnt) + 4'b0001 : + begin + txd_rise <= crcneg_c[3:0] ; + end + 4'b0010 : + begin + txd_rise <= crcneg_c[7:4] ; + end + 4'b0011 : + begin + txd_rise <= crcneg_c[11:8] ; + end + 4'b0100 : + begin + txd_rise <= crcneg_c[15:12] ; + end + 4'b0101 : + begin + txd_rise <= crcneg_c[19:16] ; + end + 4'b0110 : + begin + txd_rise <= crcneg_c[23:20] ; + end + 4'b0111 : + begin + txd_rise <= crcneg_c[27:24] ; + end + default : + begin + txd_rise <= crcneg_c[31:28] ; + end + endcase + end + else + begin + txd_rise <= itxd0 ; + end + end + end + + always @(posedge clk) + begin : txen_reg_proc + if (rst) + begin + txen1 <= 1'b0 ; + txen_rise <= 1'b0 ; + end + else + begin + txen_rise <= txen1 ; + if (tsm == TSM_IDLE_TCSMT | + tsm == TSM_INT | + tsm == TSM_FLUSH) + begin + txen1 <= 1'b0 ; + end + else + begin + txen1 <= 1'b1 ; + end + end + end + + always @(posedge clk) + begin : mii_fall_reg_proc + txen <= txen_rise ; + txd <= txd_rise; + end + + assign txer = 1'b0 ; + + always @(posedge clk) + begin : bkoff_reg_proc + if (rst) + begin + bkoff_r <= 1'b0 ; + end + else + begin + if (bkoff) + begin + bkoff_r <= 1'b1 ; + end + else if (tsm != TSM_JAM) + begin + bkoff_r <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : stopo_reg_proc + if (rst) + begin + stop_r <= 1'b0 ; + stopo <= 1'b0 ; + end + else + begin + stop_r <= stopi; + + if (stop_r & tsm == TSM_IDLE_TCSMT & !itpend) + begin + stopo <= 1'b1 ; + end + else + begin + stopo <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : cscnt_reg_proc + if (rst) + begin + tcscnt <= {8{1'b0}} ; + tcs <= 1'b0 ; + tcsreq <= 1'b0 ; + tcsack_r <= 1'b0 ; + end + else + begin + if (tcscnt == 8'b00000000) + begin + tcscnt <= 8'b10000000 ; + end + else + begin + tcscnt <= tcscnt - 1 ; + end + + if (tcscnt == 8'b00000000) + begin + tcs <= 1'b1 ; + end + else if (tcsack_r) + begin + tcs <= 1'b0 ; + end + + if (tcs & !tcsack_r) + begin + tcsreq <= 1'b1 ; + end + else if (tcsack_r) + begin + tcsreq <= 1'b0 ; + end + + tcsack_r <= tcsack ; + + end + end + + assign hnibble = (DATAWIDTH == 32) ? 4'b0111 : + (DATAWIDTH == 16) ? 4'b0011 : + 4'b0001 ; + + assign itxd0zero_max = {(MIIWIDTH_MAX + 1){1'b0}} ; + + assign itxd0_max = {itxd0zero_max[MIIWIDTH_MAX + 1:MIIWIDTH], + itxd0}; + + assign dzero_max = {(DATAWIDTH_MAX + 1){1'b0}} ; + +endmodule diff --git a/resources/soc/rtl/MAC/tfifo.v b/resources/soc/rtl/MAC/tfifo.v new file mode 100644 index 0000000..dca5758 --- /dev/null +++ b/resources/soc/rtl/MAC/tfifo.v @@ -0,0 +1,815 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module TFIFO ( + clk, + rst, + ramwe, + ramaddr, + ramdata, + fifowe, + fifoeof, + fifobe, + fifodata, + fifonf, + fifocnf, + fifoval, + flev, + ici, + dpdi, + aci, + statadi, + cachere, + deo, + lco, + loo, + nco, + eco, + csne, + ico, + uro, + cco, + statado, + sofreq, + eofreq, + dpdo, + aco, + beo, + eofad, + wadg, + tireq, + winp, + dei, + lci, + loi, + nci, + eci, + uri, + cci, + radg, + tiack, + sf, + fdp, + tm, + pbl, + etiack, + etireq, + stopi, + stopo + ); + + parameter DATAWIDTH = 32; + parameter DATADEPTH = 32; + parameter FIFODEPTH = 9; + parameter CACHEDEPTH = 1; + + `include "utility.v" + + input clk; + input rst; + + output ramwe; + wire ramwe; + output [FIFODEPTH - 1:0] ramaddr; + wire [FIFODEPTH - 1:0] ramaddr; + output [DATAWIDTH - 1:0] ramdata; + wire [DATAWIDTH - 1:0] ramdata; + + input fifowe; + input fifoeof; + input [DATAWIDTH / 8 - 1:0] fifobe; + input [DATAWIDTH - 1:0] fifodata; + output fifonf; + reg fifonf; + output fifocnf; + wire fifocnf; + output fifoval; + reg fifoval; + output [FIFODEPTH - 1:0] flev; + wire [FIFODEPTH - 1:0] flev; + + input ici; + input dpdi; + input aci; + input [DATADEPTH - 1:0] statadi; + + input cachere; + output deo; + wire deo; + output lco; + wire lco; + output loo; + wire loo; + output nco; + wire nco; + output eco; + wire eco; + output csne; + wire csne; + output ico; + wire ico; + output uro; + wire uro; + output [3:0] cco; + wire [3:0] cco; + output [DATADEPTH - 1:0] statado; + wire [DATADEPTH - 1:0] statado; + + output sofreq; + wire sofreq; + output eofreq; + reg eofreq; + output dpdo; + wire dpdo; + output aco; + wire aco; + output [DATAWIDTH / 8 - 1:0] beo; + wire [DATAWIDTH / 8 - 1:0] beo; + output [FIFODEPTH - 1:0] eofad; + reg [FIFODEPTH - 1:0] eofad; + output [FIFODEPTH - 1:0] wadg; + reg [FIFODEPTH - 1:0] wadg; + + input tireq; + input winp; + input dei; + input lci; + input loi; + input nci; + input eci; + input uri; + input [3:0] cci; + input [FIFODEPTH - 1:0] radg; + output tiack; + wire tiack; + + input sf; + input fdp; + input [2:0] tm; + input [5:0] pbl; + + input etiack; + output etireq; + reg etireq; + + input stopi; + output stopo; + reg stopo; + + + parameter CCWIDTH = (3 + DATADEPTH + DATAWIDTH / 8 + FIFODEPTH); + reg [CCWIDTH - 1:0] ccmem[(1'b1 << CACHEDEPTH) - 1:0]; + wire ccwe; + wire ccre; + reg ccne; + reg iccnf; + wire [CACHEDEPTH - 1:0] ccwad_c; + reg [CACHEDEPTH - 1:0] ccwad; + reg [CACHEDEPTH - 1:0] ccrad; + reg [CACHEDEPTH - 1:0] ccrad_r; + wire [CCWIDTH - 1:0] ccdi; + wire [CCWIDTH - 1:0] ccdo; + + parameter CSWIDTH = (DATADEPTH + 11); + reg [CSWIDTH - 1:0] csmem[(1'b1 << CACHEDEPTH) - 1:0]; + wire cswe; + reg csre; + reg [CACHEDEPTH - 1:0] cswad; + wire [CACHEDEPTH - 1:0] csrad_c; + reg [CACHEDEPTH - 1:0] csrad; + reg [CACHEDEPTH - 1:0] csrad_r; + wire [CSWIDTH - 1:0] csdi; + wire [CSWIDTH - 1:0] csdo; + wire [DATADEPTH - 1:0] statad; + wire ic; + reg icsne; + + reg tprog; + reg tprog_r; + + reg winp_r; + reg [FIFODEPTH_MAX - 1:0] tlev_c; + reg tresh; + reg [FIFODEPTH - 1:0] stat; + reg [FIFODEPTH - 1:0] wad; + reg [FIFODEPTH - 1:0] rad_c; + reg [FIFODEPTH - 1:0] rad; + reg [FIFODEPTH - 1:0] radg_0_r; + reg [FIFODEPTH - 1:0] radg_r; + reg [FIFODEPTH - 1:0] sad; + wire [FIFODEPTH - 1:0] eofad_bin; + reg pblz; + reg [FIFODEPTH_MAX - 1:0] sflev_c; + + reg tireq_r; + reg tireq_r2; + + reg stop_r; + + wire [FIFODEPTH - 1:0] fone; + wire [FIFODEPTH - 1:0] fzero; + + always @(posedge clk) + begin : ccmem_reg_proc + if (rst) + begin : ccmem_reset + integer i; + for(i = ((1'b1 << CACHEDEPTH) - 1); i >= 0; i = i - 1) + begin + ccmem[i] <= {CCWIDTH{1'b0}}; + end + ccrad_r <= {CACHEDEPTH{1'b0}} ; + end + else + begin + if (fifowe | fifoeof) + begin + ccmem[ccwad] <= ccdi ; + end + ccrad_r <= ccrad ; + end + end + + assign ccwad_c = (fifoeof) ? ccwad + 1 : ccwad ; + + always @(posedge clk) + begin : ccaddr_reg_proc + if (rst) + begin + ccwad <= {CACHEDEPTH{1'b0}} ; + ccrad <= {CACHEDEPTH{1'b0}} ; + end + else + begin + ccwad <= ccwad_c ; + + if (ccre) + begin + ccrad <= ccrad + 1 ; + end + end + end + + always @(posedge clk) + begin : ccfe_reg_proc + if (rst) + begin + iccnf <= 1'b1 ; + ccne <= 1'b0 ; + end + else + begin + if ((ccwad_c == ccrad) & ccwe) + begin + iccnf <= 1'b0 ; + end + else if (ccre) + begin + iccnf <= 1'b1 ; + end + + if (ccwad == ccrad & iccnf) + begin + ccne <= 1'b0 ; + end + else + begin + ccne <= 1'b1 ; + end + end + end + + assign fifocnf = iccnf ; + + assign ccdo = ccmem[ccrad_r] ; + + assign ccdi = {ici, aci, dpdi, wad, fifobe, statadi} ; + + assign ccwe = fifoeof ; + + assign ccre = tireq_r & ~tireq_r2 ; + + assign ic = ccdo[CCWIDTH - 1] ; + + assign aco = ccdo[CCWIDTH - 2] ; + + assign dpdo = ccdo[CCWIDTH - 3] ; + + assign eofad_bin = ccdo[CCWIDTH - 4:CCWIDTH - 3 - FIFODEPTH] ; + + always @(posedge clk) + begin : eofad_reg_proc + if (rst) + begin + eofad <= {FIFODEPTH{1'b0}} ; + end + else + begin + eofad[FIFODEPTH - 1] <= eofad_bin[FIFODEPTH - 1] ; + begin : eofad_loop + integer i; + for(i = FIFODEPTH - 2; i >= 0; i = i - 1) + begin + eofad[i] <= eofad_bin[i] ^ eofad_bin[i + 1] ; + end + end + end + end + + assign beo = ccdo[DATADEPTH + DATAWIDTH / 8 - 1:DATADEPTH] ; + + assign statad = ccdo[DATADEPTH - 1:0] ; + + always @(posedge clk) + begin : csmem_reg_proc + if (rst) + begin : csmem_reset + integer i; + for(i = ((1'b1 << CACHEDEPTH) - 1); i >= 0; i = i - 1) + begin + csmem[i] <= {CSWIDTH{1'b0}}; + end + csrad_r <= {CACHEDEPTH{1'b0}}; + end + else + begin + csmem[cswad] <= csdi ; + csrad_r <= csrad ; + end + end + + always @(posedge clk) + begin : csaddr_reg_proc + if (rst) + begin + cswad <= {CACHEDEPTH{1'b0}} ; + csrad <= {CACHEDEPTH{1'b0}} ; + end + else + begin + if (cswe) + begin + cswad <= cswad + 1 ; + end + + csrad <= csrad_c ; + end + end + + assign csrad_c = (csre) ? csrad + 1 : csrad ; + + always @(posedge clk) + begin : icsne_reg_proc + if (rst) + begin + icsne <= 1'b0 ; + end + else + begin + if (cswad == csrad | (csre & cswad == csrad_c)) + begin + icsne <= 1'b0 ; + end + else + begin + icsne <= 1'b1 ; + end + end + end + + assign csne = icsne; + + assign csdo = csmem[csrad_r] ; + + assign csdi = {dei, lci, loi, nci, eci, ic, cci, uri, statad} ; + + assign deo = csdo[CSWIDTH - 1] ; + + assign lco = csdo[CSWIDTH - 2] ; + + assign loo = csdo[CSWIDTH - 3] ; + + assign nco = csdo[CSWIDTH - 4] ; + + assign eco = csdo[CSWIDTH - 5] ; + + assign ico = csdo[CSWIDTH - 6] ; + + assign cco = csdo[CSWIDTH - 7:CSWIDTH - 10] ; + + assign uro = csdo[CSWIDTH - 11] ; + + assign statado = csdo[DATADEPTH - 1:0] ; + + assign cswe = tireq_r & tprog ; + + always @(posedge clk) + begin : csre_reg_proc + if (rst) + begin + csre <= 1'b0 ; + end + else + begin + csre <= cachere ; + end + end + + always @(posedge clk) + begin : tprog_reg_proc + if (rst) + begin + tprog <= 1'b0 ; + tprog_r <= 1'b0 ; + end + else + begin + tprog_r <= tprog ; + if (tireq_r) + begin + tprog <= 1'b0 ; + end + else if ((!sf & !tprog & !tireq_r & tresh) | ccne) + begin + tprog <= 1'b1 ; + end + end + end + + always @(posedge clk) + begin : eofreq_reg_proc + if (rst) + begin + eofreq <= 1'b0 ; + end + else + begin + if (tprog & ccne) + begin + eofreq <= 1'b1 ; + end + else if (tireq_r) + begin + eofreq <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : tireq_reg_proc + if (rst) + begin + tireq_r <= 1'b0 ; + tireq_r2 <= 1'b0 ; + end + else + begin + tireq_r <= tireq ; + tireq_r2 <= tireq_r ; + end + end + + always @(posedge clk) + begin : etireq_reg_proc + if (rst) + begin + etireq <= 1'b0 ; + end + else + begin + if (fifoeof) + begin + etireq <= 1'b1 ; + end + else if (etiack) + begin + etireq <= 1'b0 ; + end + end + end + + assign tiack = tireq_r2 ; + + assign sofreq = tprog ; + + always @(posedge clk) + begin : addr_reg_proc + if (rst) + begin + wad <= {FIFODEPTH{1'b0}} ; + wadg <= {FIFODEPTH{1'b0}} ; + radg_0_r <= {FIFODEPTH{1'b0}} ; + radg_r <= {FIFODEPTH{1'b0}} ; + rad <= {FIFODEPTH{1'b0}} ; + sad <= {FIFODEPTH{1'b0}} ; + end + else + begin + if (fifowe) + begin + wad <= wad + 1 ; + end + + wadg[FIFODEPTH - 1] <= wad[FIFODEPTH - 1] ; + begin : wadg_loop + integer i; + for(i = FIFODEPTH - 2; i >= 0; i = i - 1) + begin + wadg[i] <= wad[i] ^ wad[i + 1] ; + end + end + + radg_0_r <= radg ; + radg_r <= radg_0_r ; + + rad <= rad_c ; + + if (!tprog & tprog_r) + begin + sad <= eofad_bin ; + end + end + end + + always @(radg_r) + begin : rad_proc + reg[FIFODEPTH - 1:0] rad_v; + rad_v[FIFODEPTH - 1] = radg_r[FIFODEPTH - 1]; + begin : rad_loop + integer i; + for(i = FIFODEPTH - 2; i >= 0; i = i - 1) + begin + rad_v[i] = rad_v[i + 1] ^ radg_r[i]; + end + end + rad_c = rad_v ; + end + + always @(posedge clk) + begin : stat_reg_proc + if (rst) + begin + stat <= {FIFODEPTH{1'b0}} ; + end + else + begin + if ((!winp_r & !fdp & tprog & !tireq_r) | !tprog_r) + begin + stat <= wad - sad ; + end + else + begin + stat <= wad - rad ; + end + end + end + + always @(posedge clk) + begin : winp_reg_proc + if (rst) + begin + winp_r <= 1'b0 ; + end + else + begin + winp_r <= winp ; + end + end + + always @(tm) + begin : tresh_proc + tlev_c <= {FIFODEPTH_MAX{1'b0}} ; + case (DATAWIDTH) + 8 : + begin + case (tm) + 3'b000, 3'b101, 3'b110 : + begin + tlev_c[10:0] <= 11'b00010000000 ; + end + 3'b001, 3'b111 : + begin + tlev_c[10:0] <= 11'b00100000000 ; + end + 3'b010 : + begin + tlev_c[10:0] <= 11'b01000000000 ; + end + 3'b011 : + begin + tlev_c[10:0] <= 11'b10000000000 ; + end + default : + begin + tlev_c[10:0] <= 11'b00001000000 ; + end + endcase + end + 16 : + begin + case (tm) + 3'b000, 3'b101, 3'b110 : + begin + tlev_c[10:0] <= 11'b00001000000 ; + end + 3'b001, 3'b111 : + begin + tlev_c[10:0] <= 11'b00010000000 ; + end + 3'b010 : + begin + tlev_c[10:0] <= 11'b00100000000 ; + end + 3'b011 : + begin + tlev_c[10:0] <= 11'b01000000000 ; + end + default : + begin + tlev_c[10:0] <= 11'b00000100000 ; + end + endcase + end + default : + begin + case (tm) + 3'b000, 3'b101, 3'b110 : + begin + tlev_c[10:0] <= 11'b00000100000 ; + end + 3'b001, 3'b111 : + begin + tlev_c[10:0] <= 11'b00001000000 ; + end + 3'b010 : + begin + tlev_c[10:0] <= 11'b00010000000 ; + end + 3'b011 : + begin + tlev_c[10:0] <= 11'b00100000000 ; + end + default : + begin + tlev_c[10:0] <= 11'b00000010000 ; + end + endcase + end + endcase + end + + always @(posedge clk) + begin : tresh_reg_proc + if (rst) + begin + tresh <= 1'b0 ; + end + else + begin + if (stat >= tlev_c[FIFODEPTH - 1:0]) + begin + tresh <= 1'b1 ; + end + else + begin + tresh <= 1'b0 ; + end + end + end + + always @(pbl or pblz) + begin : sflev_proc + sflev_c[FIFODEPTH_MAX - 1:6] <= {(FIFODEPTH_MAX-6){1'b1}} ; + if (pblz) + begin + sflev_c[5:0] <= 6'b000000 ; + end + else + begin + sflev_c[5:0] <= ~pbl ; + end + end + + always @(posedge clk) + begin : fifoval_reg_proc + if (rst) + begin + fifoval <= 1'b0 ; + end + else + begin + if (stat <= sflev_c[FIFODEPTH - 1:0]) + begin + fifoval <= 1'b1 ; + end + else + begin + fifoval <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : pblz_reg_proc + if (rst) + begin + pblz <= 1'b0 ; + end + else + begin + if (pbl == 6'b000000) + begin + pblz <= 1'b1 ; + end + else + begin + pblz <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : fifonf_reg_proc + if (rst) + begin + fifonf <= 1'b1 ; + end + else + begin + if ((stat == {fone[FIFODEPTH - 1:1], 1'b0} & fifowe) | + (stat == fone)) + begin + fifonf <= 1'b0 ; + end + else + begin + fifonf <= 1'b1 ; + end + end + end + + assign flev = stat ; + + assign ramaddr = wad ; + + assign ramdata = fifodata ; + + assign ramwe = fifowe ; + + always @(posedge clk) + begin : tstop_reg_proc + if (rst) + begin + stop_r <= 1'b1 ; + stopo <= 1'b0 ; + end + else + begin + stop_r <= stopi ; + + if (stop_r & !ccne & !icsne & stat == fzero & !tprog) + begin + stopo <= 1'b1 ; + end + else + begin + stopo <= 1'b0 ; + end + end + end + + assign fone = {FIFODEPTH{1'b1}} ; + + assign fzero = {FIFODEPTH{1'b0}} ; + +endmodule diff --git a/resources/soc/rtl/MAC/tlsm.v b/resources/soc/rtl/MAC/tlsm.v new file mode 100644 index 0000000..c98093a --- /dev/null +++ b/resources/soc/rtl/MAC/tlsm.v @@ -0,0 +1,2197 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module TLSM ( + clk, + rst, + fifonf, + fifocnf, + fifoval, + fifolev, + fifowe, + fifoeof, + fifobe, + fifodata, + ic, + ac, + dpd, + statado, + csne, + lo, + nc, + lc, + ec, + de, + ur, + cc, + statadi, + cachere, + dmaack, + dmaeob, + dmadatai, + dmaaddr, + dmareq, + dmawr, + dmacnt, + dmaaddro, + dmadatao, + fwe, + fdata, + faddr, + dsl, + pbl, + poll, + dbadc, + dbad, + pollack, + tcompack, + tcomp, + des, + fbuf, + stat, + setp, + tu, + ft, + stopi, + stopo + ); + + parameter DATAWIDTH = 32; + parameter DATADEPTH = 32; + parameter FIFODEPTH = 9; + + `include "utility.v" + + input clk; + input rst; + + input fifonf; + input fifocnf; + input fifoval; + input [FIFODEPTH - 1:0] fifolev; + output fifowe; + wire fifowe; + output fifoeof; + wire fifoeof; + output [DATAWIDTH / 8 - 1:0] fifobe; + reg [DATAWIDTH / 8 - 1:0] fifobe; + output [DATAWIDTH - 1:0] fifodata; + wire [DATAWIDTH - 1:0] fifodata; + + output ic; + reg ic; + output ac; + reg ac; + output dpd; + reg dpd; + output [DATADEPTH - 1:0] statado; + wire [DATADEPTH - 1:0] statado; + + input csne; + input lo; + input nc; + input lc; + input ec; + input de; + input ur; + input [3:0] cc; + input [DATADEPTH - 1:0] statadi; + output cachere; + wire cachere; + + input dmaack; + input dmaeob; + input [DATAWIDTH - 1:0] dmadatai; + input [DATADEPTH - 1:0] dmaaddr; + output dmareq; + wire dmareq; + output dmawr; + wire dmawr; + output [FIFODEPTH_MAX - 1:0] dmacnt; + wire [FIFODEPTH_MAX - 1:0] dmacnt; + output [DATADEPTH - 1:0] dmaaddro; + reg [DATADEPTH - 1:0] dmaaddro; + output [DATAWIDTH - 1:0] dmadatao; + reg [DATAWIDTH - 1:0] dmadatao; + + output fwe; + wire fwe; + output [ADDRWIDTH - 1:0] fdata; + wire [ADDRWIDTH - 1:0] fdata; + output [ADDRDEPTH - 1:0] faddr; + wire [ADDRDEPTH - 1:0] faddr; + + input [4:0] dsl; + input [5:0] pbl; + input poll; + input dbadc; + input [DATADEPTH - 1:0] dbad; + output pollack; + wire pollack; + + input tcompack; + output tcomp; + wire tcomp; + output des; + reg des; + output fbuf; + reg fbuf; + output stat; + reg stat; + output setp; + reg setp; + output tu; + reg tu; + output [1:0] ft; + reg [1:0] ft; + + input stopi; + output stopo; + reg stopo; + + + wire [DATAWIDTH_MAX + 1:0] dmadatai_max; + reg [DATAWIDTH_MAX - 1:0] dataimax_r; + wire [1:0] dataimax_r10; + wire [2:0] dmaaddr20; + reg req_c; + reg req; + reg [2:0] req_r; + + reg idmareq; + wire [31:0] datao32; + wire [FIFODEPTH_MAX - 1:0] bsmax; + wire [FIFODEPTH_MAX - 1:0] flmax; + wire [FIFODEPTH - 1:0] flmax_sub; + wire [FIFODEPTH_MAX - 1:0] blmax; + reg fl_g_bs; + reg fl_g_bl; + reg bl_g_bs; + reg pblz; + reg buffetch; + reg dmaack_r; + + reg [3:0] lsm_c; + reg [3:0] lsm; + reg [3:0] lsm_r; + reg [2:0] csm_c; + reg [2:0] csm; + reg [2:0] lsmcnt; + reg tsprog; + reg [DATADEPTH - 1:0] statad; + wire es_c; + reg own_c; + reg own; + reg tch; + reg ter; + reg set; + reg tls; + reg tfs; + wire [10:0] bs_c; + wire [1:0] bs_c10; + reg [10:0] bs1; + reg [10:0] bs2; + reg adwrite; + reg [DATADEPTH - 1:0] bad; + reg [DATADEPTH - 1:0] dad; + reg dbadc_r; + wire [31:0] tstat; + reg lastdma; + reg icachere; + reg poll_r; + reg [FIFODEPTH_MAX - 1:0] dmacnt_c; + reg [FIFODEPTH_MAX - 1:0] dmacnt_r; + + wire [1:0] addsel16; + wire [3:0] addsel32; + reg [3:0] addv_c; + reg [1:0] badd_c; + reg [11:0] bcnt; + reg ififowe; + wire bufwe; + wire firstb_c; + reg firstb; + reg [DATAWIDTH - 1:0] buf0_c; + reg [DATAWIDTH * 2 - 9:0] buf_c; + reg [DATAWIDTH * 2 - 9:0] buf_r; + reg [3:0] buflev_c; + reg [3:0] buflev; + reg [DATAWIDTH / 8 - 1:0] firstbe; + reg [DATAWIDTH / 8 - 1:0] lastbe; + reg [DATAWIDTH / 8 - 1:0] be; + wire [1:0] be10; + wire [3:0] be30; + + reg itcomp; + reg tcompack_r; + + reg ifwe; + reg [ADDRDEPTH - 1:0] ifaddr; + + reg stop_r; + + wire [FIFODEPTH_MAX - 1:0] fzero_max; + wire [DATAWIDTH_MAX + 1:0] dzero_max; + wire [DATAWIDTH_MAX * 2 - 7:0] buf_r_max; + wire [DATAWIDTH_MAX * 2 - 7:0] bufzero_max; + + + always @(posedge clk) + begin : idmareq_reg_proc + if (rst) + begin + idmareq <= 1'b0 ; + end + else + begin + if (req_c) + begin + idmareq <= 1'b1 ; + end + else if (dmaack & dmaeob) + begin + idmareq <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : cachere_reg_proc + if (rst) + begin + icachere <= 1'b0 ; + end + else + begin + if (itcomp & tcompack_r) + begin + icachere <= 1'b1 ; + end + else + begin + icachere <= 1'b0 ; + end + end + end + + assign cachere = icachere ; + + always @(lsm or + csm or + poll_r or + dmaack or + dmaeob or + own_c or + tch or + bs1 or + bs2 or + stop_r or + lsmcnt or + fifocnf or + tsprog or + lastdma or + dbadc_r) + begin : lsm_proc + case (lsm) + LSM_IDLE : + begin + if (!dbadc_r & !stop_r & fifocnf & (poll_r | (tsprog & dmaack & dmaeob))) + begin + lsm_c <= LSM_DES0 ; + end + else + begin + lsm_c <= LSM_IDLE ; + end + end + LSM_DES0 : + begin + if (dmaack & dmaeob & !tsprog) + begin + if (own_c) + begin + lsm_c <= LSM_DES1 ; + end + else + begin + lsm_c <= LSM_IDLE ; + end + end + else + begin + lsm_c <= LSM_DES0 ; + end + end + LSM_DES1 : + begin + if (dmaack & dmaeob & !tsprog) + begin + lsm_c <= LSM_DES2 ; + end + else + begin + lsm_c <= LSM_DES1 ; + end + end + LSM_DES2 : + begin + if (dmaack & dmaeob & !tsprog) + begin + if (bs1 == 11'b00000000000 | csm == CSM_IDLE) + begin + lsm_c <= LSM_DES3 ; + end + else + begin + lsm_c <= LSM_BUF1 ; + end + end + else + begin + lsm_c <= LSM_DES2 ; + end + end + LSM_DES3 : + begin + if (dmaack & dmaeob & !tsprog) + begin + if (bs2 == 11'b00000000000 | tch | csm == CSM_IDLE) + begin + lsm_c <= LSM_NXT ; + end + else + begin + lsm_c <= LSM_BUF2 ; + end + end + else + begin + lsm_c <= LSM_DES3 ; + end + end + LSM_BUF1 : + begin + if (!tsprog & dmaack & dmaeob & lastdma) + begin + lsm_c <= LSM_DES3 ; + end + else + begin + lsm_c <= LSM_BUF1 ; + end + end + LSM_BUF2 : + begin + if (!tsprog & dmaack & dmaeob & lastdma) + begin + lsm_c <= LSM_NXT ; + end + else + begin + lsm_c <= LSM_BUF2 ; + end + end + LSM_NXT : + begin + if (lsmcnt == 3'b000) + begin + if (csm == CSM_L | csm == CSM_FL) + begin + if (stop_r | !fifocnf) + begin + lsm_c <= LSM_IDLE ; + end + else + begin + lsm_c <= LSM_DES0 ; + end + end + else + begin + lsm_c <= LSM_STAT ; + end + end + else + begin + lsm_c <= LSM_NXT ; + end + end + default : + begin + if (dmaack & dmaeob & !tsprog) + begin + if (stop_r) + begin + lsm_c <= LSM_IDLE ; + end + else + begin + lsm_c <= LSM_DES0 ; + end + end + else + begin + lsm_c <= LSM_STAT ; + end + end + endcase + end + + always @(posedge clk) + begin : lsm_reg_proc + if (rst) + begin + lsm <= LSM_IDLE ; + lsm_r <= LSM_IDLE ; + end + else + begin + lsm <= lsm_c ; + lsm_r <= lsm ; + end + end + + always @(csm or lsm or tfs or tls or own or set or bs1 or bs2) + begin : csm_proc + case (csm) + CSM_IDLE : + begin + if (lsm == LSM_DES2) + begin + if (!set & tfs & tls) + begin + csm_c <= CSM_FL ; + end + else if (!set & tfs & !tls) + begin + csm_c <= CSM_F ; + end + else if (set & !tfs & !tls) + begin + csm_c <= CSM_SET ; + end + else + begin + csm_c <= CSM_IDLE ; + end + end + else + begin + csm_c <= CSM_IDLE ; + end + end + CSM_FL : + begin + if (lsm == LSM_DES0 | lsm == LSM_IDLE) + begin + csm_c <= CSM_IDLE ; + end + else if (lsm == LSM_DES2 & + bs1 == 11'b00000000000 & + bs2 == 11'b00000000000) + begin + csm_c <= CSM_BAD ; + end + else + begin + csm_c <= CSM_FL ; + end + end + CSM_F : + begin + if (tls) + begin + csm_c <= CSM_L ; + end + else if (lsm == LSM_DES1 & !tfs) + begin + csm_c <= CSM_I ; + end + else + begin + csm_c <= CSM_F ; + end + end + CSM_L : + begin + if (lsm == LSM_DES0 | lsm == LSM_IDLE) + begin + csm_c <= CSM_IDLE ; + end + else + begin + csm_c <= CSM_L ; + end + end + CSM_SET : + begin + if (lsm == LSM_DES0 | lsm == LSM_IDLE) + begin + csm_c <= CSM_IDLE ; + end + else + begin + csm_c <= CSM_SET ; + end + end + CSM_I : + begin + if (tls) + begin + csm_c <= CSM_L ; + end + else + begin + csm_c <= CSM_I ; + end + end + default : + begin + if (lsm == LSM_NXT) + begin + csm_c <= CSM_IDLE ; + end + else + begin + csm_c <= CSM_BAD ; + end + end + endcase + end + + always @(posedge clk) + begin : csm_reg_proc + if (rst) + begin + csm <= CSM_IDLE ; + end + else + begin + csm <= csm_c ; + end + end + + always @(posedge clk) + begin : lsmcnt_reg_proc + if (rst) + begin + lsmcnt <= {3{1'b1}} ; + end + else + begin + if (lsm == LSM_NXT) + begin + lsmcnt <= lsmcnt - 1 ; + end + else + begin + lsmcnt <= {3{1'b1}} ; + end + end + end + + always @(posedge clk) + begin : poll_reg_proc + if (rst) + begin + poll_r <= 1'b0 ; + end + else + begin + if (poll) + begin + poll_r <= 1'b1 ; + end + else if (!dbadc_r) + begin + poll_r <= 1'b0 ; + end + end + end + + assign pollack = poll_r ; + + always @(own or dmaack or dmaeob or lsm or dmadatai_max or tsprog) + begin : own_proc + if (dmaack & dmaeob & lsm == LSM_DES0 & !tsprog) + begin + own_c <= dmadatai_max[DATAWIDTH - 1] ; + end + else + begin + own_c <= own ; + end + end + + always @(posedge clk) + begin : own_reg_proc + if (rst) + begin + own <= 1'b1 ; + end + else + begin + own <= own_c ; + end + end + + always @(posedge clk) + begin : des1_reg_proc + reg ft22; + if (rst) + begin + ft22 = 1'b0; + tls <= 1'b0 ; + tfs <= 1'b0 ; + set <= 1'b0 ; + ac <= 1'b0 ; + ter <= 1'b0 ; + tch <= 1'b0 ; + dpd <= 1'b0 ; + ic <= 1'b0 ; + bs2 <= {11{1'b0}} ; + bs1 <= {11{1'b0}} ; + ft <= {2{1'b0}} ; + end + else + begin + if (lsm == LSM_DES1 & dmaack & !tsprog) + begin + case (DATAWIDTH) + 8 : + begin + case (dmaaddr20) + 3'b000, 3'b100 : + begin + bs1[7:0] <= dmadatai_max[7:0] ; + end + 3'b001, 3'b101 : + begin + bs1[10:8] <= dmadatai_max[2:0] ; + bs2[4:0] <= dmadatai_max[7:3] ; + end + 3'b010, 3'b110 : + begin + bs2[10:5] <= dmadatai_max[5:0] ; + dpd <= dmadatai_max[7] ; + ft22 = dmadatai_max[6]; + end + default : + begin + ic <= dmadatai_max[7] ; + tls <= dmadatai_max[6] ; + tfs <= dmadatai_max[5] ; + set <= dmadatai_max[3] ; + ac <= dmadatai_max[2] ; + ter <= dmadatai_max[1] ; + tch <= dmadatai_max[0] ; + if (dmadatai_max[3]) + begin + ft <= {dmadatai_max[4], ft22} ; + end + end + endcase + end + 16 : + begin + case (dmaaddr20) + 3'b000, 3'b100 : + begin + bs1[10:0] <= dmadatai_max[10:0] ; + bs2[4:0] <= dmadatai_max[15:11] ; + end + default : + begin + bs2[10:5] <= dmadatai_max[5:0] ; + ic <= dmadatai_max[15] ; + tls <= dmadatai_max[14] ; + tfs <= dmadatai_max[13] ; + set <= dmadatai_max[11] ; + ac <= dmadatai_max[10] ; + ter <= dmadatai_max[9] ; + tch <= dmadatai_max[8] ; + dpd <= dmadatai_max[7] ; + if (dmadatai_max[11]) + begin + ft <= {dmadatai_max[12], dmadatai_max[6]} ; + end + end + endcase + end + default : + begin + ic <= dmadatai_max[31] ; + tls <= dmadatai_max[30] ; + tfs <= dmadatai_max[29] ; + set <= dmadatai_max[27] ; + ac <= dmadatai_max[26] ; + ter <= dmadatai_max[25] ; + tch <= dmadatai_max[24] ; + dpd <= dmadatai_max[23] ; + bs2 <= dmadatai_max[21:11] ; + bs1 <= dmadatai_max[10:0] ; + if (dmadatai_max[27]) + begin + ft <= {dmadatai_max[28], dmadatai_max[22]} ; + end + end + endcase + end + end + end + + always @(posedge clk) + begin : adwrite_reg_proc + if (rst) + begin + adwrite <= 1'b0 ; + end + else + begin + if (dmaack & dmaeob & !tsprog) + begin + adwrite <= 1'b1 ; + end + else + begin + adwrite <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : dbadc_reg_proc + if (rst) + begin + dbadc_r <= 1'b0 ; + end + else + begin + dbadc_r <= dbadc ; + end + end + + always @(posedge clk) + begin : dad_reg_proc + if (rst) + begin + dad <= {DATADEPTH{1'b1}} ; + end + else + begin + if (dbadc_r) + begin + dad <= dbad ; + end + else if (adwrite) + begin + case (lsm_r) + LSM_DES3 : + begin + if (ter) + begin + dad <= dbad ; + end + else if (tch) + begin + dad <= dataimax_r[DATADEPTH - 1:0] ; + end + else + begin + dad <= dmaaddr + ({dsl, 2'b00}) ; + end + end + LSM_DES0 : + begin + if (own) + begin + dad <= dmaaddr ; + end + end + LSM_DES2 : + begin + dad <= dmaaddr ; + end + LSM_DES1 : + begin + dad <= dmaaddr ; + end + default : + begin + end + endcase + end + end + end + + always @(posedge clk) + begin : bad_reg_proc + if (rst) + begin + bad <= {DATADEPTH{1'b1}} ; + end + else + begin + if (adwrite) + begin + if (lsm_r == LSM_DES2 | lsm_r == LSM_DES3) + begin + case (DATAWIDTH) + 8 : + begin + bad <= dataimax_r[DATADEPTH - 1:0] ; + end + 16 : + begin + bad <= {dataimax_r[DATADEPTH - 1:1], 1'b0} ; + end + default : + begin + bad <= {dataimax_r[DATADEPTH - 1:2], 2'b00} ; + end + endcase + end + else + begin + bad <= dmaaddr ; + end + end + end + end + + always @(posedge clk) + begin : stataddr_reg_proc + if (rst) + begin + statad <= {DATADEPTH{1'b1}} ; + end + else + begin + if (lsm_r == LSM_DES0 & adwrite & own) + begin + statad <= dad ; + end + end + end + + assign statado = statad ; + + assign bs_c = (lsm_r == LSM_DES2) ? bs1 : bs2 ; + + assign addsel16 = {dataimax_r[0], bs_c[0]} ; + + assign addsel32 = {dataimax_r10, bs_c10} ; + + always @(addsel16 or addsel32) + begin : badd_proc + case (DATAWIDTH) + 8 : + begin + badd_c <= 2'b00 ; + end + 16 : + begin + if (addsel16 == 2'b01 | + addsel16 == 2'b10 | + addsel16 == 2'b11) + begin + badd_c <= 2'b01 ; + end + else + begin + badd_c <= 2'b00 ; + end + end + default : + begin + case (addsel32) + 4'b0000 : + begin + badd_c <= 2'b00 ; + end + 4'b1011, 4'b1110, 4'b1111 : + begin + badd_c <= 2'b10 ; + end + default : + begin + badd_c <= 2'b01 ; + end + endcase + end + endcase + end + + always @(posedge clk) + begin : bcnt_reg_proc + if (rst) + begin + bcnt <= {12{1'b1}} ; + end + else + begin + case (DATAWIDTH) + 8 : + begin + if (lsm_r == LSM_DES2 | lsm_r == LSM_DES3) + begin + bcnt <= {1'b0, bs_c} ; + end + else if (dmaack & !tsprog) + begin + bcnt <= bcnt - 1 ; + end + end + 16 : + begin + if (lsm_r == LSM_DES2 | lsm_r == LSM_DES3) + begin + bcnt <= {(({1'b0, bs_c[10:1]}) + badd_c), 1'b0} ; + end + else if (dmaack & !tsprog) + begin + bcnt <= {(bcnt[11:1] - 1), 1'b0} ; + end + end + default : + begin + if (lsm_r == LSM_DES2 | lsm_r == LSM_DES3) + begin + bcnt <= {(({1'b0, bs_c[10:2]}) + badd_c), 2'b00} ; + end + else if (dmaack & !tsprog) + begin + bcnt <= {(bcnt[11:2] - 1), 2'b00} ; + end + end + endcase + end + end + + + assign bs_c10 = bs_c[1:0] ; + + assign dataimax_r10 = dataimax_r[1:0] ; + + always @(posedge clk) + begin : firstbe_reg_proc + if (rst) + begin + firstbe <= {(DATAWIDTH/8){1'b1}} ; + end + else + begin + if (lsm_r == LSM_DES2 | lsm_r == LSM_DES3) + begin + case (DATAWIDTH) + 8 : + begin + firstbe <= 1'b1 ; + end + 16 : + begin + if (dataimax_r[0]) + begin + firstbe <= 2'b10 ; + end + else + begin + firstbe <= 2'b11 ; + end + end + default : + begin + case (dataimax_r10) + 2'b00 : + begin + firstbe <= 4'b1111 ; + end + 2'b01 : + begin + firstbe <= 4'b1110 ; + end + 2'b10 : + begin + firstbe <= 4'b1100 ; + end + default : + begin + firstbe <= 4'b1000 ; + end + endcase + end + endcase + end + end + end + + always @(posedge clk) + begin : lastbe_reg_proc + if (rst) + begin + lastbe <= {(DATAWIDTH/8){1'b1}} ; + end + else + begin + if (lsm_r == LSM_DES2 | lsm_r == LSM_DES3) + begin + case (DATAWIDTH) + 8 : + begin + lastbe <= 1'b1 ; + end + 16 : + begin + if ((!(dataimax_r[0]) & !(bs_c[0])) | + ((dataimax_r[0]) & (bs_c[0]))) + begin + lastbe <= 2'b11 ; + end + else + begin + lastbe <= 2'b01 ; + end + end + default : + begin + case (dataimax_r10) + 2'b00 : + begin + case (bs_c10) + 2'b00 : + begin + lastbe <= 4'b1111 ; + end + 2'b01 : + begin + lastbe <= 4'b0001 ; + end + 2'b10 : + begin + lastbe <= 4'b0011 ; + end + default : + begin + lastbe <= 4'b0111 ; + end + endcase + end + 2'b01 : + begin + case (bs_c10) + 2'b00 : + begin + lastbe <= 4'b0001 ; + end + 2'b01 : + begin + lastbe <= 4'b0011 ; + end + 2'b10 : + begin + lastbe <= 4'b0111 ; + end + default : + begin + lastbe <= 4'b1111 ; + end + endcase + end + 2'b10 : + begin + case (bs_c10) + 2'b00 : + begin + lastbe <= 4'b0011 ; + end + 2'b01 : + begin + lastbe <= 4'b0111 ; + end + 2'b10 : + begin + lastbe <= 4'b1111 ; + end + default : + begin + lastbe <= 4'b0001 ; + end + endcase + end + default : + begin + case (bs_c10) + 2'b00 : + begin + lastbe <= 4'b0111 ; + end + 2'b01 : + begin + lastbe <= 4'b1111 ; + end + 2'b10 : + begin + lastbe <= 4'b0001 ; + end + default : + begin + lastbe <= 4'b0011 ; + end + endcase + end + endcase + end + endcase + end + end + end + + always @(posedge clk) + begin : tfwe_reg_proc + if (rst) + begin + ififowe <= 1'b0 ; + end + else + begin + if (((DATAWIDTH == 8 & buflev_c >= 4'b0001 & bufwe) | + (DATAWIDTH ==16 & buflev_c >= 4'b0010 & bufwe) | + (DATAWIDTH ==32 & buflev_c >= 4'b0100 & bufwe) | + (buflev_c != 4'b0000 & lsm == LSM_NXT & + (csm == CSM_L | csm == CSM_FL))) & fifonf) + begin + ififowe <= 1'b1 ; + end + else + begin + ififowe <= 1'b0 ; + end + end + end + + assign fifoeof = ((csm == CSM_L | csm == CSM_FL) & + lsm == LSM_NXT & lsmcnt == 3'b001) ? 1'b1 : 1'b0 ; + + assign fifowe = ififowe ; + + assign firstb_c = (bufwe) ? 1'b0 : + (lsm == LSM_DES2 | lsm == LSM_DES3) ? 1'b1 : + firstb ; + + always @(firstb or firstbe or lastbe or dmaeob or lastdma) + begin : be_proc + if (dmaeob & lastdma) + begin + be <= lastbe ; + end + else if (firstb) + begin + be <= firstbe ; + end + else + begin + be <= {(DATAWIDTH/8){1'b1}} ; + end + end + + always @(be or be30 or dmadatai_max) + begin : tbuf0_proc + reg[15:0] buf0_16; + reg[31:0] buf0_32; + buf0_c <= {DATAWIDTH{1'b0}} ; + case (DATAWIDTH) + 8 : + begin + buf0_c <= dmadatai_max[7:0]; + end + 16 : + begin + buf0_16 = {16{1'b0}}; + if (be == 2'b10) + begin + buf0_16[7:0] = dmadatai_max[15:8]; + end + else + begin + buf0_16 = dmadatai_max[15:0]; + end + buf0_c <= buf0_16 ; + end + default : + begin + buf0_32 = {32{1'b0}}; + case (be30) + 4'b1110 : + begin + buf0_32[23:0] = dmadatai_max[31:8]; + end + 4'b1100 : + begin + buf0_32[15:0] = dmadatai_max[31:16]; + end + 4'b1000 : + begin + buf0_32[7:0] = dmadatai_max[31:24]; + end + default : + begin + buf0_32 = dmadatai_max[31:0]; + end + endcase + buf0_c <= buf0_32 ; + end + endcase + end + + always @(buflev or buf_r_max or buf0_c or bufwe or ififowe) + begin : tbuf_proc + reg[23:0] buf_16; + reg[55:0] buf_32; + case (DATAWIDTH) + 8 : + begin + buf_c <= buf0_c ; + end + 16 : + begin + buf_16 = buf_r_max[DATAWIDTH * 2 - 9:0]; + if (bufwe) + begin + case (buflev) + 4'b0000 : + begin + buf_16[15:0] = buf0_c; + end + 4'b0001 : + begin + buf_16[23:8] = buf0_c; + end + 4'b0010 : + begin + buf_16[15:0] = buf0_c; + end + default : + begin + buf_16[23:8] = buf0_c; + buf_16[7:0] = buf_r_max[23:16]; + end + endcase + end + else if (ififowe) + begin + buf_16 = {buf_r_max[23:8], buf_r_max[23:16]}; + end + buf_c <= buf_16 ; + end + default : + begin + buf_32 = buf_r_max[DATAWIDTH * 2 - 9:0]; + if (bufwe) + begin + case (buflev) + 4'b0000 : + begin + buf_32[31:0] = buf0_c; + end + 4'b0001 : + begin + buf_32[39:8] = buf0_c; + end + 4'b0010 : + begin + buf_32[47:16] = buf0_c; + end + 4'b0011 : + begin + buf_32[55:24] = buf0_c; + end + 4'b0100 : + begin + buf_32[31:0] = buf0_c; + end + 4'b0101 : + begin + buf_32[39:8] = buf0_c; + buf_32[7:0] = buf_r_max[39:32]; + end + 4'b0110 : + begin + buf_32[47:16] = buf0_c; + buf_32[15:0] = buf_r_max[47:32]; + end + default : + begin + buf_32[55:24] = buf0_c; + buf_32[23:0] = buf_r_max[55:32]; + end + endcase + end + else if (ififowe) + begin + buf_32 = {buf_r_max[55:24], buf_r_max[55:32]}; + end + buf_c <= buf_32 ; + end + endcase + end + + assign bufwe = (dmaack & !set & fifonf & !tsprog & + (lsm == LSM_BUF1 | lsm == LSM_BUF2)) ? 1'b1 : 1'b0 ; + + assign fifodata = buf_r_max[DATAWIDTH - 1:0] ; + + assign be10 = (DATAWIDTH == 16) ? be : {2{1'b1}} ; + + assign be30 = (DATAWIDTH == 32) ? be : {4{1'b1}} ; + + always @(be10 or be30) + begin : addv_proc + case (DATAWIDTH) + 8 : + begin + addv_c <= 4'b0000 ; + end + 16 : + begin + case (be10) + 2'b01, 2'b10 : + begin + addv_c <= 4'b0001 ; + end + default : + begin + addv_c <= 4'b0010 ; + end + endcase + end + default : + begin + case (be30) + 4'b0001, 4'b1000 : + begin + addv_c <= 4'b0001 ; + end + 4'b0011, 4'b1100 : + begin + addv_c <= 4'b0010 ; + end + 4'b0111, 4'b1110 : + begin + addv_c <= 4'b0011 ; + end + default : + begin + addv_c <= 4'b0100 ; + end + endcase + end + endcase + end + + always @(buflev or bufwe or ififowe or addv_c) + begin : buflev_proc + case (DATAWIDTH) + 8 : + begin + if (bufwe) + begin + buflev_c <= 4'b0001 ; + end + else if (ififowe) + begin + buflev_c <= 4'b0000 ; + end + else + begin + buflev_c <= buflev ; + end + end + 16 : + begin + if (bufwe) + begin + buflev_c <= ({buflev[3:2], 1'b0, buflev[0]}) + addv_c ; + end + else if (ififowe & (buflev[1])) + begin + buflev_c <= {buflev[3:2], 1'b0, buflev[0]} ; + end + else if (ififowe & !(buflev[1])) + begin + buflev_c <= {buflev[3:1], 1'b0} ; + end + else + begin + buflev_c <= buflev ; + end + end + default : + begin + if (bufwe) + begin + buflev_c <= ({buflev[3:3], 1'b0, buflev[1:0]}) + addv_c ; + end + else if (ififowe & (buflev[2])) + begin + buflev_c <= {buflev[3:3], 1'b0, buflev[1:0]} ; + end + else if (ififowe & !(buflev[2])) + begin + buflev_c <= {buflev[3:2], 2'b00} ; + end + else + begin + buflev_c <= buflev ; + end + end + endcase + end + + always @(posedge clk) + begin : buf_reg_proc + if (rst) + begin + buflev <= {4{1'b0}} ; + firstb <= 1'b1 ; + buf_r <= {(DATAWIDTH*2){1'b0}} ; + end + else + begin + buflev <= buflev_c ; + firstb <= firstb_c ; + buf_r <= buf_c ; + end + end + + always @(posedge clk) + begin : lbe_reg_proc + if (rst) + begin + fifobe <= {(DATAWIDTH/8){1'b1}} ; + end + else + begin + if (ififowe) + begin + case (DATAWIDTH) + 8 : + begin + fifobe <= 1'b1 ; + end + 16 : + begin + case (buflev) + 4'b0001 : + begin + fifobe <= 2'b01 ; + end + default : + begin + fifobe <= 2'b11 ; + end + endcase + end + default : + begin + case (buflev) + 4'b0001 : + begin + fifobe <= 4'b0001 ; + end + 4'b0010 : + begin + fifobe <= 4'b0011 ; + end + 4'b0011 : + begin + fifobe <= 4'b0111 ; + end + default : + begin + fifobe <= 4'b1111 ; + end + endcase + end + endcase + end + end + end + + assign es_c = ur | lc | lo | nc | ec ; + + assign tstat = {1'b0, TDES0_RV[30:16], + es_c, TDES0_RV[14:12], lo, nc, lc, + ec, TDES0_RV[7], + cc, TDES0_RV[2], ur, de}; + + assign datao32 = (tsprog) ? tstat : (set) ? SET0_RV : TDES0_RV ; + + always @(posedge clk) + begin : dataimax_reg_proc + if (rst) + begin + dataimax_r <= {DATADEPTH_MAX{1'b1}} ; + end + else + begin + case (DATAWIDTH) + 8 : + begin + case (dmaaddr20) + 3'b000, 3'b100 : + begin + dataimax_r[7:0] <= dmadatai_max[DATAWIDTH-1:0] ; + end + 3'b001, 3'b101 : + begin + dataimax_r[15:8] <= dmadatai_max[DATAWIDTH-1:0] ; + end + 3'b010, 3'b110 : + begin + dataimax_r[23:16] <= dmadatai_max[DATAWIDTH-1:0] ; + end + default : + begin + dataimax_r[31:24] <= dmadatai_max[DATAWIDTH-1:0] ; + end + endcase + end + 16 : + begin + if (!(dmaaddr[1])) + begin + dataimax_r[15:0] <= dmadatai_max[DATAWIDTH-1:0] ; + end + else + begin + dataimax_r[31:16] <= dmadatai_max[DATAWIDTH-1:0] ; + end + end + default : + begin + dataimax_r <= dmadatai_max[31:0] ; + end + endcase + end + end + + always @(datao32 or dmaaddr) + begin : datao_proc + reg[1:0] addr10; + addr10 = dmaaddr[1:0]; + case (DATAWIDTH) + 8 : + begin + case (addr10) + 2'b00 : + begin + dmadatao <= datao32[7:0] ; + end + 2'b01 : + begin + dmadatao <= datao32[15:8] ; + end + 2'b10 : + begin + dmadatao <= datao32[23:16] ; + end + default : + begin + dmadatao <= datao32[31:24] ; + end + endcase + end + 16 : + begin + if (!(addr10[1])) + begin + dmadatao <= datao32[15:0] ; + end + else + begin + dmadatao <= datao32[31:16] ; + end + end + default : + begin + dmadatao <= datao32 ; + end + endcase + end + + assign flmax_sub = fzero_max[FIFODEPTH - 1:0] - 1 - fifolev ; + + assign flmax = {fzero_max[FIFODEPTH_MAX - 1:FIFODEPTH], + flmax_sub} ; + + assign blmax = {fzero_max[FIFODEPTH_MAX - 1:6], pbl} ; + + assign bsmax = (DATAWIDTH == 8) ? {fzero_max[FIFODEPTH_MAX - 1:12], + bcnt} : + (DATAWIDTH ==16) ? {fzero_max[FIFODEPTH_MAX - 1:11], + bcnt[11:1]} : + {fzero_max[FIFODEPTH_MAX - 1:10], + bcnt[11:2]} ; + + always @(posedge clk) + begin : fifolev_reg_proc + if (rst) + begin + fl_g_bs <= 1'b0 ; + fl_g_bl <= 1'b0 ; + bl_g_bs <= 1'b0 ; + pblz <= 1'b0 ; + end + else + begin + if (flmax >= bsmax) + begin + fl_g_bs <= 1'b1 ; + end + else + begin + fl_g_bs <= 1'b0 ; + end + + if (flmax >= blmax) + begin + fl_g_bl <= 1'b1 ; + end + else + begin + fl_g_bl <= 1'b0 ; + end + + if (blmax >= bsmax) + begin + bl_g_bs <= 1'b1 ; + end + else + begin + bl_g_bs <= 1'b0 ; + end + + if (pbl == 6'b000000) + begin + pblz <= 1'b1 ; + end + else + begin + pblz <= 1'b0 ; + end + end + end + + always @(csm or + lsm or + pblz or + tsprog or + fl_g_bs or + fl_g_bl or + bl_g_bs or + blmax or + bsmax or + flmax or + fzero_max or + buffetch or + dmacnt_r) + begin : dmacnt_proc + if (lsm == LSM_DES0 | + lsm == LSM_DES1 | + lsm == LSM_DES2 | + lsm == LSM_DES3 | + lsm == LSM_STAT | tsprog) + begin + case (DATAWIDTH) + 8 : + begin + dmacnt_c <= {fzero_max[FIFODEPTH_MAX - 1:3], 3'b100} ; + end + 16 : + begin + dmacnt_c <= {fzero_max[FIFODEPTH_MAX - 1:3], 3'b010} ; + end + default : + begin + dmacnt_c <= {fzero_max[FIFODEPTH_MAX - 1:3], 3'b001} ; + end + endcase + end + else if(!buffetch) + begin + if (pblz) + begin + if (fl_g_bs | csm == CSM_SET) + begin + dmacnt_c <= bsmax ; + end + else + begin + dmacnt_c <= flmax ; + end + end + else + begin + if (fl_g_bl | csm == CSM_SET) + begin + if (bl_g_bs) + begin + dmacnt_c <= bsmax ; + end + else + begin + dmacnt_c <= blmax ; + end + end + else + begin + if (fl_g_bs) + begin + dmacnt_c <= bsmax ; + end + else + begin + dmacnt_c <= flmax ; + end + end + end + end + else + begin + dmacnt_c <= dmacnt_r; + end + end + + always @(posedge clk) + begin : dmacnt_reg_proc + if (rst) + begin + dmacnt_r <= {FIFODEPTH_MAX{1'b0}}; + end + else + begin + dmacnt_r <= dmacnt_c; + end + end + + assign dmacnt = dmacnt_c; + + always @(posedge clk) + begin : lastdma_reg_proc + if (rst) + begin + lastdma <= 1'b1 ; + end + else + begin + if (lsm == LSM_DES0 | + lsm == LSM_DES1 | + lsm == LSM_DES2 | + lsm == LSM_DES3 | + lsm == LSM_STAT | tsprog) + begin + lastdma <= 1'b1 ; + end + else if (!buffetch) + begin + if (pblz) + begin + if (fl_g_bs | csm == CSM_SET) + begin + lastdma <= 1'b1 ; + end + else + begin + lastdma <= 1'b0 ; + end + end + else + begin + if (fl_g_bl | csm == CSM_SET) + begin + if (bl_g_bs) + begin + lastdma <= 1'b1 ; + end + else + begin + lastdma <= 1'b0 ; + end + end + else + begin + if (fl_g_bs) + begin + lastdma <= 1'b1 ; + end + else + begin + lastdma <= 1'b0 ; + end + end + end + end + end + end + + always @(tsprog or lsm or statadi or bad or dad or statad) + begin : dmaaddro_proc + if (tsprog) + begin + dmaaddro <= statadi ; + end + else + begin + case (lsm) + LSM_BUF1, LSM_BUF2 : + begin + dmaaddro <= bad ; + end + LSM_STAT : + begin + dmaaddro <= statad ; + end + default : + begin + dmaaddro <= dad ; + end + endcase + end + end + + always @(req or + dmaack or + dmaeob or + lsm or + tsprog or + fifoval or + req_r) + begin : req_proc + case (lsm) + LSM_BUF1, LSM_BUF2 : + begin + if (dmaack & dmaeob) + begin + req_c <= 1'b0 ; + end + else if ((fifoval & req_r == 3'b000) | tsprog) + begin + req_c <= 1'b1 ; + end + else + begin + req_c <= req ; + end + end + LSM_DES0, LSM_DES1, LSM_DES2, LSM_DES3, LSM_STAT : + begin + if (dmaack) + begin + req_c <= 1'b0 ; + end + else + begin + req_c <= 1'b1 ; + end + end + default : + begin + if (dmaack) + begin + req_c <= 1'b0 ; + end + else if (tsprog) + begin + req_c <= 1'b1 ; + end + else + begin + req_c <= 1'b0 ; + end + end + endcase + end + + always @(posedge clk) + begin : req_reg_proc + if (rst) + begin + req <= 1'b0 ; + req_r <= {3{1'b0 }}; + dmaack_r <= 1'b0 ; + end + else + begin + req <= req_c ; + req_r[0] <= req; + req_r[1] <= req_r[0]; + req_r[2] <= req_r[1]; + dmaack_r <= dmaack & dmaeob ; + end + end + + assign dmawr = (tsprog | lsm == LSM_STAT) ? 1'b1 : 1'b0 ; + + assign dmareq = req ; + + always @(posedge clk) + begin : stat_reg_proc + if (rst) + begin + des <= 1'b0 ; + fbuf <= 1'b0 ; + stat <= 1'b0 ; + tsprog <= 1'b0 ; + buffetch <= 1'b0 ; + tu <= 1'b0 ; + end + else + begin + if (lsm == LSM_DES0 | + lsm == LSM_DES1 | + lsm == LSM_DES2 | + lsm == LSM_DES3) + begin + des <= 1'b1 ; + end + else + begin + des <= 1'b0 ; + end + + if (lsm == LSM_BUF1 | lsm == LSM_BUF2) + begin + fbuf <= 1'b1 ; + end + else + begin + fbuf <= 1'b0 ; + end + + if (tsprog) + begin + stat <= 1'b1 ; + end + else + begin + stat <= 1'b0 ; + end + + if ((dmaeob & dmaack) | itcomp | tcompack_r) + begin + tsprog <= 1'b0 ; + end + else if (csne & !idmareq & !icachere) + begin + tsprog <= 1'b1 ; + end + + if (dmaack_r) + begin + buffetch <= 1'b0 ; + end + else if (req_r[0] & (lsm == LSM_BUF1 | lsm == LSM_BUF2)) + begin + buffetch <= 1'b1 ; + end + + if (lsm == LSM_IDLE & !own) + begin + tu <= 1'b1 ; + end + else if (own_c) + begin + tu <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : tcompack_reg_proc + if (rst) + begin + tcompack_r <= 1'b0 ; + itcomp <= 1'b0 ; + end + else + begin + tcompack_r <= tcompack ; + + if (tsprog & dmaeob & dmaack) + begin + itcomp <= 1'b1 ; + end + else if (tcompack_r) + begin + itcomp <= 1'b0 ; + end + end + end + + assign tcomp = itcomp ; + + always @(posedge clk) + begin : setp_reg_proc + if (rst) + begin + setp <= 1'b0 ; + end + else + begin + if (csm == CSM_SET) + begin + setp <= 1'b1 ; + end + else + begin + setp <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : ifaddr_reg_proc + if (rst) + begin + ifaddr <= {ADDRDEPTH{1'b0}} ; + end + else + begin + if (csm == CSM_IDLE) + begin + ifaddr <= {ADDRDEPTH{1'b0}} ; + end + else if (ifwe) + begin + ifaddr <= ifaddr + 1 ; + end + end + end + + always @(posedge clk) + begin : ifwe_reg_proc + if (rst) + begin + ifwe <= 1'b0 ; + end + else + begin + case (DATAWIDTH) + 8 : + begin + if (csm == CSM_SET & + dmaack & + dmaaddr[1:0] == 2'b11 & + lsm == LSM_BUF1) + begin + ifwe <= 1'b1 ; + end + else + begin + ifwe <= 1'b0 ; + end + end + 16 : + begin + if (csm == CSM_SET & + dmaack & + dmaaddr[1] & + lsm == LSM_BUF1) + begin + ifwe <= 1'b1 ; + end + else + begin + ifwe <= 1'b0 ; + end + end + default : + begin + if (csm == CSM_SET & dmaack & + lsm == LSM_BUF1) + begin + ifwe <= 1'b1 ; + end + else + begin + ifwe <= 1'b0 ; + end + end + endcase + end + end + + assign faddr = ifaddr ; + + assign fwe = ifwe ; + + assign fdata = dataimax_r[15:0] ; + + always @(posedge clk) + begin : stop_reg_proc + if (rst) + begin + stop_r <= 1'b1 ; + stopo <= 1'b1 ; + end + else + begin + stop_r <= stopi ; + + if (lsm == LSM_IDLE & stop_r) + begin + stopo <= 1'b1 ; + end + else + begin + stopo <= 1'b0 ; + end + end + end + + assign fzero_max = {FIFODEPTH_MAX{1'b0}} ; + + assign dzero_max = {DATAWIDTH_MAX{1'b0}} ; + + assign bufzero_max = {(DATAWIDTH_MAX * 2 - 9){1'b0}} ; + + assign dmaaddr20 = dmaaddr[2:0] ; + + assign dmadatai_max = {dzero_max[DATAWIDTH_MAX+1:DATAWIDTH], + dmadatai}; + + assign buf_r_max = {bufzero_max[DATAWIDTH_MAX * 2 - 7: + DATAWIDTH * 2 - 8], + buf_r}; + +endmodule diff --git a/resources/soc/rtl/MAC/utility.v b/resources/soc/rtl/MAC/utility.v new file mode 100644 index 0000000..aeef9aa --- /dev/null +++ b/resources/soc/rtl/MAC/utility.v @@ -0,0 +1,282 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + + //----------------------------------------------------------------- + // 802.3 parameters + //----------------------------------------------------------------- + // interframe space 1 interval = 60 bit times + parameter [3:0] IFS1_TIME = 4'b1110; + // interframe space 2 interval = 36 bit times + //parameter [3:0] IFS2_TIME = 4'b1000; + parameter [3:0] IFS2_TIME = 4'b0110; + // slot time interfal = 512 bit times + parameter [8:0] SLOT_TIME = 9'b001111111; + // maximum number of retransmission attempts = 16 + parameter [4:0] ATT_MAX = 5'b10000; + // proper crc remainder value = 0xc704dd7b + parameter [31:0] CRCVAL = 32'b11000111000001001101110101111011; + // minimum frame size = 64 + parameter [6:0] MIN_FRAME = 7'b1000000; + // maximum ethernet frame length field value = 1500 + parameter [15:0] MAX_SIZE = 16'b0000010111011100; + // maximum frame size + parameter [13:0] MAX_FRAME = 14'b00010111101111; // 1519 + + //_________________________________________________________________ + // Control and Status Register summary + //_________________________________________________________________ + // Register | ID | RV | Description + //_________________________________________________________________ + // CSR0 | 00h | fe000000h | Bus mode + // CSR1 | 08h | ffffffffh | Transmit pool demand + // CSR2 | 10h | ffffffffh | Teceive pool demand + // CSR3 | 18h | ffffffffh | Receive list base address + // CSR4 | 20h | ffffffffh | Rransmit list base address + // CSR5 | 28h | f0000000h | Status + // CSR6 | 30h | 32000040h | Operation mode + // CSR7 | 38h | f3fe0000h | Interrupt enable + // CSR8 | 40h | e0000000h | Missed frames and overflow cnt + // CSR9 | 48h | fff483ffh | MII management + // CSR11 | 58h | fffe0000h | Timer and interrupt mitigation + //_________________________________________________________________ + + //----------------------------------------------------------------- + // Special Function Register locations and reset values + //----------------------------------------------------------------- + // CSR0 : 00h : fe000000h : Bus mode + parameter [5:0] CSR0_ID = 6'b000000; + // CSR0 reset value + parameter [31:0] CSR0_RV = 32'b11111110000000000000000000000000; + + // CSR1 : 08h : ffffffffh : Transmit pool demand + parameter [5:0] CSR1_ID = 6'b000010; + // CSR1 reset value + parameter [31:0] CSR1_RV = 32'b11111111111111111111111111111111; + + // CSR2 : 10h : ffffffffh : Receive pool demand + parameter [5:0] CSR2_ID = 6'b000100; + // CSR2 reset value + parameter [31:0] CSR2_RV = 32'b11111111111111111111111111111111; + + // CSR3 : 18h : ffffffffh : Receive list base address + parameter [5:0] CSR3_ID = 6'b000110; + // CSR3 reset value + parameter [31:0] CSR3_RV = 32'b11111111111111111111111111111111; + + // CSR4 : 20h : ffffffffh : Transmit list base address + parameter [5:0] CSR4_ID = 6'b001000; + // CSR4 reset value + parameter [31:0] CSR4_RV = 32'b11111111111111111111111111111111; + + // CSR5 : 28h : f0000000h : Status + parameter [5:0] CSR5_ID = 6'b001010; + // CSR5 reset value + parameter [31:0] CSR5_RV = 32'b11110000000000000000000000000000; + + // CSR6 : 30h : 32000040h : Operation mode + parameter [5:0] CSR6_ID = 6'b001100; + // CSR6 reset value + parameter [31:0] CSR6_RV = 32'b00110010000000000000000001000000; + + // CSR7 : 38h : f3fe0000h : Interrupt enable + parameter [5:0] CSR7_ID = 6'b001110; + // CSR7 reset value + parameter [31:0] CSR7_RV = 32'b11110011111111100000000000000000; + + // CSR8 : 40h : e0000000h : Missed frames and overflow cnt + parameter [5:0] CSR8_ID = 6'b010000; + // CSR8 reset value + parameter [31:0] CSR8_RV = 32'b11100000000000000000000000000000; + + // CSR9 : 48h : fff483ffh : MII menagement + parameter [5:0] CSR9_ID = 6'b010010; + // CSR9 reset value + parameter [31:0] CSR9_RV = 32'b11111111111101001000001111111111; + + // CSR10 : 50h : 00000000h : Insert function enable + parameter [5:0] CSR10_ID = 6'b010100; + // CSR11 reset value + parameter [31:0] CSR10_RV = 32'b00000000000000000000000000000000; + + // CSR11 : 58h : fffe0000h : Timer and interrupt mitigation + parameter [5:0] CSR11_ID = 6'b010110; + // CSR11 reset value + parameter [31:0] CSR11_RV = 32'b11111111111111100000000000000000; + + // TDES0 + parameter [31:0] TDES0_RV = 32'b00000000000000000000000000000000; + + // SET0 + parameter [31:0] SET0_RV = 32'b00000000000000000000000000000000; + + // RDES0 + parameter [31:0] RDES0_RV = 32'b00000000000000000000000000000000; + + //----------------------------------------------------------------- + // Internal interface parameters + //----------------------------------------------------------------- + // CSR interface address width + parameter CSRDEPTH = 8; + // Filtering RAM address width + parameter ADDRDEPTH = 6; + // Filtering RAM data width + parameter ADDRWIDTH = 16; + // Maximum FIFO depth + parameter FIFODEPTH_MAX = 15; + // Maximum Data interface address width + parameter DATADEPTH_MAX = 32; + // Maximum Data interface width + parameter DATAWIDTH_MAX = 32; + // Maximum CSR interface width + parameter CSRWIDTH_MAX = 32; + // MII width + parameter MIIWIDTH = 4; + parameter MIIWIDTH_MAX = 8; + + + //----------------------------------------------------------------- + // Filtering modes + //----------------------------------------------------------------- + // Filtering mode - PREFECT -- + parameter [1:0] FT_PERFECT = 2'b00; + // Filtering mode - HASH -- + parameter [1:0] FT_HASH = 2'b01; + // Filtering mode - INVERSE -- + parameter [1:0] FT_INVERSE = 2'b10; + // Filtering mode - HONLY -- + parameter [1:0] FT_HONLY = 2'b11; + + //----------------------------------------------------------------- + // Phisical address position in setup frame + //----------------------------------------------------------------- + parameter [5:0] PERF1_ADDR = 6'b100111; + + //----------------------------------------------------------------- + // Ethernet frame fields + //----------------------------------------------------------------- + // jam field pattern + parameter [63:0] JAM_PATTERN = 64'b1010101010101010101010101010101010101010101010101010101010101010; + // preamble field pattern + parameter [63:0] PRE_PATTERN = 64'b0101010101010101010101010101010101010101010101010101010101010101; + // start of frame delimiter pattern + parameter [63:0] SFD_PATTERN = 64'b1101010111010101110101011101010111010101110101011101010111010101; + // padding field pattern + parameter [63:0] PAD_PATTERN = 64'b0000000000000000000000000000000000000000000000000000000000000000; + // carrier extension pattern + parameter [63:0] EXT_PATTERN = 64'b0000111100001111000011110000111100001111000011110000111100001111; + + //----------------------------------------------------------------- + // Enumeration types + //----------------------------------------------------------------- + + // DMA state machine + parameter [1:0] DSM_IDLE = 0; + parameter [1:0] DSM_CH1 = 1; + parameter [1:0] DSM_CH2 = 2; + + // process state machine type for HC + parameter [1:0] PSM_RUN = 0; + parameter [1:0] PSM_SUSPEND = 1; + parameter [1:0] PSM_STOP = 2; + + // receive state machine for HC + parameter [2:0] RSM_IDLE = 0; + parameter [2:0] RSM_ACQ1 = 1; // trying to acquire free descriptor + parameter [2:0] RSM_ACQ2 = 2; // trying to acquire free descriptor + parameter [2:0] RSM_REC = 3; // receiving frame + parameter [2:0] RSM_STORE = 4; // storing frame + parameter [2:0] RSM_STAT = 5; // status of the frame + + // linked list state machine for HC + parameter [3:0] LSM_IDLE = 0; + parameter [3:0] LSM_DES0P = 1; // des0 prefetching + parameter [3:0] LSM_DES0 = 2; // des0 fetching + parameter [3:0] LSM_DES1 = 3; // des1 fetching + parameter [3:0] LSM_DES2 = 4; // des2 fetching + parameter [3:0] LSM_DES3 = 5; // des3 fetching + parameter [3:0] LSM_BUF1 = 6; // buffer 1 fetching + parameter [3:0] LSM_BUF2 = 7; // buffer 2 fetching + parameter [3:0] LSM_STAT = 8; // descriptor status storing + parameter [3:0] LSM_FSTAT = 9; // frame status storing + parameter [3:0] LSM_NXT = 10; // next descriptor's address computing + + // descriptor's control state machine for HC + parameter [2:0] CSM_IDLE = 0; + parameter [2:0] CSM_F = 1; // first descriptor + parameter [2:0] CSM_I = 2; // intermediate descriptor + parameter [2:0] CSM_L = 3; // last descriptor + parameter [2:0] CSM_FL = 4; // first and last descriptor + parameter [2:0] CSM_SET = 5; // setup frame descriptor + parameter [2:0] CSM_BAD = 6; // invalid descriptor + + // master interface state machine for HC + parameter [1:0] MSM_IDLE = 0; + parameter [1:0] MSM_REQ = 1; + parameter [1:0] MSM_BURST = 2; + + // receive state machine for RC + parameter [3:0] RSM_IDLE_RCSMT = 0; + parameter [3:0] RSM_SFD = 1; + parameter [3:0] RSM_DEST = 2; + parameter [3:0] RSM_SOURCE = 3; + parameter [3:0] RSM_LENGTH = 4; + parameter [3:0] RSM_INFO = 5; + parameter [3:0] RSM_SUCC = 6; + parameter [3:0] RSM_INT = 7; + parameter [3:0] RSM_INT1 = 8; + parameter [3:0] RSM_BAD = 9; // flushing received frame from fifo + + // address filtering state machine + parameter [2:0] FSM_IDLE = 0; + parameter [2:0] FSM_PERF1 = 1; // checking single physical address + parameter [2:0] FSM_PERF16 = 2; // checking 16 addresses + parameter [2:0] FSM_HASH = 3; // hash fitering + parameter [2:0] FSM_MATCH = 4; // address match + parameter [2:0] FSM_FAIL = 5; // address failed + + // deffering state machine for TC + parameter [1:0] DSM_WAIT = 0; // end of IFS, waiting for pending frame + parameter [1:0] DSM_IFS1 = 1; // calculating interframe space time 1 + parameter [1:0] DSM_IFS2 = 2; // calculating interframe space time 2 + + // transmit state machine for TC + parameter [3:0] TSM_IDLE_TCSMT = 0; + parameter [3:0] TSM_PREA = 1; + parameter [3:0] TSM_SFD = 2; + parameter [3:0] TSM_INFO = 3; + parameter [3:0] TSM_PAD = 4; + parameter [3:0] TSM_CRC = 5; + parameter [3:0] TSM_BURST = 6; + parameter [3:0] TSM_JAM = 7; + parameter [3:0] TSM_FLUSH = 8; + parameter [3:0] TSM_INT = 9; diff --git a/resources/soc/rtl/SPI/godson_sbridge_spi.v b/resources/soc/rtl/SPI/godson_sbridge_spi.v new file mode 100644 index 0000000..1928447 --- /dev/null +++ b/resources/soc/rtl/SPI/godson_sbridge_spi.v @@ -0,0 +1,896 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module spi_flash_ctrl( + input aclk, + input aresetn, + input [15:0] spi_addr, + input power_down_req, + output power_down_ack, + input fast_startup, + + input [3:0] s_awlen, + input [3:0] s_awcache, + input [3:0] s_awid, + input [31:0] s_awaddr, + input [2:0] s_awsize, + input [2:0] s_awprot, + input [1:0] s_awburst, + input [1:0] s_awlock, + input s_awvalid, + output s_awready, + + input [3:0] s_wid, + input [31:0] s_wdata, + input [3:0] s_wstrb, + input s_wlast, + input s_wvalid, + output s_wready, + + output [3:0] s_bid, + output [1:0] s_bresp, + output s_bvalid, + input s_bready, + + input [3:0] s_arlen, + input [3:0] s_arcache, + input [3:0] s_arid, + input [31:0] s_araddr, + input [2:0] s_arsize, + input [2:0] s_arprot, + input [1:0] s_arburst, + input [1:0] s_arlock, + input s_arvalid, + output s_arready, + + output [3:0] s_rid, + output [31:0] s_rdata, + output [1:0] s_rresp, + output s_rlast, + output s_rvalid, + input s_rready, + + output [3:0] csn_o, + output [3:0] csn_en, + output sck_o, + input sdo_i, + output sdo_o, + output sdo_en, + input sdi_i, + output sdi_o, + output sdi_en, + output inta_o +); + + wire areset = ~aresetn; + + wire param_memory_en; + wire param_burst_en; + wire param_fast_read; + wire param_dual_io; + wire [1:0] param_tCSH; + wire param_tFAST; + + reg [9:0] rd_state; + reg [9:0] rd_state_nxt; + + parameter S_IDLE = 10'b0000000001; + parameter S_IOREAD = 10'b0000000010; + parameter S_CSTURN = 10'b0000000100; + parameter S_ADDR = 10'b0000001000; + parameter S_DATA = 10'b0000010000; + parameter S_WAITBUS= 10'b0000100000; + parameter S_PDENTER= 10'b0001000000; + parameter S_PDEXIT = 10'b0010000000; + parameter S_STARTUP= 10'b0100000000; + parameter S_PWRDOWN= 10'b1000000000; + + wire s_idle = rd_state[0]; + wire s_ioread = rd_state[1]; + wire s_csturn = rd_state[2]; + wire s_addr = rd_state[3]; + wire s_data = rd_state[4]; + wire s_waitbus= rd_state[5]; + wire s_pdenter= rd_state[6]; + wire s_pdexit = rd_state[7]; + wire s_startup= rd_state[8]; + wire s_pwrdown= rd_state[9]; + + wire ns_idle = rd_state_nxt[0]; + wire ns_ioread = rd_state_nxt[1]; + wire ns_csturn = rd_state_nxt[2]; + wire ns_addr = rd_state_nxt[3]; + wire ns_data = rd_state_nxt[4]; + wire ns_waitbus= rd_state_nxt[5]; + wire ns_pdenter= rd_state_nxt[6]; + wire ns_pdexit = rd_state_nxt[7]; + wire ns_startup= rd_state_nxt[8]; + wire ns_pwrdown= rd_state_nxt[9]; + + reg pdreq_r; + + reg [15:0] cs_timer; + reg cs; + reg [23:0] nxt_addr; + + wire write_valid; + wire reg_acc = s_ioread | write_valid; + wire reg_ack; + wire [7:0] reg_dat_i, reg_dat_o; + wire [7:0] param_o; + + reg [31:0] shift_reg; + reg [ 1:0] sample; + wire [31:0] shift_reg_nxt; + wire sr_shift_inst; + wire sr_shift_one; + wire sr_shift_two; + reg sr_shift_inst_r; + reg sr_shift_two_r; + wire sample_en; + wire shift_en; + wire dual_out; + wire dual_in; + wire [1:0] serial_out; + wire cyc_end; + + + reg [2:0] bit_cnt; + wire spi_pause; + wire spibus_busy; + + reg [5:0] adbit_cnt; + reg spi_run; + reg sck; + + reg buf_busy; + reg [31:0] buf_addr; + reg [ 3:0] buf_len; + reg [ 2:0] buf_size; + reg [ 3:0] buf_id; + reg buf_write; + reg buf_wrap; + + assign s_arready = s_idle & ~pdreq_r & ~buf_busy & ~s_awvalid; + assign s_awready = s_idle & ~pdreq_r & ~buf_busy; + + reg buf_busy_d; + wire new_axireq = ~buf_busy_d & buf_busy; + wire io_hit =(buf_addr[31:4] == {spi_addr, 12'b0}) & + (buf_len == 4'b0); + + wire [63:0] buf_addr_t = (buf_addr[31:20]==12'h1fc)? + {12'h0, buf_addr[19:0]}: + { 8'h0, buf_addr[23:0]}; + + wire burst_cont = param_burst_en & cs & + (buf_addr_t[23:0] == nxt_addr[23:0]); + + wire burst_switch = param_burst_en & cs & + (buf_addr_t[23:0] != nxt_addr[23:0]); + + reg [7:0] tot_bytes; + wire byte_ready; + + always @(posedge aclk) begin + if (areset) begin + buf_busy <= 1'b0; + buf_write <= 1'b0; + tot_bytes <= 8'b0; + end else begin + if ((s_arvalid|s_awvalid)&~buf_busy&s_idle&~pdreq_r) begin + buf_busy <= 1'b1; + buf_addr <= s_awvalid ? s_awaddr : s_araddr; + buf_size <= s_awvalid ? s_awsize : s_arsize; + buf_len <= s_awvalid ? s_awlen : s_arlen; + buf_id <= s_awvalid ? s_awid : s_arid; + buf_write<= s_awvalid; + buf_wrap <= s_arvalid & (s_arburst==2'b10) & + (|s_araddr[4:2]) & (|s_arlen); + tot_bytes<= {8{s_arvalid&~s_awvalid}}& + (({4'b0,s_arlen} << s_arsize)| + ((8'b1<=6'd8) | s_data) & param_dual_io; + always @(posedge aclk) begin + sr_shift_inst_r <= areset ? 1'b0 : + cyc_end|(~s_addr&ns_addr) ? ns_addr & (adbit_cnt < 6'd7) : + sr_shift_inst_r; + sr_shift_two_r <= areset ? 1'b0 : + cyc_end|(~s_data&ns_data) ? (s_addr & (adbit_cnt >=6'd7) | ns_data) & param_dual_io : + sr_shift_two_r; + end + + assign sr_shift_one = 1'bz; + wire addr_done; + assign addr_done = param_dual_io ? adbit_cnt == 6'd23 : + param_fast_read ? adbit_cnt == 6'd39 : + adbit_cnt == 6'd31 ; + assign dual_out = param_dual_io & + (adbit_cnt >= 6'd8 && adbit_cnt < 6'd22); + reg dual_in_r; + assign dual_in = param_dual_io & + (adbit_cnt >= 6'd22 | s_data | dual_in_r); + always @(posedge aclk) begin + dual_in_r <= areset ? 1'b0 : + s_csturn&cswcnt[0]? 1'b0 : + ~cs ? 1'b0 : + dual_in ? 1'b1 : dual_in_r; + end + + + always @(posedge aclk) begin + pdreq_r <= power_down_req; + end + wire go_power_down = pdreq_r & ~buf_busy; + assign power_down_ack = s_pwrdown | s_pdexit | s_startup; + + always @(posedge aclk) begin + rd_state <= areset ? S_PWRDOWN : rd_state_nxt; + end + + always @(*) begin + rd_state_nxt = rd_state; + case (rd_state) // synopsys parallel_case + S_IDLE :if (new_axireq & ~buf_write) begin + rd_state_nxt = io_hit ? S_IOREAD: + spibus_busy ? S_WAITBUS: + burst_cont ? S_DATA : + S_CSTURN; + end else if (go_power_down) begin + rd_state_nxt = cs ? S_CSTURN : + S_PDENTER; + end + S_IOREAD: rd_state_nxt = S_IDLE; + S_CSTURN: rd_state_nxt = clkena & (&cswcnt_w)? (go_power_down? S_PDENTER:S_ADDR): + S_CSTURN; + S_ADDR : rd_state_nxt = clkena & sck & + addr_done ? S_DATA : S_ADDR; + S_DATA : rd_state_nxt = byte_ready & ~spi_pause & ~|tot_bytes ? S_IDLE: + byte_ready & ~spi_pause & buf_wrap + & (&nxt_addr[4:0])? S_CSTURN: + byte_ready & ~spi_pause & ~param_burst_en ? S_CSTURN: + S_DATA; + S_WAITBUS:rd_state_nxt = spibus_busy ? S_WAITBUS : S_ADDR; + + S_PWRDOWN:rd_state_nxt = go_power_down ? S_PWRDOWN : S_PDEXIT; + S_PDEXIT :rd_state_nxt = cyc_end & (&bit_cnt[2:0]) ? S_STARTUP : S_PDEXIT; + S_PDENTER:rd_state_nxt = cyc_end & (&bit_cnt[2:0]) ? S_PWRDOWN : S_PDENTER; + S_STARTUP:rd_state_nxt = &(cs_timer[10:0]|{{5{fast_startup}}, 6'b0}) ? S_IDLE : + S_STARTUP; + endcase + end + + + wire ss_sck, ss_mosi, ss_miso; + wire [7:0] param, softcs, param2; + wire sspi_write = buf_write | second_write; + + simple_spi_top simple_spi( + .clk_i (aclk ), + .rst_i (aresetn ), + .cyc_i (buf_busy ), + .stb_i (reg_acc ), + .adr_i (buf_addr[3:0] ), + .we_i (sspi_write ), + .dat_i (reg_dat_i ), + .dat_o (reg_dat_o ), + .ack_o (reg_ack ), + .inta_o (inta_o ), + + .sck_o (ss_sck ), + .mosi_o (ss_mosi ), + .miso_i (ss_miso ), + + .param (param ), + .param2 (param2 ), + .softcs (softcs ), + .busy (spibus_busy ) + ); + assign ss_miso = sdi_i; + + assign reg_dat_i = second_write ? s_wdata[ 31: 24] : + buf_addr[1:0]==2'h0 ? s_wdata[ 7: 0] : + buf_addr[1:0]==2'h1 ? s_wdata[ 15: 8] : + buf_addr[1:0]==2'h2 ? s_wdata[ 23: 16] : + s_wdata[ 31: 24] ; + + assign param_memory_en = param[0]; + assign param_burst_en = param[1]; + assign param_fast_read = param[2]; + assign param_dual_io = param[3]; + assign espr = param[7:4]; + + assign param_tCSH = param2[1:0]; + assign param_tFAST = param2[2]; + assign param_scs = param2[3]; + + assign csn_en[0] = param_memory_en? 1'b0: ~softcs[0]; + assign csn_o [0] = param_memory_en? ~cs : softcs[4]; + + assign csn_en[3:1] =~softcs[3:1]; + assign csn_o [3:1] = softcs[7:5]|{3{cs|(~spibus_busy & param_scs)}}; + + assign sdi_en = ~spibus_busy¶m_memory_en? ~dual_out : 1'b1; + assign sdi_o = ~spibus_busy¶m_memory_en? serial_out[1] : 1'b0; + + assign sdo_en = ~spibus_busy¶m_memory_en? dual_in : 1'b0; + assign sdo_o = ~spibus_busy¶m_memory_en? serial_out[0] | s_data + : ss_mosi; + + assign sck_o = ~spibus_busy¶m_memory_en? sck : ss_sck; + +endmodule + + +module simple_spi_top( + input wire clk_i, + input wire rst_i, + input wire cyc_i, + input wire stb_i, + input wire [3:0] adr_i, + input wire we_i, + input wire [7:0] dat_i, + output reg [7:0] dat_o, + output reg ack_o, + output reg inta_o, + + output reg sck_o, + output wire mosi_o, + input wire miso_i, + + output reg [7:0] param, + output reg [7:0] param2, + output reg [7:0] softcs, + output reg busy +); + + reg [7:0] spcr; + wire [7:0] spsr; + reg [7:0] sper; + reg [7:0] treg, rreg; + + wire [7:0] rfdout; + reg wfre, rfwe; + wire rfre, rffull, rfempty; + wire [7:0] wfdout; + wire wfwe, wffull, wfempty; + + wire tirq; + wire wfov; + reg [1:0] state; + reg [2:0] bcnt; + + wire wb_acc = cyc_i & stb_i; + wire wb_wr = wb_acc & we_i; + + always @(posedge clk_i) + if (~rst_i) + begin + spcr <= 8'h12; + sper <= 8'h00; + `ifdef FAST_SIMU + param<= 8'h1; + param2<=8'h07; + `else + param<= 8'h1; + param2<=8'h03; + `endif + softcs<=8'hf0; + end + else if (wb_wr) + begin + if (adr_i == 4'b00) + spcr <= dat_i | 8'h10; + + if (adr_i == 4'b11) + sper <= dat_i; + + if (adr_i == 4'b0100) + param <= dat_i; + if (adr_i == 4'b0101) + softcs<= dat_i; + if (adr_i == 4'b0110) + param2 <= dat_i; + end + + assign wfwe = wb_acc & (adr_i == 4'b10) & ack_o & we_i; + assign wfov = wfwe & wffull; + + always @(*) + case(adr_i) // synopsys full_case parallel_case + 4'b0000: dat_o = spcr; + 4'b0001: dat_o = spsr; + 4'b0010: dat_o = rfdout; + 4'b0011: dat_o = sper; + 4'b0100: dat_o = param; + 4'b0101: dat_o = softcs; + 4'b0110: dat_o = param2; + default dat_o = 8'h0; + endcase + + assign rfre = wb_acc & (adr_i == 2'b10) & ack_o & ~we_i; + + always @(posedge clk_i) + ack_o <= 1'b1; + + wire spie = spcr[7]; + wire spe = spcr[6]; + wire dwom = spcr[5]; + wire mstr = spcr[4]; + wire cpol = spcr[3]; + wire cpha = spcr[2]; + wire [1:0] spr = spcr[1:0]; + + wire [1:0] icnt = sper[7:6]; + wire [1:0] spre = sper[1:0]; + wire smh_spi= sper[2]; + + wire [3:0] espr = {spre, spr}; + + wire wr_spsr = wb_wr & (adr_i == 2'b01); + + reg spif; + always @(posedge clk_i) + if (~spe) + spif <= 1'b0; + else + spif <= (tirq | spif) & ~(wr_spsr & dat_i[7]); + + reg wcol; + always @(posedge clk_i) + if (~spe) + wcol <= 1'b0; + else + wcol <= (wfov | wcol) & ~(wr_spsr & dat_i[6]); + + assign spsr[7] = spif; + assign spsr[6] = wcol; + assign spsr[5:4] = 2'b00; + assign spsr[3] = wffull; + assign spsr[2] = wfempty; + assign spsr[1] = rffull; + assign spsr[0] = rfempty; + + + always @(posedge clk_i) + inta_o <= spif & spie; + + spi_fifo4 #(8) + rfifo( + .clk ( clk_i ), + .rst ( rst_i ), + .clr ( ~spe ), + .din ( treg ), + .we ( rfwe ), + .dout ( rfdout ), + .re ( rfre ), + .full ( rffull ), + .empty ( rfempty ) + ), + wfifo( + .clk ( clk_i ), + .rst ( rst_i ), + .clr ( ~spe ), + .din ( dat_i ), + .we ( wfwe ), + .dout ( wfdout ), + .re ( wfre ), + .full ( wffull ), + .empty ( wfempty ) + ); + + reg [11:0] clkcnt; + always @(posedge clk_i) + if(spe & (|clkcnt & |state)) + clkcnt <= clkcnt - 11'h1; + else + case (espr) // synopsys full_case parallel_case + 4'b0000: clkcnt <= 12'h0; + 4'b0001: clkcnt <= 12'h1; + 4'b0010: clkcnt <= 12'h7; + 4'b0011: clkcnt <= 12'hf; + 4'b0100: clkcnt <= 12'h3; + 4'b0101: clkcnt <= 12'h1f; + 4'b0110: clkcnt <= 12'h3f; + 4'b0111: clkcnt <= 12'h7f; + 4'b1000: clkcnt <= 12'hff; + 4'b1001: clkcnt <= 12'h1ff; + 4'b1010: clkcnt <= 12'h3ff; + 4'b1011: clkcnt <= 12'h7ff; + default:; + endcase + + wire ena = ~|clkcnt; + reg sample; + always @(posedge clk_i) + if (~spe) + begin + state <= 2'b00; + bcnt <= 3'h0; + treg <= 8'h00; + wfre <= 1'b0; + rfwe <= 1'b0; + sck_o <= 1'b0; + end + else if (smh_spi) + begin + wfre <= 1'b0; + rfwe <= 1'b0; + + case (state) //synopsys full_case parallel_case + 2'b00: + begin + bcnt <= 3'h7; + treg <= wfdout; + sck_o <= cpol; + + if (~wfempty) begin + wfre <= 1'b1; + state <= 2'b01; + end + end + + 2'b01: + if (ena) begin + sck_o <= ~sck_o; + state <= 2'b10; + if (cpha==0) sample <= miso_i; + end + + 2'b10: + if (ena) begin + sck_o <= ~sck_o; + state <= 2'b11; + if (cpha==0) begin + treg <= {treg[6:0], sample}; + end else begin + sample <= miso_i; + end + end + + 2'b11: + if (ena) begin + bcnt <= bcnt -3'h1; + if (cpha==0) begin + sample <= miso_i; + end else begin + treg <= {treg[6:0], sample}; + end + + if (~|bcnt) begin + state <= 2'b00; + sck_o <= cpol; + rfwe <= 1'b1; + end else begin + state <= 2'b10; + sck_o <= ~sck_o; + end + + end + + endcase + end + else + begin + wfre <= 1'b0; + rfwe <= 1'b0; + + case (state) //synopsys full_case parallel_case + 2'b00: + begin + bcnt <= 3'h7; + treg <= wfdout; + sck_o <= cpol; + + if (~wfempty) begin + wfre <= 1'b1; + state <= 2'b01; + if (cpha) sck_o <= ~sck_o; + end + end + + 2'b01: + if (ena) begin + sck_o <= ~sck_o; + state <= 2'b11; + end + + 2'b11: + if (ena) begin + treg <= {treg[6:0], miso_i}; + bcnt <= bcnt -3'h1; + + if (~|bcnt) begin + state <= 2'b00; + sck_o <= cpol; + rfwe <= 1'b1; + end + else begin + state <= 2'b01; + sck_o <= ~sck_o; + end + end + + 2'b10: state <= 2'b00; + default: state <=2'b00; + endcase + end + + assign mosi_o = treg[7]; + + reg [1:0] tcnt; + always @(posedge clk_i) + if (~spe) + tcnt <= icnt; + else if (rfwe) begin + if (|tcnt) + tcnt <= tcnt - 2'h1; + else + tcnt <= icnt; + end + + assign tirq = ~|tcnt & rfwe; + + always @(posedge clk_i) + busy <= ~wfempty | (|state); +endmodule + +module spi_fifo4(clk, rst, clr, din, we, dout, re, full, empty); + +parameter dw = 8; + +input clk, rst; +input clr; +input [dw:1] din; +input we; +output [dw:1] dout; +input re; +output full, empty; + +reg [dw:1] mem[0:3]; +reg [1:0] wp; +reg [1:0] rp; +wire [1:0] wp_p1; +wire [1:0] wp_p2; +wire [1:0] rp_p1; +wire full, empty; +reg gb; + +always @(posedge clk) + if(!rst) wp <= 2'h0; + else + if(clr) wp <= 2'h0; + else + if(we) wp <= wp_p1; + +assign wp_p1 = wp + 2'h1; +assign wp_p2 = wp + 2'h2; + +always @(posedge clk) + if(!rst) rp <= 2'h0; + else + if(clr) rp <= 2'h0; + else + if(re) rp <= rp_p1; + +assign rp_p1 = rp + 2'h1; + +assign dout = mem[ rp ]; + +always @(posedge clk) + if(we) mem[ wp ] <= din; + +assign empty = (wp == rp) & !gb; +assign full = (wp == rp) & gb; + +always @(posedge clk) + if(!rst) gb <= 1'b0; + else + if(clr) gb <= 1'b0; + else + if((wp_p1 == rp) & we) gb <= 1'b1; + else + if(re) gb <= 1'b0; + +endmodule diff --git a/resources/soc/rtl/TOP/config.h b/resources/soc/rtl/TOP/config.h new file mode 100644 index 0000000..b52301e --- /dev/null +++ b/resources/soc/rtl/TOP/config.h @@ -0,0 +1,98 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +`define Lconfbus 10 +`define Lconfret 9 +`define Lconfbusreg 64 +`define Lconfbusaddr 16 + +`define ORDER_REG_ADDR 16'h1160 + +`define Lawcmd 4 +`define Lawdirqid 4 +`define Lawstate 2 +`define Lawscseti 2 +`define Lawid 4 +`define Lawaddr 32 +`define Lawlen 4 +`define Lawsize 3 +`define Lawburst 2 +`define Lawlock 2 +`define Lawcache 4 +`define Lawprot 3 +`define Lawvalid 1 +`define Lawready 1 +`define Lwid 4 +`define Lwdata 32 +`define Lwstrb 4 +`define Lwlast 1 +`define Lwvalid 1 +`define Lwready 1 +`define Lbid 4 +`define Lbresp 2 +`define Lbvalid 1 +`define Lbready 1 +`define Larcmd 4 +`define Larcpuno 10 +`define Larid 4 +`define Laraddr 32 +`define Larlen 4 +`define Larsize 3 +`define Larburst 2 +`define Larlock 2 +`define Larcache 4 +`define Larprot 3 +`define Larvalid 1 +`define Larready 1 +`define Lrstate 2 +`define Lrscseti 2 +`define Lrid 4 +`define Lrdata 32 +`define Lrresp 2 +`define Lrlast 1 +`define Lrvalid 1 +`define Lrready 1 +`define Lrrequest 1 +/*************************/ +`define LID 4 +`define LADDR 32 +`define LLEN 4 +`define LSIZE 3 +`define LDATA 32 +`define LSTRB 4 +`define LBURST 2 +`define LLOCK 2 +`define LCACHE 4 +`define LPROT 3 +`define LRESP 2 +/************************************/ diff --git a/resources/soc/rtl/TOP/soc_up_top.v b/resources/soc/rtl/TOP/soc_up_top.v new file mode 100644 index 0000000..53156dc --- /dev/null +++ b/resources/soc/rtl/TOP/soc_up_top.v @@ -0,0 +1,1504 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +`include "config.h" + +module soc_up_top( + input resetn, + input clk, + + //------gpio---------------- + output [15:0] led, + output [1 :0] led_rg0, + output [1 :0] led_rg1, + output [7 :0] num_csn, + output [6 :0] num_a_g, + input [7 :0] switch, + output [3 :0] btn_key_col, + input [3 :0] btn_key_row, + input [1 :0] btn_step, + + //------DDR3 interface------ + inout [15:0] ddr3_dq, + output [12:0] ddr3_addr, + output [2 :0] ddr3_ba, + output ddr3_ras_n, + output ddr3_cas_n, + output ddr3_we_n, + output ddr3_odt, + output ddr3_reset_n, + output ddr3_cke, + output [1:0] ddr3_dm, + inout [1:0] ddr3_dqs_p, + inout [1:0] ddr3_dqs_n, + output ddr3_ck_p, + output ddr3_ck_n, + + //------mac controller------- + //TX + input mtxclk_0, + output mtxen_0, + output [3:0] mtxd_0, + output mtxerr_0, + //RX + input mrxclk_0, + input mrxdv_0, + input [3:0] mrxd_0, + input mrxerr_0, + input mcoll_0, + input mcrs_0, + // MIIM + output mdc_0, + inout mdio_0, + + output phy_rstn, + + //------EJTAG------- + input EJTAG_TRST, + input EJTAG_TCK, + input EJTAG_TDI, + input EJTAG_TMS, + output EJTAG_TDO, + + //------uart------- + inout UART_RX, + inout UART_TX, + + //------nand------- + output NAND_CLE , + output NAND_ALE , + input NAND_RDY , + inout [7:0] NAND_DATA, + output NAND_RD , + output NAND_CE , //low active + output NAND_WR , + + //------spi flash------- + output SPI_CLK, + output SPI_CS, + inout SPI_MISO, + inout SPI_MOSI +); +wire aclk; +wire aresetn; + +wire [`LID -1 :0] m0_awid; +wire [`Lawaddr -1 :0] m0_awaddr; +wire [`Lawlen -1 :0] m0_awlen; +wire [`Lawsize -1 :0] m0_awsize; +wire [`Lawburst -1 :0] m0_awburst; +wire [`Lawlock -1 :0] m0_awlock; +wire [`Lawcache -1 :0] m0_awcache; +wire [`Lawprot -1 :0] m0_awprot; +wire m0_awvalid; +wire m0_awready; +wire [`LID -1 :0] m0_wid; +wire [`Lwdata -1 :0] m0_wdata; +wire [`Lwstrb -1 :0] m0_wstrb; +wire m0_wlast; +wire m0_wvalid; +wire m0_wready; +wire [`LID -1 :0] m0_bid; +wire [`Lbresp -1 :0] m0_bresp; +wire m0_bvalid; +wire m0_bready; +wire [`LID -1 :0] m0_arid; +wire [`Laraddr -1 :0] m0_araddr; +wire [`Larlen -1 :0] m0_arlen; +wire [`Larsize -1 :0] m0_arsize; +wire [`Larburst -1 :0] m0_arburst; +wire [`Larlock -1 :0] m0_arlock; +wire [`Larcache -1 :0] m0_arcache; +wire [`Larprot -1 :0] m0_arprot; +wire m0_arvalid; +wire m0_arready; +wire [`LID -1 :0] m0_rid; +wire [`Lrdata -1 :0] m0_rdata; +wire [`Lrresp -1 :0] m0_rresp; +wire m0_rlast; +wire m0_rvalid; +wire m0_rready; + +wire [`LID -1 :0] spi_s_awid; +wire [`Lawaddr -1 :0] spi_s_awaddr; +wire [`Lawlen -1 :0] spi_s_awlen; +wire [`Lawsize -1 :0] spi_s_awsize; +wire [`Lawburst -1 :0] spi_s_awburst; +wire [`Lawlock -1 :0] spi_s_awlock; +wire [`Lawcache -1 :0] spi_s_awcache; +wire [`Lawprot -1 :0] spi_s_awprot; +wire spi_s_awvalid; +wire spi_s_awready; +wire [`LID -1 :0] spi_s_wid; +wire [`Lwdata -1 :0] spi_s_wdata; +wire [`Lwstrb -1 :0] spi_s_wstrb; +wire spi_s_wlast; +wire spi_s_wvalid; +wire spi_s_wready; +wire [`LID -1 :0] spi_s_bid; +wire [`Lbresp -1 :0] spi_s_bresp; +wire spi_s_bvalid; +wire spi_s_bready; +wire [`LID -1 :0] spi_s_arid; +wire [`Laraddr -1 :0] spi_s_araddr; +wire [`Larlen -1 :0] spi_s_arlen; +wire [`Larsize -1 :0] spi_s_arsize; +wire [`Larburst -1 :0] spi_s_arburst; +wire [`Larlock -1 :0] spi_s_arlock; +wire [`Larcache -1 :0] spi_s_arcache; +wire [`Larprot -1 :0] spi_s_arprot; +wire spi_s_arvalid; +wire spi_s_arready; +wire [`LID -1 :0] spi_s_rid; +wire [`Lrdata -1 :0] spi_s_rdata; +wire [`Lrresp -1 :0] spi_s_rresp; +wire spi_s_rlast; +wire spi_s_rvalid; +wire spi_s_rready; + +wire [`LID -1 :0] conf_s_awid; +wire [`Lawaddr -1 :0] conf_s_awaddr; +wire [`Lawlen -1 :0] conf_s_awlen; +wire [`Lawsize -1 :0] conf_s_awsize; +wire [`Lawburst -1 :0] conf_s_awburst; +wire [`Lawlock -1 :0] conf_s_awlock; +wire [`Lawcache -1 :0] conf_s_awcache; +wire [`Lawprot -1 :0] conf_s_awprot; +wire conf_s_awvalid; +wire conf_s_awready; +wire [`LID -1 :0] conf_s_wid; +wire [`Lwdata -1 :0] conf_s_wdata; +wire [`Lwstrb -1 :0] conf_s_wstrb; +wire conf_s_wlast; +wire conf_s_wvalid; +wire conf_s_wready; +wire [`LID -1 :0] conf_s_bid; +wire [`Lbresp -1 :0] conf_s_bresp; +wire conf_s_bvalid; +wire conf_s_bready; +wire [`LID -1 :0] conf_s_arid; +wire [`Laraddr -1 :0] conf_s_araddr; +wire [`Larlen -1 :0] conf_s_arlen; +wire [`Larsize -1 :0] conf_s_arsize; +wire [`Larburst -1 :0] conf_s_arburst; +wire [`Larlock -1 :0] conf_s_arlock; +wire [`Larcache -1 :0] conf_s_arcache; +wire [`Larprot -1 :0] conf_s_arprot; +wire conf_s_arvalid; +wire conf_s_arready; +wire [`LID -1 :0] conf_s_rid; +wire [`Lrdata -1 :0] conf_s_rdata; +wire [`Lrresp -1 :0] conf_s_rresp; +wire conf_s_rlast; +wire conf_s_rvalid; +wire conf_s_rready; + +wire [`LID -1 :0] mac_s_awid; +wire [`Lawaddr -1 :0] mac_s_awaddr; +wire [`Lawlen -1 :0] mac_s_awlen; +wire [`Lawsize -1 :0] mac_s_awsize; +wire [`Lawburst -1 :0] mac_s_awburst; +wire [`Lawlock -1 :0] mac_s_awlock; +wire [`Lawcache -1 :0] mac_s_awcache; +wire [`Lawprot -1 :0] mac_s_awprot; +wire mac_s_awvalid; +wire mac_s_awready; +wire [`LID -1 :0] mac_s_wid; +wire [`Lwdata -1 :0] mac_s_wdata; +wire [`Lwstrb -1 :0] mac_s_wstrb; +wire mac_s_wlast; +wire mac_s_wvalid; +wire mac_s_wready; +wire [`LID -1 :0] mac_s_bid; +wire [`Lbresp -1 :0] mac_s_bresp; +wire mac_s_bvalid; +wire mac_s_bready; +wire [`LID -1 :0] mac_s_arid; +wire [`Laraddr -1 :0] mac_s_araddr; +wire [`Larlen -1 :0] mac_s_arlen; +wire [`Larsize -1 :0] mac_s_arsize; +wire [`Larburst -1 :0] mac_s_arburst; +wire [`Larlock -1 :0] mac_s_arlock; +wire [`Larcache -1 :0] mac_s_arcache; +wire [`Larprot -1 :0] mac_s_arprot; +wire mac_s_arvalid; +wire mac_s_arready; +wire [`LID -1 :0] mac_s_rid; +wire [`Lrdata -1 :0] mac_s_rdata; +wire [`Lrresp -1 :0] mac_s_rresp; +wire mac_s_rlast; +wire mac_s_rvalid; +wire mac_s_rready; + +wire [`LID -1 :0] mac_m_awid; +wire [`Lawaddr -1 :0] mac_m_awaddr; +wire [`Lawlen -1 :0] mac_m_awlen; +wire [`Lawsize -1 :0] mac_m_awsize; +wire [`Lawburst -1 :0] mac_m_awburst; +wire [`Lawlock -1 :0] mac_m_awlock; +wire [`Lawcache -1 :0] mac_m_awcache; +wire [`Lawprot -1 :0] mac_m_awprot; +wire mac_m_awvalid; +wire mac_m_awready; +wire [`LID -1 :0] mac_m_wid; +wire [`Lwdata -1 :0] mac_m_wdata; +wire [`Lwstrb -1 :0] mac_m_wstrb; +wire mac_m_wlast; +wire mac_m_wvalid; +wire mac_m_wready; +wire [`LID -1 :0] mac_m_bid; +wire [`Lbresp -1 :0] mac_m_bresp; +wire mac_m_bvalid; +wire mac_m_bready; +wire [`LID -1 :0] mac_m_arid; +wire [`Laraddr -1 :0] mac_m_araddr; +wire [`Larlen -1 :0] mac_m_arlen; +wire [`Larsize -1 :0] mac_m_arsize; +wire [`Larburst -1 :0] mac_m_arburst; +wire [`Larlock -1 :0] mac_m_arlock; +wire [`Larcache -1 :0] mac_m_arcache; +wire [`Larprot -1 :0] mac_m_arprot; +wire mac_m_arvalid; +wire mac_m_arready; +wire [`LID -1 :0] mac_m_rid; +wire [`Lrdata -1 :0] mac_m_rdata; +wire [`Lrresp -1 :0] mac_m_rresp; +wire mac_m_rlast; +wire mac_m_rvalid; +wire mac_m_rready; + +wire [`LID -1 :0] s0_awid; +wire [`Lawaddr -1 :0] s0_awaddr; +wire [`Lawlen -1 :0] s0_awlen; +wire [`Lawsize -1 :0] s0_awsize; +wire [`Lawburst -1 :0] s0_awburst; +wire [`Lawlock -1 :0] s0_awlock; +wire [`Lawcache -1 :0] s0_awcache; +wire [`Lawprot -1 :0] s0_awprot; +wire s0_awvalid; +wire s0_awready; +wire [`LID -1 :0] s0_wid; +wire [`Lwdata -1 :0] s0_wdata; +wire [`Lwstrb -1 :0] s0_wstrb; +wire s0_wlast; +wire s0_wvalid; +wire s0_wready; +wire [`LID -1 :0] s0_bid; +wire [`Lbresp -1 :0] s0_bresp; +wire s0_bvalid; +wire s0_bready; +wire [`LID -1 :0] s0_arid; +wire [`Laraddr -1 :0] s0_araddr; +wire [`Larlen -1 :0] s0_arlen; +wire [`Larsize -1 :0] s0_arsize; +wire [`Larburst -1 :0] s0_arburst; +wire [`Larlock -1 :0] s0_arlock; +wire [`Larcache -1 :0] s0_arcache; +wire [`Larprot -1 :0] s0_arprot; +wire s0_arvalid; +wire s0_arready; +wire [`LID -1 :0] s0_rid; +wire [`Lrdata -1 :0] s0_rdata; +wire [`Lrresp -1 :0] s0_rresp; +wire s0_rlast; +wire s0_rvalid; +wire s0_rready; + +wire [8 -1 :0] mig_awid; +wire [`Lawaddr -1 :0] mig_awaddr; +wire [8 -1 :0] mig_awlen; +wire [`Lawsize -1 :0] mig_awsize; +wire [`Lawburst -1 :0] mig_awburst; +wire [`Lawlock -1 :0] mig_awlock; +wire [`Lawcache -1 :0] mig_awcache; +wire [`Lawprot -1 :0] mig_awprot; +wire mig_awvalid; +wire mig_awready; +wire [8 -1 :0] mig_wid; +wire [`Lwdata -1 :0] mig_wdata; +wire [`Lwstrb -1 :0] mig_wstrb; +wire mig_wlast; +wire mig_wvalid; +wire mig_wready; +wire [8 -1 :0] mig_bid; +wire [`Lbresp -1 :0] mig_bresp; +wire mig_bvalid; +wire mig_bready; +wire [8 -1 :0] mig_arid; +wire [`Laraddr -1 :0] mig_araddr; +wire [8 -1 :0] mig_arlen; +wire [`Larsize -1 :0] mig_arsize; +wire [`Larburst -1 :0] mig_arburst; +wire [`Larlock -1 :0] mig_arlock; +wire [`Larcache -1 :0] mig_arcache; +wire [`Larprot -1 :0] mig_arprot; +wire mig_arvalid; +wire mig_arready; +wire [8 -1 :0] mig_rid; +wire [`Lrdata -1 :0] mig_rdata; +wire [`Lrresp -1 :0] mig_rresp; +wire mig_rlast; +wire mig_rvalid; +wire mig_rready; + +wire [`LID -1 :0] dma0_awid ; +wire [`Lawaddr -1 :0] dma0_awaddr ; +wire [`Lawlen -1 :0] dma0_awlen ; +wire [`Lawsize -1 :0] dma0_awsize ; +wire [`Lawburst -1 :0] dma0_awburst ; +wire [`Lawlock -1 :0] dma0_awlock ; +wire [`Lawcache -1 :0] dma0_awcache ; +wire [`Lawprot -1 :0] dma0_awprot ; +wire dma0_awvalid ; +wire dma0_awready ; +wire [`LID -1 :0] dma0_wid ; +wire [64 -1 :0] dma0_wdata ; +wire [8 -1 :0] dma0_wstrb ; +wire dma0_wlast ; +wire dma0_wvalid ; +wire dma0_wready ; +wire [`LID -1 :0] dma0_bid ; +wire [`Lbresp -1 :0] dma0_bresp ; +wire dma0_bvalid ; +wire dma0_bready ; +wire [`LID -1 :0] dma0_arid ; +wire [`Laraddr -1 :0] dma0_araddr ; +wire [`Larlen -1 :0] dma0_arlen ; +wire [`Larsize -1 :0] dma0_arsize ; +wire [`Larburst -1 :0] dma0_arburst ; +wire [`Larlock -1 :0] dma0_arlock ; +wire [`Larcache -1 :0] dma0_arcache ; +wire [`Larprot -1 :0] dma0_arprot ; +wire dma0_arvalid ; +wire dma0_arready ; +wire [`LID -1 :0] dma0_rid ; +wire [64 -1 :0] dma0_rdata ; +wire [`Lrresp -1 :0] dma0_rresp ; +wire dma0_rlast ; +wire dma0_rvalid ; +wire dma0_rready ; + +wire [`LID -1 :0] apb_s_awid; +wire [`Lawaddr -1 :0] apb_s_awaddr; +wire [`Lawlen -1 :0] apb_s_awlen; +wire [`Lawsize -1 :0] apb_s_awsize; +wire [`Lawburst -1 :0] apb_s_awburst; +wire [`Lawlock -1 :0] apb_s_awlock; +wire [`Lawcache -1 :0] apb_s_awcache; +wire [`Lawprot -1 :0] apb_s_awprot; +wire apb_s_awvalid; +wire apb_s_awready; +wire [`LID -1 :0] apb_s_wid; +wire [`Lwdata -1 :0] apb_s_wdata; +wire [`Lwstrb -1 :0] apb_s_wstrb; +wire apb_s_wlast; +wire apb_s_wvalid; +wire apb_s_wready; +wire [`LID -1 :0] apb_s_bid; +wire [`Lbresp -1 :0] apb_s_bresp; +wire apb_s_bvalid; +wire apb_s_bready; +wire [`LID -1 :0] apb_s_arid; +wire [`Laraddr -1 :0] apb_s_araddr; +wire [`Larlen -1 :0] apb_s_arlen; +wire [`Larsize -1 :0] apb_s_arsize; +wire [`Larburst -1 :0] apb_s_arburst; +wire [`Larlock -1 :0] apb_s_arlock; +wire [`Larcache -1 :0] apb_s_arcache; +wire [`Larprot -1 :0] apb_s_arprot; +wire apb_s_arvalid; +wire apb_s_arready; +wire [`LID -1 :0] apb_s_rid; +wire [`Lrdata -1 :0] apb_s_rdata; +wire [`Lrresp -1 :0] apb_s_rresp; +wire apb_s_rlast; +wire apb_s_rvalid; +wire apb_s_rready; + +wire apb_ready_dma0; +wire apb_start_dma0; +wire apb_rw_dma0; +wire apb_psel_dma0; +wire apb_penable_dma0; +wire[31:0] apb_addr_dma0; +wire[31:0] apb_wdata_dma0; +wire[31:0] apb_rdata_dma0; + +wire dma_int; +wire dma_ack; +wire dma_req; + +wire dma0_gnt; +wire[31:0] order_addr_in; +wire write_dma_end; +wire finish_read_order; + +//spi +wire [3:0]spi_csn_o ; +wire [3:0]spi_csn_en; +wire spi_sck_o ; +wire spi_sdo_i ; +wire spi_sdo_o ; +wire spi_sdo_en; +wire spi_sdi_i ; +wire spi_sdi_o ; +wire spi_sdi_en; +wire spi_inta_o; +assign SPI_CLK = spi_sck_o; +assign SPI_CS = ~spi_csn_en[0] & spi_csn_o[0]; +assign SPI_MOSI = spi_sdo_en ? 1'bz : spi_sdo_o ; +assign SPI_MISO = spi_sdi_en ? 1'bz : spi_sdi_o ; +assign spi_sdo_i = SPI_MOSI; +assign spi_sdi_i = SPI_MISO; + +// confreg +wire [31:0] cr00,cr01,cr02,cr03,cr04,cr05,cr06,cr07; + +//mac +wire md_i_0; // MII data input (from I/O cell) +wire md_o_0; // MII data output (to I/O cell) +wire md_oe_0; // MII data output enable (to I/O cell) +IOBUF mac_mdio(.IO(mdio_0),.I(md_o_0),.T(~md_oe_0),.O(md_i_0)); +assign phy_rstn = aresetn; + +//nand +wire nand_cle ; +wire nand_ale ; +wire [3:0] nand_rdy ; +wire [3:0] nand_ce ; +wire nand_rd ; +wire nand_wr ; +wire nand_dat_oe; +wire [7:0] nand_dat_i ; +wire [7:0] nand_dat_o ; +wire nand_int ; +assign NAND_CLE = nand_cle; +assign NAND_ALE = nand_ale; +assign nand_rdy = {3'd0,NAND_RDY}; +assign NAND_RD = nand_rd; +assign NAND_CE = nand_ce[0]; //low active +assign NAND_WR = nand_wr; +generate + genvar i; + for(i=0;i<8;i=i+1) + begin: nand_data_loop + IOBUF nand_data(.IO(NAND_DATA[i]),.I(nand_dat_o[i]),.T(nand_dat_oe),.O(nand_dat_i[i])); + end +endgenerate + +//uart +wire UART_CTS, UART_RTS; +wire UART_DTR, UART_DSR; +wire UART_RI, UART_DCD; +assign UART_CTS = 1'b0; +assign UART_DSR = 1'b0; +assign UART_DCD = 1'b0; +wire uart0_int ; +wire uart0_txd_o ; +wire uart0_txd_i ; +wire uart0_txd_oe; +wire uart0_rxd_o ; +wire uart0_rxd_i ; +wire uart0_rxd_oe; +wire uart0_rts_o ; +wire uart0_cts_i ; +wire uart0_dsr_i ; +wire uart0_dcd_i ; +wire uart0_dtr_o ; +wire uart0_ri_i ; +assign UART_RX = uart0_rxd_oe ? 1'bz : uart0_rxd_o ; +assign UART_TX = uart0_txd_oe ? 1'bz : uart0_txd_o ; +assign UART_RTS = uart0_rts_o ; +assign UART_DTR = uart0_dtr_o ; +assign uart0_txd_i = UART_TX; +assign uart0_rxd_i = UART_RX; +assign uart0_cts_i = UART_CTS; +assign uart0_dcd_i = UART_DCD; +assign uart0_dsr_i = UART_DSR; +assign uart0_ri_i = UART_RI ; + +//interrupt +wire mac_int; +wire [5:0] int_out; +wire [5:0] int_n_i; +assign int_out = {1'b0,dma_int,nand_int,spi_inta_o,uart0_int,mac_int}; +assign int_n_i = ~int_out; + +// cpu +godson_cpu_mid cpu_mid( + .coreclock (aclk), + .interrupt_i (int_n_i[4:0]), //232 only 5bit + .nmi (1'b1), + + .areset_n (aresetn ), + .arid (m0_arid[3:0] ), + .araddr (m0_araddr ), + .arlen (m0_arlen ), + .arsize (m0_arsize ), + .arburst (m0_arburst ), + .arlock (m0_arlock ), + .arcache (m0_arcache ), + .arprot (m0_arprot ), + .arvalid (m0_arvalid ), + .arready (m0_arready ), + .rid (m0_rid[3:0] ), + .rdata (m0_rdata ), + .rresp (m0_rresp ), + .rlast (m0_rlast ), + .rvalid (m0_rvalid ), + .rready (m0_rready ), + .awid (m0_awid[3:0] ), + .awaddr (m0_awaddr ), + .awlen (m0_awlen ), + .awsize (m0_awsize ), + .awburst (m0_awburst ), + .awlock (m0_awlock ), + .awcache (m0_awcache ), + .awprot (m0_awprot ), + .awvalid (m0_awvalid ), + .awready (m0_awready ), + .wid (m0_wid[3:0] ), + .wdata (m0_wdata ), + .wstrb (m0_wstrb ), + .wlast (m0_wlast ), + .wvalid (m0_wvalid ), + .wready (m0_wready ), + .bid (m0_bid[3:0] ), + .bresp (m0_bresp ), + .bvalid (m0_bvalid ), + .bready (m0_bready ), + + .EJTAG_TCK (EJTAG_TCK ), + .EJTAG_TDI (EJTAG_TDI ), + .EJTAG_TMS (EJTAG_TMS ), + .EJTAG_TRST (EJTAG_TRST ), + .EJTAG_TDO (EJTAG_TDO ), + .prrst_to_core ( ), + + .testmode (1'b0 ) +); + +// AXI_MUX +axi_slave_mux AXI_SLAVE_MUX +( +.axi_s_aresetn (aresetn ), +.spi_boot (1'b1 ), + +.axi_s_awid (m0_awid ), +.axi_s_awaddr (m0_awaddr ), +.axi_s_awlen (m0_awlen ), +.axi_s_awsize (m0_awsize ), +.axi_s_awburst (m0_awburst ), +.axi_s_awlock (m0_awlock ), +.axi_s_awcache (m0_awcache ), +.axi_s_awprot (m0_awprot ), +.axi_s_awvalid (m0_awvalid ), +.axi_s_awready (m0_awready ), +.axi_s_wready (m0_wready ), +.axi_s_wid (m0_wid ), +.axi_s_wdata (m0_wdata ), +.axi_s_wstrb (m0_wstrb ), +.axi_s_wlast (m0_wlast ), +.axi_s_wvalid (m0_wvalid ), +.axi_s_bid (m0_bid ), +.axi_s_bresp (m0_bresp ), +.axi_s_bvalid (m0_bvalid ), +.axi_s_bready (m0_bready ), +.axi_s_arid (m0_arid ), +.axi_s_araddr (m0_araddr ), +.axi_s_arlen (m0_arlen ), +.axi_s_arsize (m0_arsize ), +.axi_s_arburst (m0_arburst ), +.axi_s_arlock (m0_arlock ), +.axi_s_arcache (m0_arcache ), +.axi_s_arprot (m0_arprot ), +.axi_s_arvalid (m0_arvalid ), +.axi_s_arready (m0_arready ), +.axi_s_rready (m0_rready ), +.axi_s_rid (m0_rid ), +.axi_s_rdata (m0_rdata ), +.axi_s_rresp (m0_rresp ), +.axi_s_rlast (m0_rlast ), +.axi_s_rvalid (m0_rvalid ), + +.s0_awid (s0_awid ), +.s0_awaddr (s0_awaddr ), +.s0_awlen (s0_awlen ), +.s0_awsize (s0_awsize ), +.s0_awburst (s0_awburst ), +.s0_awlock (s0_awlock ), +.s0_awcache (s0_awcache ), +.s0_awprot (s0_awprot ), +.s0_awvalid (s0_awvalid ), +.s0_awready (s0_awready ), +.s0_wid (s0_wid ), +.s0_wdata (s0_wdata ), +.s0_wstrb (s0_wstrb ), +.s0_wlast (s0_wlast ), +.s0_wvalid (s0_wvalid ), +.s0_wready (s0_wready ), +.s0_bid (s0_bid ), +.s0_bresp (s0_bresp ), +.s0_bvalid (s0_bvalid ), +.s0_bready (s0_bready ), +.s0_arid (s0_arid ), +.s0_araddr (s0_araddr ), +.s0_arlen (s0_arlen ), +.s0_arsize (s0_arsize ), +.s0_arburst (s0_arburst ), +.s0_arlock (s0_arlock ), +.s0_arcache (s0_arcache ), +.s0_arprot (s0_arprot ), +.s0_arvalid (s0_arvalid ), +.s0_arready (s0_arready ), +.s0_rid (s0_rid ), +.s0_rdata (s0_rdata ), +.s0_rresp (s0_rresp ), +.s0_rlast (s0_rlast ), +.s0_rvalid (s0_rvalid ), +.s0_rready (s0_rready ), + +.s1_awid (spi_s_awid ), +.s1_awaddr (spi_s_awaddr ), +.s1_awlen (spi_s_awlen ), +.s1_awsize (spi_s_awsize ), +.s1_awburst (spi_s_awburst ), +.s1_awlock (spi_s_awlock ), +.s1_awcache (spi_s_awcache ), +.s1_awprot (spi_s_awprot ), +.s1_awvalid (spi_s_awvalid ), +.s1_awready (spi_s_awready ), +.s1_wid (spi_s_wid ), +.s1_wdata (spi_s_wdata ), +.s1_wstrb (spi_s_wstrb ), +.s1_wlast (spi_s_wlast ), +.s1_wvalid (spi_s_wvalid ), +.s1_wready (spi_s_wready ), +.s1_bid (spi_s_bid ), +.s1_bresp (spi_s_bresp ), +.s1_bvalid (spi_s_bvalid ), +.s1_bready (spi_s_bready ), +.s1_arid (spi_s_arid ), +.s1_araddr (spi_s_araddr ), +.s1_arlen (spi_s_arlen ), +.s1_arsize (spi_s_arsize ), +.s1_arburst (spi_s_arburst ), +.s1_arlock (spi_s_arlock ), +.s1_arcache (spi_s_arcache ), +.s1_arprot (spi_s_arprot ), +.s1_arvalid (spi_s_arvalid ), +.s1_arready (spi_s_arready ), +.s1_rid (spi_s_rid ), +.s1_rdata (spi_s_rdata ), +.s1_rresp (spi_s_rresp ), +.s1_rlast (spi_s_rlast ), +.s1_rvalid (spi_s_rvalid ), +.s1_rready (spi_s_rready ), + +.s2_awid (apb_s_awid ), +.s2_awaddr (apb_s_awaddr ), +.s2_awlen (apb_s_awlen ), +.s2_awsize (apb_s_awsize ), +.s2_awburst (apb_s_awburst ), +.s2_awlock (apb_s_awlock ), +.s2_awcache (apb_s_awcache ), +.s2_awprot (apb_s_awprot ), +.s2_awvalid (apb_s_awvalid ), +.s2_awready (apb_s_awready ), +.s2_wid (apb_s_wid ), +.s2_wdata (apb_s_wdata ), +.s2_wstrb (apb_s_wstrb ), +.s2_wlast (apb_s_wlast ), +.s2_wvalid (apb_s_wvalid ), +.s2_wready (apb_s_wready ), +.s2_bid (apb_s_bid ), +.s2_bresp (apb_s_bresp ), +.s2_bvalid (apb_s_bvalid ), +.s2_bready (apb_s_bready ), +.s2_arid (apb_s_arid ), +.s2_araddr (apb_s_araddr ), +.s2_arlen (apb_s_arlen ), +.s2_arsize (apb_s_arsize ), +.s2_arburst (apb_s_arburst ), +.s2_arlock (apb_s_arlock ), +.s2_arcache (apb_s_arcache ), +.s2_arprot (apb_s_arprot ), +.s2_arvalid (apb_s_arvalid ), +.s2_arready (apb_s_arready ), +.s2_rid (apb_s_rid ), +.s2_rdata (apb_s_rdata ), +.s2_rresp (apb_s_rresp ), +.s2_rlast (apb_s_rlast ), +.s2_rvalid (apb_s_rvalid ), +.s2_rready (apb_s_rready ), + +.s3_awid (conf_s_awid ), +.s3_awaddr (conf_s_awaddr ), +.s3_awlen (conf_s_awlen ), +.s3_awsize (conf_s_awsize ), +.s3_awburst (conf_s_awburst ), +.s3_awlock (conf_s_awlock ), +.s3_awcache (conf_s_awcache ), +.s3_awprot (conf_s_awprot ), +.s3_awvalid (conf_s_awvalid ), +.s3_awready (conf_s_awready ), +.s3_wid (conf_s_wid ), +.s3_wdata (conf_s_wdata ), +.s3_wstrb (conf_s_wstrb ), +.s3_wlast (conf_s_wlast ), +.s3_wvalid (conf_s_wvalid ), +.s3_wready (conf_s_wready ), +.s3_bid (conf_s_bid ), +.s3_bresp (conf_s_bresp ), +.s3_bvalid (conf_s_bvalid ), +.s3_bready (conf_s_bready ), +.s3_arid (conf_s_arid ), +.s3_araddr (conf_s_araddr ), +.s3_arlen (conf_s_arlen ), +.s3_arsize (conf_s_arsize ), +.s3_arburst (conf_s_arburst ), +.s3_arlock (conf_s_arlock ), +.s3_arcache (conf_s_arcache ), +.s3_arprot (conf_s_arprot ), +.s3_arvalid (conf_s_arvalid ), +.s3_arready (conf_s_arready ), +.s3_rid (conf_s_rid ), +.s3_rdata (conf_s_rdata ), +.s3_rresp (conf_s_rresp ), +.s3_rlast (conf_s_rlast ), +.s3_rvalid (conf_s_rvalid ), +.s3_rready (conf_s_rready ), + +.s4_awid (mac_s_awid ), +.s4_awaddr (mac_s_awaddr ), +.s4_awlen (mac_s_awlen ), +.s4_awsize (mac_s_awsize ), +.s4_awburst (mac_s_awburst ), +.s4_awlock (mac_s_awlock ), +.s4_awcache (mac_s_awcache ), +.s4_awprot (mac_s_awprot ), +.s4_awvalid (mac_s_awvalid ), +.s4_awready (mac_s_awready ), +.s4_wid (mac_s_wid ), +.s4_wdata (mac_s_wdata ), +.s4_wstrb (mac_s_wstrb ), +.s4_wlast (mac_s_wlast ), +.s4_wvalid (mac_s_wvalid ), +.s4_wready (mac_s_wready ), +.s4_bid (mac_s_bid ), +.s4_bresp (mac_s_bresp ), +.s4_bvalid (mac_s_bvalid ), +.s4_bready (mac_s_bready ), +.s4_arid (mac_s_arid ), +.s4_araddr (mac_s_araddr ), +.s4_arlen (mac_s_arlen ), +.s4_arsize (mac_s_arsize ), +.s4_arburst (mac_s_arburst ), +.s4_arlock (mac_s_arlock ), +.s4_arcache (mac_s_arcache ), +.s4_arprot (mac_s_arprot ), +.s4_arvalid (mac_s_arvalid ), +.s4_arready (mac_s_arready ), +.s4_rid (mac_s_rid ), +.s4_rdata (mac_s_rdata ), +.s4_rresp (mac_s_rresp ), +.s4_rlast (mac_s_rlast ), +.s4_rvalid (mac_s_rvalid ), +.s4_rready (mac_s_rready ), + +.axi_s_aclk (aclk ) +); + +//SPI +spi_flash_ctrl SPI +( +.aclk (aclk ), +.aresetn (aresetn ), +.spi_addr (16'h1fe8 ), +.fast_startup (1'b0 ), +.s_awid (spi_s_awid ), +.s_awaddr (spi_s_awaddr ), +.s_awlen (spi_s_awlen ), +.s_awsize (spi_s_awsize ), +.s_awburst (spi_s_awburst ), +.s_awlock (spi_s_awlock ), +.s_awcache (spi_s_awcache ), +.s_awprot (spi_s_awprot ), +.s_awvalid (spi_s_awvalid ), +.s_awready (spi_s_awready ), +.s_wready (spi_s_wready ), +.s_wid (spi_s_wid ), +.s_wdata (spi_s_wdata ), +.s_wstrb (spi_s_wstrb ), +.s_wlast (spi_s_wlast ), +.s_wvalid (spi_s_wvalid ), +.s_bid (spi_s_bid ), +.s_bresp (spi_s_bresp ), +.s_bvalid (spi_s_bvalid ), +.s_bready (spi_s_bready ), +.s_arid (spi_s_arid ), +.s_araddr (spi_s_araddr ), +.s_arlen (spi_s_arlen ), +.s_arsize (spi_s_arsize ), +.s_arburst (spi_s_arburst ), +.s_arlock (spi_s_arlock ), +.s_arcache (spi_s_arcache ), +.s_arprot (spi_s_arprot ), +.s_arvalid (spi_s_arvalid ), +.s_arready (spi_s_arready ), +.s_rready (spi_s_rready ), +.s_rid (spi_s_rid ), +.s_rdata (spi_s_rdata ), +.s_rresp (spi_s_rresp ), +.s_rlast (spi_s_rlast ), +.s_rvalid (spi_s_rvalid ), + +.power_down_req (1'b0 ), +.power_down_ack ( ), +.csn_o (spi_csn_o ), +.csn_en (spi_csn_en ), +.sck_o (spi_sck_o ), +.sdo_i (spi_sdo_i ), +.sdo_o (spi_sdo_o ), +.sdo_en (spi_sdo_en ), // active low +.sdi_i (spi_sdi_i ), +.sdi_o (spi_sdi_o ), +.sdi_en (spi_sdi_en ), +.inta_o (spi_inta_o ) +); + +//confreg +confreg CONFREG( +.aclk (aclk ), +.aresetn (aresetn ), +.s_awid (conf_s_awid ), +.s_awaddr (conf_s_awaddr ), +.s_awlen (conf_s_awlen ), +.s_awsize (conf_s_awsize ), +.s_awburst (conf_s_awburst ), +.s_awlock (conf_s_awlock ), +.s_awcache (conf_s_awcache ), +.s_awprot (conf_s_awprot ), +.s_awvalid (conf_s_awvalid ), +.s_awready (conf_s_awready ), +.s_wready (conf_s_wready ), +.s_wid (conf_s_wid ), +.s_wdata (conf_s_wdata ), +.s_wstrb (conf_s_wstrb ), +.s_wlast (conf_s_wlast ), +.s_wvalid (conf_s_wvalid ), +.s_bid (conf_s_bid ), +.s_bresp (conf_s_bresp ), +.s_bvalid (conf_s_bvalid ), +.s_bready (conf_s_bready ), +.s_arid (conf_s_arid ), +.s_araddr (conf_s_araddr ), +.s_arlen (conf_s_arlen ), +.s_arsize (conf_s_arsize ), +.s_arburst (conf_s_arburst ), +.s_arlock (conf_s_arlock ), +.s_arcache (conf_s_arcache ), +.s_arprot (conf_s_arprot ), +.s_arvalid (conf_s_arvalid ), +.s_arready (conf_s_arready ), +.s_rready (conf_s_rready ), +.s_rid (conf_s_rid ), +.s_rdata (conf_s_rdata ), +.s_rresp (conf_s_rresp ), +.s_rlast (conf_s_rlast ), +.s_rvalid (conf_s_rvalid ), + +//dma +.order_addr_reg (order_addr_in ), +.write_dma_end (write_dma_end ), +.finish_read_order (finish_read_order ), + +//cr00~cr07 +.cr00 (cr00 ), +.cr01 (cr01 ), +.cr02 (cr02 ), +.cr03 (cr03 ), +.cr04 (cr04 ), +.cr05 (cr05 ), +.cr06 (cr06 ), +.cr07 (cr07 ), + +.led (led ), +.led_rg0 (led_rg0 ), +.led_rg1 (led_rg1 ), +.num_csn (num_csn ), +.num_a_g (num_a_g ), +.switch (switch ), +.btn_key_col (btn_key_col ), +.btn_key_row (btn_key_row ), +.btn_step (btn_step ) +); + +//MAC top +ethernet_top ETHERNET_TOP( + + .hclk (aclk ), + .hrst_ (aresetn), + //axi master + .mawid_o (mac_m_awid ), + .mawaddr_o (mac_m_awaddr ), + .mawlen_o (mac_m_awlen ), + .mawsize_o (mac_m_awsize ), + .mawburst_o (mac_m_awburst ), + .mawlock_o (mac_m_awlock ), + .mawcache_o (mac_m_awcache ), + .mawprot_o (mac_m_awprot ), + .mawvalid_o (mac_m_awvalid ), + .mawready_i (mac_m_awready ), + .mwid_o (mac_m_wid ), + .mwdata_o (mac_m_wdata ), + .mwstrb_o (mac_m_wstrb ), + .mwlast_o (mac_m_wlast ), + .mwvalid_o (mac_m_wvalid ), + .mwready_i (mac_m_wready ), + .mbid_i (mac_m_bid ), + .mbresp_i (mac_m_bresp ), + .mbvalid_i (mac_m_bvalid ), + .mbready_o (mac_m_bready ), + .marid_o (mac_m_arid ), + .maraddr_o (mac_m_araddr ), + .marlen_o (mac_m_arlen ), + .marsize_o (mac_m_arsize ), + .marburst_o (mac_m_arburst ), + .marlock_o (mac_m_arlock ), + .marcache_o (mac_m_arcache ), + .marprot_o (mac_m_arprot ), + .marvalid_o (mac_m_arvalid ), + .marready_i (mac_m_arready ), + .mrid_i (mac_m_rid ), + .mrdata_i (mac_m_rdata ), + .mrresp_i (mac_m_rresp ), + .mrlast_i (mac_m_rlast ), + .mrvalid_i (mac_m_rvalid ), + .mrready_o (mac_m_rready ), + //axi slaver + .sawid_i (mac_s_awid ), + .sawaddr_i (mac_s_awaddr ), + .sawlen_i (mac_s_awlen ), + .sawsize_i (mac_s_awsize ), + .sawburst_i (mac_s_awburst ), + .sawlock_i (mac_s_awlock ), + .sawcache_i (mac_s_awcache ), + .sawprot_i (mac_s_awprot ), + .sawvalid_i (mac_s_awvalid ), + .sawready_o (mac_s_awready ), + .swid_i (mac_s_wid ), + .swdata_i (mac_s_wdata ), + .swstrb_i (mac_s_wstrb ), + .swlast_i (mac_s_wlast ), + .swvalid_i (mac_s_wvalid ), + .swready_o (mac_s_wready ), + .sbid_o (mac_s_bid ), + .sbresp_o (mac_s_bresp ), + .sbvalid_o (mac_s_bvalid ), + .sbready_i (mac_s_bready ), + .sarid_i (mac_s_arid ), + .saraddr_i (mac_s_araddr ), + .sarlen_i (mac_s_arlen ), + .sarsize_i (mac_s_arsize ), + .sarburst_i (mac_s_arburst ), + .sarlock_i (mac_s_arlock ), + .sarcache_i (mac_s_arcache ), + .sarprot_i (mac_s_arprot ), + .sarvalid_i (mac_s_arvalid ), + .sarready_o (mac_s_arready ), + .srid_o (mac_s_rid ), + .srdata_o (mac_s_rdata ), + .srresp_o (mac_s_rresp ), + .srlast_o (mac_s_rlast ), + .srvalid_o (mac_s_rvalid ), + .srready_i (mac_s_rready ), + + .interrupt_0 (mac_int), + + // I/O pad interface signals + //TX + .mtxclk_0 (mtxclk_0 ), + .mtxen_0 (mtxen_0 ), + .mtxd_0 (mtxd_0 ), + .mtxerr_0 (mtxerr_0 ), + //RX + .mrxclk_0 (mrxclk_0 ), + .mrxdv_0 (mrxdv_0 ), + .mrxd_0 (mrxd_0 ), + .mrxerr_0 (mrxerr_0 ), + .mcoll_0 (mcoll_0 ), + .mcrs_0 (mcrs_0 ), + // MIIM + .mdc_0 (mdc_0 ), + .md_i_0 (md_i_0 ), + .md_o_0 (md_o_0 ), + .md_oe_0 (md_oe_0 ) + +); + +//ddr3 +wire c1_sys_clk_i; +wire c1_clk_ref_i; +wire c1_sys_rst_i; +wire c1_calib_done; +wire c1_clk0; +wire c1_rst0; +wire ddr_aresetn; +reg interconnect_aresetn; + +wire cpu_clk; +clk_pll_33 clk_pll_33 + ( + // Clock out ports + .clk_out1(cpu_clk), //33MHz + // Clock in ports + .clk_in1(clk) //100MHz + ); + +clk_wiz_0 clk_pll_1 +( + .clk_out1(c1_clk_ref_i), //200MHz + .clk_in1(clk) //100MHz +); + +assign c1_sys_clk_i = clk; +assign c1_sys_rst_i = resetn; +assign aclk = cpu_clk; +//assign aclk = c1_clk0; +// Reset to the AXI shim +reg c1_calib_done_0; +reg c1_calib_done_1; +reg c1_rst0_0; +reg c1_rst0_1; +reg interconnect_aresetn_0; +/*always @(posedge aclk) +begin + c1_calib_done_0 <= c1_calib_done; + c1_calib_done_1 <= c1_calib_done_0; + c1_rst0_0 <= c1_rst0; + c1_rst0_1 <= c1_rst0_0; + + interconnect_aresetn_0 <= ~c1_rst0_1 && c1_calib_done_1; + interconnect_aresetn <= interconnect_aresetn_0 ; +end*/ +always @(posedge c1_clk0) +begin + interconnect_aresetn <= ~c1_rst0 && c1_calib_done; +end + +//axi 3x1 +axi_interconnect_0 mig_axi_interconnect ( + .INTERCONNECT_ACLK (c1_clk0 ), + .INTERCONNECT_ARESETN (interconnect_aresetn), + .S00_AXI_ARESET_OUT_N (aresetn ), + .S00_AXI_ACLK (aclk ), + .S00_AXI_AWID (s0_awid[3:0] ), + .S00_AXI_AWADDR (s0_awaddr ), + .S00_AXI_AWLEN ({4'b0,s0_awlen} ), + .S00_AXI_AWSIZE (s0_awsize ), + .S00_AXI_AWBURST (s0_awburst ), + .S00_AXI_AWLOCK (s0_awlock[0:0] ), + .S00_AXI_AWCACHE (s0_awcache ), + .S00_AXI_AWPROT (s0_awprot ), + .S00_AXI_AWQOS (4'b0 ), + .S00_AXI_AWVALID (s0_awvalid ), + .S00_AXI_AWREADY (s0_awready ), + .S00_AXI_WDATA (s0_wdata ), + .S00_AXI_WSTRB (s0_wstrb ), + .S00_AXI_WLAST (s0_wlast ), + .S00_AXI_WVALID (s0_wvalid ), + .S00_AXI_WREADY (s0_wready ), + .S00_AXI_BID (s0_bid[3:0] ), + .S00_AXI_BRESP (s0_bresp ), + .S00_AXI_BVALID (s0_bvalid ), + .S00_AXI_BREADY (s0_bready ), + .S00_AXI_ARID (s0_arid[3:0] ), + .S00_AXI_ARADDR (s0_araddr ), + .S00_AXI_ARLEN ({4'b0,s0_arlen} ), + .S00_AXI_ARSIZE (s0_arsize ), + .S00_AXI_ARBURST (s0_arburst ), + .S00_AXI_ARLOCK (s0_arlock[0:0] ), + .S00_AXI_ARCACHE (s0_arcache ), + .S00_AXI_ARPROT (s0_arprot ), + .S00_AXI_ARQOS (4'b0 ), + .S00_AXI_ARVALID (s0_arvalid ), + .S00_AXI_ARREADY (s0_arready ), + .S00_AXI_RID (s0_rid[3:0] ), + .S00_AXI_RDATA (s0_rdata ), + .S00_AXI_RRESP (s0_rresp ), + .S00_AXI_RLAST (s0_rlast ), + .S00_AXI_RVALID (s0_rvalid ), + .S00_AXI_RREADY (s0_rready ), + + .S01_AXI_ARESET_OUT_N ( ), + .S01_AXI_ACLK (aclk ), + .S01_AXI_AWID (mac_m_awid[3:0] ), + .S01_AXI_AWADDR (mac_m_awaddr ), + .S01_AXI_AWLEN ({4'b0,mac_m_awlen} ), + .S01_AXI_AWSIZE (mac_m_awsize ), + .S01_AXI_AWBURST (mac_m_awburst ), + .S01_AXI_AWLOCK (mac_m_awlock[0:0] ), + .S01_AXI_AWCACHE (mac_m_awcache ), + .S01_AXI_AWPROT (mac_m_awprot ), + .S01_AXI_AWQOS (4'b0 ), + .S01_AXI_AWVALID (mac_m_awvalid ), + .S01_AXI_AWREADY (mac_m_awready ), + .S01_AXI_WDATA (mac_m_wdata ), + .S01_AXI_WSTRB (mac_m_wstrb ), + .S01_AXI_WLAST (mac_m_wlast ), + .S01_AXI_WVALID (mac_m_wvalid ), + .S01_AXI_WREADY (mac_m_wready ), + .S01_AXI_BID (mac_m_bid[3:0] ), + .S01_AXI_BRESP (mac_m_bresp ), + .S01_AXI_BVALID (mac_m_bvalid ), + .S01_AXI_BREADY (mac_m_bready ), + .S01_AXI_ARID (mac_m_arid[3:0] ), + .S01_AXI_ARADDR (mac_m_araddr ), + .S01_AXI_ARLEN ({4'b0,mac_m_arlen} ), + .S01_AXI_ARSIZE (mac_m_arsize ), + .S01_AXI_ARBURST (mac_m_arburst ), + .S01_AXI_ARLOCK (mac_m_arlock[0:0] ), + .S01_AXI_ARCACHE (mac_m_arcache ), + .S01_AXI_ARPROT (mac_m_arprot ), + .S01_AXI_ARQOS (4'b0 ), + .S01_AXI_ARVALID (mac_m_arvalid ), + .S01_AXI_ARREADY (mac_m_arready ), + .S01_AXI_RID (mac_m_rid[3:0] ), + .S01_AXI_RDATA (mac_m_rdata ), + .S01_AXI_RRESP (mac_m_rresp ), + .S01_AXI_RLAST (mac_m_rlast ), + .S01_AXI_RVALID (mac_m_rvalid ), + .S01_AXI_RREADY (mac_m_rready ), + + .S02_AXI_ARESET_OUT_N ( ), + .S02_AXI_ACLK (aclk ), + .S02_AXI_AWID (dma0_awid ), + .S02_AXI_AWADDR (dma0_awaddr ), + .S02_AXI_AWLEN ({4'd0,dma0_awlen} ), + .S02_AXI_AWSIZE (dma0_awsize ), + .S02_AXI_AWBURST (dma0_awburst ), + .S02_AXI_AWLOCK (dma0_awlock[0:0] ), + .S02_AXI_AWCACHE (dma0_awcache ), + .S02_AXI_AWPROT (dma0_awprot ), + .S02_AXI_AWQOS (4'b0 ), + .S02_AXI_AWVALID (dma0_awvalid ), + .S02_AXI_AWREADY (dma0_awready ), + .S02_AXI_WDATA (dma0_wdata ), + .S02_AXI_WSTRB (dma0_wstrb ), + .S02_AXI_WLAST (dma0_wlast ), + .S02_AXI_WVALID (dma0_wvalid ), + .S02_AXI_WREADY (dma0_wready ), + .S02_AXI_BID (dma0_bid ), + .S02_AXI_BRESP (dma0_bresp ), + .S02_AXI_BVALID (dma0_bvalid ), + .S02_AXI_BREADY (dma0_bready ), + .S02_AXI_ARID (dma0_arid ), + .S02_AXI_ARADDR (dma0_araddr ), + .S02_AXI_ARLEN ({4'd0,dma0_arlen} ), + .S02_AXI_ARSIZE (dma0_arsize ), + .S02_AXI_ARBURST (dma0_arburst ), + .S02_AXI_ARLOCK (dma0_arlock[0:0] ), + .S02_AXI_ARCACHE (dma0_arcache ), + .S02_AXI_ARPROT (dma0_arprot ), + .S02_AXI_ARQOS (4'b0 ), + .S02_AXI_ARVALID (dma0_arvalid ), + .S02_AXI_ARREADY (dma0_arready ), + .S02_AXI_RID (dma0_rid ), + .S02_AXI_RDATA (dma0_rdata ), + .S02_AXI_RRESP (dma0_rresp ), + .S02_AXI_RLAST (dma0_rlast ), + .S02_AXI_RVALID (dma0_rvalid ), + .S02_AXI_RREADY (dma0_rready ), + + .M00_AXI_ARESET_OUT_N (ddr_aresetn ), + .M00_AXI_ACLK (c1_clk0 ), + .M00_AXI_AWID (mig_awid ), + .M00_AXI_AWADDR (mig_awaddr ), + .M00_AXI_AWLEN ({mig_awlen} ), + .M00_AXI_AWSIZE (mig_awsize ), + .M00_AXI_AWBURST (mig_awburst ), + .M00_AXI_AWLOCK (mig_awlock[0:0] ), + .M00_AXI_AWCACHE (mig_awcache ), + .M00_AXI_AWPROT (mig_awprot ), + .M00_AXI_AWQOS ( ), + .M00_AXI_AWVALID (mig_awvalid ), + .M00_AXI_AWREADY (mig_awready ), + .M00_AXI_WDATA (mig_wdata ), + .M00_AXI_WSTRB (mig_wstrb ), + .M00_AXI_WLAST (mig_wlast ), + .M00_AXI_WVALID (mig_wvalid ), + .M00_AXI_WREADY (mig_wready ), + .M00_AXI_BID (mig_bid ), + .M00_AXI_BRESP (mig_bresp ), + .M00_AXI_BVALID (mig_bvalid ), + .M00_AXI_BREADY (mig_bready ), + .M00_AXI_ARID (mig_arid ), + .M00_AXI_ARADDR (mig_araddr ), + .M00_AXI_ARLEN ({mig_arlen} ), + .M00_AXI_ARSIZE (mig_arsize ), + .M00_AXI_ARBURST (mig_arburst ), + .M00_AXI_ARLOCK (mig_arlock[0:0] ), + .M00_AXI_ARCACHE (mig_arcache ), + .M00_AXI_ARPROT (mig_arprot ), + .M00_AXI_ARQOS ( ), + .M00_AXI_ARVALID (mig_arvalid ), + .M00_AXI_ARREADY (mig_arready ), + .M00_AXI_RID (mig_rid ), + .M00_AXI_RDATA (mig_rdata ), + .M00_AXI_RRESP (mig_rresp ), + .M00_AXI_RLAST (mig_rlast ), + .M00_AXI_RVALID (mig_rvalid ), + .M00_AXI_RREADY (mig_rready ) +); +//ddr3 controller +mig_axi_32 mig_axi ( + // Inouts + .ddr3_dq (ddr3_dq ), + .ddr3_dqs_p (ddr3_dqs_p ), // for X16 parts + .ddr3_dqs_n (ddr3_dqs_n ), // for X16 parts + // Outputs + .ddr3_addr (ddr3_addr ), + .ddr3_ba (ddr3_ba ), + .ddr3_ras_n (ddr3_ras_n ), + .ddr3_cas_n (ddr3_cas_n ), + .ddr3_we_n (ddr3_we_n ), + .ddr3_reset_n (ddr3_reset_n ), + .ddr3_ck_p (ddr3_ck_p ), + .ddr3_ck_n (ddr3_ck_n ), + .ddr3_cke (ddr3_cke ), + .ddr3_dm (ddr3_dm ), + .ddr3_odt (ddr3_odt ), + + .ui_clk (c1_clk0 ), + .ui_clk_sync_rst (c1_rst0 ), + + .sys_clk_i (c1_sys_clk_i ), + .sys_rst (c1_sys_rst_i ), + .init_calib_complete (c1_calib_done ), + .clk_ref_i (c1_clk_ref_i ), + .mmcm_locked ( ), + + .app_sr_active ( ), + .app_ref_ack ( ), + .app_zq_ack ( ), + .app_sr_req (1'b0 ), + .app_ref_req (1'b0 ), + .app_zq_req (1'b0 ), + + .aresetn (ddr_aresetn ), + .s_axi_awid (mig_awid ), + .s_axi_awaddr (mig_awaddr[26:0]), + .s_axi_awlen ({mig_awlen} ), + .s_axi_awsize (mig_awsize ), + .s_axi_awburst (mig_awburst ), + .s_axi_awlock (mig_awlock[0:0] ), + .s_axi_awcache (mig_awcache ), + .s_axi_awprot (mig_awprot ), + .s_axi_awqos (4'b0 ), + .s_axi_awvalid (mig_awvalid ), + .s_axi_awready (mig_awready ), + .s_axi_wdata (mig_wdata ), + .s_axi_wstrb (mig_wstrb ), + .s_axi_wlast (mig_wlast ), + .s_axi_wvalid (mig_wvalid ), + .s_axi_wready (mig_wready ), + .s_axi_bid (mig_bid ), + .s_axi_bresp (mig_bresp ), + .s_axi_bvalid (mig_bvalid ), + .s_axi_bready (mig_bready ), + .s_axi_arid (mig_arid ), + .s_axi_araddr (mig_araddr[26:0]), + .s_axi_arlen ({mig_arlen} ), + .s_axi_arsize (mig_arsize ), + .s_axi_arburst (mig_arburst ), + .s_axi_arlock (mig_arlock[0:0] ), + .s_axi_arcache (mig_arcache ), + .s_axi_arprot (mig_arprot ), + .s_axi_arqos (4'b0 ), + .s_axi_arvalid (mig_arvalid ), + .s_axi_arready (mig_arready ), + .s_axi_rid (mig_rid ), + .s_axi_rdata (mig_rdata ), + .s_axi_rresp (mig_rresp ), + .s_axi_rlast (mig_rlast ), + .s_axi_rvalid (mig_rvalid ), + .s_axi_rready (mig_rready ) +); + +//DMA +dma_master DMA_MASTER0 +( +.clk (aclk ), +.rst_n (aresetn ), +.awid (dma0_awid ), +.awaddr (dma0_awaddr ), +.awlen (dma0_awlen ), +.awsize (dma0_awsize ), +.awburst (dma0_awburst ), +.awlock (dma0_awlock ), +.awcache (dma0_awcache ), +.awprot (dma0_awprot ), +.awvalid (dma0_awvalid ), +.awready (dma0_awready ), +.wid (dma0_wid ), +.wdata (dma0_wdata ), +.wstrb (dma0_wstrb ), +.wlast (dma0_wlast ), +.wvalid (dma0_wvalid ), +.wready (dma0_wready ), +.bid (dma0_bid ), +.bresp (dma0_bresp ), +.bvalid (dma0_bvalid ), +.bready (dma0_bready ), +.arid (dma0_arid ), +.araddr (dma0_araddr ), +.arlen (dma0_arlen ), +.arsize (dma0_arsize ), +.arburst (dma0_arburst ), +.arlock (dma0_arlock ), +.arcache (dma0_arcache ), +.arprot (dma0_arprot ), +.arvalid (dma0_arvalid ), +.arready (dma0_arready ), +.rid (dma0_rid ), +.rdata (dma0_rdata ), +.rresp (dma0_rresp ), +.rlast (dma0_rlast ), +.rvalid (dma0_rvalid ), +.rready (dma0_rready ), + +.dma_int (dma_int ), +.dma_req_in (dma_req ), +.dma_ack_out (dma_ack ), + +.dma_gnt (dma0_gnt ), +.apb_rw (apb_rw_dma0 ), +.apb_psel (apb_psel_dma0 ), +.apb_valid_req (apb_start_dma0 ), +.apb_penable (apb_penable_dma0 ), +.apb_addr (apb_addr_dma0 ), +.apb_wdata (apb_wdata_dma0 ), +.apb_rdata (apb_rdata_dma0 ), + +.order_addr_in (order_addr_in ), +.write_dma_end (write_dma_end ), +.finish_read_order (finish_read_order ) +); + +//AXI2APB +axi2apb_misc APB_DEV +( +.clk (aclk ), +.rst_n (aresetn ), + +.axi_s_awid (apb_s_awid ), +.axi_s_awaddr (apb_s_awaddr ), +.axi_s_awlen (apb_s_awlen ), +.axi_s_awsize (apb_s_awsize ), +.axi_s_awburst (apb_s_awburst ), +.axi_s_awlock (apb_s_awlock ), +.axi_s_awcache (apb_s_awcache ), +.axi_s_awprot (apb_s_awprot ), +.axi_s_awvalid (apb_s_awvalid ), +.axi_s_awready (apb_s_awready ), +.axi_s_wid (apb_s_wid ), +.axi_s_wdata (apb_s_wdata ), +.axi_s_wstrb (apb_s_wstrb ), +.axi_s_wlast (apb_s_wlast ), +.axi_s_wvalid (apb_s_wvalid ), +.axi_s_wready (apb_s_wready ), +.axi_s_bid (apb_s_bid ), +.axi_s_bresp (apb_s_bresp ), +.axi_s_bvalid (apb_s_bvalid ), +.axi_s_bready (apb_s_bready ), +.axi_s_arid (apb_s_arid ), +.axi_s_araddr (apb_s_araddr ), +.axi_s_arlen (apb_s_arlen ), +.axi_s_arsize (apb_s_arsize ), +.axi_s_arburst (apb_s_arburst ), +.axi_s_arlock (apb_s_arlock ), +.axi_s_arcache (apb_s_arcache ), +.axi_s_arprot (apb_s_arprot ), +.axi_s_arvalid (apb_s_arvalid ), +.axi_s_arready (apb_s_arready ), +.axi_s_rid (apb_s_rid ), +.axi_s_rdata (apb_s_rdata ), +.axi_s_rresp (apb_s_rresp ), +.axi_s_rlast (apb_s_rlast ), +.axi_s_rvalid (apb_s_rvalid ), +.axi_s_rready (apb_s_rready ), + +.apb_rw_dma (apb_rw_dma0 ), +.apb_psel_dma (apb_psel_dma0 ), +.apb_enab_dma (apb_penable_dma0 ), +.apb_addr_dma (apb_addr_dma0[19:0]), +.apb_valid_dma (apb_start_dma0 ), +.apb_wdata_dma (apb_wdata_dma0 ), +.apb_rdata_dma (apb_rdata_dma0 ), +.apb_ready_dma ( ), //output, no use +.dma_grant (dma0_gnt ), + +.dma_req_o (dma_req ), +.dma_ack_i (dma_ack ), + +//UART0 +.uart0_txd_i (uart0_txd_i ), +.uart0_txd_o (uart0_txd_o ), +.uart0_txd_oe (uart0_txd_oe ), +.uart0_rxd_i (uart0_rxd_i ), +.uart0_rxd_o (uart0_rxd_o ), +.uart0_rxd_oe (uart0_rxd_oe ), +.uart0_rts_o (uart0_rts_o ), +.uart0_dtr_o (uart0_dtr_o ), +.uart0_cts_i (uart0_cts_i ), +.uart0_dsr_i (uart0_dsr_i ), +.uart0_dcd_i (uart0_dcd_i ), +.uart0_ri_i (uart0_ri_i ), +.uart0_int (uart0_int ), + +.nand_type (2'h2 ), //1Gbit +.nand_cle (nand_cle ), +.nand_ale (nand_ale ), +.nand_rdy (nand_rdy ), +.nand_rd (nand_rd ), +.nand_ce (nand_ce ), +.nand_wr (nand_wr ), +.nand_dat_i (nand_dat_i ), +.nand_dat_o (nand_dat_o ), +.nand_dat_oe (nand_dat_oe ), + +.nand_int (nand_int ) +); +endmodule + diff --git a/resources/soc/rtl/cpu232/龙芯开源处理器gs232源码,目前缺少,请联系龙芯开源获得.txt b/resources/soc/rtl/cpu232/龙芯开源处理器gs232源码,目前缺少,请联系龙芯开源获得.txt new file mode 100644 index 0000000..1c57634 --- /dev/null +++ b/resources/soc/rtl/cpu232/龙芯开源处理器gs232源码,目前缺少,请联系龙芯开源获得.txt @@ -0,0 +1,7 @@ + +1.龙芯开源处理器GS232源码是可以免费获得的。 + +2.但是为了更好地对GS232源码进行版本维护和流通追溯,此处无法直接提供源码。 + +3.高校老师可在龙芯官网上通过开源申请获得GS232源码。 + diff --git a/resources/soc/simu/run/run_func/lib.list b/resources/soc/simu/run/run_func/lib.list new file mode 100644 index 0000000..8d1ff4d --- /dev/null +++ b/resources/soc/simu/run/run_func/lib.list @@ -0,0 +1,82 @@ +../../lib/sram_simu.v +../../lib/func_emul/cell_emul.v +../../lib/glbl.v +../../lib/AND2B1L.v +../../lib/BUFG.v +../../lib/BUFGCE.v +../../lib/BUFGMUX.v +../../lib/BUFPLL_MCB.v +../../lib/DCM_SP.v +../../lib/FDRE.v +../../lib/FDSE.v +../../lib/IBUFG.v +../../lib/INV.v +../../lib/IOBUF.v +../../lib/IOBUFDS.v +../../lib/IODRP2.v +../../lib/IODRP2_MCB.v +../../lib/LUT4.v +../../lib/LUT6.v +../../lib/LUT6_2.v +../../lib/MCB.v +../../lib/MUXCY.v +../../lib/OBUFDS.v +../../lib/OBUFT.v +../../lib/OBUFTDS.v +../../lib/OR2L.v +../../lib/OSERDES2.v +../../lib/PLL_ADV.v +../../lib/PULLDOWN.v +../../lib/PULLUP.v +../../lib/SRLC32E.v +../../lib/XORCY.v +../../lib/BLK_MEM_GEN_V6_2.v +../../lib/BLK_MEM_GEN_V6_1.v +../../lib/mcb_001.vp +../../lib/mcb_002.vp +../../lib/mcb_003.vp +../../lib/mcb_004.vp +../../lib/mcb_005.vp +../../lib/mcb_006.vp +../../lib/mcb_007.vp +../../lib/mcb_008.vp +../../lib/mcb_009.vp +../../lib/mcb_010.vp +../../lib/mcb_011.vp +../../lib/mcb_012.vp +../../lib/mcb_013.vp +../../lib/mcb_014.vp +../../lib/mcb_015.vp +../../lib/mcb_016.vp +../../lib/mcb_017.vp +../../lib/mcb_018.vp +../../lib/mcb_019.vp +../../lib/mcb_020.vp +../../lib/mcb_021.vp +../../lib/mcb_022.vp +../../lib/mcb_023.vp +../../lib/mcb_024.vp +../../lib/mcb_025.vp +../../lib/mcb_026.vp +../../lib/mcb_027.vp +../../lib/mcb_028.vp +../../lib/mcb_029.vp +../../lib/mcb_030.vp +../../lib/mcb_031.vp +../../lib/mcb_032.vp +../../lib/mcb_033.vp +../../lib/mcb_034.vp +../../lib/mcb_035.vp +../../lib/mcb_036.vp +../../lib/mcb_037.vp +../../lib/mcb_038.vp +../../lib/mcb_039.vp +../../lib/mcb_040.vp +../../lib/mcb_041.vp +../../lib/mcb_042.vp +../../lib/mcb_043.vp +../../lib/mcb_044.vp +../../lib/mcb_045.vp +../../lib/mcb_046.vp +../../lib/mcb_047.vp + diff --git a/resources/soc/simu/run/run_func/ncompile b/resources/soc/simu/run/run_func/ncompile new file mode 100644 index 0000000..b04118c --- /dev/null +++ b/resources/soc/simu/run/run_func/ncompile @@ -0,0 +1,3 @@ +#!/bin/bash + +ncverilog -f run.f diff --git a/resources/soc/simu/run/run_func/rtl.list b/resources/soc/simu/run/run_func/rtl.list new file mode 100644 index 0000000..423a71f --- /dev/null +++ b/resources/soc/simu/run/run_func/rtl.list @@ -0,0 +1,117 @@ +../../../rtl/TOP/archlab_sopc_top.v + +../../../rtl/CPU/axi_interface.v +../../../rtl/CPU/godson_addr_module.v +../../../rtl/CPU/godson_alu_module.v +../../../rtl/CPU/godson_bus_module.v +../../../rtl/CPU/godson_cpu_core.v +../../../rtl/CPU/godson_cpu_mid.v +../../../rtl/CPU/godson_dcache_module.v +../../../rtl/CPU/godson_dcr_module.v +../../../rtl/CPU/godson_decoder_module.v +../../../rtl/CPU/godson_dtlb_module.v +../../../rtl/CPU/godson_ejtag_tap_module.v +../../../rtl/CPU/godson_fetch_module.v +../../../rtl/CPU/godson_gr_module.v +../../../rtl/CPU/godson_hb_module.v +../../../rtl/CPU/godson_icache_module.v +../../../rtl/CPU/godson_itlb_module.v +../../../rtl/CPU/godson_memqueue_module.v +../../../rtl/CPU/godson_queue_module.v +../../../rtl/CPU/godson_ram_bist.v +../../../rtl/CPU/godson_rs_module.v +../../../rtl/CPU/godson_tap_buffer_module.v +../../../rtl/CPU/tools.v + +../../../rtl/CPU/sram/sram_128x22.v +../../../rtl/CPU/sram/sram_128x32.v +../../../rtl/CPU/sram/sram_128x64.v +../../../rtl/CPU/sram/sram_32x52bit.v + +../../../rtl/AMBA/axi_mux.v +../../../rtl/AMBA/axi2apb.v + +../../../rtl/MIG/memc_wrapper.v +../../../rtl/MIG/ddr3_3port.v +../../../rtl/MIG/infrastructure.v +../../../rtl/MIG/axi/a_upsizer.v +../../../rtl/MIG/axi/axi_mcb.v +../../../rtl/MIG/axi/axi_mcb_ar_channel.v +../../../rtl/MIG/axi/axi_mcb_aw_channel.v +../../../rtl/MIG/axi/axi_mcb_b_channel.v +../../../rtl/MIG/axi/axi_mcb_cmd_arbiter.v +../../../rtl/MIG/axi/axi_mcb_cmd_fsm.v +../../../rtl/MIG/axi/axi_mcb_cmd_translator.v +../../../rtl/MIG/axi/axi_mcb_incr_cmd.v +../../../rtl/MIG/axi/axi_mcb_r_channel.v +../../../rtl/MIG/axi/axi_mcb_simple_fifo.v +../../../rtl/MIG/axi/axi_mcb_w_channel.v +../../../rtl/MIG/axi/axi_mcb_wrap_cmd.v +../../../rtl/MIG/axi/axi_register_slice.v +../../../rtl/MIG/axi/axi_upsizer.v +../../../rtl/MIG/axi/axic_register_slice.v +../../../rtl/MIG/axi/carry.v +../../../rtl/MIG/axi/carry_and.v +../../../rtl/MIG/axi/carry_latch_and.v +../../../rtl/MIG/axi/carry_latch_or.v +../../../rtl/MIG/axi/carry_or.v +../../../rtl/MIG/axi/command_fifo.v +../../../rtl/MIG/axi/comparator.v +../../../rtl/MIG/axi/comparator_mask.v +../../../rtl/MIG/axi/comparator_mask_static.v +../../../rtl/MIG/axi/comparator_sel.v +../../../rtl/MIG/axi/comparator_sel_mask.v +../../../rtl/MIG/axi/comparator_sel_mask_static.v +../../../rtl/MIG/axi/comparator_sel_static.v +../../../rtl/MIG/axi/comparator_static.v +../../../rtl/MIG/axi/mcb_ui_top_synch.v +../../../rtl/MIG/axi/mux_enc.v +../../../rtl/MIG/axi/r_upsizer.v +../../../rtl/MIG/axi/w_upsizer.v +../../../rtl/MIG/mcb_controller/iodrp_controller.v +../../../rtl/MIG/mcb_controller/iodrp_mcb_controller.v +../../../rtl/MIG/mcb_controller/mcb_raw_wrapper.v +../../../rtl/MIG/mcb_controller/mcb_soft_calibration.v +../../../rtl/MIG/mcb_controller/mcb_soft_calibration_top.v +../../../rtl/MIG/mcb_controller/mcb_ui_top.v + +../../../rtl/APB_DEV/URT/raminfr.v +../../../rtl/APB_DEV/URT/uart_receiver.v +../../../rtl/APB_DEV/URT/uart_regs.v +../../../rtl/APB_DEV/URT/uart_rfifo.v +../../../rtl/APB_DEV/URT/uart_sync_flops.v +../../../rtl/APB_DEV/URT/uart_tfifo.v +../../../rtl/APB_DEV/URT/uart_top.v +../../../rtl/APB_DEV/URT/uart_transmitter.v + +../../../rtl/CONFREG/confreg.v +../../../rtl/SPI/godson_sbridge_spi.v + +../../../rtl/MAC/utility.v +../../../rtl/MAC/ethernet_top.v +../../../rtl/MAC/mac_top.v +../../../rtl/MAC/mac_axi.v +../../../rtl/MAC/mac.v +../../../rtl/MAC/csr.v +../../../rtl/MAC/rc.v +../../../rtl/MAC/rfifo.v +../../../rtl/MAC/rlsm.v +../../../rtl/MAC/tc.v +../../../rtl/MAC/bd.v +../../../rtl/MAC/dma.v +../../../rtl/MAC/rstc.v +../../../rtl/MAC/tfifo.v +../../../rtl/MAC/tlsm.v +../../../rtl/MAC/mac2axi.v +../../../rtl/MAC/maccsr2axi.v +../../../rtl/MAC/macdata2axi.v +../../../rtl/MAC/cam.v +../../../rtl/MAC/dpram_512x32.v + +../../../rtl/DMA/dma.v + +../../../rtl/APB_DEV/apb_dev_top.v +../../../rtl/APB_DEV/apb_mux2.v +../../../rtl/APB_DEV/nand_module.v + +../../../rtl/APB_DEV/NAND/nand.v diff --git a/resources/soc/simu/run/run_func/run.f b/resources/soc/simu/run/run_func/run.f new file mode 100644 index 0000000..a0e96c5 --- /dev/null +++ b/resources/soc/simu/run/run_func/run.f @@ -0,0 +1,28 @@ ++incdir+../../../rtl/TOP ++incdir+../../../rtl/CPU ++incdir+../../../rtl/APB_DEV ++incdir+../../../rtl/APB_DEV/NAND ++incdir+../../../rtl/APB_DEV/URT ++incdir+../../../rtl/SPI ++incdir+../../../rtl/MIG ++incdir+../../../rtl/MAC ++incdir+../../../rtl/AMBA ++incdir+../../../rtl/CONFREG ++incdir+../../testbench ++incdir+../../testbench/vmac ++nclog_ncsim+ncsim.log ++access+rw +-sv +-64bit +-nowarn MRSTAR ++pathpulse ++profile ++define+x1Gb ++define+sg15E ++define+x16 ++define+VIRTUAL_MAC ++define+_DUMPDUMP +-f sys.list +-f rtl.list +-f lib.list + diff --git a/resources/soc/simu/run/run_func/sys.list b/resources/soc/simu/run/run_func/sys.list new file mode 100644 index 0000000..8462747 --- /dev/null +++ b/resources/soc/simu/run/run_func/sys.list @@ -0,0 +1,11 @@ +../../testbench/godson_system.v +../../testbench/MX25L6405D.v +../../testbench/uart_dev.v +../../testbench/ejtag_virtual_host.v +../../testbench/ddr3_model_c1.v +../../testbench/vmac/virtual_mac.v +../../testbench/vmac/mac_top.v +../../testbench/vmac/mac_ram.v +../../testbench/nand_sim.v + + diff --git a/resources/soc/simu/soft/func/Makefile b/resources/soc/simu/soft/func/Makefile new file mode 100644 index 0000000..477a6ae --- /dev/null +++ b/resources/soc/simu/soft/func/Makefile @@ -0,0 +1,48 @@ +TOPDIR = $(shell pwd) + +CROSS_COMPILE = mipsel-linux- +DEBUG = -g +FLAGS = + +CC = $(CROSS_COMPILE)gcc +LD = $(CROSS_COMPILE)ld +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump +AR = $(CROSS_COMPILE)ar + +export TOPDIR AR CC DEBUG FLAGS + +all:test.bin convert + ./convert + $(OBJDUMP) -ald test >test.s + +libtinyc.a: + make -C lib $(TOPDIR)/$@ + +start.o:start.S include/ls1d.h include/asm/mipsregs.h include/asm/regdef.h include/asm/ns16550.h + $(CC) $(DEBUG) $(FLAGS) -mips32 -EL -c -o $@ $< + +nand.o:nand_test.S include/ls1d.h include/asm/mipsregs.h include/asm/regdef.h include/asm/ns16550.h + $(CC) $(DEBUG) $(FLAGS) -mips32 -EL -c -o $@ $< + +main.o:main.c include/*.h + $(CC) $(DEBUG) $(FLAGS) -EL -c -o $@ $< + +%.o:source/%.c include/%.h include/ls1d.h + $(CC) $(DEBUG) $(FLAGS) -EL -c -o $@ $< + +#test_cycle.o myprintf.o +OBJ1 = Interrupt.o lcd.o SystemInit.o Calendar.o key.o battery.o common.o temp_flow.o Infrare.o frame.o MonthData.o isp.o adc.o cmdline.o flash.o dg_rs232.o + +test:start.o nand.o main.o $(OBJ1) libtinyc.a + $(LD) -T test.lds -Ttext 0xBFC00000 -Map test.map start.o nand.o main.o $(OBJ1) -o $@ -L . -ltinyc + #rm -f *.o + +test.bin:test + $(OBJCOPY) --gap-fill=0xff -O binary $< $@ + +clean: + rm -f *.o *.a test test.bin test.map test.s convert flash.vlog + make -C lib clean +convert:convert.c + gcc -o convert convert.c diff --git a/resources/soc/simu/soft/func/config.h b/resources/soc/simu/soft/func/config.h new file mode 100644 index 0000000..31c1864 --- /dev/null +++ b/resources/soc/simu/soft/func/config.h @@ -0,0 +1,179 @@ +#include "include/ls1d.h" +#include "include/SystemInit.h" +#include "include/Calendar.h" +#include "include/lcd.h" +#include "include/key.h" +#include "include/common.h" +#include "include/temp_flow.h" +#include "include/MonthData.h" +#include "include/Infrare.h" +#include "include/frame.h" +#include "include/battery.h" +#include "include/Interrupt.h" +#include "include/xmodem.h" +#include "include/isp.h" +#include "include/cmdline.h" +//#include "myprintf.h" +//#include "test_cycle.h" + +//#include +//#include + +#define DisableWatchDog() PMU_Command &= 0xdfffffff ; +#define EnableWatchDog() PMU_Command |= 0x20000000 ; +#define FeedWatchDog() PMU_CommandW = 0x40000000 ; + +#define NUM 10 +extern _u32 wait[NUM]; +extern _u32 main_flag; +extern _u32 work_mode; +extern _u32 *PMU; +extern _u32 *Sonar; +extern _u32 *Thsens; + +/********************************Defined by user*******************************************************************************************************************/ +#define IR_PWR_ON PMU_GPIO_O |= (1 << 3) //Infrare receiver power on +#define IR_PWR_OFF PMU_GPIO_O &=~(1 << 3) //Infrare receiver power off +#define KEY_OFF 0x10 //when the key is off, the key_bit of gpio_in will be high + +#define STDC_CALIBRATE 200 //default value +#define COUNT_MASK 0xffffff //refer to count reg, PMU +#define COUNT_COMPARE 0X1000000 + +#define LCD_MULTIPLE 100000 //every varible printed in lcd will plus LCD_MULTIPLE, thus the real value should divide LCD_MULTIPLE +#define LCD_LENGTH 10 //the lcd buf will divide into LCD_LENGTH +#define LCD_NUM_LENGTH 8 //the numbers of number that the lcd can print + +#define CJT188_DI_SEQ 1 //it will change the sequence of DI0 and DI1 +#define CJT188_DEF_READ 0x0e +#define CJT188_DEF_WRITE 0x1e + +#define UART1_INT 0 //enable uart1_rx_int when a key comes, then disable it when received a right frame + + +/***********************************xmodem Option*****************************************************************************************************************/ +#define FLASH_BLOCK_SIZE 256 +#define FLASH_ERASE_START 0xbfc00000 +#define FLASH_ERASE_END 0xbfc0efff //60kB + +/********************************Info flash Option****************************************************************************************************************/ +#define INFO_FLASH_START 0xbfc0fe00 +#define AUTO_SAVE_ADDR 0xbfc0fd00 + +/********************************Pipe Option**********************************************************************************************************************/ +#define SOUND_PATH 0.072f //m +#define COS_RESULT 1 +#define K_COEFFICIENT 0.5f +#define DIAMETER 0.020f //m +#define PI 3.1415926f +#define CONST PI/4 + +/********************************Compile Option**********************************************************************************************************************/ +#define ISP 1 //ISP module +#define LS1D_FPGA 1 //Choose code for fpga_board or chip_flash. + +#define AD_MODULE 0 +#define ADC_MODULE 0 +#define LCD_MODULE 0 +#define TDC_TEMP_MODULE 0 +#define TDC_FLOW_MODULE 0 +#define MONTHDATA_MODULE 0 +#define KEY_MODULE 0 +#define MBUS_MODULE 0 +#define INFRARE_MODULE 0 +#define CALENDAR_MODULE 0 //need TIMER_MODULE and LCD_MODULE +#define FRAME_MODULE 0 +#define TIMER_MODULE 0 + + +/********************************Debug Option/Print*******************************************************************************************************************/ +#define PRINT 1 //only print necessory information +#if PRINT +#define AD_TEST 0 //need TIMER_MODULE for 2s delay +#define ADC_TEST 0 +#define LCD_TEST 0 //need TIMER_MODULE for 1s delay +#define TEMP_TEST 0 +#define FLOW_TEST 0 +#define MONTHDATA_TEST 0 //use lcd A3 +#define KEY_TEST 0 +#define MBUS_TEST 0 +#define INFRARE_TEST 0 +#define CALENDAR_TEST 0 +#define FRAME_TEST 0 +#define RES_TEST 0 +#define TIMER_TEST 0 +#endif + +#if PRINT +#define DEBUG 1 //print information in detail +#endif + +#if DEBUG +#define BUG 1 +#define debug(fmt,args...) printf(fmt ,##args); +#define debugX(level,fmt,args...) if(DEBUG>=level) printf(fmt,##args); +#else +#define BUG 0 +#define debug(fmt,args...) +#define debugX(level,fmt,args...) +#endif + +#if BUG +#define BUG() printf("BUG: failure at %s:%d in %s()!\n", __FILE__, __LINE__, __FUNCTION__); +#define BUG_ON(condition) if(condition) BUG(); +#endif /* BUG */ + + +/*************************************main_flag***********************************************************************************************************************/ +//unsigned char main_flag0; +#define test_bit 0x80 //͵ѹ +#define temp_bit 0x40 +#define flow_bit 0x20 +#define month_bit 0x10 +#define key_bit 0x8 +#define lcd_bit 0x4 +#define mbus_bit 0x2 +#define infrare_bit 0x1 +//unsigned char main_flag1; +#define state_bit 0x8000 //gp21״̬, '0'Ϊ'1'Ϊ쳣 +#define lowV1_bit 0x4000 //͵ѹ1,ÿ2 +#define lowV2_bit 0x2000 //͵ѹ2,ÿ7142128賿3'1' +#define time_bit 0x1000 //ʱ +#define long_key 0x800 // +#define month_flag 0x400 //½ʱǷΪĬʱ䣬ĬʱΪÿµף'1' +#define A3_delay 0x200 //A3˵3Զл +#define wait_halfsec 0x100 //ȴ0.5 +//unsigned char main_flag2; +#define wait_3sec 0x800000 //3 +#define wait_8sec 0x400000 //8 +#define wait_9sec 0x200000 //9 +#define wait_10sec 0x100000 //10 +#define wait_1min 0x80000 //1 +#define wait_2min 0x40000 //2 +#define wait_16min 0x20000 //16 +#define wait_2hour 0x10000 //2Сʱ +//unsigned char main_flag3; +#define rx_bit 0x80000000 //usartյһ֡ +#define infrare_flag 0x40000000 //״̬'0'ر'1' +#define lowV_flag 0x20000000 //͵ѹ״̬Ϊ'1' +#define wait_oneday 0x10000000 //͵ѹ⣬ȴһ +#define power_on 0x8000000 //ϵ +#define res_valid 0x4000000 //RES_VALID +#define per_timer 0x2000000 + +/********************************************************************************************************************************************************************/ + +/*************************************work_mode***********************************************************************************************************************/ +#define MODE_0 0 +#define MODE_1 1 +#define MODE_2 2 +#define MODE_3 3 +#define MODE_4 4 +#define MODE_5 5 +#define MODE_6 6 +#define MODE_7 7 +#define MODE_8 8 +#define MODE_9 9 + +/********************************************************************************************************************************************************************/ + diff --git a/resources/soc/simu/soft/func/convert.c b/resources/soc/simu/soft/func/convert.c new file mode 100644 index 0000000..0e66323 --- /dev/null +++ b/resources/soc/simu/soft/func/convert.c @@ -0,0 +1,29 @@ +#include +#include + +int main(void) +{ + FILE *in; + FILE *out; + FILE *out0, *out1, *out2, *out3; + FILE *out4, *out5, *out6, *out7; + + int i,j,k; + unsigned char mem[32]; + + in = fopen("test.bin", "rb"); + out = fopen("flash.vlog", "w"); + + fprintf(out, " @00\n"); + while(!feof(in)) { + if(fread(mem,1,4,in)!=4) { + fprintf(out, " %02x %02x %02x %02x\n", mem[0], mem[1], mem[2], mem[3]); + break; + } + fprintf(out, " %02x %02x %02x %02x\n", mem[0], mem[1], mem[2],mem[3]); + } + fclose(in); + fclose(out); + + return 0; +} diff --git a/resources/soc/simu/soft/func/include/Calendar.h b/resources/soc/simu/soft/func/include/Calendar.h new file mode 100644 index 0000000..f51c62d --- /dev/null +++ b/resources/soc/simu/soft/func/include/Calendar.h @@ -0,0 +1,12 @@ +struct Date_Time{ + _u32 Year; + _u32 Month; + _u32 Day; + _u32 Hour; + _u32 Minute; + _u32 Second; +}; + +void calendar(struct Date_Time *Date_and_Time); +//void calendar(struct Date_Time *Date_and_Time, _u32 lcdmode); +void DateInit(struct Date_Time *Date_and_Time); diff --git a/resources/soc/simu/soft/func/include/Infrare.h b/resources/soc/simu/soft/func/include/Infrare.h new file mode 100644 index 0000000..775975a --- /dev/null +++ b/resources/soc/simu/soft/func/include/Infrare.h @@ -0,0 +1 @@ +void Infrare(void); diff --git a/resources/soc/simu/soft/func/include/Interrupt.h b/resources/soc/simu/soft/func/include/Interrupt.h new file mode 100644 index 0000000..f605aea --- /dev/null +++ b/resources/soc/simu/soft/func/include/Interrupt.h @@ -0,0 +1,9 @@ +void TIMER_INT(); +void KEY_INT(); +void BAT_FAIL(); +void RES_VALID(); +void INTC(); +void Ring(); +void Per_timer(struct Data *Lcd_data); + +void Interrupt_Init(); diff --git a/resources/soc/simu/soft/func/include/MonthData.h b/resources/soc/simu/soft/func/include/MonthData.h new file mode 100644 index 0000000..a4ab8f4 --- /dev/null +++ b/resources/soc/simu/soft/func/include/MonthData.h @@ -0,0 +1,23 @@ +void MonthData(struct Date_Time *Date_and_Time, struct Data *Lcd_data); +void Flash_Read_Info(); +void Flash_Write_Test(); +extern _u32 Last_month_num; + +#define CHRWRITE 0 +#define BLKWRITE 1 +struct Record_0{ + _u32 Date; /*ϢDate = Year*1000 + Month*10, 2011.10,Date = 20110100 */ + _u32 TotalHeat; //xxxxxx.xx, plus 100 + _u32 TotalFlow; //xxxxxx.xx, plus 100 +}; + +struct Record_1{ + _u32 Date; /*ϢDate = Year*10000 + Month*100 + Day, 2011.10.12,Date = 20111012 */ + _u32 Time; /*ʱϢTime = Hour*100 + Minute, 930Time = 930 */ + _fp32 TotalHeat; + _fp32 TotalFlow; + _u32 WorkTime; + _u32 ErrTime; +}; +extern struct Record_1 Latest_Record; + diff --git a/resources/soc/simu/soft/func/include/SystemInit.h b/resources/soc/simu/soft/func/include/SystemInit.h new file mode 100644 index 0000000..7735907 --- /dev/null +++ b/resources/soc/simu/soft/func/include/SystemInit.h @@ -0,0 +1,4 @@ +void Uart0_Init(); +void SystemInit(); +void PowerDetec(); +//void ReLoad(); diff --git a/resources/soc/simu/soft/func/include/adc.h b/resources/soc/simu/soft/func/include/adc.h new file mode 100644 index 0000000..93823ec --- /dev/null +++ b/resources/soc/simu/soft/func/include/adc.h @@ -0,0 +1,2 @@ + +float BatteryMeasure(void) diff --git a/resources/soc/simu/soft/func/include/asm/interrupt.h b/resources/soc/simu/soft/func/include/asm/interrupt.h new file mode 100644 index 0000000..28f034f --- /dev/null +++ b/resources/soc/simu/soft/func/include/asm/interrupt.h @@ -0,0 +1,287 @@ +#if 1 /*It's not a good method. Don't use it!*/ +#define SAVE_REGS \ + li k1, SRAM_BASEADDR+0x1000; \ + sw $0, 0x0(k1); \ + sw $1, 0x4(k1); \ + sw $2, 0x8(k1); \ + sw $3, 0xc(k1); \ + sw $4, 0x10(k1); \ + sw $5, 0x14(k1); \ + sw $6, 0x18(k1); \ + sw $7, 0x1c(k1); \ + sw $8, 0x20(k1); \ + sw $9, 0x24(k1); \ + sw $10, 0x28(k1); \ + sw $11, 0x2c(k1); \ + sw $12, 0x30(k1); \ + sw $13, 0x34(k1); \ + sw $14, 0x38(k1); \ + sw $15, 0x3c(k1); \ + sw $16, 0x40(k1); \ + sw $17, 0x44(k1); \ + sw $18, 0x48(k1); \ + sw $19, 0x4c(k1); \ + sw $20, 0x50(k1); \ + sw $21, 0x54(k1); \ + sw $22, 0x58(k1); \ + sw $23, 0x5c(k1); \ + sw $24, 0x60(k1); \ + sw $25, 0x64(k1); \ + sw $26, 0x68(k1); \ + sw $27, 0x6c(k1); \ + sw $28, 0x70(k1); \ + sw $29, 0x74(k1); \ + sw $30, 0x78(k1); + //sw $31, 0x7c(k1) + +#define LOAD_REGS \ + li k1, SRAM_BASEADDR+0x1000; \ + lw $0, 0x0(k1); \ + lw $1, 0x4(k1); \ + lw $2, 0x8(k1); \ + lw $3, 0xc(k1); \ + lw $4, 0x10(k1); \ + lw $5, 0x14(k1); \ + lw $6, 0x18(k1); \ + lw $7, 0x1c(k1); \ + lw $8, 0x20(k1); \ + lw $9, 0x24(k1); \ + lw $10, 0x28(k1); \ + lw $11, 0x2c(k1); \ + lw $12, 0x30(k1); \ + lw $13, 0x34(k1); \ + lw $14, 0x38(k1); \ + lw $15, 0x3c(k1); \ + lw $16, 0x40(k1); \ + lw $17, 0x44(k1); \ + lw $18, 0x48(k1); \ + lw $19, 0x4c(k1); \ + lw $20, 0x50(k1); \ + lw $21, 0x54(k1); \ + lw $22, 0x58(k1); \ + lw $23, 0x5c(k1); \ + lw $24, 0x60(k1); \ + lw $25, 0x64(k1); \ + lw $26, 0x68(k1); \ + lw $27, 0x6c(k1); \ + lw $28, 0x70(k1); \ + lw $29, 0x74(k1); \ + lw $30, 0x78(k1); \ + //lw $26, 0x7c(k1); \ + //sw $26, 0x10($30); + //lw $31, 0x7c(k1) +#endif + +/***********************************method 1*************************************/ +#if 0 +#define SAVE_ALL \ + addi sp, -4; \ + sw $0, 0x0(sp); \ + addi sp, -4; \ + sw $1, 0x0(sp); \ + addi sp, -4; \ + sw $2, 0x0(sp); \ + addi sp, -4; \ + sw $3, 0x0(sp); \ + addi sp, -4; \ + sw $4, 0x0(sp); \ + addi sp, -4; \ + sw $5, 0x0(sp); \ + addi sp, -4; \ + sw $6, 0x0(sp); \ + addi sp, -4; \ + sw $7, 0x0(sp); \ + addi sp, -4; \ + sw $8, 0x0(sp); \ + addi sp, -4; \ + sw $9, 0x0(sp); \ + addi sp, -4; \ + sw $10, 0x0(sp); \ + addi sp, -4; \ + sw $11, 0x0(sp); \ + addi sp, -4; \ + sw $12, 0x0(sp); \ + addi sp, -4; \ + sw $13, 0x0(sp); \ + addi sp, -4; \ + sw $14, 0x0(sp); \ + addi sp, -4; \ + sw $15, 0x0(sp); \ + addi sp, -4; \ + sw $16, 0x0(sp); \ + addi sp, -4; \ + sw $17, 0x0(sp); \ + addi sp, -4; \ + sw $18, 0x0(sp); \ + addi sp, -4; \ + sw $19, 0x0(sp); \ + addi sp, -4; \ + sw $20, 0x0(sp); \ + addi sp, -4; \ + sw $21, 0x0(sp); \ + addi sp, -4; \ + sw $22, 0x0(sp); \ + addi sp, -4; \ + sw $23, 0x0(sp); \ + addi sp, -4; \ + sw $24, 0x0(sp); \ + addi sp, -4; \ + sw $25, 0x0(sp); \ + addi sp, -4; \ + sw $26, 0x0(sp); \ + addi sp, -4; \ + sw $27, 0x0(sp); \ + addi sp, -4; \ + sw $28, 0x0(sp); \ + addi sp, -4; \ + sw $29, 0x0(sp); \ + addi sp, -4; \ + sw $30, 0x0(sp); \ + addi sp, -4; \ + sw $31, 0x0(sp); \ + addi sp, -4 + + +#define LOAD_ALL \ + addi sp, 4; \ + lw $31, 0x0(sp); \ + addi sp, 4; \ + lw $30, 0x0(sp); \ + addi sp, 4; \ + lw $29, 0x0(sp); \ + addi sp, 4; \ + lw $28, 0x0(sp); \ + addi sp, 4; \ + lw $27, 0x0(sp); \ + addi sp, 4; \ + lw $26, 0x0(sp); \ + addi sp, 4; \ + lw $25, 0x0(sp); \ + addi sp, 4; \ + lw $24, 0x0(sp); \ + addi sp, 4; \ + lw $23, 0x0(sp); \ + addi sp, 4; \ + lw $22, 0x0(sp); \ + addi sp, 4; \ + lw $21, 0x0(sp); \ + addi sp, 4; \ + lw $20, 0x0(sp); \ + addi sp, 4; \ + lw $19, 0x0(sp); \ + addi sp, 4; \ + lw $18, 0x0(sp); \ + addi sp, 4; \ + lw $17, 0x0(sp); \ + addi sp, 4; \ + lw $16, 0x0(sp); \ + addi sp, 4; \ + lw $15, 0x0(sp); \ + addi sp, 4; \ + lw $14, 0x0(sp); \ + addi sp, 4; \ + lw $13, 0x0(sp); \ + addi sp, 4; \ + lw $12, 0x0(sp); \ + addi sp, 4; \ + lw $11, 0x0(sp); \ + addi sp, 4; \ + lw $10, 0x0(sp); \ + addi sp, 4; \ + lw $9, 0x0(sp); \ + addi sp, 4; \ + lw $8, 0x0(sp); \ + addi sp, 4; \ + lw $7, 0x0(sp); \ + addi sp, 4; \ + lw $6, 0x0(sp); \ + addi sp, 4; \ + lw $5, 0x0(sp); \ + addi sp, 4; \ + lw $4, 0x0(sp); \ + addi sp, 4; \ + lw $3, 0x0(sp); \ + addi sp, 4; \ + lw $2, 0x0(sp); \ + addi sp, 4; \ + lw $1, 0x0(sp); \ + addi sp, 4; \ + lw $0, 0x0(sp); \ + addi sp, 4 +#endif +/****************************************************************************/ + +/*************************************method 2***********************************/ +#if 1 +#define SAVE_ALL \ + addi sp, -132; \ + sw $0, 0x80(sp); \ + sw $1, 0x7c(sp); \ + sw $2, 0x78(sp); \ + sw $3, 0x74(sp); \ + sw $4, 0x70(sp); \ + sw $5, 0x6c(sp); \ + sw $6, 0x68(sp); \ + sw $7, 0x64(sp); \ + sw $8, 0x60(sp); \ + sw $9, 0x5c(sp); \ + sw $10, 0x58(sp); \ + sw $11, 0x54(sp); \ + sw $12, 0x50(sp); \ + sw $13, 0x4c(sp); \ + sw $14, 0x48(sp); \ + sw $15, 0x44(sp); \ + sw $16, 0x40(sp); \ + sw $17, 0x3c(sp); \ + sw $18, 0x38(sp); \ + sw $19, 0x34(sp); \ + sw $20, 0x30(sp); \ + sw $21, 0x2c(sp); \ + sw $22, 0x28(sp); \ + sw $23, 0x24(sp); \ + sw $24, 0x20(sp); \ + sw $25, 0x1c(sp); \ + sw $26, 0x18(sp); \ + sw $27, 0x14(sp); \ + sw $28, 0x10(sp); \ + sw $29, 0xc(sp); \ + sw $30, 0x8(sp); \ + sw $31, 0x4(sp) + + +#define LOAD_ALL \ + lw $0, 0x80(sp); \ + lw $1, 0x7c(sp); \ + lw $2, 0x78(sp); \ + lw $3, 0x74(sp); \ + lw $4, 0x70(sp); \ + lw $5, 0x6c(sp); \ + lw $6, 0x68(sp); \ + lw $7, 0x64(sp); \ + lw $8, 0x60(sp); \ + lw $9, 0x5c(sp); \ + lw $10, 0x58(sp); \ + lw $11, 0x54(sp); \ + lw $12, 0x50(sp); \ + lw $13, 0x4c(sp); \ + lw $14, 0x48(sp); \ + lw $15, 0x44(sp); \ + lw $16, 0x40(sp); \ + lw $17, 0x3c(sp); \ + lw $18, 0x38(sp); \ + lw $19, 0x34(sp); \ + lw $20, 0x30(sp); \ + lw $21, 0x2c(sp); \ + lw $22, 0x28(sp); \ + lw $23, 0x24(sp); \ + lw $24, 0x20(sp); \ + lw $25, 0x1c(sp); \ + lw $26, 0x18(sp); \ + lw $27, 0x14(sp); \ + lw $28, 0x10(sp); \ + lw $29, 0xc(sp); \ + lw $30, 0x8(sp); \ + lw $31, 0x4(sp); \ + addi sp, 132 +#endif +/****************************************************************************/ diff --git a/resources/soc/simu/soft/func/include/asm/mipsregs.h b/resources/soc/simu/soft/func/include/asm/mipsregs.h new file mode 100644 index 0000000..6c07b12 --- /dev/null +++ b/resources/soc/simu/soft/func/include/asm/mipsregs.h @@ -0,0 +1,38 @@ +/* + * Coprocessor 0 register names + */ +#define CP0_INDEX $0 +#define CP0_RANDOM $1 +#define CP0_ENTRYLO0 $2 +#define CP0_ENTRYLO1 $3 +#define CP0_CONF $3 +#define CP0_CONTEXT $4 +#define CP0_PAGEMASK $5 +#define CP0_WIRED $6 +#define CP0_INFO $7 +#define CP0_BADVADDR $8 +#define CP0_COUNT $9 +#define CP0_ENTRYHI $10 +#define CP0_COMPARE $11 +#define CP0_STATUS $12 +#define CP0_CAUSE $13 +#define CP0_EPC $14 +#define CP0_PRID $15 +#define CP0_CONFIG $16 +#define CP0_LLADDR $17 +#define CP0_WATCHLO $18 +#define CP0_WATCHHI $19 +#define CP0_XCONTEXT $20 +#define CP0_FRAMEMASK $21 +#define CP0_DIAGNOSTIC $22 +#define CP0_DEBUG $23 +#define CP0_DEPC $24 +#define CP0_PERFORMANCE $25 +#define CP0_ECC $26 +#define CP0_CACHEERR $27 +#define CP0_TAGLO $28 +#define CP0_TAGHI $29 +#define CP0_ERROREPC $30 +#define CP0_DESAVE $31 + + diff --git a/resources/soc/simu/soft/func/include/asm/ns16550.h b/resources/soc/simu/soft/func/include/asm/ns16550.h new file mode 100644 index 0000000..ce32524 --- /dev/null +++ b/resources/soc/simu/soft/func/include/asm/ns16550.h @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2009 yanhua + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2, or (at + * your option) any later version. + */ + +#ifdef CONFIG_CPU_UART +//#define COMMON_COM_BASE_ADDR 0xbff003f8 +#define COMMON_COM_BASE_ADDR 0xbfd00000 +#define NS16550HZ 3686400 +#else +#define COMMON_COM_BASE_ADDR 0xbfd003f8 +#define NS16550HZ 1843200 +#endif + +#define CONS_BAUD B115200 +/* + * NS16550 UART registers + */ + +#define NS16550_CHANA PHYS_TO_K1(UART0_BASE) +#define NS16550_CHANB PHYS_TO_K1(UART1_BASE) + +/* + * Standard speeds, make these available for start.S et al. + */ +#define B0 0 +#define B50 50 +#define B75 75 +#define B110 110 +#define B134 134 +#define B150 150 +#define B200 200 +#define B300 300 +#define B600 600 +#define B1200 1200 +#define B1800 1800 +#define B2400 2400 +#define B4800 4800 +#define B9600 9600 +#define B19200 19200 +#define B38400 38400 +#define B7200 7200 +#define B14400 14400 +#define B28800 28800 +#define B57600 57600 +#define B76800 76800 +#define B115200 115200 +#define B230400 230400 + +#ifndef NSREG +#define NSREG(x) x +#endif + +#define NS16550_DATA 0 +#define NS16550_IER 1 +#define NS16550_IIR 2 +#define NS16550_FIFO 2 +#define NS16550_CFCR 3 +#define NS16550_MCR 4 +#define NS16550_LSR 5 +#define NS16550_MSR 6 +#define NS16550_SCR 7 + + +/* interrupt enable register */ +#define IER_ERXRDY 0x1 /* int on rx ready */ +#define IER_ETXRDY 0x2 /* int on tx ready */ +#define IER_ERLS 0x4 /* int on line status change */ +#define IER_EMSC 0x8 /* int on modem status change */ + +/* interrupt identification register */ +#define IIR_IMASK 0xf /* mask */ +#define IIR_RXTOUT 0xc /* receive timeout */ +#define IIR_RLS 0x6 /* receive line status */ +#define IIR_RXRDY 0x4 /* receive ready */ +#define IIR_TXRDY 0x2 /* transmit ready */ +#define IIR_NOPEND 0x1 /* nothing */ +#define IIR_MLSC 0x0 /* modem status */ +#define IIR_FIFO_MASK 0xc0 /* set if FIFOs are enabled */ + +/* fifo control register */ +#define FIFO_ENABLE 0x01 /* enable fifo */ +#define FIFO_RCV_RST 0x02 /* reset receive fifo */ +#define FIFO_XMT_RST 0x04 /* reset transmit fifo */ +#define FIFO_DMA_MODE 0x08 /* enable dma mode */ +#define FIFO_TRIGGER_1 0x00 /* trigger at 1 char */ +#define FIFO_TRIGGER_4 0x40 /* trigger at 4 chars */ +#define FIFO_TRIGGER_8 0x80 /* trigger at 8 chars */ +#define FIFO_TRIGGER_14 0xc0 /* trigger at 14 chars */ + +/* character format control register */ +#define CFCR_DLAB 0x80 /* divisor latch */ +#define CFCR_SBREAK 0x40 /* send break */ +#define CFCR_PZERO 0x30 /* zero parity */ +#define CFCR_PONE 0x20 /* one parity */ +#define CFCR_PEVEN 0x10 /* even parity */ +#define CFCR_PODD 0x00 /* odd parity */ +#define CFCR_PENAB 0x08 /* parity enable */ +#define CFCR_STOPB 0x04 /* 2 stop bits */ +#define CFCR_8BITS 0x03 /* 8 data bits */ +#define CFCR_7BITS 0x02 /* 7 data bits */ +#define CFCR_6BITS 0x01 /* 6 data bits */ +#define CFCR_5BITS 0x00 /* 5 data bits */ + +/* modem control register */ +#define MCR_LOOPBACK 0x10 /* loopback */ +#define MCR_IENABLE 0x08 /* output 2 = int enable */ +#define MCR_DRS 0x04 /* output 1 = xxx */ +#define MCR_RTS 0x02 /* enable RTS */ +#define MCR_DTR 0x01 /* enable DTR */ + +/* line status register */ +#define LSR_RCV_FIFO 0x80 /* error in receive fifo */ +#define LSR_TSRE 0x40 /* transmitter empty */ +#define LSR_TXRDY 0x20 /* transmitter ready */ +#define LSR_BI 0x10 /* break detected */ +#define LSR_FE 0x08 /* framing error */ +#define LSR_PE 0x04 /* parity error */ +#define LSR_OE 0x02 /* overrun error */ +#define LSR_RXRDY 0x01 /* receiver ready */ +#define LSR_RCV_MASK 0x1f + +/* modem status register */ +#define MSR_DCD 0x80 /* DCD active */ +#define MSR_RI 0x40 /* RI active */ +#define MSR_DSR 0x20 /* DSR active */ +#define MSR_CTS 0x10 /* CTS active */ +#define MSR_DDCD 0x08 /* DCD changed */ +#define MSR_TERI 0x04 /* RI changed */ +#define MSR_DDSR 0x02 /* DSR changed */ +#define MSR_DCTS 0x01 /* CTS changed */ diff --git a/resources/soc/simu/soft/func/include/asm/regdef.h b/resources/soc/simu/soft/func/include/asm/regdef.h new file mode 100644 index 0000000..570511e --- /dev/null +++ b/resources/soc/simu/soft/func/include/asm/regdef.h @@ -0,0 +1,39 @@ +/* + * Symbolic register names for 32 bit ABI + */ +#define zero $0 /* wired zero */ +#define AT $1 /* assembler temp - uppercase because of ".set at" */ +#define v0 $2 /* return value */ +#define v1 $3 +#define a0 $4 /* argument registers */ +#define a1 $5 +#define a2 $6 +#define a3 $7 +#define t0 $8 /* caller saved */ +#define t1 $9 +#define t2 $10 +#define t3 $11 +#define t4 $12 +#define t5 $13 +#define t6 $14 +#define t7 $15 +#define s0 $16 /* callee saved */ +#define s1 $17 +#define s2 $18 +#define s3 $19 +#define s4 $20 +#define s5 $21 +#define s6 $22 +#define s7 $23 +#define t8 $24 /* caller saved */ +#define t9 $25 +#define jp $25 /* PIC jump register */ +#define k0 $26 /* kernel scratch */ +#define k1 $27 +#define gp $28 /* global pointer */ +#define sp $29 /* stack pointer */ +#define fp $30 /* frame pointer */ +#define s8 $30 /* same like fp! */ +#define ra $31 /* return address */ + + diff --git a/resources/soc/simu/soft/func/include/battery.h b/resources/soc/simu/soft/func/include/battery.h new file mode 100644 index 0000000..4e54880 --- /dev/null +++ b/resources/soc/simu/soft/func/include/battery.h @@ -0,0 +1,4 @@ + +void ADC_Init(void); +void BatteryTest1(); +void BatteryTest2(); diff --git a/resources/soc/simu/soft/func/include/cmdline.h b/resources/soc/simu/soft/func/include/cmdline.h new file mode 100644 index 0000000..b8bfb0f --- /dev/null +++ b/resources/soc/simu/soft/func/include/cmdline.h @@ -0,0 +1,9 @@ + +int help(int argc, char argv[][30]); +int m4(int argc, char argv[][30]); +int m1(int argc, char argv[][30]); +int d4(int argc, char argv[][30]); +int d1(int argc, char argv[][30]); +unsigned int str2num(char str[30]); + +int cmdline(void); diff --git a/resources/soc/simu/soft/func/include/common.h b/resources/soc/simu/soft/func/include/common.h new file mode 100644 index 0000000..cb305d7 --- /dev/null +++ b/resources/soc/simu/soft/func/include/common.h @@ -0,0 +1,5 @@ + +_fp32 bubble_sort(_fp32 *delta, _s32 len); +void UintToBcd(_u32 dat, _u8 *bcd_buf); +void BcdToUint(_u8 *bcd_buf, _u32 dat); +_s32 printf_float(_fp32 data); diff --git a/resources/soc/simu/soft/func/include/dg_rs232.h b/resources/soc/simu/soft/func/include/dg_rs232.h new file mode 100644 index 0000000..3794f9e --- /dev/null +++ b/resources/soc/simu/soft/func/include/dg_rs232.h @@ -0,0 +1 @@ +int dg_ctrl(int argc, char argv[][30]); diff --git a/resources/soc/simu/soft/func/include/flash.h b/resources/soc/simu/soft/func/include/flash.h new file mode 100644 index 0000000..0b0efb5 --- /dev/null +++ b/resources/soc/simu/soft/func/include/flash.h @@ -0,0 +1,6 @@ +// CONFIDENTIAL + +int verif(int argc, char argv[][30]); +int set_pe_time_mode(int argc, char argv[][30]); +int flash_tk(int argc, char argv[][30]); +int flash_accg(int argc, char argv[][30]); diff --git a/resources/soc/simu/soft/func/include/frame.h b/resources/soc/simu/soft/func/include/frame.h new file mode 100644 index 0000000..022a4e4 --- /dev/null +++ b/resources/soc/simu/soft/func/include/frame.h @@ -0,0 +1,43 @@ + +#define ERROR 1 +#define DATA_LENGTH 100 + +extern _u32 RX_IndexW; +void IrSend(_u8 *str); +void uart_tx(); +void uart_rx(); +void Frame_exe(struct Date_Time *Date_and_Time, struct Data *Lcd_data); + +union uint_uchar{ + _u32 i_value; + _u8 c_value[4]; +}; + +/*-----------------Эֶ-----------------*/ +struct FrameFormat{ + _u8 HeadCode; + _u8 TypeCode; + _u8 Address[7]; + _u8 CtrlCode; + _u8 DataLen; + _u8 DI0,DI1,SER; + _u8 Data[DATA_LENGTH]; + _u8 CheckSum; + _u8 TailCode; +}; + +/****************д*****************/ +struct ModifyData{ + _u8 seg; //κ + _u32 flowpoint; //㣬ʹʱҪ10xxxxx.x + _u8 danwei; //λ + _u32 flowdata; //׼ݣʹʱҪ1000xxx.xxx + _u32 rcode; //ȵ + _u32 temp; //궨¶ֵ + _u32 rdata; //ȵֵʹʱҪ100xxxx.xx + _u32 tempmodify; //¶ϵʹʱҪ100000x.xxxxx +}; + + + + diff --git a/resources/soc/simu/soft/func/include/isp.h b/resources/soc/simu/soft/func/include/isp.h new file mode 100644 index 0000000..8d3d26a --- /dev/null +++ b/resources/soc/simu/soft/func/include/isp.h @@ -0,0 +1,10 @@ +void tgt_putchar(_u8 chr); +_u8 tgt_getchar(); +_u8 tgt_testchar(); +_u32 now(); + +void Flash_Erase(_u32 addr); +_u32 Flash_Write(_u32 addr, _u32 *data, _u32 num); +void spiflash_erase(_u32 addr_start, _u32 addr_end); +void spiflash_write(_u32 addr_w, _u32 addr_r, _u32 length); + diff --git a/resources/soc/simu/soft/func/include/key.h b/resources/soc/simu/soft/func/include/key.h new file mode 100644 index 0000000..19a20bd --- /dev/null +++ b/resources/soc/simu/soft/func/include/key.h @@ -0,0 +1 @@ +void Key(struct Data *Lcd_data); diff --git a/resources/soc/simu/soft/func/include/lcd.h b/resources/soc/simu/soft/func/include/lcd.h new file mode 100644 index 0000000..515b77a --- /dev/null +++ b/resources/soc/simu/soft/func/include/lcd.h @@ -0,0 +1,132 @@ +/************************************************************************** +*************************************************************************** + Notice: Some variable of Lcd_data = real_value * LCD_MULTIPLE +*************************************************************************** +**************************************************************************/ +struct Data{ + _fp32 total_heat; //ۼ, plus LCD_MULTIPLE + _fp32 heat; //ȹ, plus LCD_MULTIPLE + _fp32 temp1; //ˮ¶, plus LCD_MULTIPLE + _fp32 temp2; //ˮ¶, plus LCD_MULTIPLE + _fp32 temp0; //², plus LCD_MULTIPLE + _fp32 total_flow; //ۼ, plus LCD_MULTIPLE + _fp32 flow; //˲ʱ, plus LCD_MULTIPLE + _u32 total_time; //ʱ + _u32 alarm_time; //ʱ + _u32 date; // + _u32 time; //ʱ + _u32 usercode; + _fp32 version; + _u32 history; + _u32 lcdmode; //A1_1; + _u32 auto_caculate; +}; +void LcdDisplay(struct Date_Time *Date_and_Time, struct Data *Lcd_data); + +//---------------A1˵------------- +#define A1 1 +#define A1_0 10 //ʾA1 + +#define A1_1 11 +#define A1_1_0 (0x08+0x04) //'ۻ ' +#define A1_1_1 (0x10+0x20) //'KW*h' + +#define A1_2 12 //һλС +#define A1_2_0 (0x10) //' ' +#define A1_2_1 (0x00) // + +#define A1_3 13 //'T T' һλС +#define A1_3_0 (0x20) //'T' +#define A1_3_1 (0x04) //'`C' + +#define A1_4 14 //λС +#define A1_4_0 (0x02) //'² ' +#define A1_4_1 (0x04) //'`C' + +#define A1_5 15 //λС +#define A1_5_0 (0x08+0x01) //'ۻ' +#define A1_5_1 (0x02) //'m3' + +#define A1_6 16 //λС +#define A1_6_0 (0x01) //'˲ʱ ' +#define A1_6_1 (0x02+0x01+0x80) //'m3/h' + +#define A1_7 17 +#define A1_7_0 (0x08+0x80) //'ۻʱ' +#define A1_7_1 (0x80) //'h' + +#define A1_8 18 +#define A1_8_0 (0x40) //'ʱ' +#define A1_8_1 (0x80) //'h' + +//--------------A2˵------------- +#define A2 2 +#define A2_0 20 //ʾA2 + +#define A2_1 21 // +#define A2_1_0 (0x80) //'ʱ' +#define A2_1_1 (0x00) + +#define A2_2 22 //ʱ +#define A2_2_0 (0x80) //'ʱ' +#define A2_2_1 (0x00) + +#define A2_3 23 //û +#define A2_3_0 (0x00) // +#define A2_3_1 (0x00) + +#define A2_4 24 //汾 +#define A2_4_0 (0x00) // +#define A2_4_1 (0x00) + +#define A2_5 25 //͵ѹ'P6' +#define A2_5_0 (0x00) // +#define A2_5_1 (0x00) + +#define A2_6 26 //ȫ + +//--------------A3˵-------------- +#define A3 3 +#define A3_0 30 //ʾA3 + +#define A3_1 31 // +#define A3_1_0 (0x80) //'ʱ' +#define A3_1_1 (0x00) + +#define A3_2 32 +#define A3_2_0 (0x08+0x01) //'ۻ' +#define A3_2_1 (0x02) //'m3' + +#define A3_3 33 +#define A3_3_0 (0x08+0x04) //'ۼ ' +#define A3_3_1 (0x10+0x20) //'KW*h' + +//--------------A4˵-------------- +#define A4 4 +#define A4_0 40 //ʾA4 + +#define A4_1 41 //λС +#define A4_1_0 (0x01) //'˲ʱ ' +#define A4_1_1 (0x02+0x01+0x80+0x08) //'m3/h'+'춨' + +#define A4_2 42 //λС +#define A4_2_0 (0x08+0x01) //'ۻ' +#define A4_2_1 (0x02+0x08) //'m3'+'춨' + +#define A4_3 43 +#define A4_3_0 (0x10) //' ' +#define A4_3_1 (0x00+0x08) // +'춨' + +#define A4_4 44 //λС +#define A4_4_0 (0x08+0x04) //'ۻ ' +#define A4_4_1 (0x10+0x20+0x08) //'KW*h'+'춨' + +#define A4_5 45 //'T T' λС +#define A4_5_0 (0x20) //'T' +#define A4_5_1 (0x04+0x08) //'`C'+'춨' + +#define A4_6 46 +#define A4_6_0 (0x02) //'² ' +#define A4_6_1 (0x04+0x08) //'`C'+'춨' + + diff --git a/resources/soc/simu/soft/func/include/ls1d.h b/resources/soc/simu/soft/func/include/ls1d.h new file mode 100644 index 0000000..33b317a --- /dev/null +++ b/resources/soc/simu/soft/func/include/ls1d.h @@ -0,0 +1,158 @@ + +/********************************Variable Option**********************************************************************************************************************/ +typedef char _s8; +typedef unsigned char _u8; + +typedef short _s16; +typedef unsigned short _u16; + +typedef int _s32; +typedef unsigned int _u32; + +typedef float _fp32; + +/********************************LS1D Chip Option**********************************************************************************************************************/ +/********************************LS1D Address Space********************************/ +#define UNCACHED_MEMORY_ADDR 0xa0000000 +#define UNCACHED_TO_PHYS(x) ((x) & 0x1fffffff) +#define PHYS_TO_UNCACHED(x) ((x) | UNCACHED_MEMORY_ADDR) + +#define SRAM_BASEADDR PHYS_TO_UNCACHED(0x0) //sram +#define SPI_FLASH_BASEADDR PHYS_TO_UNCACHED(0x1e000000) //spi flash +#define FLASH_BASEADDR PHYS_TO_UNCACHED(0x1f000000) //spi/nand/lpc +#define BOOT_ADDR PHYS_TO_UNCACHED(0x1fc00000) //spi/flash +#define FLASH_REG_BASEADDR PHYS_TO_UNCACHED(0x1fe60000) //flash regs +#define SPI_REG_BASEADDR PHYS_TO_UNCACHED(0x1fe80000) //spi regs +#define UART0_BASEADDR PHYS_TO_UNCACHED(0x1fe40000) // LS 20130123 +#define UART1_BASEADDR PHYS_TO_UNCACHED(0x1fe88000) +#define I2C_BASEADDR PHYS_TO_UNCACHED(0x1fe90000) +#define REGS_BASEADDR PHYS_TO_UNCACHED(0x1fea0000) //Interrupt_Regs_Baseaddr + +#define PMU_BASEADDR PHYS_TO_UNCACHED(0x1feb0000) +#define SONAR_BASEADDR PHYS_TO_UNCACHED(0x1feb4000) +#define THSENS_BASEADDR PHYS_TO_UNCACHED(0x1feb8000) + +#define SLCD_REG_BASEADDR PHYS_TO_UNCACHED(0x1febc000) +#define ADC_BASEADDR PHYS_TO_UNCACHED(0x1fea8000) + +/********************************PMU REGS********************************/ +#define PMU_Timing *(volatile _u32 *)(PMU_BASEADDR) +#define PMU_Command *(volatile _u32 *)(PMU_BASEADDR+0x04) +#define PMU_Compare *(volatile _u32 *)(PMU_BASEADDR+0x08) + +#define PMU_ChipCtrl *(volatile _u32 *)(PMU_BASEADDR+0x0C) +#define PMU_GPIO_OE *(volatile _u32 *)(PMU_BASEADDR+0x10) +#define PMU_GPIO_O *(volatile _u32 *)(PMU_BASEADDR+0x14) +#define PMU_GPIO_I *(volatile _u32 *)(PMU_BASEADDR+0x18) + +#define PMU_Count *(volatile _u32 *)(PMU_BASEADDR+0x1c) + +#define PMU_UserDat0 *(volatile _u32 *)(PMU_BASEADDR+0x20) +#define PMU_UserDat1 *(volatile _u32 *)(PMU_BASEADDR+0x24) +#define PMU_UserDat2 *(volatile _u32 *)(PMU_BASEADDR+0x28) +#define PMU_UserDat3 *(volatile _u32 *)(PMU_BASEADDR+0x2c) +#define PMU_UserDat4 *(volatile _u32 *)(PMU_BASEADDR+0x30) + +#define PMU_AutoSave *(volatile _u32 *)(PMU_BASEADDR+0x34) +#define PMU_Exint *(volatile _u32 *)(PMU_BASEADDR+0x38) //external interrupt +#define PMU_CommandW *(volatile _u32 *)(PMU_BASEADDR+0x3c) + +/******************************SONAR REGS********************************/ +#define SONAR_PulseDef *(volatile _u32 *)(SONAR_BASEADDR) +#define SONAR_SonarCtrl0 *(volatile _u32 *)(SONAR_BASEADDR+0x04) +#define SONAR_SonarCtrl1 *(volatile _u32 *)(SONAR_BASEADDR+0x08) +#define SONAR_GateDef1 *(volatile _u32 *)(SONAR_BASEADDR+0x0C) +#define SONAR_GateDef2 *(volatile _u32 *)(SONAR_BASEADDR+0x10) +#define SONAR_GateDef3 *(volatile _u32 *)(SONAR_BASEADDR+0x14) +#define SONAR_WaveW_Cur *(volatile _u32 *)(SONAR_BASEADDR+0x18) +#define SONAR_WaveW_Last *(volatile _u32 *)(SONAR_BASEADDR+0x1C) +#define SONAR_ResPtr *(volatile _u32 *)(SONAR_BASEADDR+0x20) + +#define SONAR_Result *(volatile _u32 *)(SONAR_BASEADDR+0x40) +//Result[15:0] SONAR_BASEADDR + [0x40 ~ 0x7c] + +/*****************************THSENS REGS********************************/ +#define ThsensCtrl *(volatile _u32 *)(THSENS_BASEADDR) + + +/*******************************LCD REGS*********************************/ +#define LCD_FB_0 *(volatile _u32 *)(SLCD_REG_BASEADDR) +#define LCD_FB_1 *(volatile _u32 *)(SLCD_REG_BASEADDR+0x04) +#define LCD_FB_2 *(volatile _u32 *)(SLCD_REG_BASEADDR+0x08) +#define LCD_RefeshRate *(volatile _u32 *)(SLCD_REG_BASEADDR+0x0C) + +/***************************INTERRUPT REGS******************************/ +#define INT_EN *(volatile _u8 *)(REGS_BASEADDR) +#define INT_EGDE *(volatile _u8 *)(REGS_BASEADDR+0x01) +#define INT_POL *(volatile _u8 *)(REGS_BASEADDR+0x02) +#define INT_CLR *(volatile _u8 *)(REGS_BASEADDR+0x03) +#define INT_SET *(volatile _u8 *)(REGS_BASEADDR+0x04) +#define INT_OUT *(volatile _u8 *)(REGS_BASEADDR+0x05) + +/*******************************ADC REGS********************************/ + +#define ADC_CR *(volatile _u8 *)(ADC_BASEADDR) +#define ADC_D0 *(volatile _u8 *)(ADC_BASEADDR+0x1) +#define ADC_D1 *(volatile _u8 *)(ADC_BASEADDR+0x2) + +/*******************************I2C REGS********************************/ +#define IIC_PRER_L *(volatile _u8 *)(I2C_BASEADDR+0x00) +#define IIC_PRER_H *(volatile _u8 *)(I2C_BASEADDR+0x01) +#define IIC_CTR *(volatile _u8 *)(I2C_BASEADDR+0x02) +#define IIC_TXR *(volatile _u8 *)(I2C_BASEADDR+0x03) //w +#define IIC_RXR *(volatile _u8 *)(I2C_BASEADDR+0x03) //r +#define IIC_CR *(volatile _u8 *)(I2C_BASEADDR+0x04) //w +#define IIC_SR *(volatile _u8 *)(I2C_BASEADDR+0x04) //r +#define IIC_ADDR *(volatile _u8 *)(I2C_BASEADDR+0x07) // 7位地址 MSB 无效 + +/*****************************UART0 REGS********************************/ +//NS16550 +#define Uart0_RxData *(volatile _u8 *)(UART0_BASEADDR) +#define Uart0_TxData *(volatile _u8 *)(UART0_BASEADDR) +#define Uart0_IER *(volatile _u8 *)(UART0_BASEADDR+0x01) +#define Uart0_IIR *(volatile _u8 *)(UART0_BASEADDR+0x02) //read only +#define Uart0_FCR *(volatile _u8 *)(UART0_BASEADDR+0x02) //write only +#define Uart0_LCR *(volatile _u8 *)(UART0_BASEADDR+0x03) +#define Uart0_MCR *(volatile _u8 *)(UART0_BASEADDR+0x04) +#define Uart0_LSR *(volatile _u8 *)(UART0_BASEADDR+0x05) +#define Uart0_MSR *(volatile _u8 *)(UART0_BASEADDR+0x06) + +#define Uart0_BaudL *(volatile _u8 *)(UART0_BASEADDR) +#define Uart0_BaudH *(volatile _u8 *)(UART0_BASEADDR+0x01) + +/*****************************UART1 REGS********************************/ +//NS16550 +#define Uart1_RxData *(volatile _u8 *)(UART1_BASEADDR) +#define Uart1_TxData *(volatile _u8 *)(UART1_BASEADDR) +#define Uart1_IER *(volatile _u8 *)(UART1_BASEADDR+0x01) +#define Uart1_IIR *(volatile _u8 *)(UART1_BASEADDR+0x02) //read only +#define Uart1_FCR *(volatile _u8 *)(UART1_BASEADDR+0x02) //write only +#define Uart1_LCR *(volatile _u8 *)(UART1_BASEADDR+0x03) +#define Uart1_MCR *(volatile _u8 *)(UART1_BASEADDR+0x04) +#define Uart1_LSR *(volatile _u8 *)(UART1_BASEADDR+0x05) +#define Uart1_MSR *(volatile _u8 *)(UART1_BASEADDR+0x06) + +#define Uart1_BaudL *(volatile _u8 *)(UART1_BASEADDR) +#define Uart1_BaudH *(volatile _u8 *)(UART1_BASEADDR+0x01) + +/*******************************SPI REGS********************************/ +#define SPI_SPCR *(volatile _u8 *)(SPI_REG_BASEADDR) +#define SPI_SPSR *(volatile _u8 *)(SPI_REG_BASEADDR+0x01) +#define SPI_TxFIFO *(volatile _u8 *)(SPI_REG_BASEADDR+0x02) +#define SPI_RxFIFO *(volatile _u8 *)(SPI_REG_BASEADDR+0x02) +#define SPI_SPER *(volatile _u8 *)(SPI_REG_BASEADDR+0x03) +#define SPI_SFC_PARAM *(volatile _u8 *)(SPI_REG_BASEADDR+0x04) +#define SPI_SFC_SOFTCS *(volatile _u8 *)(SPI_REG_BASEADDR+0x05) +#define SPI_SFC_TIMING *(volatile _u8 *)(SPI_REG_BASEADDR+0x06) + +/*****************************FLASH REGS********************************/ +#define FLASH_CMD_REG *(volatile _u32 *)(FLASH_REG_BASEADDR) +#define FLASH_ERASE_ALL 0x80000000 +#define FLASH_ERASE_CMD 0xa0000000 +#define FLASH_WRITE_CMD 0xe0000000 +#define FLASH_PAGE_LATCH_CLEAR 0X40000000 +#define FLASH_ADDR_MASK 0x7ffff80 + +#define FLASH_PAGE_LATCH_BASEADDR 0xbfe68000 //128bytes + +/**********************************************************************************************************************************************************************/ diff --git a/resources/soc/simu/soft/func/include/temp_flow.h b/resources/soc/simu/soft/func/include/temp_flow.h new file mode 100644 index 0000000..1eba1a8 --- /dev/null +++ b/resources/soc/simu/soft/func/include/temp_flow.h @@ -0,0 +1,11 @@ + +void InitTdc(void); +//_fp32 Time_Caculate(_u32 *result, struct Data *Lcd_data, _u16 start, _u32 stop_num); +//void Flow_Caculate(_fp32 delta_time, _fp32 duration, struct Data *Lcd_data); +//void Temp_Caculate(_u32 *result, struct Data *Lcd_data, _u32 num); +//void Heat_Caculate(_fp32 duration, struct Data *Lcd_data); +_u32 res_ready(struct Data *Lcd_data); + + +extern _fp32 Last_total_flow; //ϴμʱۻ + diff --git a/resources/soc/simu/soft/func/include/xmodem.h b/resources/soc/simu/soft/func/include/xmodem.h new file mode 100644 index 0000000..83061fa --- /dev/null +++ b/resources/soc/simu/soft/func/include/xmodem.h @@ -0,0 +1,16 @@ +_u32 xmodem(void); + +//³£Êý¶¨Òå +#define BLOCKSIZE 128 //M16µÄÒ»¸öFlashҳΪ128×Ö½Ú(64×Ö) + + +//¶¨ÒåÈ«¾Ö±äÁ¿ +struct str_XMODEM +{ + unsigned char SOH; //Æðʼ×Ö½Ú + unsigned char BlockNo; //Êý¾Ý¿é±àºÅ + unsigned char nBlockNo; //Êý¾Ý¿é±àºÅ·´Âë + unsigned char Xdata[BLOCKSIZE]; //Êý¾Ý128×Ö½Ú + unsigned char CRC16hi; //CRC16УÑéÊý¾Ý¸ßλ + unsigned char CRC16lo; //CRC16УÑéÊý¾ÝµÍλ +}; diff --git a/resources/soc/simu/soft/func/lib/Makefile b/resources/soc/simu/soft/func/lib/Makefile new file mode 100644 index 0000000..9b741e6 --- /dev/null +++ b/resources/soc/simu/soft/func/lib/Makefile @@ -0,0 +1,12 @@ + +%.o:%.c + $(CC) $(DEBUG) $(FLAGS) -EL -c -o $@ $< + +objs= memset.o memcpy.o printf.o udelay.o putchar.o puts.o printhex.o printbase.o memcmp.o strcat.o strchr.o strcmp.o strtok.o strspn.o strcspn.o + +$(TOPDIR)/libtinyc.a: $(objs) + $(AR) -cr $@ $? + +clean: + rm -f *.o *.a *.s + diff --git a/resources/soc/simu/soft/func/lib/memcmp.c b/resources/soc/simu/soft/func/lib/memcmp.c new file mode 100644 index 0000000..5f3cbdd --- /dev/null +++ b/resources/soc/simu/soft/func/lib/memcmp.c @@ -0,0 +1,16 @@ +/** + * memcmp - Compare two areas of memory + * @cs: One area of memory + * @ct: Another area of memory + * @count: The size of the area. + */ +int memcmp(const void * cs,const void * ct,int count) +{ + const unsigned char *su1, *su2; + signed char res = 0; + + for( su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--) + if ((res = *su1 - *su2) != 0) + break; + return res; +} diff --git a/resources/soc/simu/soft/func/lib/memcpy.c b/resources/soc/simu/soft/func/lib/memcpy.c new file mode 100644 index 0000000..e4a56c2 --- /dev/null +++ b/resources/soc/simu/soft/func/lib/memcpy.c @@ -0,0 +1,16 @@ +typedef int size_t; +void *memcpy(void *s1, const void *s2, size_t n) +{ + const char *f = s2; + char *t = s1; + + if (f < t) { + f += n; + t += n; + while (n-- > 0) + *--t = *--f; + } else + while (n-- > 0) + *t++ = *f++; + return s1; +} diff --git a/resources/soc/simu/soft/func/lib/memset.c b/resources/soc/simu/soft/func/lib/memset.c new file mode 100644 index 0000000..5d4bae4 --- /dev/null +++ b/resources/soc/simu/soft/func/lib/memset.c @@ -0,0 +1,10 @@ +typedef int size_t; +void * memset(void * s,int c, size_t count) +{ + char *xs = (char *) s; + + while (count--) + *xs++ = c; + + return s; +} diff --git a/resources/soc/simu/soft/func/lib/printbase.c b/resources/soc/simu/soft/func/lib/printbase.c new file mode 100644 index 0000000..2d39a72 --- /dev/null +++ b/resources/soc/simu/soft/func/lib/printbase.c @@ -0,0 +1,28 @@ +int printbase(long v,int w,int base,int sign) +{ + int i,j; + int c; + char buf[64]; + unsigned long value; + if(sign && v<0) + { + value = -v; + putchar('-'); + } + else value=v; + + for(i=0;value;i++) + { + buf[i]=value%base; + value=value/base; + } + +#define max(a,b) (((a)>(b))?(a):(b)) + + for(j=max(w,i);j>0;j--) + { + c=j>i?0:buf[j-1]; + putchar((c<=9)?c+'0':c-0xa+'a'); + } + return 0; +} diff --git a/resources/soc/simu/soft/func/lib/printf.c b/resources/soc/simu/soft/func/lib/printf.c new file mode 100644 index 0000000..c49827e --- /dev/null +++ b/resources/soc/simu/soft/func/lib/printf.c @@ -0,0 +1,79 @@ +int printf(char *fmt,...) +{ +int i; +char c; +void **arg; +void *ap; +int w; +__builtin_va_start(ap,fmt); +arg=ap; +for(i=0;fmt[i];i++) +{ + c=fmt[i]; + if(c=='%') + { + w=1; +again: + switch(fmt[i+1]) + { + case 's': + puts(*arg); + arg++; + i++; + break; + case 'c': + putchar((long)*arg); + arg++; + i++; + break; + case 'u': + printbase((long)*arg,w,10,0); + arg++; + i++; + break; + case 'd': + printbase((long)*arg,w,10,0); + arg++; + i++; + break; + case 'o': + printbase((long)*arg,w,8,0); + arg++; + i++; + break; + case 'b': + printbase((long)*arg,w,2,0); + arg++; + i++; + break; + case 'p': + case 'x': + printbase((long)*arg,w,16,0); + arg++; + i++; + break; + case '%': + putchar('%'); + i++; + break; + case '0': + i++; + case '1' ... '9': + for(w=0;fmt[i+1]>'0' && fmt[i+1]<='9';i++) + w=w*10+(fmt[i+1]-'0'); + goto again; + break; + + default: + putchar('%'); + break; + } + + } + else{ + if(c=='\n') putchar('\r'); + putchar(c); + } +} + return 0; +} diff --git a/resources/soc/simu/soft/func/lib/printhex.c b/resources/soc/simu/soft/func/lib/printhex.c new file mode 100644 index 0000000..1cb12bb --- /dev/null +++ b/resources/soc/simu/soft/func/lib/printhex.c @@ -0,0 +1,11 @@ +int printhex(long v,int w) +{ + int i; + int c; + for(i=4*(w-1);i>=0;i-=4) + { + c=(v>>i)&0xf; + putchar((c<=9)?c+'0':c-0xa+'a'); + } + return 0; +} diff --git a/resources/soc/simu/soft/func/lib/putchar.c b/resources/soc/simu/soft/func/lib/putchar.c new file mode 100644 index 0000000..dc435d4 --- /dev/null +++ b/resources/soc/simu/soft/func/lib/putchar.c @@ -0,0 +1,5 @@ +int putchar(unsigned char c) +{ +tgt_putchar(c); +return 0; +} diff --git a/resources/soc/simu/soft/func/lib/puts.c b/resources/soc/simu/soft/func/lib/puts.c new file mode 100644 index 0000000..e7d19dd --- /dev/null +++ b/resources/soc/simu/soft/func/lib/puts.c @@ -0,0 +1,13 @@ +int puts(char *s) +{ +char c; +while((c=*s)) +{ + if(c == '\n') putchar('\r'); + putchar(c); + s++; +} +putchar('\r'); +putchar('\n'); +return 0; +} diff --git a/resources/soc/simu/soft/func/lib/strcat.c b/resources/soc/simu/soft/func/lib/strcat.c new file mode 100644 index 0000000..5825675 --- /dev/null +++ b/resources/soc/simu/soft/func/lib/strcat.c @@ -0,0 +1,48 @@ +/* $Id: strcat.c,v 1.1.1.1 2006/09/14 01:59:06 root Exp $ */ + +/* + * Copyright (c) 2000-2002 Opsycon AB (www.opsycon.se) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Opsycon AB. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +char * +strcat(char *dst, const char *src) +{ + char *d; + + if (!dst || !src) + return (dst); + + d = dst; + for (; *d; d++); + for (; *src; src++) + *d++ = *src; + *d = 0; + return (dst); +} diff --git a/resources/soc/simu/soft/func/lib/strchr.c b/resources/soc/simu/soft/func/lib/strchr.c new file mode 100644 index 0000000..30c86b8 --- /dev/null +++ b/resources/soc/simu/soft/func/lib/strchr.c @@ -0,0 +1,44 @@ +/* $Id: strchr.c,v 1.1.1.1 2006/09/14 01:59:06 root Exp $ */ + +/* + * Copyright (c) 2000-2002 Opsycon AB (www.opsycon.se) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Opsycon AB. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +char * +strchr(const char *p, int c) +{ + if (!p) + return (0); + + for (; *p; p++) + if (*p == c) + return ((char *)p); + return (0); +} diff --git a/resources/soc/simu/soft/func/lib/strcmp.c b/resources/soc/simu/soft/func/lib/strcmp.c new file mode 100644 index 0000000..406b0d0 --- /dev/null +++ b/resources/soc/simu/soft/func/lib/strcmp.c @@ -0,0 +1,11 @@ +/* + * Compare strings. + */ +int +strcmp(const char *s1, const char *s2) +{ + while (*s1 == *s2++) + if (*s1++ == 0) + return (0); + return (*(const unsigned char *)s1 - *(const unsigned char *)--s2); +} diff --git a/resources/soc/simu/soft/func/lib/strcspn.c b/resources/soc/simu/soft/func/lib/strcspn.c new file mode 100644 index 0000000..f9f8a69 --- /dev/null +++ b/resources/soc/simu/soft/func/lib/strcspn.c @@ -0,0 +1,48 @@ +/* $Id: strcspn.c,v 1.1.1.1 2006/09/14 01:59:06 root Exp $ */ + +/* + * Copyright (c) 2000-2002 Opsycon AB (www.opsycon.se) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Opsycon AB. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +int +strcspn (const char *p, const char *s) +{ + int i, j; + + for (i = 0; p[i]; i++) { + for (j = 0; s[j]; j++) { + if (s[j] == p[i]) + break; + } + if (s[j]) + break; + } + return (i); +} diff --git a/resources/soc/simu/soft/func/lib/strspn.c b/resources/soc/simu/soft/func/lib/strspn.c new file mode 100644 index 0000000..240b1ed --- /dev/null +++ b/resources/soc/simu/soft/func/lib/strspn.c @@ -0,0 +1,51 @@ +/* $Id: strspn.c,v 1.1.1.1 2006/09/14 01:59:06 root Exp $ */ + +/* + * Copyright (c) 2000-2002 Opsycon AB (www.opsycon.se) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Opsycon AB. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +/* return length of initial segment of p that consists entirely of + * characters from s */ + +int +strspn(const char *p, const char *s) +{ + int i, j; + + for (i = 0; p[i]; i++) { + for (j = 0; s[j]; j++) { + if (s[j] == p[i]) + break; + } + if (!s[j]) + break; + } + return (i); +} diff --git a/resources/soc/simu/soft/func/lib/strtok.c b/resources/soc/simu/soft/func/lib/strtok.c new file mode 100644 index 0000000..a8ca3b5 --- /dev/null +++ b/resources/soc/simu/soft/func/lib/strtok.c @@ -0,0 +1,51 @@ +/* $Id: strtok.c,v 1.1.1.1 2006/09/14 01:59:06 root Exp $ */ + +/* + * Copyright (c) 2000-2002 Opsycon AB (www.opsycon.se) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Opsycon AB. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +char * +strtok(char *p, const char *tok) +{ +static char *t; /* XXX */ + char *r; + int n; + + if (p) + t = p; + + r = t + strspn (t, tok); + if (!(n = strcspn (r, tok))) + return (0); + t = r + n; + if (*t) + *t++ = 0; + return (r); +} diff --git a/resources/soc/simu/soft/func/lib/udelay.c b/resources/soc/simu/soft/func/lib/udelay.c new file mode 100644 index 0000000..243f40a --- /dev/null +++ b/resources/soc/simu/soft/func/lib/udelay.c @@ -0,0 +1,13 @@ +void udelay(int us) +{ +#if 0 +int count0,count1; +int debug=0; +us *=CPU_COUNT_PER_US; +asm volatile("mfc0 %0,$9":"=r"(count0)); +do{ +asm volatile("mfc0 %0,$9":"=r"(count1)); +}while(count1 -count0Day){ + case 7: + case 14: + case 21: + case 28: + if(Date_and_Time->Hour == 3) + { + main_flag |= test_bit; + main_flag |= lowV2_bit; + } + break; + default: + break; + } +} + +static void AddDay(struct Date_Time *Date_and_Time) +{ + Date_and_Time->Day +=1; + Date_and_Time->Hour =0; +} + +static void AddMonth(struct Date_Time *Date_and_Time) +{ + Date_and_Time->Month +=1; + Date_and_Time->Day =1; //ע,ÿµһ'1''0' + Date_and_Time->Hour =0; + if(main_flag & month_flag) main_flag |= month_bit; //Ĭ½ʱΪÿµ +} + +static void AddYear(struct Date_Time *Date_and_Time) +{ + Date_and_Time->Year +=1; + Date_and_Time->Month =1; //ע + Date_and_Time->Day =1; //ע + Date_and_Time->Hour =0; + if(main_flag & month_flag) main_flag |= month_bit; //Ĭ½ʱΪÿµ +} + +//void calendar(struct Date_Time *Date_and_Time, unsigned short lcdmode) +void calendar(struct Date_Time *Date_and_Time) +{ +#if CALENDAR_TEST + printf("calendar()...\n"); +#endif + //if(lcdmode == A2_1 || lcdmode == A2_2) //once per second + if(1) + { + Date_and_Time->Second +=1; + if(Date_and_Time->Second == 60){ + Date_and_Time->Minute += 1; + Date_and_Time->Second = 0; + } + if(Date_and_Time->Minute == 60){ + Date_and_Time->Hour += 1; + Date_and_Time->Minute =0; + } + } + else //cpu will sleep less than a day in most. + { + static _u32 last_count; + _u32 count, sleep_time; + count = *(volatile _u32 *)0xbfeb001c; + count &= COUNT_MASK; + sleep_time = (count - last_count)%COUNT_COMPARE; + _u32 i; + for(i=0;i<(sleep_time/57600);i++) //57600=3600*16, one hour + Date_and_Time->Hour += 1; + for(i=0;i<((sleep_time%57600)/960);i++) //960=60*16, one minute + Date_and_Time->Minute += 1; + for(i=0;i<((sleep_time%960)/16);i++) + Date_and_Time->Second += 1; + last_count = count - (count%16); //This is a good write! Read the last 6 lines to understand it. + if(Date_and_Time->Second >= 60) + { + Date_and_Time->Minute += 1; + Date_and_Time->Second %= 60; + } + if(Date_and_Time->Minute >= 60) + { + Date_and_Time->Hour += 1; + Date_and_Time->Minute %= 60; + } + } + + if(Date_and_Time->Hour >= 24) + { + /**/ + if((Date_and_Time->Year%400==0)||((Date_and_Time->Year%4 ==0)&&(Date_and_Time->Year%100 !=0))){ + switch(Date_and_Time->Day){ + case 29: + if(Date_and_Time->Month == 2) AddMonth(Date_and_Time); + else AddDay(Date_and_Time); + break; + case 30: + if((Date_and_Time->Month ==4)||(Date_and_Time->Month ==6)||(Date_and_Time->Month ==9)||(Date_and_Time->Month ==11)) + AddMonth(Date_and_Time); + else AddDay(Date_and_Time); + break; + case 31: + if(Date_and_Time->Month == 12) AddYear(Date_and_Time); + else AddMonth(Date_and_Time); + break; + default: + AddDay(Date_and_Time); + break; + } + } + else{ + switch(Date_and_Time->Day){ + case 28: + if(Date_and_Time->Month == 2) AddMonth(Date_and_Time); + else AddDay(Date_and_Time); + break; + case 30: + if((Date_and_Time->Month ==4)||(Date_and_Time->Month ==6)||(Date_and_Time->Month ==9)||(Date_and_Time->Month ==11)) + AddMonth(Date_and_Time); + else AddDay(Date_and_Time); + break; + case 31: + if(Date_and_Time->Month == 12) AddYear(Date_and_Time); + else AddMonth(Date_and_Time); + break; + default: + AddDay(Date_and_Time); + break; + } + } + Date_and_Time->Hour %= 24; + } + + DateLowV(Date_and_Time); +} + +void DateInit(struct Date_Time *Date_and_Time) +{ + Date_and_Time->Year = 2012; + Date_and_Time->Month = 1; + Date_and_Time->Day = 31; + Date_and_Time->Hour = 23; + Date_and_Time->Minute = 40; //59; + Date_and_Time->Second = 15; //45; + main_flag |= month_flag; +} +#endif diff --git a/resources/soc/simu/soft/func/source/Infrare.c b/resources/soc/simu/soft/func/source/Infrare.c new file mode 100644 index 0000000..45a80f8 --- /dev/null +++ b/resources/soc/simu/soft/func/source/Infrare.c @@ -0,0 +1,33 @@ +/********************************************************************************************************************************************************************** + This file enables the Infrare receiver to receive signals. +**********************************************************************************************************************************************************************/ + +#include "../config.h" + +#if INFRARE_MODULE +void Infrare() +{ + if((main_flag & wait_8sec)==0){ + if(main_flag & infrare_flag) //⴦ڴ״̬ + { + PMU_GPIO_O &= 0xfffffff7; //IR_PWR OFF + //rUart1_MCR &= ~0xa0; //MCR bit7: ; bit6:Rx bit5:Tx + main_flag &= ~infrare_flag; + } + else //⴦ڹر״̬ + { + main_flag |= infrare_flag; + PMU_GPIO_OE |= 1 << 3; //IO + PMU_GPIO_O |= 1 << 3; //IR + RX_IndexW = 0; +#if UART1_INT + Uart1_IER |= 0x1; //enable uart1 rx int +#endif + + wait[1] = 0; + main_flag |= wait_8sec; + } + } +} + +#endif diff --git a/resources/soc/simu/soft/func/source/Interrupt.c b/resources/soc/simu/soft/func/source/Interrupt.c new file mode 100644 index 0000000..9d49a58 --- /dev/null +++ b/resources/soc/simu/soft/func/source/Interrupt.c @@ -0,0 +1,6 @@ +/********************************************************************************************************************************************************************** + This file processes all kinds of interrupt, some parts are placed in start.S. +**********************************************************************************************************************************************************************/ + +#include "../config.h" + diff --git a/resources/soc/simu/soft/func/source/MonthData.c b/resources/soc/simu/soft/func/source/MonthData.c new file mode 100644 index 0000000..49bf59e --- /dev/null +++ b/resources/soc/simu/soft/func/source/MonthData.c @@ -0,0 +1,62 @@ +/********************************************************************************************************************************************************************** + This file writes the info flash when MonthDate comes. + It should need four step to write flash: + 1) clear page_latch + 2) write data into page_latch + 3) clear the flash page + 4) write the flash page + *page_latch just like a buffer. +**********************************************************************************************************************************************************************/ + +#include "../config.h" + +_u32 Last_month_num; //0~17 +#if MONTHDATA_MODULE +struct Record_1 Latest_Record; + +void Flash_Read_Info() +{ + +} + +void MonthData(struct Date_Time *Date_and_Time, struct Data *Lcd_data) //flashݱʽΪBCD +{ +#if MONTHDATA_TEST + printf("%s()...\n", __FUNCTION__); +#endif + struct Record_0 Month_Record; + if(Date_and_Time->Month == 1) + { + Month_Record.Date = (Date_and_Time->Year-1)*1000 + 12*10; //store in _u32 format + } + else + { + Month_Record.Date = Date_and_Time->Year*1000 + (Date_and_Time->Month-1)*10; //store in _u32 format + } //eg: 20110120 + + Month_Record.TotalHeat = (_u32)(Lcd_data->total_heat)*100/LCD_MULTIPLE; + Month_Record.TotalFlow = (_u32)(Lcd_data->total_flow)*100/LCD_MULTIPLE; + + //write flash + Last_month_num++; + Last_month_num %= 18; + + _u32 addr, err=1; + addr = INFO_FLASH_START + Last_month_num*12 ; + err = Flash_Write( addr, &Month_Record, 3) ; + + BUG_ON(err) + +} + +void Flash_Write_Test() +{ + _u32 data[4]; + _u32 i,addr; + for(i=0;i<4;i++) + data[i] = i; + addr = 0xbfc0f004; + Flash_Write(addr, data, 4) ; + +} +#endif diff --git a/resources/soc/simu/soft/func/source/SystemInit.c b/resources/soc/simu/soft/func/source/SystemInit.c new file mode 100644 index 0000000..c7e5c22 --- /dev/null +++ b/resources/soc/simu/soft/func/source/SystemInit.c @@ -0,0 +1,118 @@ +/********************************************************************************************************************************************************************** + This file inits some module in LS1D chip. +**********************************************************************************************************************************************************************/ + +#include "../config.h" +#include "../include/asm/ns16550.h" + +void Uart0_Init() +{ + /* + 8bit 1stop 38400Baut + */ +#if 1 + Uart0_FCR = FIFO_ENABLE|FIFO_RCV_RST|FIFO_XMT_RST|FIFO_TRIGGER_4; + Uart0_LCR = CFCR_DLAB; + Uart0_FCR = 0xCF; + Uart0_BaudL = 0x23; //set 57600Baut + Uart0_LCR = CFCR_8BITS; //8bit, 1stop + Uart0_MCR = MCR_DTR|MCR_RTS; + Uart0_IER = 0; +#endif + /*the uart0 rx default state is high, it can work when egde_low or no_egde_low.*/ +#if 0 + INT_EGDE |= 0x08; //egde change available + INT_POL |= 0x08; //low available + //INT_POL &= ~0x08; //high available + Uart0_IER |= 0x01; //enable uart0 rx int + INT_EN |= 0x08; //enable uart0 int +#endif + +#if PRINT + printf("Uart0 init...\n"); +#endif +} + +static void Uart1_Init(void) +{ + /* + 8bit 1stop 2400Baut odd parity + */ +#if 0 + __asm__ volatile( + "lui $2,0xbfe8;\n" \ + "ori $2,$2,0x8000;\n" \ + "li $3,7;\n" \ + "sb $3,2($2);\n" \ + "li $3,-128;\n" \ + "sb $3,3($2);\n" \ + "li $3,-48;\n" \ + "sb $3,0($2);\n" \ + "li $3,11;\n" \ + "sb $3,3($2);\n" \ + "li $3,3;\n" \ + "sb $3,4($2);\n" \ + "li $3,0;\n" \ + "sb $3,1($2);\n" \ + :::"$2","$3" + ); +#else + Uart1_FCR = FIFO_ENABLE|FIFO_RCV_RST|FIFO_XMT_RST|FIFO_TRIGGER_1; + Uart1_LCR = CFCR_DLAB; + Uart1_BaudL = 208; //set 2400Baut + Uart1_LCR = CFCR_8BITS|CFCR_PENAB|CFCR_PODD; //8bit, 1stop, odd parity + Uart1_MCR = MCR_DTR|MCR_RTS; + Uart1_IER = 0; +#endif + + /*the uart1 rx default state is low, when IR_PWR is off; only can it work when no_egde_low.*/ + //INT_EGDE |= 0x04; //egde change available + //INT_CLR = 0x3f; //clear all int bit + //INT_POL &= ~0x04; //high available + INT_POL |= 0x04; //low available + INT_EN |= 0x04; //enable uart1 int + +#if PRINT + printf("Uart1 init...\n"); +#endif + +#if !(UART1_INT) + _u8 data; + data = Uart1_RxData; //clear the receive fifo + Uart1_IER |= 0x01; //enable uart1 rx int +#endif +} + +static void ReLoad() //ϵָӵ籣λöȡݣ¸ֵ +{ +#if 0 + DateInit(); +#endif + + //Monthdata.h + //temp_flow.h + //Last_total_flow = +} + +void SystemInit() +{ + //DisableWatchDog(); + /* + enable BT\UART\KEY\BAT_FAIL Interrupt + */ +// Interrupt_Init(); + + //Uart0_Init(); +#if (INFRARE_MODULE|FRAME_MODULE) + Uart1_Init(); +#endif + ReLoad(); +#if (TDC_TEMP_MODULE|TDC_FLOW_MODULE) + InitTdc(); +#endif +#if AD_MODULE + ADC_Init(); +#endif + +} + diff --git a/resources/soc/simu/soft/func/source/adc.c b/resources/soc/simu/soft/func/source/adc.c new file mode 100644 index 0000000..7e77c0d --- /dev/null +++ b/resources/soc/simu/soft/func/source/adc.c @@ -0,0 +1,49 @@ +#include "../config.h" + +/**************************** +*ADC* base addr : 0xbfea8000 + cr offset : 0x0 + datalow offset : 0x1 (result[3:0] in D0[7:4]) + datahigh offset : 0x2 (result[11:4] in D1[7:0]) +*cr* [8] : start + [7] : standby (RO) + [2:0] : select + select=0: adci_a (battery voltage 3~3.7V ) + select=1: ldo output (core voltage 1.8V ) + +Liu Su +liusu-cpu@ict.ac.cn +****************************/ + +#if ADC_MODULE + +#define adc_start 0x80 +#define adc_standby 0x40 + +static _u32 ADC_measure(_u8 adc_sel) +{ + ADC_CR = adc_start | adc_sel; + while (ADC_CR & adc_standby != adc_standby) {} + return (ADC_D1 << 8 + ADC_D0) >> 4; +} + +float BatteryMeasure(void) +{ + float BatteryVoltage; + _u32 result_battery, result_core; + + result_core = ADC_measure(0); + result_battery = ADC_measure(1); + + BatteryVoltage = 1.8 * result_battery / result_core; + //printf("Battery Voltage : %f V\n", BatteryVoltage); + return BatteryVoltage; +} + +#endif // ADC_MODULE +int ADC_test(int argc, char argv[][30]) +{ + printf("\nin ADC_test"); + return 0; +} + diff --git a/resources/soc/simu/soft/func/source/battery.c b/resources/soc/simu/soft/func/source/battery.c new file mode 100644 index 0000000..e85eb6f --- /dev/null +++ b/resources/soc/simu/soft/func/source/battery.c @@ -0,0 +1,148 @@ +/********************************************************************************************************************************************************************** + This file uses ADC module to detect and measure the voltage of battery. +**********************************************************************************************************************************************************************/ + +#include "../config.h" + +#if AD_MODULE +void ADC_Init(void) +{ + IIC_PRER_L = 0x64; //Baud rate= 8M/4/PRER + IIC_PRER_H = 0x0; + IIC_CTR = 0xa0; //CTR[7]:core_en [6]:int_en [5]:master:1 slave:0 [4]:txr_ok [3]:rxr_ok bit[4,3] use in slave mode + + IIC_TXR = 0x6c; //slave addr + w + IIC_CR = 0x90; //start and write + while( (IIC_SR & 0x83) != 0x01 ); + IIC_CR = 0x01; + + IIC_TXR = 0x63; // max11645 config byte converte channel AN1 ,single ended + IIC_CR = 0x50; //send congig byte and stop + while( (IIC_SR & 0x83) != 0x01 ); + IIC_CR = 0x01; + +#if AD_TEST + printf("AD module initted...\n"); +#endif +} + + +static _u32 ADC() //power_detect +{ + _u32 sum = 0; + _u32 tmp = 0; + _u32 i; + for( i = 0; i < 8; i++) + { + IIC_TXR = 0x6c; //slave addr + w + IIC_CR = 0x90; //start and write + while( (IIC_SR & 0x83) != 0x01 ); + IIC_CR = 0x01; + + //IIC_TXR = 0xd2; //max11645 setup byte Vref = 2.048 (internal Vref), if use external Vref :a2 + IIC_TXR = 0xa2; //max11645 setup byte Vref = 2.048 (internal Vref), if use external Vref :a2 + IIC_CR = 0x50; //tx and stop + while( (IIC_SR & 0x83) != 0x01 ); + IIC_CR = 0x01; + + /************ read *********************/ + IIC_TXR = 0x6d; //slave addr + r + IIC_CR = 0x90; + while( (IIC_SR & 0x83) != 0x01 ); + IIC_CR = 0x01; + + IIC_CR = 0x20; //read + while( (IIC_SR & 0x83) != 0x01 ); + IIC_CR = 0x01; + tmp = IIC_RXR & 0x0f; + + IIC_CR = 0x60; //read & stop + while( (IIC_SR & 0x83) != 0x01 ); + IIC_CR = 0x01; + + tmp = tmp << 8; + tmp |= IIC_RXR & 0xff; + sum += tmp; + } + return (sum >> 3); +} + +void BatteryTest1() +{ + _u32 i; + _fp32 V_BAT; + + i = ADC(); + V_BAT = 4096*1.8f/i ; +#if AD_TEST + printf("---------------------------------------------------Battery: 0x%x------------", i); + printf_float(V_BAT); +#endif + +#if 0 + if(main_flag & wait_10sec){ //ŵѹ + if((main_flag & lowV_flag) == 0) //ǰΪ״̬ + { + if(i<0x0900) //Ϊ͵ѹ + { + if(main_flag & wait_oneday) //ڶηŵ + { + main_flag |= lowV_flag; + main_flag |= lcd_bit; + } + else //һηŵ + { + wait[6] = 0; + main_flag |= wait_oneday; + } + } + else //Ϊ + { + } + } + else //ǰѾΪ͵ѹ״̬ //ӳһ ڶηŵ + { + if(i>0x0b00){ + main_flag &= ~lowV_flag; + main_flag |= lcd_bit; + } + } + } + else //ŵѹ + { + static unsigned short m; + if((main_flag & lowV_flag) == 0) //ǰΪ״̬ + { + if(i<0x0aaa){ + main_flag |= lowV_flag; + main_flag |= lcd_bit; + } + } + else //ǰѾΪ͵ѹ״̬ + { + if(i>0x0b00){ + if(m==0) + { + wait[4] = 0; + main_flag |= wait_16min; + } + m = 1; + } + else m = 0; + } + } +#endif + //P3DIR &= ~0x10; +} + +void BatteryTest2() //ŵ +{ + //طŵ +#if 0 + P3DIR |=0x20; + P3OUT |=0x20; +#endif + wait[5] = 0; + main_flag |= wait_10sec; +} +#endif diff --git a/resources/soc/simu/soft/func/source/cmdline.c b/resources/soc/simu/soft/func/source/cmdline.c new file mode 100644 index 0000000..4978482 --- /dev/null +++ b/resources/soc/simu/soft/func/source/cmdline.c @@ -0,0 +1,326 @@ +#include "../config.h" +#include +#include +#include +#include +#define write_u32(addr,value) (*(volatile _u32*)(addr) = (value)) +#define read_u32(addr) (*(volatile _u32*)(addr)) + +#define LS1D +int help(int argc, char argv[][30]); +int m4(int argc, char argv[][30]); +int m1(int argc, char argv[][30]); +int d4(int argc, char argv[][30]); +int d1(int argc, char argv[][30]); +int float_test(int argc, char argv[][30]); + + +unsigned int str2num(char str[30]); + char cmdpara[10][30]; + char **pp; +static _u8 mygetchar(); +static void myputchar(_u8 chr); +struct cmd_struc { + const char *cmdname; + int (*func) __P((int, char *[])); +} cmd[] = {{"exit", NULL}, + {"help", help}, + {"m4", m4}, + {"m1", m1}, + {"d4", d4}, + {"d1", d1}, + {"", NULL} +}; + +int float_test(int argc, char argv[][30]) +{ + unsigned int a,b; + float i,j,k,l,m; + a = 3000; + b = 4096; + k = (float)a/(float)b; + i = 2.0; + j = 3.3; + l = 0.99; + m = 1.01; + i = i/j; + l = l/m; + k = i/l; + if(k>0.99 && k<1.01) a++; + else a--; + return 0; +} + + +static void myputchar(_u8 chr) +{ + while(!(Uart0_LSR & 0x20)) ; + Uart0_TxData = chr; +} + +static _u8 mygetchar() +{ + _u8 chr; +// int i=0,j; +// while(1) {if(Uart0_LSR & 0x1) break;else +// for(i=0;i<100;i++) {j=*(volatile _u32*)(0xbe000000);}} + while(!(Uart0_LSR & 0x1)) ; + chr = Uart0_RxData ; +// printf("f"); +// printf("%d",chr); + return chr; +} + +int help(int argc, char argv[][30]) +{ + int i; + printf("\ncommands:\n"); + for(i=1;i<100;i++) + { + if(strcmp(cmd[i].cmdname,"")==0) break; + else printf(" %s",cmd[i].cmdname); + } +// printf("\n"); + + return 0; +} + +unsigned int str2num(char str[30]) +{ + int value = 0; + int sign = 1; + int radix; + + if(*str == '-') + { + sign = -1; + str++; + } + if(*str == '0' && (*(str+1) == 'x' || *(str+1) == 'X')) + { + radix = 16; + str += 2; + } + else if(*str == '0') // 八进制首字符为0 + { + radix = 8; + str++; + } + else + radix = 10; + while(*str) + { + if(radix == 16) + { + if(*str >= '0' && *str <= '9') + value = value * radix + *str - '0'; + else + value = value * radix + (*str | 0x20) - 'a' + 10; + // value = value * radix + *str - 'a' + 10; // 也没问题啊 + } + else + value = value * radix + *str - '0'; + str++; + } + return (unsigned int *)(sign*value); +} + +int m4(int argc, char argv[][30]) +{ + unsigned int addr,value; +// printf("%s\n",argv[1]); + if(argc != 3) + { + printf("\nusage: m4 "); + return 1; + } + addr=str2num(argv[1]); + value=str2num(argv[2]); +#ifdef LS1D + *(volatile unsigned int*)(addr) = value; +#else + printf("addr: %x ,value: %x\n",addr,value); +#endif + return 0; +} + +int m1(int argc, char argv[][30]) +{ + unsigned int addr,value; +// printf("%s\n",argv[1]); + if(argc != 3) + { + printf("\nusage: m1 "); + return 1; + } + addr=str2num(argv[1]); + value=str2num(argv[2]); +#ifdef LS1D + *(volatile unsigned char*)(addr) = value; +#else + printf("addr: %x ,value: %x\n",addr,value); +#endif + return 0; +} + +int d4(int argc, char argv[][30]) +{ + unsigned int addr; + if(argc != 2) + { + printf("\nusage: d4 "); + return 1; + } + addr=str2num(argv[1]); +#ifdef LS1D + printf("\n0x%08x: %08x",addr,*(volatile unsigned int*)(addr)); +#else + printf("0x%08x:\n",addr); +#endif + return 0; +} + +int d1(int argc, char argv[][30]) +{ + unsigned int addr; + if(argc != 2) + { + printf("\nusage: d1 "); + return 1; + } + addr=str2num(argv[1]); +#ifdef LS1D + printf("\n0x%08x: %02x",addr,*(volatile unsigned char*)(addr)); +#else + printf("0x%08x:\n",addr); +#endif + return 0; +} + +int cmdline(void) +{ + char c; + char cmdbuffer[40]; + char *cbuffer; + short ccc,cpc,cbc,i,j; + int count=0; +// int (*func) (int , char **); + int (*op)(int argc,char **argv); + i=0; + j=0; + ccc=0; + cpc=0; + printf("This is the 1st test!\n"); + printf("This is the 2nd test!\n"); +// printf("This is the 3rd test!\n"); +// printf("This is the 4th test!\n"); +// printf("This is the 5th test!\n"); +// test mult + int opa = 1; + int opb = 2; + int result1 = opa * opb; + int result10 = 1 * 2; + int result2 = (opa+1) * (opb+4); + int result20 = 2 * 6; + int result3 = (opa+299) * (opb+298); + int result30 = 300 * 300; + printf("result: %d %d\n", result1, result10); + printf("result: %d %d\n", result2, result20); + printf("result: %d %d\n", result3, result30); + while(1){} +while(1) +{ + for(i=0;i<10;i++) + for(j=0;j<30;j++) + cmdpara[i][j] = '\0'; + for(i=0;i<40;i++) cmdbuffer[i]= '\0'; +// printf("\n$ "); + cbuffer = cmdpara[0]; +// printf("@ "); + ccc=0; +// printf("@ "); + cpc=0; +// printf("@ "); + cbc=0; +// printf("@ "); + count++; +// for(i=0;i<1000;i++) i++; + printf("\nS "); +// for(i=0;i<500;i++) j=Uart0_LSR; +// printf("%4d ",count); +// i=1; +// while(i++) {printf("\n%4d",i);j++;} + // internal loop + while(1) + { +// printf("|\n"); + c=mygetchar(); +// printf("%d\n",c); +// printf("/"); +// c=13; +// c=53; + if(c==8) + { + cbc=cbc-1; + cmdbuffer[cbc] = '\0'; + myputchar(8);myputchar(32);myputchar(8); + } + else + { + cmdbuffer[cbc++] = c; + myputchar(c); + } +// printf("\r%s",cmdbuffer); + if(c==10 || c==13) break; + } + for(i=0;i 0; i--) + { + for(j = 0; j < (i - 1); j++) + { + if(delta[j] > delta[j+1]) + { + tmp = delta[j]; + delta[j] = delta[j+1]; + delta[j+1] = tmp; + } + } + } +#if 0 //PRINT + for(i = 0; i < len; i++) + { + //printf("%f ", delta[i]); + if(delta[i] < 0) + { + tmp_print = 0 - delta[i]; + printf("-%d ", (unsigned int)(tmp_print*1000)); + } + else + { + tmp_print = delta[i]; + printf("%d ", (unsigned int)(tmp_print*1000)); + } + if(i == len-1) printf("\r\n"); + } +#endif + + for(i = 1; i < len - 1; i++) + { + sum += delta[i]; + } + average = sum/(len -2); + return average; +} + +void UintToBcd(_u32 dat, _u8 *bcd_buf) +{ + //_u32 tmp = dat; + + //if(dat>=100000000) dat=dat%100000000 ; + dat = dat%100000000 ; + bcd_buf[3] = dat/10000000 ; + bcd_buf[3] <<= 4 ; + dat = dat%10000000 ; + bcd_buf[3] |= (dat/1000000) ; + + dat = dat%1000000 ; + bcd_buf[2] = dat/100000 ; + bcd_buf[2] <<= 4 ; + dat = dat%100000 ; + bcd_buf[2] |= (dat/10000) ; + + dat = dat%10000 ; + bcd_buf[1] = dat/1000 ; + bcd_buf[1] <<= 4 ; + dat = dat%1000 ; + bcd_buf[1] |= (dat/100) ; + + dat = dat%100 ; + bcd_buf[0] = dat/10 ; + bcd_buf[0] <<= 4 ; + dat = dat%10 ; + bcd_buf[0] |= dat ; + +//printf("***: %d\t***BCD:%x %x %x %x\n", tmp, bcd_buf[3], bcd_buf[2], bcd_buf[1], bcd_buf[0]); +} + +void BcdToUint(_u8 *bcd_buf, _u32 dat) +{ + dat = ( ( (_u32)bcd_buf[3]>>4 ) *10000000 ) + + ( ( (_u32)bcd_buf[3]&0xf )*1000000 ) + + ( ( (_u32)bcd_buf[2]>>4 ) *100000 ) + + ( ( (_u32)bcd_buf[2]&0xf )*10000 ) + + ( ( (_u32)bcd_buf[1]>>4 ) *1000 ) + + ( ( (_u32)bcd_buf[1]&0xf )*100 ) + + ( ( (_u32)bcd_buf[0]>>4 ) *10 ) + + ( ( (_u32)bcd_buf[0]&0xf ) ); + +//printf("***BCD:%x %x %x %x\t***: %d\n", bcd_buf[3], bcd_buf[2], bcd_buf[1], bcd_buf[0], dat); +} + +//print float number +#if PRINT +int printf_float(float data) +{ + unsigned int i=0,j=0; + i = (unsigned int)(data); + j = (unsigned int)((data-i)*1000000); + printf("%d.%06d\n", i, j); + + return 0; +} +#endif + diff --git a/resources/soc/simu/soft/func/source/dg_rs232.c b/resources/soc/simu/soft/func/source/dg_rs232.c new file mode 100644 index 0000000..36fe314 --- /dev/null +++ b/resources/soc/simu/soft/func/source/dg_rs232.c @@ -0,0 +1,193 @@ +#include +#include "../config.h" +#include "../include/asm/ns16550.h" + +#define COM_BASE 0xbfe88000 //com1 for 1D +#define NS16550_LSR 5 +#define NS16550_DATA 0 + +#define LSR_TXRDY 0x20 +#define LSR_RXRDY 0x01 + +#define writeb(val, addr) (*(volatile unsigned char*)(addr) = (val)) +#define readb(addr) (*(volatile unsigned char*)(addr)) +int dg_write(char *str); +int dg_read(char *buffer, unsigned num); +static void uart_putchar(char a0); +static char uart_getchar(void); +static void uart1_init(void) +{ + Uart1_FCR = FIFO_ENABLE|FIFO_RCV_RST|FIFO_XMT_RST|FIFO_TRIGGER_4; + Uart1_LCR = CFCR_DLAB; + Uart1_BaudL = 52; //set 9600Baut + Uart1_LCR = CFCR_8BITS; //8bit, 1stop + Uart1_MCR = MCR_DTR|MCR_RTS; + Uart1_IER = 0; +} + +int dg_ctrl(int argc, char argv[][30]) // main +{ + char buffer[1024]; + uart1_init(); + printf("\n"); + /* Make sure ip address is supplied on the command line */ +// if ( argc < 2 ) { +// printf("Usage: dg_ctrl IP_ADDRESS\n"); +// exit(1); +// } + /* Initialize the sockets library */ +// init_tcpip(); + /* Connect to the dg645 */ +// if ( dg_connect( inet_addr(argv[1]) ) ) { +// printf("Connection Succeeded\n"); + /* Get identification string */ + dg_write("*idn?\n"); +// printf("\n*idn?\n"); + if ( dg_read(buffer,sizeof(buffer)) ) + printf("%s\n",buffer); + else + printf("Timeout\n"); + /* Load default settings */ + dg_write("*rst\n"); // load default settings + dg_write("tsrc 1\n"); // set trigger source to 1(external posedge) + dg_write("burc 1\n"); // set burst count to 1 + dg_write("burd 4e-6\n"); // set burst delay to 4us + dg_write("burm 1\n"); // set burst mode to ON + dg_write("burp 1e-6\n"); // set burst period to 1us + dg_write("dlay 2,0,5e-8\n"); // set A to 0 delay to 50ns + dg_write("dlay 3,2,5e-7\n"); // set B to A delay to 500ns + dg_write("tlvl 0.9\n"); // set trigger level to 0.9V + dg_write("lamp 0,1.66\n"); // set T0 amplitude to 1.66V + dg_write("lamp 1,1.66\n"); // set AB amplitude to 1.66V + dg_write("*sav 4\n"); // save config to 4 +// dg_write("*wai\n"); // wait execute + /* Make sure all commands have executed before closing connection */ +// dg_write("*opc?\n"); +// if ( !dg_read(buffer,sizeof(buffer)) ) +// printf("Timeout\n"); + /* Close the connection */ +// if (dg_close()) +// printf("Closed connection\n"); +// else +// printf("Unable to close connection"); +// } +// else +// printf("Connection Failed\n"); + return 0; +} + +int dg_cmd(int argc, char argv[][30]) +{ + printf("\n"); + dg_write(argv[1]); + dg_write("\n"); +return 0; +} + +int dg_write(char *str) +{ +// printf("\n"); + while(*str != '\0'){ + uart_putchar(*str); + printf("%c",*str); + str++; + } + if(*(str-1) == '\n') printf("\r"); + return 0; +} + +int dg_read(char *buffer, unsigned num) +{ + char t; + int count=0; + unsigned flag=0; + while(1){ + t=uart_getchar(); + if(t==-1) { + *buffer = '\0'; return count; + } + //if(t==10 || t==13 || t=='\0') flag=1; // + if(flag){ + *buffer = '\0'; return count; + } + else{ + *buffer = t; buffer++; count++; + } + } +} + +static void uart_putchar(char a0) +{ + while((readb(COM_BASE + NS16550_LSR) & LSR_TXRDY)==0){} + writeb(a0, COM_BASE + NS16550_DATA); +} + +static char uart_getchar() +{ +//printf("fly to here\n"); + int cnt=0; + while(cnt<1000000 && (readb(COM_BASE + NS16550_LSR) & LSR_RXRDY)==0){cnt++;} + if (cnt>=1000000) return -1; + return readb(COM_BASE + NS16550_DATA); +} + +/* + +TSRC(?){i} Trigger Source +Set (query) the trigger source {to i}. The parameter i determines the trigger +source according to the following table: +i Trigger Source +0 Internal +1 External rising edges +2 External falling edges +3 Single shot external rising edges +4 Single shot external falling edges +5 Single shot +6 Line +Example +TSRC 5 Set up the DG645 for single shot triggering. + +///------------------------- + +DLAY(?)c{,d,t} Delay +Set (query) the delay for channel c {to t relative to channel d}. +Example +DLAY 2,0,10e-6 Set channel A delay to equal channel T0 plus 10 μs. +DLAY 3,2,1e-3 Set channel B delay to equal channel A delay plus 1 ms. +DLAY?3 Query channel B. Should return ‘2,+0.001000000000’ to +indicate that B = A + 1 ms. + +///-------------------------BURST + +BURC(?){i} Burst Count +Set (query) the burst count {to i}. When burst mode is enabled, the DG645 +outputs burst count delay cycles per trigger. +Example +BURC 10 Set the burst count to 10 so that the DG645 will output +10 delay cycles per triggered burst. + +BURD(?){t} Burst Delay +Set (query) the burst delay {to t}. When burst mode is enabled the DG645 delays +the first burst pulse relative to the trigger by the burst delay. +Example +BURD 5e-6 Set the burst delay to 5 μs so that the DG645 will delay the +first cycle of the burst by 5 μs relative to the trigger. + +BURM(?){i} Burst Mode +Set (query) the burst mode {to i}. If i is 0, burst mode is disabled. If i is 1, burst +mode is enabled. + +BURP(?){t} Burst Period +Set (query) the burst period {to t}. The burst period sets the time between delay +cycles during a burst. The burst period may range from 100 ns to 2000 – 10 ns in +10 ns steps. +Example +BURP 1e-3 Set burst period to 1 ms. When a burst is triggered, the +DG645 will generate burst count delay cycles at a 1 kHz rate. + +BURT(?){i} Burst T0 Configuration +Set (query) the burst T0 configuration {to i}. If i is 0, the T0 output is enabled for +all delay cycles of the burst. If i is 1, the T0 output is enabled for first delay cycle +of the burst only. + +*/ diff --git a/resources/soc/simu/soft/func/source/flash.c b/resources/soc/simu/soft/func/source/flash.c new file mode 100644 index 0000000..c54c5f2 --- /dev/null +++ b/resources/soc/simu/soft/func/source/flash.c @@ -0,0 +1,255 @@ +#include "../config.h" + +extern unsigned int str2num (char str[30]); +void mywait(void); +/****************************** +*Flash Test* CONFIDENTIAL + +>CAUTION< +DO NOT add this program to ANY release version! + +Liu Su +liusu-cpu@ict.ac.cn +******************************/ + +//#if FLASH_TEST + +static void flash_clearHVPL(void) +{ + *(volatile _u32*)(0xbfe60000) = 0x40000000; +} + +static void flash_erase(_u32 offset) +{ + *(volatile _u32*)(0xbfe60000) = 0xa0000000|offset; +} + +static void flash_page(_u32 offset) +{ + *(volatile _u32*)(0xbfe60000) = 0xe0000000|offset; +} + +static void flash_setca(_u32 cah, _u32 cal) +{ + *(volatile _u32*)(0xbfe60008) = cal; + *(volatile _u32*)(0xbfe60004) = cah; + *(volatile _u32*)(0xbfe60000) = 0xf0000000; +} + +int set_ca(int argc, char argv[][30]) +{ + _u32 cah,cal; + if(argc !=3 ) {printf("\nUsage: setca ");return 1;} + cah = str2num(argv[1]); + cal = str2num(argv[2]); + *(volatile _u32*)(0xbfe60008) = cal; + *(volatile _u32*)(0xbfe60004) = cah; + *(volatile _u32*)(0xbfe60000) = 0xf0000000; +// mywait(); + return 0; +} + +static void flash_writepl() +{ + int i; + for(i=0; i<128; i+=4) + *(volatile _u32*)(0xbf00e000 + i) = i; +} + +int verif(int argc, char argv[][30]) +{ + printf("\nverif"); + _u32 page_offset; + _u32 page_latch[33]; + int i; + page_offset = 0xe000; + printf("\noffset"); +// crypt + flash_setca(0x1f00e100,0x1f00e000); + printf("\nsetca\n"); +// normal page + flash_clearHVPL(); + printf("clearHVPL\n"); + flash_writepl(); + printf("writepl\n"); + flash_erase(page_offset); +// mywait(); + printf("erase\n"); + flash_page(page_offset); +// mywait(); + printf("page\n"); +// verif + *(volatile _u32*)(0xbfe60010) = 0x14; + *(volatile _u32*)(0xbfe60000) = 0x1000e014; + while(*(volatile _u32*)(0xbfe60014) & 0x2 != 0x2){} + if(*(volatile _u32*)(0xbfe60014) & 0x1) + printf("verif correct\n"); + else + printf("verif error"); +// flash_setca(0x1f000001,0x1f000001); +return 0; +} + +int set_pe_time_mode(int argc, char argv[][30]) +{ + unsigned int mode; + mode = str2num(argv[1]); + *(volatile _u32*)(0xbfe60024) = mode; +/**************************** +mode: 0: 1.5ms + 1: 2.0ms + 2: 2.5ms + 3: 3.0ms + 4: 3.5ms +****************************/ +return 0; +} + +static void set_pe_time(int mode) +{ + *(volatile _u32*)(0xbfe60024) = mode; +} + +int flash_tk(int argc, char argv[][30]) +{ + unsigned int i,num; + num = str2num(argv[1]); + for(i=0; i 0){ + UART_OutpLen--; + Uart1_TxData = frame_tx[TX_IndexW]; + TX_IndexW +=1; + } + else{ + //IFG1 &= ~UTXIFG0; + } +} + +void uart_rx(void) +{ + static _u32 rx_head_flag; //'0'δյ֡ʼ + frame_rx[RX_IndexW] = Uart1_RxData; //ıȽϸߣʱᶪʧһַ֡??? +#if PRINT +printf("%x ", frame_rx[RX_IndexW]); +#endif + RX_IndexW +=1; + + static _u32 len; + if((rx_head_flag == 0) && (frame_rx[RX_IndexW-1] == HEAD)){ + len = RX_IndexW + 9; + rx_head_flag = 1; //յ֡ʼ + } + if(rx_head_flag == 1){ + if((frame_rx[RX_IndexW-1] == TAIL) && (RX_IndexW > (len+(_u32)frame_rx[len]+2))){ + //if(RX_BUFF[len+(_u32)RX_BUFF[len])+2] == TAIL){ + rx_head_flag = 0; + //UART_InpLen = RX_IndexW; + RX_IndexW =0; + main_flag |= rx_bit; //usartյһ֡ +#if PRINT +printf("\n"); +#endif + } + } + +} + +/*-----------------------Ӧ֡----------------------*/ +void Answer() +{ + _u32 i=0; + _u32 j; + _u32 head = 3; + Frame.CheckSum = 0x0; + frame_tx[i++] = 0xfe; + frame_tx[i++] = 0xfe; + frame_tx[i++] = 0xfe; + frame_tx[i++] = Frame.HeadCode; + frame_tx[i++] = Frame.TypeCode; + for(j=0;j<7;j++) + frame_tx[i++] = Frame.Address[j]; + frame_tx[i++] = Frame.CtrlCode; //Ҫ쳣жϺλ + frame_tx[i++] = Frame.DataLen; +#if CJT188_DI_SEQ + frame_tx[i++] = Frame.DI0; + frame_tx[i++] = Frame.DI1; +#else + frame_tx[i++] = Frame.DI1; + frame_tx[i++] = Frame.DI0; +#endif + frame_tx[i++] = Frame.SER; + for(j=0;j<((_u32)Frame.DataLen-3);j++) + frame_tx[i++] = Frame.Data[j]; + while(head < i){ + Frame.CheckSum += frame_tx[head]; + Frame.CheckSum %= 256; + head++; + } + frame_tx[i++] = Frame.CheckSum; + frame_tx[i++] = Frame.TailCode; + UART_OutpLen =i; +} + +_u32 read1(struct Date_Time *Date_and_Time, struct Data *Lcd_data) +{ + _u32 i=0; + _u32 j; + _u32 dat; + union uint_uchar uint2uchar; + Frame.DataLen = 0x2e; + + dat = *(_u32 *)(INFO_FLASH_START + Last_month_num*12 + 4);//total heat of last month + UintToBcd(dat, &uint2uchar); + for(j=0; j<4; j++) + Frame.Data[i++] = uint2uchar.c_value[j]; + Frame.Data[i++] = danwei_KWh; + + dat = (_u32)Lcd_data->total_heat*100/LCD_MULTIPLE; //ǰ + UintToBcd(dat, &uint2uchar); + for(j=0; j<4; j++) + Frame.Data[i++] = uint2uchar.c_value[j]; + Frame.Data[i++] = danwei_KWh; + + dat = (_u32)Lcd_data->heat*100/LCD_MULTIPLE; //ȹ + UintToBcd(dat, &uint2uchar); + for(j=0; j<4; j++) + Frame.Data[i++] = uint2uchar.c_value[j]; + Frame.Data[i++] = danwei_KW; + + dat = (_u32)Lcd_data->flow*10000; //˲ʱ + UintToBcd(dat, &uint2uchar); + for(j=0; j<4; j++) + Frame.Data[i++] = uint2uchar.c_value[j]; + Frame.Data[i++] = danwei_m3; + + dat = (_u32)Lcd_data->total_flow*100/LCD_MULTIPLE; //ۼ + UintToBcd(dat, &uint2uchar); + for(j=0; j<4; j++) + Frame.Data[i++] = uint2uchar.c_value[j]; + Frame.Data[i++] = danwei_m3; + + dat = (_u32)Lcd_data->temp1*100/LCD_MULTIPLE; //ˮ¶ + UintToBcd(dat, &uint2uchar); + for(j=1; j<4; j++) + Frame.Data[i++] = uint2uchar.c_value[j]; + + dat = (_u32)Lcd_data->temp2*100/LCD_MULTIPLE; //ˮ¶ + UintToBcd(dat, &uint2uchar); + for(j=1; j<4; j++) + Frame.Data[i++] = uint2uchar.c_value[j]; + + dat = (_u32)Lcd_data->total_time; //ۼƹʱ + UintToBcd(dat, &uint2uchar); + for(j=1; j<4; j++) + Frame.Data[i++] = uint2uchar.c_value[j]; + + //ʵʱʱ + dat = (_u32)Date_and_Time->Day*1000000 + (_u32)Date_and_Time->Hour*10000 + (_u32)Date_and_Time->Minute*100 + (_u32)Date_and_Time->Second; + UintToBcd(dat, &uint2uchar); + for(j=0; j<4; j++) + Frame.Data[i++] = uint2uchar.c_value[j]; + dat = (_u32)Date_and_Time->Year*100 + (_u32)Date_and_Time->Month; + UintToBcd(dat, &uint2uchar); + for(j=0; j<3; j++) + Frame.Data[i++] = uint2uchar.c_value[j]; + + dat = (_u32)ST; //״̬ST + UintToBcd(dat, &uint2uchar); + Frame.Data[i++] = uint2uchar.c_value[0]; + Frame.Data[i++] = uint2uchar.c_value[1]; + + return 0; +} + +_u32 read2() //ϼ½ +{ + _u32 j; + j = (_u32)Frame.DI1; + Frame.DataLen = 0x08; +#if 0 + Flash_Read_Info(); + _u32 i; + for(i=0; i<256; i++) + { + TXBUF0 = Array[i]; + while((U0TCTL & TXEPT) == 0) ; + } +#endif + + _u32 offset; + _u32 dat; + union uint_uchar uint2uchar; + offset = ((Last_month_num-(j-32))%18)*12+4; //0~216 + dat = *(_u32 *)(INFO_FLASH_START + offset);//total heat + UintToBcd(dat, &uint2uchar); + for(j=0; j<4; j++) + Frame.Data[j] = uint2uchar.c_value[j]; + Frame.Data[4] = danwei_KWh; + + return 0; +} + +_u32 read3() +{ + switch(Frame.DI1){ + case 0x02: //۸ + Frame.DataLen = 0x12; + break; + case 0x03: // + Frame.DataLen = 0x04; + break; + case 0x04: // + Frame.DataLen = 0x04; + break; + case 0x05: // + Frame.DataLen = 0x12; + break; + default: + return ERROR; + break; + } + + return 0; +} + +_u32 read4() +{ + Frame.DataLen = 0x04; + + return 0; +} + +_u32 read5() +{ + Frame.DataLen = 0x03; + + return 0; +} + +_u32 write1() +{ + switch(Frame.DI1){ + case 0x10: + Frame.DataLen = 0x05; + break; + case 0x11: + Frame.DataLen = 0x03; + break; + case 0x12: + Frame.DataLen = 0x03; + break; + case 0x13: + Frame.DataLen = 0x08; + break; + case 0x14: + Frame.DataLen = 0x04; + break; + case 0x15: + Frame.DataLen = 0x03; + break; + case 0x17: + Frame.DataLen = 0x05; + break; + case 0x19: + Frame.DataLen = 0x03; + break; + default: + return ERROR; + break; + } + + return 0; +} + +_u32 write2() +{ + Frame.DataLen = 0x03; + + return 0; +} + +_u32 write3() +{ + Frame.DataLen = 0x05; + + return 0; +} + +_u32 write4() +{ + switch(Frame.DI1){ + case 0x12: + Frame.DataLen = 0x05; + break; + case 0x14: + Frame.DataLen = 0x05; + break; + case 0x16: + Frame.DataLen = 0x05; + break; + default: + return ERROR; + break; + } + + return 0; +} + +void do_err() +{ + _u32 dat; + union uint_uchar uint2uchar; + + Frame.CtrlCode |= 0x40; + Frame.DataLen = 0x03; + Frame.DI0 = Frame.SER; + UintToBcd(ST, &uint2uchar); + Frame.DI1 = uint2uchar.c_value[0]; + Frame.SER = uint2uchar.c_value[1]; +} + +//_u32 do_frame() //λӦģʽЭн +_u32 do_frame(struct Date_Time *Date_and_Time, struct Data *Lcd_data) +{ + _u32 err; + _u32 i,j,head,tail; + /*----------------ʼ֡ʽ----------------*/ + + Frame.CheckSum = 0x0; + for(i=0;frame_rx[i] == 0xfe;i++); + head = i; + j = head; + + Frame.HeadCode = frame_rx[head++]; + Frame.TypeCode = frame_rx[head++]; + for(i=0;i<7;i++) + Frame.Address[i] = frame_rx[head++]; + Frame.CtrlCode = frame_rx[head++]; + Frame.DataLen = frame_rx[head++]; +#if CJT188_DI_SEQ + Frame.DI0 = frame_rx[head++]; + Frame.DI1 = frame_rx[head++]; +#else + Frame.DI1 = frame_rx[head++]; + Frame.DI0 = frame_rx[head++]; +#endif + Frame.SER = frame_rx[head++]; + for(i=0;i<((_u32)Frame.DataLen-3);i++) + Frame.Data[i] = frame_rx[head++]; + while(j < head){ + Frame.CheckSum += frame_rx[j]; + Frame.CheckSum %= 256; + j++; + } + if(Frame.CheckSum != frame_rx[j]) { + return 1; + } + tail = j+1; + Frame.TailCode = frame_rx[tail]; + /*----------------֡ʽ----------------*/ + + /*------------------------ݿͽ--------------------------*/ + switch(Frame.CtrlCode){ + case 0x01: //read data + if((Frame.DI0==0x90)&&(Frame.DI1==0x1f)) err = read1(Date_and_Time, Lcd_data); + else if(Frame.DI0==0xd1) err = read2(); + else if(Frame.DI0==0x81) err = read3(); + break; + case 0x09: //Կ汾 + if((Frame.DI0==0x81)&&(Frame.DI1==0x06)) err = read4(); + break; + case 0x03: //ַ + if((Frame.DI0==0x81)&&(Frame.DI1==0x0a)) err = read5(); + break; + case 0x04: //д + if(Frame.DI0==0xa0) err = write1(); + break; + case 0x15: //дַ + if((Frame.DI0==0xa0)&&(Frame.DI1==0x18)) err = write2(); + break; + case 0x16: //дͬ + if((Frame.DI0==0xa0)&&(Frame.DI1==0x16)) err = write3(); + break; + case CJT188_DEF_READ: // + + break; + case CJT188_DEF_WRITE: //д + if(Frame.DI0==0xb0) err = write4(); + break; + default: + err = 2; + break; + } + /*------------------------ͽ--------------------------*/ + Frame.CtrlCode |= 0x80; + if(err) do_err(); + Answer(); + + return 0; +} + +void Frame_exe(struct Date_Time *Date_and_Time, struct Data *Lcd_data) +{ + _u32 err; + err = do_frame(&Date_and_Time, &Lcd_data); + if(err==0) + { + TX_IndexW = 0; + Uart1_TxData = 0xfe; + //IFG1 |= UTXIFG0; + } + else if(err==1) + { + //TXBUF0 = 0xdd; + //while((U0TCTL & TXEPT) == 0) ; + } + else if(err==2) + { + //TXBUF0 = 0xee; + //while((U0TCTL & TXEPT) == 0) ; + } +} +#endif diff --git a/resources/soc/simu/soft/func/source/isp.c b/resources/soc/simu/soft/func/source/isp.c new file mode 100644 index 0000000..41d856c --- /dev/null +++ b/resources/soc/simu/soft/func/source/isp.c @@ -0,0 +1,279 @@ + +#include "../config.h" + +#if PRINT +void tgt_putchar(_u8 chr) +{ + while(!(Uart0_LSR & 0x20)) ; + Uart0_TxData = chr; +} + +_u8 tgt_getchar() +{ + _u8 chr; + while(!(Uart0_LSR & 0x1)) ; + chr = Uart0_RxData ; + + return chr; +} + +_u8 tgt_testchar() +{ + _u8 chr; + chr = (Uart0_LSR & 0x1); + + return chr; +} +#endif + +_u32 now() +{ + _u32 count; + count = PMU_Count; + count &= COUNT_MASK; + + return count; +} + +#if (ISP || MONTHDATA_MODULE) +#if (LS1D_FPGA) +void spiflash_erase(_u32 addr_start, _u32 addr_end) +{ + __asm__ volatile( + "move $15,$31;\n" +/**spi_flash init**/ + "li $8,0xbfe70000;\n" + "li $9,0xc0;\n" + "sb $9,1($8);\n" + "li $9,0x10;\n" + "sb $9,4($8);\n" + "li $9,0x5;\n" + "sb $9,3($8);\n" + "li $9,0x1;\n" + "sb $9,6($8);\n" + "li $9,0x50;\n" + "sb $9,0($8);\n" +/**spi_flash code_program**/ + "li $14, 0x1000;\n" + "1:li $9,0x11;\n" + "sb $9,5($8);\n" /*high cs*/ + "bal 102f;\n" /*wait sr */ + "nop;\n" + "li $9,6;\n" /* write enable */ + "bal 101f;\n" + "nop;\n" + "li $9,0x11;\n" /*high cs*/ + "sb $9,5($8);\n" + "li $9,1;\n" /* write status*/ + "bal 101f;\n" + "nop;\n" + "li $9,0;\n" /* write 0*/ + "bal 103f;\n" + "nop;\n" + "li $9,0x11;\n" /*high cs*/ + "sb $9,5($8);\n" + "bal 102f;\n" /*wait sr */ + "nop;\n" + "li $9,6;\n" /* write enable */ + "bal 101f;\n" + "nop;\n" + "li $9,0x11;\n" /*high cs*/ + "sb $9,5($8);\n" + "li $9,0x20;\n" /*bulk erase, 4kB*/ + "bal 101f;\n" + "nop;\n" + "srl $9,$4,16;\n" /*addr*/ + "bal 103f;\n" + "nop;\n" + "srl $9,$4,8;\n" + "bal 103f;\n" + "nop;\n" + "move $9,$4;\n" + "bal 103f;\n" + "nop;\n" + "li $9,0x11;\n" /*high cs*/ + "sb $9,5($8);\n" + "bal 102f;\n" /*wait sr*/ + "nop;" + "addu $4,$14;\n" + "slt $9,$5,$4;\n" + "beqz $9,1b;\n" + "nop;\n" + "3:\n" + "li $9,0x11;\n" + "sb $9,5($8);\n" /*high cs*/ + + "li $9,0x11;\n" + "sb $9,4($8);\n" + "b 999f;\n" + "nop;\n" + + "101:li $11,1;\n" + "sb $11,5($8);\n" /*enable and low cs*/ + "103:sb $9,2($8);\n" + "1:lb $9,1($8);\n" + "andi $9,1;\n" + "bnez $9,1b;\n" + "nop;\n" + "lb $9,2($8);\n" + "jr $31;\n" + "nop\n;" + "102:move $10,$31;\n" + "1:li $9,5;\n" /*wait read sr*/ + "bal 101b;\n" + "nop;\n" + "andi $9,1;\n" + "bnez $9,1b;\n" /*can continue read sr,write to gen clock*/ + "nop;\n" + "li $9,0x11;\n" /*high cs*/ + "sb $9,5($8);\n" + "jr $10;\n" + "nop;\n" + + "999:move $31,$15;\n" + :::"$8","$9","$10","$11","$4","$5","$14","$15" + ); +} +void spiflash_write(_u32 addr_w, _u32 addr_r, _u32 length) +{ + __asm__ volatile( + "move $15,$31;\n" +/**spi_flash init**/ + "li $8,0xbfe70000;\n" + "li $9,0xc0;\n" + "sb $9,1($8);\n" + "li $9,0x10;\n" + "sb $9,4($8);\n" + "li $9,0x5;\n" + "sb $9,3($8);\n" + "li $9,0x1;\n" + "sb $9,6($8);\n" + "li $9,0x50;\n" + "sb $9,0($8);\n" +/**spi_flash code_program**/ + "li $9,0x11;\n" + "sb $9,5($8);\n" /*high cs*/ + "bal 102f;\n" /*wait sr */ + "nop;\n" + "li $9,6;\n" /* write enable */ + "bal 101f;\n" + "nop;\n" + "li $9,0x11;\n" /*high cs*/ + "sb $9,5($8);\n" + "li $9,1;\n" /* write status*/ + "bal 101f;\n" + "nop;\n" + "li $9,0;\n" /* write 0*/ + "bal 103f;\n" + "nop;\n" + "1:li $9,0x11;\n" /*high cs*/ + "sb $9,5($8);\n" + "bal 102f;\n" /*wait sr */ + "nop;\n" + "li $9,6;\n" /* write enable */ + "bal 101f;\n" + "nop;\n" + "li $9,0x11;\n" /*high cs*/ + "sb $9,5($8);\n" + "bal 102f;\n" /*wait sr*/ + "nop;" + "li $9,2;\n" /*write sector*/ + "bal 101f;\n" + "nop;\n" + "srl $9,$4,16;\n" /*addr*/ + "bal 103f;\n" + "nop;\n" + "srl $9,$4,8;\n" + "bal 103f;\n" + "nop;\n" + "move $9,$4;\n" + "bal 103f;\n" + "nop;\n" + "2:lb $9,0($5);\n" /*write 1 data*/ + "bal 103f;\n" + "nop;\n" + "addiu $4,1;\n" + "addiu $5,1;\n" + "addiu $6,-1;\n" + "beqz $6,3f;\n" + "nop;\n" + "b 1b;\n" + "nop;\n" + "3:\n" + "li $9,0x11;\n" + "sb $9,5($8);\n" /*high cs*/ + + "li $9,0x11;\n" + "sb $9,4($8);\n" + "b 999f;\n" + "nop;\n" + + "101:li $11,1;\n" + "sb $11,5($8);\n" /*enable and low cs*/ + "103:sb $9,2($8);\n" + "1:lb $9,1($8);\n" + "andi $9,1;\n" + "bnez $9,1b;\n" + "nop;\n" + "lb $9,2($8);\n" + "jr $31;\n" + "nop\n;" + "102:move $10,$31;\n" + "1:li $9,5;\n" /*wait read sr*/ + "bal 101b;\n" + "nop;\n" + "andi $9,1;\n" + "bnez $9,1b;\n" /*can continue read sr,write to gen clock*/ + "nop;\n" + "li $9,0x11;\n" /*high cs*/ + "sb $9,5($8);\n" + "jr $10;\n" + "nop;\n" + + "999:move $31,$15;\n" + :::"$8","$9","$10","$11","$4","$5","$6","$15" + ); +} +#else +//²Á³ýaddrËùÔڵĶΠ+void Flash_Erase(_u32 addr) +{ + FLASH_CMD_REG = FLASH_ERASE_CMD | (addr & FLASH_ADDR_MASK) ; + +} + +_u32 Flash_Write(_u32 addr, _u32 *data, _u32 num) +{ + FLASH_CMD_REG = FLASH_PAGE_LATCH_CLEAR; + /*wait interrupt ? Should I disable other int??????*/ + //debug("Page_latch is clean now...\n") + + _u32 flash_block_mask = FLASH_BLOCK_SIZE - 1; + _u32 *page_data = (_u32 *)(addr & ~flash_block_mask) ; + _u32 *old_data = (_u32 *)(addr & ~flash_block_mask) ; + _u32 i, j, offset; + + j = 0; + offset = ((addr & flash_block_mask)>>2); + for(i=0; i<(FLASH_BLOCK_SIZE/4); i++) + { + if( (offset <= i) && (j < num) ) + page_data[i] = data[j++]; + else + page_data[i] = old_data[i]; + } + + Flash_Erase(addr); + /*wait interrupt ? */ + //debug("Flash page is clean now...\n") + + FLASH_CMD_REG = FLASH_WRITE_CMD | (addr & FLASH_ADDR_MASK) ; + /*wait interrupt ? */ + //debug("Flash page write is finish...\n") + + return 0; +} +#endif +#endif + + diff --git a/resources/soc/simu/soft/func/source/key.c b/resources/soc/simu/soft/func/source/key.c new file mode 100644 index 0000000..4b6c0e9 --- /dev/null +++ b/resources/soc/simu/soft/func/source/key.c @@ -0,0 +1,77 @@ +/********************************************************************************************************************************************************************** + This file uses key to jump between diffrence cases. +**********************************************************************************************************************************************************************/ + +#include "../config.h" + +#if KEY_MODULE +static void Auto_jump(struct Data *Lcd_data) +{ + wait[1] = 0; + main_flag &= ~A3_delay; + if(Lcd_data->lcdmode/10 == A4) { + main_flag |= wait_2hour; + } + else { + if(Lcd_data->lcdmode/10 == A3){ + wait[2] = 0; + main_flag |= A3_delay; + } + main_flag |= wait_1min; + } + main_flag |= lcd_bit; +} + +static void Key_short(struct Data *Lcd_data) +{ + if(Lcd_data->lcdmode/10 == A4) Lcd_data->lcdmode = (Lcd_data->lcdmode%10 + 1)%7 + (Lcd_data->lcdmode/10)*10; + if(Lcd_data->lcdmode/10 == A1) Lcd_data->lcdmode = (Lcd_data->lcdmode%10 + 1)%9 + (Lcd_data->lcdmode/10)*10; + if(Lcd_data->lcdmode/10 == A2) Lcd_data->lcdmode = (Lcd_data->lcdmode%10 + 1)%7 + (Lcd_data->lcdmode/10)*10; + if(Lcd_data->lcdmode/10 == A3){ + if(Lcd_data->lcdmode == A3_0){ + Lcd_data->lcdmode = A3_1; + Lcd_data->history = Last_month_num; + } + else { + Lcd_data->lcdmode = A3_1; + Lcd_data->history += 1; + Lcd_data->history %= 18; + } + } + Auto_jump(Lcd_data); +} + +static void Key_long(struct Data *Lcd_data) +{ + /**/ + if(Lcd_data->lcdmode == A1_6) { + Lcd_data->lcdmode = A4_0; + PMU[0] = 0x4; //cruise delay 0.25s,2s + main_flag &= ~wait_1min; + } + else { + if(Lcd_data->lcdmode/10 == A4) { + Lcd_data->lcdmode = A1_0; + PMU[0] = 0x7004; //cruise delay 2s,8s + main_flag &= ~wait_2hour; + } + else if(Lcd_data->lcdmode/10 == A1) Lcd_data->lcdmode = A2_0; + else if(Lcd_data->lcdmode/10 == A2) Lcd_data->lcdmode = A3_0; + else if(Lcd_data->lcdmode/10 == A3) Lcd_data->lcdmode = A1_0; + } + Auto_jump(Lcd_data); +} + +void Key(struct Data *Lcd_data) +{ + if(main_flag & long_key) + { + main_flag &= ~long_key; + Key_long(Lcd_data); + } + else + { + Key_short(Lcd_data); + } +} +#endif diff --git a/resources/soc/simu/soft/func/source/lcd.c b/resources/soc/simu/soft/func/source/lcd.c new file mode 100644 index 0000000..3db28d7 --- /dev/null +++ b/resources/soc/simu/soft/func/source/lcd.c @@ -0,0 +1,414 @@ +#include "../config.h" + +/****************************************************************************** +lcd module + 1.LcdClear + 2.LcdPrintAll + 3.LcdLowV + 4.LcdDisplay + + Notice: Some variable of Lcd_data = real_value * LCD_MULTIPLE +******************************************************************************/ + +#if LCD_MODULE +//clear lcd_buf +static void LcdClear(_u8 *LCD_BUF) +{ + _u32 i ; + + for(i=0;i>4)]; + if(!(minus++)) LCD_BUF[0] = word[5]; //'F', overflow +step1: + if(!(minus++)) LCD_BUF[0] = MINUS; + LCD_BUF[1] = number[(bcd_buf[3])&0xf]; +step2: + if(!(minus++)) LCD_BUF[1] = MINUS; + LCD_BUF[2] = number[(bcd_buf[2]>>4)]; +step3: + if(!(minus++)) LCD_BUF[2] = MINUS; + LCD_BUF[3] = number[(bcd_buf[2])&0xf]; +step4: + if(!(minus++)) LCD_BUF[3] = MINUS; + LCD_BUF[4] = number[(bcd_buf[1]>>4)]; +step5: + if(!(minus++)) LCD_BUF[4] = MINUS; + LCD_BUF[5] = number[(bcd_buf[1])&0xf]; +step6: + if(!(minus++)) LCD_BUF[5] = MINUS; + LCD_BUF[6] = number[(bcd_buf[0]>>4)]; +step7: + if(!(minus++)) LCD_BUF[6] = MINUS; + LCD_BUF[7] = number[(bcd_buf[0])&0xf]; + + if(decimal_length==5) LCD_BUF[2] |= 0x80; //print p1 + if(decimal_length==4) LCD_BUF[3] |= 0x80; //print p2 + if(decimal_length==3) LCD_BUF[4] |= 0x80; //print p3 + if(decimal_length==2) LCD_BUF[5] |= 0x80; //print p4 + if(decimal_length==1) LCD_BUF[6] |= 0x80; //print p5 +} + +void LcdDisplay(struct Date_Time *Date_and_Time, struct Data *Lcd_data) +{ + _u8 LCD_BUF[LCD_LENGTH]; + LcdClear(&LCD_BUF) ; + +#if LCD_TEST + //LcdTest1(); + LcdTest2(&LCD_BUF); +#else + //printf("lcdmode = %d\n", Lcd_data->lcdmode); + + _u8 bcd_buf[4]; + _u32 i; + _u32 minus = 1; + volatile _u32 display; + + i = Lcd_data->lcdmode/10; + if(i == A1){ //-------------------------A1----- + switch(Lcd_data->lcdmode){ + case A1_0: + LCD_BUF[0] = word[0]; //'A' + LCD_BUF[1] = number[1]; //'1' + break; + case A1_1: + if(Lcd_data->total_heat < 0) minus = 0; + display = minus?(_u32)(Lcd_data->total_heat):(_u32)(0 - Lcd_data->total_heat); + UintToBcd((display/100000), &bcd_buf); + LcdBufWrite(&LCD_BUF, &bcd_buf, 0, minus); + LCD_BUF[8] = A1_1_0; + LCD_BUF[9] = A1_1_1; //KW*h + break; + case A1_2: + if(Lcd_data->heat < 0) minus = 0; + display = minus?(_u32)(Lcd_data->heat):(_u32)(0 - Lcd_data->heat); + UintToBcd((display/10000), &bcd_buf); + LcdBufWrite(&LCD_BUF, &bcd_buf, 1, minus); + LCD_BUF[8] = A1_2_0; + LCD_BUF[9] = A1_2_1; + break; + case A1_3: + if(Lcd_data->temp1 < 0) minus = 0; + display = minus?(_u32)(Lcd_data->temp1):(_u32)(0 - Lcd_data->temp1); + UintToBcd((display), &bcd_buf); + LcdBufWrite(&LCD_BUF, &bcd_buf, 5, minus); + LCD_BUF[4] = 0x0; + + if(Lcd_data->temp2 < 0) minus = 0; + display = minus?(_u32)(Lcd_data->temp2):(_u32)(0 - Lcd_data->temp2); + UintToBcd((display/10000), &bcd_buf); + LcdBufWrite(&LCD_BUF, &bcd_buf, 1, minus); + + LCD_BUF[8] = A1_3_0; + LCD_BUF[9] = A1_3_1; + break; + case A1_4: + if(Lcd_data->temp0 < 0) minus = 0; + display = minus?(_u32)(Lcd_data->temp0):(_u32)(0 - Lcd_data->temp0); + UintToBcd((display/1000), &bcd_buf); + LcdBufWrite(&LCD_BUF, &bcd_buf, 2, minus); + LCD_BUF[8] = A1_4_0; + LCD_BUF[9] = A1_4_1; + break; + case A1_5: + if(Lcd_data->total_flow < 0) minus = 0; + display = minus?(_u32)(Lcd_data->total_flow):(_u32)(0 - Lcd_data->total_flow); + UintToBcd((display/1000), &bcd_buf); + LcdBufWrite(&LCD_BUF, &bcd_buf, 2, minus); + LCD_BUF[8] = A1_5_0; + LCD_BUF[9] = A1_5_1; + break; + case A1_6: + if(Lcd_data->flow < 0) minus = 0; + display = minus?(_u32)(Lcd_data->flow):(_u32)(0 - Lcd_data->flow); + UintToBcd((display/100), &bcd_buf); + LcdBufWrite(&LCD_BUF, &bcd_buf, 3, minus); + LCD_BUF[8] = A1_6_0; + LCD_BUF[9] = A1_6_1; + break; + case A1_7: + display = Lcd_data->total_time; + UintToBcd(display, &bcd_buf); + LcdBufWrite(&LCD_BUF, &bcd_buf, 0, minus); + LCD_BUF[8] = A1_7_0; + LCD_BUF[9] = A1_7_1; + break; + case A1_8: + display = Lcd_data->alarm_time; + UintToBcd(display, &bcd_buf); + LcdBufWrite(&LCD_BUF, &bcd_buf, 0, minus); + LCD_BUF[8] = A1_8_0; + LCD_BUF[9] = A1_8_1; + break; + } + } + else if(i == A2){ //--------------------A2----- + switch(Lcd_data->lcdmode){ + case A2_0: + LCD_BUF[0] = word[0]; //'A' + LCD_BUF[1] = number[2]; //'2' + break; + case A2_1: + Lcd_data->date = Date_and_Time->Year*10000 + Date_and_Time->Month*100 + Date_and_Time->Day; //ע⣬Ҫתֹ + display = Lcd_data->date; + UintToBcd(display, &bcd_buf); + LcdBufWrite(&LCD_BUF, &bcd_buf, 0, minus); + LCD_BUF[3] |= 0x80; + LCD_BUF[5] |= 0x80; + LCD_BUF[8] = A2_1_0; //ʱ + LCD_BUF[9] = A2_1_1; // + break; + case A2_2: + Lcd_data->time = Date_and_Time->Hour*1000000 + Date_and_Time->Minute*1000 + Date_and_Time->Second; //ע⣬Ҫתֹ + display = Lcd_data->time; + UintToBcd(display, &bcd_buf); + LcdBufWrite(&LCD_BUF, &bcd_buf, 0, minus); + LCD_BUF[2] = 0x02; + LCD_BUF[5] = 0x02; + LCD_BUF[8] = A2_2_0; //ʱ ʱ + LCD_BUF[9] = A2_2_1; // + break; + case A2_3: //û + display = Lcd_data->usercode; + UintToBcd(display, &bcd_buf); + LcdBufWrite(&LCD_BUF, &bcd_buf, 0, minus); + break; + case A2_4: //汾 + display = (_u32)(Lcd_data->version*10); + UintToBcd(display, &bcd_buf); + LcdBufWrite(&LCD_BUF, &bcd_buf, 1, minus); + break; + case A2_5: //͵ѹ + LcdLowV(&LCD_BUF); + break; + case A2_6: /*ȫ*/ + LcdPrintAll(&LCD_BUF); + break; + } + } + else if(i == A3){ //--------------------A3----- + switch(Lcd_data->lcdmode){ + case A3_0: + LCD_BUF[0] = word[0]; //'A' + LCD_BUF[1] = number[3]; //'3' + break; + case A3_1: + display = *(_u32 *)(INFO_FLASH_START + Lcd_data->history*12); + UintToBcd(display, &bcd_buf); + LcdBufWrite(&LCD_BUF, &bcd_buf, 0, minus); + LCD_BUF[4] = 0x02; + LCD_BUF[7] = 0x0; + LCD_BUF[8] = A3_1_0; //ʱ + LCD_BUF[9] = A3_1_1; // + break; + case A3_2: + display = *(_u32 *)(INFO_FLASH_START + Lcd_data->history*12+8); + UintToBcd((display), &bcd_buf); + LcdBufWrite(&LCD_BUF, &bcd_buf, 2, minus); + LCD_BUF[8] = A3_2_0; //ۻ + LCD_BUF[9] = A3_2_1; //m3 + break; + case A3_3: + display = *(_u32 *)(INFO_FLASH_START + Lcd_data->history*12+4); + UintToBcd((display), &bcd_buf); + LcdBufWrite(&LCD_BUF, &bcd_buf, 2, minus); + LCD_BUF[8] = A3_3_0; //ۼ + LCD_BUF[9] = A3_3_1; //KW*h + break; + } + } + else if(i == A4){ //--------------------A4----- + switch(Lcd_data->lcdmode){ + case A4_0: + LCD_BUF[0] = word[0]; //'A' + LCD_BUF[1] = number[4]; //'4' + break; + case A4_1: + if(Lcd_data->flow < 0) minus = 0; + display = minus?(_u32)(Lcd_data->flow):(_u32)(0 - Lcd_data->flow); + UintToBcd((display/100), &bcd_buf); + LcdBufWrite(&LCD_BUF, &bcd_buf, 3, minus); + LCD_BUF[8] = A4_1_0; + LCD_BUF[9] = A4_1_1; + break; + case A4_2: + if(Lcd_data->total_flow < 0) minus = 0; + display = minus?(_u32)(Lcd_data->total_flow):(_u32)(0 - Lcd_data->total_flow); + UintToBcd((display), &bcd_buf); + LcdBufWrite(&LCD_BUF, &bcd_buf, 5, minus); + LCD_BUF[8] = A4_2_0; + LCD_BUF[9] = A4_2_1; + break; + case A4_3: + if(Lcd_data->heat < 0) minus = 0; + display = minus?(_u32)(Lcd_data->heat):(_u32)(0 - Lcd_data->heat); + UintToBcd((display/10), &bcd_buf); + LcdBufWrite(&LCD_BUF, &bcd_buf, 4, minus); + LCD_BUF[8] = A4_3_0; + LCD_BUF[9] = A4_3_1; + break; + case A4_4: + if(Lcd_data->total_heat < 0) minus = 0; + display = minus?(_u32)(Lcd_data->total_heat):(_u32)(0 - Lcd_data->total_heat); + UintToBcd((display/10), &bcd_buf); + LcdBufWrite(&LCD_BUF, &bcd_buf, 4, minus); + LCD_BUF[8] = A4_4_0; + LCD_BUF[9] = A4_4_1; //KW*h + break; + case A4_5: + if(Lcd_data->temp1 < 0) minus = 0; + display = minus?(_u32)(Lcd_data->temp1):(_u32)(0 - Lcd_data->temp1); + UintToBcd((display*10), &bcd_buf); + LcdBufWrite(&LCD_BUF, &bcd_buf, 0, minus); + + if(Lcd_data->temp2 < 0) minus = 0; + display = minus?(_u32)(Lcd_data->temp2):(_u32)(0 - Lcd_data->temp2); + UintToBcd((display/1000), &bcd_buf); + LcdBufWrite(&LCD_BUF, &bcd_buf, 0, minus); + + LCD_BUF[8] = A4_5_0; + LCD_BUF[9] = A4_5_1; + break; + case A4_6: + if(Lcd_data->temp0 < 0) minus = 0; + display = minus?(_u32)(Lcd_data->temp0):(_u32)(0 - Lcd_data->temp0); + UintToBcd((display/1000), &bcd_buf); + LcdBufWrite(&LCD_BUF, &bcd_buf, 2, minus); + LCD_BUF[8] = A4_6_0; + LCD_BUF[9] = A4_6_1; + break; + } + } + + if(main_flag & lowV_flag) LcdLowV(&LCD_BUF); + + WriteLcdRegs(&LCD_BUF); +#endif +} + +#endif diff --git a/resources/soc/simu/soft/func/source/temp_flow.c b/resources/soc/simu/soft/func/source/temp_flow.c new file mode 100644 index 0000000..88bee1f --- /dev/null +++ b/resources/soc/simu/soft/func/source/temp_flow.c @@ -0,0 +1,416 @@ +/********************************************************************************************************************************************************************** + This file uses TDC module to caculate temperature and waterflow. +**********************************************************************************************************************************************************************/ + +#include "../config.h" + +#if (TDC_TEMP_MODULE|TDC_FLOW_MODULE) +//#undef PRINT + +void InitTdc(void) +{ +#if (TEMP_TEST|FLOW_TEST) + //if PMU[0]&0x10000, the cruise delay will divide 4. + PMU[0] = 0x4; //cruise delay 0.25s,2s +#else + PMU[0] = 0x7004; //cruise delay 2s,8s +#endif + Sonar[0] = 0xa210; //4M div 4, 96mA, Fireup, stop2 + Sonar[1] = 0xf8840081; //use Stdc, measure 2 + Sonar[2] = 0xc0300000; //detect first wave + Sonar[3] = 0x8004000; //set delay, detect first wave + Sonar[4] = 0x4000500; //set delay, from first wave to the first stop + Thsens[0] = 0xf7; +#if TDC_TEMP_MODULE + PMU[1] |= 0x80; //cruise mode, temp +#endif +#if TDC_FLOW_MODULE + PMU[1] |= 0x40; //cruise mode, flow +#endif + +#if (TEMP_TEST|FLOW_TEST) + printf("Tdc initted...\n"); +#endif +} + +static _fp32 Time_Caculate(_u32 *result, struct Data *Lcd_data, _u32 start, _u32 stop_num) +{ + _u32 i; +#if FLOW_TEST + //printf("Time_Caculate...\n"); +#endif + + _fp32 average_time; + short a[stop_num],b[stop_num]; + short sum_a, sum_b; + for(i=0;i0xd5) +{ + printf("result_low[%d] = 0x%x\n", i, b[i]); //0xc7==199 + printf("-------------------------------------------------------------------------------------------------------------------------------------------\n"); +} +#endif + } + + sum_a = 0; + sum_b = 0; + for(i=1;iauto_caculate; //ns, 10-9(s) + + return average_time; +} + +static _fp32 GetUltrasonicVelocity(_fp32 temp) +{ + _fp32 V; + V = 1402336 + + 5033.58f*temp - + 5795.06f*temp*temp/100 + + 3316.36f*temp*temp*temp/10000 - + 1452.62f*temp*temp*temp*temp/1000000 + + 3044.9f*temp*temp*temp*temp*temp/1000000000; + +//printf("UltrasonicVelocity: %d\t", (unsigned int)(V)); + return V/1000; //m/s +} + +void Flow_Caculate(_fp32 delta_time, _fp32 duration, struct Data *Lcd_data) +{ + /*delta_time***********ns*/ +#if (FLOW_TEST&TEMP_TEST) + _fp32 UltrasonicVelocity; + UltrasonicVelocity = GetUltrasonicVelocity(Lcd_data->temp1/LCD_MULTIPLE); + + _fp32 flow_Velocity; + //flow_Velocity = (delta_time/1000000000)*UltrasonicVelocity*UltrasonicVelocity/(2*SOUND_PATH*COS_RESULT); + flow_Velocity = delta_time*UltrasonicVelocity*UltrasonicVelocity/(2*SOUND_PATH*COS_RESULT*10000); //m/s, flow_Velocity*LCD_MULTIPLE + + Lcd_data->flow = CONST*K_COEFFICIENT*DIAMETER*DIAMETER*flow_Velocity*3600; //m3/h, Lcd_data->flow*LCD_MULTIPLE + Lcd_data->total_flow += Lcd_data->flow*duration/3600; //m3, Lcd_data->total_flow*LCD_MULTIPLE +#endif +} + +void Temp_Caculate(unsigned int *result, struct Data *Lcd_data, unsigned int num) +{ + int i; +#if TEMP_TEST + //printf("Temp_Caculate...\n"); +#endif + + short a[num],b[num]; + for(i=0;iauto_caculate-(b[5]-b[4]))*2/(_fp32)((a[3]-a[2]+a[1]-a[0])*Lcd_data->auto_caculate-(b[3]-b[2]+b[1]-b[0])) ; + r_output = (_fp32)((a[7]-a[6])*Lcd_data->auto_caculate-(b[7]-b[6]))*2/(_fp32)((a[3]-a[2]+a[1]-a[0])*Lcd_data->auto_caculate-(b[3]-b[2]+b[1]-b[0])) ; + + r_input += (_fp32)((a[11]-a[10])*Lcd_data->auto_caculate-(b[11]-b[10]))*2/(_fp32)((a[15]-a[14]+a[13]-a[12])*Lcd_data->auto_caculate-(b[15]-b[14]+a[13]-a[12])) ; + r_input /= 2; + r_output += (_fp32)((a[9]-a[8])*Lcd_data->auto_caculate-(b[9]-b[8]))*2/(_fp32)((a[15]-a[14]+a[13]-a[12])*Lcd_data->auto_caculate-(b[15]-b[14]+a[13]-a[12])) ; + r_output /=2; + } + else + { + r_input = (_fp32)((a[3]-a[2])*Lcd_data->auto_caculate-(b[3]-b[2]))*2/(_fp32)((a[7]-a[6]+a[5]-a[4])*Lcd_data->auto_caculate-(b[7]-b[6]+b[5]-b[4])) ; + r_output = (_fp32)((a[1]-a[0])*Lcd_data->auto_caculate-(b[1]-b[0]))*2/(_fp32)((a[7]-a[6]+a[5]-a[4])*Lcd_data->auto_caculate-(b[7]-b[6]+b[5]-b[4])) ; + + r_input += (_fp32)((a[13]-a[12])*Lcd_data->auto_caculate-(b[13]-b[12]))*2/(_fp32)((a[11]-a[10]+a[9]-a[8])*Lcd_data->auto_caculate-(b[11]-b[10]+a[9]-a[8])) ; + r_input /= 2; + r_output += (_fp32)((a[15]-a[14])*Lcd_data->auto_caculate-(b[15]-b[14]))*2/(_fp32)((a[11]-a[10]+a[9]-a[8])*Lcd_data->auto_caculate-(b[11]-b[10]+a[9]-a[8])) ; + r_output /=2; + } + + _fp32 temp_in, temp_out; + _fp32 tmp; + //ͨ¹ý¹«Ê½¼ÆË㣬Õâʱr_inputºÍr_outputÊÇζÈÖµ + //¹«Ê½À´Ô´ÓÚhttp://wenku.baidu.com/view/f9bab86a561252d380eb6e56.html ͨ¹ý²¬µç×è×èÖµÇóµÃζȵķ½·¨ + /******************************************************************************************************************************/ + /* IN */ + //tmp = r_input*1000; + //temp_in = 101.373e-5*tmp*tmp + 23.5515*tmp - 245649725e-4;//ÊäÈëR(µ¥Î»:0.01R) Êä³öT(µ¥Î»:0.01¶È) + //temp_in /= 100; + temp_in = 10.1373f*r_input*r_input + 235.515f*r_input - 245.649725f;//ÊäÈëR(µ¥Î»:0.01R) Êä³öT(µ¥Î»:0.01¶È) + + /* OUT */ + //tmp = r_output*1000; + //temp_out = 101.373e-5*tmp*tmp + 23.5515*tmp - 245649725e-4;//ÊäÈëR(µ¥Î»:0.01R) Êä³öT(µ¥Î»:0.01¶È) + //temp_out /= 100; + temp_out = 10.1373f*r_output*r_output + 235.515f*r_output - 245.649725f;//ÊäÈëR(µ¥Î»:0.01R) Êä³öT(µ¥Î»:0.01¶È) + /******************************************************************************************************************************/ + +#if TEMP_TEST + if((temp_in<0)||(temp_in>100)||(temp_out<0)||(temp_out>100)) + { + printf("---------------------------------------------------------------ERROR-----------------------------------------------------------------------\n"); + for(i=0;itemp1 = temp_in*LCD_MULTIPLE; + Lcd_data->temp2 = temp_out*LCD_MULTIPLE; + Lcd_data->temp0 = (temp_in - temp_out)*LCD_MULTIPLE; +} + +_fp32 get_density(_fp32 temp) +{ + _fp32 density; + density = 1000.2f - temp*0.42f; //kg/m3 + return density; +} + +_fp32 get_enthalpy(_fp32 temp) +{ + _fp32 enthalpy; + enthalpy = temp*4.18f + 0.85f; //kJ/kg + return enthalpy; +} + +void Heat_Caculate(_fp32 duration, struct Data *Lcd_data) +{ + _fp32 density; //ÃÜ¶È + _fp32 enthalpy_in, enthalpy_out; //<9f>áìÊÖµ + _fp32 heat_duration; + + density = get_density(Lcd_data->temp1/LCD_MULTIPLE); //µ±ÈÈÁ¿±í°²×°ÔÚ½øË®¹ÜÉÏ + enthalpy_in = get_enthalpy(Lcd_data->temp1/LCD_MULTIPLE); + enthalpy_out = get_enthalpy(Lcd_data->temp2/LCD_MULTIPLE); + + static _fp32 Last_total_flow; //ÉϴμÆËãʱµÄÀÛ»ýÁ÷Á¿ + heat_duration = (Lcd_data->total_flow - Last_total_flow)*density*(enthalpy_in - enthalpy_out); + Lcd_data->heat = heat_duration/(duration/3600); + Lcd_data->total_heat += heat_duration; + + Last_total_flow = Lcd_data->total_flow; + +} + +/********************************************************************************************************************************************************************** + When a res_valid interrupt comes, it will do + Firstly clear the interrupt bit; + Secondly read the result from the related regs; + Finally clear the result pointer. +***********************************************************************************************************************************************************************/ +_u32 res_ready(struct Data *Lcd_data) +{ +#if RES_TEST + printf("res_ready...\n"); +#endif + + _u32 ptr; + ptr = Sonar[8]; //0xbfeb4020 +#if RES_TEST + printf("ptr:0x%x\n", ptr); +#endif + _u32 current_ptr0,current_ptr1,last_ptr0,last_ptr1; + current_ptr0 = ptr&0xf; +#if RES_TEST + printf("current_ptr0:0x%x\n", current_ptr0); +#endif + current_ptr1 = (ptr>>4)&0xf; +#if RES_TEST + printf("current_ptr1:0x%x\n", current_ptr1); +#endif + last_ptr0 = (ptr>>8)&0xf; +#if RES_TEST + printf("last_ptr0:0x%x\n", last_ptr0); +#endif + last_ptr1 = (ptr>>12)&0xf; +#if RES_TEST + printf("last_ptr1:0x%x\n", last_ptr1); +#endif + + _u32 state, direction; + static _fp32 delta_time,time_up,time_down; + state = PMU[1]; + direction = Sonar[0]; + + _u32 result[16]; + _u32 i; + for(i=0; i<16; i++) + { + result[i] = Sonar[16+i]; //0xbfeb4040 Result[0] +#if RES_TEST + printf("result[%d] = 0x%x\n", i, result[i]); +#endif + } + PMU[15] = 0x80000000; //0xbfeb003c, clear regs, then you can start next measure + + /******************************************************************************************************************************/ + if((state&0xe00)==0x400) + { + _u32 sonar; + _u32 stop_num; + sonar = Sonar[1]; + stop_num = ((sonar>>21)&0x7); +#if FLOW_TEST + //printf("stop_num = %d\n", stop_num); +#endif + + if((sonar&0x100000)==0x0) + { + Lcd_data->auto_caculate = result[last_ptr0-1] - result[last_ptr0-2]; + } + + if((current_ptr0-last_ptr0) 1000.0) //if delta_time>1us + { + delta_time = 0; + printf("---------------------------------------------------------------ERROR-----------------------------------------------------------------------\n"); + for(i=0;i<12;i++) + { + printf("result[%d] = 0x%x\n", i,result[i]); + } + printf("-------------------------------------------------------------------------------------------------------------------------------------------\n"); + } +#endif + _fp32 tmp; +#if 0 //FLOW_TEST + if(delta_time<0) + { + tmp = 0 - delta_time; + printf("delta_time: -%d\n", (unsigned int)(tmp*1000)); + } + else + { + tmp = delta_time; + printf("delta_time: %d\n", (unsigned int)(tmp*1000)); + } +#endif + +#if 1 + static _u32 last_count=0; + static _u32 j=0; + static _fp32 delta[8]; + delta[j++] = delta_time; + if(j==8) + { + _fp32 average_delta_time; + average_delta_time = bubble_sort(&delta, j); + j=0; +#if FLOW_TEST + if(average_delta_time<0) + { + tmp = 0 - average_delta_time; + printf("------------------average_delta_time: -%d\n", (_u32)(tmp*1000)); + } + else + { + tmp = average_delta_time; + printf("------------------average_delta_time: %d\n", (_u32)(tmp*1000)); + } +#endif + _u32 count; + _fp32 duration; + count = *(volatile _u32 *)0xbfeb001c; + count &= COUNT_MASK; +#if PRINT +//printf("count: %d\n", count); +#endif + duration = (_fp32)( (count - last_count)%COUNT_COMPARE )/16; + last_count = count; + if(duration>16) return 2; //if duration > 16seconds, it should be an error. + + Flow_Caculate(average_delta_time, duration, Lcd_data); + Heat_Caculate(duration, Lcd_data); + } +#endif + + } + else if((state&0xe00)==0x600) + { + Temp_Caculate(&result, Lcd_data, 16); + } + + return 0; +} +#endif diff --git a/resources/soc/simu/soft/func/source/xmodem.c b/resources/soc/simu/soft/func/source/xmodem.c new file mode 100644 index 0000000..6370152 --- /dev/null +++ b/resources/soc/simu/soft/func/source/xmodem.c @@ -0,0 +1,233 @@ +/********************************************************************************************************************************************************************** + This file uses xmodem to download code, then writes it into flash. +**********************************************************************************************************************************************************************/ + +#include "../config.h" + +static _u16 _crc_xmodem_update (_u16 crc, _u8 data) +{ + int i; + crc = crc ^ ((_u16)data << 8); + for (i=0; i<8; i++) + { + if (crc & 0x8000) + crc = (crc << 1) ^ 0x1021; + else + crc <<= 1; + } + return crc; +} + +//Xmodenַ +#define XMODEM_NUL 0x00 +#define XMODEM_SOH 0x01 +#define XMODEM_STX 0x02 +#define XMODEM_EOT 0x04 +#define XMODEM_ACK 0x06 +#define XMODEM_NAK 0x15 +#define XMODEM_CAN 0x18 +#define XMODEM_EOF 0x1A +#define XMODEM_WAIT_CHAR 'C' + + +#define ST_WAIT_START 0x00 //ȴ +#define ST_BLOCK_OK 0x01 //һݿɹ +#define ST_BLOCK_FAIL 0x02 //һݿʧ +#define ST_OK 0x03 // + +#if LS1D_FPGA +static int testchar(unsigned int timeout) +{ + int total, start; + start = now(); + + while(1) + { + if(tgt_testchar()) return 100; + if( (now()-start) > timeout ) break; + } + + return 0; +} +#else +static int testchar(unsigned int timeout) +{ + int total, start; + //start = now(); + + _u32 i,j; + for(i=1000;i>0;i--) + for(j=500;j>0;j--) + //while(1) + { + if(tgt_testchar()) return 100; + //if( ((now()-start)%COUNT_COMPARE) > timeout ) break; + } + + return 0; +} +#endif +static int get_data(unsigned char *ptr,unsigned int len,unsigned int timeout) +{ + int i=0; + while(i0) + ptr[i++] = tgt_getchar(); + else break; //It doesn't receive data in 1 second. + } + + return i; +} +//CRC16 +static unsigned int calcrc(unsigned char *ptr, unsigned int count, _u8 crc_mode) +{ + _u16 crc = 0; + while (count--) + { + if(crc_mode) + crc = _crc_xmodem_update(crc,*ptr++); + else + { + crc += *ptr++ ; + crc &= 0xff; + } + } + + return crc; +} + +static int xmodem_transfer(_u32 base) +{ + unsigned int i; + _u16 crc; + unsigned int filesize=0; + unsigned char BlockCount=1; //ݿۼ(8λ뿼) + _u8 crc_mode = 1; + _u8 chr; +#if LS1D_FPGA + _u32 addr_w = base; + _u32 length = 128; +#endif + unsigned char STATUS; //״̬ + STATUS = ST_WAIT_START; //='d''D',XMODEM + while(1) + { + chr = crc_mode?XMODEM_WAIT_CHAR:XMODEM_NAK ; + tgt_putchar(chr); + if(testchar(80)>0)break; //5 seconds timeout + crc_mode += 1; + crc_mode %= 2; + } //send 'c' first, if there is no respond, then send NAK. + + struct str_XMODEM strXMODEM; //XMODEMĽݽṹ + while(STATUS!=ST_OK) //ѭգֱȫ + { +/**********************************************************************************************************************************************************************************************************************************************************************************************************************************************/ + i = get_data(&strXMODEM.SOH, BLOCKSIZE+5, 1); // 1/16 second timeout, it'll affect the total time of download. + +/**********************************************************************************************************************************************************************************************************************************************************************************************************************************************/ + if(i) + { + //ݰĵһ SOH/EOT/CAN + switch(strXMODEM.SOH) + { + case XMODEM_SOH: //յʼSOH + if (i>=(crc_mode?(BLOCKSIZE+5):(BLOCKSIZE+4))) + { + STATUS=ST_BLOCK_OK; + } + else + { + STATUS=ST_BLOCK_FAIL; //ݲ㣬Ҫطǰݿ + tgt_putchar(XMODEM_NAK); + } + break; + case XMODEM_EOT: //յEOT + tgt_putchar(XMODEM_ACK); //֪ͨPCȫյ + STATUS=ST_OK; + break; + case XMODEM_CAN: //յȡCAN + tgt_putchar(XMODEM_ACK); //ӦPC + STATUS=ST_OK; + break; + default: //ʼֽڴ + tgt_putchar(XMODEM_NAK); //Ҫطǰݿ + STATUS=ST_BLOCK_FAIL; + break; + } + } + else + { + break; + //tgt_putchar(XMODEM_NAK); //ݿŴҪطǰݿ + //continue; + } + + if (STATUS==ST_BLOCK_OK) //133ֽOKʼֽȷ + { + if (BlockCount != strXMODEM.BlockNo)//˶ݿȷ + { + tgt_putchar(XMODEM_NAK); //ݿŴҪطǰݿ + continue; + } + if (BlockCount !=(unsigned char)(~strXMODEM.nBlockNo)) + { + tgt_putchar(XMODEM_NAK); //ݿŷҪطǰݿ + continue; + } + + if(crc_mode) + { + crc = strXMODEM.CRC16hi<<8; + crc += strXMODEM.CRC16lo; + } + else + { + crc = strXMODEM.CRC16hi; + } + + if(calcrc(&strXMODEM.Xdata[0], BLOCKSIZE, crc_mode)!=crc) + { + tgt_putchar(XMODEM_NAK); //CRCҪطǰݿ + continue; + } + +#if LS1D_FPGA + _u32 addr_r = (_u32)&strXMODEM.Xdata[0]; + spiflash_write(addr_w, addr_r, length); + addr_w += length; +#else + //Flash_Write(base+filesize, &buf[0],32) ; +#endif + + filesize += 128; + tgt_putchar(XMODEM_ACK); //Ӧȷյһݿ + BlockCount++; //ݿۼƼ1 + } + } + + //printf("xmodem finished\n"); + + return filesize; +} + + +_u32 xmodem() +{ + _u32 base = FLASH_ERASE_START; + int file_size; + + //printf("Waiting for serial transmitting datas...\n"); +#if LS1D_FPGA + _u32 addr_start = FLASH_ERASE_START; + _u32 addr_end = FLASH_ERASE_END; + spiflash_erase(addr_start, addr_end); +#endif + file_size = xmodem_transfer(base); + //printf("Load successfully! Start at 0x%x, size 0x%x\n", base, file_size); + + return 0; +} + + diff --git a/resources/soc/simu/soft/func/start.S b/resources/soc/simu/soft/func/start.S new file mode 100644 index 0000000..fe6f115 --- /dev/null +++ b/resources/soc/simu/soft/func/start.S @@ -0,0 +1,657 @@ + +/************************************************************************************************************************************************************************************************/ + +#include "include/asm/regdef.h" +#include "include/asm/mipsregs.h" +#include "include/asm/ns16550.h" +#include "include/asm/interrupt.h" + +#define NAND_TEST +#define SRAM_BASEADDR 0xa0000000 +#define UART0_BASEADDR 0xbfe40000 +#define NAND_BASEADDR 0xbfe48000 +#define CONFIG_BASE 0xaff00000 +#define MAC_BASEADDR 0xbff00000 +#define CONFREG_BASE 0xbfd00000 + +#define DELAY 0x4 +#define print_hex 1 +#define print_reg 0 +#define PRINTSTR(x) \ + .rdata;98: .asciz x; .text; la a0, 98b; bal stringserial; nop +#define PRINT(x) \ + .rdata; .text; la a0, x; bal stringserial; nop +#define RVECENT(f,n) \ + b f; \ + nop +#define XVECENT(f,bev) \ + b f; \ + nop + + .set noreorder + + .globl _start + .text +_start: + RVECENT(reset,0) /* hard-reset entry point */ + RVECENT(reset,1) /* software reboot */ + RVECENT(romReserved,2) + RVECENT(romReserved,3) + RVECENT(romReserved,4) + RVECENT(romReserved,5) + RVECENT(romReserved,6) + RVECENT(romReserved,7) + RVECENT(romReserved,8) + RVECENT(romReserved,9) + RVECENT(romReserved,10) + RVECENT(romReserved,11) + RVECENT(romReserved,12) + RVECENT(romReserved,13) + RVECENT(romReserved,14) + RVECENT(romReserved,15) + RVECENT(romReserved,16) + RVECENT(romReserved,17) + RVECENT(romReserved,18) + RVECENT(romReserved,19) + RVECENT(romReserved,20) + RVECENT(romReserved,21) + RVECENT(romReserved,22) + RVECENT(romReserved,23) + RVECENT(romReserved,24) + RVECENT(romReserved,25) + RVECENT(romReserved,26) + RVECENT(romReserved,27) + RVECENT(romReserved,28) + RVECENT(romReserved,29) + RVECENT(romReserved,30) + RVECENT(romReserved,31) + RVECENT(romReserved,32) + RVECENT(romReserved,33) + RVECENT(romReserved,34) + RVECENT(romReserved,35) + RVECENT(romReserved,36) + RVECENT(romReserved,37) + RVECENT(romReserved,38) + RVECENT(romReserved,39) + RVECENT(romReserved,40) + RVECENT(romReserved,41) + RVECENT(romReserved,42) + RVECENT(romReserved,43) + RVECENT(romReserved,44) + RVECENT(romReserved,45) + RVECENT(romReserved,46) + RVECENT(romReserved,47) + RVECENT(romReserved,48) + RVECENT(romReserved,49) + RVECENT(romReserved,50) + RVECENT(romReserved,51) + RVECENT(romReserved,52) + RVECENT(romReserved,53) + RVECENT(romReserved,54) + RVECENT(romReserved,55) + RVECENT(romReserved,56) + RVECENT(romReserved,57) + RVECENT(romReserved,58) + RVECENT(romReserved,59) + RVECENT(romReserved,60) + RVECENT(romReserved,61) + RVECENT(romReserved,62) + RVECENT(romReserved,63) + XVECENT(romExcHandle,0x200) /* bfc00200: R4000 tlbmiss vector */ + RVECENT(romReserved,65) + RVECENT(romReserved,66) + RVECENT(romReserved,67) + RVECENT(romReserved,68) + RVECENT(romReserved,69) + RVECENT(romReserved,70) + RVECENT(romReserved,71) + RVECENT(romReserved,72) + RVECENT(romReserved,73) + RVECENT(romReserved,74) + RVECENT(romReserved,75) + RVECENT(romReserved,76) + RVECENT(romReserved,77) + RVECENT(romReserved,78) + RVECENT(romReserved,79) + XVECENT(romExcHandle,0x280) /* bfc00280: R4000 xtlbmiss vector */ + RVECENT(romReserved,81) + RVECENT(romReserved,82) + RVECENT(romReserved,83) + RVECENT(romReserved,84) + RVECENT(romReserved,85) + RVECENT(romReserved,86) + RVECENT(romReserved,87) + RVECENT(romReserved,88) + RVECENT(romReserved,89) + RVECENT(romReserved,90) + RVECENT(romReserved,91) + RVECENT(romReserved,92) + RVECENT(romReserved,93) + RVECENT(romReserved,94) + RVECENT(romReserved,95) + XVECENT(romExcHandle,0x300) /* bfc00300: R4000 cache vector */ + RVECENT(romReserved,97) + RVECENT(romReserved,98) + RVECENT(romReserved,99) + RVECENT(romReserved,100) + RVECENT(romReserved,101) + RVECENT(romReserved,102) + RVECENT(romReserved,103) + RVECENT(romReserved,104) + RVECENT(romReserved,105) + RVECENT(romReserved,106) + RVECENT(romReserved,107) + RVECENT(romReserved,108) + RVECENT(romReserved,109) + RVECENT(romReserved,110) + RVECENT(romReserved,111) +#if 0 + XVECENT(IntHandle,0x380) /* bfc00380: R4000 general vector */ +#else +IntHandle: + SAVE_ALL +# PRINTSTR("Interrupt 0 is coming...\r\n") +#if 1 // print_reg +# bal PRINT_CP0 +# nop +#endif + +7: + mfc0 t0, CP0_CAUSE + and t1, t0, 0x400 + bne zero, t1, 1f + nop + and t1, t0, 0x800 + bne zero, t1, 2f + nop + and t1, t0, 0x1000 + bne zero, t1, 3f + nop + and t1, t0, 0x2000 + bne zero, t1, 4f + nop + and t1, t0, 0x4000 + bne zero, t1, 5f + nop + and t1, t0, 0x8000 + bne zero, t1, 6f + nop + #PRINTSTR("No interrupt left...\r\n\r\n") + b 8f + nop + +1: /*timer*/ +# PRINTSTR("Timer interrupt is coming...\r\n") + +2: /*key*/ +# PRINTSTR("Key interrupt is coming...\r\n") + +3: /*batfail*/ +# PRINTSTR("BatFail interrupt is coming...\r\n") + +4: /*res_valid*/ +# PRINTSTR("ResVaild interrupt is coming...\r\n") + +5: /*INTC*/ +# PRINTSTR("IP6 is coming...\r\n") + +6: /*Ring*/ +# PRINTSTR("IP7 is coming...\r\n") + +8: + LOAD_ALL + .set mips32 + eret + .set mips1 + nop +#endif + + RVECENT(romReserved,113) + RVECENT(romReserved,114) + RVECENT(romReserved,115) + RVECENT(romReserved,116) + RVECENT(romReserved,116) + RVECENT(romReserved,118) + RVECENT(romReserved,119) + RVECENT(romReserved,120) + RVECENT(romReserved,121) + RVECENT(romReserved,122) + RVECENT(romReserved,123) + RVECENT(romReserved,124) + RVECENT(romReserved,125) + RVECENT(romReserved,126) + RVECENT(romReserved,127) + + /* We hope there are no more reserved vectors! + * 128 * 8 == 1024 == 0x400 + * so this is address R_VEC+0x400 == 0xbfc00400 + */ + .align 4 +#if print_hex + .rdata +hexchar: + .ascii "0123456789abcdef" + .text //Don't forget it! +#endif + +reset: + mtc0 zero, CP0_CAUSE # + li t0, 0x30400000 + mtc0 t0, CP0_STATUS # + li t0, 0x00000000 #set fp reg + /* Initialize $gp. + */ + bal 1f + nop + .word _gp +1: + lw gp, 0(ra) + + bal initserial0 + nop + + PRINTSTR("\r\nInitializing...\r\n"); + PRINTSTR("\r\nHello, Loongson...\r\n"); + + li t0, 0xbfd00010 + lw t1,0(t0) + ori t1, t1, 0x0 + sw t1,0(t0) +################################################### +#####nand test +##### +#ifdef NAND_TEST + bal nand_test + nop +## PRINTSTR("\r\nGouSheng!!!\r\n"); +#endif +##### +#####nand test +################################################### + + + PRINTSTR("\r\nMac_test start...\r\n"); + bal mac_test + nop + PRINTSTR("\r\nMac_test end...\r\n"); + // bal ddr2_config //old ddr config + // nop + + la v0, SRAM_BASEADDR + li t0, 0x0a424242 + sw t0, 0x0(v0) + la a0, 0x0(v0) + bal stringserial + nop + + la a0, loongson + bal stringserial + nop + + la v0, SRAM_BASEADDR + li t0, 0x0a454545 + sw t0, 0x0(v0) + la a0, 0x0(v0) + bal stringserial + nop + + +###ddr3 test +# if 1 +#####write data to sram + .align 5 + la v0, SRAM_BASEADDR + la s0, SRAM_BASEADDR+0x00000100 + li t0, 0x11111111 + li t1, 0x21212121 + li t2, 0x31313131 + li t3, 0x41414141 + li t4, 0x51515151 + li t5, 0x61616161 + li t6, 0x71717171 + li t7, 0x81818181 +1: + sw t0, 0x0(v0) + sw t1, 0x4(v0) + sw t2, 0x8(v0) + sw t3, 0xc(v0) + sw t4, 0x10(v0) + sw t5, 0x14(v0) + sw t6, 0x18(v0) + sw t7, 0x1c(v0) + addiu v0, v0, 0x20 + bne v0, s0, 1b + nop + +#####read data from sram + la v0, SRAM_BASEADDR +2: + lw t8, 0x0(v0) + beq t0, t8, 1f + nop + jal checkerr + nop +1: + lw t8, 0x4(v0) + beq t1, t8, 1f + nop + jal checkerr + nop +1: + lw t8, 0x8(v0) + beq t2, t8, 1f + nop + jal checkerr + nop +1: + lw t8, 0xc(v0) + beq t3, t8, 1f + nop + jal checkerr + nop +1: + lw t8, 0x10(v0) + beq t4, t8, 1f + nop + jal checkerr + nop +1: + lw t8, 0x14(v0) + beq t5, t8, 1f + nop + jal checkerr + nop +1: + lw t8, 0x18(v0) + beq t6, t8, 1f + nop + jal checkerr + nop +1: + lw t8, 0x1c(v0) + beq t7, t8, 1f + nop + jal checkerr + nop +1: + addiu v0, v0, 0x20 + bne v0, s0, 2b + nop + +#endif + +# la a0, 0x0(v0) +# bal stringserial +# nop +# la a0, 0x4(v0) +# PRINTSTR("\r\nHello, Loongson again...\r\n"); +# la a0, loongsonagain +# bal stringserial +# nop + + + +100: +#if 0 + /********enable interrupt**********/ + mfc0 t0, CP0_STATUS + li t1, 0xffff00fe + and t2, t0, t1 + li t1, 0xfc01 + or t0, t2, t1 + mtc0 t0, CP0_STATUS +#endif + li t0, SRAM_BASEADDR+0xffc + la sp, 0(t0) # + + la t9, main + jr t9 + nop + +1: + b 1b + nop + +/*********************************************************************************/ +##### mac func start + .align 5 + .ent mac_test +mac_test: +# addi sp, sp, 0xfffc +# sw ra, 0(sp) + move a3, ra +#read descriptor + li a2, 0xa0701100 + li a1, 0x80000000 + sw a1, 0x00(a2) + li a1, 0x00000100 + sw a1, 0x04(a2) + li a1, 0x007027f0 + sw a1, 0x08(a2) + +#start read process + li a2, MAC_BASEADDR + li a1, 0x0 + sw a1, 0x0(a2) + li a1, 0x00701000 + sw a1, 0x20(a2) + li a1, 0x00701100 + sw a1, 0x18(a2) + li a1, 0x40000002 + sw a1, 0x30(a2) + +#write gpio to enable virtual mac sw + li a0, 0x10 + li a1, CONFREG_BASE + sb a0, 0(a1) + sb a0, 0x10(a1) + +#detect read frame +read_interrupt: + lw a1, 0x28(a2) + li a0, 0xa0700010 + and a0, a1, 0x40 + beqz a0, read_interrupt + nop + +#write descriptor + + li a2, 0xa0701000 + li a1, 0x80000000 + sw a1, 0x00(a2) + li a1, 0x62000100 + sw a1, 0x04(a2) + li a1, 0x007027f0 + sw a1, 0x08(a2) + +#start write process + li a2, MAC_BASEADDR + li a1, 0x00701000 + sw a1, 0x20(a2) + li a1, 0x00701100 + sw a1, 0x18(a2) + li a1, 0x40002002 + sw a1, 0x30(a2) + + j a3 + nop + .end mac_test +##### mac func end + +initserial0: + la v0, UART0_BASEADDR +1: + li v1, FIFO_ENABLE|FIFO_RCV_RST|FIFO_XMT_RST|FIFO_TRIGGER_4 + sb v1, NSREG(NS16550_FIFO)(v0) + li v1, CFCR_DLAB #DLAB + sb v1, NSREG(NS16550_CFCR)(v0) + li v1, 0xCF + sb v1, NSREG(NS16550_FIFO)(v0) + li v1, 0x23 #set BRDL 57600Baut + sb v1, NSREG(NS16550_DATA)(v0) + srl v1, 8 #no necessary + sb v1, NSREG(NS16550_IER)(v0) #set BRDH #no necessary + li v1, CFCR_8BITS #8bit, 1stop + sb v1, NSREG(NS16550_CFCR)(v0) + li v1, MCR_DTR|MCR_RTS + sb v1, NSREG(NS16550_MCR)(v0) + li v1, 0x0 + sb v1, NSREG(NS16550_IER)(v0) + + move v1, v0 + la v0, UART0_BASEADDR + bne v0, v1, 1b + nop + + j ra + nop + + + + +tgt_putchar: + la v0, UART0_BASEADDR +1: + lbu v1, NSREG(NS16550_LSR)(v0) + and v1, LSR_TXRDY + beqz v1, 1b + nop + + sb a0, NSREG(NS16550_DATA)(v0) + move v1,v0 + la v0, UART0_BASEADDR + bne v0,v1,1b + nop + j ra + nop + +#if print_hex +hexserial: + nop + move a2, ra + move a1, a0 + li a3, 8 +1: + rol a0, a1, 4 + move a1, a0 + and a0, 0xf + la v0, hexchar + addu v0, a0 + lbu a0, 0(v0) + bal tgt_putchar + nop + + addi a3, -1 + bnez a3, 1b + nop + + j a2 + nop +#endif + +PRINT_CP0: +#if print_hex + move t0, ra + PRINTSTR("STATUS=0x") + mfc0 a0, CP0_STATUS + bal hexserial + nop + PRINTSTR("\r\n") + + PRINTSTR("CAUSE=0x") + mfc0 a0, CP0_CAUSE + bal hexserial + nop + PRINTSTR("\r\n") + + j t0 + nop +#endif + + +/*******************************************************************/ + + /* Exception handlers. + */ +romReserved: + PRINTSTR("Interrupt 1 is coming...\r\n") + b romReserved + nop + +romExcHandle: + PRINTSTR("Interrupt 2 is coming...\r\n") + b romExcHandle + nop + +ddr2_config: + li t0, 0xbfd00000 + li t1, 0x1 + sw t1, 0x0(t0) + + ##########start######## + li t2, CONFIG_BASE + li a1, 0x1 + sb a1, 0x18(t2) + ####################### + +1: + lb a1, 0x163(t2) + beqz a1, 1b + nop + + li t0, 0xbfd00000 + li t1, 0x0 + sw t1, 0x0(t0) + + jr ra + nop + + .global stringserial + .ent stringserial +stringserial: + move a2, ra + move a1, a0 + lbu a0, 0(a1) +1: + beqz a0, 2f + nop + addiu a1, 1 + bal tgt_putchar + nop + lbu a0, 0(a1) + b 1b + nop +2: + j a2 + nop + .end stringserial + + .ent checkerr +checkerr: + la a0, errstr + bal stringserial + nop + jr ra + nop + .end checkerr + + .rdata + .align 5 +msg_nand_test_reset_begin: + .asciiz "rst\n" +msg_nand_test_reset_end: + .asciiz "nand rst pass\n" +msg_nand_test_write_begin: + .asciiz "nand wr go\n" +msg_nand_test_write_end: + .asciiz "nand write pass \n" +msg_nand_test_read_begin: + .asciiz "nand rd go\n" +msg_nand_test_read_end: + .asciiz "nand rd pass\n" +errstr: + .asciz "error" +loongson: + .asciz "Loongson Test\n" +loongsonagain: + .asciz "Loongson Test Twice" diff --git a/resources/soc/simu/soft/func/test.lds b/resources/soc/simu/soft/func/test.lds new file mode 100644 index 0000000..b487f0d --- /dev/null +++ b/resources/soc/simu/soft/func/test.lds @@ -0,0 +1,72 @@ +/* + * (C) Masami Komiya 2004 + * + * (C) Copyright 2003 + * Wolfgang Denk Engineering, + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +OUTPUT_FORMAT("elf32-tradlittlemips", "elf32-tradlittlemips", "elf32-tradlittlemips") + +OUTPUT_ARCH(mips) +ENTRY(_start) +SECTIONS +{ + + . = ALIGN(4); + .text : + { + *(.text) + } + + . = ALIGN(4); + .rel.text : { *(.rel.text) } + + . = ALIGN(4); + .rodata : { *(.rodata) } + + . = ALIGN(4); + .data : { *(.data) } + + . = ALIGN(4); + .reginfo : { *(.reginfo) } + + . = ALIGN(4); + .ptr : { *(.ptr) } + + . = ALIGN(4); + .shstrtab : { *(.shstrtab) } + + . = ALIGN(4); + .strtab : { *(.strtab) } + + . = .; + _gp = ALIGN(16) + 0x7ff0; + .got : { + __got_start = .; + *(.got) + __got_end = .; + } + + . = 0xa0000000; + . = ALIGN(4); + .sbss : { *(.sbss) } + .bss : { *(.bss) . = ALIGN(4); } +} diff --git a/resources/soc/simu/testbench/MX25L6405D.v b/resources/soc/simu/testbench/MX25L6405D.v new file mode 100644 index 0000000..33ea9d0 --- /dev/null +++ b/resources/soc/simu/testbench/MX25L6405D.v @@ -0,0 +1,2154 @@ +// *============================================================================================== +// * +// * MX25L6405D.v - 64M-BIT CMOS Serial Flash Memory +// * +// * COPYRIGHT 2008 Macronix International Co., Ltd. +// *---------------------------------------------------------------------------------------------- +// * Environment : Cadence NC-Verilog +// * Reference Doc: MX25L1605D-3205D-6405D REV.1.1,MAY.12, 2008 +// * Creation Date: @(#)$Date: 2008/06/13 05:24:15 $ +// * Version : @(#)$Revision: 1.4 $ +// * Description : There is only one module in this file +// * module MX25L6405D->behavior model for the 64M-Bit flash +// *---------------------------------------------------------------------------------------------- +// * Note 1:model can load initial flash data from file when model define parameter Init_File = "xxx"; +// * xxx: initial flash data file name;default value xxx = "none", initial flash data is "FF". +// * Note 2:power setup time is tVSL = 200_000 ns, so after power up, chip can be enable. +// * Note 3:time delay to write instruction is tPUW = 10_000_000 ns. +// * Note 4:If define KGD product, Model support good ID read (Addr 0x3f Data 55h). +// * Note 5:If you have any question and suggestion, please send your mail to follow email address : +// * flash_model@mxic.com.tw +// *---------------------------------------------------------------------------------------------- +// * History +// * Date | Version Description +// * $Log: MX25L6405D.v,v $ +// * Revision 1.4 2008/06/13 05:24:15 simmodel +// * update fTSCLK=50MHz. +// * +// * Revision 1.3 2008/06/12 02:06:42 simmodel +// * disable KGD product define +// * +// * Revision 1.2 2008/03/04 16:32:05 simmodel +// * update DISWRSR +// * +// *============================================================================================== +// *============================================================================================== +// * timescale define +// *============================================================================================== +`timescale 1ns / 100ps + +// *============================================================================================== +// * product parameter define +// *============================================================================================== + /*----------------------------------------------------------------------*/ + /* Define controller STATE */ + /*----------------------------------------------------------------------*/ + `define STANDBY_STATE 0 + `define ACTION_STATE 1 + `define CMD_STATE 2 + `define BAD_CMD_STATE 3 + + `define MX25L6405D + // `define MX25L6405D + // `define MX25L6415D + `ifdef MX25L6405D + `define PADOP1 1'b0 + `endif + + `ifdef MX25L6415D + `define PADOP1 1'b1 + `endif + + `define KGD_PRODUCT 1'b0 + +module MX25L6405D( SCLK, + CS, + SI, + SO, + WP, + HOLD ); + +// *============================================================================================== +// * Declaration of ports (input, output, inout) +// *============================================================================================== + input SCLK; // Signal of Clock Input + input CS; // Chip select (Low active) + inout SI; // Serial Input/Output SIO0 + inout SO; // Serial Input/Output SIO1 + input WP; // Hardware write protection + input HOLD; // Pause the chip without diselecting the chip + +// *============================================================================================== +// * Declaration of parameter (parameter) +// *============================================================================================== + /*----------------------------------------------------------------------*/ + /* Density STATE parameter */ + /*----------------------------------------------------------------------*/ + parameter A_MSB = 22, + TOP_Add = 23'h7fffff, + Secur_TOP_Add = 7'h7f, + Sector_MSB = 10, + Block_MSB = 6, + Block_NUM = 128, + PRO_128K_Beg = 23'h7d0000, + PRO_128K_End = 23'h7effff; + + /*----------------------------------------------------------------------*/ + /* Define ID Parameter */ + /*----------------------------------------------------------------------*/ + parameter ID_MXIC = 8'hc2, + ID_Device = `PADOP1? 8'h1e : 8'h16, + Memory_Type = `PADOP1? 8'h22 : 8'h20, + Memory_Density = 8'h17; + + /*----------------------------------------------------------------------*/ + /* Define Initial Memory File Name */ + /*----------------------------------------------------------------------*/ + parameter Init_File = "none"; // initial flash data + + /*----------------------------------------------------------------------*/ + /* AC Charicters Parameter */ + /*----------------------------------------------------------------------*/ + parameter tSHQZ = 8, // CS High to SO Float Time [ns] + tCLQV = 8, // Clock Low to Output Valid + tHHQX = 8, // HOLD to Output Low-z + tHLQZ = 8, // HOLD to Output High-z + tDP = 10_000, + tRES1 = 8_800, + tRES2 = 8_800; + parameter tREP0 = 100, // 100ns Reset# recovery time (during read algorithm) + // to read or write + tREP1 = 50_000; // 50us Reset# recovery time (during program/erase algorithm) + // to read or write + //tOHZ = 10, // 10ns PR# goes high and SCLK falling to data out + //tRD = 10; // 10ns PR# goes high and SCLK falling to data out + parameter tAA = 50; // 50ns Parallel mode read time + parameter tBP = 9_000; // Byte program time + parameter tSE = 90_000_000, // Sector erase time + tBE = 700_000_000, // Block erase time + tCE = 50_000, // unit is ms instead of ns + tPP = 1_400_000, // Program time + tW = 40_000_000, // Write Status time + tPUW = 10_000_000, // Time delay to write instruction + tVSL = 20; // Time delay to chip select allowed + //smh tVSL = 200_000; // Time delay to chip select allowed + + specify + specparam tSCLK = 12, // Clock Cycle Time [ns] + fSCLK = 86, // Clock Frequence except READ instruction[ns] 15pF + tRSCLK = 30, // Clock Cycle Time for READ instruction[ns] 15pF + fRSCLK = 33, // Clock Frequence for READ instruction[ns] 15pF + tCH = 5.5, // Clock High Time (min) [ns] + tCL = 5.5, // Clock Low Time (min) [ns] + tSLCH = 5, // CS# Active Setup Time (relative to SCLK) (min) [ns] + tCHSL = 5, // CS# Not Active Hold Time (relative to SCLK)(min) [ns] + tSHSL = 100, // CS High Time (min) [ns] + tDVCH = 2, // SI Setup Time (min) [ns] + tCHDX = 5, // SI Hold Time (min) [ns] + tCHSH = 5, // CS# Active Hold Time (relative to SCLK) (min) [ns] + tSHCH = 5, // CS# Not Active Setup Time (relative to SCLK) (min) [ns] + tHLCH = 5, // HOLD# Setup Time (relative to SCLK) (min) [ns] + tCHHH = 5, // HOLD# Hold Time (relative to SCLK) (min) [ns] + tHHCH = 5, // HOLD Setup Time (relative to SCLK) (min) [ns] + tCHHL = 5, // HOLD Hold Time (relative to SCLK) (min) [ns] + tWHSL = 20, // Write Protection Setup Time + tSHWL = 100, // Write Protection Hold Time + tCLHS = 3, // Clock Low to HOLD# setup time + tCLHH = 3; // Clock Low to HOLD# hold time + specparam tTSCLK = 20, // Clock Cycle Time for 2XI/O READ instruction[ns] 15pF + fTSCLK = 50; // Clock Frequence for 2XI/O READ instruction[ns] 15pF + + endspecify + + /*----------------------------------------------------------------------*/ + /* Define Command Parameter */ + /*----------------------------------------------------------------------*/ + parameter WREN = 8'h06, // WriteEnable + WRDI = 8'h04, // WriteDisable + RDID = 8'h9F, // ReadID + RDSR = 8'h05, // ReadStatus + WRSR = 8'h01, // WriteStatus + READ1X = 8'h03, // ReadData + FASTREAD1X = 8'h0b, // FastReadData + SE = 8'h20, // SectorErase + CE1 = 8'h60, // ChipErase + CE2 = 8'hc7, // ChipErase + PP = 8'h02, // PageProgram + DP = 8'hb9, // DeepPowerDown + RDP = 8'hab, // ReleaseFromDeepPowerDwon + RES = 8'hab, // ReadElectricID + REMS = 8'h90; // ReadElectricManufacturerDeviceID + parameter RDPR = 8'ha1, // Read parameter register + WRPR = 8'hf1; // Write parameter register + parameter BE = 8'hd8, // BlockErase + READ2X = 8'hbb, // 2X Read + CP = 8'had, // Continuously program mode; + REMS2 = 8'hef, // ReadElectricManufacturerDeviceID + ENSO = 8'hb1, // Enter secured OTP; + EXSO = 8'hc1, // Exit secured OTP; + RDSCUR = 8'h2b, // Read security register; + WDSCUR = 8'h2f, // Write security register; + WRLB = 8'h21, // Write read-lock register; + ESRY = 8'h70, // Enable SO to output RY/BY; + DSRY = 8'h80; // Disable SO to output RY/BY; + + /*----------------------------------------------------------------------*/ + /* Declaration of internal-register (reg) */ + /*----------------------------------------------------------------------*/ + reg [7:0] ARRAY[0:TOP_Add]; // memory array + reg [7:0] Status_Reg; // Status Register + reg [7:0] CMD_BUS; + reg [6:0] PO_Reg; + reg [6:0] Latch_PO; + reg Latch_SO; + reg [23:0] SI_Reg; // temp reg to store serial in + reg [7:0] Dummy_A[0:255]; // page size + reg [A_MSB:0] Address; + reg [Sector_MSB:0] Sector; + reg [Block_MSB:0] Block; + reg [2:0] STATE; + + reg EN_S0; //EN_S0 fSCLK Serial AC Characteristics; + reg EN_P0; //EN_P0 fSCLK parallel AC Characteristics; + reg EN_S1; //EN_S1 fRSCLK Serial AC Characteristics; + reg EN_P1; //EN_P1 fRSCLK parallel AC Characteristics; + reg SIO1_Reg; + reg Write_EN; + reg Read_EN; + reg P_Mode; // parallel mode + reg DP_Mode; // deep power down mode + reg Read_Mode; + reg Read_1XIO_Mode; + reg Read_1XIO_Chk; + reg FastRD_1XIO_Mode; + reg PP_1XIO_Mode; + reg SE_4K_Mode; + reg BE_Mode; + reg CE_Mode; + reg WRSR_Mode; + reg RES_Mode; + reg REMS_Mode; + reg SCLK_EN; + reg HOLD_OUT_B; + reg SO_OUT_EN; // for SO + reg SI_IN_EN; // for SI + wire HOLD_B_INT; + wire WP_B_INT; + wire ISCLK; + wire WIP; + wire WEL; + wire SRWD; + wire Dis_CE, Dis_WRSR; + event WRSR_Event; + event BE_Event; + event SE_4K_Event; + event CE_Event; + event PP_Event; + event RDP_Event; + event DP_Event; + integer i; + integer j; + integer Bit; + integer Bit_Tmp; + integer Start_Add; + integer End_Add; + integer Page_Size; + time tRES; + + reg [7:0] Param_Reg; // Parameter register + wire RESET_B; + + reg [7:0] Secur_ARRAY[0:Secur_TOP_Add]; // Secured OTP + reg [7:0] Secur_Reg; // security register + reg [15:0] CP_Data; + + reg Secur_Mode; // enter secured mode + reg CP_ESRY_Mode; + reg EN_CP_Mode; + reg CP_Mode; + reg Read_2XIO_Mode; + reg Read_2XIO_Chk; + reg SE_1K_Mode; + reg Byte_PGM_Mode; //Program one byte is 7us + reg SI_OUT_EN; // for SI + reg SO_IN_EN; // for SO + reg SIO0_Reg; + wire CP_Busy; + event CP_Event; + event WRSCUR_Event; + event SE_1K_Event; + + + + /*----------------------------------------------------------------------*/ + /* initial variable value */ + /*----------------------------------------------------------------------*/ + initial begin + reset_sm; + Secur_Reg = 8'b0000_0000; + end + + task reset_sm; + begin + Status_Reg = 8'b0000_0000; + SO_OUT_EN = 1'b0; // SO output enable + SI_IN_EN = 1'b0; // SI input enable + CMD_BUS = 8'b0000_0000; + Address = 0; + i = 0; + j = 0; + Bit = 0; + Bit_Tmp = 0; + Start_Add = 0; + End_Add = 0; + Page_Size = 256; + DP_Mode = 1'b0; + P_Mode = 1'b0; + Write_EN = 1'b0; + Read_EN = 1'b0; + SCLK_EN = 1'b1; + Read_Mode = 1'b0; + Read_1XIO_Mode = 1'b0; + Read_1XIO_Chk = 1'b0; + PP_1XIO_Mode = 1'b0; + SE_4K_Mode = 1'b0; + BE_Mode = 1'b0; + CE_Mode = 1'b0; + WRSR_Mode = 1'b0; + RES_Mode = 1'b0; + REMS_Mode = 1'b0; + FastRD_1XIO_Mode = 1'b0; + HOLD_OUT_B = 1'b1; + {EN_S0, EN_P0, EN_S1, EN_P1} = {1'b1, 1'b0, 1'b0, 1'b0}; + Param_Reg = 8'b0000_0000; + SI_OUT_EN = 1'b0; // SI output enable + SO_IN_EN = 1'b0; // SO input enable + CP_Data = 8'b0000_0000; + Secur_Mode = 1'b0; + CP_ESRY_Mode = 1'b0; + EN_CP_Mode = 1'b0; + CP_Mode = 1'b0; + Read_2XIO_Mode = 1'b0; + Read_2XIO_Chk = 1'b0; + SE_1K_Mode = 1'b0; + Byte_PGM_Mode = 1'b0; + Secur_Reg[3:2] = 2'b00; + + + end + endtask // reset_sm + + /*----------------------------------------------------------------------*/ + /* initial flash data */ + /*----------------------------------------------------------------------*/ +//MX25L6405D #(.Init_File(`APP_FLASH)) + initial + begin : memory_initialize + for ( i = 0; i <= TOP_Add; i = i + 1 ) + ARRAY[i] = 8'hff; + if ( Init_File != "none" ) begin + $readmemh(Init_File,ARRAY) ; + $display("load Init_File %s, array[0..3]=%h %h %h %h", Init_File, + ARRAY[0],ARRAY[1],ARRAY[2],ARRAY[3]); + end + for( i = 0; i <= Secur_TOP_Add; i = i + 1 ) begin + Secur_ARRAY[i]=8'hff; + end + if ( `KGD_PRODUCT == 1'b1 ) begin + Secur_ARRAY[8'h3f]=8'h55; + end + end + +// *============================================================================================== +// * Input/Output bus opearation +// *============================================================================================== + assign ISCLK = (SCLK_EN == 1'b1) ? SCLK:1'b0; + assign HOLD_B_INT = (CS == 1'b0 && `PADOP1 == 1'b0 ) ? HOLD : 1'b1; + assign RESET_B = `PADOP1 == 1'b1 ? HOLD : 1'b1; + assign WP_B_INT = (CS == 1'b0 ) ? WP : 1'b1; + assign SO = (SO_OUT_EN && HOLD_OUT_B) ? SIO1_Reg : 1'bz ; + assign SI = (SI_OUT_EN && HOLD_OUT_B) ? SIO0_Reg : 1'bz ; + + + /*----------------------------------------------------------------------*/ + /* When CP_mode, Enable SO to output RY/BY; */ + /*----------------------------------------------------------------------*/ + assign CP_Busy = !(EN_CP_Mode && Status_Reg[0]); + always @ ( negedge CS or CP_Busy or ISCLK ) begin + if ( (EN_CP_Mode == 1) && (CS == 0) && (CP_ESRY_Mode == 1'b1) ) begin + SIO1_Reg <= #tCLQV CP_Busy; + SO_OUT_EN = 1'b1; + end + end + + /*----------------------------------------------------------------------*/ + /* When Hold Condtion Operation; */ + /*----------------------------------------------------------------------*/ + always @ ( HOLD_B_INT or negedge SCLK) begin + if ( HOLD_B_INT == 1'b0 && SCLK == 1'b0) begin + SCLK_EN =1'b0; + HOLD_OUT_B<= #tHLQZ 1'b0; + end + else if ( HOLD_B_INT == 1'b1 && SCLK == 1'b0) begin + SCLK_EN =1'b1; + HOLD_OUT_B<= #tHHQX 1'b1; + end + end + + /*----------------------------------------------------------------------*/ + /* When Reset Condtion Operation; */ + /*----------------------------------------------------------------------*/ + always @ ( RESET_B ) begin + if ( RESET_B == 1'b0 ) begin + disable write_status; + disable block_erase; + disable sector_erase_4k; + disable sector_erase_1k; + disable chip_erase; + disable page_program_mode; + disable cp_program; + disable write_secur_register; + disable deep_power_down; + disable release_from_deep_power_down; + disable read_1xio; + disable read_2xio; + disable fastread_1xio; + disable read_electronic_id; + disable read_electronic_manufacturer_device_id; + disable read_function; + disable dummy_cycle; + SO_OUT_EN <=#tSHQZ 1'b0; + SI_OUT_EN <=#tSHQZ 1'b0; + end + else begin + if ( Status_Reg[0] == 1'b1 ) + STATE <= #tREP1 `STANDBY_STATE; + else + STATE <= #tREP0 `STANDBY_STATE; + reset_sm; + end + end + /*----------------------------------------------------------------------*/ + /* When Secur_Mode, Page_Size 256-->64 */ + /*----------------------------------------------------------------------*/ + always @ ( Secur_Mode ) begin + Page_Size = (Secur_Mode == 1) ? 64 : 256; + end + + +// *============================================================================================== +// * Finite State machine to control Flash operation +// *============================================================================================== + /*----------------------------------------------------------------------*/ + /* power on */ + /*----------------------------------------------------------------------*/ + initial begin + Write_EN <= #tPUW 1'b1;// Time delay to write instruction + Read_EN <= #tVSL 1'b1;// Time delay to chip select allowed + end + + /*----------------------------------------------------------------------*/ + /* Command Decode */ + /*----------------------------------------------------------------------*/ + assign WIP = Status_Reg[0] ; + assign WEL = Status_Reg[1] ; + assign SRWD = Status_Reg[7] ; + assign Dis_CE = Status_Reg[5] == 1'b1 || Status_Reg[4] == 1'b1 || + Status_Reg[3] == 1'b1 || Status_Reg[2] == 1'b1 ; + assign Dis_WRSR = (WP_B_INT == 1'b0 && Status_Reg[7] == 1'b1) || (Secur_Reg[3] == 1'b1) || Secur_Mode; + + + always @ ( negedge CS ) begin + SI_IN_EN = 1'b1; + end + + + always @ ( posedge ISCLK or posedge CS ) begin + #0; + if ( CS == 1'b0 ) begin + Bit_Tmp = Bit_Tmp + 1; + Bit = Bit_Tmp - 1; + + if ( SI_IN_EN == 1'b1 && SO_IN_EN == 1'b1 ) begin + SI_Reg[23:0] = {SI_Reg[21:0], SO, SI}; + end + else begin + SI_Reg[23:0] = {SI_Reg[22:0], SI}; + end + end + if ( Bit == 7 && CS == 1'b0 ) begin + STATE = `CMD_STATE; + CMD_BUS = SI_Reg[7:0]; + //$display( $time,"SI_Reg[7:0]= %h ", SI_Reg[7:0] ); + end + + case ( STATE ) + `STANDBY_STATE: + begin + end + + `CMD_STATE: + begin + case ( CMD_BUS ) + WREN: + begin + if ( !DP_Mode && !EN_CP_Mode && !WIP && Write_EN ) begin + if ( CS == 1'b1 && Bit == 7 ) begin + // $display( $time, " Enter Write Enable Function ..." ); + write_enable; + end + else if ( Bit > 7 ) + STATE <= `BAD_CMD_STATE; + end + else if ( Bit == 7 ) + STATE <= `BAD_CMD_STATE; + end + + WRDI: + begin + if ( !DP_Mode && !WIP && Read_EN ) begin + if ( CS == 1'b1 && Bit == 7 ) begin + // $display( $time, " Enter Write Disable Function ..." ); + write_disable; + end + else if ( Bit > 7 ) + STATE <= `BAD_CMD_STATE; + end + else if ( Bit == 7 ) + STATE <= `BAD_CMD_STATE; + end + + RDID: + begin + if ( !DP_Mode && !EN_CP_Mode && !WIP && Read_EN) begin + //$display( $time, " Enter Read ID Function ..." ); + read_id; + end + else if ( Bit == 7 ) + STATE <= `BAD_CMD_STATE; + end + + RDSR: + begin + if ( !DP_Mode && (EN_CP_Mode && CP_ESRY_Mode) == 1'b0 && Read_EN) begin + //$display( $time, " Enter Read Status Function ..." ); + read_status ; + end + else if ( Bit == 7 ) + STATE <= `BAD_CMD_STATE; + end + + WRSR: + begin + if ( !DP_Mode && !EN_CP_Mode && !WIP && WEL && Write_EN ) begin + if ( CS == 1'b1 && Bit == 15 && !Dis_WRSR ) begin + //$display( $time, " Enter Write Status Function ..." ); + ->WRSR_Event; + WRSR_Mode = 1'b1; + end + else if ( CS == 1'b1 && Bit < 15 || Bit > 15 ) + STATE <= `BAD_CMD_STATE; + end + else if ( Bit == 7 ) + STATE <= `BAD_CMD_STATE; + end + + READ1X: + begin + if ( !DP_Mode && !EN_CP_Mode && !WIP && Read_EN ) begin + //$display( $time, " Enter Read Data Function ..." ); + if ( Bit == 31 ) begin + Address = (Secur_Mode == 1) ? SI_Reg[5:0] : SI_Reg[A_MSB:0]; + end + Read_1XIO_Mode = 1'b1; + end + else if ( Bit == 7 ) + STATE <= `BAD_CMD_STATE; + end + + + FASTREAD1X: + begin + if ( !DP_Mode && !EN_CP_Mode && !WIP && Read_EN ) begin + //$display( $time, " Enter Fast Read Data Function ..." ); + if ( Bit == 31 ) begin + Address = (Secur_Mode == 1) ? SI_Reg[5:0] : SI_Reg[A_MSB:0]; + end + FastRD_1XIO_Mode = 1'b1; + end + else if ( Bit == 7 ) + STATE <= `BAD_CMD_STATE; + end + SE: + begin + if ( !DP_Mode && !EN_CP_Mode && !WIP && WEL && !Secur_Mode && Write_EN ) begin + if ( Bit == 31 ) begin + Address = SI_Reg[A_MSB:0]; + end + if ( CS == 1'b1 && Bit == 31 && write_protect(Address) == 1'b0 ) begin + //$display( $time, " Enter Sector Erase Function ..." ); + if ( (Param_Reg[0] == 1) && (Address[A_MSB:12] == 0) ) begin + ->SE_1K_Event; + SE_1K_Mode = 1'b1; + end + else begin + ->SE_4K_Event; + SE_4K_Mode = 1'b1; + end + end + else if ( CS == 1'b1 && Bit < 31 || Bit > 31 ) + STATE <= `BAD_CMD_STATE; + end + else if ( Bit == 7 ) + STATE <= `BAD_CMD_STATE; + end + + BE: + begin + if ( !DP_Mode && !EN_CP_Mode && !WIP && WEL && !Secur_Mode && Write_EN ) begin + if ( Bit == 31 ) begin + Address = SI_Reg[A_MSB:0] ; + end + if ( CS == 1'b1 && Bit == 31 && write_protect(Address) == 1'b0 ) begin + //$display( $time, " Enter Block Erase Function ..." ); + ->BE_Event; + BE_Mode = 1'b1; + end + else if ( CS == 1'b1 && Bit < 31 || Bit > 31 ) + STATE <= `BAD_CMD_STATE; + end + else if ( Bit == 7 ) + STATE <= `BAD_CMD_STATE; + end + + CE1, CE2: + begin + if ( !DP_Mode && !EN_CP_Mode && !WIP && WEL && !Secur_Mode && Write_EN ) begin + + if ( CS == 1'b1 && Bit == 7 && Dis_CE == 0 ) begin + //$display( $time, " Enter Chip Erase Function ..." ); + ->CE_Event; + CE_Mode = 1'b1 ; + end + else if ( Bit > 7 ) + STATE <= `BAD_CMD_STATE; + end + else if ( Bit == 7 ) + STATE <= `BAD_CMD_STATE; + end + + PP: + begin + if ( !DP_Mode && !EN_CP_Mode && !WIP && WEL && Write_EN ) begin + if ( Bit == 31 ) begin + Address = (Secur_Mode == 1) ? SI_Reg[5:0] : SI_Reg[A_MSB:0]; + end + + if ( Bit == 31 && (((write_protect(Address) == 1'b0) && (!Secur_Mode)) || + (Secur_Mode && (!(Secur_Reg[1] || Secur_Reg[0])))) ) begin + //$display( $time, " Enter Page Program Function ..." ); + ->PP_Event; + PP_1XIO_Mode = 1'b1; + end + else if ( CS == 1 && (Bit < 31 || ((Bit + 1) % 8 !== 0))) + STATE <= `BAD_CMD_STATE; + end + else if ( Bit == 7 ) + STATE <= `BAD_CMD_STATE; + end + + DP: + begin + if ( !WIP && !EN_CP_Mode && Read_EN ) begin + if ( CS == 1'b1 && Bit == 7 ) begin + //$display( $time, " Enter Deep Power Dwon Function ..." ); + ->DP_Event; + end + else if ( Bit > 7 ) + STATE <= `BAD_CMD_STATE; + end + else if ( Bit == 7 ) + STATE <= `BAD_CMD_STATE; + end + + + RDP, RES: + begin + if ( !WIP && !EN_CP_Mode && Read_EN ) begin + // $display( $time, " Enter Release from Deep Power Dwon Function ..." ); + RES_Mode = 1'b1; + if ( CS == 1'b1 ) begin + if ( Bit >= 38 ) begin + tRES = tRES2; + end + else begin + tRES = tRES1; + end + ->RDP_Event; + end + end + else if ( Bit == 7 ) + STATE <= `BAD_CMD_STATE; + end + + REMS, REMS2: + begin + if ( !DP_Mode && !EN_CP_Mode && !WIP && Read_EN ) begin + if ( Bit == 31 ) begin + Address = SI_Reg[A_MSB:0] ; + end + //$display( $time, " Enter Read Electronic Manufacturer & ID Function ..." ); + REMS_Mode = 1'b1; + end + else if ( Bit == 7 ) + STATE <= `BAD_CMD_STATE; + end + + WRPR: + begin + if ( !DP_Mode && !EN_CP_Mode && !WIP && WEL && Write_EN ) begin + if ( CS == 1'b1 && Bit == 15 ) begin + //$display( $time, " Enter Write Parameter Register Function ..." ); + write_parameter; + end + else if ( CS == 1'b1 && Bit < 15 || Bit > 15 ) + STATE <= `BAD_CMD_STATE; + end + else if ( Bit == 7 ) + STATE <= `BAD_CMD_STATE; + end + + RDPR: + begin + if ( !DP_Mode && (EN_CP_Mode && CP_ESRY_Mode) == 1'b0 && Read_EN) begin + //$display( $time, " Enter READ Parameter Register Function ..." ); + read_parameter; + end + else if ( Bit == 7 ) + STATE <= `BAD_CMD_STATE; + end + + READ2X: + begin + if ( !DP_Mode && !EN_CP_Mode && !WIP && Read_EN ) begin + //$display( $time, " Enter READX2 Function ..." ); + if ( Bit == 19 ) begin + Address = (Secur_Mode == 1) ? SI_Reg[5:0] : SI_Reg[A_MSB:0]; + end + Read_2XIO_Mode = 1'b1; + end + else if ( Bit == 7 ) + STATE <= `BAD_CMD_STATE; + end + + + CP: + begin + if ( !DP_Mode && !WIP && WEL && Write_EN ) begin + if ( EN_CP_Mode == 1'b0 && Bit == 31 ) begin + Address = (Secur_Mode == 1) ? SI_Reg[5:0] : SI_Reg[A_MSB:0]; + Address = {Address [A_MSB:1], 1'b0} ; + end + if ( ((EN_CP_Mode == 1'b0 && Bit == 47) || (EN_CP_Mode == 1'b1 && Bit == 23)) && + (( (write_protect(Address) == 1'b0 && (!Secur_Mode)) || + (Secur_Mode && (!(Secur_Reg[1] || Secur_Reg[0]))))) ) begin + //$display( $time, " Enter CP Mode Function ..." ); + ->CP_Event; + end + else if ( CS == 1'b1 && ((EN_CP_Mode == 1'b0 && Bit < 47) || + (EN_CP_Mode == 1'b1 && Bit < 23) || ((Bit + 1) % 8 !== 0))) + STATE <= `BAD_CMD_STATE; + end + else if ( Bit == 7 ) + STATE <= `BAD_CMD_STATE; + end + + WRLB: + begin + if ( !DP_Mode && !EN_CP_Mode && !WIP && WEL && `PADOP1 && Read_EN ) begin + if ( CS == 1'b1 && Bit == 15 ) begin + //$display( $time, " Enter WRLB Function ..." ); + write_lkbit; + end + else if ( CS == 1'b1 && Bit < 15 || Bit >15) + STATE <= `BAD_CMD_STATE; + end + else if ( Bit == 7 ) + STATE <= `BAD_CMD_STATE; + end + + ENSO: + begin + if ( !DP_Mode && !EN_CP_Mode && !WIP && Read_EN ) begin + + if ( CS == 1'b1 && Bit == 7 ) begin + //$display( $time, " Enter ENSO Function ..." ); + enter_secured_otp; + end + else if ( Bit > 7 ) + STATE <= `BAD_CMD_STATE; + end + else if ( Bit == 7 ) + STATE <= `BAD_CMD_STATE; + end + + EXSO: + begin + if ( !DP_Mode && !EN_CP_Mode && !WIP && Read_EN ) begin + if ( CS == 1'b1 && Bit == 7 ) begin + //$display( $time, " Enter EXSO Function ..." ); + exit_secured_otp; + end + else if ( Bit > 7 ) + STATE <= `BAD_CMD_STATE; + end + else if ( Bit == 7 ) + STATE <= `BAD_CMD_STATE; + end + + RDSCUR: + begin + if ( !DP_Mode && (EN_CP_Mode && CP_ESRY_Mode) == 1'b0 && Read_EN) begin + // $display( $time, " Enter Read Secur_Register Function ..." ); + read_Secur_Register; + end + else if ( Bit == 7 ) + STATE <= `BAD_CMD_STATE; + end + + + WDSCUR: + begin + if ( !DP_Mode && !EN_CP_Mode && !WIP && !Secur_Mode && Write_EN ) begin + if ( CS == 1'b1 && Bit == 7 ) begin + //$display( $time, " Enter WDSCUR Secur_Register Function ..." ); + ->WRSCUR_Event; + end + else if ( Bit > 7 ) + STATE <= `BAD_CMD_STATE; + end + else if ( Bit == 7 ) + STATE <= `BAD_CMD_STATE; + end + + ESRY: + begin + if ( !DP_Mode && !EN_CP_Mode && !WIP && Read_EN ) begin + if ( CS == 1'b1 && Bit == 7 ) begin + //$display( $time, " Enter ESRY Function ..." ); + read_ryby; + end + else if ( Bit > 7 ) + STATE <= `BAD_CMD_STATE; + end + else if ( Bit == 7 ) + STATE <= `BAD_CMD_STATE; + end + + DSRY: + begin + if ( !DP_Mode && !EN_CP_Mode && !WIP && Read_EN ) begin + if ( CS == 1'b1 && Bit == 7 ) begin + //$display( $time, " Enter DSRY Function ..." ); + disread_ryby; + end + else if ( Bit > 7 ) + STATE <= `BAD_CMD_STATE; + end + else if ( Bit == 7 ) + STATE <= `BAD_CMD_STATE; + end + default: + begin + STATE <= `BAD_CMD_STATE; + end + endcase + end + + `BAD_CMD_STATE: + begin + end + + default: + begin + STATE = `STANDBY_STATE; + end + endcase + + + if ( CS == 1'b1 ) begin + Bit = 1'b0; + Bit_Tmp = 1'b0; + SO_IN_EN = 1'b0; + SI_IN_EN = 1'b0; + + SO_OUT_EN <= #tSHQZ 1'b0; + SI_OUT_EN <= #tSHQZ 1'b0; + + Read_Mode = 1'b0; + RES_Mode = 1'b0; + REMS_Mode = 1'b0; + Read_1XIO_Mode = 1'b0; + Read_2XIO_Mode = 1'b0; + Read_1XIO_Chk = 1'b0; + Read_2XIO_Chk = 1'b0; + + FastRD_1XIO_Mode = 1'b0; + STATE <= #1 `STANDBY_STATE; + SIO0_Reg <= #tSHQZ 1'bx; + SIO1_Reg <= #tSHQZ 1'bx; + PO_Reg[6:0] <= #tSHQZ 7'bx; + #1; + disable read_1xio; + disable read_2xio; + disable fastread_1xio; + disable read_electronic_id; + disable read_electronic_manufacturer_device_id; + disable read_function; + disable dummy_cycle; + end + + end + + + + + + /*----------------------------------------------------------------------*/ + /* ALL function trig action */ + /*----------------------------------------------------------------------*/ + always @ ( posedge Read_1XIO_Mode + or posedge FastRD_1XIO_Mode + or posedge REMS_Mode + or posedge RES_Mode + or posedge Read_2XIO_Mode + ) begin:read_function + wait ( ISCLK == 1'b0 ); + + if ( Read_1XIO_Mode == 1'b1 ) begin + Read_1XIO_Chk = 1'b1; + read_1xio; + end + else if ( FastRD_1XIO_Mode == 1'b1 ) begin + fastread_1xio; + end + else if ( REMS_Mode == 1'b1 ) begin + read_electronic_manufacturer_device_id; + end + else if ( RES_Mode == 1'b1 ) begin + read_electronic_id; + end + + else if ( Read_2XIO_Mode == 1'b1 ) begin + Read_2XIO_Chk = 1'b1; + read_2xio; + end + end + + always @ ( WRSR_Event ) begin + write_status; + end + + always @ ( RDP_Event ) begin + disable deep_power_down; + release_from_deep_power_down; + end + + always @ ( DP_Event ) begin + deep_power_down; + end + + always @ ( BE_Event ) begin + block_erase; + end + + always @ ( CE_Event ) begin + chip_erase; + end + + always @ ( PP_Event ) begin:page_program_mode + page_program( Address ); + end + + always @ ( SE_4K_Event ) begin + sector_erase_4k; + end + + always @ ( CP_Event ) begin + cp_program; + end + + always @ ( WRSCUR_Event ) begin + write_secur_register; + end + always @ ( SE_1K_Event ) begin + sector_erase_1k; + end + + + +// *========================================================================================== +// * Module Task Declaration +// *========================================================================================== + /*----------------------------------------------------------------------*/ + /* Description: define a wait dummy cycle task */ + /* INPUT */ + /* Cnum: cycle number */ + /*----------------------------------------------------------------------*/ + task dummy_cycle; + input [31:0] Cnum; + begin + repeat( Cnum ) begin + @ ( posedge ISCLK ); + end + end + endtask // dummy_cycle + + /*----------------------------------------------------------------------*/ + /* Description: define a write enable task */ + /*----------------------------------------------------------------------*/ + task write_enable; + begin + //$display( $time, " Old Status Register = %b", Status_Reg ); + Status_Reg[1] = 1'b1; + // $display( $time, " New Status Register = %b", Status_Reg ); + end + endtask // write_enable + + /*----------------------------------------------------------------------*/ + /* Description: define a write disable task (WRDI) */ + /*----------------------------------------------------------------------*/ + task write_disable; + begin + //$display( $time, " Old Status Register = %b", Status_Reg ); + Status_Reg[1] = 1'b0; + EN_CP_Mode = 1'b0; + Status_Reg[6] = 1'b0; + //$display( $time, " New Status Register = %b", Status_Reg ); + end + endtask // write_disable + + /*----------------------------------------------------------------------*/ + /* Description: define a read id task (RDID) */ + /*----------------------------------------------------------------------*/ + task read_id; + reg [23:0] Dummy_ID; + integer Dummy_Count; + begin + Dummy_ID = {ID_MXIC, Memory_Type, Memory_Density}; + Dummy_Count = 0; + forever begin + @ ( negedge ISCLK or posedge CS ); + if ( CS == 1'b1 ) begin + disable read_id; + end + else begin + SO_OUT_EN = 1'b1; + if ( P_Mode == 1'b0 ) begin // check parallel mode (2) + {SIO1_Reg, Dummy_ID} <= #tCLQV {Dummy_ID, Dummy_ID[23]}; + end + else begin + if ( Dummy_Count == 0 ) begin + {SIO1_Reg,PO_Reg} <= #tAA ID_MXIC; + Dummy_Count = 1; + end + else if ( Dummy_Count == 1 ) begin + {SIO1_Reg,PO_Reg} <= #tAA Memory_Type; + Dummy_Count = 2; + end + else if ( Dummy_Count == 2 ) begin + {SIO1_Reg,PO_Reg} <= #tAA Memory_Density; + Dummy_Count = 0; + end + end + end + end // end forever + end + endtask // read_id + + /*----------------------------------------------------------------------*/ + /* Description: define a read status task (RDSR) */ + /*----------------------------------------------------------------------*/ + task read_status; + integer Dummy_Count; + begin + Dummy_Count = 8; + forever begin + @ ( negedge ISCLK or posedge CS ); + if ( CS == 1'b1 ) begin + disable read_status; + end + else begin + SO_OUT_EN = 1'b1; + if ( P_Mode == 1'b0 ) begin + if ( Dummy_Count ) begin + Dummy_Count = Dummy_Count - 1; + SIO1_Reg <= #tCLQV Status_Reg[Dummy_Count]; + end + else begin + Dummy_Count = 7; + SIO1_Reg <= #tCLQV Status_Reg[Dummy_Count]; + end + end + else begin + {SIO1_Reg,PO_Reg} <= #tAA Status_Reg; + end + end + end // end forever + end + endtask // read_status + + + /*----------------------------------------------------------------------*/ + /* Description: define a write status task */ + /*----------------------------------------------------------------------*/ + task write_status; + integer tWRSR; + reg [7:0] Status_Reg_Up; + begin + //$display( $time, " Old Status Register = %b", Status_Reg ); + Status_Reg_Up = SI_Reg[7:0] ; + if ( (Status_Reg[7] == Status_Reg_Up[7] ) + && (Status_Reg[5:2] == Status_Reg_Up[5:2] ) ) begin + Status_Reg[1] = 1'b0; + WRSR_Mode = 1'b0; + end + else begin + if ( (Status_Reg[7] == 1'b1 && Status_Reg_Up[7] == 1'b0 ) || + (Status_Reg[5] == 1'b1 && Status_Reg_Up[5] == 1'b0 ) || + (Status_Reg[4] == 1'b1 && Status_Reg_Up[4] == 1'b0 ) || + (Status_Reg[3] == 1'b1 && Status_Reg_Up[3] == 1'b0 ) || + (Status_Reg[2] == 1'b1 && Status_Reg_Up[2] == 1'b0 )) + tWRSR = tW; + else + tWRSR = tBP; + //SRWD:Status Register Write Protect + Status_Reg[0] = 1'b1; + #tWRSR; + Status_Reg[7] = Status_Reg_Up[7]; + Status_Reg[6:2] = Status_Reg_Up[6:2]; + //WIP:Write Enable Latch + Status_Reg[0] = 1'b0; + //WEL:Write Enable Latch + Status_Reg[1] = 1'b0; + WRSR_Mode = 1'b0; + end + + if ( Status_Reg[4] == 0 || Status_Reg[3] == 0 || Status_Reg [2] == 0 ) begin//BP2~0 not all 1 + Param_Reg = 8'h00; + end + end + endtask // write_status + + /*----------------------------------------------------------------------*/ + /* Description: define a read data task */ + /*----------------------------------------------------------------------*/ + task read_1xio; + integer Dummy_Count, Tmp_Int; + reg [7:0] OUT_Buf; + begin + Dummy_Count = 8; + dummy_cycle(24); + #1; + OUT_Buf = (Secur_Mode == 1) ? Secur_ARRAY[Address] : + ((read_protect(Address) == 1'b1) ? 8'b0 : ARRAY[Address] ); + forever begin + @ ( negedge ISCLK or posedge CS ); + if ( CS == 1'b1 ) begin + if ( P_Mode == 0 ) begin + {EN_S0, EN_P0, EN_S1, EN_P1} = {1'b1, 1'b0, 1'b0, 1'b0}; + end + else begin + {EN_S0, EN_P0, EN_S1, EN_P1} = {1'b0, 1'b1, 1'b0, 1'b0}; + end + disable read_1xio; + end + else begin //do work on non deep power down mode + Read_Mode = 1'b1; + SO_OUT_EN = 1'b1; + if ( P_Mode == 1'b0 ) begin + {EN_S0, EN_P0, EN_S1, EN_P1} = {1'b0, 1'b0, 1'b1, 1'b0}; + if ( Dummy_Count ) begin + {SIO1_Reg, OUT_Buf} <= #tCLQV {OUT_Buf, OUT_Buf[7]}; + Dummy_Count = Dummy_Count - 1; + end + else begin + Address = Address + 1; + Address = (Secur_Mode == 1) ? Address[5:0] : Address; + OUT_Buf = (Secur_Mode == 1) ? Secur_ARRAY[Address] + :((read_protect(Address) == 1'b1) ? 8'b0 : ARRAY[Address] ); + {SIO1_Reg, OUT_Buf} <= #tCLQV {OUT_Buf, OUT_Buf[7]}; + Dummy_Count = 7 ; + end + end + else begin + {EN_S0, EN_P0, EN_S1, EN_P1} = {1'b0, 1'b0, 1'b0, 1'b1}; + OUT_Buf = (Secur_Mode == 1) ? Secur_ARRAY[Address] + :((read_protect(Address) == 1'b1) ? 8'b0 : ARRAY[Address] ); + {SIO1_Reg,PO_Reg} <= #tCLQV {OUT_Buf}; + Address = Address + 1; + Address = (Secur_Mode == 1) ? Address[5:0] : Address; + end + end + end // end forever + end + endtask // read_1xio + + /*----------------------------------------------------------------------*/ + /* Description: define a fast read data task */ + /* 0B AD1 AD2 AD3 X */ + /*----------------------------------------------------------------------*/ + task fastread_1xio; + integer Dummy_Count, Tmp_Int; + reg [7:0] OUT_Buf; + begin + Dummy_Count = 8; + dummy_cycle(24); + dummy_cycle(8); + OUT_Buf = (Secur_Mode == 1) ? Secur_ARRAY[Address]: + ((read_protect(Address) == 1'b1) ? 8'b0 : ARRAY[Address] ); + + forever begin + @ ( negedge ISCLK or posedge CS ); + if ( CS == 1'b1 ) begin + disable fastread_1xio; + end + else begin //do work on non deep power down mode + Read_Mode = 1'b1; + SO_OUT_EN = 1'b1; + if ( Dummy_Count ) begin + {SIO1_Reg, OUT_Buf} <= #tCLQV {OUT_Buf, OUT_Buf[7]}; + Dummy_Count = Dummy_Count - 1; + end + else begin + Address = Address + 1; + Address = (Secur_Mode == 1) ? Address[5:0] : Address; + OUT_Buf = (Secur_Mode == 1) ? Secur_ARRAY[Address] + :((read_protect(Address) == 1'b1) ? 8'b0 : ARRAY[Address] ); + {SIO1_Reg, OUT_Buf} <= #tCLQV {OUT_Buf, OUT_Buf[7]}; + Dummy_Count = 7 ; + end + end + end // end forever + end + endtask // fastread_1xio + /*----------------------------------------------------------------------*/ + /* Description: define a block erase task */ + /* D8 AD1 AD2 AD3 */ + /*----------------------------------------------------------------------*/ + task block_erase; + reg [Block_MSB:0] Block; + integer i; + begin + Block = Address[A_MSB:16]; + Start_Add = (Address[A_MSB:16]<<16) + 16'h0; + End_Add = (Address[A_MSB:16]<<16) + 16'hffff; + //WIP : write in process Bit + Status_Reg[0] = 1'b1; + #tBE ; + for( i = Start_Add; i <= End_Add; i = i + 1 ) + begin + ARRAY[i] = 8'hff; + end + //WIP : write in process Bit + Status_Reg[0] = 1'b0;//WIP + //WEL : write enable latch + Status_Reg[1] = 1'b0;//WEL + BE_Mode = 1'b0; + end + endtask // block_erase + + /*----------------------------------------------------------------------*/ + /* Description: define a sector 4k erase task */ + /* 20(D8) AD1 AD2 AD3 */ + /*----------------------------------------------------------------------*/ + task sector_erase_4k; + integer i; + begin + Sector = Address[A_MSB:12]; + Start_Add = (Address[A_MSB:12]<<12) + 12'h000; + End_Add = (Address[A_MSB:12]<<12) + 12'hfff; + //WIP : write in process Bit + + Status_Reg[0] = 1'b1; + #tSE; + for( i = Start_Add; i <= End_Add; i = i + 1 ) + begin + ARRAY[i] = 8'hff; + end + //WIP : write in process Bit + Status_Reg[0] = 1'b0;//WIP + //WEL : write enable latch + Status_Reg[1] = 1'b0;//WEL + SE_4K_Mode = 1'b0; + + end + endtask // sector_erase_4k + + /*----------------------------------------------------------------------*/ + /* Description: define a sector 1k erase task */ + /* 20(D8) AD1 AD2 AD3 */ + /*----------------------------------------------------------------------*/ + task sector_erase_1k; + reg [1:0] SEC_1K; + integer i; + begin + SEC_1K = Address[11:10]; + Start_Add = (Address[A_MSB:10]<<10) + 12'h000; + End_Add = (Address[A_MSB:10]<<10) + 12'h3ff; + //WIP : write in process Bit + Status_Reg[0] = 1'b1; + #tSE + for( i = Start_Add; i <= End_Add; i = i + 1 ) + begin + ARRAY[i] = 8'hff; + end + //WIP : write in process Bit + Status_Reg[0] = 1'b0;//WIP + //WEL : write enable latch + Status_Reg[1] = 1'b0;//WEL + SE_1K_Mode = 1'b0; + end + endtask // sector_erase_1k + + /*----------------------------------------------------------------------*/ + /* Description: define a chip erase task */ + /* 60(C7) */ + /*----------------------------------------------------------------------*/ + + task chip_erase; + begin + Status_Reg[0] = 1'b1; + for ( i = 0;i 8 ) + Byte_PGM_Mode = 1'b0; + else + Byte_PGM_Mode = 1'b1; + update_array ( Address ); + end + disable page_program; + end + else begin // count how many Bits been shifted + if ( P_Mode == 1'b0 ) begin + Tmp_Int = Tmp_Int + 1; + if ( Tmp_Int % 8 == 0) begin + #1; + Dummy_A[Offset] = SI_Reg [7:0]; + Offset = Offset + 1; + Offset = (Secur_Mode == 1) ? Offset[5:0] : Offset[7:0]; + end + end + else begin + Tmp_Int = Tmp_Int + 8; + if ( Tmp_Int % 8 == 0) begin + #1; + Dummy_A[Offset] = {Latch_SO, Latch_PO}; + Offset = Offset + 1; + Offset = (Secur_Mode == 1) ? Offset[5:0] : Offset[7:0]; + end + end + end + end // end forever + end + endtask // page_program + /*----------------------------------------------------------------------*/ + /* Description: define a deep power down (DP) */ + /*----------------------------------------------------------------------*/ + task deep_power_down; + begin + //$display( $time, " Old DP Mode Register = %b", DP_Mode ); + if ( DP_Mode == 1'b0) + DP_Mode = #tDP 1'b1; + //$display( $time, " New DP Mode Register = %b", DP_Mode ); + end + endtask // deep_power_down + + /*----------------------------------------------------------------------*/ + /* Description: define a release from deep power dwon task (RDP) */ + /*----------------------------------------------------------------------*/ + task release_from_deep_power_down; + begin + //$display( $time, " Old DP Mode Register = %b", DP_Mode ); + if ( DP_Mode == 1'b1) + DP_Mode = #tRES 1'b0; + //$display( $time, " New DP Mode Register = %b", DP_Mode ); + end + endtask // release_from_deep_power_down + + /*----------------------------------------------------------------------*/ + /* Description: define a read electronic ID (RES) */ + /* AB X X X */ + /*----------------------------------------------------------------------*/ + task read_electronic_id; + reg [7:0] Dummy_ID; + begin + //$display( $time, " Old DP Mode Register = %b", DP_Mode ); + dummy_cycle(23); + Dummy_ID = ID_Device; + dummy_cycle(1); + + forever begin + @ ( negedge ISCLK or posedge CS ); + if ( CS == 1'b1 ) begin + disable read_electronic_id; + end + else begin + SO_OUT_EN = 1'b1; + if ( P_Mode == 1'b0 ) begin + {SIO1_Reg, Dummy_ID} <= #tCLQV {Dummy_ID, Dummy_ID[7]}; + end + else begin + {SIO1_Reg,PO_Reg} <= #tAA ID_Device; + end + end + end // end forever + end + endtask // read_electronic_id + + /*----------------------------------------------------------------------*/ + /* Description: define a read electronic manufacturer & device ID */ + /*----------------------------------------------------------------------*/ + task read_electronic_manufacturer_device_id; + reg [15:0] Dummy_ID; + integer Dummy_Count; + begin + dummy_cycle(24); + #1; + if ( Address[0] == 1'b0 ) begin + Dummy_ID = {ID_MXIC,ID_Device}; + end + else begin + Dummy_ID = {ID_Device,ID_MXIC}; + end + Dummy_Count = 0; + forever begin + @ ( negedge ISCLK or posedge CS ); + if ( CS == 1'b1 ) begin + disable read_electronic_manufacturer_device_id; + end + else begin + SO_OUT_EN = 1'b1; + if ( P_Mode == 1'b0 ) begin // check parallel mode (2) + {SIO1_Reg, Dummy_ID} <= #tCLQV {Dummy_ID, Dummy_ID[15]}; + end + else if ( P_Mode == 1'b1 ) begin + if ( Dummy_Count == 0 ) begin + {SIO1_Reg,PO_Reg} <= #tAA Dummy_ID[15:8]; + Dummy_Count = 1; + end + else begin + {SIO1_Reg,PO_Reg} <= #tAA Dummy_ID[7:0]; + Dummy_Count = 0; + end + end + end + end // end forever + end + endtask // read_electronic_manufacturer_device_id + + /*----------------------------------------------------------------------*/ + /* Description: define a program chip task */ + /* INPUT program_time */ + /* segment: segment address */ + /* offset : offset address */ + /*----------------------------------------------------------------------*/ + task update_array; + input [A_MSB:0] Address; + integer Dummy_Count; + integer program_time; + begin + Dummy_Count = Page_Size; + Address = { Address [A_MSB:8], 8'h0 }; + program_time = (Byte_PGM_Mode) ? tBP : tPP; + Status_Reg[0]= 1'b1; + #program_time ; + for ( i = 0; i < Dummy_Count; i = i + 1 ) begin + if ( Secur_Mode == 1'b1) + Secur_ARRAY[Address + i] = Secur_ARRAY[Address + i] & Dummy_A[i]; + else + ARRAY[Address+ i] = ARRAY[Address + i] & Dummy_A[i]; + end + + + Status_Reg[0] = 1'b0; + Status_Reg[1] = 1'b0; + PP_1XIO_Mode = 1'b0; + Byte_PGM_Mode = 1'b0; + end + endtask // update_array + + /*----------------------------------------------------------------------*/ + /* Description: define a write read-lock register task */ + /*----------------------------------------------------------------------*/ + task write_lkbit; + begin + if ( SI_Reg[2] == 1 ) begin + Secur_Reg[2] <= SI_Reg[2]; + end + if ( SI_Reg[3] == 1 ) begin + Secur_Reg[3] <= SI_Reg[3]; + end + Status_Reg[1]<=1'b0; + end + endtask // write_lkbit + + /*----------------------------------------------------------------------*/ + /* Description: define a enter secured OTP task */ + /*----------------------------------------------------------------------*/ + task enter_secured_otp; + begin + //$display( $time, " Enter secured OTP mode = %b", enter_Secur_Mode ); + Secur_Mode= 1; + //$display( $time, " New Enter secured OTP mode = %b", enter_Secur_Mode ); + end + endtask // enter_secured_otp + + /*----------------------------------------------------------------------*/ + /* Description: define a exit 512 secured OTP task */ + /*----------------------------------------------------------------------*/ + task exit_secured_otp; + begin + //$display( $time, " Enter 512 secured OTP mode = %b", enter_Secur_Mode ); + Secur_Mode = 0; + //$display( $time, " New Enter 512 secured OTP mode = %b", enter_Secur_Mode ); + end + endtask + + /*----------------------------------------------------------------------*/ + /* Description: Execute Reading Security Register */ + /*----------------------------------------------------------------------*/ + task read_Secur_Register; + integer Dummy_Count; + begin + Dummy_Count = 8; + forever @ ( negedge ISCLK or posedge CS ) begin // output security register info + if ( CS == 1 ) begin + disable read_Secur_Register; + end + else begin //do work on non deep power down mode and not in CP_Mode with hardware detection + SO_OUT_EN = 1'b1; + if ( P_Mode == 1'b0 ) begin + if ( Dummy_Count ) begin + Dummy_Count = Dummy_Count - 1; + SIO1_Reg <= #tCLQV Secur_Reg[Dummy_Count]; + end + else begin + Dummy_Count = 7; + SIO1_Reg <= #tCLQV Secur_Reg[Dummy_Count]; + end + end + else begin + {SIO1_Reg,PO_Reg} <= #tAA Secur_Reg; + end + end + end + end + endtask // read_Secur_Register + + /*----------------------------------------------------------------------*/ + /* Description: Execute Write Security Register */ + /*----------------------------------------------------------------------*/ + task write_secur_register; + begin + Status_Reg[0] = 1'b1; + #tBP; + Secur_Reg [1] = 1'b1; + Status_Reg[0] = 1'b0; + end + endtask // write_secur_register + + /*----------------------------------------------------------------------*/ + /* Description: define a continuously program task */ + /* 02 AD1 AD2 AD3 */ + /*----------------------------------------------------------------------*/ + task cp_program; + integer Tmp_Int; + begin + CP_Data = SI_Reg[15:0] ; + Tmp_Int = 0; + forever begin + @ ( posedge ISCLK or posedge CS ); + if ( CS == 1'b1 ) begin + if ( P_Mode == 1'b0 && Tmp_Int % 8 !== 0 ) begin + disable cp_program; + end + else begin + EN_CP_Mode = 1'b1; + CP_Mode = 1'b1; + Status_Reg[6] = EN_CP_Mode; + Status_Reg[0] = 1'b1; + #tBP; + Status_Reg[0]= 1'b0; + CP_Mode = 1'b0; + if ( Secur_Mode == 1) + begin + Secur_ARRAY[Address + 1] = Secur_ARRAY[Address + 1] & CP_Data [7:0]; + Secur_ARRAY[Address] = Secur_ARRAY[Address] & CP_Data [15:8]; + end + else + begin + ARRAY[Address + 1] = ARRAY[Address + 1] & CP_Data [7:0]; + ARRAY[Address] = ARRAY[Address] & CP_Data [15:8]; + end + + if ( Address == (Secur_Mode ? (Secur_TOP_Add - 1) : (TOP_Add - 1))) + begin + Status_Reg[6] = 1'b0; + Status_Reg[1] = 1'b0; + EN_CP_Mode = 1'b0; + end + else + begin + Address = Address + 2; + end + if ( write_protect(Address) == 1'b1 && (!Secur_Mode) ) + begin + Status_Reg[6] = 1'b0; + Status_Reg[1] = 1'b0; + EN_CP_Mode = 1'b0; + end + end + disable cp_program; + end + else begin // count how many Bits been shifted + if ( P_Mode == 1'b0 ) begin + Tmp_Int = Tmp_Int + 1; + end + else begin + Tmp_Int = Tmp_Int + 8; + end + end + end // end forever + end + endtask // cp_program + + /*----------------------------------------------------------------------*/ + /* Description: define a ESRY task */ + /*----------------------------------------------------------------------*/ + task read_ryby; + begin + //$display( $time, " Enter CP ESRY mode = %b", CP_ESRY_Mode ); + CP_ESRY_Mode= 1; + //$display( $time, " New Enter CP ESRY mode = %b", CP_ESRY_Mode ); + end + endtask // read_ryby + + /*----------------------------------------------------------------------*/ + /* Description: define a DSRY task */ + /*----------------------------------------------------------------------*/ + task disread_ryby; + begin + //$display( $time, " Enter CP ESRY mode = %b", CP_ESRY_Mode ); + CP_ESRY_Mode = 0; + //$display( $time, " New Enter CP ESRY mode = %b", CP_ESRY_Mode ); + end + endtask // disread_ryby + + /*----------------------------------------------------------------------*/ + /* Description: Execute 2X IO Read Mode */ + /*----------------------------------------------------------------------*/ + task read_2xio; + reg [7:0] OUT_Buf; + integer Dummy_Count; + begin + Dummy_Count=4; + SI_IN_EN = 1'b1; + SO_IN_EN = 1'b1; + SI_OUT_EN = 1'b0; + SO_OUT_EN = 1'b0; + dummy_cycle(12); + dummy_cycle(4); + OUT_Buf = (Secur_Mode == 1) ? Secur_ARRAY[Address] : + ((read_protect(Address) == 1'b1) ? 8'b0 : ARRAY[Address] ); + + forever @ ( negedge ISCLK or posedge CS ) begin + if ( CS == 1'b1 ) begin + disable read_2xio; + end + else begin + Read_Mode = 1'b1; + SO_OUT_EN = 1'b1; + SI_OUT_EN = 1'b1; + SI_IN_EN = 1'b0; + SO_IN_EN = 1'b0; + if ( Dummy_Count ) begin + {SIO1_Reg, SIO0_Reg, OUT_Buf} <= #tCLQV {OUT_Buf, OUT_Buf[1:0]}; + Dummy_Count = Dummy_Count - 1; + end + else begin + Address = Address + 1; + Address = (Secur_Mode == 1) ? Address[5:0] : Address; + OUT_Buf = (Secur_Mode == 1) ? Secur_ARRAY[Address] : + ((read_protect(Address) == 1'b1) ? 8'b0 : ARRAY[Address] ); + {SIO1_Reg, SIO0_Reg, OUT_Buf} <= #tCLQV {OUT_Buf, OUT_Buf[1:0]}; + Dummy_Count = 3 ; + end + end + end//forever + end + endtask // read_2xio + + /*----------------------------------------------------------------------*/ + /* Description: define Reading Parameter */ + /*----------------------------------------------------------------------*/ + task read_parameter; + integer Dummy_Count; + begin + Dummy_Count = 8; + forever begin + @ ( negedge ISCLK or posedge CS ); + if ( CS == 1'b1 ) begin + disable read_parameter; + end + else begin + SO_OUT_EN = 1'b1; + if ( Dummy_Count ) begin + Dummy_Count = Dummy_Count - 1; + SIO1_Reg <= #tCLQV Param_Reg[Dummy_Count]; + end + else begin + Dummy_Count = 7; + SIO1_Reg <= #tCLQV Param_Reg[Dummy_Count]; + end + + end + end // end forever + end + endtask // read_parameter + + /*----------------------------------------------------------------------*/ + /* Description: Execute Writing Parameter */ + /*----------------------------------------------------------------------*/ + task write_parameter; + begin + //$display( $time, " Old Parameter Register = %b", Param_Reg ); + if ( Status_Reg[4] == 0 || Status_Reg[3] == 0 || Status_Reg[2] == 0 ) begin//BP2~0 not all 1 + Param_Reg = 8'h00; + end + else begin //allow to change parameter register + Param_Reg = {3'b000,SI_Reg[4:0]}; + end + end + endtask // write_parameter + + /*----------------------------------------------------------------------*/ + /* Description: define a write_protect area function */ + /* INPUT */ + /* sector : sector address */ + /*----------------------------------------------------------------------*/ + function write_protect; + input [A_MSB:0] Address; + begin + //protect_define + Block = Address [A_MSB:16]; + if((Param_Reg[0] == 1) &&(Address[A_MSB:12] == 0)) begin + write_protect = Param_Reg[1]&&(Address[11:10] == 2'b00) || + Param_Reg[2]&&(Address[11:10] == 2'b01) || + Param_Reg[3]&&(Address[11:10] == 2'b10) || + Param_Reg[4]&&(Address[11:10] == 2'b11) ; + end + else if (Status_Reg[5:2] == 4'b0000) begin + write_protect = 1'b0; + end + else if (Status_Reg[5:2] == 4'b0001) begin + if (Block[Block_MSB:0] >= 126 && Block[Block_MSB:0] <= 127) begin + write_protect = 1'b1; + end + else begin + write_protect = 1'b0; + end + end + else if (Status_Reg[5:2] == 4'b0010) begin + if (Block[Block_MSB:0] >= 124 && Block[Block_MSB:0] <= 127) begin + write_protect = 1'b1; + end + else begin + write_protect = 1'b0; + end + end + else if (Status_Reg[5:2] == 4'b0011) begin + if (Block[Block_MSB:0] >= 120 && Block[Block_MSB:0] <= 127) begin + write_protect = 1'b1; + end + else begin + write_protect = 1'b0; + end + end + else if (Status_Reg[5:2] == 4'b0100) begin + if (Block[Block_MSB:0] >= 112 && Block[Block_MSB:0] <= 127) begin + write_protect = 1'b1; + end + else begin + write_protect = 1'b0; + end + end + else if (Status_Reg[5:2] == 4'b0101) begin + if (Block[Block_MSB:0] >= 96 && Block[Block_MSB:0] <= 127) begin + write_protect = 1'b1; + end + else begin + write_protect = 1'b0; + end + end + else if (Status_Reg[5:2] == 4'b0110) begin + if (Block[Block_MSB:0] >= 64 && Block[Block_MSB:0] <= 127) begin + write_protect = 1'b1; + end + else begin + write_protect = 1'b0; + end + end + else if (Status_Reg[5:2] == 4'b0111) begin + write_protect = 1'b1; + end + else if (Status_Reg[5:2] == 4'b1000) begin + write_protect = 1'b1; + end + else if (Status_Reg[5:2] == 4'b1001) begin + if (Block[Block_MSB:0] >= 0 && Block[Block_MSB:0] <= 63) begin + write_protect = 1'b1; + end + else begin + write_protect = 1'b0; + end + end + else if (Status_Reg[5:2] == 4'b1010) begin + if (Block[Block_MSB:0] >= 0 && Block[Block_MSB:0] <= 95) begin + write_protect = 1'b1; + end + else begin + write_protect = 1'b0; + end + end + else if (Status_Reg[5:2] == 4'b1011) begin + if (Block[Block_MSB:0] >= 0 && Block[Block_MSB:0] <= 111) begin + write_protect = 1'b1; + end + else begin + write_protect = 1'b0; + end + end + else if (Status_Reg[5:2] == 4'b1100) begin + if (Block[Block_MSB:0] >= 0 && Block[Block_MSB:0] <= 119) begin + write_protect = 1'b1; + end + else begin + write_protect = 1'b0; + end + end + else if (Status_Reg[5:2] == 4'b1101) begin + if (Block[Block_MSB:0] >= 0 && Block[Block_MSB:0] <= 123) begin + write_protect = 1'b1; + end + else begin + write_protect = 1'b0; + end + end + else if (Status_Reg[5:2] == 4'b1110) begin + if (Block[Block_MSB:0] >= 0 && Block[Block_MSB:0] <= 125) begin + write_protect = 1'b1; + end + else begin + write_protect = 1'b0; + end + end + else if (Status_Reg[5:2] == 4'b1111) begin + write_protect = 1'b1; + end + else begin + write_protect = 1'b1; + end + end + endfunction // write_protect + + + /*----------------------------------------------------------------------*/ + /* When WRLB Condtion Operation; */ + /*----------------------------------------------------------------------*/ + function read_protect; + input [A_MSB : 0] Address ; + begin + if ( (Secur_Reg[2] == 1'b1) && (Address >= PRO_128K_Beg) && (Address <= PRO_128K_End) ) begin + read_protect = 1'b1; + end + else begin + read_protect = 1'b0; + end + end + endfunction // read_protect +// *============================================================================================== +// * AC Timing Check Section +// *============================================================================================== + + wire Read_1XIO_Chk_w = Read_1XIO_Chk; + wire Read_2XIO_Chk_w = Read_2XIO_Chk; + wire SI_IN_EN_w = SI_IN_EN; + wire SO_IN_EN_w = SO_IN_EN; + + specify + /*----------------------------------------------------------------------*/ + /* Timing Check */ + /*----------------------------------------------------------------------*/ + $period( posedge ISCLK &&& ~CS, tSCLK ); // SCLK _/~ ->_/~ + $period( negedge ISCLK &&& ~CS, tSCLK ); // SCLK ~\_ ->~\_ + $period( posedge ISCLK &&& Read_1XIO_Chk_w , tRSCLK ); // SCLK ~\_ ->~\_ + $period( posedge ISCLK &&& Read_2XIO_Chk_w , tTSCLK ); // SCLK ~\_ ->~\_ + + + $width ( posedge ISCLK &&& ~CS, tCH ); // SCLK _/~~\_ + $width ( negedge ISCLK &&& ~CS, tCL ); // SCLK ~\__/~ + $width ( posedge CS , tSHSL ); // CS _/~\_ + $setup ( SI &&& ~CS, posedge ISCLK &&& SI_IN_EN_w, tDVCH ); + $hold ( posedge ISCLK &&& SI_IN_EN_w, SI &&& ~CS, tCHDX ); + + $setup ( SO &&& ~CS, posedge ISCLK &&& SO_IN_EN_w, tDVCH ); + $hold ( posedge ISCLK &&& SO_IN_EN_w, SO &&& ~CS, tCHDX ); + + $setup ( negedge CS, posedge ISCLK &&& ~CS, tSLCH ); + $hold ( posedge ISCLK &&& ~CS, posedge CS, tCHSH ); + + $setup ( posedge CS, posedge ISCLK &&& CS, tSHCH ); + $hold ( posedge ISCLK &&& CS, negedge CS, tCHSL ); + + + $setup ( negedge HOLD , posedge SCLK &&& ~CS, tHLCH ); + $hold ( posedge SCLK &&& ~CS, posedge HOLD , tCHHH ); + + $setup ( posedge HOLD , posedge SCLK &&& ~CS, tHHCH ); + $hold ( posedge SCLK &&& ~CS, negedge HOLD , tCHHL ); + + $setup ( posedge WP &&& SRWD, negedge CS, tWHSL ); + $hold ( posedge CS, negedge WP &&& SRWD, tSHWL ); + + $setup ( negedge SCLK &&& ~CS, negedge HOLD , tCLHS ); + $hold ( negedge SCLK &&& ~CS, posedge HOLD , tCLHH ); + endspecify + + + integer AC_Check_File; + // timing check module + initial + begin + AC_Check_File= $fopen ("ac_check.err" ); + end + + time T_CS_P , T_CS_N; + time T_WP_P , T_WP_N; + time T_SCLK_P , T_SCLK_N; + time T_ISCLK_P , T_ISCLK_N; + time T_HOLD_P , T_HOLD_N; + time T_SI; + time T_SO; + time T_WP; + time T_HOLD; + + initial + begin + T_CS_P = 0; + T_CS_N = 0; + T_WP_P = 0; + T_WP_N = 0; + T_SCLK_P = 0; + T_SCLK_N = 0; + T_ISCLK_P = 0; + T_ISCLK_N = 0; + T_HOLD_P = 0; + T_HOLD_N = 0; + T_SI = 0; + T_SO = 0; + T_WP = 0; + T_HOLD = 0; + end + + always @ ( posedge ISCLK ) begin + //tSCLK + if ( $time - T_ISCLK_P < tSCLK && $time > 0 && ~CS ) + $fwrite (AC_Check_File, "Clock Frequence for except READ struction fSCLK =%d Mhz, fSCLK timing violation at %d \n", fSCLK, $time ); + //fRSCLK + if ( $time - T_ISCLK_P < tRSCLK && Read_1XIO_Chk && $time > 0 && ~CS ) + $fwrite (AC_Check_File, "Clock Frequence for READ instruction fRSCLK =%d Mhz, fRSCLK timing violation at %d \n", fRSCLK, $time ); + //fTSCLK + if ( $time - T_ISCLK_P < tTSCLK && Read_2XIO_Chk && $time > 0 && ~CS ) + $fwrite (AC_Check_File, "Clock Frequence for 2/4XI/O instruction fTSCLK =%d Mhz, fRSCLK timing violation at %d \n", fTSCLK, $time ); + T_ISCLK_P = $time; + #0; + //tDVCH + if ( T_ISCLK_P - T_SI < tDVCH && SI_IN_EN && T_ISCLK_P > 0 ) + $fwrite (AC_Check_File, "minimun Data SI setup time tDVCH=%d ns, tDVCH timing violation at %d \n", tDVCH, $time ); + if ( T_ISCLK_P - T_SO < tDVCH && SO_IN_EN && T_ISCLK_P > 0 ) + $fwrite (AC_Check_File, "minimun Data SO setup time tDVCH=%d ns, tDVCH timing violation at %d \n", tDVCH, $time ); + //tCL + if ( T_ISCLK_P - T_ISCLK_N < tCL && ~CS && T_ISCLK_P > 0 ) + $fwrite (AC_Check_File, "minimun SCLK Low time tCL=%f ns, tCL timing violation at %d \n", tCL, $time ); + end + + always @ ( negedge ISCLK ) begin + T_ISCLK_N = $time; + #0; + //tCH + if ( T_ISCLK_N - T_ISCLK_P < tCH && ~CS && T_ISCLK_N > 0 ) + $fwrite (AC_Check_File, "minimun SCLK High time tCH=%f ns, tCH timing violation at %d \n", tCH, $time ); + end + + + always @ ( SI ) begin + T_SI = $time; + #0; + //tCHDX + if ( T_SI - T_ISCLK_P < tCHDX && SI_IN_EN && T_SI > 0 ) + $fwrite (AC_Check_File, "minimun Data SI hold time tCHDX=%d ns, tCHDX timing violation at %d \n", tCHDX, $time ); + end + + always @ ( SO ) begin + T_SO = $time; + #0; + //tCHDX + if ( T_SO - T_ISCLK_P < tCHDX && SO_IN_EN && T_SO > 0 ) + $fwrite (AC_Check_File, "minimun Data SO hold time tCHDX=%d ns, tCHDX timing violation at %d \n", tCHDX, $time ); + end + + + always @ ( posedge SCLK ) begin + T_SCLK_P = $time; + #0; + // tSLCH + if ( T_SCLK_P - T_CS_N < tSLCH && T_SCLK_P > 0 ) + $fwrite (AC_Check_File, "minimun CS# active setup time tSLCH=%d ns, tSLCH timing violation at %d \n", tSLCH, $time ); + + // tSHCH + if ( T_SCLK_P - T_CS_P < tSHCH && T_SCLK_P > 0 ) + $fwrite (AC_Check_File, "minimun CS# not active setup time tSHCH=%d ns, tSHCH timing violation at %d \n", tSHCH, $time ); + + + //tHLCH + if ( T_SCLK_P - T_HOLD_N < tHLCH && ~CS && T_SCLK_P > 0 ) + $fwrite (AC_Check_File, "minimun HOLD# setup time tHLCH=%d ns, tHLCH timing violation at %d \n", tHLCH, $time ); + + //tHHCH + if ( T_SCLK_P - T_HOLD_P < tHHCH && ~CS && T_SCLK_P > 0 ) + $fwrite (AC_Check_File, "minimun HOLD setup time tHHCH=%d ns, tHHCH timing violation at %d \n", tHHCH, $time ); + + end + + always @ ( negedge SCLK ) begin + T_SCLK_N = $time; + end + + always @ ( posedge CS ) begin + T_CS_P = $time; + #0; + // tCHSH + if ( T_CS_P - T_SCLK_P < tCHSH && T_CS_P > 0 ) + $fwrite (AC_Check_File, "minimun CS# active hold time tCHSH=%d ns, tCHSH timing violation at %d \n", tCHSH, $time ); + end + + + always @ ( negedge CS ) begin + T_CS_N = $time; + #0; + //tCHSL + if ( T_CS_N - T_SCLK_P < tCHSL && T_CS_N > 0 ) + $fwrite (AC_Check_File, "minimun CS# not active hold time tCHSL=%d ns, tCHSL timing violation at %d \n", tCHSL, $time ); + //tSHSL + if ( T_CS_N - T_CS_P < tSHSL && T_CS_N > 0 ) + $fwrite (AC_Check_File, "minimun CS# deslect time tSHSL=%d ns, tSHSL timing violation at %d \n", tSHSL, $time ); + //tWHSL + if ( T_CS_N - T_WP_P < tWHSL && SRWD && T_CS_N > 0 ) + $fwrite (AC_Check_File, "minimun WP setup time tWHSL=%d ns, tWHSL timing violation at %d \n", tWHSL, $time ); + + end + + + always @ ( posedge WP ) begin + T_WP_P = $time; + #0; + end + + always @ ( negedge WP ) begin + T_WP_N = $time; + #0; + //tSHWL + if ( ((T_WP_N - T_CS_P < tSHWL) || ~CS) && SRWD && T_WP_N > 0 ) + $fwrite (AC_Check_File, "minimun WP hold time tSHWL=%d ns, tSHWL timing violation at %d \n", tSHWL, $time ); + end + + always @ ( posedge HOLD ) begin + T_HOLD_P = $time; + #0; + + //tCHHH + if ( T_HOLD_P - T_SCLK_P < tCHHH && ~CS && T_HOLD_P > 0 ) + $fwrite (AC_Check_File, "minimun HOLD# hold time tCHHH=%d ns, tCHHH timing violation at %d \n", tCHHH, $time ); + + //tCLHH + if ( T_HOLD_P - T_SCLK_N < tCLHH && ~CS && T_HOLD_P > 0 ) + $fwrite (AC_Check_File, "Clock Low to HOLD# hold time tCLHH=%d ns, tCLHH timing violation at %d \n", tCLHH, $time ); + + end + + + always @ ( negedge HOLD ) begin + T_HOLD_N = $time; + #0; + //tCHHL + if ( T_HOLD_N - T_SCLK_P < tCHHL && ~CS && T_HOLD_N > 0 ) + $fwrite (AC_Check_File, "minimun HOLD hold time tCHHL=%d ns, tCHHL timing violation at %d \n", tCHHL, $time ); + + //tCLHS + if ( T_HOLD_N - T_SCLK_N < tCLHS && ~CS && T_HOLD_N > 0 ) + $fwrite (AC_Check_File, "Clock Low to HOLD# setup time tCLHS=%d ns, tCLHS timing violation at %d \n", tCLHS, $time ); + end + +endmodule + + + + diff --git a/resources/soc/simu/testbench/ddr3_model.sv b/resources/soc/simu/testbench/ddr3_model.sv new file mode 100644 index 0000000..d600001 --- /dev/null +++ b/resources/soc/simu/testbench/ddr3_model.sv @@ -0,0 +1,2937 @@ +//`define MAX_MEM + +/**************************************************************************************** +* +* File Name: ddr3.v +* Version: 1.72 +* Model: BUS Functional +* +* Dependencies: ddr3_model_parameters.vh +* +* Description: Micron SDRAM DDR3 (Double Data Rate 3) +* +* Limitation: - doesn't check for average refresh timings +* - positive ck and ck_n edges are used to form internal clock +* - positive dqs and dqs_n edges are used to latch data +* - test mode is not modeled +* - Duty Cycle Corrector is not modeled +* - Temperature Compensated Self Refresh is not modeled +* - DLL off mode is not modeled. +* +* Note: - Set simulator resolution to "ps" accuracy +* - Set DEBUG = 0 to disable $display messages +* +* Disclaimer This software code and all associated documentation, comments or other +* of Warranty: information (collectively "Software") is provided "AS IS" without +* warranty of any kind. MICRON TECHNOLOGY, INC. ("MTI") EXPRESSLY +* DISCLAIMS ALL WARRANTIES EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +* TO, NONINFRINGEMENT OF THIRD PARTY RIGHTS, AND ANY IMPLIED WARRANTIES +* OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. MTI DOES NOT +* WARRANT THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS, OR THAT THE +* OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE. +* FURTHERMORE, MTI DOES NOT MAKE ANY REPRESENTATIONS REGARDING THE USE OR +* THE RESULTS OF THE USE OF THE SOFTWARE IN TERMS OF ITS CORRECTNESS, +* ACCURACY, RELIABILITY, OR OTHERWISE. THE ENTIRE RISK ARISING OUT OF USE +* OR PERFORMANCE OF THE SOFTWARE REMAINS WITH YOU. IN NO EVENT SHALL MTI, +* ITS AFFILIATED COMPANIES OR THEIR SUPPLIERS BE LIABLE FOR ANY DIRECT, +* INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR SPECIAL DAMAGES (INCLUDING, +* WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, BUSINESS INTERRUPTION, +* OR LOSS OF INFORMATION) ARISING OUT OF YOUR USE OF OR INABILITY TO USE +* THE SOFTWARE, EVEN IF MTI HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +* DAMAGES. Because some jurisdictions prohibit the exclusion or +* limitation of liability for consequential or incidental damages, the +* above limitation may not apply to you. +* +* Copyright 2003 Micron Technology, Inc. All rights reserved. +* +* Rev Author Date Changes +* --------------------------------------------------------------------------------------- +* 0.41 JMK 05/12/06 Removed auto-precharge to power down error check. +* 0.42 JMK 08/25/06 Created internal clock using ck and ck_n. +* TDQS can only be enabled in EMR for x8 configurations. +* CAS latency is checked vs frequency when DLL locks. +* Improved checking of DQS during writes. +* Added true BL4 operation. +* 0.43 JMK 08/14/06 Added checking for setting reserved bits in Mode Registers. +* Added ODTS Readout. +* Replaced tZQCL with tZQinit and tZQoper +* Fixed tWRPDEN and tWRAPDEN during BC4MRS and BL4MRS. +* Added tRFC checking for Refresh to Power-Down Re-Entry. +* Added tXPDLL checking for Power-Down Exit to Refresh to Power-Down Entry +* Added Clock Frequency Change during Precharge Power-Down. +* Added -125x speed grades. +* Fixed tRCD checking during Write. +* 1.00 JMK 05/11/07 Initial release +* 1.10 JMK 06/26/07 Fixed ODTH8 check during BLOTF +* Removed temp sensor readout from MPR +* Updated initialization sequence +* Updated timing parameters +* 1.20 JMK 09/05/07 Updated clock frequency change +* Added ddr3_dimm module +* 1.30 JMK 01/23/08 Updated timing parameters +* 1.40 JMK 12/02/08 Added support for DDR3-1866 and DDR3-2133 +* renamed ddr3_dimm.v to ddr3_module.v and added SODIMM support. +* Added multi-chip package model support in ddr3_mcp.v +* 1.50 JMK 05/04/08 Added 1866 and 2133 speed grades. +* 1.60 MYY 07/10/09 Merging of 1.50 version and pre-1.0 version changes +* 1.61 SPH 12/10/09 Only check tIH for cmd_addr if CS# LOW +* 1.62 SPH 10/26/10 Added 4Gb DDR3 SDRAM support +* 1.63 MYY 11/09/10 Added Dll Disable mode +* 1.64 MYY 07/28/11 Check dqs_in for dqs timing check +* 1.65 MYY 09/19/11 Widen internal bus width +* 1.66 MYY 01/20/12 Support ODT tied high feature +* 1.67 MYY 02/03/12 Added TJIT_PER margin for timing checks +* 1.68 SPH 04/02/12 Added memory preload +* 1.69 SPH 03/19/13 Update tZQCS, tZQinit, tZQoper timing parameters +* 1.70 SPH 04/08/14 Update tRFC to PRECHARGE check +* 1.71 SPH 04/21/14 Added 8Gb mono die parameters +* Remove strict CL check +* 1.72 DLH 06/18/15 calculate TZQCS from current tCK +*****************************************************************************************/ + +// DO NOT CHANGE THE TIMESCALE +// MAKE SURE YOUR SIMULATOR USES "PS" RESOLUTION +`timescale 1ps / 1ps + +// model flags +// `define MODEL_PASR +//Memory Details +`define x1Gb +`define sg125 +`define x16 +module ddr3_model ( + rst_n, + ck, + ck_n, + cke, + cs_n, + ras_n, + cas_n, + we_n, + dm_tdqs, + ba, + addr, + dq, + dqs, + dqs_n, + tdqs_n, + odt +); + + `include "ddr3_model_parameters.vh" + + parameter check_strict_mrbits = 1; + parameter check_strict_timing = 1; + parameter feature_pasr = 1; + parameter feature_truebl4 = 0; + parameter feature_odt_hi = 0; + parameter PERTCKAVG=TDLLK; + + // text macros + `define DQ_PER_DQS DQ_BITS/DQS_BITS + `define BANKS (1<= 2. \nBL_MAX = %d", BL_MAX); + if ((1< BL_MAX) + $display("%m ERROR: 2^BO_BITS cannot be greater than BL_MAX parameter."); + + $timeformat (-12, 1, " ps", 1); + seed = RANDOM_SEED; + + ck_cntr = 0; + end + + function integer get_rtt_wr; + input [1:0] rtt; + begin + get_rtt_wr = RZQ/{rtt[0], rtt[1], 1'b0}; + end + endfunction + + function integer get_rtt_nom; + input [2:0] rtt; + begin + case (rtt) + 1: get_rtt_nom = RZQ/4; + 2: get_rtt_nom = RZQ/2; + 3: get_rtt_nom = RZQ/6; + 4: get_rtt_nom = RZQ/12; + 5: get_rtt_nom = RZQ/8; + default : get_rtt_nom = 0; + endcase + end + endfunction + + // calculate the absolute value of a real number + function real abs_value; + input arg; + real arg; + begin + if (arg < 0.0) + abs_value = -1.0 * arg; + else + abs_value = arg; + end + endfunction + + function integer ceil; + input number; + real number; + + // LMR 4.1.7 + // When either operand of a relational expression is a real operand then the other operand shall be converted + // to an equivalent real value, and the expression shall be interpreted as a comparison between two real values. + if (number > $rtoi(number)) + ceil = $rtoi(number) + 1; + else + ceil = number; + endfunction + + function integer floor; + input number; + real number; + + // LMR 4.1.7 + // When either operand of a relational expression is a real operand then the other operand shall be converted + // to an equivalent real value, and the expression shall be interpreted as a comparison between two real values. + if (number < $rtoi(number)) + floor = $rtoi(number) - 1; + else + floor = number; + endfunction + + function int max( input int a, b ); + max = (a < b) ? b : a; + endfunction + + function int min( input int a, b ); + min = (a > b) ? b : a; + endfunction + +`ifdef MAX_MEM + + function integer open_bank_file( input integer bank ); + integer fd; + reg [2048:1] filename; + begin + $sformat( filename, "%0s/%m.%0d", tmp_model_dir, bank ); + + fd = $fopen(filename, "wb+"); + if (fd == 0) + begin + $display("%m: at time %0t ERROR: failed to open %0s.", $time, filename); + $finish; + end + else + begin + if (DEBUG) $display("%m: at time %0t INFO: opening %0s.", $time, filename); + open_bank_file = fd; + end + + end + endfunction + + function [RFF_BITS:1] read_from_file( + input integer fd, + input integer index + ); + integer code; + integer offset; + reg [1024:1] msg; + reg [RFF_BITS:1] read_value; + + begin + offset = index * RFF_CHUNK; + code = $fseek( fd, offset, 0 ); + // $fseek returns 0 on success, -1 on failure + if (code != 0) + begin + $display("%m: at time %t ERROR: fseek to %d failed", $time, offset); + $finish; + end + + code = $fscanf(fd, "%z", read_value); + // $fscanf returns number of items read + if (code != 1) + begin + if ($ferror(fd,msg) != 0) + begin + $display("%m: at time %t ERROR: fscanf failed at %d", $time, index); + $display(msg); + $finish; + end + else + read_value = 'hx; + end + + /* when reading from unwritten portions of the file, 0 will be returned. + * Use 0 in bit 1 as indicator that invalid data has been read. + * A true 0 is encoded as Z. + */ + if (read_value[1] === 1'bz) + // true 0 encoded as Z, data is valid + read_value[1] = 1'b0; + else if (read_value[1] === 1'b0) + // read from file section that has not been written + read_value = 'hx; + + read_from_file = read_value; + end + endfunction + + task write_to_file( + input integer fd, + input integer index, + input [RFF_BITS:1] data + ); + integer code; + integer offset; + + begin + offset = index * RFF_CHUNK; + code = $fseek( fd, offset, 0 ); + if (code != 0) + begin + $display("%m: at time %t ERROR: fseek to %d failed", $time, offset); + $finish; + end + + // encode a valid data + if (data[1] === 1'bz) + data[1] = 1'bx; + else if (data[1] === 1'b0) + data[1] = 1'bz; + + $fwrite( fd, "%z", data ); + end + endtask +`else + function get_index; + input [`MAX_BITS-1:0] addr; + begin : index + get_index = 0; + for (memory_index=0; memory_index>(ROW_BITS+COL_BITS-BL_BITS)); + if (!banks[ba]) begin //bank is selected to keep + address[i] = address[memory_index]; + memory[i] = memory[memory_index]; + i = i + 1; + end + end + // clean up the unused banks + for (memory_index=i; memory_index TRAS_MAX) $display ("%m: at time %t ERROR: tRAS maximum violation during %s to bank %d", $time, cmd_string[cmd], bank); + if ($time - tm_bank_activate[bank] < TRAS_MIN-TJIT_PER) $display ("%m: at time %t ERROR: tRAS minimum violation during %s to bank %d", $time, cmd_string[cmd], bank);end + {1'bx, SAME_BANK , ACTIVATE , ACTIVATE } : begin if ($time - tm_bank_activate[bank] < TRC-TJIT_PER) $display ("%m: at time %t ERROR: tRC violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'bx, SAME_BANK , ACTIVATE , WRITE } , + {1'bx, SAME_BANK , ACTIVATE , READ } : ; // tRCD is checked outside this task + {1'b0, DIFF_BANK , ACTIVATE , ACTIVATE } : begin if (($time - tm_activate < TRRD) || (ck_cntr - ck_activate < TRRD_TCK)) $display ("%m: at time %t ERROR: tRRD violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'b1, DIFF_BANK , ACTIVATE , ACTIVATE } : begin if (($time - tm_group_activate[bank[1]] < TRRD) || (ck_cntr - ck_group_activate[bank[1]] < TRRD_TCK)) $display ("%m: at time %t ERROR: tRRD violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'b1, DIFF_GROUP, ACTIVATE , ACTIVATE } : begin if (($time - tm_activate < TRRD_DG) || (ck_cntr - ck_activate < TRRD_DG_TCK)) $display ("%m: at time %t ERROR: tRRD_DG violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'bx, DIFF_BANK , ACTIVATE , REFRESH } : begin if ($time - tm_activate < TRC-TJIT_PER) $display ("%m: at time %t ERROR: tRC violation during %s", $time, cmd_string[cmd]); end + {1'bx, DIFF_BANK , ACTIVATE , PWR_DOWN } : begin if (ck_cntr - ck_activate < TACTPDEN) $display ("%m: at time %t ERROR: tACTPDEN violation during %s", $time, cmd_string[cmd]); end + + // write + {1'bx, SAME_BANK , WRITE , PRECHARGE} : begin if (($time - tm_bank_write_end[bank] < TWR-TJIT_PER) || (ck_cntr - ck_bank_write[bank] <= write_latency + burst_length/2)) $display ("%m: at time %t ERROR: tWR violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'b0, DIFF_BANK , WRITE , WRITE } : begin if (ck_cntr - ck_write < TCCD) $display ("%m: at time %t ERROR: tCCD violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'b1, DIFF_BANK , WRITE , WRITE } : begin if (ck_cntr - ck_group_write[bank[1]] < TCCD) $display ("%m: at time %t ERROR: tCCD violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'b0, DIFF_BANK , WRITE , READ } : begin if (ck_cntr - ck_write < write_latency + burst_length/2 + TWTR_TCK - additive_latency) $display ("%m: at time %t ERROR: tWTR violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'b1, DIFF_BANK , WRITE , READ } : begin if (ck_cntr - ck_group_write[bank[1]] < write_latency + burst_length/2 + TWTR_TCK - additive_latency) $display ("%m: at time %t ERROR: tWTR violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'b1, DIFF_GROUP, WRITE , WRITE } : begin if (ck_cntr - ck_write < TCCD_DG) $display ("%m: at time %t ERROR: tCCD_DG violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'b1, DIFF_GROUP, WRITE , READ } : begin if (ck_cntr - ck_write < write_latency + burst_length/2 + TWTR_DG_TCK - additive_latency) $display ("%m: at time %t ERROR: tWTR_DG violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'bx, DIFF_BANK , WRITE , PWR_DOWN } : begin if (($time - tm_write_end < TWR-TJIT_PER) || (ck_cntr - ck_write < write_latency + burst_length/2)) $display ("%m: at time %t ERROR: tWRPDEN violation during %s", $time, cmd_string[cmd]); end + + // read + {1'bx, SAME_BANK , READ , PRECHARGE} : begin if (($time - tm_bank_read_end[bank] < TRTP-TJIT_PER) || (ck_cntr - ck_bank_read[bank] < additive_latency + TRTP_TCK)) $display ("%m: at time %t ERROR: tRTP violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'b0, DIFF_BANK , READ , WRITE } : ; // tRTW is checked outside this task + {1'b1, DIFF_BANK , READ , WRITE } : ; // tRTW is checked outside this task + {1'b0, DIFF_BANK , READ , READ } : begin if (ck_cntr - ck_read < TCCD) $display ("%m: at time %t ERROR: tCCD violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'b1, DIFF_BANK , READ , READ } : begin if (ck_cntr - ck_group_read[bank[1]] < TCCD) $display ("%m: at time %t ERROR: tCCD violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'b1, DIFF_GROUP, READ , WRITE } : ; // tRTW is checked outside this task + {1'b1, DIFF_GROUP, READ , READ } : begin if (ck_cntr - ck_read < TCCD_DG) $display ("%m: at time %t ERROR: tCCD_DG violation during %s to bank %d", $time, cmd_string[cmd], bank); end + {1'bx, DIFF_BANK , READ , PWR_DOWN } : begin if (ck_cntr - ck_read < read_latency + 5) $display ("%m: at time %t ERROR: tRDPDEN violation during %s", $time, cmd_string[cmd]); end + + // zq + {1'bx, DIFF_BANK , ZQ , LOAD_MODE} : ; // 1 tCK + {1'bx, DIFF_BANK , ZQ , REFRESH } , + {1'bx, DIFF_BANK , ZQ , PRECHARGE} , + {1'bx, DIFF_BANK , ZQ , ACTIVATE } , + {1'bx, DIFF_BANK , ZQ , ZQ } , + {1'bx, DIFF_BANK , ZQ , PWR_DOWN } , + {1'bx, DIFF_BANK , ZQ , SELF_REF } : begin if (ck_cntr - ck_zqinit < TZQINIT) $display ("%m: at time %t ERROR: tZQinit violation during %s", $time, cmd_string[cmd]); + if (ck_cntr - ck_zqoper < TZQOPER) $display ("%m: at time %t ERROR: tZQoper violation during %s", $time, cmd_string[cmd]); + if (ck_cntr - ck_zqcs < TZQCS) $display ("%m: at time %t ERROR: tZQCS violation during %s", $time, cmd_string[cmd]); end + + // power down + {1'bx, DIFF_BANK , PWR_DOWN , LOAD_MODE} , + {1'bx, DIFF_BANK , PWR_DOWN , REFRESH } , + {1'bx, DIFF_BANK , PWR_DOWN , PRECHARGE} , + {1'bx, DIFF_BANK , PWR_DOWN , ACTIVATE } , + {1'bx, DIFF_BANK , PWR_DOWN , WRITE } , + {1'bx, DIFF_BANK , PWR_DOWN , ZQ } : begin if (($time - tm_power_down < TXP) || (ck_cntr - ck_power_down < TXP_TCK)) $display ("%m: at time %t ERROR: tXP violation during %s", $time, cmd_string[cmd]); end + {1'bx, DIFF_BANK , PWR_DOWN , READ } : begin if (($time - tm_power_down < TXP) || (ck_cntr - ck_power_down < TXP_TCK)) $display ("%m: at time %t ERROR: tXP violation during %s", $time, cmd_string[cmd]); + else if (($time - tm_slow_exit_pd < TXPDLL) || (ck_cntr - ck_slow_exit_pd < TXPDLL_TCK)) $display ("%m: at time %t ERROR: tXPDLL violation during %s", $time, cmd_string[cmd]); end + {1'bx, DIFF_BANK , PWR_DOWN , PWR_DOWN } , + {1'bx, DIFF_BANK , PWR_DOWN , SELF_REF } : begin if (($time - tm_power_down < TXP) || (ck_cntr - ck_power_down < TXP_TCK)) $display ("%m: at time %t ERROR: tXP violation during %s", $time, cmd_string[cmd]); + if ((tm_power_down > tm_refresh) && ($time - tm_refresh < TRFC_MIN)) $display ("%m: at time %t ERROR: tRFC violation during %s", $time, cmd_string[cmd]); + if ((tm_refresh > tm_power_down) && (($time - tm_power_down < TXPDLL) || (ck_cntr - ck_power_down < TXPDLL_TCK))) $display ("%m: at time %t ERROR: tXPDLL violation during %s", $time, cmd_string[cmd]); + if (($time - tm_cke_cmd < TCKE) || (ck_cntr - ck_cke_cmd < TCKE_TCK)) $display ("%m: at time %t ERROR: tCKE violation on CKE", $time); end + + // self refresh + {1'bx, DIFF_BANK , SELF_REF , LOAD_MODE} , + {1'bx, DIFF_BANK , SELF_REF , REFRESH } , + {1'bx, DIFF_BANK , SELF_REF , PRECHARGE} , + {1'bx, DIFF_BANK , SELF_REF , ACTIVATE } , + {1'bx, DIFF_BANK , SELF_REF , WRITE } , + {1'bx, DIFF_BANK , SELF_REF , ZQ } : begin if (($time - tm_self_refresh < TXS) || (ck_cntr - ck_self_refresh < TXS_TCK)) $display ("%m: at time %t ERROR: tXS violation during %s", $time, cmd_string[cmd]); end + {1'bx, DIFF_BANK , SELF_REF , READ } : begin if (ck_cntr - ck_self_refresh < TXSDLL) $display ("%m: at time %t ERROR: tXSDLL violation during %s", $time, cmd_string[cmd]); end + {1'bx, DIFF_BANK , SELF_REF , PWR_DOWN } , + {1'bx, DIFF_BANK , SELF_REF , SELF_REF } : begin if (($time - tm_self_refresh < TXS) || (ck_cntr - ck_self_refresh < TXS_TCK)) $display ("%m: at time %t ERROR: tXS violation during %s", $time, cmd_string[cmd]); + if (($time - tm_cke_cmd < TCKE) || (ck_cntr - ck_cke_cmd < TCKE_TCK)) $display ("%m: at time %t ERROR: tCKE violation on CKE", $time); end + endcase + end + endtask + + task cmd_task; + inout prev_cke; + input cke; + input [2:0] cmd; + input [BA_BITS-1:0] bank; + input [ADDR_BITS-1:0] addr; + reg [`BANKS:0] i; + integer j; + reg [`BANKS:0] tfaw_cntr; + reg [COL_BITS-1:0] col; + reg group; + begin + // tRFC max check + if (!er_trfc_max && !in_self_refresh) begin + if ($time - tm_refresh > TRFC_MAX && check_strict_timing) begin + $display ("%m: at time %t ERROR: tRFC maximum violation during %s", $time, cmd_string[cmd]); + er_trfc_max = 1; + end + end + if (cke) begin + if ((cmd < NOP) && (cmd != PRECHARGE)) begin + if (($time - tm_txpr < TXPR) || (ck_cntr - ck_txpr < TXPR_TCK)) + $display ("%m: at time %t ERROR: tXPR violation during %s", $time, cmd_string[cmd]); + for (j=0; j<=SELF_REF; j=j+1) begin + chk_err(SAME_BANK , bank, j, cmd); + chk_err(DIFF_BANK , bank, j, cmd); + chk_err(DIFF_GROUP, bank, j, cmd); + end + end + case (cmd) + LOAD_MODE : begin + if (|odt_pipeline) + $display ("%m: at time %t ERROR: ODTL violation during %s", $time, cmd_string[cmd]); + if (odt_state && !feature_odt_hi) + $display ("%m: at time %t ERROR: ODT must be off prior to %s", $time, cmd_string[cmd]); + + if (|active_bank) begin + $display ("%m: at time %t ERROR: %s Failure. All banks must be Precharged.", $time, cmd_string[cmd]); + if (STOP_ON_ERROR) $stop(0); + end else begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d", $time, cmd_string[cmd], bank); + if (bank>>2) begin + $display ("%m: at time %t ERROR: %s %d Illegal value. Reserved bank bits must be programmed to zero", $time, cmd_string[cmd], bank); + end + case (bank) + 0 : begin + // Burst Length + if (addr[1:0] == 2'b00) begin + burst_length = 8; + blotf = 0; + truebl4 = 0; + if (DEBUG) $display ("%m: at time %t INFO: %s %d Burst Length = %d", $time, cmd_string[cmd], bank, burst_length); + end else if (addr[1:0] == 2'b01) begin + burst_length = 8; + blotf = 1; + if (DEBUG) $display ("%m: at time %t INFO: %s %d Burst Length = Select via A12", $time, cmd_string[cmd], bank); + end else if (addr[1:0] == 2'b10) begin + burst_length = 4; + blotf = 0; + if (DEBUG) $display ("%m: at time %t INFO: %s %d Burst Length = Fixed %d (chop)", $time, cmd_string[cmd], bank, burst_length); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal Burst Length = %d", $time, cmd_string[cmd], bank, addr[1:0]); + end + // Burst Order + burst_order = addr[3]; + if (!burst_order) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Burst Order = Sequential", $time, cmd_string[cmd], bank); + end else if (burst_order) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Burst Order = Interleaved", $time, cmd_string[cmd], bank); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal Burst Order = %d", $time, cmd_string[cmd], bank, burst_order); + end + // CAS Latency + cas_latency = {addr[2],addr[6:4]} + 4; + set_latency; + if ((cas_latency >= CL_MIN) && (cas_latency <= CL_MAX)) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d CAS Latency = %d", $time, cmd_string[cmd], bank, cas_latency); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal CAS Latency = %d", $time, cmd_string[cmd], bank, cas_latency); + end + // Reserved + if (addr[7] !== 0 && check_strict_mrbits) begin + $display ("%m: at time %t ERROR: %s %d Illegal value. Reserved address bits must be programmed to zero", $time, cmd_string[cmd], bank); + end + // DLL Reset + dll_reset = addr[8]; + if (!dll_reset) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d DLL Reset = Normal", $time, cmd_string[cmd], bank); + end else if (dll_reset) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d DLL Reset = Reset DLL", $time, cmd_string[cmd], bank); + dll_locked = 0; + init_dll_reset = 1; + ck_dll_reset <= ck_cntr; + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal DLL Reset = %d", $time, cmd_string[cmd], bank, dll_reset); + end + + // Write Recovery + if (addr[11:9] == 0) begin + write_recovery = 16; + end else if (addr[11:9] < 4) begin + write_recovery = addr[11:9] + 4; + end else begin + write_recovery = 2*addr[11:9]; + end + + if ((write_recovery >= WR_MIN) && (write_recovery <= WR_MAX)) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Write Recovery = %d", $time, cmd_string[cmd], bank, write_recovery); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal Write Recovery = %d", $time, cmd_string[cmd], bank, write_recovery); + end + // Power Down Mode + low_power = !addr[12]; + if (!low_power) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Power Down Mode = DLL on", $time, cmd_string[cmd], bank); + end else if (low_power) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Power Down Mode = DLL off", $time, cmd_string[cmd], bank); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal Power Down Mode = %d", $time, cmd_string[cmd], bank, low_power); + end + // Reserved + if (ADDR_BITS>13 && addr[13] !== 0 && check_strict_mrbits) begin + $display ("%m: at time %t ERROR: %s %d Illegal value. Reserved address bits must be programmed to zero", $time, cmd_string[cmd], bank); + end + end + 1 : begin + // DLL Enable + dll_en = !addr[0]; + if (!dll_en) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d DLL Enable = Disabled", $time, cmd_string[cmd], bank); + if (check_strict_mrbits) $display ("%m: at time %t WARNING: %s %d DLL off mode is not fully modeled", $time, cmd_string[cmd], bank); + end else if (dll_en) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d DLL Enable = Enabled", $time, cmd_string[cmd], bank); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal DLL Enable = %d", $time, cmd_string[cmd], bank, dll_en); + end + // Output Drive Strength + if ({addr[5], addr[1]} == 2'b00) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Output Drive Strength = %d Ohm", $time, cmd_string[cmd], bank, RZQ/6); + end else if ({addr[5], addr[1]} == 2'b01) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Output Drive Strength = %d Ohm", $time, cmd_string[cmd], bank, RZQ/7); + end else if ({addr[5], addr[1]} == 2'b11) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Output Drive Strength = %d Ohm", $time, cmd_string[cmd], bank, RZQ/5); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal Output Drive Strength = %d", $time, cmd_string[cmd], bank, {addr[5], addr[1]}); + end + // ODT Rtt (Rtt_NOM) + odt_rtt_nom = {addr[9], addr[6], addr[2]}; + if (odt_rtt_nom == 3'b000) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d ODT Rtt = Disabled", $time, cmd_string[cmd], bank); + odt_en = 0; + end else if ((odt_rtt_nom < 4) || ((!addr[7] || (addr[7] && addr[12])) && (odt_rtt_nom < 6))) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d ODT Rtt = %d Ohm", $time, cmd_string[cmd], bank, get_rtt_nom(odt_rtt_nom)); + odt_en = 1; + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal ODT Rtt = %d", $time, cmd_string[cmd], bank, odt_rtt_nom); + odt_en = 0; + end + // Report the additive latency value + al = addr[4:3]; + set_latency; + if (al == 0) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Additive Latency = %d", $time, cmd_string[cmd], bank, al); + end else if ((al >= AL_MIN) && (al <= AL_MAX)) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Additive Latency = CL - %d", $time, cmd_string[cmd], bank, al); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal Additive Latency = %d", $time, cmd_string[cmd], bank, al); + end + // Write Levelization + write_levelization = addr[7]; + if (!write_levelization) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Write Levelization = Disabled", $time, cmd_string[cmd], bank); + end else if (write_levelization) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Write Levelization = Enabled", $time, cmd_string[cmd], bank); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal Write Levelization = %d", $time, cmd_string[cmd], bank, write_levelization); + end + // Reserved + if (addr[8] !== 0 && check_strict_mrbits) begin + $display ("%m: at time %t ERROR: %s %d Illegal value. Reserved address bits must be programmed to zero", $time, cmd_string[cmd], bank); + end + // Reserved + if (addr[10] !== 0 && check_strict_mrbits) begin + $display ("%m: at time %t ERROR: %s %d Illegal value. Reserved address bits must be programmed to zero", $time, cmd_string[cmd], bank); + end + // TDQS Enable + tdqs_en = addr[11]; + if (!tdqs_en) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d TDQS Enable = Disabled", $time, cmd_string[cmd], bank); + end else if (tdqs_en) begin + if (8 == DQ_BITS) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d TDQS Enable = Enabled", $time, cmd_string[cmd], bank); + end + else begin + $display ("%m: at time %t WARNING: %s %d Illegal TDQS Enable. TDQS only exists on a x8 part", $time, cmd_string[cmd], bank); + tdqs_en = 0; + end + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal TDQS Enable = %d", $time, cmd_string[cmd], bank, tdqs_en); + end + // Output Enable + out_en = !addr[12]; + if (!out_en) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Qoff = Disabled", $time, cmd_string[cmd], bank); + end else if (out_en) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Qoff = Enabled", $time, cmd_string[cmd], bank); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal Qoff = %d", $time, cmd_string[cmd], bank, out_en); + end + // Reserved + if (ADDR_BITS>13 && addr[13] !== 0 && check_strict_mrbits) begin + $display ("%m: at time %t ERROR: %s %d Illegal value. Reserved address bits must be programmed to zero", $time, cmd_string[cmd], bank); + end + end + 2 : begin + if (feature_pasr) begin + // Partial Array Self Refresh + pasr = addr[2:0]; + case (pasr) + 3'b000 : if (DEBUG) $display ("%m: at time %t INFO: %s %d Partial Array Self Refresh = Bank 0-7", $time, cmd_string[cmd], bank); + 3'b001 : if (DEBUG) $display ("%m: at time %t INFO: %s %d Partial Array Self Refresh = Bank 0-3", $time, cmd_string[cmd], bank); + 3'b010 : if (DEBUG) $display ("%m: at time %t INFO: %s %d Partial Array Self Refresh = Bank 0-1", $time, cmd_string[cmd], bank); + 3'b011 : if (DEBUG) $display ("%m: at time %t INFO: %s %d Partial Array Self Refresh = Bank 0", $time, cmd_string[cmd], bank); + 3'b100 : if (DEBUG) $display ("%m: at time %t INFO: %s %d Partial Array Self Refresh = Bank 2-7", $time, cmd_string[cmd], bank); + 3'b101 : if (DEBUG) $display ("%m: at time %t INFO: %s %d Partial Array Self Refresh = Bank 4-7", $time, cmd_string[cmd], bank); + 3'b110 : if (DEBUG) $display ("%m: at time %t INFO: %s %d Partial Array Self Refresh = Bank 6-7", $time, cmd_string[cmd], bank); + 3'b111 : if (DEBUG) $display ("%m: at time %t INFO: %s %d Partial Array Self Refresh = Bank 7", $time, cmd_string[cmd], bank); + default : $display ("%m: at time %t ERROR: %s %d Illegal Partial Array Self Refresh = %d", $time, cmd_string[cmd], bank, pasr); + endcase + end + else + if (addr[2:0] !== 0 && check_strict_mrbits) begin + $display ("%m: at time %t ERROR: %s %d Illegal value. Reserved address bits must be programmed to zero", $time, cmd_string[cmd], bank); + end + // CAS Write Latency + cas_write_latency = addr[5:3]+5; + set_latency; + if ((cas_write_latency >= CWL_MIN) && (cas_write_latency <= CWL_MAX)) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d CAS Write Latency = %d", $time, cmd_string[cmd], bank, cas_write_latency); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal CAS Write Latency = %d", $time, cmd_string[cmd], bank, cas_write_latency); + end + // Auto Self Refresh Method + asr = addr[6]; + if (!asr) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Auto Self Refresh = Disabled", $time, cmd_string[cmd], bank); + end else if (asr) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Auto Self Refresh = Enabled", $time, cmd_string[cmd], bank); + if (check_strict_mrbits) $display ("%m: at time %t WARNING: %s %d Auto Self Refresh is not modeled", $time, cmd_string[cmd], bank); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal Auto Self Refresh = %d", $time, cmd_string[cmd], bank, asr); + end + // Self Refresh Temperature + srt = addr[7]; + if (!srt) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Self Refresh Temperature = Normal", $time, cmd_string[cmd], bank); + end else if (srt) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Self Refresh Temperature = Extended", $time, cmd_string[cmd], bank); + if (check_strict_mrbits) $display ("%m: at time %t WARNING: %s %d Self Refresh Temperature is not modeled", $time, cmd_string[cmd], bank); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal Self Refresh Temperature = %d", $time, cmd_string[cmd], bank, srt); + end + if (asr && srt) + $display ("%m: at time %t ERROR: %s %d SRT must be set to 0 when ASR is enabled.", $time, cmd_string[cmd], bank); + // Reserved + if (addr[8] !== 0 && check_strict_mrbits) begin + $display ("%m: at time %t ERROR: %s %d Illegal value. Reserved address bits must be programmed to zero", $time, cmd_string[cmd], bank); + end + // Dynamic ODT (Rtt_WR) + odt_rtt_wr = addr[10:9]; + if (odt_rtt_wr == 2'b00) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Dynamic ODT = Disabled", $time, cmd_string[cmd], bank); + dyn_odt_en = 0; + end else if ((odt_rtt_wr > 0) && (odt_rtt_wr < 3)) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d Dynamic ODT Rtt = %d Ohm", $time, cmd_string[cmd], bank, get_rtt_wr(odt_rtt_wr)); + dyn_odt_en = 1; + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal Dynamic ODT = %d", $time, cmd_string[cmd], bank, odt_rtt_wr); + dyn_odt_en = 0; + end + // Reserved + if (ADDR_BITS>13 && addr[13:11] !== 0 && check_strict_mrbits) begin + $display ("%m: at time %t ERROR: %s %d Illegal value. Reserved address bits must be programmed to zero", $time, cmd_string[cmd], bank); + end + end + 3 : begin + mpr_select = addr[1:0]; + // MultiPurpose Register Select + if (mpr_select == 2'b00) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d MultiPurpose Register Select = Pre-defined pattern", $time, cmd_string[cmd], bank); + end else begin + if (check_strict_mrbits) $display ("%m: at time %t ERROR: %s %d Illegal MultiPurpose Register Select = %d", $time, cmd_string[cmd], bank, mpr_select); + end + // MultiPurpose Register Enable + mpr_en = addr[2]; + if (!mpr_en) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d MultiPurpose Register Enable = Disabled", $time, cmd_string[cmd], bank); + end else if (mpr_en) begin + if (DEBUG) $display ("%m: at time %t INFO: %s %d MultiPurpose Register Enable = Enabled", $time, cmd_string[cmd], bank); + end else begin + $display ("%m: at time %t ERROR: %s %d Illegal MultiPurpose Register Enable = %d", $time, cmd_string[cmd], bank, mpr_en); + end + + if (feature_truebl4 && (addr[11] == 1'b1)) begin + if (addr[11] == 1'b1) begin + truebl4 = 1; + $display(" EMRS3 Set True Bl4 mode only "); + end + end + + // Reserved + if (ADDR_BITS>13 && addr[13:3] !== 0 && check_strict_mrbits) begin + $display ("%m: at time %t ERROR: %s %d Illegal value. Reserved address bits must be programmed to zero", $time, cmd_string[cmd], bank); + end + end + endcase + if (dyn_odt_en && write_levelization) + $display ("%m: at time %t ERROR: Dynamic ODT is not available during Write Leveling mode.", $time); + init_mode_reg[bank] = 1; + mode_reg[bank] = addr; + // dll_reset bit self clear + if(bank==0 && addr[8]==1'b1) + mode_reg[0][8] <= #($rtoi(tck_avg)) 1'b0; + tm_load_mode <= $time; + ck_load_mode <= ck_cntr; + end + end + REFRESH : begin + if (mpr_en) begin + $display ("%m: at time %t ERROR: %s Failure. Multipurpose Register must be disabled.", $time, cmd_string[cmd]); + if (STOP_ON_ERROR) $stop(0); + end else if (|active_bank) begin + $display ("%m: at time %t ERROR: %s Failure. All banks must be Precharged.", $time, cmd_string[cmd]); + if (STOP_ON_ERROR) $stop(0); + end else begin + if (DEBUG) $display ("%m: at time %t INFO: %s", $time, cmd_string[cmd]); + er_trfc_max = 0; + ref_cntr = ref_cntr + 1; + tm_refresh <= $time; + ck_refresh <= ck_cntr; + end + end + PRECHARGE : begin + if (addr[AP]) begin + if (DEBUG) $display ("%m: at time %t INFO: %s All", $time, cmd_string[cmd]); + end + // PRECHARGE command will be treated as a NOP if there is no open row in that bank (idle state), + // or if the previously open row is already in the process of precharging + if (|active_bank) begin + if (($time - tm_txpr < TXPR) || (ck_cntr - ck_txpr < TXPR_TCK)) + $display ("%m: at time %t ERROR: tXPR violation during %s", $time, cmd_string[cmd]); + if (mpr_en) begin + $display ("%m: at time %t ERROR: %s Failure. Multipurpose Register must be disabled.", $time, cmd_string[cmd]); + if (STOP_ON_ERROR) $stop(0); + end else begin + for (i=0; i<`BANKS; i=i+1) begin + if (active_bank[i]) begin + if (addr[AP] || (i == bank)) begin + + for (j=0; j<=SELF_REF; j=j+1) begin + chk_err(SAME_BANK, i, j, cmd); + chk_err(DIFF_BANK, i, j, cmd); + end + + if (auto_precharge_bank[i]) begin + $display ("%m: at time %t ERROR: %s Failure. Auto Precharge is scheduled to bank %d.", $time, cmd_string[cmd], i); + if (STOP_ON_ERROR) $stop(0); + end else begin + if (DEBUG) $display ("%m: at time %t INFO: %s bank %d", $time, cmd_string[cmd], i); + active_bank[i] = 1'b0; + tm_bank_precharge[i] <= $time; + tm_precharge <= $time; + ck_precharge <= ck_cntr; + end + end + end + end + end + end // if (|active_bank) + else begin + chk_err(DIFF_BANK, 0, REFRESH, PRECHARGE); + end + end + ACTIVATE : begin + tfaw_cntr = 0; + for (i=0; i<`BANKS; i=i+1) begin + if ($time - tm_bank_activate[i] < TFAW) begin + tfaw_cntr = tfaw_cntr + 1; + end + end + if (tfaw_cntr > 3) begin + $display ("%m: at time %t ERROR: tFAW violation during %s to bank %d", $time, cmd_string[cmd], bank); + end + + if (mpr_en) begin + $display ("%m: at time %t ERROR: %s Failure. Multipurpose Register must be disabled.", $time, cmd_string[cmd]); + if (STOP_ON_ERROR) $stop(0); + end else if (!init_done) begin + $display ("%m: at time %t ERROR: %s Failure. Initialization sequence is not complete.", $time, cmd_string[cmd]); + if (STOP_ON_ERROR) $stop(0); + end else if (active_bank[bank]) begin + $display ("%m: at time %t ERROR: %s Failure. Bank %d must be Precharged.", $time, cmd_string[cmd], bank); + if (STOP_ON_ERROR) $stop(0); + end else begin + if (addr >= 1< AP +`else + col = {addr[BC-1:AP+1], addr[AP-1:0]}; // assume BC > AP +`endif + if (col >= 1< AP +`else + col = {addr[BC-1:AP+1], addr[AP-1:0]}; // assume BC > AP +`endif + if (col >= 1< TPD_MAX) + $display ("%m: at time %t ERROR: tPD maximum violation during Power Down Exit", $time); + if (DEBUG) $display ("%m: at time %t INFO: Power Down Exit", $time); + in_power_down = 0; + if ((active_bank == 0) && low_power) begin // precharge power down with dll off + if (ck_cntr - ck_odt < write_latency - 1) + $display ("%m: at time %t WARNING: tANPD violation during Power Down Exit. Synchronous or asynchronous change in termination resistance is possible.", $time); + tm_slow_exit_pd <= $time; + ck_slow_exit_pd <= ck_cntr; + end + tm_power_down <= $time; + ck_power_down <= ck_cntr; + end + if (in_self_refresh) begin + if (($time - tm_freq_change < TCKSRX) || (ck_cntr - ck_freq_change < TCKSRX_TCK)) + $display ("%m: at time %t ERROR: tCKSRX violation during Self Refresh Exit", $time); + if (ck_cntr - ck_cke_cmd < TCKESR_TCK) + $display ("%m: at time %t ERROR: tCKESR violation during Self Refresh Exit", $time); + if ($time - tm_cke < TISXR) + $display ("%m: at time %t ERROR: tISXR violation during Self Refresh Exit", $time); + if (DEBUG) $display ("%m: at time %t INFO: Self Refresh Exit", $time); + in_self_refresh = 0; + ck_dll_reset <= ck_cntr; + ck_self_refresh <= ck_cntr; + tm_self_refresh <= $time; + tm_refresh <= $time; + end + end + endcase + if ((prev_cke !== 1) && (cmd !== NOP)) begin + $display ("%m: at time %t ERROR: NOP or Deselect is required when CKE goes active.", $time); + end + + if (!init_done) begin + case (init_step) + 0 : begin + if ($time - tm_rst_n < 500000000 && check_strict_timing) + $display ("%m at time %t WARNING: 500 us is required after RST_N goes inactive before CKE goes active.", $time); + tm_txpr <= $time; + ck_txpr <= ck_cntr; + init_step = init_step + 1; + end + 1 : begin + if (dll_en) init_step = init_step + 1; + end + 2 : begin + if (&init_mode_reg && init_dll_reset && zq_set) begin + if (DEBUG) $display ("%m: at time %t INFO: Initialization Sequence is complete", $time); + init_done = 1; + end + end + endcase + end + end else if (prev_cke) begin + if ((!init_done) && (init_step > 1)) begin + $display ("%m: at time %t ERROR: CKE must remain active until the initialization sequence is complete.", $time); + if (STOP_ON_ERROR) $stop(0); + end + case (cmd) + REFRESH : begin + if ($time - tm_txpr < TXPR) + $display ("%m: at time %t ERROR: tXPR violation during %s", $time, cmd_string[SELF_REF]); + for (j=0; j<=SELF_REF; j=j+1) begin + chk_err(DIFF_BANK, bank, j, SELF_REF); + end + + if (mpr_en) begin + $display ("%m: at time %t ERROR: Self Refresh Failure. Multipurpose Register must be disabled.", $time); + if (STOP_ON_ERROR) $stop(0); + end else if (|active_bank) begin + $display ("%m: at time %t ERROR: Self Refresh Failure. All banks must be Precharged.", $time); + if (STOP_ON_ERROR) $stop(0); + end else if (odt_state) begin + $display ("%m: at time %t ERROR: Self Refresh Failure. ODT must be off prior to entering Self Refresh", $time); + if (STOP_ON_ERROR) $stop(0); + end else if (!init_done) begin + $display ("%m: at time %t ERROR: Self Refresh Failure. Initialization sequence is not complete.", $time); + if (STOP_ON_ERROR) $stop(0); + end else begin + if (DEBUG) $display ("%m: at time %t INFO: Self Refresh Enter", $time); + if (feature_pasr) + // Partial Array Self Refresh + case (pasr) + 3'b000 : ;//keep Bank 0-7 + 3'b001 : begin if (DEBUG) $display("%m: at time %t INFO: Banks 4-7 will be lost due to Partial Array Self Refresh", $time); erase_banks(8'hF0); end + 3'b010 : begin if (DEBUG) $display("%m: at time %t INFO: Banks 2-7 will be lost due to Partial Array Self Refresh", $time); erase_banks(8'hFC); end + 3'b011 : begin if (DEBUG) $display("%m: at time %t INFO: Banks 1-7 will be lost due to Partial Array Self Refresh", $time); erase_banks(8'hFE); end + 3'b100 : begin if (DEBUG) $display("%m: at time %t INFO: Banks 0-1 will be lost due to Partial Array Self Refresh", $time); erase_banks(8'h03); end + 3'b101 : begin if (DEBUG) $display("%m: at time %t INFO: Banks 0-3 will be lost due to Partial Array Self Refresh", $time); erase_banks(8'h0F); end + 3'b110 : begin if (DEBUG) $display("%m: at time %t INFO: Banks 0-5 will be lost due to Partial Array Self Refresh", $time); erase_banks(8'h3F); end + 3'b111 : begin if (DEBUG) $display("%m: at time %t INFO: Banks 0-6 will be lost due to Partial Array Self Refresh", $time); erase_banks(8'h7F); end + endcase + in_self_refresh = 1; + dll_locked = 0; + end + end + NOP : begin + // entering precharge power down with dll off and tANPD has not been satisfied + if (low_power && (active_bank == 0) && |odt_pipeline) + $display ("%m: at time %t WARNING: tANPD violation during %s. Synchronous or asynchronous change in termination resistance is possible.", $time, cmd_string[PWR_DOWN]); + if ($time - tm_txpr < TXPR) + $display ("%m: at time %t ERROR: tXPR violation during %s", $time, cmd_string[PWR_DOWN]); + for (j=0; j<=SELF_REF; j=j+1) begin + chk_err(DIFF_BANK, bank, j, PWR_DOWN); + end + + if (mpr_en) begin + $display ("%m: at time %t ERROR: Power Down Failure. Multipurpose Register must be disabled.", $time); + if (STOP_ON_ERROR) $stop(0); + end else if (!init_done) begin + $display ("%m: at time %t ERROR: Power Down Failure. Initialization sequence is not complete.", $time); + if (STOP_ON_ERROR) $stop(0); + end else begin + if (DEBUG) begin + if (|active_bank) begin + $display ("%m: at time %t INFO: Active Power Down Enter", $time); + end else begin + $display ("%m: at time %t INFO: Precharge Power Down Enter", $time); + end + end + in_power_down = 1; + end + end + default : begin + $display ("%m: at time %t ERROR: NOP, Deselect, or Refresh is required when CKE goes inactive.", $time); + end + endcase + end else if (in_self_refresh || in_power_down) begin + if ((ck_cntr - ck_cke_cmd <= TCPDED) && (cmd !== NOP)) + $display ("%m: at time %t ERROR: tCPDED violation during Power Down or Self Refresh Entry. NOP or Deselect is required.", $time); + end + prev_cke = cke; + + end + endtask + + task data_task; + reg [BA_BITS-1:0] bank; + reg [ROW_BITS-1:0] row; + reg [COL_BITS-1:0] col; + integer i; + integer j; + begin + + if (diff_ck) begin + for (i=0; i<64; i=i+1) begin + if (dq_in_valid && dll_locked && ($time - tm_dqs_neg[i] < $rtoi(TDSS*tck_avg))) + $display ("%m: at time %t ERROR: tDSS violation on %s bit %d", $time, dqs_string[i/32], i%32); + if (check_write_dqs_high[i]) + $display ("%m: at time %t ERROR: %s bit %d latching edge required during the preceding clock period.", $time, dqs_string[i/32], i%32); + end + check_write_dqs_high <= 0; + end else begin + for (i=0; i<64; i=i+1) begin + if (dll_locked && dq_in_valid) begin + tm_tdqss = abs_value(1.0*tm_ck_pos - tm_dqss_pos[i]); + if ((tm_tdqss < tck_avg/2.0) && (tm_tdqss > TDQSS*tck_avg)) + $display ("%m: at time %t ERROR: tDQSS violation on %s bit %d", $time, dqs_string[i/32], i%32); + end + if (check_write_dqs_low[i]) + $display ("%m: at time %t ERROR: %s bit %d latching edge required during the preceding clock period", $time, dqs_string[i/32], i%32); + end + check_write_preamble <= 0; + check_write_postamble <= 0; + check_write_dqs_low <= 0; + end + + if (wr_pipeline[0] || rd_pipeline[0]) begin + bank = ba_pipeline[0]; + row = row_pipeline[0]; + col = col_pipeline[0]; + burst_cntr = 0; + memory_read(bank, row, col, memory_data); + end + + // burst counter + if (burst_cntr < burst_length) begin + burst_position = col ^ burst_cntr; + if (!burst_order) begin + burst_position[BO_BITS-1:0] = col + burst_cntr; + end + burst_cntr = burst_cntr + 1; + end + + // write dqs counter + if (wr_pipeline[WDQS_PRE + 1]) begin + wdqs_cntr = WDQS_PRE + bl_pipeline[WDQS_PRE + 1] + WDQS_PST - 1; + end + // write dqs + if ((wr_pipeline[2]) && (wdq_cntr == 0)) begin //write preamble + check_write_preamble <= ({DQS_BITS{1'b1}}<<32) | {DQS_BITS{1'b1}}; + end + if (wdqs_cntr > 1) begin // write data + if ((wdqs_cntr - WDQS_PST)%2) begin + check_write_dqs_high <= ({DQS_BITS{1'b1}}<<32) | {DQS_BITS{1'b1}}; + end else begin + check_write_dqs_low <= ({DQS_BITS{1'b1}}<<32) | {DQS_BITS{1'b1}}; + end + end + if (wdqs_cntr == WDQS_PST) begin // write postamble + check_write_postamble <= ({DQS_BITS{1'b1}}<<32) | {DQS_BITS{1'b1}}; + end + if (wdqs_cntr > 0) begin + wdqs_cntr = wdqs_cntr - 1; + end + + // write dq + if (dq_in_valid) begin // write data + bit_mask = 0; + if (diff_ck) begin + for (i=0; i>(burst_position*DQ_BITS); + if (DEBUG) $display ("%m: at time %t INFO: WRITE @ DQS= bank = %h row = %h col = %h data = %h",$time, bank, row, (-1*BL_MAX & col) + burst_position, dq_temp); + if (burst_cntr%BL_MIN == 0) begin + memory_write(bank, row, col, memory_data); + end + end + if (wr_pipeline[1]) begin + wdq_cntr = bl_pipeline[1]; + end + if (wdq_cntr > 0) begin + wdq_cntr = wdq_cntr - 1; + dq_in_valid = 1'b1; + end else begin + dq_in_valid = 1'b0; + dqs_in_valid <= 1'b0; + for (i=0; i<63; i=i+1) begin + wdqs_pos_cntr[i] <= 0; + end + end + if (wr_pipeline[0]) begin + b2b_write <= 1'b0; + end + if (wr_pipeline[2]) begin + if (dqs_in_valid) begin + b2b_write <= 1'b1; + end + dqs_in_valid <= 1'b1; + wr_burst_length = bl_pipeline[2]; + end + + // read dqs enable counter + if (rd_pipeline[RDQSEN_PRE]) begin + rdqsen_cntr = RDQSEN_PRE + bl_pipeline[RDQSEN_PRE] + RDQSEN_PST - 1; + end + if (rdqsen_cntr > 0) begin + rdqsen_cntr = rdqsen_cntr - 1; + dqs_out_en = 1'b1; + end else begin + dqs_out_en = 1'b0; + end + + // read dqs counter + if (rd_pipeline[RDQS_PRE]) begin + rdqs_cntr = RDQS_PRE + bl_pipeline[RDQS_PRE] + RDQS_PST - 1; + end + // read dqs + if (((rd_pipeline>>1 & {RDQS_PRE{1'b1}}) > 0) && (rdq_cntr == 0)) begin //read preamble + dqs_out = 1'b0; + end else if (rdqs_cntr > RDQS_PST) begin // read data + dqs_out = rdqs_cntr - RDQS_PST; + end else if (rdqs_cntr > 0) begin // read postamble + dqs_out = 1'b0; + end else begin + dqs_out = 1'b1; + end + if (rdqs_cntr > 0) begin + rdqs_cntr = rdqs_cntr - 1; + end + + // read dq enable counter + if (rd_pipeline[RDQEN_PRE]) begin + rdqen_cntr = RDQEN_PRE + bl_pipeline[RDQEN_PRE] + RDQEN_PST; + end + if (rdqen_cntr > 0) begin + rdqen_cntr = rdqen_cntr - 1; + dq_out_en = 1'b1; + end else begin + dq_out_en = 1'b0; + end + // read dq + if (rd_pipeline[0]) begin + rdq_cntr = bl_pipeline[0]; + end + if (rdq_cntr > 0) begin // read data + if (mpr_en) begin +`ifdef MPR_DQ0 // DQ0 output MPR data, other DQ low + if (mpr_select == 2'b00) begin // Calibration Pattern + dq_temp = {DQS_BITS{{`DQ_PER_DQS-1{1'b0}}, calibration_pattern[burst_position]}}; + end else if (odts_readout && (mpr_select == 2'b11)) begin // Temp Sensor (ODTS) + dq_temp = {DQS_BITS{{`DQ_PER_DQS-1{1'b0}}, temp_sensor[burst_position]}}; + end else begin // Reserved + dq_temp = {DQS_BITS{{`DQ_PER_DQS-1{1'b0}}, 1'bx}}; + end +`else // all DQ output MPR data + if (mpr_select == 2'b00) begin // Calibration Pattern + dq_temp = {DQS_BITS{{`DQ_PER_DQS{calibration_pattern[burst_position]}}}}; + end else if (odts_readout && (mpr_select == 2'b11)) begin // Temp Sensor (ODTS) + dq_temp = {DQS_BITS{{`DQ_PER_DQS{temp_sensor[burst_position]}}}}; + end else begin // Reserved + dq_temp = {DQS_BITS{{`DQ_PER_DQS{1'bx}}}}; + end +`endif + if (DEBUG) $display ("%m: at time %t READ @ DQS MultiPurpose Register %d, col = %d, data = %b", $time, mpr_select, burst_position, dq_temp[0]); + end else begin + dq_temp = memory_data>>(burst_position*DQ_BITS); + if (DEBUG) $display ("%m: at time %t INFO: READ @ DQS= bank = %h row = %h col = %h data = %h",$time, bank, row, (-1*BL_MAX & col) + burst_position, dq_temp); + end + dq_out = dq_temp; + rdq_cntr = rdq_cntr - 1; + end else begin + dq_out = {DQ_BITS{1'b1}}; + end + + // delay signals prior to output + if (RANDOM_OUT_DELAY && (dqs_out_en || (|dqs_out_en_dly) || dq_out_en || (|dq_out_en_dly))) begin + for (i=0; i dqsck[i] + TQH*tck_avg + TDQSQ) begin + dqsck_max = dqsck[i] + TQH*tck_avg + TDQSQ; + end + dqsck_min = -1*TDQSCK; + if (dqsck_min < dqsck[i] - TQH*tck_avg - TDQSQ) begin + dqsck_min = dqsck[i] - TQH*tck_avg - TDQSQ; + end + + // DQSQ requirements + // 1.) less than tDQSQ + // 2.) greater than 0 + // 3.) greater than tQH from the previous DQS edge + dqsq_min = 0; + if (dqsq_min < dqsck[i] - TQH*tck_avg) begin + dqsq_min = dqsck[i] - TQH*tck_avg; + end + if (dqsck_min == dqsck_max) begin + dqsck[i] = dqsck_min; + end else begin + dqsck[i] = $dist_uniform(seed, dqsck_min, dqsck_max); + end + dqsq_max = TDQSQ + dqsck[i]; + + dqs_out_en_dly[i] <= #(tck_avg/2) dqs_out_en; + dqs_out_dly[i] <= #(tck_avg/2 + dqsck[i]) dqs_out; + if (!write_levelization) begin + for (j=0; j<`DQ_PER_DQS; j=j+1) begin + dq_out_en_dly[i*`DQ_PER_DQS + j] <= #(tck_avg/2) dq_out_en; + if (dqsq_min == dqsq_max) begin + dq_out_dly [i*`DQ_PER_DQS + j] <= #(tck_avg/2 + dqsq_min) dq_out[i*`DQ_PER_DQS + j]; + end else begin + dq_out_dly [i*`DQ_PER_DQS + j] <= #(tck_avg/2 + $dist_uniform(seed, dqsq_min, dqsq_max)) dq_out[i*`DQ_PER_DQS + j]; + end + end + end + end + end else begin + if (dll_en) + if(diff_ck) + out_delay = ($rtoi(tch_avg) > 50000) ? 0 : $rtoi(tch_avg); + else + out_delay = ($rtoi(tcl_avg) > 50000) ? 0 : $rtoi(tcl_avg); + else + if(diff_ck) + out_delay = ($rtoi(tch_avg) > 50000) ? 0 : $rtoi(tch_avg) + TDQSCK_DLLDIS; + else + out_delay = ($rtoi(tcl_avg) > 50000) ? 0 : $rtoi(tcl_avg) + TDQSCK_DLLDIS; + dqs_out_en_dly <= #(out_delay) {DQS_BITS{dqs_out_en}}; + dqs_out_dly <= #(out_delay) {DQS_BITS{dqs_out }}; + if (write_levelization !== 1'b1) begin + dq_out_en_dly <= #(out_delay) {DQ_BITS {dq_out_en }}; + dq_out_dly <= #(out_delay) {DQ_BITS {dq_out }}; + end + end + end + endtask + + always @ (posedge rst_n_in) begin : reset + integer i; + if (rst_n_in) begin + if ($time < 200000000 && check_strict_timing) + $display ("%m at time %t WARNING: 200 us is required before RST_N goes inactive.", $time); + if (cke_in !== 1'b0) + $display ("%m: at time %t ERROR: CKE must be inactive when RST_N goes inactive.", $time); + if ($time - tm_cke < 10000) + $display ("%m: at time %t ERROR: CKE must be maintained inactive for 10 ns before RST_N goes inactive.", $time); + + // clear memory +`ifdef MAX_MEM + // verification group does not erase memory + // for (banki = 0; banki < `BANKS; banki = banki + 1) begin + // $fclose(memfd[banki]); + // memfd[banki] = open_bank_file(banki); + // end +`else + memory_used <= 0; //erase memory +`endif + + end + end + + always @(negedge rst_n_in or posedge diff_ck or negedge diff_ck) begin : main + integer i; + if (!rst_n_in) begin + reset_task; + end else begin + if (!in_self_refresh && (diff_ck !== 1'b0) && (diff_ck !== 1'b1)) + $display ("%m: at time %t ERROR: CK and CK_N are not allowed to go to an unknown state.", $time); + data_task; + + // Clock Frequency Change is legal: + // 1.) During Self Refresh + // 2.) During Precharge Power Down (DLL on or off) + if (in_self_refresh || (in_power_down && (active_bank == 0))) begin + if (diff_ck) begin + tjit_per_rtime = $time - tm_ck_pos - tck_avg; + end else begin + tjit_per_rtime = $time - tm_ck_neg - tck_avg; + end + if (dll_locked && (abs_value(tjit_per_rtime) > TJIT_PER)) begin + if ((tm_ck_pos - tm_cke_cmd < TCKSRE) || (ck_cntr - ck_cke_cmd < TCKSRE_TCK)) + $display ("%m: at time %t ERROR: tCKSRE violation during Self Refresh or Precharge Power Down Entry", $time); + if (odt_state) begin + $display ("%m: at time %t ERROR: Clock Frequency Change Failure. ODT must be off prior to Clock Frequency Change.", $time); + if (STOP_ON_ERROR) $stop(0); + end else begin + if (DEBUG) $display ("%m: at time %t INFO: Clock Frequency Change detected. DLL Reset is Required.", $time); + tm_freq_change <= $time; + ck_freq_change <= ck_cntr; + dll_locked = 0; + end + end + end + + if (diff_ck) begin + // check setup of command signals + if ($time > TIS) begin + if ($time - tm_cke < TIS) + $display ("%m: at time %t ERROR: tIS violation on CKE by %t", $time, tm_cke + TIS - $time); + if (cke_in) begin + for (i=0; i<23; i=i+1) begin + if ($time - tm_cmd_addr[i] < TIS) + $display ("%m: at time %t ERROR: tIS violation on %s by %t", $time, cmd_addr_string[i], tm_cmd_addr[i] + TIS - $time); + end + end + end + + // update current state + if (dll_locked) begin + if (mr_chk == 0) begin + mr_chk = 1; + end else if (init_mode_reg[0] && (mr_chk == 1)) begin + // check CL value against the clock frequency + // check WR value against the clock frequency + if (ceil(write_recovery*tck_avg) < TWR) + $display ("%m: at time %t ERROR: Write Recovery = %d is illegal @tCK(avg) = %f", $time, write_recovery, tck_avg); + // check the CWL value against the clock frequency + if (check_strict_timing) begin + case (cas_write_latency) + 5 : if (tck_avg < 2500.0) $display ("%m: at time %t ERROR: CWL = %d is illegal @tCK(avg) = %f", $time, cas_write_latency, tck_avg); + 6 : if ((tck_avg < 1875.0) || (tck_avg >= 2500.0)) $display ("%m: at time %t ERROR: CWL = %d is illegal @tCK(avg) = %f", $time, cas_write_latency, tck_avg); + 7 : if ((tck_avg < 1500.0) || (tck_avg >= 1875.0)) $display ("%m: at time %t ERROR: CWL = %d is illegal @tCK(avg) = %f", $time, cas_write_latency, tck_avg); + 8 : if ((tck_avg < 1250.0) || (tck_avg >= 1500.0)) $display ("%m: at time %t ERROR: CWL = %d is illegal @tCK(avg) = %f", $time, cas_write_latency, tck_avg); + 9 : if ((tck_avg < 15e3/14) || (tck_avg >= 1250.0)) $display ("%m: at time %t ERROR: CWL = %d is illegal @tCK(avg) = %f", $time, cas_write_latency, tck_avg); + 10: if ((tck_avg < 937.5) || (tck_avg >= 15e3/14)) $display ("%m: at time %t ERROR: CWL = %d is illegal @tCK(avg) = %f", $time, cas_write_latency, tck_avg); + default : $display ("%m: at time %t ERROR: CWL = %d is illegal @tCK(avg) = %f", $time, cas_write_latency, tck_avg); + endcase + // check the CL value against the clock frequency + if (!valid_cl(cas_latency, cas_write_latency)) + $display ("%m: at time %t ERROR: CAS Latency = %d is not valid when CAS Write Latency = %d", $time, cas_latency, cas_write_latency); + end + mr_chk = 2; + end + end else if (!in_self_refresh) begin + mr_chk = 0; + if (ck_cntr - ck_dll_reset == TDLLK) begin + dll_locked = 1; + end + end + + if (|auto_precharge_bank) begin + for (i=0; i<`BANKS; i=i+1) begin + // Write with Auto Precharge Calculation + // 1. Meet minimum tRAS requirement + // 2. Write Latency PLUS BL/2 cycles PLUS WR after Write command + if (write_precharge_bank[i]) begin + if ($time - tm_bank_activate[i] >= TRAS_MIN) begin + if (ck_cntr - ck_bank_write[i] >= write_latency + burst_length/2 + write_recovery) begin + if (DEBUG) $display ("%m: at time %t INFO: Auto Precharge bank %d", $time, i); + write_precharge_bank[i] = 0; + active_bank[i] = 0; + auto_precharge_bank[i] = 0; + tm_bank_precharge[i] = $time; + tm_precharge = $time; + ck_precharge = ck_cntr; + end + end + end + // Read with Auto Precharge Calculation + // 1. Meet minimum tRAS requirement + // 2. Additive Latency plus 4 cycles after Read command + // 3. tRTP after the last 8-bit prefetch + if (read_precharge_bank[i]) begin + if (($time - tm_bank_activate[i] >= TRAS_MIN) && (ck_cntr - ck_bank_read[i] >= additive_latency + TRTP_TCK)) begin + read_precharge_bank[i] = 0; + // In case the internal precharge is pushed out by tRTP, tRP starts at the point where + // the internal precharge happens (not at the next rising clock edge after this event). + if ($time - tm_bank_read_end[i] < TRTP) begin + if (DEBUG) $display ("%m: at time %t INFO: Auto Precharge bank %d", tm_bank_read_end[i] + TRTP, i); + active_bank[i] <= #(tm_bank_read_end[i] + TRTP - $time) 0; + auto_precharge_bank[i] <= #(tm_bank_read_end[i] + TRTP - $time) 0; + tm_bank_precharge[i] <= #(tm_bank_read_end[i] + TRTP - $time) tm_bank_read_end[i] + TRTP; + tm_precharge <= #(tm_bank_read_end[i] + TRTP - $time) tm_bank_read_end[i] + TRTP; + ck_precharge = ck_cntr; + end else begin + if (DEBUG) $display ("%m: at time %t INFO: Auto Precharge bank %d", $time, i); + active_bank[i] = 0; + auto_precharge_bank[i] = 0; + tm_bank_precharge[i] = $time; + tm_precharge = $time; + ck_precharge = ck_cntr; + end + end + end + end + end + + + // respond to incoming command + if (cke_in ^ prev_cke) begin + tm_cke_cmd <= $time; + ck_cke_cmd <= ck_cntr; + end + + + cmd_task(prev_cke, cke_in, cmd_n_in, ba_in, addr_in); + if ((cmd_n_in == WRITE) || (cmd_n_in == READ)) begin + al_pipeline[2*additive_latency] = 1'b1; + end + if (al_pipeline[0]) begin + // check tRCD after additive latency + if ((rd_pipeline[2*cas_latency - 1]) && ($time - tm_bank_activate[ba_pipeline[2*cas_latency - 1]] < TRCD)) + $display ("%m: at time %t ERROR: tRCD violation during %s", $time, cmd_string[READ]); + if ((wr_pipeline[2*cas_write_latency + 1]) && ($time - tm_bank_activate[ba_pipeline[2*cas_write_latency + 1]] < TRCD)) + $display ("%m: at time %t ERROR: tRCD violation during %s", $time, cmd_string[WRITE]); + // check tWTR after additive latency + if (rd_pipeline[2*cas_latency - 1]) begin //{ + if (truebl4) begin //{ + i = ba_pipeline[2*cas_latency - 1]; + if ($time - tm_group_write_end[i[1]] < TWTR) + $display ("%m: at time %t ERROR: tWTR violation during %s", $time, cmd_string[READ]); + if ($time - tm_write_end < TWTR_DG) + $display ("%m: at time %t ERROR: tWTR_DG violation during %s", $time, cmd_string[READ]); + end else begin + if ($time - tm_write_end < TWTR) + $display ("%m: at time %t ERROR: tWTR violation during %s", $time, cmd_string[READ]); + end + end + end + if (rd_pipeline) begin + if (rd_pipeline[2*cas_latency - 1]) begin + tm_bank_read_end[ba_pipeline[2*cas_latency - 1]] <= $time; + end + end + for (i=0; i<`BANKS; i=i+1) begin + if ((ck_cntr - ck_bank_write[i] > write_latency) && (ck_cntr - ck_bank_write[i] <= write_latency + burst_length/2)) begin + tm_bank_write_end[i] <= $time; + tm_group_write_end[i[1]] <= $time; + tm_write_end <= $time; + end + end + + // clk pin is disabled during self refresh + if (!in_self_refresh && tm_ck_pos ) begin + tjit_cc_time = $time - tm_ck_pos - tck_i; + tck_i = $time - tm_ck_pos; + tck_avg = tck_avg - tck_sample[ck_cntr%PERTCKAVG]/$itor(PERTCKAVG); + tck_avg = tck_avg + tck_i/$itor(PERTCKAVG); + tck_sample[ck_cntr%PERTCKAVG] = tck_i; + tjit_per_rtime = tck_i - tck_avg; + + if (dll_locked && check_strict_timing) begin + // check accumulated error + terr_nper_rtime = 0; + for (i=0; i<12; i=i+1) begin + terr_nper_rtime = terr_nper_rtime + tck_sample[i] - tck_avg; + terr_nper_rtime = abs_value(terr_nper_rtime); + case (i) + 0 :; + 1 : if (terr_nper_rtime - TERR_2PER >= 1.0) $display ("%m: at time %t ERROR: tERR(2per) violation by %f ps.", $time, terr_nper_rtime - TERR_2PER); + 2 : if (terr_nper_rtime - TERR_3PER >= 1.0) $display ("%m: at time %t ERROR: tERR(3per) violation by %f ps.", $time, terr_nper_rtime - TERR_3PER); + 3 : if (terr_nper_rtime - TERR_4PER >= 1.0) $display ("%m: at time %t ERROR: tERR(4per) violation by %f ps.", $time, terr_nper_rtime - TERR_4PER); + 4 : if (terr_nper_rtime - TERR_5PER >= 1.0) $display ("%m: at time %t ERROR: tERR(5per) violation by %f ps.", $time, terr_nper_rtime - TERR_5PER); + 5 : if (terr_nper_rtime - TERR_6PER >= 1.0) $display ("%m: at time %t ERROR: tERR(6per) violation by %f ps.", $time, terr_nper_rtime - TERR_6PER); + 6 : if (terr_nper_rtime - TERR_7PER >= 1.0) $display ("%m: at time %t ERROR: tERR(7per) violation by %f ps.", $time, terr_nper_rtime - TERR_7PER); + 7 : if (terr_nper_rtime - TERR_8PER >= 1.0) $display ("%m: at time %t ERROR: tERR(8per) violation by %f ps.", $time, terr_nper_rtime - TERR_8PER); + 8 : if (terr_nper_rtime - TERR_9PER >= 1.0) $display ("%m: at time %t ERROR: tERR(9per) violation by %f ps.", $time, terr_nper_rtime - TERR_9PER); + 9 : if (terr_nper_rtime - TERR_10PER >= 1.0) $display ("%m: at time %t ERROR: tERR(10per) violation by %f ps.", $time, terr_nper_rtime - TERR_10PER); + 10 : if (terr_nper_rtime - TERR_11PER >= 1.0) $display ("%m: at time %t ERROR: tERR(11per) violation by %f ps.", $time, terr_nper_rtime - TERR_11PER); + 11 : if (terr_nper_rtime - TERR_12PER >= 1.0) $display ("%m: at time %t ERROR: tERR(12per) violation by %f ps.", $time, terr_nper_rtime - TERR_12PER); + endcase + end + + // check tCK min/max/jitter + if (abs_value(tjit_per_rtime) - TJIT_PER >= 1.0) + $display ("%m: at time %t ERROR: tJIT(per) violation by %f ps.", $time, abs_value(tjit_per_rtime) - TJIT_PER); + if (abs_value(tjit_cc_time) - TJIT_CC >= 1.0) + $display ("%m: at time %t ERROR: tJIT(cc) violation by %f ps.", $time, abs_value(tjit_cc_time) - TJIT_CC); + if (TCK_MIN - tck_avg >= 1.0) + $display ("%m: at time %t ERROR: tCK(avg) minimum violation by %f ps.", $time, TCK_MIN - tck_avg); + if (tck_avg - TCK_MAX >= 1.0) + $display ("%m: at time %t ERROR: tCK(avg) maximum violation by %f ps.", $time, tck_avg - TCK_MAX); + + // check tCL + if (tm_ck_neg - $time < TCL_ABS_MIN*tck_avg) + $display ("%m: at time %t ERROR: tCL(abs) minimum violation on CLK by %t", $time, TCL_ABS_MIN*tck_avg - tm_ck_neg + $time); + if (tcl_avg < TCL_AVG_MIN*tck_avg) + $display ("%m: at time %t ERROR: tCL(avg) minimum violation on CLK by %t", $time, TCL_AVG_MIN*tck_avg - tcl_avg); + if (tcl_avg > TCL_AVG_MAX*tck_avg) + $display ("%m: at time %t ERROR: tCL(avg) maximum violation on CLK by %t", $time, tcl_avg - TCL_AVG_MAX*tck_avg); + end + + // calculate the tch avg jitter + tch_avg = tch_avg - tch_sample[ck_cntr%PERTCKAVG]/$itor(PERTCKAVG); + tch_avg = tch_avg + tch_i/$itor(PERTCKAVG); + tch_sample[ck_cntr%PERTCKAVG] = tch_i; + tjit_ch_rtime = tch_i - tch_avg; + duty_cycle = $rtoi(tch_avg*100/tck_avg); + + // update timers/counters + tcl_i <= $time - tm_ck_neg; + end + + prev_odt <= odt_in; + // update timers/counters + ck_cntr <= ck_cntr + 1; + tm_ck_pos = $time; + end else begin + // clk pin is disabled during self refresh + if (!in_self_refresh) begin + if (dll_locked && check_strict_timing) begin + if ($time - tm_ck_pos < TCH_ABS_MIN*tck_avg) + $display ("%m: at time %t ERROR: tCH(abs) minimum violation on CLK by %t", $time, TCH_ABS_MIN*tck_avg - $time + tm_ck_pos); + if (tch_avg < TCH_AVG_MIN*tck_avg) + $display ("%m: at time %t ERROR: tCH(avg) minimum violation on CLK by %t", $time, TCH_AVG_MIN*tck_avg - tch_avg); + if (tch_avg > TCH_AVG_MAX*tck_avg) + $display ("%m: at time %t ERROR: tCH(avg) maximum violation on CLK by %t", $time, tch_avg - TCH_AVG_MAX*tck_avg); + end + + // calculate the tcl avg jitter + tcl_avg = tcl_avg - tcl_sample[ck_cntr%PERTCKAVG]/$itor(PERTCKAVG); + tcl_avg = tcl_avg + tcl_i/$itor(PERTCKAVG); + tcl_sample[ck_cntr%PERTCKAVG] = tcl_i; + + // update timers/counters + tch_i <= $time - tm_ck_pos; + end + tm_ck_neg = $time; + end + + // on die termination + if (odt_en || dyn_odt_en) begin + // odt pin is disabled during self refresh + if (!in_self_refresh && diff_ck) begin + if ($time - tm_odt < TIS) + $display ("%m: at time %t ERROR: tIS violation on ODT by %t", $time, tm_odt + TIS - $time); + if (prev_odt ^ odt_in) begin + if (!dll_locked) + $display ("%m: at time %t WARNING: tDLLK violation during ODT transition.", $time); + if (($time - tm_load_mode < TMOD) || (ck_cntr - ck_load_mode < TMOD_TCK)) + $display ("%m: at time %t ERROR: tMOD violation during ODT transition", $time); + if (ck_cntr - ck_zqinit < TZQINIT) + $display ("%m: at time %t ERROR: TZQinit violation during ODT transition", $time); + if (ck_cntr - ck_zqoper < TZQOPER) + $display ("%m: at time %t ERROR: TZQoper violation during ODT transition", $time); + if (ck_cntr - ck_zqcs < TZQCS) + $display ("%m: at time %t ERROR: tZQcs violation during ODT transition", $time); + // if (($time - tm_slow_exit_pd < TXPDLL) || (ck_cntr - ck_slow_exit_pd < TXPDLL_TCK)) + // $display ("%m: at time %t ERROR: tXPDLL violation during ODT transition", $time); + if (ck_cntr - ck_self_refresh < TXSDLL) + $display ("%m: at time %t ERROR: tXSDLL violation during ODT transition", $time); + if (in_self_refresh) + $display ("%m: at time %t ERROR: Illegal ODT transition during Self Refresh.", $time); + if (!odt_in && (ck_cntr - ck_odt < ODTH4)) + $display ("%m: at time %t ERROR: ODTH4 violation during ODT transition", $time); + if (!odt_in && (ck_cntr - ck_odth8 < ODTH8)) + $display ("%m: at time %t ERROR: ODTH8 violation during ODT transition", $time); + if (($time - tm_slow_exit_pd < TXPDLL) || (ck_cntr - ck_slow_exit_pd < TXPDLL_TCK)) + $display ("%m: at time %t WARNING: tXPDLL during ODT transition. Synchronous or asynchronous change in termination resistance is possible.", $time); + + // async ODT mode applies: + // 1.) during precharge power down with DLL off + // 2.) if tANPD has not been satisfied + // 3.) until tXPDLL has been satisfied + if ((in_power_down && low_power && (active_bank == 0)) || ($time - tm_slow_exit_pd < TXPDLL) || (ck_cntr - ck_slow_exit_pd < TXPDLL_TCK)) begin + odt_state = odt_in; + if (DEBUG && odt_en) $display ("%m: at time %t INFO: Async On Die Termination Rtt_NOM = %d Ohm", $time, {32{odt_state}} & get_rtt_nom(odt_rtt_nom)); + if (odt_state) begin + odt_state_dly <= #(TAONPD) odt_state; + end else begin + odt_state_dly <= #(TAOFPD) odt_state; + end + // sync ODT mode applies: + // 1.) during normal operation + // 2.) during active power down + // 3.) during precharge power down with DLL on + end else begin + odt_pipeline[2*(write_latency - 2)] = 1'b1; // ODTLon, ODTLoff + end + ck_odt <= ck_cntr; + end + end + if (odt_pipeline[0]) begin + odt_state = ~odt_state; + if (DEBUG && odt_en) $display ("%m: at time %t INFO: Sync On Die Termination Rtt_NOM = %d Ohm", $time, {32{odt_state}} & get_rtt_nom(odt_rtt_nom)); + if (odt_state) begin + odt_state_dly <= #(TAON) odt_state; + end else begin + odt_state_dly <= #(TAOF*tck_avg) odt_state; + end + end + if (rd_pipeline[RDQSEN_PRE]) begin + odt_cntr = 1 + RDQSEN_PRE + bl_pipeline[RDQSEN_PRE] + RDQSEN_PST - 1; + end + if (odt_cntr > 0) begin + if ((get_rtt_nom(odt_rtt_nom) > 0) && odt_state) begin + $display ("%m: at time %t ERROR: On Die Termination must be OFF during Read data transfer.", $time); + end + odt_cntr = odt_cntr - 1; + end + if (dyn_odt_en && ( odt_state || feature_odt_hi) ) begin + if (DEBUG && (dyn_odt_state ^ dyn_odt_pipeline[0])) + $display ("%m: at time %t INFO: Sync On Die Termination Rtt_WR = %d Ohm", $time, {32{dyn_odt_pipeline[0]}} & get_rtt_wr(odt_rtt_wr)); + dyn_odt_state = dyn_odt_pipeline[0]; + end + dyn_odt_state_dly <= #(TADC*tck_avg) dyn_odt_state; + end + + if (cke_in && write_levelization) begin + for (i=0; i>1; + wr_pipeline = wr_pipeline>>1; + rd_pipeline = rd_pipeline>>1; + for (i=0; i<`MAX_PIPE; i=i+1) begin + bl_pipeline[i] = bl_pipeline[i+1]; + ba_pipeline[i] = ba_pipeline[i+1]; + row_pipeline[i] = row_pipeline[i+1]; + col_pipeline[i] = col_pipeline[i+1]; + end + end + if (|odt_pipeline || |dyn_odt_pipeline) begin + odt_pipeline = odt_pipeline>>1; + dyn_odt_pipeline = dyn_odt_pipeline>>1; + end + end + end + + // receiver(s) + task dqs_even_receiver; + input [4:0] i; + reg [127:0] bit_mask; + begin + bit_mask = {`DQ_PER_DQS{1'b1}}<<(i*`DQ_PER_DQS); + if (dqs_even[i]) begin + if (tdqs_en) begin // tdqs disables dm + dm_in_pos[i] = 1'b0; + end else begin + dm_in_pos[i] = dm_in[i]; + end + dq_in_pos = (dq_in & bit_mask) | (dq_in_pos & ~bit_mask); + end + end + endtask + + always @(posedge dqs_even[ 0]) dqs_even_receiver( 0); + always @(posedge dqs_even[ 1]) dqs_even_receiver( 1); + always @(posedge dqs_even[ 2]) dqs_even_receiver( 2); + always @(posedge dqs_even[ 3]) dqs_even_receiver( 3); + always @(posedge dqs_even[ 4]) dqs_even_receiver( 4); + always @(posedge dqs_even[ 5]) dqs_even_receiver( 5); + always @(posedge dqs_even[ 6]) dqs_even_receiver( 6); + always @(posedge dqs_even[ 7]) dqs_even_receiver( 7); + always @(posedge dqs_even[ 8]) dqs_even_receiver( 8); + always @(posedge dqs_even[ 9]) dqs_even_receiver( 9); + always @(posedge dqs_even[10]) dqs_even_receiver(10); + always @(posedge dqs_even[11]) dqs_even_receiver(11); + always @(posedge dqs_even[12]) dqs_even_receiver(12); + always @(posedge dqs_even[13]) dqs_even_receiver(13); + always @(posedge dqs_even[14]) dqs_even_receiver(14); + always @(posedge dqs_even[15]) dqs_even_receiver(15); + + task dqs_odd_receiver; + input [4:0] i; + reg [127:0] bit_mask; + begin + bit_mask = {`DQ_PER_DQS{1'b1}}<<(i*`DQ_PER_DQS); + if (dqs_odd[i]) begin + if (tdqs_en) begin // tdqs disables dm + dm_in_neg[i] = 1'b0; + end else begin + dm_in_neg[i] = dm_in[i]; + end + dq_in_neg = (dq_in & bit_mask) | (dq_in_neg & ~bit_mask); + end + end + endtask + + always @(posedge dqs_odd[ 0]) dqs_odd_receiver( 0); + always @(posedge dqs_odd[ 1]) dqs_odd_receiver( 1); + always @(posedge dqs_odd[ 2]) dqs_odd_receiver( 2); + always @(posedge dqs_odd[ 3]) dqs_odd_receiver( 3); + always @(posedge dqs_odd[ 4]) dqs_odd_receiver( 4); + always @(posedge dqs_odd[ 5]) dqs_odd_receiver( 5); + always @(posedge dqs_odd[ 6]) dqs_odd_receiver( 6); + always @(posedge dqs_odd[ 7]) dqs_odd_receiver( 7); + always @(posedge dqs_odd[ 8]) dqs_odd_receiver( 8); + always @(posedge dqs_odd[ 9]) dqs_odd_receiver( 9); + always @(posedge dqs_odd[10]) dqs_odd_receiver(10); + always @(posedge dqs_odd[11]) dqs_odd_receiver(11); + always @(posedge dqs_odd[12]) dqs_odd_receiver(12); + always @(posedge dqs_odd[13]) dqs_odd_receiver(13); + always @(posedge dqs_odd[14]) dqs_odd_receiver(14); + always @(posedge dqs_odd[15]) dqs_odd_receiver(15); + + // Processes to check hold and pulse width of control signals + always @(posedge rst_n_in) begin + if ($time > 100000) begin + if (tm_rst_n + 100000 > $time) + $display ("%m: at time %t ERROR: RST_N pulse width violation by %t", $time, tm_rst_n + 100000 - $time); + end + tm_rst_n = $time; + end + always @(cke_in) begin + if (rst_n_in) begin + if ($time > TIH) begin + if ($time - tm_ck_pos < TIH) + $display ("%m: at time %t ERROR: tIH violation on CKE by %t", $time, tm_ck_pos + TIH - $time); + end + if ($time - tm_cke < TIPW) + $display ("%m: at time %t ERROR: tIPW violation on CKE by %t", $time, tm_cke + TIPW - $time); + end + tm_cke = $time; + end + always @(odt_in) begin + if (rst_n_in && odt_en && !in_self_refresh) begin + if ($time - tm_ck_pos < TIH) + $display ("%m: at time %t ERROR: tIH violation on ODT by %t", $time, tm_ck_pos + TIH - $time); + if ($time - tm_odt < TIPW) + $display ("%m: at time %t ERROR: tIPW violation on ODT by %t", $time, tm_odt + TIPW - $time); + end + tm_odt = $time; + end + + task cmd_addr_timing_check; + input i; + reg [4:0] i; + begin + if (rst_n_in && prev_cke) begin + if ((i == 0) && ($time - tm_ck_pos < TIH)) // always check tIH for CS# + $display ("%m: at time %t ERROR: tIH violation on %s by %t", $time, cmd_addr_string[i], tm_ck_pos + TIH - $time); + if ((i > 0) && (cs_n_in == 0) &&($time - tm_ck_pos < TIH)) // Only check tIH for cmd_addr if CS# is low + $display ("%m: at time %t ERROR: tIH violation on %s by %t", $time, cmd_addr_string[i], tm_ck_pos + TIH - $time); + if ((i == 0) && ($time - tm_cmd_addr[i] < TIPW)) // always check tIPW for CS# + $display ("%m: at time %t ERROR: tIPW violation on %s by %t", $time, cmd_addr_string[i], tm_cmd_addr[i] + TIPW - $time); + if ((i > 0) && (cs_n_in == 0) && ($time - tm_cmd_addr[i] < TIPW)) + $display ("%m: at time %t ERROR: tIPW violation on %s by %t", $time, cmd_addr_string[i], tm_cmd_addr[i] + TIPW - $time); + end + tm_cmd_addr[i] = $time; + end + endtask + + always @(cs_n_in ) cmd_addr_timing_check( 0); + always @(ras_n_in ) cmd_addr_timing_check( 1); + always @(cas_n_in ) cmd_addr_timing_check( 2); + always @(we_n_in ) cmd_addr_timing_check( 3); + always @(ba_in [ 0]) cmd_addr_timing_check( 4); + always @(ba_in [ 1]) cmd_addr_timing_check( 5); + always @(ba_in [ 2]) cmd_addr_timing_check( 6); + always @(addr_in[ 0]) cmd_addr_timing_check( 7); + always @(addr_in[ 1]) cmd_addr_timing_check( 8); + always @(addr_in[ 2]) cmd_addr_timing_check( 9); + always @(addr_in[ 3]) cmd_addr_timing_check(10); + always @(addr_in[ 4]) cmd_addr_timing_check(11); + always @(addr_in[ 5]) cmd_addr_timing_check(12); + always @(addr_in[ 6]) cmd_addr_timing_check(13); + always @(addr_in[ 7]) cmd_addr_timing_check(14); + always @(addr_in[ 8]) cmd_addr_timing_check(15); + always @(addr_in[ 9]) cmd_addr_timing_check(16); + always @(addr_in[10]) cmd_addr_timing_check(17); + always @(addr_in[11]) cmd_addr_timing_check(18); + always @(addr_in[12]) cmd_addr_timing_check(19); + always @(addr_in[13]) cmd_addr_timing_check(20); + always @(addr_in[14]) cmd_addr_timing_check(21); + always @(addr_in[15]) cmd_addr_timing_check(22); + always @(addr_in[16]) cmd_addr_timing_check(23); + + // Processes to check setup and hold of data signals + task dm_timing_check; + input i; + reg [4:0] i; + begin + if (dqs_in_valid) begin + if ($time - tm_dqs[i] < TDH) + $display ("%m: at time %t ERROR: tDH violation on DM bit %d by %t", $time, i, tm_dqs[i] + TDH - $time); + if (check_dm_tdipw[i]) begin + if ($time - tm_dm[i] < TDIPW) + $display ("%m: at time %t ERROR: tDIPW violation on DM bit %d by %t", $time, i, tm_dm[i] + TDIPW - $time); + end + end + check_dm_tdipw[i] <= 1'b0; + tm_dm[i] = $time; + end + endtask + + always @(dm_in[ 0]) dm_timing_check( 0); + always @(dm_in[ 1]) dm_timing_check( 1); + always @(dm_in[ 2]) dm_timing_check( 2); + always @(dm_in[ 3]) dm_timing_check( 3); + always @(dm_in[ 4]) dm_timing_check( 4); + always @(dm_in[ 5]) dm_timing_check( 5); + always @(dm_in[ 6]) dm_timing_check( 6); + always @(dm_in[ 7]) dm_timing_check( 7); + always @(dm_in[ 8]) dm_timing_check( 8); + always @(dm_in[ 9]) dm_timing_check( 9); + always @(dm_in[10]) dm_timing_check(10); + always @(dm_in[11]) dm_timing_check(11); + always @(dm_in[12]) dm_timing_check(12); + always @(dm_in[13]) dm_timing_check(13); + always @(dm_in[14]) dm_timing_check(14); + always @(dm_in[15]) dm_timing_check(15); + + always @(dm_in[16]) dm_timing_check(16); + always @(dm_in[17]) dm_timing_check(17); + always @(dm_in[18]) dm_timing_check(18); + always @(dm_in[19]) dm_timing_check(19); + always @(dm_in[20]) dm_timing_check(20); + always @(dm_in[21]) dm_timing_check(21); + always @(dm_in[22]) dm_timing_check(22); + always @(dm_in[23]) dm_timing_check(23); + always @(dm_in[24]) dm_timing_check(24); + always @(dm_in[25]) dm_timing_check(25); + always @(dm_in[26]) dm_timing_check(26); + always @(dm_in[27]) dm_timing_check(27); + always @(dm_in[28]) dm_timing_check(28); + always @(dm_in[29]) dm_timing_check(29); + always @(dm_in[30]) dm_timing_check(30); + always @(dm_in[31]) dm_timing_check(31); + + task dq_timing_check; + input i; + reg [6:0] i; + begin + if (dqs_in_valid) begin + if ($time - tm_dqs[i/(`DQ_PER_DQS)] < TDH) + $display ("%m: at time %t ERROR: tDH violation on DQ bit %d by %t", $time, i, tm_dqs[i/`DQ_PER_DQS] + TDH - $time); + if (check_dq_tdipw[i]) begin + if ($time - tm_dq[i] < TDIPW) + $display ("%m: at time %t ERROR: tDIPW violation on DQ bit %d by %t", $time, i, tm_dq[i] + TDIPW - $time); + end + end + check_dq_tdipw[i] <= 1'b0; + tm_dq[i] = $time; + end + endtask + + always @(dq_in[ 0]) dq_timing_check( 0); + always @(dq_in[ 1]) dq_timing_check( 1); + always @(dq_in[ 2]) dq_timing_check( 2); + always @(dq_in[ 3]) dq_timing_check( 3); + always @(dq_in[ 4]) dq_timing_check( 4); + always @(dq_in[ 5]) dq_timing_check( 5); + always @(dq_in[ 6]) dq_timing_check( 6); + always @(dq_in[ 7]) dq_timing_check( 7); + always @(dq_in[ 8]) dq_timing_check( 8); + always @(dq_in[ 9]) dq_timing_check( 9); + always @(dq_in[10]) dq_timing_check(10); + always @(dq_in[11]) dq_timing_check(11); + always @(dq_in[12]) dq_timing_check(12); + always @(dq_in[13]) dq_timing_check(13); + always @(dq_in[14]) dq_timing_check(14); + always @(dq_in[15]) dq_timing_check(15); + always @(dq_in[16]) dq_timing_check(16); + always @(dq_in[17]) dq_timing_check(17); + always @(dq_in[18]) dq_timing_check(18); + always @(dq_in[19]) dq_timing_check(19); + always @(dq_in[20]) dq_timing_check(20); + always @(dq_in[21]) dq_timing_check(21); + always @(dq_in[22]) dq_timing_check(22); + always @(dq_in[23]) dq_timing_check(23); + always @(dq_in[24]) dq_timing_check(24); + always @(dq_in[25]) dq_timing_check(25); + always @(dq_in[26]) dq_timing_check(26); + always @(dq_in[27]) dq_timing_check(27); + always @(dq_in[28]) dq_timing_check(28); + always @(dq_in[29]) dq_timing_check(29); + always @(dq_in[30]) dq_timing_check(30); + always @(dq_in[31]) dq_timing_check(31); + always @(dq_in[32]) dq_timing_check(32); + always @(dq_in[33]) dq_timing_check(33); + always @(dq_in[34]) dq_timing_check(34); + always @(dq_in[35]) dq_timing_check(35); + always @(dq_in[36]) dq_timing_check(36); + always @(dq_in[37]) dq_timing_check(37); + always @(dq_in[38]) dq_timing_check(38); + always @(dq_in[39]) dq_timing_check(39); + always @(dq_in[40]) dq_timing_check(40); + always @(dq_in[41]) dq_timing_check(41); + always @(dq_in[42]) dq_timing_check(42); + always @(dq_in[43]) dq_timing_check(43); + always @(dq_in[44]) dq_timing_check(44); + always @(dq_in[45]) dq_timing_check(45); + always @(dq_in[46]) dq_timing_check(46); + always @(dq_in[47]) dq_timing_check(47); + always @(dq_in[48]) dq_timing_check(48); + always @(dq_in[49]) dq_timing_check(49); + always @(dq_in[50]) dq_timing_check(50); + always @(dq_in[51]) dq_timing_check(51); + always @(dq_in[52]) dq_timing_check(52); + always @(dq_in[53]) dq_timing_check(53); + always @(dq_in[54]) dq_timing_check(54); + always @(dq_in[55]) dq_timing_check(55); + always @(dq_in[56]) dq_timing_check(56); + always @(dq_in[57]) dq_timing_check(57); + always @(dq_in[58]) dq_timing_check(58); + always @(dq_in[59]) dq_timing_check(59); + always @(dq_in[60]) dq_timing_check(60); + always @(dq_in[61]) dq_timing_check(61); + always @(dq_in[62]) dq_timing_check(62); + always @(dq_in[63]) dq_timing_check(63); + + always @(dq_in[64]) dq_timing_check(64); + always @(dq_in[65]) dq_timing_check(65); + always @(dq_in[66]) dq_timing_check(66); + always @(dq_in[67]) dq_timing_check(67); + always @(dq_in[68]) dq_timing_check(68); + always @(dq_in[69]) dq_timing_check(69); + always @(dq_in[70]) dq_timing_check(70); + always @(dq_in[71]) dq_timing_check(71); + always @(dq_in[72]) dq_timing_check(72); + always @(dq_in[73]) dq_timing_check(73); + always @(dq_in[74]) dq_timing_check(74); + always @(dq_in[75]) dq_timing_check(75); + always @(dq_in[76]) dq_timing_check(76); + always @(dq_in[77]) dq_timing_check(77); + always @(dq_in[78]) dq_timing_check(78); + always @(dq_in[79]) dq_timing_check(79); + always @(dq_in[80]) dq_timing_check(80); + always @(dq_in[81]) dq_timing_check(81); + always @(dq_in[82]) dq_timing_check(82); + always @(dq_in[83]) dq_timing_check(83); + always @(dq_in[84]) dq_timing_check(84); + always @(dq_in[85]) dq_timing_check(85); + always @(dq_in[86]) dq_timing_check(86); + always @(dq_in[87]) dq_timing_check(87); + always @(dq_in[88]) dq_timing_check(88); + always @(dq_in[89]) dq_timing_check(89); + always @(dq_in[90]) dq_timing_check(90); + always @(dq_in[91]) dq_timing_check(91); + always @(dq_in[92]) dq_timing_check(92); + always @(dq_in[93]) dq_timing_check(93); + always @(dq_in[94]) dq_timing_check(94); + always @(dq_in[95]) dq_timing_check(95); + always @(dq_in[96]) dq_timing_check(96); + always @(dq_in[97]) dq_timing_check(97); + always @(dq_in[98]) dq_timing_check(98); + always @(dq_in[99]) dq_timing_check(99); + always @(dq_in[100]) dq_timing_check(100); + always @(dq_in[101]) dq_timing_check(101); + always @(dq_in[102]) dq_timing_check(102); + always @(dq_in[103]) dq_timing_check(103); + always @(dq_in[104]) dq_timing_check(104); + always @(dq_in[105]) dq_timing_check(105); + always @(dq_in[106]) dq_timing_check(106); + always @(dq_in[107]) dq_timing_check(107); + always @(dq_in[108]) dq_timing_check(108); + always @(dq_in[109]) dq_timing_check(109); + always @(dq_in[110]) dq_timing_check(110); + always @(dq_in[111]) dq_timing_check(111); + always @(dq_in[112]) dq_timing_check(112); + always @(dq_in[113]) dq_timing_check(113); + always @(dq_in[114]) dq_timing_check(114); + always @(dq_in[115]) dq_timing_check(115); + always @(dq_in[116]) dq_timing_check(116); + always @(dq_in[117]) dq_timing_check(117); + always @(dq_in[118]) dq_timing_check(118); + always @(dq_in[119]) dq_timing_check(119); + always @(dq_in[120]) dq_timing_check(120); + always @(dq_in[121]) dq_timing_check(121); + always @(dq_in[122]) dq_timing_check(122); + always @(dq_in[123]) dq_timing_check(123); + always @(dq_in[124]) dq_timing_check(124); + always @(dq_in[125]) dq_timing_check(125); + always @(dq_in[126]) dq_timing_check(126); + always @(dq_in[127]) dq_timing_check(127); + + task dqs_pos_timing_check; + input i; + reg [5:0] i; + reg [4:0] j; + begin + if (write_levelization && i<32) begin + if (ck_cntr - ck_load_mode < TWLMRD) + $display ("%m: at time %t ERROR: tWLMRD violation on DQS bit %d positive edge.", $time, i); + if (($time - tm_ck_pos < TWLS) || ($time - tm_ck_neg < TWLS)) + $display ("%m: at time %t WARNING: tWLS violation on DQS bit %d positive edge. Indeterminate CK capture is possible.", $time, i); + if (DEBUG) + $display ("%m: at time %t Write Leveling @ DQS ck = %b", $time, diff_ck); + dq_out_en_dly[i*`DQ_PER_DQS] <= #(TWLO) 1'b1; + dq_out_dly[i*`DQ_PER_DQS] <= #(TWLO) diff_ck; +`ifdef WL_ALLDQ + for (j=1; j<`DQ_PER_DQS; j=j+1) begin + dq_out_en_dly[i*`DQ_PER_DQS+j] <= #(TWLO) 1'b1; + dq_out_dly[i*`DQ_PER_DQS+j] <= #(TWLO) diff_ck; + end +`else + for (j=1; j<`DQ_PER_DQS; j=j+1) begin + dq_out_en_dly[i*`DQ_PER_DQS+j] <= #(TWLO + TWLOE) 1'b1; + dq_out_dly[i*`DQ_PER_DQS+j] <= #(TWLO + TWLOE) 1'b0; + end +`endif + end + if (dqs_in_valid && ((wdqs_pos_cntr[i] < wr_burst_length/2) || b2b_write)) begin + if (dqs_in[i] ^ prev_dqs_in[i]) begin + if (dll_locked) begin + if (check_write_preamble[i]) begin + if ($time - tm_dqs_pos[i] < $rtoi(TWPRE*tck_avg)) + $display ("%m: at time %t ERROR: tWPRE violation on %s bit %d", $time, dqs_string[i/32], i%32); + end else if (check_write_postamble[i]) begin + if ($time - tm_dqs_neg[i] < $rtoi(TWPST*tck_avg)) + $display ("%m: at time %t ERROR: tWPST violation on %s bit %d", $time, dqs_string[i/32], i%32); + end else begin + if ($time - tm_dqs_neg[i] < $rtoi(TDQSL*tck_avg)) + $display ("%m: at time %t ERROR: tDQSL violation on %s bit %d", $time, dqs_string[i/32], i%32); + end + end + if ($time - tm_dm[i%32] < TDS) + $display ("%m: at time %t ERROR: tDS violation on DM bit %d by %t", $time, i, tm_dm[i%32] + TDS - $time); + if (!dq_out_en) begin + for (j=0; j<`DQ_PER_DQS; j=j+1) begin + if ($time - tm_dq[(i%32)*`DQ_PER_DQS+j] < TDS) + $display ("%m: at time %t ERROR: tDS violation on DQ bit %d by %t", $time, i*`DQ_PER_DQS+j, tm_dq[(i%32)*`DQ_PER_DQS+j] + TDS - $time); + check_dq_tdipw[(i%32)*`DQ_PER_DQS+j] <= 1'b1; + end + end + if ((wdqs_pos_cntr[i] < wr_burst_length/2) && !b2b_write) begin + wdqs_pos_cntr[i] <= wdqs_pos_cntr[i] + 1; + end else begin + wdqs_pos_cntr[i] <= 1; + end + check_dm_tdipw[i%32] <= 1'b1; + check_write_preamble[i] <= 1'b0; + check_write_postamble[i] <= 1'b0; + check_write_dqs_low[i] <= 1'b0; + tm_dqs[i%32] <= $time; + end else begin + $display ("%m: at time %t ERROR: Invalid latching edge on %s bit %d", $time, dqs_string[i/32], i%32); + end + end + tm_dqss_pos[i] <= $time; + tm_dqs_pos[i] = $time; + prev_dqs_in[i] <= dqs_in[i]; + end + endtask + + always @(posedge dqs_in[ 0]) if ( dqs_in[ 0]) dqs_pos_timing_check( 0); + always @(posedge dqs_in[ 1]) if ( dqs_in[ 1]) dqs_pos_timing_check( 1); + always @(posedge dqs_in[ 2]) if ( dqs_in[ 2]) dqs_pos_timing_check( 2); + always @(posedge dqs_in[ 3]) if ( dqs_in[ 3]) dqs_pos_timing_check( 3); + always @(posedge dqs_in[ 4]) if ( dqs_in[ 4]) dqs_pos_timing_check( 4); + always @(posedge dqs_in[ 5]) if ( dqs_in[ 5]) dqs_pos_timing_check( 5); + always @(posedge dqs_in[ 6]) if ( dqs_in[ 6]) dqs_pos_timing_check( 6); + always @(posedge dqs_in[ 7]) if ( dqs_in[ 7]) dqs_pos_timing_check( 7); + always @(posedge dqs_in[ 8]) if ( dqs_in[ 8]) dqs_pos_timing_check( 8); + always @(posedge dqs_in[ 9]) if ( dqs_in[ 9]) dqs_pos_timing_check( 9); + always @(posedge dqs_in[10]) if ( dqs_in[10]) dqs_pos_timing_check(10); + always @(posedge dqs_in[11]) if ( dqs_in[11]) dqs_pos_timing_check(11); + always @(posedge dqs_in[12]) if ( dqs_in[12]) dqs_pos_timing_check(12); + always @(posedge dqs_in[13]) if ( dqs_in[13]) dqs_pos_timing_check(13); + always @(posedge dqs_in[14]) if ( dqs_in[14]) dqs_pos_timing_check(14); + always @(posedge dqs_in[15]) if ( dqs_in[15]) dqs_pos_timing_check(15); + always @(posedge dqs_in[16]) if ( dqs_in[16]) dqs_pos_timing_check(16); + always @(posedge dqs_in[17]) if ( dqs_in[17]) dqs_pos_timing_check(17); + always @(posedge dqs_in[18]) if ( dqs_in[18]) dqs_pos_timing_check(18); + always @(posedge dqs_in[19]) if ( dqs_in[19]) dqs_pos_timing_check(19); + always @(posedge dqs_in[20]) if ( dqs_in[20]) dqs_pos_timing_check(20); + always @(posedge dqs_in[21]) if ( dqs_in[21]) dqs_pos_timing_check(21); + always @(posedge dqs_in[22]) if ( dqs_in[22]) dqs_pos_timing_check(22); + always @(posedge dqs_in[23]) if ( dqs_in[23]) dqs_pos_timing_check(23); + always @(posedge dqs_in[24]) if ( dqs_in[24]) dqs_pos_timing_check(24); + always @(posedge dqs_in[25]) if ( dqs_in[25]) dqs_pos_timing_check(25); + always @(posedge dqs_in[26]) if ( dqs_in[26]) dqs_pos_timing_check(26); + always @(posedge dqs_in[27]) if ( dqs_in[27]) dqs_pos_timing_check(27); + always @(posedge dqs_in[28]) if ( dqs_in[28]) dqs_pos_timing_check(28); + always @(posedge dqs_in[29]) if ( dqs_in[29]) dqs_pos_timing_check(29); + always @(posedge dqs_in[30]) if ( dqs_in[30]) dqs_pos_timing_check(30); + always @(posedge dqs_in[31]) if ( dqs_in[31]) dqs_pos_timing_check(31); + + always @(negedge dqs_in[32]) if (!dqs_in[32]) dqs_pos_timing_check(32); + always @(negedge dqs_in[33]) if (!dqs_in[33]) dqs_pos_timing_check(33); + always @(negedge dqs_in[34]) if (!dqs_in[34]) dqs_pos_timing_check(34); + always @(negedge dqs_in[35]) if (!dqs_in[35]) dqs_pos_timing_check(35); + always @(negedge dqs_in[36]) if (!dqs_in[36]) dqs_pos_timing_check(36); + always @(negedge dqs_in[37]) if (!dqs_in[37]) dqs_pos_timing_check(37); + always @(negedge dqs_in[38]) if (!dqs_in[38]) dqs_pos_timing_check(38); + always @(negedge dqs_in[39]) if (!dqs_in[39]) dqs_pos_timing_check(39); + always @(negedge dqs_in[40]) if (!dqs_in[40]) dqs_pos_timing_check(40); + always @(negedge dqs_in[41]) if (!dqs_in[41]) dqs_pos_timing_check(41); + always @(negedge dqs_in[42]) if (!dqs_in[42]) dqs_pos_timing_check(42); + always @(negedge dqs_in[43]) if (!dqs_in[43]) dqs_pos_timing_check(43); + always @(negedge dqs_in[44]) if (!dqs_in[44]) dqs_pos_timing_check(44); + always @(negedge dqs_in[45]) if (!dqs_in[45]) dqs_pos_timing_check(45); + always @(negedge dqs_in[46]) if (!dqs_in[46]) dqs_pos_timing_check(46); + always @(negedge dqs_in[47]) if (!dqs_in[47]) dqs_pos_timing_check(47); + always @(negedge dqs_in[48]) if (!dqs_in[48]) dqs_pos_timing_check(48); + always @(negedge dqs_in[49]) if (!dqs_in[49]) dqs_pos_timing_check(49); + always @(negedge dqs_in[50]) if (!dqs_in[50]) dqs_pos_timing_check(50); + always @(negedge dqs_in[51]) if (!dqs_in[51]) dqs_pos_timing_check(51); + always @(negedge dqs_in[52]) if (!dqs_in[52]) dqs_pos_timing_check(52); + always @(negedge dqs_in[53]) if (!dqs_in[53]) dqs_pos_timing_check(53); + always @(negedge dqs_in[54]) if (!dqs_in[54]) dqs_pos_timing_check(54); + always @(negedge dqs_in[55]) if (!dqs_in[55]) dqs_pos_timing_check(55); + always @(negedge dqs_in[56]) if (!dqs_in[56]) dqs_pos_timing_check(56); + always @(negedge dqs_in[57]) if (!dqs_in[57]) dqs_pos_timing_check(57); + always @(negedge dqs_in[58]) if (!dqs_in[58]) dqs_pos_timing_check(58); + always @(negedge dqs_in[59]) if (!dqs_in[59]) dqs_pos_timing_check(59); + always @(negedge dqs_in[60]) if (!dqs_in[60]) dqs_pos_timing_check(60); + always @(negedge dqs_in[61]) if (!dqs_in[61]) dqs_pos_timing_check(61); + always @(negedge dqs_in[62]) if (!dqs_in[62]) dqs_pos_timing_check(62); + always @(negedge dqs_in[63]) if (!dqs_in[63]) dqs_pos_timing_check(63); + + task dqs_neg_timing_check; + input i; + reg [5:0] i; + reg [4:0] j; + begin + if (write_levelization && i<32) begin + if (ck_cntr - ck_load_mode < TWLDQSEN) + $display ("%m: at time %t ERROR: tWLDQSEN violation on DQS bit %d.", $time, i); + if ($time - tm_dqs_pos[i] < $rtoi(TDQSH*tck_avg)) + $display ("%m: at time %t ERROR: tDQSH violation on DQS bit %d by %t", $time, i, tm_dqs_pos[i] + TDQSH*tck_avg - $time); + end + if (dqs_in_valid && (wdqs_pos_cntr[i] > 0) && check_write_dqs_high[i]) begin + if (dqs_in[i] ^ prev_dqs_in[i]) begin + if (dll_locked) begin + if ($time - tm_dqs_pos[i] < $rtoi(TDQSH*tck_avg)) + $display ("%m: at time %t ERROR: tDQSH violation on %s bit %d", $time, dqs_string[i/32], i%32); + if ($time - tm_ck_pos < $rtoi(TDSH*tck_avg)) + $display ("%m: at time %t ERROR: tDSH violation on %s bit %d", $time, dqs_string[i/32], i%32); + end + if ($time - tm_dm[i%32] < TDS) + $display ("%m: at time %t ERROR: tDS violation on DM bit %d by %t", $time, i, tm_dm[i%32] + TDS - $time); + if (!dq_out_en) begin + for (j=0; j<`DQ_PER_DQS; j=j+1) begin + if ($time - tm_dq[(i%32)*`DQ_PER_DQS+j] < TDS) + $display ("%m: at time %t ERROR: tDS violation on DQ bit %d by %t", $time, i*`DQ_PER_DQS+j, tm_dq[(i%32)*`DQ_PER_DQS+j] + TDS - $time); + check_dq_tdipw[(i%32)*`DQ_PER_DQS+j] <= 1'b1; + end + end + check_dm_tdipw[i%32] <= 1'b1; + tm_dqs[i%32] <= $time; + end else begin + $display ("%m: at time %t ERROR: Invalid latching edge on %s bit %d", $time, dqs_string[i/32], i%32); + end + end + check_write_dqs_high[i] <= 1'b0; + tm_dqs_neg[i] = $time; + prev_dqs_in[i] <= dqs_in[i]; + end + endtask + + always @(negedge dqs_in[ 0]) if (!dqs_in[ 0]) dqs_neg_timing_check( 0); + always @(negedge dqs_in[ 1]) if (!dqs_in[ 1]) dqs_neg_timing_check( 1); + always @(negedge dqs_in[ 2]) if (!dqs_in[ 2]) dqs_neg_timing_check( 2); + always @(negedge dqs_in[ 3]) if (!dqs_in[ 3]) dqs_neg_timing_check( 3); + always @(negedge dqs_in[ 4]) if (!dqs_in[ 4]) dqs_neg_timing_check( 4); + always @(negedge dqs_in[ 5]) if (!dqs_in[ 5]) dqs_neg_timing_check( 5); + always @(negedge dqs_in[ 6]) if (!dqs_in[ 6]) dqs_neg_timing_check( 6); + always @(negedge dqs_in[ 7]) if (!dqs_in[ 7]) dqs_neg_timing_check( 7); + always @(negedge dqs_in[ 8]) if (!dqs_in[ 8]) dqs_neg_timing_check( 8); + always @(negedge dqs_in[ 9]) if (!dqs_in[ 9]) dqs_neg_timing_check( 9); + always @(negedge dqs_in[10]) if (!dqs_in[10]) dqs_neg_timing_check(10); + always @(negedge dqs_in[11]) if (!dqs_in[11]) dqs_neg_timing_check(11); + always @(negedge dqs_in[12]) if (!dqs_in[12]) dqs_neg_timing_check(12); + always @(negedge dqs_in[13]) if (!dqs_in[13]) dqs_neg_timing_check(13); + always @(negedge dqs_in[14]) if (!dqs_in[14]) dqs_neg_timing_check(14); + always @(negedge dqs_in[15]) if (!dqs_in[15]) dqs_neg_timing_check(15); + always @(negedge dqs_in[16]) if (!dqs_in[16]) dqs_neg_timing_check(16); + always @(negedge dqs_in[17]) if (!dqs_in[17]) dqs_neg_timing_check(17); + always @(negedge dqs_in[18]) if (!dqs_in[18]) dqs_neg_timing_check(18); + always @(negedge dqs_in[19]) if (!dqs_in[19]) dqs_neg_timing_check(19); + always @(negedge dqs_in[20]) if (!dqs_in[20]) dqs_neg_timing_check(20); + always @(negedge dqs_in[21]) if (!dqs_in[21]) dqs_neg_timing_check(21); + always @(negedge dqs_in[22]) if (!dqs_in[22]) dqs_neg_timing_check(22); + always @(negedge dqs_in[23]) if (!dqs_in[23]) dqs_neg_timing_check(23); + always @(negedge dqs_in[24]) if (!dqs_in[24]) dqs_neg_timing_check(24); + always @(negedge dqs_in[25]) if (!dqs_in[25]) dqs_neg_timing_check(25); + always @(negedge dqs_in[26]) if (!dqs_in[26]) dqs_neg_timing_check(26); + always @(negedge dqs_in[27]) if (!dqs_in[27]) dqs_neg_timing_check(27); + always @(negedge dqs_in[28]) if (!dqs_in[28]) dqs_neg_timing_check(28); + always @(negedge dqs_in[29]) if (!dqs_in[29]) dqs_neg_timing_check(29); + always @(negedge dqs_in[30]) if (!dqs_in[30]) dqs_neg_timing_check(30); + always @(negedge dqs_in[31]) if (!dqs_in[31]) dqs_neg_timing_check(31); + + always @(posedge dqs_in[32]) if ( dqs_in[32]) dqs_neg_timing_check(32); + always @(posedge dqs_in[33]) if ( dqs_in[33]) dqs_neg_timing_check(33); + always @(posedge dqs_in[34]) if ( dqs_in[34]) dqs_neg_timing_check(34); + always @(posedge dqs_in[35]) if ( dqs_in[35]) dqs_neg_timing_check(35); + always @(posedge dqs_in[36]) if ( dqs_in[36]) dqs_neg_timing_check(36); + always @(posedge dqs_in[37]) if ( dqs_in[37]) dqs_neg_timing_check(37); + always @(posedge dqs_in[38]) if ( dqs_in[38]) dqs_neg_timing_check(38); + always @(posedge dqs_in[39]) if ( dqs_in[39]) dqs_neg_timing_check(39); + always @(posedge dqs_in[40]) if ( dqs_in[40]) dqs_neg_timing_check(40); + always @(posedge dqs_in[41]) if ( dqs_in[41]) dqs_neg_timing_check(41); + always @(posedge dqs_in[42]) if ( dqs_in[42]) dqs_neg_timing_check(42); + always @(posedge dqs_in[43]) if ( dqs_in[43]) dqs_neg_timing_check(43); + always @(posedge dqs_in[44]) if ( dqs_in[44]) dqs_neg_timing_check(44); + always @(posedge dqs_in[45]) if ( dqs_in[45]) dqs_neg_timing_check(45); + always @(posedge dqs_in[46]) if ( dqs_in[46]) dqs_neg_timing_check(46); + always @(posedge dqs_in[47]) if ( dqs_in[47]) dqs_neg_timing_check(47); + always @(posedge dqs_in[48]) if ( dqs_in[48]) dqs_neg_timing_check(48); + always @(posedge dqs_in[49]) if ( dqs_in[49]) dqs_neg_timing_check(49); + always @(posedge dqs_in[50]) if ( dqs_in[50]) dqs_neg_timing_check(50); + always @(posedge dqs_in[51]) if ( dqs_in[51]) dqs_neg_timing_check(51); + always @(posedge dqs_in[52]) if ( dqs_in[52]) dqs_neg_timing_check(52); + always @(posedge dqs_in[53]) if ( dqs_in[53]) dqs_neg_timing_check(53); + always @(posedge dqs_in[54]) if ( dqs_in[54]) dqs_neg_timing_check(54); + always @(posedge dqs_in[55]) if ( dqs_in[55]) dqs_neg_timing_check(55); + always @(posedge dqs_in[56]) if ( dqs_in[56]) dqs_neg_timing_check(56); + always @(posedge dqs_in[57]) if ( dqs_in[57]) dqs_neg_timing_check(57); + always @(posedge dqs_in[58]) if ( dqs_in[58]) dqs_neg_timing_check(58); + always @(posedge dqs_in[59]) if ( dqs_in[59]) dqs_neg_timing_check(59); + always @(posedge dqs_in[60]) if ( dqs_in[60]) dqs_neg_timing_check(60); + always @(posedge dqs_in[61]) if ( dqs_in[61]) dqs_neg_timing_check(61); + always @(posedge dqs_in[62]) if ( dqs_in[62]) dqs_neg_timing_check(62); + always @(posedge dqs_in[63]) if ( dqs_in[63]) dqs_neg_timing_check(63); + +endmodule diff --git a/resources/soc/simu/testbench/ddr3_model_parameters.vh b/resources/soc/simu/testbench/ddr3_model_parameters.vh new file mode 100644 index 0000000..4c14495 --- /dev/null +++ b/resources/soc/simu/testbench/ddr3_model_parameters.vh @@ -0,0 +1,3412 @@ +/**************************************************************************************** +* +* Disclaimer This software code and all associated documentation, comments or other +* of Warranty: information (collectively "Software") is provided "AS IS" without +* warranty of any kind. MICRON TECHNOLOGY, INC. ("MTI") EXPRESSLY +* DISCLAIMS ALL WARRANTIES EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +* TO, NONINFRINGEMENT OF THIRD PARTY RIGHTS, AND ANY IMPLIED WARRANTIES +* OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. MTI DOES NOT +* WARRANT THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS, OR THAT THE +* OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE. +* FURTHERMORE, MTI DOES NOT MAKE ANY REPRESENTATIONS REGARDING THE USE OR +* THE RESULTS OF THE USE OF THE SOFTWARE IN TERMS OF ITS CORRECTNESS, +* ACCURACY, RELIABILITY, OR OTHERWISE. THE ENTIRE RISK ARISING OUT OF USE +* OR PERFORMANCE OF THE SOFTWARE REMAINS WITH YOU. IN NO EVENT SHALL MTI, +* ITS AFFILIATED COMPANIES OR THEIR SUPPLIERS BE LIABLE FOR ANY DIRECT, +* INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR SPECIAL DAMAGES (INCLUDING, +* WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, BUSINESS INTERRUPTION, +* OR LOSS OF INFORMATION) ARISING OUT OF YOUR USE OF OR INABILITY TO USE +* THE SOFTWARE, EVEN IF MTI HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +* DAMAGES. Because some jurisdictions prohibit the exclusion or +* limitation of liability for consequential or incidental damages, the +* above limitation may not apply to you. +* +* Copyright 2003 Micron Technology, Inc. All rights reserved. +* +****************************************************************************************/ + + // Parameters current with 1Gb, 2Gb, 4Gb and 8Gb datasheet + + // Timing parameters based on Speed Grade + +`ifdef x8Gb // 8Gb parameters + // SYMBOL UNITS DESCRIPTION + // ------ ----- ----------- + `ifdef sg093 // sg093 is equivalent to the JEDEC DDR3-2133 (14-14-14) speed bin + parameter TCK_MIN = 938; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 50; // tJIT(per) ps Period JItter + parameter TJIT_CC = 100; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 74; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 87; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 97; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 105; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 111; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 116; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 121; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 125; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 128; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 132; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 134; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 5; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 70; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 180; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 280; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 470; // tIPW ps Control and Address input Pulse Width + parameter TIS = 35; // tIS ps Input Setup Time + parameter TIH = 75; // tIH ps Input Hold Time + parameter TRAS_MIN = 33000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 46090; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 13090; // tRCD ps Active to Read/Write command time + parameter TRP = 13090; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 180; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 122; // tWLS ps Setup time for tDQS flop + parameter TWLH = 122; // tWLH ps Hold time of tDQS flop + parameter TWLO = 7500; // tWLO ps Write levelization output delay + parameter TAA_MIN = 13090; // TAA ps Internal READ command to first data + parameter CL_TIME = 13090; // CL ps Minimum CAS Latency + `elsif sg107 // sg107 is equivalent to the JEDEC DDR3-1866 (13-13-13) speed bin + parameter TCK_MIN = 1071; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 60; // tJIT(per) ps Period JItter + parameter TJIT_CC = 120; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 88; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 105; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 117; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 126; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 133; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 139; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 145; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 150; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 154; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 158; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 161; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 80; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 200; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 320; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 535; // tIPW ps Control and Address input Pulse Width + parameter TIS = 50; // tIS ps Input Setup Time + parameter TIH = 100; // tIH ps Input Hold Time + parameter TRAS_MIN = 34000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 47910; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 13910; // tRCD ps Active to Read/Write command time + parameter TRP = 13910; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 200; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 140; // tWLS ps Setup time for tDQS flop + parameter TWLH = 140; // tWLH ps Hold time of tDQS flop + parameter TWLO = 7500; // tWLO ps Write levelization output delay + parameter TAA_MIN = 13910; // TAA ps Internal READ command to first data + parameter CL_TIME = 13910; // CL ps Minimum CAS Latency + `elsif sg125 // sg125 is equivalent to the JEDEC DDR3-1600 (11-11-11) speed bin + parameter TCK_MIN = 1250; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 70; // tJIT(per) ps Period JItter + parameter TJIT_CC = 140; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 103; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 122; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 136; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 147; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 155; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 163; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 169; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 175; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 180; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 184; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 188; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 45; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 100; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 225; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 360; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 560; // tIPW ps Control and Address input Pulse Width + parameter TIS = 170; // tIS ps Input Setup Time + parameter TIH = 120; // tIH ps Input Hold Time + parameter TRAS_MIN = 35000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 48750; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 13750; // tRCD ps Active to Read/Write command time + parameter TRP = 13750; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 250; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 165; // tWLS ps Setup time for tDQS flop + parameter TWLH = 165; // tWLH ps Hold time of tDQS flop + parameter TWLO = 7500; // tWLO ps Write levelization output delay + parameter TAA_MIN = 13750; // TAA ps Internal READ command to first data + parameter CL_TIME = 13750; // CL ps Minimum CAS Latency + `elsif sg15E // sg15E is equivalent to the JEDEC DDR3-1333 (9-9-9) speed bin + parameter TCK_MIN = 1500; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 80; // tJIT(per) ps Period JItter + parameter TJIT_CC = 160; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 118; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 140; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 155; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 168; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 177; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 186; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 193; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 200; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 205; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 210; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 215; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 30; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 65; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 125; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 255; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 400; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 620; // tIPW ps Control and Address input Pulse Width + parameter TIS = 190; // tIS ps Input Setup Time + parameter TIH = 140; // tIH ps Input Hold Time + parameter TRAS_MIN = 36000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 49500; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 13500; // tRCD ps Active to Read/Write command time + parameter TRP = 13500; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5625; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 250; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 195; // tWLS ps Setup time for tDQS flop + parameter TWLH = 195; // tWLH ps Hold time of tDQS flop + parameter TWLO = 9000; // tWLO ps Write levelization output delay + parameter TAA_MIN = 13500; // TAA ps Internal READ command to first data + parameter CL_TIME = 13500; // CL ps Minimum CAS Latency + `else + `define sg187E // sg187E is equivalent to the JEDEC DDR3-1066 (7-7-7) speed bin + parameter TCK_MIN = 1875; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 90; // tJIT(per) ps Period JItter + parameter TJIT_CC = 180; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 132; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 157; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 175; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 188; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 200; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 209; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 217; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 224; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 231; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 237; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 242; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 75; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 100; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 150; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 300; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.38; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.38; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 490; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 780; // tIPW ps Control and Address input Pulse Width + parameter TIS = 275; // tIS ps Input Setup Time + parameter TIH = 200; // tIH ps Input Hold Time + parameter TRAS_MIN = 37500; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 50625; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 13125; // tRCD ps Active to Read/Write command time + parameter TRP = 13125; // tRP ps Precharge command period + parameter TXP = 7500; // tXP ps Exit power down to a valid command + parameter TCKE = 5625; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 300; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 245; // tWLS ps Setup time for tDQS flop + parameter TWLH = 245; // tWLH ps Hold time of tDQS flop + parameter TWLO = 9000; // tWLO ps Write levelization output delay + parameter TAA_MIN = 13125; // TAA ps Internal READ command to first data + parameter CL_TIME = 13125; // CL ps Minimum CAS Latency + `endif + + parameter TDQSCK_DLLDIS = TDQSCK; // tDQSCK ps for DLLDIS mode, timing not guaranteed + + `ifdef x16 + `ifdef sg093 + parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg107 + parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg125 + parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 40000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg15E + parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 45000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg15 + parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 45000; // tFAW ps (2KB page size) Four Bank Activate window + `else // sg187E, sg187, sg25, sg25E + parameter TRRD = 10000; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 50000; // tFAW ps (2KB page size) Four Bank Activate window + `endif + `else // x4, x8 + `ifdef sg093 + parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg107 + parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg125 + parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg15E + parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg15 + parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg187E + parameter TRRD = 7500; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 37500; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg187 + parameter TRRD = 7500; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 37500; // tFAW ps (1KB page size) Four Bank Activate window + `else // sg25, sg25E + parameter TRRD = 10000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 40000; // tFAW ps (1KB page size) Four Bank Activate window + `endif + `endif + + // Timing Parameters + + // Mode Register + parameter CL_MIN = 5; // CL tCK Minimum CAS Latency + parameter CL_MAX = 14; // CL tCK Maximum CAS Latency + parameter AL_MIN = 0; // AL tCK Minimum Additive Latency + parameter AL_MAX = 2; // AL tCK Maximum Additive Latency + parameter WR_MIN = 5; // WR tCK Minimum Write Recovery + parameter WR_MAX = 16; // WR tCK Maximum Write Recovery + parameter BL_MIN = 4; // BL tCK Minimum Burst Length + parameter BL_MAX = 8; // BL tCK Minimum Burst Length + parameter CWL_MIN = 5; // CWL tCK Minimum CAS Write Latency + parameter CWL_MAX = 10; // CWL tCK Maximum CAS Write Latency + + // Clock + parameter TCK_MAX = 3300; // tCK ps Maximum Clock Cycle Time + parameter TCH_AVG_MIN = 0.47; // tCH tCK Minimum Clock High-Level Pulse Width + parameter TCL_AVG_MIN = 0.47; // tCL tCK Minimum Clock Low-Level Pulse Width + parameter TCH_AVG_MAX = 0.53; // tCH tCK Maximum Clock High-Level Pulse Width + parameter TCL_AVG_MAX = 0.53; // tCL tCK Maximum Clock Low-Level Pulse Width + parameter TCH_ABS_MIN = 0.43; // tCH tCK Minimum Clock High-Level Pulse Width + parameter TCL_ABS_MIN = 0.43; // tCL tCK Maximum Clock Low-Level Pulse Width + parameter TCKE_TCK = 3; // tCKE tCK CKE minimum high or low pulse width + parameter TAA_MAX = 20000; // TAA ps Internal READ command to first data + + // Data OUT + parameter TQH = 0.38; // tQH ps DQ output hold time from DQS, DQS# + // Data Strobe OUT + parameter TRPRE = 0.90; // tRPRE tCK DQS Read Preamble + parameter TRPST = 0.30; // tRPST tCK DQS Read Postamble + // Data Strobe IN + parameter TDQSH = 0.45; // tDQSH tCK DQS input High Pulse Width + parameter TDQSL = 0.45; // tDQSL tCK DQS input Low Pulse Width + parameter TWPRE = 0.90; // tWPRE tCK DQS Write Preamble + parameter TWPST = 0.30; // tWPST tCK DQS Write Postamble + // Command and Address + integer TZQCS; // tZQCS tCK ZQ Cal (Short) time + integer TZQINIT = max(512, ceil(640000/TCK_MIN)); // tZQinit tCK ZQ Cal (Long) time + integer TZQOPER = max(256, ceil(320000/TCK_MIN)); // tZQoper tCK ZQ Cal (Long) time + parameter TCCD = 4; // tCCD tCK Cas to Cas command delay + parameter TCCD_DG = 2; // tCCD_DG tCK Cas to Cas command delay to different group + parameter TRAS_MAX = 60e9; // tRAS ps Maximum Active to Precharge command time + parameter TWR = 15000; // tWR ps Write recovery time + parameter TMRD = 4; // tMRD tCK Load Mode Register command cycle time + parameter TMOD = 15000; // tMOD ps LOAD MODE to non-LOAD MODE command cycle time + parameter TMOD_TCK = 12; // tMOD tCK LOAD MODE to non-LOAD MODE command cycle time + parameter TRRD_TCK = 4; // tRRD tCK Active bank a to Active bank b command time + parameter TRRD_DG = 3000; // tRRD_DG ps Active bank a to Active bank b command time to different group + parameter TRRD_DG_TCK = 2; // tRRD_DG tCK Active bank a to Active bank b command time to different group + parameter TRTP = 7500; // tRTP ps Read to Precharge command delay + parameter TRTP_TCK = 4; // tRTP tCK Read to Precharge command delay + parameter TWTR = 7500; // tWTR ps Write to Read command delay + parameter TWTR_DG = 3750; // tWTR_DG ps Write to Read command delay to different group + parameter TWTR_TCK = 4; // tWTR tCK Write to Read command delay + parameter TWTR_DG_TCK = 2; // tWTR_DG tCK Write to Read command delay to different group + parameter TDLLK = 512; // tDLLK tCK DLL locking time + // Refresh - 4Gb + parameter TRFC_MIN = 260000; // tRFC ps Refresh to Refresh Command interval minimum value + parameter TRFC_MAX =70200000; // tRFC ps Refresh to Refresh Command Interval maximum value + // Power Down + parameter TXP_TCK = 3; // tXP tCK Exit power down to a valid command + parameter TXPDLL = 24000; // tXPDLL ps Exit precharge power down to READ or WRITE command (DLL-off mode) + parameter TXPDLL_TCK = 10; // tXPDLL tCK Exit precharge power down to READ or WRITE command (DLL-off mode) + parameter TACTPDEN = 1; // tACTPDEN tCK Timing of last ACT command to power down entry + parameter TPRPDEN = 1; // tPREPDEN tCK Timing of last PRE command to power down entry + parameter TREFPDEN = 1; // tARPDEN tCK Timing of last REFRESH command to power down entry + parameter TCPDED = 1; // tCPDED tCK Command pass disable/enable delay + parameter TPD_MAX =TRFC_MAX; // tPD ps Power-down entry-to-exit timing + parameter TXPR = 270000; // tXPR ps Exit Reset from CKE assertion to a valid command + parameter TXPR_TCK = 5; // tXPR tCK Exit Reset from CKE assertion to a valid command + // Self Refresh + parameter TXS = 270000; // tXS ps Exit self refesh to a non-read or write command + parameter TXS_TCK = 5; // tXS tCK Exit self refesh to a non-read or write command + parameter TXSDLL = TDLLK; // tXSRD tCK Exit self refresh to a read or write command + parameter TISXR = TIS; // tISXR ps CKE setup time during self refresh exit. + parameter TCKSRE = 10000; // tCKSRE ps Valid Clock requirement after self refresh entry (SRE) + parameter TCKSRE_TCK = 5; // tCKSRE tCK Valid Clock requirement after self refresh entry (SRE) + parameter TCKSRX = 10000; // tCKSRX ps Valid Clock requirement prior to self refresh exit (SRX) + parameter TCKSRX_TCK = 5; // tCKSRX tCK Valid Clock requirement prior to self refresh exit (SRX) + parameter TCKESR_TCK = 4; // tCKESR tCK Minimum CKE low width for Self Refresh entry to exit timing + // ODT + parameter TAOF = 0.7; // tAOF tCK RTT turn-off from ODTLoff reference + parameter TAONPD = 8500; // tAONPD ps Asynchronous RTT turn-on delay (Power-Down with DLL frozen) + parameter TAOFPD = 8500; // tAONPD ps Asynchronous RTT turn-off delay (Power-Down with DLL frozen) + parameter ODTH4 = 4; // ODTH4 tCK ODT minimum HIGH time after ODT assertion or write (BL4) + parameter ODTH8 = 6; // ODTH8 tCK ODT minimum HIGH time after write (BL8) + parameter TADC = 0.7; // tADC tCK RTT dynamic change skew + // Write Levelization + parameter TWLMRD = 40; // tWLMRD tCK First DQS pulse rising edge after tDQSS margining mode is programmed + parameter TWLDQSEN = 25; // tWLDQSEN tCK DQS/DQS delay after tDQSS margining mode is programmed + parameter TWLOE = 2000; // tWLOE ps Write levelization output error + + // Size Parameters based on Part Width + + `ifdef x4 + parameter DM_BITS = 1; // Set this parameter to control how many Data Mask bits are used + parameter ADDR_BITS = 16; // MAX Address Bits + parameter ROW_BITS = 16; // Set this parameter to control how many Address bits are used + parameter COL_BITS = 14; // Set this parameter to control how many Column bits are used + parameter DQ_BITS = 4; // Set this parameter to control how many Data bits are used **Same as part bit width** + parameter DQS_BITS = 1; // Set this parameter to control how many Dqs bits are used + `define CA14PLUS + `elsif x8 + parameter DM_BITS = 1; // Set this parameter to control how many Data Mask bits are used + parameter ADDR_BITS = 16; // MAX Address Bits + parameter ROW_BITS = 16; // Set this parameter to control how many Address bits are used + parameter COL_BITS = 11; // Set this parameter to control how many Column bits are used + parameter DQ_BITS = 8; // Set this parameter to control how many Data bits are used **Same as part bit width** + parameter DQS_BITS = 1; // Set this parameter to control how many Dqs bits are used + `else + `define x16 + parameter DM_BITS = 2; // Set this parameter to control how many Data Mask bits are used + parameter ADDR_BITS = 16; // MAX Address Bits + parameter ROW_BITS = 16; // Set this parameter to control how many Address bits are used + parameter COL_BITS = 10; // Set this parameter to control how many Column bits are used + parameter DQ_BITS = 16; // Set this parameter to control how many Data bits are used **Same as part bit width** + parameter DQS_BITS = 2; // Set this parameter to control how many Dqs bits are used + `endif + + // Size Parameters + parameter BA_BITS = 3; // Set this parmaeter to control how many Bank Address bits are used + parameter MEM_BITS = 15; // Set this parameter to control how many write data bursts can be stored in memory. The default is 2^10=1024. + parameter AP = 10; // the address bit that controls auto-precharge and precharge-all + parameter BC = 12; // the address bit that controls burst chop + parameter BL_BITS = 3; // the number of bits required to count to BL_MAX + parameter BO_BITS = 2; // the number of Burst Order Bits + + `ifdef QUAD_RANK + parameter CS_BITS = 4; // Number of Chip Select Bits + parameter RANKS = 4; // Number of Chip Selects + `elsif DUAL_RANK + parameter CS_BITS = 2; // Number of Chip Select Bits + parameter RANKS = 2; // Number of Chip Selects + `else + parameter CS_BITS = 1; // Number of Chip Select Bits + parameter RANKS = 1; // Number of Chip Selects + `endif + + // Simulation parameters + parameter RZQ = 240; // termination resistance + parameter PRE_DEF_PAT = 8'hAA; // value returned during mpr pre-defined pattern readout + parameter STOP_ON_ERROR = 1; // If set to 1, the model will halt on command sequence/major errors + parameter DEBUG = 1; // Turn on Debug messages + parameter BUS_DELAY = 0; // delay in nanoseconds + parameter RANDOM_OUT_DELAY = 0; // If set to 1, the model will put a random amount of delay on DQ/DQS during reads + parameter RANDOM_SEED = 31913; //seed value for random generator. + + parameter RDQSEN_PRE = 2; // DQS driving time prior to first read strobe + parameter RDQSEN_PST = 1; // DQS driving time after last read strobe + parameter RDQS_PRE = 2; // DQS low time prior to first read strobe + parameter RDQS_PST = 1; // DQS low time after last read strobe + parameter RDQEN_PRE = 0; // DQ/DM driving time prior to first read data + parameter RDQEN_PST = 0; // DQ/DM driving time after last read data + parameter WDQS_PRE = 2; // DQS half clock periods prior to first write strobe + parameter WDQS_PST = 1; // DQS half clock periods after last write strobe + + // check for legal cas latency based on the cas write latency + function valid_cl; + input [3:0] cl; + input [3:0] cwl; + + case ({cwl, cl}) + `ifdef sg093 + {4'd5 , 4'd5 }, + {4'd5 , 4'd6 }, + {4'd6 , 4'd7 }, + {4'd6 , 4'd8 }, + {4'd7 , 4'd9 }, + {4'd7 , 4'd10}, + {4'd8 , 4'd11}, + {4'd9 , 4'd13}, + {4'd10, 4'd14}: valid_cl = 1; + `elsif sg107 + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}, + {4'd8, 4'd11}, + {4'd9, 4'd13}: valid_cl = 1; + `elsif sg125 + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}, + {4'd8, 4'd11}: valid_cl = 1; + `elsif sg15E + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}: valid_cl = 1; + `elsif sg15 + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd8 }, + {4'd7, 4'd10}: valid_cl = 1; + `elsif sg187E + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }: valid_cl = 1; + `elsif sg187 + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd8 }: valid_cl = 1; + `endif + default : valid_cl = 0; + endcase + endfunction + + // find the minimum valid cas write latency + function [3:0] min_cwl; + input period; + real period; + min_cwl = (period >= 2500.0) ? 5: + (period >= 1875.0) ? 6: + (period >= 1500.0) ? 7: + (period >= 1250.0) ? 8: + (period >= 1071.0) ? 9: + 10; // (period >= 938) + endfunction + + // find the minimum valid cas latency + function [3:0] min_cl; + input period; + real period; + reg [3:0] cwl; + reg [3:0] cl; + begin + cwl = min_cwl(period); + for (cl=CL_MAX; cl>=CL_MIN; cl=cl-1) begin + if (valid_cl(cl, cwl)) begin + min_cl = cl; + end + end + end + endfunction + +`elsif x4Gb // 4Gb parameters + // SYMBOL UNITS DESCRIPTION + // ------ ----- ----------- + `ifdef sg093 // sg093 is equivalent to the JEDEC DDR3-2133 (14-14-14) speed bin + parameter TCK_MIN = 938; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 50; // tJIT(per) ps Period JItter + parameter TJIT_CC = 100; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 74; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 87; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 97; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 105; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 111; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 116; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 121; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 125; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 128; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 132; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 134; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 5; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 70; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 180; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 280; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 470; // tIPW ps Control and Address input Pulse Width + parameter TIS = 35; // tIS ps Input Setup Time + parameter TIH = 75; // tIH ps Input Hold Time + parameter TRAS_MIN = 33000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 46130; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 13090; // tRCD ps Active to Read/Write command time + parameter TRP = 13090; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 180; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 122; // tWLS ps Setup time for tDQS flop + parameter TWLH = 122; // tWLH ps Hold time of tDQS flop + parameter TWLO = 7500; // tWLO ps Write levelization output delay + parameter TAA_MIN = 13090; // TAA ps Internal READ command to first data + parameter CL_TIME = 13090; // CL ps Minimum CAS Latency + `elsif sg093E // sg093E is equivalent to the JEDEC DDR3-2133 (13-13-13) speed bin + parameter TCK_MIN = 935; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 50; // tJIT(per) ps Period JItter + parameter TJIT_CC = 100; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 74; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 87; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 97; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 105; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 111; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 116; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 121; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 125; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 128; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 132; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 134; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 5; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 70; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 175; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 280; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 470; // tIPW ps Control and Address input Pulse Width + parameter TIS = 35; // tIS ps Input Setup Time + parameter TIH = 75; // tIH ps Input Hold Time + parameter TRAS_MIN = 33000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 47155; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 12155; // tRCD ps Active to Read/Write command time + parameter TRP = 12155; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 180; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 122; // tWLS ps Setup time for tDQS flop + parameter TWLH = 122; // tWLH ps Hold time of tDQS flop + parameter TWLO = 7500; // tWLO ps Write levelization output delay + parameter TAA_MIN = 12155; // TAA ps Internal READ command to first data + parameter CL_TIME = 12155; // CL ps Minimum CAS Latency + `elsif sg093F // sg093F is equivalent to the JEDEC DDR3-2133 (12-12-12) speed bin + parameter TCK_MIN = 935; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 50; // tJIT(per) ps Period JItter + parameter TJIT_CC = 100; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 74; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 87; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 97; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 105; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 111; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 116; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 121; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 125; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 128; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 132; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 134; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 5; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 70; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 175; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 280; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 470; // tIPW ps Control and Address input Pulse Width + parameter TIS = 35; // tIS ps Input Setup Time + parameter TIH = 75; // tIH ps Input Hold Time + parameter TRAS_MIN = 33000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 46220; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 11220; // tRCD ps Active to Read/Write command time + parameter TRP = 11220; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 180; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 122; // tWLS ps Setup time for tDQS flop + parameter TWLH = 122; // tWLH ps Hold time of tDQS flop + parameter TWLO = 7500; // tWLO ps Write levelization output delay + parameter TAA_MIN = 11220; // TAA ps Internal READ command to first data + parameter CL_TIME = 11220; // CL ps Minimum CAS Latency + `elsif sg107 // sg107 is equivalent to the JEDEC DDR3-1866 (13-13-13) speed bin + parameter TCK_MIN = 1071; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 60; // tJIT(per) ps Period JItter + parameter TJIT_CC = 120; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 88; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 105; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 117; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 126; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 133; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 139; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 145; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 150; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 154; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 158; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 161; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 80; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 200; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 320; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 535; // tIPW ps Control and Address input Pulse Width + parameter TIS = 50; // tIS ps Input Setup Time + parameter TIH = 100; // tIH ps Input Hold Time + parameter TRAS_MIN = 34000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 47910; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 13910; // tRCD ps Active to Read/Write command time + parameter TRP = 13910; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 200; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 140; // tWLS ps Setup time for tDQS flop + parameter TWLH = 140; // tWLH ps Hold time of tDQS flop + parameter TWLO = 7500; // tWLO ps Write levelization output delay + parameter TAA_MIN = 13910; // TAA ps Internal READ command to first data + parameter CL_TIME = 13910; // CL ps Minimum CAS Latency + `elsif sg107E // sg107E is equivalent to the JEDEC DDR3-1866 (12-12-12) speed bin + parameter TCK_MIN = 1070; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 60; // tJIT(per) ps Period JItter + parameter TJIT_CC = 120; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 88; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 105; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 117; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 126; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 133; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 139; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 145; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 150; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 154; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 158; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 161; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 80; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 200; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 320; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 535; // tIPW ps Control and Address input Pulse Width + parameter TIS = 50; // tIS ps Input Setup Time + parameter TIH = 100; // tIH ps Input Hold Time + parameter TRAS_MIN = 34000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 47840; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 12840; // tRCD ps Active to Read/Write command time + parameter TRP = 12840; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 200; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 140; // tWLS ps Setup time for tDQS flop + parameter TWLH = 140; // tWLH ps Hold time of tDQS flop + parameter TWLO = 7500; // tWLO ps Write levelization output delay + parameter TAA_MIN = 12840; // TAA ps Internal READ command to first data + parameter CL_TIME = 12840; // CL ps Minimum CAS Latency + `elsif sg107F // sg107F is equivalent to the JEDEC DDR3-1866 (11-11-11) speed bin + parameter TCK_MIN = 1070; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 60; // tJIT(per) ps Period JItter + parameter TJIT_CC = 120; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 88; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 105; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 117; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 126; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 133; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 139; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 145; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 150; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 154; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 158; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 161; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 80; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 200; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 320; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 535; // tIPW ps Control and Address input Pulse Width + parameter TIS = 50; // tIS ps Input Setup Time + parameter TIH = 100; // tIH ps Input Hold Time + parameter TRAS_MIN = 34000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 46770; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 11770; // tRCD ps Active to Read/Write command time + parameter TRP = 11770; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 200; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 140; // tWLS ps Setup time for tDQS flop + parameter TWLH = 140; // tWLH ps Hold time of tDQS flop + parameter TWLO = 7500; // tWLO ps Write levelization output delay + parameter TAA_MIN = 11770; // TAA ps Internal READ command to first data + parameter CL_TIME = 11770; // CL ps Minimum CAS Latency + `elsif sg125E // sg125E is equivalent to the JEDEC DDR3-1600 (10-10-10) speed bin + parameter TCK_MIN = 1250; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 70; // tJIT(per) ps Period JItter + parameter TJIT_CC = 140; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 103; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 122; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 136; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 147; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 155; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 163; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 169; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 175; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 180; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 184; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 188; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 45; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 100; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 225; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 360; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 560; // tIPW ps Control and Address input Pulse Width + parameter TIS = 170; // tIS ps Input Setup Time + parameter TIH = 120; // tIH ps Input Hold Time + parameter TRAS_MIN = 35000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 47500; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 12500; // tRCD ps Active to Read/Write command time + parameter TRP = 12500; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 250; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 165; // tWLS ps Setup time for tDQS flop + parameter TWLH = 165; // tWLH ps Hold time of tDQS flop + parameter TWLO = 7500; // tWLO ps Write levelization output delay + parameter TAA_MIN = 12500; // TAA ps Internal READ command to first data + parameter CL_TIME = 12500; // CL ps Minimum CAS Latency + `elsif sg125 // sg125 is equivalent to the JEDEC DDR3-1600 (11-11-11) speed bin + parameter TCK_MIN = 1250; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 70; // tJIT(per) ps Period JItter + parameter TJIT_CC = 140; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 103; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 122; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 136; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 147; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 155; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 163; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 169; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 175; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 180; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 184; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 188; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 45; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 100; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 225; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 360; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 560; // tIPW ps Control and Address input Pulse Width + parameter TIS = 170; // tIS ps Input Setup Time + parameter TIH = 120; // tIH ps Input Hold Time + parameter TRAS_MIN = 35000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 48750; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 13750; // tRCD ps Active to Read/Write command time + parameter TRP = 13750; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 250; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 165; // tWLS ps Setup time for tDQS flop + parameter TWLH = 165; // tWLH ps Hold time of tDQS flop + parameter TWLO = 7500; // tWLO ps Write levelization output delay + parameter TAA_MIN = 13750; // TAA ps Internal READ command to first data + parameter CL_TIME = 13750; // CL ps Minimum CAS Latency + `elsif sg15E // sg15E is equivalent to the JEDEC DDR3-1333H (9-9-9) speed bin + parameter TCK_MIN = 1500; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 80; // tJIT(per) ps Period JItter + parameter TJIT_CC = 160; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 118; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 140; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 155; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 168; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 177; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 186; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 193; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 200; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 205; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 210; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 215; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 30; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 65; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 125; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 255; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 400; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 620; // tIPW ps Control and Address input Pulse Width + parameter TIS = 190; // tIS ps Input Setup Time + parameter TIH = 140; // tIH ps Input Hold Time + parameter TRAS_MIN = 36000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 49500; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 13500; // tRCD ps Active to Read/Write command time + parameter TRP = 13500; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5625; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 250; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 195; // tWLS ps Setup time for tDQS flop + parameter TWLH = 195; // tWLH ps Hold time of tDQS flop + parameter TWLO = 9000; // tWLO ps Write levelization output delay + parameter TAA_MIN = 13500; // TAA ps Internal READ command to first data + parameter CL_TIME = 13500; // CL ps Minimum CAS Latency + `elsif sg15 // sg15 is equivalent to the JEDEC DDR3-1333J (10-10-10) speed bin + parameter TCK_MIN = 1500; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 80; // tJIT(per) ps Period JItter + parameter TJIT_CC = 160; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 118; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 140; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 155; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 168; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 177; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 186; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 193; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 200; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 205; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 210; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 215; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 30; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 65; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 125; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 255; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 400; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 620; // tIPW ps Control and Address input Pulse Width + parameter TIS = 190; // tIS ps Input Setup Time + parameter TIH = 140; // tIH ps Input Hold Time + parameter TRAS_MIN = 36000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 51000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 15000; // tRCD ps Active to Read/Write command time + parameter TRP = 15000; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5625; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 250; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 195; // tWLS ps Setup time for tDQS flop + parameter TWLH = 195; // tWLH ps Hold time of tDQS flop + parameter TWLO = 9000; // tWLO ps Write levelization output delay + parameter TAA_MIN = 15000; // TAA ps Internal READ command to first data + parameter CL_TIME = 15000; // CL ps Minimum CAS Latency + `elsif sg187E // sg187E is equivalent to the JEDEC DDR3-1066F (7-7-7) speed bin + parameter TCK_MIN = 1875; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 90; // tJIT(per) ps Period JItter + parameter TJIT_CC = 180; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 132; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 157; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 175; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 188; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 200; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 209; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 217; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 224; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 231; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 237; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 242; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 75; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 100; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 150; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 300; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.38; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.38; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 490; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 780; // tIPW ps Control and Address input Pulse Width + parameter TIS = 275; // tIS ps Input Setup Time + parameter TIH = 200; // tIH ps Input Hold Time + parameter TRAS_MIN = 37500; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 50625; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 13125; // tRCD ps Active to Read/Write command time + parameter TRP = 13125; // tRP ps Precharge command period + parameter TXP = 7500; // tXP ps Exit power down to a valid command + parameter TCKE = 5625; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 300; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 245; // tWLS ps Setup time for tDQS flop + parameter TWLH = 245; // tWLH ps Hold time of tDQS flop + parameter TWLO = 9000; // tWLO ps Write levelization output delay + parameter TAA_MIN = 13125; // TAA ps Internal READ command to first data + parameter CL_TIME = 13125; // CL ps Minimum CAS Latency + `elsif sg187 // sg187 is equivalent to the JEDEC DDR3-1066G (8-8-8) speed bin + parameter TCK_MIN = 1875; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 90; // tJIT(per) ps Period JItter + parameter TJIT_CC = 180; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 132; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 157; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 175; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 188; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 200; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 209; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 217; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 224; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 231; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 237; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 242; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 75; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 100; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 150; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 300; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.38; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.38; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 490; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 780; // tIPW ps Control and Address input Pulse Width + parameter TIS = 275; // tIS ps Input Setup Time + parameter TIH = 200; // tIH ps Input Hold Time + parameter TRAS_MIN = 37500; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 52500; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 15000; // tRCD ps Active to Read/Write command time + parameter TRP = 15000; // tRP ps Precharge command period + parameter TXP = 7500; // tXP ps Exit power down to a valid command + parameter TCKE = 5625; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 300; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 245; // tWLS ps Setup time for tDQS flop + parameter TWLH = 245; // tWLH ps Hold time of tDQS flop + parameter TWLO = 9000; // tWLO ps Write levelization output delay + parameter TAA_MIN = 15000; // TAA ps Internal READ command to first data + parameter CL_TIME = 15000; // CL ps Minimum CAS Latency + `elsif sg25E // sg25E is equivalent to the JEDEC DDR3-800D (5-5-5) speed bin + parameter TCK_MIN = 2500; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 100; // tJIT(per) ps Period JItter + parameter TJIT_CC = 200; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 147; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 175; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 194; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 209; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 222; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 232; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 241; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 249; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 257; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 263; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 269; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 125; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 150; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 200; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 400; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.38; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.38; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 600; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 900; // tIPW ps Control and Address input Pulse Width + parameter TIS = 350; // tIS ps Input Setup Time + parameter TIH = 275; // tIH ps Input Hold Time + parameter TRAS_MIN = 37500; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 50000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 12500; // tRCD ps Active to Read/Write command time + parameter TRP = 12500; // tRP ps Precharge command period + parameter TXP = 7500; // tXP ps Exit power down to a valid command + parameter TCKE = 7500; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 400; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 325; // tWLS ps Setup time for tDQS flop + parameter TWLH = 325; // tWLH ps Hold time of tDQS flop + parameter TWLO = 9000; // tWLO ps Write levelization output delay + parameter TAA_MIN = 12500; // TAA ps Internal READ command to first data + parameter CL_TIME = 12500; // CL ps Minimum CAS Latency + `else //`define sg25 // sg25 is equivalent to the JEDEC DDR3-800E (6-6-6) speed bin + parameter TCK_MIN = 2500; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 100; // tJIT(per) ps Period JItter + parameter TJIT_CC = 200; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 147; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 175; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 194; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 209; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 222; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 232; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 241; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 249; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 257; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 263; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 269; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 125; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 150; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 200; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 400; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.38; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.38; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 600; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 900; // tIPW ps Control and Address input Pulse Width + parameter TIS = 350; // tIS ps Input Setup Time + parameter TIH = 275; // tIH ps Input Hold Time + parameter TRAS_MIN = 37500; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 52500; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 15000; // tRCD ps Active to Read/Write command time + parameter TRP = 15000; // tRP ps Precharge command period + parameter TXP = 7500; // tXP ps Exit power down to a valid command + parameter TCKE = 7500; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 400; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 325; // tWLS ps Setup time for tDQS flop + parameter TWLH = 325; // tWLH ps Hold time of tDQS flop + parameter TWLO = 9000; // tWLO ps Write levelization output delay + parameter TAA_MIN = 15000; // TAA ps Internal READ command to first data + parameter CL_TIME = 15000; // CL ps Minimum CAS Latency + `endif + + parameter TDQSCK_DLLDIS = TDQSCK; // tDQSCK ps for DLLDIS mode, timing not guaranteed + + `ifdef x16 + `ifdef sg093 + parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg093E + parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg093F + parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg107 + parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg107E + parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg107F + parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg125E + parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 40000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg125 + parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 40000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg15E + parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 45000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg15 + parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 45000; // tFAW ps (2KB page size) Four Bank Activate window + `else // sg187E, sg187, sg25, sg25E + parameter TRRD = 10000; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 50000; // tFAW ps (2KB page size) Four Bank Activate window + `endif + `else // x4, x8 + `ifdef sg093 + parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg093E + parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg093F + parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg107 + parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg107E + parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg107F + parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg125E + parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg125 + parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg15E + parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg15 + parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg187E + parameter TRRD = 7500; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 37500; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg187 + parameter TRRD = 7500; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 37500; // tFAW ps (1KB page size) Four Bank Activate window + `else // sg25, sg25E + parameter TRRD = 10000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 40000; // tFAW ps (1KB page size) Four Bank Activate window + `endif + `endif + + // Timing Parameters + + // Mode Register + parameter CL_MIN = 5; // CL tCK Minimum CAS Latency + parameter CL_MAX = 14; // CL tCK Maximum CAS Latency + parameter AL_MIN = 0; // AL tCK Minimum Additive Latency + parameter AL_MAX = 2; // AL tCK Maximum Additive Latency + parameter WR_MIN = 5; // WR tCK Minimum Write Recovery + parameter WR_MAX = 16; // WR tCK Maximum Write Recovery + parameter BL_MIN = 4; // BL tCK Minimum Burst Length + parameter BL_MAX = 8; // BL tCK Minimum Burst Length + parameter CWL_MIN = 5; // CWL tCK Minimum CAS Write Latency + parameter CWL_MAX = 10; // CWL tCK Maximum CAS Write Latency + + // Clock + parameter TCK_MAX = 3300; // tCK ps Maximum Clock Cycle Time + parameter TCH_AVG_MIN = 0.47; // tCH tCK Minimum Clock High-Level Pulse Width + parameter TCL_AVG_MIN = 0.47; // tCL tCK Minimum Clock Low-Level Pulse Width + parameter TCH_AVG_MAX = 0.53; // tCH tCK Maximum Clock High-Level Pulse Width + parameter TCL_AVG_MAX = 0.53; // tCL tCK Maximum Clock Low-Level Pulse Width + parameter TCH_ABS_MIN = 0.43; // tCH tCK Minimum Clock High-Level Pulse Width + parameter TCL_ABS_MIN = 0.43; // tCL tCK Maximum Clock Low-Level Pulse Width + parameter TCKE_TCK = 3; // tCKE tCK CKE minimum high or low pulse width + parameter TAA_MAX = 20000; // TAA ps Internal READ command to first data + + // Data OUT + parameter TQH = 0.38; // tQH ps DQ output hold time from DQS, DQS# + // Data Strobe OUT + parameter TRPRE = 0.90; // tRPRE tCK DQS Read Preamble + parameter TRPST = 0.30; // tRPST tCK DQS Read Postamble + // Data Strobe IN + parameter TDQSH = 0.45; // tDQSH tCK DQS input High Pulse Width + parameter TDQSL = 0.45; // tDQSL tCK DQS input Low Pulse Width + parameter TWPRE = 0.90; // tWPRE tCK DQS Write Preamble + parameter TWPST = 0.30; // tWPST tCK DQS Write Postamble + // Command and Address + integer TZQCS; // tZQCS tCK ZQ Cal (Short) time + integer TZQINIT = max(512, ceil(640000/TCK_MIN)); // tZQinit tCK ZQ Cal (Long) time + integer TZQOPER = max(256, ceil(320000/TCK_MIN)); // tZQoper tCK ZQ Cal (Long) time + parameter TCCD = 4; // tCCD tCK Cas to Cas command delay + parameter TCCD_DG = 2; // tCCD_DG tCK Cas to Cas command delay to different group + parameter TRAS_MAX = 60e9; // tRAS ps Maximum Active to Precharge command time + parameter TWR = 15000; // tWR ps Write recovery time + parameter TMRD = 4; // tMRD tCK Load Mode Register command cycle time + parameter TMOD = 15000; // tMOD ps LOAD MODE to non-LOAD MODE command cycle time + parameter TMOD_TCK = 12; // tMOD tCK LOAD MODE to non-LOAD MODE command cycle time + parameter TRRD_TCK = 4; // tRRD tCK Active bank a to Active bank b command time + parameter TRRD_DG = 3000; // tRRD_DG ps Active bank a to Active bank b command time to different group + parameter TRRD_DG_TCK = 2; // tRRD_DG tCK Active bank a to Active bank b command time to different group + parameter TRTP = 7500; // tRTP ps Read to Precharge command delay + parameter TRTP_TCK = 4; // tRTP tCK Read to Precharge command delay + parameter TWTR = 7500; // tWTR ps Write to Read command delay + parameter TWTR_DG = 3750; // tWTR_DG ps Write to Read command delay to different group + parameter TWTR_TCK = 4; // tWTR tCK Write to Read command delay + parameter TWTR_DG_TCK = 2; // tWTR_DG tCK Write to Read command delay to different group + parameter TDLLK = 512; // tDLLK tCK DLL locking time + // Refresh - 4Gb + parameter TRFC_MIN = 260000; // tRFC ps Refresh to Refresh Command interval minimum value + parameter TRFC_MAX =70200000; // tRFC ps Refresh to Refresh Command Interval maximum value + // Power Down + parameter TXP_TCK = 3; // tXP tCK Exit power down to a valid command + parameter TXPDLL = 24000; // tXPDLL ps Exit precharge power down to READ or WRITE command (DLL-off mode) + parameter TXPDLL_TCK = 10; // tXPDLL tCK Exit precharge power down to READ or WRITE command (DLL-off mode) + parameter TACTPDEN = 1; // tACTPDEN tCK Timing of last ACT command to power down entry + parameter TPRPDEN = 1; // tPREPDEN tCK Timing of last PRE command to power down entry + parameter TREFPDEN = 1; // tARPDEN tCK Timing of last REFRESH command to power down entry + parameter TCPDED = 1; // tCPDED tCK Command pass disable/enable delay + parameter TPD_MAX =TRFC_MAX; // tPD ps Power-down entry-to-exit timing + parameter TXPR = 270000; // tXPR ps Exit Reset from CKE assertion to a valid command + parameter TXPR_TCK = 5; // tXPR tCK Exit Reset from CKE assertion to a valid command + // Self Refresh + parameter TXS = 270000; // tXS ps Exit self refesh to a non-read or write command + parameter TXS_TCK = 5; // tXS tCK Exit self refesh to a non-read or write command + parameter TXSDLL = TDLLK; // tXSRD tCK Exit self refresh to a read or write command + parameter TISXR = TIS; // tISXR ps CKE setup time during self refresh exit. + parameter TCKSRE = 10000; // tCKSRE ps Valid Clock requirement after self refresh entry (SRE) + parameter TCKSRE_TCK = 5; // tCKSRE tCK Valid Clock requirement after self refresh entry (SRE) + parameter TCKSRX = 10000; // tCKSRX ps Valid Clock requirement prior to self refresh exit (SRX) + parameter TCKSRX_TCK = 5; // tCKSRX tCK Valid Clock requirement prior to self refresh exit (SRX) + parameter TCKESR_TCK = 4; // tCKESR tCK Minimum CKE low width for Self Refresh entry to exit timing + // ODT + parameter TAOF = 0.7; // tAOF tCK RTT turn-off from ODTLoff reference + parameter TAONPD = 8500; // tAONPD ps Asynchronous RTT turn-on delay (Power-Down with DLL frozen) + parameter TAOFPD = 8500; // tAONPD ps Asynchronous RTT turn-off delay (Power-Down with DLL frozen) + parameter ODTH4 = 4; // ODTH4 tCK ODT minimum HIGH time after ODT assertion or write (BL4) + parameter ODTH8 = 6; // ODTH8 tCK ODT minimum HIGH time after write (BL8) + parameter TADC = 0.7; // tADC tCK RTT dynamic change skew + // Write Levelization + parameter TWLMRD = 40; // tWLMRD tCK First DQS pulse rising edge after tDQSS margining mode is programmed + parameter TWLDQSEN = 25; // tWLDQSEN tCK DQS/DQS delay after tDQSS margining mode is programmed + parameter TWLOE = 2000; // tWLOE ps Write levelization output error + + // Size Parameters based on Part Width + + `ifdef x4 + parameter DM_BITS = 1; // Set this parameter to control how many Data Mask bits are used + parameter ADDR_BITS = 16; // MAX Address Bits + parameter ROW_BITS = 16; // Set this parameter to control how many Address bits are used + parameter COL_BITS = 11; // Set this parameter to control how many Column bits are used + parameter DQ_BITS = 4; // Set this parameter to control how many Data bits are used **Same as part bit width** + parameter DQS_BITS = 1; // Set this parameter to control how many Dqs bits are used + `elsif x8 + parameter DM_BITS = 1; // Set this parameter to control how many Data Mask bits are used + parameter ADDR_BITS = 16; // MAX Address Bits + parameter ROW_BITS = 16; // Set this parameter to control how many Address bits are used + parameter COL_BITS = 10; // Set this parameter to control how many Column bits are used + parameter DQ_BITS = 8; // Set this parameter to control how many Data bits are used **Same as part bit width** + parameter DQS_BITS = 1; // Set this parameter to control how many Dqs bits are used + `else //`define x16 + parameter DM_BITS = 2; // Set this parameter to control how many Data Mask bits are used + parameter ADDR_BITS = 15; // MAX Address Bits + parameter ROW_BITS = 15; // Set this parameter to control how many Address bits are used + parameter COL_BITS = 10; // Set this parameter to control how many Column bits are used + parameter DQ_BITS = 16; // Set this parameter to control how many Data bits are used **Same as part bit width** + parameter DQS_BITS = 2; // Set this parameter to control how many Dqs bits are used + `endif + + // Size Parameters + parameter BA_BITS = 3; // Set this parmaeter to control how many Bank Address bits are used + parameter MEM_BITS = 15; // Set this parameter to control how many write data bursts can be stored in memory. The default is 2^10=1024. + parameter AP = 10; // the address bit that controls auto-precharge and precharge-all + parameter BC = 12; // the address bit that controls burst chop + parameter BL_BITS = 3; // the number of bits required to count to BL_MAX + parameter BO_BITS = 2; // the number of Burst Order Bits + + `ifdef QUAD_RANK + parameter CS_BITS = 4; // Number of Chip Select Bits + parameter RANKS = 4; // Number of Chip Selects + `elsif DUAL_RANK + parameter CS_BITS = 2; // Number of Chip Select Bits + parameter RANKS = 2; // Number of Chip Selects + `else + parameter CS_BITS = 1; // Number of Chip Select Bits + parameter RANKS = 1; // Number of Chip Selects + `endif + + // Simulation parameters + parameter RZQ = 240; // termination resistance + parameter PRE_DEF_PAT = 8'hAA; // value returned during mpr pre-defined pattern readout + parameter STOP_ON_ERROR = 1; // If set to 1, the model will halt on command sequence/major errors + parameter DEBUG = 1; // Turn on Debug messages + parameter BUS_DELAY = 0; // delay in nanoseconds + parameter RANDOM_OUT_DELAY = 0; // If set to 1, the model will put a random amount of delay on DQ/DQS during reads + parameter RANDOM_SEED = 31913; //seed value for random generator. + + parameter RDQSEN_PRE = 2; // DQS driving time prior to first read strobe + parameter RDQSEN_PST = 1; // DQS driving time after last read strobe + parameter RDQS_PRE = 2; // DQS low time prior to first read strobe + parameter RDQS_PST = 1; // DQS low time after last read strobe + parameter RDQEN_PRE = 0; // DQ/DM driving time prior to first read data + parameter RDQEN_PST = 0; // DQ/DM driving time after last read data + parameter WDQS_PRE = 2; // DQS half clock periods prior to first write strobe + parameter WDQS_PST = 1; // DQS half clock periods after last write strobe + + // check for legal cas latency based on the cas write latency + function valid_cl; + input [3:0] cl; + input [3:0] cwl; + + case ({cwl, cl}) + `ifdef sg093 + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}, + {4'd8, 4'd11}, + {4'd9, 4'd13}, + {4'd10, 4'd14}: valid_cl = 1; + `elsif sg093E + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}, + {4'd8, 4'd10}, + {4'd8, 4'd11}, + {4'd9, 4'd12}, + {4'd9, 4'd13}, + {4'd10, 4'd13}, + {4'd10, 4'd14}: valid_cl = 1; + `elsif sg093F + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}, + {4'd8, 4'd9 }, + {4'd8, 4'd10}, + {4'd8, 4'd11}, + {4'd9, 4'd11}, + {4'd9, 4'd12}, + {4'd9, 4'd13}, + {4'd10, 4'd12}, + {4'd10, 4'd13}, + {4'd10, 4'd14}: valid_cl = 1; + `elsif sg107 + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}, + {4'd8, 4'd11}, + {4'd9, 4'd13}: valid_cl = 1; + `elsif sg107E + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}, + {4'd8, 4'd11}, + {4'd9, 4'd12}, + {4'd9, 4'd13}: valid_cl = 1; + `elsif sg107F + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}, + {4'd8, 4'd10}, + {4'd8, 4'd11}, + {4'd9, 4'd11}, + {4'd9, 4'd12}, + {4'd9, 4'd13}: valid_cl = 1; + `elsif sg125E + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}, + {4'd8, 4'd10}, + {4'd8, 4'd11}: valid_cl = 1; + `elsif sg125 + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}, + {4'd8, 4'd11}: valid_cl = 1; + `elsif sg15E + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}: valid_cl = 1; + `elsif sg15 + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd8 }, + {4'd7, 4'd10}: valid_cl = 1; + `elsif sg187E + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }: valid_cl = 1; + `elsif sg187 + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd8 }: valid_cl = 1; + `elsif sg25E + {4'd5, 4'd5 }, + {4'd5, 4'd6 }: valid_cl = 1; + `elsif sg25 + {4'd5, 4'd5 }, + {4'd5, 4'd6 }: valid_cl = 1; + `endif + default : valid_cl = 0; + endcase + endfunction + + // find the minimum valid cas write latency + function [3:0] min_cwl; + input period; + real period; + min_cwl = (period >= 2500.0) ? 5: + (period >= 1875.0) ? 6: + (period >= 1500.0) ? 7: + (period >= 1250.0) ? 8: + (period >= 1071.0) ? 9: + 10; // (period >= 938) + endfunction + + // find the minimum valid cas latency + function [3:0] min_cl; + input period; + real period; + reg [3:0] cwl; + reg [3:0] cl; + begin + cwl = min_cwl(period); + for (cl=CL_MAX; cl>=CL_MIN; cl=cl-1) begin + if (valid_cl(cl, cwl)) begin + min_cl = cl; + end + end + end + endfunction + +`elsif x2Gb // 2Gb parameters + + // SYMBOL UNITS DESCRIPTION + // ------ ----- ----------- + `ifdef sg093 // sg093 is equivalent to the JEDEC DDR3-2133 (14-14-14) speed bin + parameter TCK_MIN = 938; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 50; // tJIT(per) ps Period JItter + parameter TJIT_CC = 100; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 74; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 87; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 97; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 105; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 111; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 116; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 121; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 125; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 128; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 132; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 134; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 5; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 70; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 180; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 280; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 470; // tIPW ps Control and Address input Pulse Width + parameter TIS = 35; // tIS ps Input Setup Time + parameter TIH = 75; // tIH ps Input Hold Time + parameter TRAS_MIN = 33000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 46130; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 13090; // tRCD ps Active to Read/Write command time + parameter TRP = 13090; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 180; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 122; // tWLS ps Setup time for tDQS flop + parameter TWLH = 122; // tWLH ps Hold time of tDQS flop + parameter TWLO = 7500; // tWLO ps Write levelization output delay + parameter TAA_MIN = 13090; // TAA ps Internal READ command to first data + parameter CL_TIME = 13090; // CL ps Minimum CAS Latency + `elsif sg093E // sg093E is equivalent to the JEDEC DDR3-2133 (13-13-13) speed bin + parameter TCK_MIN = 935; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 50; // tJIT(per) ps Period JItter + parameter TJIT_CC = 100; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 74; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 87; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 97; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 105; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 111; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 116; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 121; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 125; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 128; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 132; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 134; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 5; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 70; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 175; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 280; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 470; // tIPW ps Control and Address input Pulse Width + parameter TIS = 35; // tIS ps Input Setup Time + parameter TIH = 75; // tIH ps Input Hold Time + parameter TRAS_MIN = 33000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 47155; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 12155; // tRCD ps Active to Read/Write command time + parameter TRP = 12155; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 180; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 122; // tWLS ps Setup time for tDQS flop + parameter TWLH = 122; // tWLH ps Hold time of tDQS flop + parameter TWLO = 7500; // tWLO ps Write levelization output delay + parameter TAA_MIN = 12155; // TAA ps Internal READ command to first data + parameter CL_TIME = 12155; // CL ps Minimum CAS Latency + `elsif sg093F // sg093F is equivalent to the JEDEC DDR3-2133 (12-12-12) speed bin + parameter TCK_MIN = 935; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 50; // tJIT(per) ps Period JItter + parameter TJIT_CC = 100; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 74; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 87; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 97; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 105; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 111; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 116; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 121; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 125; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 128; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 132; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 134; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 5; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 70; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 175; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 280; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 470; // tIPW ps Control and Address input Pulse Width + parameter TIS = 35; // tIS ps Input Setup Time + parameter TIH = 75; // tIH ps Input Hold Time + parameter TRAS_MIN = 33000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 46220; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 11220; // tRCD ps Active to Read/Write command time + parameter TRP = 11220; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 180; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 122; // tWLS ps Setup time for tDQS flop + parameter TWLH = 122; // tWLH ps Hold time of tDQS flop + parameter TWLO = 7500; // tWLO ps Write levelization output delay + parameter TAA_MIN = 11220; // TAA ps Internal READ command to first data + parameter CL_TIME = 11220; // CL ps Minimum CAS Latency + `elsif sg107 // sg107 is equivalent to the JEDEC DDR3-1866 (13-13-13) speed bin + parameter TCK_MIN = 1071; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 60; // tJIT(per) ps Period JItter + parameter TJIT_CC = 120; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 88; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 105; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 117; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 126; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 133; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 139; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 145; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 150; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 154; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 158; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 161; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 80; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 200; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 320; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 535; // tIPW ps Control and Address input Pulse Width + parameter TIS = 50; // tIS ps Input Setup Time + parameter TIH = 100; // tIH ps Input Hold Time + parameter TRAS_MIN = 34000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 48910; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 13910; // tRCD ps Active to Read/Write command time + parameter TRP = 13910; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 200; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 140; // tWLS ps Setup time for tDQS flop + parameter TWLH = 140; // tWLH ps Hold time of tDQS flop + parameter TWLO = 7500; // tWLO ps Write levelization output delay + parameter TAA_MIN = 13910; // TAA ps Internal READ command to first data + parameter CL_TIME = 13910; // CL ps Minimum CAS Latency + `elsif sg107E // sg107E is equivalent to the JEDEC DDR3-1866 (12-12-12) speed bin + parameter TCK_MIN = 1070; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 60; // tJIT(per) ps Period JItter + parameter TJIT_CC = 120; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 88; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 105; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 117; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 126; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 133; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 139; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 145; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 150; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 154; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 158; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 161; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 80; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 200; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 320; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 535; // tIPW ps Control and Address input Pulse Width + parameter TIS = 50; // tIS ps Input Setup Time + parameter TIH = 100; // tIH ps Input Hold Time + parameter TRAS_MIN = 34000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 47840; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 12840; // tRCD ps Active to Read/Write command time + parameter TRP = 12840; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 200; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 140; // tWLS ps Setup time for tDQS flop + parameter TWLH = 140; // tWLH ps Hold time of tDQS flop + parameter TWLO = 7500; // tWLO ps Write levelization output delay + parameter TAA_MIN = 12840; // TAA ps Internal READ command to first data + parameter CL_TIME = 12840; // CL ps Minimum CAS Latency + `elsif sg107F // sg107F is equivalent to the JEDEC DDR3-1866 (11-11-11) speed bin + parameter TCK_MIN = 1070; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 60; // tJIT(per) ps Period JItter + parameter TJIT_CC = 120; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 88; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 105; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 117; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 126; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 133; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 139; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 145; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 150; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 154; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 158; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 161; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 80; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 200; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 320; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 535; // tIPW ps Control and Address input Pulse Width + parameter TIS = 50; // tIS ps Input Setup Time + parameter TIH = 100; // tIH ps Input Hold Time + parameter TRAS_MIN = 34000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 46770; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 11770; // tRCD ps Active to Read/Write command time + parameter TRP = 11770; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 200; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 140; // tWLS ps Setup time for tDQS flop + parameter TWLH = 140; // tWLH ps Hold time of tDQS flop + parameter TWLO = 7500; // tWLO ps Write levelization output delay + parameter TAA_MIN = 11770; // TAA ps Internal READ command to first data + parameter CL_TIME = 11770; // CL ps Minimum CAS Latency + `elsif sg125E // sg125E is equivalent to the JEDEC DDR3-1600 (10-10-10) speed bin + parameter TCK_MIN = 1250; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 70; // tJIT(per) ps Period JItter + parameter TJIT_CC = 140; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 103; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 122; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 136; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 147; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 155; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 163; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 169; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 175; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 180; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 184; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 188; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 45; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 100; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 225; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 360; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 560; // tIPW ps Control and Address input Pulse Width + parameter TIS = 170; // tIS ps Input Setup Time + parameter TIH = 120; // tIH ps Input Hold Time + parameter TRAS_MIN = 35000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 47500; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 12500; // tRCD ps Active to Read/Write command time + parameter TRP = 12500; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 250; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 165; // tWLS ps Setup time for tDQS flop + parameter TWLH = 165; // tWLH ps Hold time of tDQS flop + parameter TWLO = 7500; // tWLO ps Write levelization output delay + parameter TAA_MIN = 12500; // TAA ps Internal READ command to first data + parameter CL_TIME = 12500; // CL ps Minimum CAS Latency + `elsif sg125 // sg125 is equivalent to the JEDEC DDR3-1600 (11-11-11) speed bin + parameter TCK_MIN = 1250; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 70; // tJIT(per) ps Period JItter + parameter TJIT_CC = 140; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 103; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 122; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 136; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 147; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 155; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 163; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 169; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 175; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 180; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 184; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 188; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 45; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 100; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 225; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 360; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 560; // tIPW ps Control and Address input Pulse Width + parameter TIS = 170; // tIS ps Input Setup Time + parameter TIH = 120; // tIH ps Input Hold Time + parameter TRAS_MIN = 35000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 48750; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 13750; // tRCD ps Active to Read/Write command time + parameter TRP = 13750; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 250; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 165; // tWLS ps Setup time for tDQS flop + parameter TWLH = 165; // tWLH ps Hold time of tDQS flop + parameter TWLO = 7500; // tWLO ps Write levelization output delay + parameter TAA_MIN = 13750; // TAA ps Internal READ command to first data + parameter CL_TIME = 13750; // CL ps Minimum CAS Latency + `elsif sg15E // sg15E is equivalent to the JEDEC DDR3-1333H (9-9-9) speed bin + parameter TCK_MIN = 1500; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 80; // tJIT(per) ps Period JItter + parameter TJIT_CC = 160; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 118; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 140; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 155; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 168; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 177; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 186; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 193; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 200; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 205; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 210; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 215; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 30; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 65; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 125; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 255; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 400; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 620; // tIPW ps Control and Address input Pulse Width + parameter TIS = 190; // tIS ps Input Setup Time + parameter TIH = 140; // tIH ps Input Hold Time + parameter TRAS_MIN = 36000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 49500; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 13500; // tRCD ps Active to Read/Write command time + parameter TRP = 13500; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5625; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 250; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 195; // tWLS ps Setup time for tDQS flop + parameter TWLH = 195; // tWLH ps Hold time of tDQS flop + parameter TWLO = 9000; // tWLO ps Write levelization output delay + parameter TAA_MIN = 13500; // TAA ps Internal READ command to first data + parameter CL_TIME = 13500; // CL ps Minimum CAS Latency + `elsif sg15 // sg15 is equivalent to the JEDEC DDR3-1333J (10-10-10) speed bin + parameter TCK_MIN = 1500; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 80; // tJIT(per) ps Period JItter + parameter TJIT_CC = 160; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 118; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 140; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 155; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 168; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 177; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 186; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 193; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 200; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 205; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 210; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 215; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 30; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 65; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 125; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 255; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 400; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 620; // tIPW ps Control and Address input Pulse Width + parameter TIS = 190; // tIS ps Input Setup Time + parameter TIH = 140; // tIH ps Input Hold Time + parameter TRAS_MIN = 36000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 51000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 15000; // tRCD ps Active to Read/Write command time + parameter TRP = 15000; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5625; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 250; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 195; // tWLS ps Setup time for tDQS flop + parameter TWLH = 195; // tWLH ps Hold time of tDQS flop + parameter TWLO = 9000; // tWLO ps Write levelization output delay + parameter TAA_MIN = 15000; // TAA ps Internal READ command to first data + parameter CL_TIME = 15000; // CL ps Minimum CAS Latency + `elsif sg187E // sg187E is equivalent to the JEDEC DDR3-1066F (7-7-7) speed bin + parameter TCK_MIN = 1875; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 90; // tJIT(per) ps Period JItter + parameter TJIT_CC = 180; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 132; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 157; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 175; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 188; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 200; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 209; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 217; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 224; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 231; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 237; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 242; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 75; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 100; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 150; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 300; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.38; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.38; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 490; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 780; // tIPW ps Control and Address input Pulse Width + parameter TIS = 275; // tIS ps Input Setup Time + parameter TIH = 200; // tIH ps Input Hold Time + parameter TRAS_MIN = 37500; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 50625; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 13125; // tRCD ps Active to Read/Write command time + parameter TRP = 13125; // tRP ps Precharge command period + parameter TXP = 7500; // tXP ps Exit power down to a valid command + parameter TCKE = 5625; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 300; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 245; // tWLS ps Setup time for tDQS flop + parameter TWLH = 245; // tWLH ps Hold time of tDQS flop + parameter TWLO = 9000; // tWLO ps Write levelization output delay + parameter TAA_MIN = 13125; // TAA ps Internal READ command to first data + parameter CL_TIME = 13125; // CL ps Minimum CAS Latency + `elsif sg187 // sg187 is equivalent to the JEDEC DDR3-1066G (8-8-8) speed bin + parameter TCK_MIN = 1875; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 90; // tJIT(per) ps Period JItter + parameter TJIT_CC = 180; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 132; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 157; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 175; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 188; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 200; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 209; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 217; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 224; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 231; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 237; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 242; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 75; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 100; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 150; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 300; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.38; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.38; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 490; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 780; // tIPW ps Control and Address input Pulse Width + parameter TIS = 275; // tIS ps Input Setup Time + parameter TIH = 200; // tIH ps Input Hold Time + parameter TRAS_MIN = 37500; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 52500; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 15000; // tRCD ps Active to Read/Write command time + parameter TRP = 15000; // tRP ps Precharge command period + parameter TXP = 7500; // tXP ps Exit power down to a valid command + parameter TCKE = 5625; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 300; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 245; // tWLS ps Setup time for tDQS flop + parameter TWLH = 245; // tWLH ps Hold time of tDQS flop + parameter TWLO = 9000; // tWLO ps Write levelization output delay + parameter TAA_MIN = 15000; // TAA ps Internal READ command to first data + parameter CL_TIME = 15000; // CL ps Minimum CAS Latency + `elsif sg25E // sg25E is equivalent to the JEDEC DDR3-800D (5-5-5) speed bin + parameter TCK_MIN = 2500; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 100; // tJIT(per) ps Period JItter + parameter TJIT_CC = 200; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 147; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 175; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 194; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 209; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 222; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 232; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 241; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 249; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 257; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 263; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 269; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 125; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 150; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 200; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 400; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.38; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.38; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 600; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 900; // tIPW ps Control and Address input Pulse Width + parameter TIS = 350; // tIS ps Input Setup Time + parameter TIH = 275; // tIH ps Input Hold Time + parameter TRAS_MIN = 37500; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 50000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 12500; // tRCD ps Active to Read/Write command time + parameter TRP = 12500; // tRP ps Precharge command period + parameter TXP = 7500; // tXP ps Exit power down to a valid command + parameter TCKE = 7500; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 400; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 325; // tWLS ps Setup time for tDQS flop + parameter TWLH = 325; // tWLH ps Hold time of tDQS flop + parameter TWLO = 9000; // tWLO ps Write levelization output delay + parameter TAA_MIN = 12500; // TAA ps Internal READ command to first data + parameter CL_TIME = 12500; // CL ps Minimum CAS Latency + `else //`define sg25 // sg25 is equivalent to the JEDEC DDR3-800E (6-6-6) speed bin + parameter TCK_MIN = 2500; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 100; // tJIT(per) ps Period JItter + parameter TJIT_CC = 200; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 147; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 175; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 194; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 209; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 222; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 232; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 241; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 249; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 257; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 263; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 269; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 125; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 150; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 200; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 400; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.38; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.38; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 600; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 900; // tIPW ps Control and Address input Pulse Width + parameter TIS = 350; // tIS ps Input Setup Time + parameter TIH = 275; // tIH ps Input Hold Time + parameter TRAS_MIN = 37500; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 52500; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 15000; // tRCD ps Active to Read/Write command time + parameter TRP = 15000; // tRP ps Precharge command period + parameter TXP = 7500; // tXP ps Exit power down to a valid command + parameter TCKE = 7500; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 400; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 325; // tWLS ps Setup time for tDQS flop + parameter TWLH = 325; // tWLH ps Hold time of tDQS flop + parameter TWLO = 9000; // tWLO ps Write levelization output delay + parameter TAA_MIN = 15000; // TAA ps Internal READ command to first data + parameter CL_TIME = 15000; // CL ps Minimum CAS Latency + `endif + + parameter TDQSCK_DLLDIS = TDQSCK; // tDQSCK ps for DLLDIS mode, timing not guaranteed + + `ifdef x16 + `ifdef sg093 + parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg093E + parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg093F + parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg107 + parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg107E + parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg107F + parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg125E + parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 40000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg125 + parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 40000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg15E + parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 45000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg15 + parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 45000; // tFAW ps (2KB page size) Four Bank Activate window + `else // sg187E, sg187, sg25, sg25E + parameter TRRD = 10000; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 50000; // tFAW ps (2KB page size) Four Bank Activate window + `endif + `else // x4, x8 + `ifdef sg093 + parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg093E + parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg093F + parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg107 + parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg107E + parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg107F + parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg125E + parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg125 + parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg15E + parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg15 + parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg187E + parameter TRRD = 7500; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 37500; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg187 + parameter TRRD = 7500; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 37500; // tFAW ps (1KB page size) Four Bank Activate window + `else // sg25, sg25E + parameter TRRD = 10000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 40000; // tFAW ps (1KB page size) Four Bank Activate window + `endif + `endif + + // Timing Parameters + + // Mode Register + parameter CL_MIN = 5; // CL tCK Minimum CAS Latency + parameter CL_MAX = 14; // CL tCK Maximum CAS Latency + parameter AL_MIN = 0; // AL tCK Minimum Additive Latency + parameter AL_MAX = 2; // AL tCK Maximum Additive Latency + parameter WR_MIN = 5; // WR tCK Minimum Write Recovery + parameter WR_MAX = 16; // WR tCK Maximum Write Recovery + parameter BL_MIN = 4; // BL tCK Minimum Burst Length + parameter BL_MAX = 8; // BL tCK Minimum Burst Length + parameter CWL_MIN = 5; // CWL tCK Minimum CAS Write Latency + parameter CWL_MAX = 10; // CWL tCK Maximum CAS Write Latency + + // Clock + parameter TCK_MAX = 3300; // tCK ps Maximum Clock Cycle Time + parameter TCH_AVG_MIN = 0.47; // tCH tCK Minimum Clock High-Level Pulse Width + parameter TCL_AVG_MIN = 0.47; // tCL tCK Minimum Clock Low-Level Pulse Width + parameter TCH_AVG_MAX = 0.53; // tCH tCK Maximum Clock High-Level Pulse Width + parameter TCL_AVG_MAX = 0.53; // tCL tCK Maximum Clock Low-Level Pulse Width + parameter TCH_ABS_MIN = 0.43; // tCH tCK Minimum Clock High-Level Pulse Width + parameter TCL_ABS_MIN = 0.43; // tCL tCK Maximum Clock Low-Level Pulse Width + parameter TCKE_TCK = 3; // tCKE tCK CKE minimum high or low pulse width + parameter TAA_MAX = 20000; // TAA ps Internal READ command to first data + + // Data OUT + parameter TQH = 0.38; // tQH ps DQ output hold time from DQS, DQS# + // Data Strobe OUT + parameter TRPRE = 0.90; // tRPRE tCK DQS Read Preamble + parameter TRPST = 0.30; // tRPST tCK DQS Read Postamble + // Data Strobe IN + parameter TDQSH = 0.45; // tDQSH tCK DQS input High Pulse Width + parameter TDQSL = 0.45; // tDQSL tCK DQS input Low Pulse Width + parameter TWPRE = 0.90; // tWPRE tCK DQS Write Preamble + parameter TWPST = 0.30; // tWPST tCK DQS Write Postamble + // Command and Address + integer TZQCS; // tZQCS tCK ZQ Cal (Short) time + integer TZQINIT = max(512, ceil(640000/TCK_MIN)); // tZQinit tCK ZQ Cal (Long) time + integer TZQOPER = max(256, ceil(320000/TCK_MIN)); // tZQoper tCK ZQ Cal (Long) time + parameter TCCD = 4; // tCCD tCK Cas to Cas command delay + parameter TCCD_DG = 2; // tCCD_DG tCK Cas to Cas command delay to different group + parameter TRAS_MAX = 60e9; // tRAS ps Maximum Active to Precharge command time + parameter TWR = 15000; // tWR ps Write recovery time + parameter TMRD = 4; // tMRD tCK Load Mode Register command cycle time + parameter TMOD = 15000; // tMOD ps LOAD MODE to non-LOAD MODE command cycle time + parameter TMOD_TCK = 12; // tMOD tCK LOAD MODE to non-LOAD MODE command cycle time + parameter TRRD_TCK = 4; // tRRD tCK Active bank a to Active bank b command time + parameter TRRD_DG = 3000; // tRRD_DG ps Active bank a to Active bank b command time to different group + parameter TRRD_DG_TCK = 2; // tRRD_DG tCK Active bank a to Active bank b command time to different group + parameter TRTP = 7500; // tRTP ps Read to Precharge command delay + parameter TRTP_TCK = 4; // tRTP tCK Read to Precharge command delay + parameter TWTR = 7500; // tWTR ps Write to Read command delay + parameter TWTR_DG = 3750; // tWTR_DG ps Write to Read command delay to different group + parameter TWTR_TCK = 4; // tWTR tCK Write to Read command delay + parameter TWTR_DG_TCK = 2; // tWTR_DG tCK Write to Read command delay to different group + parameter TDLLK = 512; // tDLLK tCK DLL locking time + // Refresh - 2Gb + parameter TRFC_MIN = 160000; // tRFC ps Refresh to Refresh Command interval minimum value + parameter TRFC_MAX =70200000; // tRFC ps Refresh to Refresh Command Interval maximum value + // Power Down + parameter TXP_TCK = 3; // tXP tCK Exit power down to a valid command + parameter TXPDLL = 24000; // tXPDLL ps Exit precharge power down to READ or WRITE command (DLL-off mode) + parameter TXPDLL_TCK = 10; // tXPDLL tCK Exit precharge power down to READ or WRITE command (DLL-off mode) + parameter TACTPDEN = 1; // tACTPDEN tCK Timing of last ACT command to power down entry + parameter TPRPDEN = 1; // tPREPDEN tCK Timing of last PRE command to power down entry + parameter TREFPDEN = 1; // tARPDEN tCK Timing of last REFRESH command to power down entry + parameter TCPDED = 1; // tCPDED tCK Command pass disable/enable delay + parameter TPD_MAX =TRFC_MAX; // tPD ps Power-down entry-to-exit timing + parameter TXPR = 170000; // tXPR ps Exit Reset from CKE assertion to a valid command + parameter TXPR_TCK = 5; // tXPR tCK Exit Reset from CKE assertion to a valid command + // Self Refresh + parameter TXS = 170000; // tXS ps Exit self refesh to a non-read or write command + parameter TXS_TCK = 5; // tXS tCK Exit self refesh to a non-read or write command + parameter TXSDLL = TDLLK; // tXSRD tCK Exit self refresh to a read or write command + parameter TISXR = TIS; // tISXR ps CKE setup time during self refresh exit. + parameter TCKSRE = 10000; // tCKSRE ps Valid Clock requirement after self refresh entry (SRE) + parameter TCKSRE_TCK = 5; // tCKSRE tCK Valid Clock requirement after self refresh entry (SRE) + parameter TCKSRX = 10000; // tCKSRX ps Valid Clock requirement prior to self refresh exit (SRX) + parameter TCKSRX_TCK = 5; // tCKSRX tCK Valid Clock requirement prior to self refresh exit (SRX) + parameter TCKESR_TCK = 4; // tCKESR tCK Minimum CKE low width for Self Refresh entry to exit timing + // ODT + parameter TAOF = 0.7; // tAOF tCK RTT turn-off from ODTLoff reference + parameter TAONPD = 8500; // tAONPD ps Asynchronous RTT turn-on delay (Power-Down with DLL frozen) + parameter TAOFPD = 8500; // tAONPD ps Asynchronous RTT turn-off delay (Power-Down with DLL frozen) + parameter ODTH4 = 4; // ODTH4 tCK ODT minimum HIGH time after ODT assertion or write (BL4) + parameter ODTH8 = 6; // ODTH8 tCK ODT minimum HIGH time after write (BL8) + parameter TADC = 0.7; // tADC tCK RTT dynamic change skew + // Write Levelization + parameter TWLMRD = 40; // tWLMRD tCK First DQS pulse rising edge after tDQSS margining mode is programmed + parameter TWLDQSEN = 25; // tWLDQSEN tCK DQS/DQS delay after tDQSS margining mode is programmed + parameter TWLOE = 2000; // tWLOE ps Write levelization output error + + // Size Parameters based on Part Width + + `ifdef x4 + parameter DM_BITS = 1; // Set this parameter to control how many Data Mask bits are used + parameter ADDR_BITS = 15; // MAX Address Bits + parameter ROW_BITS = 15; // Set this parameter to control how many Address bits are used + parameter COL_BITS = 11; // Set this parameter to control how many Column bits are used + parameter DQ_BITS = 4; // Set this parameter to control how many Data bits are used **Same as part bit width** + parameter DQS_BITS = 1; // Set this parameter to control how many Dqs bits are used + `elsif x8 + parameter DM_BITS = 1; // Set this parameter to control how many Data Mask bits are used + parameter ADDR_BITS = 15; // MAX Address Bits + parameter ROW_BITS = 15; // Set this parameter to control how many Address bits are used + parameter COL_BITS = 10; // Set this parameter to control how many Column bits are used + parameter DQ_BITS = 8; // Set this parameter to control how many Data bits are used **Same as part bit width** + parameter DQS_BITS = 1; // Set this parameter to control how many Dqs bits are used + `else //`define x16 + parameter DM_BITS = 2; // Set this parameter to control how many Data Mask bits are used + parameter ADDR_BITS = 14; // MAX Address Bits + parameter ROW_BITS = 14; // Set this parameter to control how many Address bits are used + parameter COL_BITS = 10; // Set this parameter to control how many Column bits are used + parameter DQ_BITS = 16; // Set this parameter to control how many Data bits are used **Same as part bit width** + parameter DQS_BITS = 2; // Set this parameter to control how many Dqs bits are used + `endif + + // Size Parameters + parameter BA_BITS = 3; // Set this parmaeter to control how many Bank Address bits are used + parameter MEM_BITS = 15; // Set this parameter to control how many write data bursts can be stored in memory. The default is 2^10=1024. + parameter AP = 10; // the address bit that controls auto-precharge and precharge-all + parameter BC = 12; // the address bit that controls burst chop + parameter BL_BITS = 3; // the number of bits required to count to BL_MAX + parameter BO_BITS = 2; // the number of Burst Order Bits + + `ifdef QUAD_RANK + `define DUAL_RANK // also define DUAL_RANK + parameter CS_BITS = 4; // Number of Chip Select Bits + parameter RANKS = 4; // Number of Chip Selects + `elsif DUAL_RANK + parameter CS_BITS = 2; // Number of Chip Select Bits + parameter RANKS = 2; // Number of Chip Selects + `else + parameter CS_BITS = 1; // Number of Chip Select Bits + parameter RANKS = 1; // Number of Chip Selects + `endif + + // Simulation parameters + parameter RZQ = 240; // termination resistance + parameter PRE_DEF_PAT = 8'hAA; // value returned during mpr pre-defined pattern readout + parameter STOP_ON_ERROR = 1; // If set to 1, the model will halt on command sequence/major errors + parameter DEBUG = 1; // Turn on Debug messages + parameter BUS_DELAY = 0; // delay in nanoseconds + parameter RANDOM_OUT_DELAY = 0; // If set to 1, the model will put a random amount of delay on DQ/DQS during reads + parameter RANDOM_SEED = 31913; //seed value for random generator. + + parameter RDQSEN_PRE = 2; // DQS driving time prior to first read strobe + parameter RDQSEN_PST = 1; // DQS driving time after last read strobe + parameter RDQS_PRE = 2; // DQS low time prior to first read strobe + parameter RDQS_PST = 1; // DQS low time after last read strobe + parameter RDQEN_PRE = 0; // DQ/DM driving time prior to first read data + parameter RDQEN_PST = 0; // DQ/DM driving time after last read data + parameter WDQS_PRE = 2; // DQS half clock periods prior to first write strobe + parameter WDQS_PST = 1; // DQS half clock periods after last write strobe + + // check for legal cas latency based on the cas write latency + function valid_cl; + input [3:0] cl; + input [3:0] cwl; + + case ({cwl, cl}) + `ifdef sg093 + {4'd5 , 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}, + {4'd8, 4'd11}, + {4'd9, 4'd13}, + {4'd10, 4'd14}: valid_cl = 1; + `elsif sg093E + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}, + {4'd8, 4'd10}, + {4'd8, 4'd11}, + {4'd9, 4'd12}, + {4'd9, 4'd13}, + {4'd10, 4'd13}, + {4'd10, 4'd14}: valid_cl = 1; + `elsif sg093F + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}, + {4'd8, 4'd9 }, + {4'd8, 4'd10}, + {4'd8, 4'd11}, + {4'd9, 4'd11}, + {4'd9, 4'd12}, + {4'd9, 4'd13}, + {4'd10, 4'd12}, + {4'd10, 4'd13}, + {4'd10, 4'd14}: valid_cl = 1; + `elsif sg107 + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}, + {4'd8, 4'd11}, + {4'd9, 4'd13}: valid_cl = 1; + `elsif sg107E + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}, + {4'd8, 4'd11}, + {4'd9, 4'd12}, + {4'd9, 4'd13}: valid_cl = 1; + `elsif sg107F + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}, + {4'd8, 4'd10}, + {4'd8, 4'd11}, + {4'd9, 4'd11}, + {4'd9, 4'd12}, + {4'd9, 4'd13}: valid_cl = 1; + `elsif sg125E + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}, + {4'd8, 4'd10}, + {4'd8, 4'd11}: valid_cl = 1; + `elsif sg125 + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}, + {4'd8, 4'd11}: valid_cl = 1; + `elsif sg15E + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}: valid_cl = 1; + `elsif sg15 + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd8 }, + {4'd7, 4'd10}: valid_cl = 1; + `elsif sg187E + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }: valid_cl = 1; + `elsif sg187 + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd8 }: valid_cl = 1; + `elsif sg25E + {4'd5, 4'd5 }, + {4'd5, 4'd6 }: valid_cl = 1; + `elsif sg25 + {4'd5, 4'd5 }, + {4'd5, 4'd6 }: valid_cl = 1; + `endif + default : valid_cl = 0; + endcase + endfunction + + // find the minimum valid cas write latency + function [3:0] min_cwl; + input period; + real period; + min_cwl = (period >= 2500.0) ? 5: + (period >= 1875.0) ? 6: + (period >= 1500.0) ? 7: + (period >= 1250.0) ? 8: + (period >= 1071.0) ? 9: + 10; // (period >= 938) + endfunction + + // find the minimum valid cas latency + function [3:0] min_cl; + input period; + real period; + reg [3:0] cwl; + reg [3:0] cl; + begin + cwl = min_cwl(period); + for (cl=CL_MAX; cl>=CL_MIN; cl=cl-1) begin + if (valid_cl(cl, cwl)) begin + min_cl = cl; + end + end + end + endfunction + + +`else //`define x1Gb // 1Gb parts + + // SYMBOL UNITS DESCRIPTION + // ------ ----- ----------- + `ifdef sg093 // sg093 is equivalent to the JEDEC DDR3-2133 (14-14-14) speed bin + parameter TCK_MIN = 938; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 50; // tJIT(per) ps Period JItter + parameter TJIT_CC = 100; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 74; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 87; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 97; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 105; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 111; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 116; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 121; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 125; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 128; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 132; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 134; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 5; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 70; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 180; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 280; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 470; // tIPW ps Control and Address input Pulse Width + parameter TIS = 35; // tIS ps Input Setup Time + parameter TIH = 75; // tIH ps Input Hold Time + parameter TRAS_MIN = 33000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 46130; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 13090; // tRCD ps Active to Read/Write command time + parameter TRP = 13090; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 180; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 122; // tWLS ps Setup time for tDQS flop + parameter TWLH = 122; // tWLH ps Hold time of tDQS flop + parameter TWLO = 7500; // tWLO ps Write levelization output delay + parameter TAA_MIN = 13090; // TAA ps Internal READ command to first data + parameter CL_TIME = 13090; // CL ps Minimum CAS Latency + `elsif sg093E // sg093E is equivalent to the JEDEC DDR3-2133 (13-13-13) speed bin + parameter TCK_MIN = 935; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 50; // tJIT(per) ps Period JItter + parameter TJIT_CC = 100; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 74; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 87; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 97; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 105; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 111; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 116; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 121; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 125; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 128; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 132; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 134; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 5; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 70; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 175; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 280; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 470; // tIPW ps Control and Address input Pulse Width + parameter TIS = 35; // tIS ps Input Setup Time + parameter TIH = 75; // tIH ps Input Hold Time + parameter TRAS_MIN = 33000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 47155; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 12155; // tRCD ps Active to Read/Write command time + parameter TRP = 12155; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 180; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 122; // tWLS ps Setup time for tDQS flop + parameter TWLH = 122; // tWLH ps Hold time of tDQS flop + parameter TWLO = 7500; // tWLO ps Write levelization output delay + parameter TAA_MIN = 12155; // TAA ps Internal READ command to first data + parameter CL_TIME = 12155; // CL ps Minimum CAS Latency + `elsif sg093F // sg093F is equivalent to the JEDEC DDR3-2133 (12-12-12) speed bin + parameter TCK_MIN = 935; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 50; // tJIT(per) ps Period JItter + parameter TJIT_CC = 100; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 74; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 87; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 97; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 105; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 111; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 116; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 121; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 125; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 128; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 132; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 134; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 5; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 70; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 175; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 280; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 470; // tIPW ps Control and Address input Pulse Width + parameter TIS = 35; // tIS ps Input Setup Time + parameter TIH = 75; // tIH ps Input Hold Time + parameter TRAS_MIN = 33000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 46220; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 11220; // tRCD ps Active to Read/Write command time + parameter TRP = 11220; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 180; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 122; // tWLS ps Setup time for tDQS flop + parameter TWLH = 122; // tWLH ps Hold time of tDQS flop + parameter TWLO = 7500; // tWLO ps Write levelization output delay + parameter TAA_MIN = 11220; // TAA ps Internal READ command to first data + parameter CL_TIME = 11220; // CL ps Minimum CAS Latency + `elsif sg107 // sg107 is equivalent to the JEDEC DDR3-1866 (13-13-13) speed bin + parameter TCK_MIN = 1071; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 60; // tJIT(per) ps Period JItter + parameter TJIT_CC = 120; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 88; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 105; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 117; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 126; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 133; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 139; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 145; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 150; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 154; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 158; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 161; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 80; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 200; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 320; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 535; // tIPW ps Control and Address input Pulse Width + parameter TIS = 50; // tIS ps Input Setup Time + parameter TIH = 100; // tIH ps Input Hold Time + parameter TRAS_MIN = 34000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 48910; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 13910; // tRCD ps Active to Read/Write command time + parameter TRP = 13910; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 200; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 140; // tWLS ps Setup time for tDQS flop + parameter TWLH = 140; // tWLH ps Hold time of tDQS flop + parameter TWLO = 7500; // tWLO ps Write levelization output delay + parameter TAA_MIN = 13910; // TAA ps Internal READ command to first data + parameter CL_TIME = 13910; // CL ps Minimum CAS Latency + `elsif sg107E // sg107E is equivalent to the JEDEC DDR3-1866 (12-12-12) speed bin + parameter TCK_MIN = 1070; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 60; // tJIT(per) ps Period JItter + parameter TJIT_CC = 120; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 88; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 105; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 117; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 126; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 133; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 139; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 145; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 150; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 154; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 158; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 161; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 80; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 200; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 320; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 535; // tIPW ps Control and Address input Pulse Width + parameter TIS = 50; // tIS ps Input Setup Time + parameter TIH = 100; // tIH ps Input Hold Time + parameter TRAS_MIN = 34000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 47840; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 12840; // tRCD ps Active to Read/Write command time + parameter TRP = 12840; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 200; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 140; // tWLS ps Setup time for tDQS flop + parameter TWLH = 140; // tWLH ps Hold time of tDQS flop + parameter TWLO = 7500; // tWLO ps Write levelization output delay + parameter TAA_MIN = 12840; // TAA ps Internal READ command to first data + parameter CL_TIME = 12840; // CL ps Minimum CAS Latency + `elsif sg107F // sg107F is equivalent to the JEDEC DDR3-1866 (11-11-11) speed bin + parameter TCK_MIN = 1070; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 60; // tJIT(per) ps Period JItter + parameter TJIT_CC = 120; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 88; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 105; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 117; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 126; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 133; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 139; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 145; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 150; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 154; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 158; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 161; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 80; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 200; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 320; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 535; // tIPW ps Control and Address input Pulse Width + parameter TIS = 50; // tIS ps Input Setup Time + parameter TIH = 100; // tIH ps Input Hold Time + parameter TRAS_MIN = 34000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 46770; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 11770; // tRCD ps Active to Read/Write command time + parameter TRP = 11770; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 200; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 140; // tWLS ps Setup time for tDQS flop + parameter TWLH = 140; // tWLH ps Hold time of tDQS flop + parameter TWLO = 7500; // tWLO ps Write levelization output delay + parameter TAA_MIN = 11770; // TAA ps Internal READ command to first data + parameter CL_TIME = 11770; // CL ps Minimum CAS Latency + `elsif sg125E // sg125E is equivalent to the JEDEC DDR3-1600 (10-10-10) speed bin + parameter TCK_MIN = 1250; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 70; // tJIT(per) ps Period JItter + parameter TJIT_CC = 140; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 103; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 122; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 136; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 147; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 155; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 163; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 169; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 175; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 180; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 184; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 188; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 45; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 100; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 225; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 360; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 560; // tIPW ps Control and Address input Pulse Width + parameter TIS = 170; // tIS ps Input Setup Time + parameter TIH = 120; // tIH ps Input Hold Time + parameter TRAS_MIN = 35000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 47500; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 12500; // tRCD ps Active to Read/Write command time + parameter TRP = 12500; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 250; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 165; // tWLS ps Setup time for tDQS flop + parameter TWLH = 165; // tWLH ps Hold time of tDQS flop + parameter TWLO = 7500; // tWLO ps Write levelization output delay + parameter TAA_MIN = 12500; // TAA ps Internal READ command to first data + parameter CL_TIME = 12500; // CL ps Minimum CAS Latency + `elsif sg125 // sg125 is equivalent to the JEDEC DDR3-1600 (11-11-11) speed bin + parameter TCK_MIN = 1250; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 70; // tJIT(per) ps Period JItter + parameter TJIT_CC = 140; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 103; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 122; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 136; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 147; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 155; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 163; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 169; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 175; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 180; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 184; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 188; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 45; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 100; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 225; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 360; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 560; // tIPW ps Control and Address input Pulse Width + parameter TIS = 170; // tIS ps Input Setup Time + parameter TIH = 120; // tIH ps Input Hold Time + parameter TRAS_MIN = 35000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 48750; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 13750; // tRCD ps Active to Read/Write command time + parameter TRP = 13750; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 250; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 165; // tWLS ps Setup time for tDQS flop + parameter TWLH = 165; // tWLH ps Hold time of tDQS flop + parameter TWLO = 7500; // tWLO ps Write levelization output delay + parameter TAA_MIN = 13750; // TAA ps Internal READ command to first data + parameter CL_TIME = 13750; // CL ps Minimum CAS Latency + `elsif sg15E // sg15E is equivalent to the JEDEC DDR3-1333H (9-9-9) speed bin + parameter TCK_MIN = 1500; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 80; // tJIT(per) ps Period JItter + parameter TJIT_CC = 160; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 118; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 140; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 155; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 168; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 177; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 186; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 193; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 200; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 205; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 210; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 215; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 30; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 65; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 125; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 255; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 400; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 620; // tIPW ps Control and Address input Pulse Width + parameter TIS = 190; // tIS ps Input Setup Time + parameter TIH = 140; // tIH ps Input Hold Time + parameter TRAS_MIN = 36000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 49500; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 13500; // tRCD ps Active to Read/Write command time + parameter TRP = 13500; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5625; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 250; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 195; // tWLS ps Setup time for tDQS flop + parameter TWLH = 195; // tWLH ps Hold time of tDQS flop + parameter TWLO = 9000; // tWLO ps Write levelization output delay + parameter TAA_MIN = 13500; // TAA ps Internal READ command to first data + parameter CL_TIME = 13500; // CL ps Minimum CAS Latency + `elsif sg15 // sg15 is equivalent to the JEDEC DDR3-1333J (10-10-10) speed bin + parameter TCK_MIN = 1500; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 80; // tJIT(per) ps Period JItter + parameter TJIT_CC = 160; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 118; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 140; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 155; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 168; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 177; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 186; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 193; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 200; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 205; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 210; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 215; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 30; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 65; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 125; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 255; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 400; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 620; // tIPW ps Control and Address input Pulse Width + parameter TIS = 190; // tIS ps Input Setup Time + parameter TIH = 140; // tIH ps Input Hold Time + parameter TRAS_MIN = 36000; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 51000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 15000; // tRCD ps Active to Read/Write command time + parameter TRP = 15000; // tRP ps Precharge command period + parameter TXP = 6000; // tXP ps Exit power down to a valid command + parameter TCKE = 5625; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 250; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 195; // tWLS ps Setup time for tDQS flop + parameter TWLH = 195; // tWLH ps Hold time of tDQS flop + parameter TWLO = 9000; // tWLO ps Write levelization output delay + parameter TAA_MIN = 15000; // TAA ps Internal READ command to first data + parameter CL_TIME = 15000; // CL ps Minimum CAS Latency + `elsif sg187E // sg187E is equivalent to the JEDEC DDR3-1066F (7-7-7) speed bin + parameter TCK_MIN = 1875; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 90; // tJIT(per) ps Period JItter + parameter TJIT_CC = 180; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 132; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 157; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 175; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 188; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 200; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 209; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 217; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 224; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 231; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 237; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 242; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 75; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 100; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 150; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 300; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.38; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.38; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 490; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 780; // tIPW ps Control and Address input Pulse Width + parameter TIS = 275; // tIS ps Input Setup Time + parameter TIH = 200; // tIH ps Input Hold Time + parameter TRAS_MIN = 37500; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 50625; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 13125; // tRCD ps Active to Read/Write command time + parameter TRP = 13125; // tRP ps Precharge command period + parameter TXP = 7500; // tXP ps Exit power down to a valid command + parameter TCKE = 5625; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 300; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 245; // tWLS ps Setup time for tDQS flop + parameter TWLH = 245; // tWLH ps Hold time of tDQS flop + parameter TWLO = 9000; // tWLO ps Write levelization output delay + parameter TAA_MIN = 13125; // TAA ps Internal READ command to first data + parameter CL_TIME = 13125; // CL ps Minimum CAS Latency + `elsif sg187 // sg187 is equivalent to the JEDEC DDR3-1066G (8-8-8) speed bin + parameter TCK_MIN = 1875; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 90; // tJIT(per) ps Period JItter + parameter TJIT_CC = 180; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 132; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 157; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 175; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 188; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 200; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 209; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 217; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 224; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 231; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 237; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 242; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 75; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 100; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 150; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 300; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.38; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.38; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 490; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 780; // tIPW ps Control and Address input Pulse Width + parameter TIS = 275; // tIS ps Input Setup Time + parameter TIH = 200; // tIH ps Input Hold Time + parameter TRAS_MIN = 37500; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 52500; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 15000; // tRCD ps Active to Read/Write command time + parameter TRP = 15000; // tRP ps Precharge command period + parameter TXP = 7500; // tXP ps Exit power down to a valid command + parameter TCKE = 5625; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 300; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 245; // tWLS ps Setup time for tDQS flop + parameter TWLH = 245; // tWLH ps Hold time of tDQS flop + parameter TWLO = 9000; // tWLO ps Write levelization output delay + parameter TAA_MIN = 15000; // TAA ps Internal READ command to first data + parameter CL_TIME = 15000; // CL ps Minimum CAS Latency + `elsif sg25E // sg25E is equivalent to the JEDEC DDR3-800E (5-5-5) speed bin + parameter TCK_MIN = 2500; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 100; // tJIT(per) ps Period JItter + parameter TJIT_CC = 200; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 147; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 175; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 194; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 209; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 222; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 232; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 241; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 249; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 257; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 263; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 269; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 125; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 150; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 200; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 400; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.38; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.38; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 600; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 900; // tIPW ps Control and Address input Pulse Width + parameter TIS = 350; // tIS ps Input Setup Time + parameter TIH = 275; // tIH ps Input Hold Time + parameter TRAS_MIN = 37500; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 50000; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 12500; // tRCD ps Active to Read/Write command time + parameter TRP = 12500; // tRP ps Precharge command period + parameter TXP = 7500; // tXP ps Exit power down to a valid command + parameter TCKE = 7500; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 400; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 325; // tWLS ps Setup time for tDQS flop + parameter TWLH = 325; // tWLH ps Hold time of tDQS flop + parameter TWLO = 9000; // tWLO ps Write levelization output delay + parameter TAA_MIN = 12500; // TAA ps Internal READ command to first data + parameter CL_TIME = 12500; // CL ps Minimum CAS Latency + `else //`define sg25 // sg25 is equivalent to the JEDEC DDR3-800 (6-6-6) speed bin + parameter TCK_MIN = 2500; // tCK ps Minimum Clock Cycle Time + parameter TJIT_PER = 100; // tJIT(per) ps Period JItter + parameter TJIT_CC = 200; // tJIT(cc) ps Cycle to Cycle jitter + parameter TERR_2PER = 147; // tERR(2per) ps Accumulated Error (2-cycle) + parameter TERR_3PER = 175; // tERR(3per) ps Accumulated Error (3-cycle) + parameter TERR_4PER = 194; // tERR(4per) ps Accumulated Error (4-cycle) + parameter TERR_5PER = 209; // tERR(5per) ps Accumulated Error (5-cycle) + parameter TERR_6PER = 222; // tERR(6per) ps Accumulated Error (6-cycle) + parameter TERR_7PER = 232; // tERR(7per) ps Accumulated Error (7-cycle) + parameter TERR_8PER = 241; // tERR(8per) ps Accumulated Error (8-cycle) + parameter TERR_9PER = 249; // tERR(9per) ps Accumulated Error (9-cycle) + parameter TERR_10PER = 257; // tERR(10per)ps Accumulated Error (10-cycle) + parameter TERR_11PER = 263; // tERR(11per)ps Accumulated Error (11-cycle) + parameter TERR_12PER = 269; // tERR(12per)ps Accumulated Error (12-cycle) + parameter TDS = 125; // tDS ps DQ and DM input setup time relative to DQS + parameter TDH = 150; // tDH ps DQ and DM input hold time relative to DQS + parameter TDQSQ = 200; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access + parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition + parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) + parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) + parameter TDQSCK = 400; // tDQSCK ps DQS output access time from CK/CK# + parameter TQSH = 0.38; // tQSH tCK DQS Output High Pulse Width + parameter TQSL = 0.38; // tQSL tCK DQS Output Low Pulse Width + parameter TDIPW = 600; // tDIPW ps DQ and DM input Pulse Width + parameter TIPW = 900; // tIPW ps Control and Address input Pulse Width + parameter TIS = 350; // tIS ps Input Setup Time + parameter TIH = 275; // tIH ps Input Hold Time + parameter TRAS_MIN = 37500; // tRAS ps Minimum Active to Precharge command time + parameter TRC = 52500; // tRC ps Active to Active/Auto Refresh command time + parameter TRCD = 15000; // tRCD ps Active to Read/Write command time + parameter TRP = 15000; // tRP ps Precharge command period + parameter TXP = 7500; // tXP ps Exit power down to a valid command + parameter TCKE = 7500; // tCKE ps CKE minimum high or low pulse width + parameter TAON = 400; // tAON ps RTT turn-on from ODTLon reference + parameter TWLS = 325; // tWLS ps Setup time for tDQS flop + parameter TWLH = 325; // tWLH ps Hold time of tDQS flop + parameter TWLO = 9000; // tWLO ps Write levelization output delay + parameter TAA_MIN = 15000; // TAA ps Internal READ command to first data + parameter CL_TIME = 15000; // CL ps Minimum CAS Latency + `endif + + parameter TDQSCK_DLLDIS = TDQSCK; // tDQSCK ps for DLLDIS mode, timing not guaranteed + + `ifdef x16 + `ifdef sg093 + parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg093E + parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg093F + parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg107 + parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg107E + parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg107F + parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg125E + parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 40000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg125 + parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 40000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg15E + parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 45000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg15 + parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 45000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg187E + parameter TRRD = 10000; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 50000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg187 + parameter TRRD = 10000; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 50000; // tFAW ps (2KB page size) Four Bank Activate window + `elsif sg25E + parameter TRRD = 10000; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 50000; // tFAW ps (2KB page size) Four Bank Activate window + `else // sg25 + parameter TRRD = 10000; // tRRD ps (2KB page size) Active bank a to Active bank b command time + parameter TFAW = 50000; // tFAW ps (2KB page size) Four Bank Activate window + `endif + `else // x4, x8 + `ifdef sg093 + parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg093E + parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg093F + parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg107 + parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg107E + parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg107F + parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg125E + parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg125 + parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg15E + parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg15 + parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg187E + parameter TRRD = 7500; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 37500; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg187 + parameter TRRD = 7500; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 37500; // tFAW ps (1KB page size) Four Bank Activate window + `elsif sg25E + parameter TRRD = 10000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 40000; // tFAW ps (1KB page size) Four Bank Activate window + `else // sg25 + parameter TRRD = 10000; // tRRD ps (1KB page size) Active bank a to Active bank b command time + parameter TFAW = 40000; // tFAW ps (1KB page size) Four Bank Activate window + `endif + `endif + + // Timing Parameters + + // Mode Register + parameter CL_MIN = 5; // CL tCK Minimum CAS Latency + parameter CL_MAX = 14; // CL tCK Maximum CAS Latency + parameter AL_MIN = 0; // AL tCK Minimum Additive Latency + parameter AL_MAX = 2; // AL tCK Maximum Additive Latency + parameter WR_MIN = 5; // WR tCK Minimum Write Recovery + parameter WR_MAX = 16; // WR tCK Maximum Write Recovery + parameter BL_MIN = 4; // BL tCK Minimum Burst Length + parameter BL_MAX = 8; // BL tCK Minimum Burst Length + parameter CWL_MIN = 5; // CWL tCK Minimum CAS Write Latency + parameter CWL_MAX = 10; // CWL tCK Maximum CAS Write Latency + + // Clock + parameter TCK_MAX = 3300; // tCK ps Maximum Clock Cycle Time + parameter TCH_AVG_MIN = 0.47; // tCH tCK Minimum Clock High-Level Pulse Width + parameter TCL_AVG_MIN = 0.47; // tCL tCK Minimum Clock Low-Level Pulse Width + parameter TCH_AVG_MAX = 0.53; // tCH tCK Maximum Clock High-Level Pulse Width + parameter TCL_AVG_MAX = 0.53; // tCL tCK Maximum Clock Low-Level Pulse Width + parameter TCH_ABS_MIN = 0.43; // tCH tCK Minimum Clock High-Level Pulse Width + parameter TCL_ABS_MIN = 0.43; // tCL tCK Maximum Clock Low-Level Pulse Width + parameter TCKE_TCK = 3; // tCKE tCK CKE minimum high or low pulse width + parameter TAA_MAX = 20000; // TAA ps Internal READ command to first data + + // Data OUT + parameter TQH = 0.38; // tQH ps DQ output hold time from DQS, DQS# + // Data Strobe OUT + parameter TRPRE = 0.90; // tRPRE tCK DQS Read Preamble + parameter TRPST = 0.30; // tRPST tCK DQS Read Postamble + // Data Strobe IN + parameter TDQSH = 0.45; // tDQSH tCK DQS input High Pulse Width + parameter TDQSL = 0.45; // tDQSL tCK DQS input Low Pulse Width + parameter TWPRE = 0.90; // tWPRE tCK DQS Write Preamble + parameter TWPST = 0.30; // tWPST tCK DQS Write Postamble + // Command and Address + integer TZQCS; // tZQCS tCK ZQ Cal (Short) time + integer TZQINIT = max(512, ceil(640000/TCK_MIN)); // tZQinit tCK ZQ Cal (Long) time + integer TZQOPER = max(256, ceil(320000/TCK_MIN)); // tZQoper tCK ZQ Cal (Long) time + parameter TCCD = 4; // tCCD tCK Cas to Cas command delay + parameter TCCD_DG = 2; // tCCD_DG tCK Cas to Cas command delay to different group + parameter TRAS_MAX = 60e9; // tRAS ps Maximum Active to Precharge command time + parameter TWR = 15000; // tWR ps Write recovery time + parameter TMRD = 4; // tMRD tCK Load Mode Register command cycle time + parameter TMOD = 15000; // tMOD ps LOAD MODE to non-LOAD MODE command cycle time + parameter TMOD_TCK = 12; // tMOD tCK LOAD MODE to non-LOAD MODE command cycle time + parameter TRRD_TCK = 4; // tRRD tCK Active bank a to Active bank b command time + parameter TRRD_DG = 3000; // tRRD_DG ps Active bank a to Active bank b command time to different group + parameter TRRD_DG_TCK = 2; // tRRD_DG tCK Active bank a to Active bank b command time to different group + parameter TRTP = 7500; // tRTP ps Read to Precharge command delay + parameter TRTP_TCK = 4; // tRTP tCK Read to Precharge command delay + parameter TWTR = 7500; // tWTR ps Write to Read command delay + parameter TWTR_DG = 3750; // tWTR_DG ps Write to Read command delay to different group + parameter TWTR_TCK = 4; // tWTR tCK Write to Read command delay + parameter TWTR_DG_TCK = 2; // tWTR_DG tCK Write to Read command delay to different group + parameter TDLLK = 512; // tDLLK tCK DLL locking time + // Refresh - 1Gb + parameter TRFC_MIN = 110000; // tRFC ps Refresh to Refresh Command interval minimum value + parameter TRFC_MAX =70200000; // tRFC ps Refresh to Refresh Command Interval maximum value + // Power Down + parameter TXP_TCK = 3; // tXP tCK Exit power down to a valid command + parameter TXPDLL = 24000; // tXPDLL ps Exit precharge power down to READ or WRITE command (DLL-off mode) + parameter TXPDLL_TCK = 10; // tXPDLL tCK Exit precharge power down to READ or WRITE command (DLL-off mode) + parameter TACTPDEN = 1; // tACTPDEN tCK Timing of last ACT command to power down entry + parameter TPRPDEN = 1; // tPREPDEN tCK Timing of last PRE command to power down entry + parameter TREFPDEN = 1; // tARPDEN tCK Timing of last REFRESH command to power down entry + parameter TCPDED = 1; // tCPDED tCK Command pass disable/enable delay + parameter TPD_MAX =TRFC_MAX; // tPD ps Power-down entry-to-exit timing + parameter TXPR = 120000; // tXPR ps Exit Reset from CKE assertion to a valid command + parameter TXPR_TCK = 5; // tXPR tCK Exit Reset from CKE assertion to a valid command + // Self Refresh + parameter TXS = 120000; // tXS ps Exit self refesh to a non-read or write command + parameter TXS_TCK = 5; // tXS tCK Exit self refesh to a non-read or write command + parameter TXSDLL = TDLLK; // tXSRD tCK Exit self refresh to a read or write command + parameter TISXR = TIS; // tISXR ps CKE setup time during self refresh exit. + parameter TCKSRE = 10000; // tCKSRE ps Valid Clock requirement after self refresh entry (SRE) + parameter TCKSRE_TCK = 5; // tCKSRE tCK Valid Clock requirement after self refresh entry (SRE) + parameter TCKSRX = 10000; // tCKSRX ps Valid Clock requirement prior to self refresh exit (SRX) + parameter TCKSRX_TCK = 5; // tCKSRX tCK Valid Clock requirement prior to self refresh exit (SRX) + parameter TCKESR_TCK = 4; // tCKESR tCK Minimum CKE low width for Self Refresh entry to exit timing + // ODT + parameter TAOF = 0.7; // tAOF tCK RTT turn-off from ODTLoff reference + parameter TAONPD = 8500; // tAONPD ps Asynchronous RTT turn-on delay (Power-Down with DLL frozen) + parameter TAOFPD = 8500; // tAONPD ps Asynchronous RTT turn-off delay (Power-Down with DLL frozen) + parameter ODTH4 = 4; // ODTH4 tCK ODT minimum HIGH time after ODT assertion or write (BL4) + parameter ODTH8 = 6; // ODTH8 tCK ODT minimum HIGH time after write (BL8) + parameter TADC = 0.7; // tADC tCK RTT dynamic change skew + // Write Levelization + parameter TWLMRD = 40; // tWLMRD tCK First DQS pulse rising edge after tDQSS margining mode is programmed + parameter TWLDQSEN = 25; // tWLDQSEN tCK DQS/DQS delay after tDQSS margining mode is programmed + parameter TWLOE = 2000; // tWLOE ps Write levelization output error + + // Size Parameters based on Part Width + + `ifdef x4 + parameter DM_BITS = 1; // Set this parameter to control how many Data Mask bits are used + parameter ADDR_BITS = 14; // MAX Address Bits + parameter ROW_BITS = 14; // Set this parameter to control how many Address bits are used + parameter COL_BITS = 11; // Set this parameter to control how many Column bits are used + parameter DQ_BITS = 4; // Set this parameter to control how many Data bits are used **Same as part bit width** + parameter DQS_BITS = 1; // Set this parameter to control how many Dqs bits are used + `elsif x8 + parameter DM_BITS = 1; // Set this parameter to control how many Data Mask bits are used + parameter ADDR_BITS = 14; // MAX Address Bits + parameter ROW_BITS = 14; // Set this parameter to control how many Address bits are used + parameter COL_BITS = 10; // Set this parameter to control how many Column bits are used + parameter DQ_BITS = 8; // Set this parameter to control how many Data bits are used **Same as part bit width** + parameter DQS_BITS = 1; // Set this parameter to control how many Dqs bits are used + `else //`define x16 + parameter DM_BITS = 2; // Set this parameter to control how many Data Mask bits are used + parameter ADDR_BITS = 13; // MAX Address Bits + parameter ROW_BITS = 13; // Set this parameter to control how many Address bits are used + parameter COL_BITS = 10; // Set this parameter to control how many Column bits are used + parameter DQ_BITS = 16; // Set this parameter to control how many Data bits are used **Same as part bit width** + parameter DQS_BITS = 2; // Set this parameter to control how many Dqs bits are used + `endif + + // Size Parameters + parameter BA_BITS = 3; // Set this parmaeter to control how many Bank Address bits are used + parameter MEM_BITS = 15; // Set this parameter to control how many write data bursts can be stored in memory. The default is 2^10=1024. + parameter AP = 10; // the address bit that controls auto-precharge and precharge-all + parameter BC = 12; // the address bit that controls burst chop + parameter BL_BITS = 3; // the number of bits required to count to BL_MAX + parameter BO_BITS = 2; // the number of Burst Order Bits + + `ifdef QUAD_RANK + `define DUAL_RANK // also define DUAL_RANK + parameter CS_BITS = 4; // Number of Chip Select Bits + parameter RANKS = 4; // Number of Chip Selects + `elsif DUAL_RANK + parameter CS_BITS = 2; // Number of Chip Select Bits + parameter RANKS = 2; // Number of Chip Selects + `else + parameter CS_BITS = 1; // Number of Chip Select Bits + parameter RANKS = 1; // Number of Chip Selects + `endif + + // Simulation parameters + parameter RZQ = 240; // termination resistance + parameter PRE_DEF_PAT = 8'hAA; // value returned during mpr pre-defined pattern readout + parameter STOP_ON_ERROR = 1; // If set to 1, the model will halt on command sequence/major errors + parameter DEBUG = 1; // Turn on Debug messages + parameter BUS_DELAY = 0; // delay in nanoseconds + parameter RANDOM_OUT_DELAY = 0; // If set to 1, the model will put a random amount of delay on DQ/DQS during reads + parameter RANDOM_SEED = 31913; //seed value for random generator. + + parameter RDQSEN_PRE = 2; // DQS driving time prior to first read strobe + parameter RDQSEN_PST = 1; // DQS driving time after last read strobe + parameter RDQS_PRE = 2; // DQS low time prior to first read strobe + parameter RDQS_PST = 1; // DQS low time after last read strobe + parameter RDQEN_PRE = 0; // DQ/DM driving time prior to first read data + parameter RDQEN_PST = 0; // DQ/DM driving time after last read data + parameter WDQS_PRE = 2; // DQS half clock periods prior to first write strobe + parameter WDQS_PST = 1; // DQS half clock periods after last write strobe + + // check for legal cas latency based on the cas write latency + function valid_cl; + input [3:0] cl; + input [3:0] cwl; + + case ({cwl, cl}) + `ifdef sg093 + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}, + {4'd8, 4'd11}, + {4'd9, 4'd13}, + {4'd10, 4'd14}: valid_cl = 1; + `elsif sg093E + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}, + {4'd8, 4'd10}, + {4'd8, 4'd11}, + {4'd9, 4'd12}, + {4'd9, 4'd13}, + {4'd10, 4'd13}, + {4'd10, 4'd14}: valid_cl = 1; + `elsif sg093F + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}, + {4'd8, 4'd9 }, + {4'd8, 4'd10}, + {4'd8, 4'd11}, + {4'd9, 4'd11}, + {4'd9, 4'd12}, + {4'd9, 4'd13}, + {4'd10, 4'd12}, + {4'd10, 4'd13}, + {4'd10, 4'd14}: valid_cl = 1; + `elsif sg107 + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}, + {4'd8, 4'd11}, + {4'd9, 4'd13}: valid_cl = 1; + `elsif sg107E + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}, + {4'd8, 4'd11}, + {4'd9, 4'd12}, + {4'd9, 4'd13}: valid_cl = 1; + `elsif sg107F + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}, + {4'd8, 4'd10}, + {4'd8, 4'd11}, + {4'd9, 4'd11}, + {4'd9, 4'd12}, + {4'd9, 4'd13}: valid_cl = 1; + `elsif sg125E + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}, + {4'd8, 4'd10}, + {4'd8, 4'd11}: valid_cl = 1; + `elsif sg125 + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}, + {4'd8, 4'd11}: valid_cl = 1; + `elsif sg15E + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }, + {4'd7, 4'd9 }, + {4'd7, 4'd10}: valid_cl = 1; + `elsif sg15 + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd8 }, + {4'd7, 4'd10}: valid_cl = 1; + `elsif sg187E + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd7 }, + {4'd6, 4'd8 }: valid_cl = 1; + `elsif sg187 + {4'd5, 4'd5 }, + {4'd5, 4'd6 }, + {4'd6, 4'd8 }: valid_cl = 1; + `elsif sg25E + {4'd5, 4'd5 }, + {4'd5, 4'd6 }: valid_cl = 1; + `elsif sg25 + {4'd5, 4'd5 }, + {4'd5, 4'd6 }: valid_cl = 1; + `endif + default : valid_cl = 0; + endcase + endfunction + + // find the minimum valid cas write latency + function [3:0] min_cwl; + input period; + real period; + min_cwl = (period >= 2500.0) ? 5: + (period >= 1875.0) ? 6: + (period >= 1500.0) ? 7: + (period >= 1250.0) ? 8: + (period >= 1071.0) ? 9: + 10; // (period >= 938) + endfunction + + // find the minimum valid cas latency + function [3:0] min_cl; + input period; + real period; + reg [3:0] cwl; + reg [3:0] cl; + begin + cwl = min_cwl(period); + for (cl=CL_MAX; cl>=CL_MIN; cl=cl-1) begin + if (valid_cl(cl, cwl)) begin + min_cl = cl; + end + end + end + endfunction + +`endif diff --git a/resources/soc/simu/testbench/ejtag_virtual_host.v b/resources/soc/simu/testbench/ejtag_virtual_host.v new file mode 100644 index 0000000..9210479 --- /dev/null +++ b/resources/soc/simu/testbench/ejtag_virtual_host.v @@ -0,0 +1,235 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module ejtag_virtual_host ( + TCK, + TMS, + TDO, + TDI, + TRST +); + +input TDO; +output TCK, TDI, TMS, TRST; +reg [31:0] control; +reg [31:0] impcode; +reg [31:0] idcode; +reg [31:0] data; +reg [31:0] addr; +reg [31:0] pc; +reg TDI, TCK, TMS, TRST; + +reg pracc; +reg prnw; +reg [1:0] psz; +reg rocc; +reg proben; +reg probtrap; + +reg dmseg_service; //serve dmseg access, or do other test +reg service_busy; //is the host in service + +reg [31:0] memory [{19{1'b1}}:0]; +integer j; + +always #25 TCK = ~TCK; + +initial +begin + TMS = 0; + for(j=0; j<128; j=j+1) + memory[j]=32'h0; + + + dmseg_service = 1'b0; + service_busy = 1'b0; + #50 TRST = 1'b0; + TRST = 1'b0; + TCK = 1'b0; + pracc = 1'b0; + rocc = 1'b0; + #20000 TRST = 1'b1; +//rocc = 1'b1; + $display("ejtag reboot done!"); + #1000 + query_reg32(5'ha, control); + start_dmseg_service; + +// stop_dmseg_service; +// test_ejtagbrk; +// #1000 +// start_dmseg_service; +end + +initial +begin + #10000 + begin + #20000 + if(dmseg_service) + begin + service_busy = 1'b1; + query_reg32(5'h01, idcode ); + $display("Idcode:%x Version:%x PartNumber:%x ManufID:%x\n", + idcode,idcode[31:28],idcode[27:12],idcode[11:1]); + + query_reg32(5'h03, impcode); + $display("Impcode:%x EJTAGver:%x DINTsup:%x NoDMA:%x MIPS32/64:%x\n", + impcode,impcode[31:29],impcode[24],impcode[14],impcode[0]); + service_busy = 1'b0; + end + if((!service_busy)&&dmseg_service) + end_dmseg_service; + end +end + + +task start_dmseg_service; +begin + dmseg_service = 1'b1; + $display("dmseg service start!"); +end +endtask + +task end_dmseg_service; +begin + dmseg_service = 1'b0; + query_reg32(5'ha, control); + control[31] = 1'b0; + control[15] = 1'b0; + control[14] = 1'b0; + control[12] = 1'b0; + write_reg32(5'ha, control); + $display("dmseg service end!"); +end +endtask + +task query_reg32; +input [4:0] reg_inst; +output [31:0] reg_data; +reg [31:0] reg_rd_data; +integer i; +begin + TMS = 0; + repeat(2) @(negedge TCK); + TMS = 1; + repeat(2) @(negedge TCK); + TMS = 0; + repeat(2) @(negedge TCK); + // Shift the IR command to select CONTROL + TDI = reg_inst[0]; + repeat(1) @(negedge TCK); + TDI = reg_inst[1]; + repeat(1) @(negedge TCK); + TDI = reg_inst[2]; + repeat(1) @(negedge TCK); + TDI = reg_inst[3]; + repeat(1) @(negedge TCK); + TDI = reg_inst[4]; + TMS = 1; + repeat(3) @(negedge TCK); + TMS = 0; + repeat(2) @(negedge TCK); + + for(i = 0; i < 32; i = i+1) + begin + repeat(1) @(negedge TCK); + reg_data[i] = TDO; + end + + if (reg_data[18]==1'b0) + reg_rd_data[31:0] = {reg_data[31:19], 1'b1, reg_data[17:0]}; + else + reg_rd_data[31:0] = reg_data[31:0]; + + for(i = 0; i < 32; i = i+1) + begin + TDI = reg_rd_data[i]; + repeat(1) @(posedge TCK); + if(i == 30) + begin + TMS = 1; + end + end + + repeat(1) @(posedge TCK); + TMS = 0; + repeat(3) @(negedge TCK); +end +endtask + + +task write_reg32; +input [4:0] reg_inst; +input [31:0] reg_data; +integer i; +begin + TMS = 0; + repeat(2) @(negedge TCK); + TMS = 1; + repeat(2) @(negedge TCK); + TMS = 0; + repeat(2) @(negedge TCK); + // Shift the IR command to select CONTROL + TDI = reg_inst[0]; + repeat(1) @(negedge TCK); + TDI = reg_inst[1]; + repeat(1) @(negedge TCK); + TDI = reg_inst[2]; + repeat(1) @(negedge TCK); + TDI = reg_inst[3]; + repeat(1) @(negedge TCK); + TDI = reg_inst[4]; + TMS = 1; + repeat(3) @(negedge TCK); + TMS = 0; + repeat(2) @(negedge TCK); + + repeat(1) @(posedge TCK); + for(i = 0; i < 32; i = i+1) + begin + TDI = reg_data[i]; + repeat(1) @(posedge TCK); + if(i==30) + begin + TMS = 1; + end + end + + repeat(1) @(posedge TCK); + TMS = 0; + repeat(3) @(negedge TCK); +end +endtask + +endmodule diff --git a/resources/soc/simu/testbench/godson_system.v b/resources/soc/simu/testbench/godson_system.v new file mode 100644 index 0000000..fbb249d --- /dev/null +++ b/resources/soc/simu/testbench/godson_system.v @@ -0,0 +1,310 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +`timescale 1ns/1ps + +`define APP_FLASH "../../../../../../simu/soft/func/flash.vlog" + +`define UART_CLK soc_up_top.APB_DEV.uart0.regs.enable + +module godson_system; +// ========================================================================== // +// Signal Declarations // +// ========================================================================== // +// Clocks +reg clk,resetn; +reg mac_clk; +initial begin + clk = 1'b0; + mac_clk = 1'b0; + resetn = 1'b0; + #1000; + resetn = 1'b1; +end + +always #15.15 clk = ~clk; +always #20 mac_clk = ~mac_clk; + +//------DDR3 interface------ +wire [15:0] ddr3_dq; +wire [12:0] ddr3_addr; +wire [2 :0] ddr3_ba; +wire ddr3_ras_n; +wire ddr3_cas_n; +wire ddr3_we_n; +wire ddr3_odt; +wire ddr3_reset_n; +wire ddr3_cke; +wire [1:0] ddr3_dm; +wire [1:0] ddr3_dqs_p; +wire [1:0] ddr3_dqs_n; +wire ddr3_ck_p; +wire ddr3_ck_n; + +//----mac controller------ +//I/O pad interface signals +// Tx +wire mtxclk_0; // Transmit clock (from PHY) +wire [3:0] mtxd_0; // Transmit nibble (to PHY) +wire mtxen_0; // Transmit enable (to PHY) +wire mtxerr_0; // Transmit error (to PHY) +assign mtxclk_0 = mac_clk; +// Rx +wire mrxclk_0; // Receive clock (from PHY) +wire [3:0] mrxd_0; // Receive nibble (from PHY) +wire mrxdv_0; // Receive data valid (from PHY) +wire mrxerr_0; // Receive data error (from PHY) +assign mrxclk_0 = mac_clk; +// MII Management interface +wire mdc_0; // MII Management data clock (to PHY) +wire mdio_0; // MII data inout +wire phy_rstn; + +wire [7:0] LED; +wire UART_RX, UART_TX; +wire UART_CTS, UART_RTS; +wire UART_DTR, UART_DSR; +wire UART_RI, UART_DCD; + +//nand +wire NAND_CLE ; +wire NAND_ALE ; +wire NAND_RDY ; +wire [7:0] NAND_DATA; +wire NAND_RD ; +wire NAND_CE ; //low active +wire NAND_WR ; + +wire SPI_CLK, SPI_CS, SPI_MISO, SPI_MOSI; + +wire TDI; +wire TDO; +wire TCK; +wire TRST; +wire TMS; + +soc_up_top soc_up_top ( + .clk (clk ), + .resetn (resetn ), + + .ddr3_dq (ddr3_dq ), + .ddr3_addr (ddr3_addr ), + .ddr3_ba (ddr3_ba ), + .ddr3_ras_n (ddr3_ras_n ), + .ddr3_cas_n (ddr3_cas_n ), + .ddr3_we_n (ddr3_we_n ), + .ddr3_odt (ddr3_odt ), + .ddr3_reset_n (ddr3_reset_n), + .ddr3_cke (ddr3_cke ), + .ddr3_dm (ddr3_dm ), + .ddr3_dqs_p (ddr3_dqs_p ), + .ddr3_dqs_n (ddr3_dqs_n ), + .ddr3_ck_p (ddr3_ck_p ), + .ddr3_ck_n (ddr3_ck_n ), + + //------gpio---------------- + .led (), + .led_rg0 (), + .led_rg1 (), + .num_csn (), + .num_a_g (), + .switch (8'd0), + .btn_key_col (), + .btn_key_row (4'd0), + .btn_step (2'd0), + + //------mac controller------- + // I/O pad interface signals + //TX + .mtxclk_0 (mtxclk_0 ), + .mtxen_0 (mtxen_0 ), + .mtxd_0 (mtxd_0 ), + .mtxerr_0 (mtxerr_0 ), + //RX + .mrxclk_0 (mrxclk_0 ), + .mrxdv_0 (mrxdv_0 ), + .mrxd_0 (mrxd_0 ), + .mrxerr_0 (mrxerr_0 ), + .mcoll_0 (1'b0 ), + .mcrs_0 (1'b0 ), + // MIIM + .mdc_0 (mdc_0 ), + .mdio_0 (mdio_0 ), + + .phy_rstn (phy_rstn ), + + .UART_RX(UART_RX), + .UART_TX(UART_TX), + + //NAND + .NAND_CLE (NAND_CLE ), + .NAND_ALE (NAND_ALE ), + .NAND_RDY (NAND_RDY ), + .NAND_DATA(NAND_DATA), + .NAND_RD (NAND_RD ), + .NAND_CE (NAND_CE ), //low active + .NAND_WR (NAND_WR ), + + .EJTAG_TRST(TRST), + .EJTAG_TCK(TCK), + .EJTAG_TMS(TMS), + .EJTAG_TDI(TDI), + .EJTAG_TDO(TDO), + + .SPI_CLK(SPI_CLK), + .SPI_CS(SPI_CS), + .SPI_MISO(SPI_MISO), + .SPI_MOSI(SPI_MOSI) + ); + +pullup (NAND_RDY); +//nand module +s30ml08gp00 nand_model0 +( + .IO7 (NAND_DATA[7]) , + .IO6 (NAND_DATA[6]) , + .IO5 (NAND_DATA[5]), + .IO4 (NAND_DATA[4]), + .IO3 (NAND_DATA[3]), + .IO2 (NAND_DATA[2]), + .IO1 (NAND_DATA[1]), + .IO0 (NAND_DATA[0]), + .CLE (NAND_CLE ), + .ALE (NAND_ALE ), + .CE1Neg(NAND_CE ), + .RENeg (NAND_RD ), + .WENeg (NAND_WR ), + .RY1 (NAND_RDY ), + .CE2Neg(1'b1 ), + .WPNeg (1'b1 ), + .RY2 ( ), + .FP (1'b1 ) +); + +ejtag_virtual_host ejtag + ( + .TCK (TCK ), + .TMS (TMS ), + .TDO (TDO ), + .TDI (TDI ), + .TRST(TRST) + ); + + +MX25L6405D # + ( + .Init_File(`APP_FLASH) + ) + spi_flash + ( + .SCLK (SPI_CLK ), + .CS (SPI_CS ), + .SI (SPI_MOSI), + .SO (SPI_MISO), + .WP (1'b1 ), + .HOLD (1'b1 ) + ); + +uart_dev # + ( + .uart_number (0), + .STRLEN (80) + ) + uart_dev0 + ( + .clk (`UART_CLK), + .rst_n (resetn), + .rx (UART_TX), + .tx (UART_RX) + ); + +ddr3_model u_comp_ddr3 + ( + .rst_n (ddr3_reset_n), + .ck (ddr3_ck_p), + .ck_n (ddr3_ck_n), + .cke (ddr3_cke ), + .cs_n (1'b0 ), + .ras_n (ddr3_ras_n), + .cas_n (ddr3_cas_n), + .we_n (ddr3_we_n), + .dm_tdqs (ddr3_dm), + .ba (ddr3_ba), + .addr (ddr3_addr), + .dq (ddr3_dq), + .dqs (ddr3_dqs_p), + .dqs_n (ddr3_dqs_n), + .tdqs_n (), + .odt (ddr3_odt) + ); + +virtual_mac VIRTUAL_MAC( + .hclk (clk), + .hrst_n (resetn), + .mtxclk (mrxclk_0 ), + .mtxen (mrxdv_0 ), + .mtxd (mrxd_0 ), + .mtxerr (mrxerr_0 ), + + .mrxclk (mtxclk_0 ), + .mrxdv (mtxen_0 ), + .mrxd (mtxd_0 ), + .mrxerr (mtxerr_0 ), + .mcoll (1'b0 ), + .mcrs (1'b0 ), + .mdc (), + .md_io (), + .gpio (LED[4]) +); + +`ifdef DUMPDUMP +initial +begin + $fsdbDumpfile("wave.fsdb"); + $fsdbDumpvars(0, godson_system); + #57888881 + $fsdbDumpon; + #100000000 + $fsdbDumpoff; +end +`endif + +initial begin + forever begin + #500000; + $display("\t\t@%0t: CPU commit PC is %x", $time, godson_system.soc_up_top.cpu_mid.cpu_core.commitbus0[41:10]); + end +end + + +endmodule diff --git a/resources/soc/simu/testbench/nand_sim.v b/resources/soc/simu/testbench/nand_sim.v new file mode 100644 index 0000000..89c9b0f --- /dev/null +++ b/resources/soc/simu/testbench/nand_sim.v @@ -0,0 +1,3680 @@ +////////////////////////////////////////////////////////////////////////////// +// File name : s30ml08gp00.v +////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2005-2006 Free Model Foundry; http://www.FreeModelFoundry.com +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License version 2 as +// published by the Free Software Foundation. +// +// MODIFICATION HISTORY: +// +// version: | author: | mod date: | changes made: +// V1.0 D.Lukovic 05 Nov 02 Initial Version +// V1.1 D.Lukovic 06 Jan 24 SPEEDSIM support implemented +// Preload performance improvment +// RY pin is open drain, now. +// +////////////////////////////////////////////////////////////////////////////// +// PART DESCRIPTION: +// +// Library: FLASH +// Technology: FLASH MEMORY +// Part: s30ml08gp00 +// +// Description: NAND interface family based on Xtreme MirrorBit technology +// Flash Memory +// +////////////////////////////////////////////////////////////////////////////// +// Known Bugs: +// +////////////////////////////////////////////////////////////////////////////// + +////////////////////////////////////////////////////////////////////////////// +// TOP MODULE DECLARATION // +////////////////////////////////////////////////////////////////////////////// + + +`timescale 1 ns/1 ns +module s30ml08gp00 + ( + IO7 , + IO6 , + IO5 , + IO4 , + IO3 , + IO2 , + IO1 , + IO0 , + + CLE , + ALE , + CE1Neg , + CE2Neg , + RENeg , + WENeg , + WPNeg , + RY1 , + RY2 , + //PRE , + FP + ); + +//////////////////////////////////////////////////////////////////////// +// Port / Part Pin Declarations +//////////////////////////////////////////////////////////////////////// + + inout IO7 ; + inout IO6 ; + inout IO5 ; + inout IO4 ; + inout IO3 ; + inout IO2 ; + inout IO1 ; + inout IO0 ; + + input CLE ; + input ALE ; + input CE1Neg ; + input CE2Neg ; + input RENeg ; + input WENeg ; + input WPNeg ; + output RY1 ; + output RY2 ; + //input PRE ; + input FP ; + +s30ml04gp00 U_FLASH1 +( + .IO7(IO7) , + .IO6(IO6) , + .IO5(IO5) , + .IO4(IO4) , + .IO3(IO3) , + .IO2(IO2) , + .IO1(IO1) , + .IO0(IO0) , + .CLE(CLE) , + .ALE(ALE) , + .CENeg(CE1Neg), + .RENeg(RENeg), + .WENeg(WENeg), + .WPNeg(WPNeg), + .RY(RY1) , + .PRE(1'b1) , + .FP(FP) + ); + +endmodule + +module s30ml04gp00 + ( + IO7 , + IO6 , + IO5 , + IO4 , + IO3 , + IO2 , + IO1 , + IO0 , + + CLE , + ALE , + CENeg , + RENeg , + WENeg , + WPNeg , + RY , + FP , + PRE + ); + +//////////////////////////////////////////////////////////////////////// +// Port / Part Pin Declarations +//////////////////////////////////////////////////////////////////////// + + inout IO7 ; + inout IO6 ; + inout IO5 ; + inout IO4 ; + inout IO3 ; + inout IO2 ; + inout IO1 ; + inout IO0 ; + + input CLE ; + input ALE ; + input CENeg ; + input RENeg ; + input WENeg ; + input WPNeg ; + input PRE ; + input FP ; + output RY ; + + parameter mem_file_name = "none"; + parameter UserPreload = 1'b0; + parameter TimingModel = "DefaultTimingModel"; + +// interconnect path delay signals + + wire IO7_ipd ; + wire IO6_ipd ; + wire IO5_ipd ; + wire IO4_ipd ; + wire IO3_ipd ; + wire IO2_ipd ; + wire IO1_ipd ; + wire IO0_ipd ; + + wire [7 : 0] A; + assign A = {IO7_ipd, + IO6_ipd, + IO5_ipd, + IO4_ipd, + IO3_ipd, + IO2_ipd, + IO1_ipd, + IO0_ipd }; + + wire [7 : 0 ] DIn; + assign DIn = { + IO7_ipd, + IO6_ipd, + IO5_ipd, + IO4_ipd, + IO3_ipd, + IO2_ipd, + IO1_ipd, + IO0_ipd }; + + wire [7 : 0 ] DOut; + assign DOut = { + IO7, + IO6, + IO5, + IO4, + IO3, + IO2, + IO1, + IO0 }; + + wire CLE_ipd ; + wire ALE_ipd ; + wire CENeg_ipd ; + wire RENeg_ipd ; + wire WENeg_ipd ; + wire WPNeg_ipd ; + wire PRE_ipd ; + wire FP_ipd ; + +// internal delays + + reg PROG_in ; + reg PROG_out ; + reg XPROG_in ; + reg XPROG_out ; + reg PRE_PROG_in ; + reg PRE_PROG_out ; + reg BERS_in ; + reg BERS_out ; + reg XBERS_in ; + reg XBERS_out ; + reg DBSY_in ; + reg DBSY_out ; + reg TR_in ; + reg TR_out ; + reg FPSTART_in ; + reg FPSTART_out ; + reg BSTATINQ_in ; + reg BSTATINQ_out ; + + reg PROG1_in ; + reg PROG1_out ; + reg PROG2_in ; + reg PROG2_out ; + reg XPROG1_in ; + reg XPROG1_out ; + reg XPROG2_in ; + reg XPROG2_out ; + reg DBSY1_in ; + reg DBSY1_out ; + + reg [7 : 0] DOut_zd; + + wire IO7_zd ; + wire IO6_zd ; + wire IO5_zd ; + wire IO4_zd ; + wire IO3_zd ; + wire IO2_zd ; + wire IO1_zd ; + wire IO0_zd ; + + assign {IO7_zd , + IO6_zd , + IO5_zd , + IO4_zd , + IO3_zd , + IO2_zd , + IO1_zd , + IO0_zd } = DOut_zd; + + reg [7 : 0] DOut_pass; + + wire IO7_pass ; + wire IO6_pass ; + wire IO5_pass ; + wire IO4_pass ; + wire IO3_pass ; + wire IO2_pass ; + wire IO1_pass ; + wire IO0_pass ; + + + assign {IO7_pass , + IO6_pass , + IO5_pass , + IO4_pass , + IO3_pass , + IO2_pass , + IO1_pass , + IO0_pass } = DOut_pass; + + reg R_zd = 1'b0; + + parameter PartID = "s30ml04gp00"; + parameter MaxData = 8'hFF; + parameter BlockNum = 1023; + parameter BlockSize = 64; // 64 page + parameter PageSize = 2111;// by mhb + parameter SegmentNum = 7; // 8 segment within page + + // If Long_Timming is set to 0 uncomment line below + + `define SPEEDSIM; + + `ifdef SM_NAND_PGNUM + parameter PageNum = `SM_NAND_PGNUM; + `else // not SM_NAND_PGNUM + parameter PageNum = 16'hFFFF; + `endif // SM_NAND_PGNUM + + // control signals + reg STAT_ACT =1'b0; + reg STAT_M_ACT =1'b0; + reg ERS_ACT =1'b0; + reg PRG_ACT =1'b0; + reg RD_ACT =1'b0; + reg FP_ACT =1'b0; + reg XTREM_ACT =1'b0; + reg XTR_MPRG =1'b0; + reg RSTSTART =1'b0; + reg RSTDONE =1'b0; + reg back_to_xtrem =1'b0; + reg PMOVE =1'b0; + // Control signals for read operation + reg PGR_ACT =1'b0; // Page read in progress + reg PGD_ACT =1'b0; // Page Duplicate + + reg statread =1'b0; + reg nostatread =1'b1; + + // powerup + reg PoweredUp =1'b0; + reg reseted =1'b0; + + reg write =1'b0; + reg read =1'b0; + + integer WER_01; + + // 8 bit Address + integer AddrCom ; + // Address within page + integer Address ; // 0 - Pagesize + // Page Number + integer PageAddr = -1; //-1 - PageNum + // Partial page number + integer PartAddr = 0; + // Block Number + integer BlockAddr = -1; //-1 - BlockNum + integer BlckDup = 0; + + //Data + integer Data ; //-1 - MaxData + + //ID control signals + integer IDAddr ; // 0 - 4 + + integer BlockPage ; // RANGE 0 TO BlockSize; + integer Pom_Address ; // RANGE 0 TO PageSize; + reg firstFlag ; + // program control signals + integer CashBuffData [0:PageSize]; //Page chache register + integer CashBuffData1 [0:PageSize]; //Page chache register + integer CWrAddr ; // Cash -1 - Pagesize +1 + integer CWrPage ; // Cash 0 - PageNum + reg [0:SegmentNum] CSegForProg; //array [0:SegmentNum] of 0/1 + reg [0:SegmentNum] CSegForProg1; //array [0:SegmentNum] of 0/1 + + integer WrBuffData[0:PageSize]; + integer WrBuffData1[0:PageSize]; + integer WrAddr ; // -1 - Pagesize +1 + integer WrPage ; // 0 - PageNum + reg [0:SegmentNum] SegForProg; //array [0:SegmentNum] of 0/1 + reg [0:SegmentNum] SegForProg1; //array [0:SegmentNum] of 0/1 + + integer PDBuffer [0:PageSize]; + integer PDBuffer1 [0:PageSize]; + + integer Page_pom; + integer cnt_addr; + + integer pom_seg ; // RANGE -1 TO SegmentNum; + integer pom_seg1 ; // RANGE -1 TO SegmentNum; + integer segment ; // RANGE -1 TO SegmentNum; + integer segment1 ; // RANGE -1 TO SegmentNum; + reg [0:(PageNum+1)*(SegmentNum+1)-1] ProgramedFlag = 0; + reg [0:BlockNum] InvBlock = 0; + reg [0:BlockNum] InvBlockPgms = 0; + reg [0:BlockNum] PreProgFlag = 0; + reg [0:BlockNum] ProgBlock = 0; + reg [0:BlockNum] BlockMod = 0; // 0 for NORMAL, 1 for XTREME + integer ssa[0:SegmentNum]; // has to be initialized + integer sea[0:SegmentNum]; // has to be initialized + + // Mem(Page)(Address) + integer Mem[0:(PageSize+1)*(PageNum+1)-1]; + + // ID Array + integer IDArray[0:4]; + + // timing check violation + reg Viol = 1'b0; + + // initial + integer i,j; + + //Bus Cycle Decode + reg[7:0] A_tmp ; + reg[7:0] D_tmp ; + + //RstTime + time duration; + + //Functional + reg[7:0] Status = 8'hC0; + reg oe = 1'b0; + integer Page ; // 0 - PageNum + integer Blck ; // 0 - BlockNum + + event oe_event; + + integer prog_time; + integer erase_time; + + reg [14*8-1:0] tmp_timing;//stores copy of TimingModel + reg [14*8-1:0] tmp1_timing;//stores copy of TimingModel + reg [7:0] tmp_char;//stores "0" or "2" character + integer found = 1'b0; + + // states + reg [5:0] current_state; + reg [5:0] next_state; + + // FSM states + parameter IDLE =6'h00; // + parameter XTREM_PREL =6'h01; // + parameter XTREM_IDLE =6'h02; // + parameter UNKNOWN =6'h03; // wrong command sequneces + parameter PREL_RD =6'h04; // + parameter RESET =6'h05; // + parameter A0_RD =6'h06; // + parameter A1_RD =6'h07; // + parameter A2_RD =6'h08; // + parameter A3_RD =6'h09; // + parameter RD_WCMD =6'h0A; // waiting for the confirm read command + parameter BUFF_TR =6'h0B; // + parameter RD =6'h0C; // + parameter CAC_PREL =6'h0D; // Coloumn address change + parameter A0_CAC =6'h0E; // + parameter A1_CAC =6'h0F; // Wait for confirm EO command + parameter ID_PREL =6'h10; // + parameter ID =6'h11; // + parameter PREL_PRG =6'h12; // + parameter PGD_PREL =6'h13; // + parameter A0_PRG =6'h14; // + parameter A1_PRG =6'h15; // + parameter A2_PRG =6'h16; // + parameter A3_PRG =6'h17; // + parameter DATA_PRG =6'h18; // + parameter PRE_PRG =6'h19; + parameter WFPD =6'h1A; // wait for program done + parameter WFPPD =6'h1B; // + parameter PGMS_CAC =6'h1C; + parameter A0_PRG_CAC =6'h1D; + parameter PGMS =6'h1E; + parameter CBSY =6'h1F; + parameter RDY_PRG =6'h20; + parameter PREL_ERS =6'h21; + parameter A1_ERS =6'h22; + parameter A2_ERS =6'h23; + parameter A3_ERS =6'h24; + parameter BERS_EXEC =6'h25; + parameter A0_PGD =6'h26; + parameter A1_PGD =6'h27; + parameter A2_PGD =6'h28; + parameter A3_PGD =6'h29; + parameter CONF_PGD =6'h30; + parameter BSTAT_INQ =6'h31; + +/////////////////////////////////////////////////////////////////////////////// +//Interconnect Path Delay Section +/////////////////////////////////////////////////////////////////////////////// + + buf (IO7_ipd , IO7 ); + buf (IO6_ipd , IO6 ); + buf (IO5_ipd , IO5 ); + buf (IO4_ipd , IO4 ); + buf (IO3_ipd , IO3 ); + buf (IO2_ipd , IO2 ); + buf (IO1_ipd , IO1 ); + buf (IO0_ipd , IO0 ); + + buf (CLE_ipd , CLE ); + buf (ALE_ipd , ALE ); + buf (CENeg_ipd , CENeg ); + buf (RENeg_ipd , RENeg ); + buf (WENeg_ipd , WENeg ); + buf (WPNeg_ipd , WPNeg ); + buf (PRE_ipd , PRE ); + buf (FP_ipd , FP ); + +/////////////////////////////////////////////////////////////////////////////// +// Propagation delay Section +/////////////////////////////////////////////////////////////////////////////// + + + nmos (IO7 , IO7_pass , 1'b1); + nmos (IO6 , IO6_pass , 1'b1); + nmos (IO5 , IO5_pass , 1'b1); + nmos (IO4 , IO4_pass , 1'b1); + nmos (IO3 , IO3_pass , 1'b1); + nmos (IO2 , IO2_pass , 1'b1); + nmos (IO1 , IO1_pass , 1'b1); + nmos (IO0 , IO0_pass , 1'b1); + + nmos (RY , 1'b0, ~R_zd); + + wire deg; + + // Needed for TimingChecks + // VHDL CheckEnable Equivalent + + wire Check_IO0_WENeg; + assign Check_IO0_WENeg = ~CENeg; + + wire Check_WENeg; + assign Check_WENeg = PoweredUp; + reg tdp_AL, tdp_CL, tdp_CE, tdp_RE; + + wire statread_cond; + wire nostatread_cond; + + assign statread_cond = statread && tdp_CE; + assign nostatread_cond = nostatread_cond && tdp_CE; + +specify + + // tipd delays: interconnect path delays , mapped to input port delays. + // In Verilog is not necessary to declare any tipd_ delay variables, + // they can be taken from SDF file + // With all the other delays real delays would be taken from SDF file + + specparam tpd_CENeg_IO0 = 1;//tcea, tchz + specparam tpd_RENeg_IO0 = 1;//trea, trhZ + specparam tpd_WENeg_RY = 1;//twb + + //tsetup values + specparam tsetup_IO0_WENeg = 1;//tds edge / + specparam tsetup_CLE_WENeg = 1;//tcls edge \ + specparam tsetup_CENeg_WENeg = 1;//tcs edge \ + specparam tsetup_ALE_WENeg = 1;//tals edge \ + specparam tsetup_WENeg_RENeg = 1;//twhr edge \ + specparam tsetup_RENeg_WENeg = 1;//twhw edge \ + specparam tsetup_WENeg_CENeg = 1;//twhc edge \ + specparam tsetup_WPNeg_WENeg = 1;//tww edge / + specparam tsetup_RY_WENeg = 1;//twr edge \ + specparam tsetup_RY_RENeg = 1;//trr edge \ + specparam tsetup_CLE_RENeg = 1; + specparam tsetup_ALE_RENeg = 1; + specparam tsetup_CENeg_RENeg = 1; + specparam tsetup_RENeg_CENeg = 1; + + //thold values + specparam thold_CLE_WENeg = 1;//tclh edge / + specparam thold_CENeg_WENeg = 1;//tch edge / + specparam thold_ALE_WENeg = 1;//talh edge / + specparam thold_IO0_WENeg = 1;//tdh edge / + + //tpw values + specparam tpw_WENeg_negedge = 1;//twp + specparam tpw_WENeg_posedge = 1;//twh + specparam tpw_RENeg_negedge = 1;//trp + specparam tpw_RENeg_posedge = 1;//treh + specparam tperiod_WENeg = 1;//twc + specparam tperiod_RENeg = 1;//trc + + //tdevice values: values for internal delays + `ifdef SPEEDSIM + // Program Operation + specparam tdevice_PROG = 698; + // Fast programming operation + specparam tdevice_FPROG = 314; + // Program Operation + specparam tdevice_XPROG = 200; + // Program Operation + specparam tdevice_PRE_PROG = 9000; + //Block Erase Operation + specparam tdevice_BERS = 17400; + //Fast block erase operation + specparam tdevice_FBERS = 10200; + //Block Erase Operation + specparam tdevice_XBERS = 17400; + //Dummy busy time + specparam tdevice_DBSY = 400; + //Block status inquiry time + specparam tdevice_BSTATINQ = 100; + //Page transfer time + specparam tdevice_TR = 300; + //Fast programming start time + specparam tdevice_FPSTART = 100; + + `else // not SPEEDSIM + // Program Operation + specparam tdevice_PROG = 698000; + // Fast programming operation + specparam tdevice_FPROG = 314000; + // Program Operation + specparam tdevice_XPROG = 120000; + // Program Operation + specparam tdevice_PRE_PROG = 90000000; + //Block Erase Operation + specparam tdevice_BERS = 174000000; + //Fast block erase operation + specparam tdevice_FBERS = 102000000; + //Block Erase Operation + specparam tdevice_XBERS = 174000000; + //Dummy busy time + specparam tdevice_DBSY = 400; + //Block status inquiry time + specparam tdevice_BSTATINQ = 1000; + //Page transfer time + specparam tdevice_TR = 15000; + //Fast programming start time + specparam tdevice_FPSTART = 100; + `endif // SPEEDSIM + +/////////////////////////////////////////////////////////////////////////////// +// Input Port Delays don't require Verilog description +/////////////////////////////////////////////////////////////////////////////// +// Path delays // +/////////////////////////////////////////////////////////////////////////////// + +// specify transport delay for Data output paths + +// Data ouptut paths + + if(statread_cond) + ( CENeg *> IO7 ) = tpd_CENeg_IO0; + if(statread_cond) + ( CENeg *> IO6 ) = tpd_CENeg_IO0; + if(statread_cond) + ( CENeg *> IO5 ) = tpd_CENeg_IO0; + if(statread_cond) + ( CENeg *> IO4 ) = tpd_CENeg_IO0; + if(statread_cond) + ( CENeg *> IO3 ) = tpd_CENeg_IO0; + if(statread_cond) + ( CENeg *> IO2 ) = tpd_CENeg_IO0; + if(statread_cond) + ( CENeg *> IO1 ) = tpd_CENeg_IO0; + if(statread_cond) + ( CENeg *> IO0 ) = tpd_CENeg_IO0; + + if(nostatread_cond) + ( CENeg *> IO7 ) = tpd_CENeg_IO0; + if(nostatread_cond) + ( CENeg *> IO6 ) = tpd_CENeg_IO0; + if(nostatread_cond) + ( CENeg *> IO5 ) = tpd_CENeg_IO0; + if(nostatread_cond) + ( CENeg *> IO4 ) = tpd_CENeg_IO0; + if(nostatread_cond) + ( CENeg *> IO3 ) = tpd_CENeg_IO0; + if(nostatread_cond) + ( CENeg *> IO2 ) = tpd_CENeg_IO0; + if(nostatread_cond) + ( CENeg *> IO1 ) = tpd_CENeg_IO0; + if(nostatread_cond) + ( CENeg *> IO0 ) = tpd_CENeg_IO0; + + if(tdp_RE) + ( RENeg => IO7 ) = tpd_RENeg_IO0; + if(tdp_RE) + ( RENeg => IO6 ) = tpd_RENeg_IO0; + if(tdp_RE) + ( RENeg => IO5 ) = tpd_RENeg_IO0; + if(tdp_RE) + ( RENeg => IO4 ) = tpd_RENeg_IO0; + if(tdp_RE) + ( RENeg => IO3 ) = tpd_RENeg_IO0; + if(tdp_RE) + ( RENeg => IO2 ) = tpd_RENeg_IO0; + if(tdp_RE) + ( RENeg => IO1 ) = tpd_RENeg_IO0; + if(tdp_RE) + ( RENeg => IO0 ) = tpd_RENeg_IO0; + +// R output path + (WENeg => RY) = tpd_WENeg_RY; + +/////////////////////////////////////////////////////////////////////////////// +// Timing Violation / +/////////////////////////////////////////////////////////////////////////////// + + $setup ( IO7 ,posedge WENeg &&& Check_IO0_WENeg ,tsetup_IO0_WENeg,Viol); + $setup ( IO6 ,posedge WENeg &&& Check_IO0_WENeg ,tsetup_IO0_WENeg,Viol); + $setup ( IO5 ,posedge WENeg &&& Check_IO0_WENeg ,tsetup_IO0_WENeg,Viol); + $setup ( IO4 ,posedge WENeg &&& Check_IO0_WENeg ,tsetup_IO0_WENeg,Viol); + $setup ( IO3 ,posedge WENeg &&& Check_IO0_WENeg ,tsetup_IO0_WENeg,Viol); + $setup ( IO2 ,posedge WENeg &&& Check_IO0_WENeg ,tsetup_IO0_WENeg,Viol); + $setup ( IO1 ,posedge WENeg &&& Check_IO0_WENeg ,tsetup_IO0_WENeg,Viol); + $setup ( IO0 ,posedge WENeg &&& Check_IO0_WENeg ,tsetup_IO0_WENeg,Viol); + + $hold ( posedge WENeg &&& Check_IO0_WENeg , IO7 ,thold_IO0_WENeg, Viol); + $hold ( posedge WENeg &&& Check_IO0_WENeg , IO6 ,thold_IO0_WENeg, Viol); + $hold ( posedge WENeg &&& Check_IO0_WENeg , IO5 ,thold_IO0_WENeg, Viol); + $hold ( posedge WENeg &&& Check_IO0_WENeg , IO4 ,thold_IO0_WENeg, Viol); + $hold ( posedge WENeg &&& Check_IO0_WENeg , IO3 ,thold_IO0_WENeg, Viol); + $hold ( posedge WENeg &&& Check_IO0_WENeg , IO2 ,thold_IO0_WENeg, Viol); + $hold ( posedge WENeg &&& Check_IO0_WENeg , IO1 ,thold_IO0_WENeg, Viol); + $hold ( posedge WENeg &&& Check_IO0_WENeg , IO0 ,thold_IO0_WENeg, Viol); + + $setup ( CLE ,negedge WENeg ,tsetup_CLE_WENeg , Viol); + $setup ( ALE ,negedge WENeg ,tsetup_ALE_WENeg , Viol); + $setup ( CENeg ,negedge WENeg ,tsetup_CENeg_WENeg , Viol); + $setup ( WENeg ,negedge CENeg &&& WENeg ,tsetup_WENeg_CENeg , Viol); + $setup ( WENeg ,negedge RENeg ,tsetup_WENeg_RENeg , Viol); + $setup ( RY ,negedge WENeg &&& RY ,tsetup_RY_WENeg , Viol); + $setup ( RY ,negedge RENeg &&& RY ,tsetup_RY_RENeg , Viol); + $setup ( RENeg ,negedge WENeg ,tsetup_RENeg_WENeg , Viol); + $setup ( WPNeg ,negedge WENeg ,tsetup_WENeg_RENeg , Viol); + $setup ( CLE ,negedge RENeg ,tsetup_CLE_RENeg , Viol); + $setup ( ALE ,negedge RENeg ,tsetup_ALE_RENeg , Viol); + $setup ( CENeg ,negedge RENeg ,tsetup_CENeg_RENeg , Viol); + $setup ( RENeg ,negedge CENeg ,tsetup_RENeg_CENeg , Viol); + + $hold ( posedge WENeg &&& Check_WENeg,CLE,thold_CLE_WENeg, Viol); + $hold ( posedge WENeg &&& Check_WENeg,ALE,thold_ALE_WENeg, Viol); + $hold ( posedge WENeg &&& Check_WENeg,CENeg,thold_CENeg_WENeg,Viol); + + $width (posedge WENeg , tpw_WENeg_posedge); + $width (negedge WENeg , tpw_WENeg_negedge); + $period(negedge WENeg , tperiod_WENeg); + $period(posedge WENeg , tperiod_WENeg); + $width (posedge RENeg , tpw_RENeg_posedge); + $width (negedge RENeg , tpw_RENeg_negedge); + $period(negedge RENeg , tperiod_RENeg); + $period(posedge RENeg , tperiod_RENeg); + + endspecify + + //Used as wait periods + `ifdef SPEEDSIM + time poweredupT = 1000; // 10 us + time RstErsT = 500;// 5 us + time RstProgT = 1000; // 10 us + time RstReadT = 500; // 5 us + `else // not SPEEDSIM + time poweredupT = 10000; // 10 us + time RstErsT = 500000;// 500 us + time RstProgT = 10000; // 10 us + time RstReadT = 5000; // 5 us + `endif // SPEEDSIM + +/////////////////////////////////////////////////////////////////////////////// +// Main Behavior Block / +/////////////////////////////////////////////////////////////////////////////// + + reg deq; + ////////////////////////////////////////////////////////// + // Output Data Gen + ////////////////////////////////////////////////////////// + + always @(DIn, DOut) + begin + if (DIn==DOut) + deq=1'b1; + else + deq=1'b0; + end + // check when data is generated from model to avoid setuphold check in + // those occasion + assign deg=deq; + + initial + begin + ////////////////////////////////////////////////////////////////// + //ID array data / S30ML01GP00 DEVICE SPECIFIC + ////////////////////////////////////////////////////////////////// + IDArray[4'd0] = 8'h01; + IDArray[4'd1] = 8'hDC; + + tmp_timing = TimingModel;//copy of TimingModel + i = 14; + while ((i >= 0) && (found != 1'b1))//search for first non null character + begin //i keeps position of first non null character + j = 7; + while ((j >= 0) && (found != 1'b1)) + begin + if (tmp_timing[i*8+j] != 1'd0) + found = 1'b1; + else + j = j-1; + end + i = i - 1; + end + i = i +1; + if (found)//if non null character is found + begin + for (j=0;j<=7;j=j+1) + begin + tmp_char[j] = TimingModel[(i-13)*8+j]; + end + end + + if ((tmp_char == "0") || (tmp_char == "1")) + IDArray[4'd2] = 8'h00; + else + IDArray[4'd2] = 8'h01; + + IDArray[4'd3] = 8'h01; + IDArray[4'd4] = 8'h22; + end + + // initialize memory and load preoload files if any + initial + begin: InitMemory + integer i,j,k; + //for (i=0;i<= PageNum;i=i+1) + //begin + // for (j=0;j<= PageSize;j=j+1) + // begin + // Mem[i*(PageSize+1)+j]=MaxData; + // end + //end + + //page segment start address offset + ssa[0] =12'h000; + ssa[1] =12'h200; + ssa[2] =12'h400; + ssa[3] =12'h600; + ssa[4] =12'h800; + ssa[5] =12'h810; + ssa[6] =12'h820; + ssa[7] =12'h830; + //page segment end address offset + sea[0] =12'h1FF; + sea[1] =12'h3FF; + sea[2] =12'h5FF; + sea[3] =12'h7FF; + sea[4] =12'h80F; + sea[5] =12'h81F; + sea[6] =12'h82F; + sea[7] =12'h83F; + + if (UserPreload && !(mem_file_name == "none")) + begin + //----------------------------------------------------------------- + // Memory preload file format for s30ml04gp00 + //----------------------------------------------------------------- + // / - comment + // @aaaaaaaa - stands for page address and address within + // first 2112 bytes of the page + // dd -
is byte to be written at Mem(Page)(offset++) + // page is div 2112 + // offset is mod 2112 + // offset is incremented on every write + //----------------------------------------------------------------- + $readmemh(mem_file_name, Mem); + //mark page segments that have been programed + for (i=0;i<(PageNum+1)*(SegmentNum+1);i=i+1) + ProgramedFlag[i] = 1'b0; + for (i=0;i<= PageNum;i=i+1) + begin + j = 0; + while (j<= PageSize) + begin + if (Mem[i*(PageSize+1)+j]!==-1) + begin + k = i*(PageSize+1)+j; + getSegment(k,segment); + ProgramedFlag[i*(SegmentNum+1)+segment] = 1'b1; + j = sea [segment]; + j = j + 1; + end + else + j = j + 1; + end + end + end + end + + initial + begin + STAT_ACT =1'b0; + STAT_M_ACT =1'b0; + ERS_ACT =1'b0; + PRG_ACT =1'b0; + FP_ACT =1'b0; + RD_ACT =1'b0; + XTREM_ACT =1'b0; + XTR_MPRG =1'b0; + RSTSTART =1'b0; + RSTDONE =1'b0; + + write =1'b0; + read =1'b0; + for(j=0;j<=PageSize;j=j+1) + begin + WrBuffData[j] = -1; + WrBuffData1[j] = -1; + end + for(j=0;j<=SegmentNum;j=j+1) + begin + SegForProg[i]=1'b0; + CSegForProg[i]=1'b0; + SegForProg1[i]=1'b0; + CSegForProg1[i]=1'b0; + end + WrAddr = -1; + WrPage = -1; + CWrAddr = -1; + CWrPage = -1; + + current_state = IDLE; + next_state = IDLE; + + Status = 8'b01100100; + + PROG_in = 1'b0; + PROG_out = 1'b0; + XPROG_in = 1'b0; + XPROG_out = 1'b0; + PRE_PROG_in = 1'b0; + PRE_PROG_out = 1'b0; + BERS_in = 1'b0; + BERS_out = 1'b0; + XBERS_in = 1'b0; + XBERS_out = 1'b0; + DBSY_in = 1'b0; + DBSY_out = 1'b0; + TR_in = 1'b0; + TR_out = 1'b0; + FPSTART_in = 1'b0; + FPSTART_out= 1'b0; + BSTATINQ_in= 1'b0; + BSTATINQ_out=1'b0; + + PROG1_in = 1'b0; + PROG1_out = 1'b0; + PROG2_in = 1'b0; + PROG2_out = 1'b0; + XPROG1_in = 1'b0; + XPROG1_out = 1'b0; + XPROG2_in = 1'b0; + XPROG2_out = 1'b0; + DBSY1_in = 1'b0; + DBSY1_out = 1'b0; + R_zd = 1'b1; + + firstFlag = 1'b0; + prog_time = tdevice_PROG; + erase_time = tdevice_BERS; + statread = 1'b0; + nostatread = 1'b1; + end + + //Power Up time 10 us; + initial + begin + PoweredUp = 1'b0; + #poweredupT PoweredUp = 1'b1; + end + + always @(negedge FP) + begin + if (PRG_ACT) + begin + $display("Embeded programm in progress, simulation may be "); + $display("inacurate due to timinig violation on FP"); + end + if (ERS_ACT) + begin + $display("Embeded erase in progress, simulation may be "); + $display("inacurate due to timinig violation on FP"); + end + FP_ACT = 1'b1; + FPSTART_in = 1'b1; + prog_time = tdevice_FPROG; + erase_time= tdevice_FBERS; + end + + always @(posedge FP) + begin + if (PRG_ACT) + begin + $display("Embeded programm in progress, simulation may be "); + $display("inacurate due to timinig violation on FP"); + end + if (ERS_ACT) + begin + $display("Embeded erase in progress, simulation may be "); + $display("inacurate due to timinig violation on FP"); + end + FP_ACT = 1'b0; + FPSTART_in = 1'b0; + prog_time = tdevice_PROG; + erase_time = tdevice_BERS; + end + + always @(posedge FPSTART_in) + begin : FP_Time + #(tdevice_FPSTART) FPSTART_out = 1'b1; + end + + always @(negedge FPSTART_in) + begin + disable FP_Time; + #1 FPSTART_out = 1'b0; + end + + //Program Operation + always @(posedge PROG_in) + begin:ProgTime + #(prog_time + WER_01) PROG_out = 1'b1; + if (FP_ACT & (~FPSTART_out)) + begin + $display("Simulation results may been inacurate"); + $display("since timing violation occures on FP"); + end + end + + always @(negedge PROG_in) + begin + disable ProgTime; + #1 PROG_out = 1'b0; + end + //PreProgram Operation + always @(posedge PRE_PROG_in) + begin:PreProgTime + #(tdevice_PRE_PROG + WER_01) PRE_PROG_out = 1'b1; + end + always @(negedge PRE_PROG_in) + begin + disable PreProgTime; + #1 PRE_PROG_out = 1'b0; + end + //XProgram Operation + always @(posedge XPROG_in) + begin:XProgTime + #(tdevice_XPROG + WER_01) XPROG_out = 1'b1; + end + always @(negedge XPROG_in) + begin + disable XProgTime; + #1 XPROG_out = 1'b0; + end + //Program Operation 1 + always @(posedge PROG1_in) + begin:ProgTime1 + #(tdevice_PROG) PROG1_out = 1'b1; + end + always @(negedge PROG1_in) + begin + disable ProgTime1; + #1 PROG1_out = 1'b0; + end + //XProgram Operation 1 + always @(posedge XPROG1_in) + begin:XProgTime1 + #(tdevice_XPROG) XPROG1_out = 1'b1; + end + always @(negedge XPROG1_in) + begin + disable XProgTime1; + #1 XPROG1_out = 1'b0; + end + //Program Operation 2 + always @(posedge PROG2_in) + begin:ProgTime2 + #(tdevice_PROG) PROG2_out = 1'b1; + end + always @(negedge PROG2_in) + begin + disable ProgTime2; + #1 PROG2_out = 1'b0; + end + //XProgram Operation 2 + always @(posedge XPROG2_in) + begin:XProgTime2 + #(tdevice_XPROG) XPROG2_out = 1'b1; + end + always @(negedge XPROG2_in) + begin + disable XProgTime2; + #1 XPROG2_out = 1'b0; + end + // Dummy busy time1 + always @(posedge DBSY1_in) + begin : DummyBusyTime1 + #(tdevice_DBSY + WER_01) DBSY1_out = 1'b1; + end + always @(negedge DBSY1_in) + begin + disable DummyBusyTime1; + #1 DBSY1_out = 1'b0; + end + //Block Erase Operation + always @(posedge BERS_in) + begin : ErsTime + #(erase_time + WER_01) BERS_out = 1'b1; + if (FP_ACT & (~FPSTART_out)) + begin + $display("Simulation results may been inacurate"); + $display("since timing violation occures on FP"); + end + end + + always @(negedge BERS_in) + begin + disable ErsTime; + #1 BERS_out = 1'b0; + end + //Block Erase Operation + always @(posedge XBERS_in) + begin : XErsTime + #(tdevice_XBERS + WER_01) XBERS_out = 1'b1; + end + always @(negedge XBERS_in) + begin + disable XErsTime; + #1 XBERS_out = 1'b0; + end + // Dummy busy time + always @(posedge DBSY_in) + begin : DummyBusyTime + #(tdevice_DBSY+ WER_01) DBSY_out = 1'b1; + end + always @(negedge DBSY_in) + begin + disable DummyBusyTime; + #1 DBSY_out = 1'b0; + end + //Page transfer time + always @(posedge TR_in) + begin : PageTransferTime + #(tdevice_TR) TR_out = 1'b1; + end + always @(negedge TR_in) + begin + disable PageTransferTime; + #1 TR_out = 1'b0; + end + + always @(posedge BSTATINQ_in) + begin : BSTATINQ_Time + #(tdevice_BSTATINQ + WER_01) BSTATINQ_out = 1'b1; + end + + always @(negedge BSTATINQ_in) + begin + disable BSTATINQ_Time; + #1 BSTATINQ_out = 1'b0; + end + + /////////////////////////////////////////////////////////////////////////// + // process for reset control and FSM state transition + /////////////////////////////////////////////////////////////////////////// + always @(PoweredUp) + begin + if (PoweredUp) + begin + reseted = 1'b1; + if (PRE) + current_state = RD; + else //currently undefined functionality for PRE=0 + current_state = IDLE; + end + else + begin + current_state = IDLE; + reseted = 1'b0; + end + end + always @(next_state) + begin + if (PoweredUp) + current_state = next_state; + else + begin + current_state = IDLE; + reseted = 1'b0; + end + end + + ////////////////////////////////////////////////////////////////////////// + //process for generating the write and read signals + ////////////////////////////////////////////////////////////////////////// + always @ (WENeg, CENeg, RENeg) + begin + if (~WENeg && ~CENeg && RENeg && WPNeg) + write = 1'b1; + else if (WENeg && ~CENeg && RENeg && WPNeg) + write = 1'b0; + else + write = 1'b0; + if (WENeg && ~CENeg && ~RENeg ) + read = 1'b1; + else if (WENeg && ~CENeg && RENeg ) + read = 1'b0; + else + read = 1'b0; + end + + ////////////////////////////////////////////////////////////////////////// + //Latches 8 bit address on rising edge of WE# + //Latches data on rising edge of WE# + ////////////////////////////////////////////////////////////////////////// + always @ (posedge WENeg) + begin + // latch 8 bit read address + if (WENeg && ALE && ~CENeg && ~CLE && WPNeg) + AddrCom = A[7:0]; + // latch data + if (WENeg && ~ALE && RENeg && WPNeg) + Data = DIn[7:0]; + end + + /////////////////////////////////////////////////////////////////////////// + // Timing control for the Reset Operation + /////////////////////////////////////////////////////////////////////////// + event rstdone_event; + always @ (posedge reseted) + begin + disable rstdone_process; + RSTDONE = 1'b1; // reset done + end + + always @ (posedge RSTSTART) + begin + if (reseted && RSTDONE) + begin + if (ERS_ACT) + duration = RstErsT; + else if (PRG_ACT) + duration = RstProgT; + else + duration = RstReadT; + RSTDONE = 1'b0; + ->rstdone_event; + end + end + + always @(rstdone_event) + begin:rstdone_process + #duration RSTDONE = 1'b1; + end + + /////////////////////////////////////////////////////////////////////////// + // Main Behavior Process + // combinational process for next state generation + /////////////////////////////////////////////////////////////////////////// + + //WRITE CYCLE TRANSITIONS + always @(negedge write or negedge reseted) + begin + if (reseted != 1'b1 ) + next_state = current_state; + else + case (current_state) + IDLE : + begin + if (CLE && ~ALE && Data==8'h00 && ~FP_ACT) + next_state = PREL_RD; + else if ( CLE && ~ALE && Data==8'h90 && ~FP_ACT) + next_state = ID_PREL; + else if ( CLE && ~ALE && Data==8'h80) + next_state = PREL_PRG; + else if ( CLE && ~ALE && Data==8'h60) + next_state = PREL_ERS; + else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT) + next_state = RESET; // reset + else if ( CLE && ~ALE && Data==8'h70 ) + next_state = IDLE; // reset + else if (CLE && ~ALE && Data==8'h85 && PGD_ACT) + next_state = PGD_PREL; + else if ( CLE && ~ALE && Data==8'hA0 && ~FP_ACT ) + next_state = XTREM_PREL; + else if ( CLE) + next_state = UNKNOWN; + end + + XTREM_PREL : + begin + if (CLE && ~ALE && Data==8'hA0 && ~FP_ACT) + next_state = XTREM_IDLE; + else if (CLE && ~ALE && Data==8'hFF && ~FP_ACT) + next_state = RESET; + else if (CLE) + next_state = UNKNOWN; + end + + XTREM_IDLE : + begin + if (CLE && ~ALE && Data==8'h00 && ~FP_ACT ) + next_state = PREL_RD; + else if ( CLE && ~ALE && Data==8'h90 && ~FP_ACT) + next_state = ID_PREL; + else if ( CLE && ~ALE && Data==8'h80 && ~FP_ACT) + next_state = PREL_PRG; + else if ( CLE && ~ALE && Data==8'h60 && ~FP_ACT) + next_state = PREL_ERS; + else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) + next_state = RESET; // reset + else if ( CLE && ~ALE && Data==8'h70 && ~FP_ACT ) + next_state = XTREM_IDLE; // reset + else if (CLE && ~ALE && Data==8'h85 && PMOVE && ~FP_ACT) + next_state = PGD_PREL; + else if ( CLE && ~ALE && Data==8'hA0 && ~FP_ACT ) + next_state = XTREM_IDLE; + else if ( CLE) + next_state = UNKNOWN; + end + + PRE_PRG : + begin + if (CLE && ~ALE && Data==8'hFF && ~FP_ACT) + next_state = RESET; // reset + end + + UNKNOWN: + begin + if (CLE && ~ALE && Data==8'hFF && ~FP_ACT ) + next_state = RESET; + end + + PREL_RD: + begin + if (ALE && ~FP_ACT) + next_state = A0_RD; + else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) + next_state = RESET; // reset + end + + A0_RD : + begin + if ( ALE && ~FP_ACT) + next_state = A1_RD; + else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) + next_state = RESET; // reset + else if ( CLE) + next_state = UNKNOWN; + end + + A1_RD : + begin + if ( ALE && ~FP_ACT) + next_state = A2_RD; + else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) + next_state = RESET; // reset + else if ( CLE) + next_state = UNKNOWN; + end + + A2_RD : + begin + if ( ALE && ~FP_ACT) + next_state = A3_RD; + else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) + next_state = RESET; // reset + else if ( CLE) + next_state = UNKNOWN; + end + + A3_RD : + begin + if ( ALE && ~FP_ACT) + next_state = RD_WCMD; + else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) + next_state = RESET; // reset + else if ( CLE) + next_state = UNKNOWN; + end + + RD_WCMD: + begin + if ((ALE && cnt_addr >= 5) || (CLE && ~ALE && cnt_addr > 5)) + next_state = UNKNOWN; + else if (CLE && ~ALE && ~FP_ACT &&(Data==8'h30|| Data==8'h35)) + next_state = BUFF_TR; + else if (CLE && ~ALE && Data==8'hFF && ~FP_ACT) + next_state = RESET; + else if (CLE) + next_state = UNKNOWN; + end + + BUFF_TR : + begin + if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT) + next_state = RESET; // reset + end + + RD : + begin + if ( CLE && ~ALE && Data==8'h00 && PGR_ACT && STAT_ACT + && ~FP_ACT) + next_state= RD; + else if (CLE && ~FP_ACT && ~ALE && Data==8'h00 && + (PGR_ACT || STAT_M_ACT)) + next_state= PREL_RD; + else if (CLE && ~ALE && Data==8'h80 && ~PGD_ACT) + next_state = PREL_PRG; + else if (CLE && ~ALE && Data==8'h90 && ~PGD_ACT && ~FP_ACT) + next_state = ID_PREL; + else if (CLE && ~ALE && Data==8'h70 && ~XTREM_ACT) + next_state = IDLE; + else if (CLE && ~ALE && Data==8'h70 && XTREM_ACT && ~FP_ACT) + next_state = XTREM_IDLE; + else if (CLE && ~ALE && Data==8'hFF && ~FP_ACT ) + next_state = RESET; // reset + else if (CLE && ~ALE && Data==8'h60 && ~PGD_ACT) + next_state = PREL_ERS; + else if (CLE && ~ALE && Data==8'h85 && PGD_ACT) + next_state = PGD_PREL; // Read next colomn address + else if (CLE && ~ALE && Data==8'h05 && ~PGD_ACT && ~FP_ACT) + next_state = CAC_PREL; + else if (CLE && ~ALE && Data==8'hA0 && ~PGD_ACT && ~XTREM_ACT + && ~FP_ACT) + next_state = XTREM_PREL; + else if (CLE) + next_state = UNKNOWN; + else + next_state = RD; + end + + CAC_PREL: + begin + if (ALE && ~FP_ACT) + next_state = A0_CAC; + else if (CLE && ~ALE && Data==8'hFF && ~FP_ACT) + next_state = RESET; + else if (CLE) + next_state = UNKNOWN; + end + + A0_CAC: + begin + if (ALE && ~FP_ACT) + next_state = A1_CAC; + else if (CLE && ~ALE && Data==8'hFF && ~FP_ACT) + next_state = RESET; + else if (CLE) + next_state = UNKNOWN; + end + + A1_CAC: + begin + if (CLE && ~ALE && Data==8'hE0 && ~FP_ACT) + next_state = RD; + else if (CLE && ~ALE && Data==8'hFF && ~FP_ACT) + next_state = RESET; + else if (CLE || ALE) + next_state = UNKNOWN; + end + + ID_PREL : + begin + if ( ALE && AddrCom==8'h00 && ~FP_ACT ) + next_state = ID; + else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT) + next_state = RESET; // reset + else if (CLE || ALE) + next_state = UNKNOWN; + end + + ID : + begin + if ( CLE && ~ALE && Data==8'h00 && ~FP_ACT ) + next_state = PREL_RD; + else if ( CLE && ~ALE && Data==8'h90 && ~FP_ACT ) + next_state = ID_PREL; + else if ( CLE && ~ALE && Data==8'h80 ) + next_state = PREL_PRG; + else if ( CLE && ~ALE && Data==8'h60 ) + next_state = PREL_ERS; + else if ( CLE && ~ALE && Data==8'h70 && ~XTREM_ACT ) + next_state = IDLE; + else if ( CLE && ~ALE && Data==8'h70 && XTREM_ACT && ~FP_ACT ) + next_state = XTREM_IDLE; + else if ( CLE && ~ALE && Data==8'hA0 && ~XTREM_ACT && ~FP_ACT) + next_state = XTREM_PREL; + else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) + next_state = RESET; // reset + else if (CLE || ALE) + next_state = UNKNOWN; + end + + PREL_PRG : + begin + if ( ALE ) + next_state = A0_PRG; + else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT) + next_state = RESET; // reset + else if (CLE) + next_state = UNKNOWN; + end + + A0_PRG : + begin + if ( ALE ) + next_state = A1_PRG; + else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT) + next_state = RESET; // reset + else if (CLE) + next_state = UNKNOWN; + end + + A1_PRG : + begin + if ( ALE ) + next_state = A2_PRG; + else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT) + next_state = RESET; // reset + else if (CLE) + next_state = UNKNOWN; + end + + A2_PRG : + begin + if ( ALE ) + next_state = A3_PRG; + else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT) + next_state = RESET; // reset + else if (CLE) + next_state = UNKNOWN; + end + + A3_PRG : + begin + if ( ALE ) + next_state = DATA_PRG; + else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT) + next_state = RESET; // reset + else if (CLE) + next_state = UNKNOWN; + end + + DATA_PRG : + begin + if ((ALE && (cnt_addr <2 || cnt_addr >= 5)) || + (CLE && ~ALE && cnt_addr > 5)) + next_state = UNKNOWN; + else if (CLE && ~ALE && Data==8'h10) + if (PRG_ACT) + next_state = WFPPD; // Waiting for programing done + else + next_state = PGMS; + else if (CLE && ~ALE && ~PGD_ACT && Data==8'h15) + if (PRG_ACT) + next_state = WFPD; // Waiting for programing done + else + next_state = CBSY; + else if (CLE && ~ALE && Data==8'h85) + next_state = PGMS_CAC; + else if (CLE && ~ALE && Data == 8'h12 && PGD_ACT && XTREM_ACT + && ~FP_ACT) + next_state = PGMS; + else if (CLE && ~ALE && Data==8'hFF) + next_state = RESET; // reset + else if (CLE) + next_state = UNKNOWN; + else if (~ALE && ~CLE && CWrAddr < PageSize+1) + next_state = DATA_PRG; // write next word to buffer + end + + WFPD: + begin + if (CLE && ~ALE && Data==8'hFF && ~FP_ACT) + next_state = RESET; // reset + end + + WFPPD: + begin + if (CLE && ~ALE && Data==8'hFF && ~FP_ACT) + next_state = RESET; // reset + end + + PGMS_CAC: + begin + if (CLE && ~ALE && Data==8'hFF && ~FP_ACT) + next_state = RESET; + else if (ALE) + next_state = A0_PRG_CAC; + else if (CLE) + next_state = UNKNOWN; + end + + PGMS : + begin + if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT) + next_state = RESET; // reset + end + + CBSY: + begin + if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) + next_state = RESET; // reset + end + + RDY_PRG : + begin + if ( CLE && ~ALE && Data==8'h80 ) + next_state = PREL_PRG; + else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT) + next_state = RESET; // reset + else if ( CLE && ~ALE && Data==8'h70 ) + next_state = RDY_PRG; // + else if ( CLE ) + next_state = UNKNOWN; // reset + end + + A0_PRG_CAC: + begin + if (ALE ) + next_state = DATA_PRG; + else if (CLE && ~ALE && Data==8'hFF && ~FP_ACT) + next_state = RESET; + else if ( CLE ) + next_state = UNKNOWN; // reset + end + + PREL_ERS : + begin + if ( ALE ) + next_state = A1_ERS; + else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) + next_state = RESET; // reset + else if ( CLE ) + next_state = UNKNOWN; // reset + end + + A1_ERS : + begin + if ( ALE ) + next_state = A2_ERS; + else if ( CLE && ~ALE && Data==8'hFF ) + next_state = RESET; // reset + else if ( CLE ) + next_state = UNKNOWN; // reset + end + + A2_ERS : + begin + if ( ALE ) + next_state = A3_ERS; + else if ( CLE && ~ALE && Data==8'hFF ) + next_state = RESET; // reset + else if ( CLE ) + next_state = UNKNOWN; // reset + end + + A3_ERS : + begin + if ( CLE && ~ALE && Data==8'hD0 ) + next_state = BERS_EXEC; + else if (CLE && ~ALE && XTREM_ACT && Data == 8'h11 + && ~FP_ACT) + next_state = PRE_PRG; + else if (CLE && ~ALE && Data == 8'h71 && ~FP_ACT) + next_state = BSTAT_INQ; //BUFF_TR; + else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) + next_state = RESET; // reset + else if ( CLE || ALE) + next_state = UNKNOWN; // reset + end + + BERS_EXEC : + begin + if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) + next_state = RESET; // reset + end + + PGD_PREL : + begin + if ( ALE ) + next_state = A0_PGD; + else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) + next_state = RESET; // reset + else if ( CLE ) + next_state = UNKNOWN; // reset + end + + A0_PGD : + begin + if ( ALE ) + next_state = A1_PGD; + else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) + next_state = RESET; // reset + else if ( CLE ) + next_state = UNKNOWN; // reset + end + + A1_PGD : + begin + if ( ALE ) + next_state = A2_PGD; + else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) + next_state = RESET; // reset + else if ( CLE ) + next_state = UNKNOWN; // reset + end + + A2_PGD : + begin + if ( ALE ) + next_state = A3_PGD; + else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) + next_state = RESET; // reset + else if ( CLE ) + next_state = UNKNOWN; // reset + end + + A3_PGD : + begin + if ( ALE ) + next_state = CONF_PGD; + else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) + next_state = RESET; // reset + else if ( CLE ) + next_state = UNKNOWN; // reset + end + + CONF_PGD : + begin + if ((ALE && cnt_addr >= 5) || (CLE && ~ALE && cnt_addr > 5)) + next_state = UNKNOWN; + else if ( CLE && ~ALE && Data==8'h10) + next_state = PGMS; + else if ( CLE && ~ALE && XTREM_ACT && Data==8'h12 && ~FP_ACT) + next_state = PGMS; + else if ( CLE && ~ALE && Data==8'h85) + next_state = PGMS_CAC; + else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT) + next_state = RESET; // reset + else if ( CLE ) + next_state = UNKNOWN; // reset + end + BSTAT_INQ : + if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT) + next_state = RESET; // reset + + endcase + end + + // RESET state, RSTDONE + always @(current_state, RSTDONE) + begin: StateGen1 + if (current_state == RESET && RSTDONE) + if (PRE) + next_state = RD; + else if (~XTREM_ACT) + next_state = IDLE; + else + next_state = XTREM_IDLE; + end + + always @(posedge reseted) + begin: StateGen1_1 + if (PRE) + next_state = RD; + else + next_state = IDLE; + end + + // BUFF_TR, TR_out + always @(current_state,read,BERS_out,XBERS_out,PROG_out,XPROG_out,TR_out, + DBSY_out, DBSY1_out, PROG1_out, XPROG1_out, + PROG2_out, XPROG2_out, BSTATINQ_out) + begin: StateGen2 + if (current_state == BUFF_TR) + if( TR_out) + next_state = RD; + if (current_state == BSTAT_INQ) + if( BSTATINQ_out) + next_state = RD; + end + + // CBSY - DBSY_out + always @(current_state,read,BERS_out,XBERS_out,PROG_out,XPROG_out,TR_out, + DBSY_out,DBSY1_out, PROG1_out, XPROG1_out, + PROG2_out, XPROG2_out) + begin: StateGen3 + if (current_state == CBSY && (DBSY_out || DBSY1_out)) + next_state = RDY_PRG; + end + + // WFPD,WFPPD,RDY_PRG - PROG_out + always @(current_state, BERS_out,XBERS_out,PROG_out,XPROG_out,TR_out, + DBSY_out, DBSY1_out, PROG1_out, XPROG1_out, + PROG2_out, XPROG2_out) + begin: StateGen5 + if (current_state == WFPD && (PROG1_out || XPROG1_out)) + next_state = CBSY; // programming done + else if (current_state == WFPPD && (PROG1_out || XPROG1_out)) + next_state = PGMS; // next start programing + else if (current_state == RDY_PRG && PROG1_out) + next_state = IDLE; + else if (current_state == RDY_PRG && XPROG1_out) + next_state = XTREM_IDLE; + end + + // PGMS - PROG_out + always @(posedge PROG_out ) + begin: StateGen5_1 + if (current_state == PGMS) + next_state = IDLE; // programming done + end + + // PRE_PRG - PRE_PROG_out + always @(posedge PRE_PROG_out ) + begin: StateGen5_2 + if (current_state == PRE_PRG) + next_state = XTREM_IDLE; // programming done + end + + // PGMS - XPROG_out + always @(posedge XPROG_out ) + begin: StateGen5_3 + if (current_state == PGMS) + next_state = XTREM_IDLE; // programming done + end + + // PGMS - PROG1_out + always @(posedge PROG2_out ) + begin: StateGen5_4 + if (current_state == PGMS) + next_state = IDLE; // programming done + end + + // PGMS - XPROG1_out + always @(posedge XPROG2_out ) + begin: StateGen5_5 + if (current_state == PGMS) + next_state = XTREM_IDLE; // programming done + end + + // BERS_EXEC, BERS_out + always @(current_state, BERS_out, + PROG_out, TR_out, DBSY_out) + begin: StateGen6_1 + if (current_state == BERS_EXEC && BERS_out) + next_state = IDLE; + end + + // BERS_EXEC, XBERS_out + always @(current_state, XBERS_out, + PROG_out, XPROG_out, TR_out, DBSY_out) + begin: StateGen6_2 + if (current_state == BERS_EXEC && XBERS_out) + next_state = XTREM_IDLE; + end + + always @(posedge STAT_ACT) + begin + statread = 1'b1; + nostatread = 1'b0; + end + + always @(negedge STAT_ACT) + begin + statread = 1'b0; + nostatread = 1'b1; + end + + /////////////////////////////////////////////////////////////////////////// + //FSM Output generation and general funcionality + /////////////////////////////////////////////////////////////////////////// + always @(posedge read) + begin + ->oe_event; + end + + always @(oe_event) + begin + oe = 1'b1; + #1 oe = 1'b0; + end + + always @( posedge oe) + begin: Output + case (current_state) + + RD : + begin + if (~PGD_ACT && ~STAT_ACT && ~STAT_M_ACT) + Read_Data(Address,PageAddr,BlockAddr); + else if (~PGD_ACT && ~STAT_ACT && STAT_M_ACT) + Read_StatMode(Blck); + else if (STAT_ACT) + Read_Status(Blck); + end + + ID : + begin + if ( IDAddr < 5 ) + begin + DOut_zd = IDArray[IDAddr]; + IDAddr = IDAddr+1; + end + else + DOut_zd = 'bz; + end + + IDLE , + XTREM_IDLE , + WFPD , + WFPPD , + PGMS , + CBSY , + PRE_PRG , + BUFF_TR , + RDY_PRG , + BERS_EXEC : + begin + if (STAT_ACT) + Read_Status(Blck); + end + endcase + end + + always @(WPNeg_ipd) + begin + Status[7] = WPNeg_ipd; + end + + always @(negedge write) + begin: Func0 + if (~reseted) + R_zd = 1'b1; + else if (reseted) + case (current_state) + IDLE, XTREM_IDLE : + begin + if ( CLE && ~ALE && (Data==8'h00 || Data==8'h60)) + begin + STAT_ACT = 1'b0; + Status[6:3] = 4'b1100; + Status[1:0] = 2'b00; + end + else if ( CLE && ~ALE && Data==8'h70 ) + begin + STAT_ACT = 1'b1; + end + else if (CLE && ~ALE && (Data==8'h80 || Data==8'h90)) + begin + STAT_ACT = 1'b0; + end + else if (CLE && ~ALE && Data==8'h85 && PGD_ACT) + begin + STAT_ACT = 1'b0; + Status[6:3] = 4'b1100; + Status[1:0] = 2'b00; + end + else if ( CLE && ~ALE && Data==8'hFF ) + set_reset; + end + + XTREM_PREL : + begin + if ( CLE && ~ALE && Data == 8'hA0) + XTREM_ACT = 1'b1; + else if ( CLE && ~ALE && Data==8'hFF ) + set_reset; + end + + UNKNOWN: + begin + if (CLE && ~ALE && Data==8'hFF) + begin + ERS_ACT = 1'b0; + PGD_ACT = 1'b0; + RD_ACT = 1'b0; + PGR_ACT = 1'b0; + Status[6:3] = 4'b1100; + Status[1:0] = 2'b00; + set_reset; + end + end + + PREL_RD: + begin + if (ALE) + begin + Pom_Address = AddrCom; + cnt_addr = 0; + end + else if (CLE && ~ALE && Data==8'hFF) + set_reset; + end + + A0_RD : + begin + if ( ALE ) + begin + Pom_Address = (AddrCom* 12'h100) + Pom_Address; + cnt_addr = cnt_addr + 1; + end + else if ( CLE && ~ALE && Data==8'hFF ) + set_reset; + end + + A1_RD : + begin + if ( ALE ) + begin + if ( XTREM_ACT ) + Page = AddrCom * 2; + else + Page = AddrCom; + cnt_addr = cnt_addr + 1; + end + else if ( CLE && ~ALE && Data==8'hFF ) + set_reset; + end + + A2_RD : + begin + if ( ALE ) + begin + Blck = AddrCom; + cnt_addr = cnt_addr + 1; + end + else if ( CLE && ~ALE && Data==8'hFF ) + set_reset; + end + + A3_RD : + begin + if ( ALE ) + begin + Blck = Blck + (AddrCom*12'h100); + cnt_addr = cnt_addr + 1; + end + else if ( CLE && ~ALE && Data==8'hFF ) + set_reset; + end + + RD_WCMD: + begin + if (CLE && ~ALE && Data==8'h30) + begin + PGR_ACT = 1'b1; + Address = Pom_Address; + PageAddr = Blck*(BlockSize + 1) + Page; + BlockAddr = Blck; + TR_in = 1'b1; + R_zd = 1'b0; + Status[6:5] = 2'b00; + end + else if( CLE && ~ALE && Data==8'h35) + begin + PGD_ACT = 1'b1; + PMOVE = 1'b1; + TR_in = 1'b1; + R_zd = 1'b0; + Status[6:5] = 2'b00; + Address = Pom_Address; + PageAddr = Blck*(BlockSize + 1) + Page; + for (i=0; i<=PageSize; i=i+1) + begin + PDBuffer[i] = -1; + PDBuffer1[i] = -1; + end + end + else if(CLE && ~ALE && Data==8'hFF) + set_reset; + else if (ALE) + cnt_addr = cnt_addr + 1; + end + + BUFF_TR : + begin + if ( CLE && ~ALE && Data==8'hFF ) + begin + TR_in = 1'b0; + DBSY_in = 1'b0; + if (XTREM_ACT) + back_to_xtrem = 1'b1; + else + back_to_xtrem = 1'b0; + set_reset; + end + else if ( CLE && ~ALE && Data==8'h70 ) + STAT_ACT = 1'b1; + end + + RD : + begin + if ( CLE && ~ALE && Data==8'h00 && ~PGD_ACT) + begin + Status[6:3] = 4'b1100; + Status[1:0] = 2'b00; + PGR_ACT = 1'b0; + STAT_ACT = 1'b0; + STAT_M_ACT = 1'b0; + end + else if ( CLE && ~ALE && Data==8'h70) + begin + STAT_ACT = 1'b1; + STAT_M_ACT = 1'b0; + PGR_ACT = 1'b0; + end + else if ( CLE && ~ALE && Data==8'h90 && ~PGD_ACT) + begin + STAT_ACT = 1'b0; + STAT_M_ACT = 1'b0; + PGR_ACT = 1'b0; + end + else if ( CLE && ~ALE && Data==8'h80 && ~PGD_ACT) + begin + STAT_ACT = 1'b0; + STAT_M_ACT = 1'b0; + PGR_ACT = 1'b0; + Status[6:3] = 4'b1100; + Status[1:0] = 2'b00; + end + else if ( CLE && ~ALE && Data==8'hA0 && ~PGD_ACT) + begin + STAT_ACT = 1'b0; + STAT_M_ACT = 1'b0; + Status[6:3] = 4'b1100; + Status[1:0] = 2'b00; + end + else if ( CLE && ~ALE && Data==8'h60 && ~PGD_ACT) + begin + STAT_ACT = 1'b0; + STAT_M_ACT = 1'b0; + PGR_ACT = 1'b0; + Status[6:3] = 4'b1100; + Status[1:0] = 2'b00; + end + else if ( CLE && ~ALE && Data==8'hFF ) + begin + set_reset; + STAT_M_ACT = 1'b0; + end + else if ( CLE && ~ALE && Data==8'h85 && PGD_ACT) + begin + STAT_ACT = 1'b0; + STAT_M_ACT = 1'b0; + Status[6:3] = 4'b1100; + Status[1:0] = 2'b00; + end + else if ( CLE && ~ALE && Data==8'h05 && ~PGD_ACT) + begin + STAT_ACT = 1'b0; + STAT_M_ACT = 1'b0; + Status[6:3] = 4'b1100; + Status[1:0] = 2'b00; + end + end + + CAC_PREL: + begin + if( ALE ) + begin + Pom_Address = AddrCom; + cnt_addr = 0; + end + else if( CLE && ~ALE && Data==8'hFF) + set_reset; + end + + A0_CAC: + begin + if (ALE) + begin + Pom_Address = Pom_Address + AddrCom * 12'h100; + cnt_addr = cnt_addr + 1; + end + else if (CLE && ~ALE && Data==8'hFF) + set_reset; + end + + A1_CAC: + begin + if (CLE && ~ALE && Data==8'hE0) + Address = Pom_Address; + else if (CLE && ~ALE && Data==8'hFF) + set_reset; + else if (ALE) + cnt_addr = cnt_addr + 1; + end + + ID_PREL : + begin + if ( ALE && AddrCom==8'h00 ) + IDAddr = 0; + else if ( CLE && ~ALE && Data==8'hFF ) + set_reset; + end + + ID : + begin + if ( CLE && ~ALE && Data==8'hFF ) + set_reset; + else if ( CLE && ~ALE && Data==8'h70 ) + STAT_ACT = 1'b1; + else if ( CLE && ~ALE && Data==8'h00 ) + STAT_ACT = 1'b0; + end + + PREL_PRG : + begin + if ( ALE ) + begin + CWrAddr = AddrCom; + cnt_addr = 0; + end + else if ( CLE && ~ALE && Data==8'hFF ) + set_reset; + end + + A0_PRG : + begin + if ( ALE ) + begin + CWrAddr = (AddrCom * 12'h100)+CWrAddr; + cnt_addr = cnt_addr + 1; + for(i=0; i<=PageSize; i=i+1) + CashBuffData[i]=-1; + end + else if ( CLE && ~ALE && Data==8'hFF ) + set_reset; + end + + A1_PRG : + begin + if ( ALE ) + begin + if ( XTREM_ACT ) + Page = AddrCom * 2; + else + Page = AddrCom; + + cnt_addr = cnt_addr + 1; + end + else if ( CLE && ~ALE && Data==8'hFF ) + set_reset; + end + + A2_PRG : + begin + if ( ALE ) + begin + Blck = AddrCom; + cnt_addr = cnt_addr + 1; + end + else if ( CLE && ~ALE && Data==8'hFF ) + set_reset; + end + + A3_PRG : + begin + if ( ALE ) + begin + Blck = (AddrCom*12'h100) + Blck; + Page_pom = Page + Blck*(BlockSize+1); + CWrPage = Page + Blck*(BlockSize+1); + getSegment(CWrAddr,segment); + cnt_addr = cnt_addr + 1; + for(i=0; i<= SegmentNum; i=i+1) + begin + CSegForProg[i] = ProgramedFlag[ + (SegmentNum+1)*Page_pom + i]; + CSegForProg1[i] = ProgramedFlag[ + (SegmentNum+1)*(Page_pom+1) + i]; + end + end + else if ( CLE && ~ALE && Data==8'hFF ) + set_reset; + end + + DATA_PRG : + begin + if (CLE && ~ALE && Data==8'hFF) + set_reset; + else if (~ALE && ~CLE && CWrAddr < PageSize+1) + begin + if (~XTREM_ACT) + begin + getSegment(CWrAddr,segment); + if (~ProgramedFlag[(SegmentNum+1)*CWrPage + segment]) + CashBuffData[CWrAddr] = Data; + CSegForProg[segment] = 1'b1; + end + else + begin + Page_pom = Page + Blck*(BlockSize+1); + XgetSegment(CWrAddr,segment,segment1); + if (~ProgramedFlag[(SegmentNum+1)*(Page_pom)+segment] + && ~ProgramedFlag[(SegmentNum+1)*(Page_pom)+segment1] + && ~PGD_ACT) + CashBuffData[CWrAddr] = Data; + else if (~ProgramedFlag[(SegmentNum+1)* + (Page_pom)+segment] && PGD_ACT && + ~ProgramedFlag[(SegmentNum+1)*(Page_pom)+segment1]) + XTR_Buffdata(CWrAddr,Data); + if (Page_pom > CWrPage) + begin + CSegForProg1[segment] = 1; + CSegForProg1[segment1] = 1; + end + else if (Page_pom == CWrPage) + begin + CSegForProg[segment] = 1; + CSegForProg[segment1] = 1; + end + end + Page_pom = Page + Blck*(BlockSize+1); + CWrAddr = CWrAddr+1; + end + else if (CLE && ~ALE && Data==8'h10) + begin + R_zd = 1'b0; + Status[5] = 1'b0; + //part of the FlagGeneration process + if (~PRG_ACT) + begin + CWrPage = Page + Blck*(BlockSize+1); + PRG_ACT = 1'b1; + if (~XTREM_ACT) + PROG_in = 1'b1; + else + XPROG_in = 1'b1; + end + firstFlag = 1'b1; + ProgBlock[Blck] = 1; + end + else if (CLE && ~ALE && Data==8'h12) + begin + if (PGD_ACT) + CWrPage = Page/2 + Blck*(BlockSize+1); + if (~PRG_ACT) + begin + PRG_ACT = 1'b1; + if (XTREM_ACT) + XPROG_in = 1'b1; + end + R_zd = 1'b0; + Status[5] = 1'b0; + XTR_MPRG = 1'b1; + firstFlag = 1'b1; + ProgBlock[Blck] = 1; + end + else if( CLE && ~ALE && ~PGD_ACT && Data==8'h15) + begin + if (~PRG_ACT) + begin + DBSY_in = 1'b1; + CWrPage = Page + Blck*(BlockSize+1); + end + R_zd = 1'b0; + Status[6] = 1'b0; + firstFlag = 1'b1; + ProgBlock[Blck] = 1; + end + else if (ALE) + cnt_addr = cnt_addr + 1; + end + + PGMS_CAC: + begin + if (ALE) + begin + CWrAddr = AddrCom; + cnt_addr = 0; + end + else if (CLE && ~ALE && Data==8'hFF) + set_reset; + end + + A0_PRG_CAC: + begin + if (ALE) + begin + CWrAddr = (AddrCom * 12'h100)+CWrAddr; + cnt_addr = cnt_addr + 1; + end + else if (CLE && ~ALE && Data==8'hFF) + set_reset; + end + + WFPD: + begin + if (CLE && ~ALE && Data==8'hFF) + begin + set_reset; + if (XTREM_ACT) + back_to_xtrem = 1'b1; + else + back_to_xtrem = 1'b0; + if (XTREM_ACT && ~PGD_ACT) + XTR_Pgms_init(WrPage); + end + else if (CLE && ~ALE && Data==8'h70) + STAT_ACT = 1'b1; + end + + WFPPD: + begin + if (CLE && ~ALE && Data==8'hFF) + begin + set_reset; + if (XTREM_ACT) + back_to_xtrem = 1'b1; + else + back_to_xtrem = 1'b0; + if (XTREM_ACT && ~PGD_ACT) + XTR_Pgms_init(WrPage); + // part of the FlagGeneration process + if(~PROG1_out) + begin + PROG1_in = 1'b0; + end + if(~XPROG1_out) + begin + XPROG1_in = 1'b0; + end + end + else if (CLE && ~ALE && Data==8'h70) + STAT_ACT = 1'b1; + end + + PRE_PRG : + begin + if (CLE && ~ALE && Data==8'hFF) + begin + if (~(WPNeg==1'b0)) + begin + for(i = Blck *(BlockSize+1) *(PageSize+1); + i < (Blck+1)*(BlockSize+1) *(PageSize+1); + i=i+1) + Mem[i] = -1; + InvBlock[Blck] = 1; + end + PRE_PROG_in = 1'b0; + set_reset; + end + else if (CLE && ~ALE && Data==8'h70) + STAT_ACT = 1; // read status + end + + PGMS : + begin + if ( CLE && ~ALE && Data==8'hFF ) + begin + set_reset; + InvBlockPgms[Blck] = 1; + if (XTREM_ACT) + back_to_xtrem = 1'b1; + else + back_to_xtrem = 1'b0; + if (XTREM_ACT && ~PGD_ACT) + XTR_Pgms_init(WrPage); + end + else if ( CLE && ~ALE && Data==8'h70 ) + STAT_ACT = 1'b1; + end + + CBSY : + begin + if ( CLE && ~ALE && Data==8'h70 ) + STAT_ACT = 1'b1; + else if ( CLE && ~ALE && Data==8'hFF ) + begin + set_reset; + if (XTREM_ACT) + back_to_xtrem = 1'b1; + else + back_to_xtrem = 1'b0; + DBSY_in = 1'b0; + DBSY1_in = 1'b0; + end + end + + RDY_PRG : + begin + if ( CLE && ~ALE && Data==8'h70 ) + STAT_ACT = 1'b1; + else if (CLE && ~ALE && Data==8'hFF) + begin + set_reset; + if (XTREM_ACT) + back_to_xtrem = 1'b1; + else + back_to_xtrem = 1'b0; + if (XTREM_ACT && ~PGD_ACT) + XTR_Pgms_init(WrPage); + end + end + + PREL_ERS : + begin + if ( ALE ) + begin + Page = AddrCom; + cnt_addr = 0; + end + else if ( CLE && ~ALE && Data==8'hFF ) + set_reset; + end + + A1_ERS : + begin + if ( ALE ) + begin + Blck = AddrCom; + cnt_addr = cnt_addr + 1; + end + else if ( CLE && ~ALE && Data==8'hFF ) + set_reset; + end + + A2_ERS : + begin + if ( ALE ) + begin + Blck = Blck + (AddrCom*12'h100); + WrPage = Page + Blck*(BlockSize+1); + cnt_addr = cnt_addr + 1; + end + else if ( CLE && ~ALE && Data==8'hFF ) + set_reset; + end + + A3_ERS : + begin + if ( CLE && ~ALE && Data==8'hFF ) + set_reset; + else if ( CLE && ~ALE && Data==8'hD0 ) + begin + if (~(WPNeg==1'b0)) + begin + for(i = Blck *(BlockSize+1) *(PageSize+1); + i < (Blck+1)*(BlockSize+1) *(PageSize+1); + i=i+1) + Mem[i] = -1; + end + if (~XTREM_ACT) + BERS_in = 1'b1; + else + XBERS_in = 1'b1; + ERS_ACT = 1'b1; + R_zd = 1'b0; + Status[6:5] = 2'b00; + end + else if ( CLE && ~ALE && XTREM_ACT && Data==8'h11 ) + begin + PRE_PROG_in = 1'b1; + PRG_ACT = 1'b1; + R_zd = 1'b0; + Status[6:5] = 2'b00; + end + else if ( CLE && ~ALE && Data==8'h71 ) + begin + STAT_M_ACT = 1'b1; + BSTATINQ_in = 1'b1; + R_zd = 1'b0; + Status[6:5] = 2'b00; + end + else if (ALE) + cnt_addr = cnt_addr + 1; + end + + BERS_EXEC : + begin + if ( CLE && ~ALE && Data==8'hFF ) + begin + BERS_in = 1'b0; + XBERS_in = 1'b0; + set_reset; + if (XTREM_ACT) + back_to_xtrem = 1'b1; + else + back_to_xtrem = 1'b0; + InvBlock[Blck] = 1; + end + else if ( CLE && ~ALE && Data==8'h70 ) + STAT_ACT = 1'b1; + end + + PGD_PREL : + begin + if (ALE) + begin + Pom_Address = AddrCom; + cnt_addr = 0; + PGD_ACT = 1'b1; + PMOVE = 1'b0; + end + else if( CLE && ~ALE && Data==8'hFF) + set_reset; + end + + A0_PGD: + begin + if (ALE) + begin + Pom_Address = (AddrCom* 12'h100) + Pom_Address; + CWrAddr = Pom_Address; + cnt_addr = cnt_addr + 1; + end + else if (CLE && ~ALE && Data==8'hFF) + set_reset; + end + + A1_PGD : + begin + if ( ALE ) + begin + Page = AddrCom; + cnt_addr = cnt_addr + 1; + end + else if (CLE && ~ALE && Data==8'hFF ) + set_reset; + end + + A2_PGD : + begin + if ( ALE ) + begin + Blck = AddrCom; + cnt_addr = cnt_addr + 1; + end + else if (CLE && ~ALE && Data==8'hFF ) + set_reset; + end + + A3_PGD : + begin + if ( ALE ) + begin + Blck = Blck + (AddrCom*12'h100); + cnt_addr = cnt_addr + 1; + BlckDup = Blck; + end + else if (CLE && ~ALE && Data==8'hFF ) + set_reset; + end + + CONF_PGD : + begin + if (CLE && ~ALE && (Data==8'h10 || Data==8'h12 || Data==8'h85)) + begin + if (~XTREM_ACT) + for (i=0; i<=PageSize; i=i+1) + CashBuffData[i] = PDBuffer[i]; + else + begin + for (i=0; i<=PageSize; i=i+1) + begin + CashBuffData[i] = PDBuffer[i]; + CashBuffData1[i] = PDBuffer1[i]; + end + end + for(i=0; i<= SegmentNum; i=i+1) + CSegForProg[i]=1'b1; + if (Data == 8'h12 && XTREM_ACT) + begin + XTR_MPRG = 1'b1; + Page =Page/2; + end + else + XTR_MPRG = 1'b0; + CWrPage = Page + Blck*(BlockSize+1); + end + if (CLE && ~ALE && (Data==8'h10 || Data==8'h12) && ~PRG_ACT) + begin + PRG_ACT = 1'b1; + if (~XTREM_ACT) + PROG_in = 1'b1; + else + begin + if (BlockMod[BlckDup]==0) + PROG_in = 1'b1; + else + XPROG_in = 1'b1; + end + ProgBlock[Blck] = 1; + firstFlag = 1'b1; + R_zd = 1'b0; + Status[5] = 1'b0; + end + else if ( CLE && ~ALE && Data==8'hFF) + set_reset; + else if (ALE) + cnt_addr = cnt_addr + 1; + end + + endcase + end + + always @(TR_out, DBSY_out,PROG_out,XPROG_out ) + begin : Func0_2 + if ((TR_out || DBSY_out || PROG_out || XPROG_out) && read && STAT_ACT) + Read_Status(Blck); + end + + //after reset, state is don't care + always @(posedge reseted) + begin: Func0_1 + if (reseted) + if (PRE) + begin + Address = 1'b0; + PageAddr= 1'b0; + PGR_ACT = 1'b1; + end + else + PGR_ACT = 1'b0; + end + + //RESET state, RSTDONE + always @(current_state, read, write, BERS_out, XBERS_out, + PROG_out, XPROG_out,TR_out,DBSY_out,RSTDONE,PROG1_out,XPROG1_out, + PROG2_out,XPROG2_out,DBSY1_out) + begin: Func1 + if (current_state == RESET) + begin + if (~back_to_xtrem) + XTREM_ACT = 1'b0; + else + XTREM_ACT = 1'b1; + if (RSTDONE) + begin + STAT_ACT = 1'b0; + ERS_ACT = 1'b0; + RD_ACT = 1'b0; + PGD_ACT = 1'b0; + PGR_ACT = 1'b1; + PRG_ACT = 1'b0; + STAT_M_ACT = 1'b0; + PMOVE = 1'b0; + XTR_MPRG = 1'b0; + R_zd = 1'b1; + Status[6:3] = 4'b1100; + Status[1:0] = 2'b00; + if (PRE) + begin + Address = 1'b0; + PageAddr= 1'b0; + PGR_ACT = 1'b1; + end + else + PGR_ACT = 1'b0; + end + end + end + + always @(current_state, read, write, BERS_out, XBERS_out, + PROG_out, XPROG_out,TR_out,DBSY_out,RSTDONE,PROG1_out,XPROG1_out, + PROG2_out,XPROG2_out,DBSY1_out) + begin: Func2_1 + if (current_state == XTREM_IDLE && ~XPROG_in) + begin + PGD_ACT = 1'b0; + XTR_MPRG = 1'b0; + end + end + + //BUFF_TR state, TR_out + always @(read, Data, AddrCom, current_state,PROG1_out,XPROG1_out,PROG2_out, + XPROG2_out, RENeg, CENeg, ALE, CLE, BERS_out,XBERS_out, PROG_out, + XPROG_out, TR_out, DBSY_out, WPNeg, PGD_ACT,DBSY1_out) + begin: Func2_2 + if (current_state == BUFF_TR && TR_out) + begin + if (PGD_ACT && ~XTREM_ACT) + for (i=0; i<=PageSize; i=i+1) + PDBuffer[i] = Mem[PageAddr*(PageSize+1)+i]; + else if (PGD_ACT && XTREM_ACT) + for (i=0; i<=PageSize; i=i+1) + begin + PDBuffer[i] = Mem[PageAddr*(PageSize+1)+i]; + PDBuffer1[i] = Mem[(PageAddr+1)*(PageSize+1)+i]; + end + R_zd = 1'b1; + Status[6:5]= 2'b11; + TR_in = 1'b0; + end + end + + always @(read, Data, AddrCom, reseted, current_state, + RENeg, CENeg, ALE, CLE, BERS_out,XBERS_out, PROG_out,XPROG_out, + DBSY_out, WPNeg, PGD_ACT,PROG1_out,XPROG1_out) + begin : Func3_1 + if(current_state==WFPD && PROG1_out) + begin + DBSY1_in = 1'b1; + CWrPage = Page + Blck*(BlockSize+1); + Status[5] = 1'b1; + end + else if(current_state==WFPPD && PROG1_out) + begin + PROG2_in = 1'b1; + PROG1_in = 1'b0; + if (WPNeg) + begin + for (j=0;j<=PageSize; j=j+1) + begin + getSegment(j,pom_seg); + if (WrBuffData[j] != -1 && + ~ProgramedFlag[WrPage*(SegmentNum+1)+pom_seg]) + begin + Mem[WrPage*(PageSize+1)+j] = WrBuffData[j]; + WrBuffData[j]=-1; + end + end + for (j=0;j<=SegmentNum; j=j+1) + ProgramedFlag[WrPage*(SegmentNum+1)+j]= SegForProg[j]; + CWrPage = Page + Blck*(BlockSize+1); + Status[5] = 1'b0; + end + end + end + + always @(read, Data, AddrCom, reseted, current_state, + RENeg, CENeg, ALE, CLE, BERS_out,XBERS_out, PROG_out,XPROG_out, + DBSY_out, WPNeg, PGD_ACT,PROG1_out,XPROG1_out) + begin : Func3_2 + if(current_state==WFPD && XPROG1_out) + begin + DBSY1_in = 1'b1; + CWrPage = Page + Blck*(BlockSize+1); + Status[5] = 1'b1; + end + else if(current_state==WFPPD && XPROG1_out) + begin + XPROG2_in = 1'b1; + XPROG1_in = 1'b0; + if (WPNeg) + begin + for (j=0;j<=PageSize; j=j+1) + begin + Page_pom = WrPage; + XgetSegment(j,pom_seg,pom_seg1); + if (WrBuffData[j] != -1 && + ~ProgramedFlag[Page_pom*(SegmentNum+1)+pom_seg] && + ~ProgramedFlag[Page_pom*(SegmentNum+1)+pom_seg1]) + begin + XTR_Pgms_data(j,WrPage); + end + end + for (j=0; j<=SegmentNum; j=j+1) + begin + ProgramedFlag[WrPage*(SegmentNum+1)+j]= SegForProg[j]; + ProgramedFlag[(WrPage+1)*(SegmentNum+1)+j]= SegForProg1[j]; + end + CWrPage = Page + Blck*(BlockSize+1); + Status[5] = 1'b0; + end + end + end + + //PGMS state,WPNeg + always @(current_state) + begin: Func4 + integer i,j,k; + if (current_state==PGMS ) + begin + if ( WPNeg && firstFlag) + begin + firstFlag = 1'b0; + for (i=0; i<=PageSize; i=i+1) + begin + WrBuffData[i] = CashBuffData[i]; + WrBuffData1[i] = CashBuffData1[i]; + end + WrPage = CWrPage; + WrAddr = CWrAddr; + for(i=0;i<=SegmentNum;i=i+1) + begin + SegForProg[i]=CSegForProg[i]; + SegForProg1[i]=CSegForProg1[i]; + end + if (~XTREM_ACT) + begin + for(i=0;i<=PageSize;i=i+1) + begin + getSegment(i,segment); + if ( CashBuffData[i] != -1 && + ProgramedFlag[CWrPage*(SegmentNum+1) + segment]== 0) + Mem[CWrPage*(PageSize+1)+i]= -1; + end + end + else if (XTR_MPRG) + begin + for (i=0;i<=PageSize;i=i+1) + begin + getSegment(i,segment); + if ( CashBuffData[i] != -1 && + ProgramedFlag[CWrPage*(SegmentNum+1) + segment]== 0) + Mem[CWrPage*(PageSize+1)+i]= -1; + end + end + else if (PGD_ACT) + begin + for (i=0;i<=PageSize;i=i+1) + begin + Page_pom = CWrPage; + XgetSegment(i,pom_seg,pom_seg1); + if (ProgramedFlag[CWrPage*(SegmentNum+1)+pom_seg] ==0 + && ProgramedFlag[CWrPage*(SegmentNum+1)+pom_seg1] ==0 + && CashBuffData[i] != -1) + Mem[CWrPage*(PageSize+1)+i]= -1; + if (ProgramedFlag[(CWrPage+1)*(SegmentNum+1)+ + pom_seg]==0 && CashBuffData1[i] != -1 && + ProgramedFlag[(CWrPage+1)*(SegmentNum+1)+ + pom_seg1]==0) + Mem[(CWrPage+1)*(PageSize+1)+i]= -1; + end + end + end + end + end + + always @(BSTATINQ_out) + begin + if (current_state == BSTAT_INQ) + begin + if (BSTATINQ_out) + begin + R_zd = 1'b1; + Status [6:5] = "11"; + BSTATINQ_in = 1'b0; + end + end + end + + //PGMS state,PROG_out + always @(posedge PROG_out) + begin: Func5_1 + if (current_state==PGMS ) + begin + PGD_ACT <= #1 1'b0; + R_zd = 1'b1; + end + end + + //PGMS state,XPROG_out + always @(posedge XPROG_out) + begin: Func5_2 + if (current_state==PGMS ) + begin + R_zd = 1'b1; + end + end + + //PGMS state,PROG2_out + always @(posedge PROG2_out) + begin: Func5_3 + if (current_state==PGMS ) + R_zd = 1'b1; + end + + //PGMS state,XPROG2_out + always @(posedge XPROG2_out) + begin: Func5_4 + if (current_state==PGMS ) + R_zd = 1'b1; + end + + //RDY_PRG state,PROG1_out + always @(posedge PROG1_out) + begin: Func5_5 + if (current_state==RDY_PRG ) + R_zd = 1'b1; + end + + //RDY_PRG state,XPROG1_out + always @(posedge XPROG1_out) + begin: Func5_6 + if (current_state==RDY_PRG ) + R_zd = 1'b1; + end + + //CBSY state, firstFlag + always @(current_state,PROG1_out,XPROG1_out,PROG2_out,XPROG2_out, + PROG_out, XPROG_out, DBSY_out, firstFlag,DBSY1_out) + begin: Func6 + if (current_state == CBSY ) + if (firstFlag) + begin + firstFlag=1'b0; + Status[6] = 1'b0; + end + end + //CBSY state, WPNeg + always @(current_state,PROG1_out,XPROG1_out,PROG2_out,XPROG2_out, + PROG_out, XPROG_out,DBSY_out, WPNeg,firstFlag,DBSY1_out) + begin: Func6_0 + if (current_state == CBSY ) + if (WPNeg && (DBSY1_out||DBSY_out)) + for( i=0; i<= PageSize; i=i+1) + if( CashBuffData[i] != -1) + Mem[CWrPage*(PageSize+1)+i]= -1; + end + + //CBSY state, DBSY_out + always @(posedge DBSY_out) + begin: Func6_1 + if (current_state == CBSY ) + begin + Status[6] = 1'b1; + R_zd = 1'b1; + DBSY_in = 1'b0; + for( i=0; i<= PageSize; i=i+1) + WrBuffData[i] = CashBuffData[i]; + WrPage = CWrPage; + WrAddr = CWrAddr; + for(i=0;i<=SegmentNum;i=i+1) + SegForProg[i]=CSegForProg[i]; + end + end + + //CBSY state, DBSY1_out + always @(posedge DBSY1_out) + begin: Func6_2 + if (current_state == CBSY ) + begin + Status[6] = 1'b1; + R_zd = 1'b1; + DBSY1_in = 1'b0; + for( i=0; i<= PageSize; i=i+1) + WrBuffData[i] = CashBuffData[i]; + WrPage = CWrPage; + WrAddr = CWrAddr; + for(i=0;i<=SegmentNum;i=i+1) + SegForProg[i]=CSegForProg[i]; + end + end + + //BERS_EXEC state BERS_out + always @(Data, AddrCom, current_state, + RENeg, CENeg, ALE, CLE, BERS_out, PROG_out, + TR_out, DBSY_out, WPNeg) + begin: Func7_0 + integer i,j,k; + if (current_state==BERS_EXEC && BERS_out) + begin + for(i = Blck *(BlockSize+1) *(PageSize+1); + i < (Blck+1)*(BlockSize+1) *(PageSize+1); + i=i+1) + Mem[i] = MaxData; + for(i = Blck *(BlockSize+1) *(SegmentNum+1); + i < (Blck+1)*(BlockSize+1) *(SegmentNum+1); + i=i+1) + ProgramedFlag[i] = 1'b0; + InvBlock[Blck] = 0; + BlockMod[Blck] = 0; + PreProgFlag[Blck] = 0; + ProgBlock[Blck] = 0; + InvBlockPgms[Blck] = 0; + BERS_in = 1'b0; + ERS_ACT = 1'b0; + R_zd = 1'b1; + Status[6:5] = 2'b11; + end + end + + //BERS_EXEC state XBERS_out + always @(Data, AddrCom, current_state, + RENeg, CENeg, ALE, CLE, XBERS_out, XPROG_out, + TR_out, DBSY_out, WPNeg) + begin: Func7_1 + integer i,j,k; + if (current_state==BERS_EXEC && XBERS_out) + begin + for(i = Blck *(BlockSize+1) *(PageSize+1); + i < (Blck+1)*(BlockSize+1) *(PageSize+1); + i=i+1) + Mem[i] = MaxData; + for(i = Blck *(BlockSize+1) *(SegmentNum+1); + i < (Blck+1)*(BlockSize+1) *(SegmentNum+1); + i=i+1) + ProgramedFlag[i] = 1'b0; + InvBlock[Blck] = 0; + BlockMod[Blck] = 1; + ProgBlock[Blck] = 0; + InvBlockPgms[Blck] = 0; + XBERS_in = 1'b0; + ERS_ACT = 1'b0; + R_zd = 1'b1; + Status[6:5] = 2'b11; + end + end + + always @(current_state) + begin: Func8_1 + if (current_state == IDLE | current_state == XTREM_IDLE | + current_state == RD) + begin + back_to_xtrem = 1'b0; + end + else if (current_state == PRE_PRG ) + begin + back_to_xtrem = 1'b1; + end + end + + /////////////////////////////////////////////////////////////////////////// + //FlagGeneration + /////////////////////////////////////////////////////////////////////////// + always @(posedge DBSY_out) + begin + PRG_ACT = 1'b1; + PROG1_in = ~XTREM_ACT; + XPROG1_in = XTREM_ACT; + Status[6:5] = 2'b10; + end + always @(posedge DBSY1_out) + begin + PRG_ACT = 1'b1; + PROG1_in = ~XTREM_ACT; + XPROG1_in = XTREM_ACT; + Status[6:5] = 2'b10; + end + + always @(posedge PROG_out or posedge XPROG_out or posedge PROG1_out or + posedge XPROG1_out or posedge PROG2_out or posedge XPROG2_out) + begin + if( current_state==PGMS || current_state==PREL_PRG + || current_state==A0_PRG || current_state==A1_PRG + || current_state==A2_PRG || current_state==DATA_PRG + || current_state==PGMS_CAC || current_state==A0_PRG_CAC + || current_state==WFPD || current_state==RDY_PRG + || current_state==CBSY || current_state==UNKNOWN) + begin + PRG_ACT = 1'b0; + Status[5] = 1'b1; + PROG_in = 1'b0; + XPROG_in = 1'b0; + PROG1_in = 1'b0; + XPROG1_in = 1'b0; + PROG2_in = 1'b0; + XPROG2_in = 1'b0; + if( WPNeg && ~XTREM_ACT && InvBlock[WrPage/(BlockSize+1)] == 0) + begin + for( j=0; j<=PageSize; j=j+1) + begin + getSegment(j,pom_seg); + if( WrBuffData[j] != -1 && + ProgramedFlag[WrPage*(SegmentNum+1) + pom_seg]== 0 ) + begin + Mem[WrPage*(PageSize+1)+j]= WrBuffData[j]; + WrBuffData[j]=-1; + end + end + for( j=0; j<=SegmentNum; j=j+1) + ProgramedFlag[WrPage*(SegmentNum+1) + j] = SegForProg[j]; + end + else if (WPNeg && XTREM_ACT && InvBlock[WrPage/(BlockSize+1)] == 0) + begin + for (j=0; j<=PageSize; j=j+1) + begin + Page_pom = WrPage; + XgetSegment(j,pom_seg,pom_seg1); + if (~PGD_ACT) + begin + if (ProgramedFlag[Page_pom*(SegmentNum+1)+pom_seg] ==0 && + ProgramedFlag[Page_pom*(SegmentNum+1)+pom_seg1] ==0 && + WrBuffData[j] != -1) + XTR_Pgms_data(j,WrPage); + end + else if (~XTR_MPRG) + begin + Page_pom = WrPage; + if (ProgramedFlag[Page_pom*(SegmentNum+1)+pom_seg] ==0 && + ProgramedFlag[Page_pom*(SegmentNum+1)+pom_seg1] ==0 && + WrBuffData[j] != -1) + Mem[WrPage*(PageSize+1)+j]= WrBuffData[j]; + if (ProgramedFlag[(Page_pom+1)*(SegmentNum+1)+pom_seg]==0 + &&ProgramedFlag[(Page_pom+1)*(SegmentNum+1)+pom_seg1]==0 + && WrBuffData[j] != -1) + Mem[(WrPage+1)*(PageSize+1)+j]= WrBuffData1[j]; + end + else + begin + if (ProgramedFlag[Page_pom*(SegmentNum+1)+pom_seg] == 0) + XTR_MPrg_proc; + end + end + for( j=0; j<=SegmentNum; j=j+1) + ProgramedFlag[WrPage*(SegmentNum+1) + j] = SegForProg[j]; + if (~XTR_MPRG) + for( j=0; j<=SegmentNum; j=j+1) + ProgramedFlag[(WrPage+1)*(SegmentNum+1) + j] = + SegForProg1[j]; + end + end + end + + always @(posedge PRE_PROG_out) + begin + if (WPNeg && XTREM_ACT) + begin + if (InvBlock[WrPage/(BlockSize+1)] == 0 && + InvBlockPgms[WrPage/(BlockSize+1)] == 0) + begin + XTR_PrePrg_proc(WrPage/(BlockSize+1)); + PreProgFlag[WrPage/(BlockSize+1)] = 1; + end + end + Status[5] = 1'b1; + R_zd = 1'b1; + Status[6:5] = 2'b11; + BlockMod[Blck] = 1'b1; + PRE_PROG_in = 1'b0; + PRG_ACT = 1'b0; + end + + always @(negedge write) + begin + if( current_state==PGMS || current_state==PREL_PRG + || current_state==A0_PRG || current_state==A1_PRG + || current_state==A2_PRG || current_state==DATA_PRG + || current_state==PGMS_CAC || current_state==A0_PRG_CAC + || current_state==WFPD || current_state==CBSY + || current_state==RDY_PRG || current_state==PRE_PRG + || current_state==UNKNOWN) + begin + if(CLE && ~ALE && PRG_ACT && Data==8'hFF) + begin + PROG_in = 1'b0; + XPROG_in = 1'b0; + PROG1_in = 1'b0; + XPROG1_in = 1'b0; + PROG2_in = 1'b0; + XPROG2_in = 1'b0; + end + else if (CLE && ~ALE && Data==8'hFF) + PRE_PROG_in = 1'b0; + end + end + + //Output Disable Control + always @(read, write, Data, AddrCom, reseted, current_state, + RENeg, CENeg, ALE, CLE, BERS_out, PROG_out, TR_out, + DBSY_out, RSTDONE, WPNeg ) + begin + if (RENeg || CENeg) + DOut_zd = 8'bZ; + end + + task Read_Data; + inout [31:0] Addr; + inout [31:0] Page; + inout [31:0] Blck; + reg [7:0] data_tmp; + reg [7:0] data_tmp1; + integer i; + integer j; + begin + if (~XTREM_ACT) + begin + if (Mem[Page*(PageSize+1)+Addr] != -1) + DOut_zd = Mem[Page*(PageSize+1)+Addr]; + else + DOut_zd = 8'bx; + if (Addr != PageSize) + Addr = Addr+1; + end + else + begin + if (Addr*2 < PageSize) + begin + if (Mem[Page*(PageSize+1)+(Addr*2)] != -1 && + Mem[Page*(PageSize+1)+(Addr*2+1)] != -1) + begin + data_tmp = Mem[Page*(PageSize+1)+(Addr*2+1)]; + data_tmp1= Mem[Page*(PageSize+1)+(Addr*2)]; + i = 0; + j = 0; + while (i <= 7) + begin + if ((i % 2) !=0) + begin + DOut_zd[j] = data_tmp1[i]; + DOut_zd[j+4] = data_tmp[i]; + j = j + 1; + end + i = i + 1; + end + end + else + DOut_zd = 8'bx; + end + else + begin + if (Mem[(Page+1)*(PageSize+1)+(Addr*2- PageSize)] != -1 && + Mem[(Page+1)*(PageSize+1)+(Addr*2-(PageSize+1))] != -1) + begin + data_tmp = Mem[(Page+1)*(PageSize+1)+(Addr*2- PageSize)]; + data_tmp1= Mem[(Page+1)*(PageSize+1)+(Addr*2-(PageSize+1))]; + i = 0; + j = 0; + while (i <= 7) + begin + if ((i % 2) !=0) + begin + DOut_zd[j] = data_tmp1[i]; + DOut_zd[j+4] =data_tmp[i]; + j = j + 1; + end + i = i + 1; + end + end + else + DOut_zd = 8'bx; + end + if (Addr != PageSize) + Addr = Addr+1; + end + end + endtask + + task Read_Status; + input [31:0] Blck; + begin + if ((PreProgFlag[Blck] == 1 && ProgBlock[Blck] == 0) || + BlockMod[Blck] == 1) + Status[2] = 1'b1; + else + Status[2] = 1'b0; + DOut_zd = Status; + end + endtask + + task Read_StatMode; + input [31:0] Blck; + begin + DOut_zd[7:1] = 0; + if ((PreProgFlag[Blck] == 1 && ProgBlock[Blck] == 0) || + BlockMod[Blck] == 1) + begin + DOut_zd[7:1] = 0; + DOut_zd[0] = 1'b1; + end + else + DOut_zd[0] = 1'b0; + end + endtask + + task getSegment; + input [31:0] paddress; + output [31:0] seg; + integer i; + begin + paddress = paddress % (PageSize + 1); + for (i=0; i<=SegmentNum; i=i+1) + if(paddress >= ssa[i] && paddress <= sea[i]) + seg = i; + end + endtask + + task XgetSegment; + input [31:0] paddress; + output [31:0] j; + output [31:0] k; + integer addr; + integer i; + begin + if (~PGD_ACT) + if (paddress*2 < PageSize) + addr = paddress*2; + else + begin + addr = paddress*2 - PageSize; + Page_pom = Page_pom + 1; + end + else + addr = paddress; + for (i=0; i<= SegmentNum; i=i+1) + if (addr >= ssa[i] && addr <= sea[i]) + j = i; + if ((j % 2) ==0) + k = j + 1; + else + k = j - 1; + end + endtask + + task XTR_Pgms_init; + input [31:0] Page; + integer i; + begin + if (WPNeg) + for(i=0; i<=PageSize; i=i+1) + begin + if (CashBuffData[i] != -1 && (i*2 < PageSize)) + begin + Mem[(Page)*(PageSize+1)+(i*2)] = - 1; + Mem[(Page)*(PageSize+1)+(i*2+1)] = - 1; + end + else if (CashBuffData[i] != -1 && (i*2 > PageSize)) + begin + Mem[(Page+1)*(PageSize+1)+(i*2- PageSize)] = - 1; + Mem[(Page+1)*(PageSize+1)+(i*2-(PageSize+1))] = - 1; + end + end + end + endtask + + task XTR_Pgms_data; + input [31:0] i; + input [31:0] Page; + reg [7:0] data_tmp; + reg [7:0] data_tmp1; + reg [7:0] data_reg; + integer k; + integer j; + begin + k = 0; + if (WrBuffData[i] != -1 && (i*2 < PageSize)) + begin + data_tmp = Mem[(Page)*(PageSize+1)+(i*2)]; + data_tmp1 = Mem[(Page)*(PageSize+1)+(i*2+1)]; + data_reg = WrBuffData[i]; + for (j=0; j<=7; j=j+1) + begin + if ((j % 2) !=0) + begin + data_tmp[j] = data_reg[k]; + data_tmp1[j] = data_reg[k+4]; + k = k + 1; + end + else + begin + data_tmp[j] = data_tmp[j]; + data_tmp1[j] = data_tmp1[j]; + end + end + Mem[(Page)*(PageSize+1)+(i*2)] = data_tmp; + Mem[(Page)*(PageSize+1)+(i*2+1)] = data_tmp1; + end + else if (WrBuffData[i] != -1 && (i*2 > PageSize)) + begin + data_tmp = Mem[(Page+1)*(PageSize+1)+(i*2- (PageSize+1))]; + data_tmp1 = Mem[(Page+1)*(PageSize+1)+(i*2 - PageSize)]; + data_reg = WrBuffData[i]; + for (j=0; j<=7; j=j+1) + begin + if ((j % 2) !=0) + begin + data_tmp[j] = data_reg[k]; + data_tmp1[j] = data_reg[k+4]; + k = k + 1; + end + else + begin + data_tmp[j] = data_tmp[j]; + data_tmp1[j] = data_tmp1[j]; + end + end + Mem[(Page+1)*(PageSize+1)+(i*2- PageSize)] = data_tmp1; + Mem[(Page+1)*(PageSize+1)+(i*2-(PageSize+1))] = data_tmp; + end + end + endtask + + task XTR_Buffdata; + input [31:0] address; + input [31:0] Data; + reg [7:0] data_tmp; + reg [7:0] data_tmp1; + reg [7:0] data_input; + integer k; + integer j; + integer inv; + begin + inv = 0; + if (address*2 < PageSize && CashBuffData[address*2] != -1 && + CashBuffData[address*2+1] != -1) + begin + data_tmp = CashBuffData[address*2]; + data_tmp1 = CashBuffData[address*2+1]; + inv = 1; + end + else if (address*2 > PageSize && + CashBuffData1[address*2- (PageSize+1)] != -1 && + CashBuffData1[address*2- PageSize] != -1) + begin + data_tmp = CashBuffData1[address*2- (PageSize+1)]; + data_tmp1 = CashBuffData1[address*2- PageSize]; + inv = 1; + end + + if (inv == 1) + begin + k = 0; + j = 0; + data_input = Data; + while (j <= 7) + begin + if ((j % 2) !=0) + begin + data_tmp[j]= data_input[k]; + data_tmp1[j]= data_input[k+4]; + k = k + 1; + end + j = j + 1; + end + if (address*2 < PageSize) + begin + CashBuffData[address*2] = data_tmp; + CashBuffData[address*2+1] = data_tmp1; + end + else + begin + CashBuffData1[address*2- PageSize] = data_tmp1; + CashBuffData1[address*2- (PageSize+1)] = data_tmp; + end + end + end + endtask + + task XTR_PrePrg_proc; + input [31:0] Blck; + reg [7:0] data_prog; + integer i; + integer k; + begin + for (i=Blck * (BlockSize+1)*(PageSize+1); + i<=(Blck+1)*(BlockSize+1)*(PageSize+1); + i=i+1) + begin + data_prog = Mem[i]; + for (k=0; k<=7; k=k+1) + if ((k % 2) == 0) + data_prog[k] = 1'b1; + Mem[i] = data_prog; + end + end + endtask + + task XTR_MPrg_proc; + reg [7:0] data_tmp; + reg [7:0] data_tmp1; + reg [7:0] data_tmp2; + integer k; + integer i; + integer inv; + begin + inv = 0; + k = 0; + i = 0; + if (j*2 < PageSize && WrBuffData[j*2+1] != -1 && + WrBuffData[j*2] != -1) + begin + data_tmp = WrBuffData[j*2+1]; + data_tmp1 = WrBuffData[j*2]; + inv = 1; + end + else if (j*2 > PageSize && WrBuffData1[j*2 - PageSize] != -1 && + WrBuffData1[j*2 - (PageSize+1)] != -1) + begin + data_tmp = WrBuffData1[j*2 - PageSize]; + data_tmp1 = WrBuffData1[j*2- (PageSize+1)]; + inv = 1; + end + if (inv == 1) + begin + while (i <= 7) + begin + if ((i % 2) !=0) + begin + data_tmp2[k] = data_tmp1[i]; + data_tmp2[k+4] = data_tmp[i]; + k = k + 1; + end + i = i + 1; + end + Mem[WrPage*(PageSize+1)+j] = data_tmp2; + end + end + endtask + + task set_reset; + begin + STAT_ACT = 1'b0; + RSTSTART = 1'b1; + RSTSTART <= #1 1'b0; + R_zd = 1'b0; + end + endtask + + reg BuffInR; + wire BuffOutR; + + BUFFER BUFR (BuffOutR , BuffInR); + + initial + begin + BuffInR = 1'b1; + end + + always @(posedge BuffOutR) + begin + WER_01 = $time; + end + reg BuffInRE, BuffInCE, BuffInALE, BuffInCLE; + wire BuffOutRE, BuffOutCE, BuffOutALE, BuffOutCLE; + + BUFFER BUFRENeg (BuffOutRE, BuffInRE); + BUFFER BUFCENeg (BuffOutCE, BuffInCE); + BUFFER BUFALE (BuffOutALE, BuffInALE); + BUFFER BUFCLE (BuffOutCLE, BuffInCLE); + + initial + begin + BuffInRE = 1'b1; + BuffInCE = 1'b1; + BuffInALE = 1'b1; + BuffInCLE = 1'b1; + end + + time CEDQ_t, REDQ_t, ALEDQ_t, CLEDQ_t; + time REDQ_01, CEDQ_01, ALEDQ_01, CLEDQ_01; + time CENeg_event, RENeg_event, ALE_event, CLE_event; + always @(posedge BuffOutRE) + begin + REDQ_01 = $time; + end + always @(posedge BuffOutCE) + begin + CEDQ_01 = $time; + end + always @(BuffOutALE) + begin + ALEDQ_01 = $time; + end + always @(BuffOutCLE) + begin + CLEDQ_01 = $time; + end + + always @(negedge CENeg) + begin + CENeg_event = $time; + end + + always @(negedge RENeg) + begin + RENeg_event = $time; + end + + always @(negedge ALE) + begin + ALE_event = $time; + end + always @(negedge CLE) + begin + CLE_event = $time; + end + + always @(DOut_zd) + begin : OutputGen + time time_t; + if (DOut_zd[0] !== 1'bz) + begin + CEDQ_t = CENeg_event + CEDQ_01; + REDQ_t = RENeg_event + REDQ_01; + tdp_CE = ((CEDQ_t >= REDQ_t) && ( CEDQ_t > $time)); + tdp_RE = ((REDQ_t > CEDQ_t) && ( REDQ_t > $time)); + DOut_pass = #5 DOut_zd; + end + end + + always @(DOut_zd) + begin + if (DOut_zd[0] === 1'bz) + begin + disable OutputGen; + tdp_CE = 1'b1; + tdp_RE= 1'b1; + DOut_pass = #5 DOut_zd; + end + end + +endmodule + +module BUFFER (OUT,IN); + input IN; + output OUT; + buf ( OUT, IN); +endmodule diff --git a/resources/soc/simu/testbench/uart_dev.v b/resources/soc/simu/testbench/uart_dev.v new file mode 100644 index 0000000..883b47b --- /dev/null +++ b/resources/soc/simu/testbench/uart_dev.v @@ -0,0 +1,527 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +`timescale 1ns/10ps + +`define V_UART_FIFO_COUNTER_W 5 +`define V_UART_FIFO_WIDTH 8 +`define V_UART_LC_PE 3 +`define V_UART_LC_EP 4 +`define V_UART_LC_SP 5 +`define V_UART_LC_SB 2 +`define V_UART_LC_BITS 1:0 +`define V_UART_LC_BC 6 +`define V_UART_FIFO_DEPTH 16 +`define V_UART_FIFO_POINTER_W 4 + +module uart_dev +( + input wire clk, + input wire rst_n, + input wire rx, + output wire tx +); +parameter uart_number=0; +parameter STRLEN = 80; + + wire [7:0] data; + wire hwrite; + wire hready; + wire [1:0] htrans; + wire [31:0] haddr; + wire hclk; + wire apb_clk; + wire gpio; + + assign data = 8'h0; + assign hwrite = 1'b0; + assign hready = 1'b0; + assign htrans = 2'b0; + assign haddr = 32'h0; + assign hclk = clk; + assign apb_clk = clk; + assign gpio = 1'b1; + + wire uart_beh_reset; + + reg [7:0] buffer[STRLEN:0]; + wire [8*STRLEN-1:0] outbuf; + + reg [7:0] byte_in; + reg [7:0] ptr; + integer i; + wire tx_mid; + assign #1 tx= tx_mid; + assign uart_beh_reset = !rst_n; + initial + begin + while(rx !== 1'b1) @(rx); + forever begin + byte_in = 8'h20; + while(rx != 1'b0) @(rx); + repeat(8) @(posedge clk); + for ( i=0; i<8; i=i+1 ) begin + repeat(16) @(posedge clk); + byte_in[i] = rx; + end + repeat(16) @(posedge clk); + push(byte_in); + end + end + + reg [31:0] haddr_d1; + reg hwrite_d1; + always @(posedge hclk) begin + haddr_d1 <= haddr; + hwrite_d1<= hwrite && hready && htrans[1]; + if (haddr_d1 == 32'h1f00_03f8 && hwrite_d1) begin + push(data); + end + end + + initial #100 + begin:init_buffer + for (ptr = 8'h00; ptr < STRLEN; ptr = ptr + 1) + begin + buffer[ptr] = 8'h20; + end + ptr = 8'h00; + end + + assign outbuf[639:0] = { buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7], + buffer[8], buffer[9], buffer[10],buffer[11],buffer[12],buffer[13],buffer[14],buffer[15], + buffer[16],buffer[17],buffer[18],buffer[19],buffer[20],buffer[21],buffer[22],buffer[23], + buffer[24],buffer[25],buffer[26],buffer[27],buffer[28],buffer[29],buffer[30],buffer[31], + buffer[32],buffer[33],buffer[34],buffer[35],buffer[36],buffer[37],buffer[38],buffer[39], + buffer[40],buffer[41],buffer[42],buffer[43],buffer[44],buffer[45],buffer[46],buffer[47], + buffer[48],buffer[49],buffer[50],buffer[51],buffer[52],buffer[53],buffer[54],buffer[55], + buffer[56],buffer[57],buffer[58],buffer[59],buffer[60],buffer[61],buffer[62],buffer[63], + buffer[64],buffer[65],buffer[66],buffer[67],buffer[68],buffer[69],buffer[70],buffer[71], + buffer[72],buffer[73],buffer[74],buffer[75],buffer[76],buffer[77],buffer[78],buffer[79]}; + + + task push; + input [7:0] data; + begin + buffer[ptr] = (data[7:0]==8'h0D)? 8'h0A : data[7:0]; + ptr = ptr + 1; + if (data[7:0] == 8'h0A || data[7:0] == 8'h0D) + begin + print; + ptr = 8'h00; + end + else if (ptr == STRLEN) + begin + print; + ptr = 8'h00; + end + end + endtask + + task print; + begin + $display("[%t]:[uart%1x]: %s", $time, uart_number,outbuf); + if (outbuf[639:576] == "GouSheng") $finish; + for (ptr = 8'h00; ptr < STRLEN; ptr = ptr + 1) + begin + buffer[ptr] = 8'h20; + end + end + endtask + + reg uart_push; + reg [7:0] uart_tx_data; + wire [2:0] uart_tx_state; + + initial + begin + begin + #1000000; + // #250000; + wait(gpio); + if (uart_number == 1) #200000; + //$display("[%t]:[uart%1x_output]: SEND STRING \"d4a000000010 \"", $time,uart_number); + uart_send_multiple("d4a000000010 ", 32'd13); + // uart_send_multiple("gb", 32'd2); + end + end + + uart_transmitter_v ut( .clk (apb_clk ), + .wb_rst_i (uart_beh_reset), + .lcr (8'h3 ), + .tf_push (uart_push ), + .wb_dat_i (uart_tx_data ), + .enable (1'b1 ), + .stx_pad_o (tx_mid ), + .tstate (uart_tx_state ), + .tf_count ( ), + .tx_reset (uart_beh_reset), + .lsr_mask (1'b0 ) + ); + + task uart_send_multiple; + input [8*80-1: 0] uart_string; + input [31:0] len; + integer send_multi_i; + begin + for (send_multi_i=len-1; send_multi_i >=0; send_multi_i = send_multi_i-1) begin + uart_send({uart_string[send_multi_i*8 + 7], + uart_string[send_multi_i*8 + 6], + uart_string[send_multi_i*8 + 5], + uart_string[send_multi_i*8 + 4], + uart_string[send_multi_i*8 + 3], + uart_string[send_multi_i*8 + 2], + uart_string[send_multi_i*8 + 1], + uart_string[send_multi_i*8 + 0]}); + end + end + endtask + task uart_send; + input [7:0] data; + begin + uart_tx_data = data; + @(posedge clk); + uart_push = 1'b1; + @(posedge clk); + uart_push = 1'b0; + repeat (3) @(posedge clk); + while(uart_tx_state != 3'b001) + @uart_tx_state; + end + endtask + + +endmodule + +module uart_transmitter_v (clk, wb_rst_i, lcr, tf_push, wb_dat_i, enable, stx_pad_o, tstate, tf_count, tx_reset, lsr_mask); + +input clk; +input wb_rst_i; +input [7:0] lcr; +input tf_push; +input [7:0] wb_dat_i; +input enable; +input tx_reset; +input lsr_mask; +output stx_pad_o; +output [2:0] tstate; +output [`V_UART_FIFO_COUNTER_W-1:0] tf_count; + +reg [2:0] tstate; +reg [4:0] counter; +reg [2:0] bit_counter; +reg [6:0] shift_out; +reg stx_o_tmp; +reg parity_xor; +reg tf_pop; +reg bit_out; + +wire [`V_UART_FIFO_WIDTH-1:0] tf_data_in; +wire [`V_UART_FIFO_WIDTH-1:0] tf_data_out; +wire tf_push; +wire tf_overrun; +wire [`V_UART_FIFO_COUNTER_W-1:0]tf_count; + +assign tf_data_in = wb_dat_i; + +uart_tfifo_v fifo_tx( + .clk (clk ), + .wb_rst_i (wb_rst_i ), + .data_in (tf_data_in ), + .data_out (tf_data_out), + .push (tf_push ), + .pop (tf_pop ), + .overrun (tf_overrun ), + .count (tf_count ), + .fifo_reset (tx_reset ), + .reset_status(lsr_mask ) +); + +parameter s_idle = 3'd0; +parameter s_send_start = 3'd1; +parameter s_send_byte = 3'd2; +parameter s_send_parity = 3'd3; +parameter s_send_stop = 3'd4; +parameter s_pop_byte = 3'd5; + +always @(posedge clk ) +begin + if (wb_rst_i) + begin + tstate <= s_idle; + stx_o_tmp <= 1'b1; + counter <= 5'b0; + shift_out <= 7'b0; + bit_out <= 1'b0; + parity_xor <= 1'b0; + tf_pop <= 1'b0; + bit_counter <= 3'b0; + end + else + if (enable) + begin + case (tstate) + s_idle :if (~|tf_count) + begin + tstate <= s_idle; + stx_o_tmp <= 1'b1; + end + else begin + tf_pop <= 1'b0; + stx_o_tmp <= 1'b1; + tstate <= s_pop_byte; + end + s_pop_byte : begin + tf_pop <= 1'b1; + case (lcr[1:0]) + 2'b00 : begin + bit_counter <= 3'b100; + parity_xor <= ^tf_data_out[4:0]; + end + 2'b01 : begin + bit_counter <= 3'b101; + parity_xor <= ^tf_data_out[5:0]; + end + 2'b10 : begin + bit_counter <= 3'b110; + parity_xor <= ^tf_data_out[6:0]; + end + 2'b11 : begin + bit_counter <= 3'b111; + parity_xor <= ^tf_data_out[7:0]; + end + endcase + {shift_out[6:0], bit_out} <= tf_data_out; + tstate <= s_send_start; + end + s_send_start : begin + tf_pop <= 1'b0; + if (~|counter) + counter <= 5'b01111; + else if (counter == 5'b00001) + begin + counter <= 0; + tstate <= s_send_byte; + end + else + counter <= counter - 1'b1; + stx_o_tmp <= 1'b0; + end + s_send_byte : begin + if (~|counter) + counter <= 5'b01111; + else if (counter == 5'b00001) + begin + if (bit_counter > 3'b0) begin + bit_counter <= bit_counter - 1'b1; + {shift_out[5:0],bit_out } <= {shift_out[6:1], shift_out[0]}; + tstate <= s_send_byte; + end + else + if (~lcr[`V_UART_LC_PE]) begin + tstate <= s_send_stop; + end + else begin + case ({lcr[`V_UART_LC_EP],lcr[`V_UART_LC_SP]}) + 2'b00: bit_out <= ~parity_xor; + 2'b01: bit_out <= 1'b1; + 2'b10: bit_out <= parity_xor; + 2'b11: bit_out <= 1'b0; + endcase + tstate <= s_send_parity; + end + counter <= 0; + end + else counter <= counter - 1'b1; + stx_o_tmp <= bit_out; + end + s_send_parity : begin + if (~|counter) counter <= 5'b01111; + else if (counter == 5'b00001) begin + counter <= 4'b0; + tstate <= s_send_stop; + end + else counter <= counter - 1'b1; + stx_o_tmp <= bit_out; + end + s_send_stop : begin + if (~|counter) begin + casex ({lcr[`V_UART_LC_SB],lcr[`V_UART_LC_BITS]}) + 3'b0xx: counter <= 5'b01101; + 3'b100: counter <= 5'b10101; + default: counter <= 5'b11101; + endcase + end + else if (counter == 5'b00001) begin + counter <= 0; + tstate <= s_idle; + end + else counter <= counter - 1'b1; + stx_o_tmp <= 1'b1; + end + default : + tstate <= s_idle; + endcase + end + else tf_pop <= 1'b0; +end + +assign stx_pad_o = lcr[`V_UART_LC_BC] ? 1'b0 : stx_o_tmp; + +endmodule + +module uart_tfifo_v (clk, + wb_rst_i, data_in, data_out, + push, + pop, + + overrun, + count, + fifo_reset, + reset_status +); + + +parameter fifo_width = `V_UART_FIFO_WIDTH; +parameter fifo_depth = `V_UART_FIFO_DEPTH; +parameter fifo_pointer_w = `V_UART_FIFO_POINTER_W; +parameter fifo_counter_w = `V_UART_FIFO_COUNTER_W; + +input clk; +input wb_rst_i; +input push; +input pop; +input [fifo_width-1:0] data_in; +input fifo_reset; +input reset_status; + +output [fifo_width-1:0] data_out; +output overrun; +output [fifo_counter_w-1:0] count; + +wire [fifo_width-1:0] data_out; + +reg [fifo_pointer_w-1:0] top; +reg [fifo_pointer_w-1:0] bottom; + +reg [fifo_counter_w-1:0] count; +reg overrun; +wire [fifo_pointer_w-1:0] top_plus_1 = top + 1'b1; + +raminfr_v #(fifo_pointer_w,fifo_width,fifo_depth) tfifo (.clk(clk), + .we(push), + .a(top), + .dpra(bottom), + .di(data_in), + .dpo(data_out) +); + + +always @(posedge clk) +begin + if (wb_rst_i) + begin + top <= 0; + bottom <= 1'b0; + count <= 0; + end + else + if (fifo_reset) begin + top <= 0; + bottom <= 1'b0; + count <= 0; + end + else + begin + case ({push, pop}) + 2'b10 : if (count0) + begin + bottom <= bottom + 1'b1; + count <= count - 1'b1; + end + 2'b11 : begin + bottom <= bottom + 1'b1; + top <= top_plus_1; + end + default: ; + endcase + end +end + +always @(posedge clk) +begin + if (wb_rst_i) + overrun <= 1'b0; + else + if(fifo_reset | reset_status) + overrun <= 1'b0; + else + if(push & (count==fifo_depth)) + overrun <= 1'b1; +end + +endmodule + +module raminfr_v(clk, we, a, dpra, di, dpo); + +parameter addr_width = 4; +parameter data_width = 8; +parameter depth = 16; + +input clk; +input we; +input [addr_width-1:0] a; +input [addr_width-1:0] dpra; +input [data_width-1:0] di; +output [data_width-1:0] dpo; +reg [data_width-1:0] ram [depth-1:0]; + +wire [data_width-1:0] di; +wire [addr_width-1:0] a; +wire [addr_width-1:0] dpra; + +always @(posedge clk) begin + if (we) + ram[a] <= di; +end +reg [data_width-1:0] dpo; + +always @(posedge clk) + dpo <= ram[dpra]; + +endmodule diff --git a/resources/soc/simu/testbench/vmac/mac2ahb_package.v b/resources/soc/simu/testbench/vmac/mac2ahb_package.v new file mode 100644 index 0000000..e108e52 --- /dev/null +++ b/resources/soc/simu/testbench/vmac/mac2ahb_package.v @@ -0,0 +1,98 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + + // HTRANS states + parameter [1:0] IDLE = 0; + parameter [1:0] NONSEQ = 1; + parameter [1:0] SEQ = 2; + parameter [1:0] HTRANS_IDLE = 2'b00; + parameter [1:0] HTRANS_BUSY = 2'b01; + parameter [1:0] HTRANS_NONSEQ = 2'b10; + parameter [1:0] HTRANS_SEQ = 2'b11; + + // HBURST states + parameter SINGLE = 1'b0; + parameter INCR = 1'b1; + parameter [2:0] HBURST_SINGLE = 3'b000; + parameter [2:0] HBURST_INCR = 3'b001; + + // HSIZE states + parameter [2:0] HSIZE8BIT = 0; + parameter [2:0] HSIZE16BIT = 1; + parameter [2:0] HSIZE32BIT = 2; + parameter [2:0] HSIZE64BIT = 3; + parameter [2:0] HSIZE256BIT = 4; + parameter [2:0] HSIZE512BIT = 5; + parameter [2:0] HSIZE1024BIT = 6; + parameter [2:0] UNSUPPORTED = 7; + + parameter [2:0] HSIZE_8BIT = 3'b000; + parameter [2:0] HSIZE_16BIT = 3'b001; + parameter [2:0] HSIZE_32BIT = 3'b010; + parameter [2:0] HSIZE_64BIT = 3'b011; + parameter [2:0] HSIZE_128BIT = 3'b100; + parameter [2:0] HSIZE_256BIT = 3'b101; + parameter [2:0] HSIZE_512BIT = 3'b110; + parameter [2:0] HSIZE_1024BIT = 3'b111; + + // HRESP states + parameter [1:0] OKAY = 0; + parameter [1:0] ERROR = 1; + parameter [1:0] RETRY = 2; + parameter [1:0] SPLIT = 3; + parameter [1:0] HRESP_OKAY = 2'b00; + parameter [1:0] HRESP_ERROR = 2'b01; + parameter [1:0] HRESP_RETRY = 2'b10; + parameter [1:0] HRESP_SPLIT = 2'b11; + + // HPROT subvalue + parameter HPROT_0_OPCODEFETCH = 1'b0; + parameter HPROT_0_DATAACCESS = 1'b1; + parameter HPROT_1_USERACCESS = 1'b0; + parameter HPROT_1_PRIVILAGEDACCESS = 1'b1; + parameter HPROT_2_NOTBUFFERABLE = 1'b0; + parameter HPROT_2_BUFFERABLE = 1'b1; + parameter HPROT_3_NOTCACHEABLE = 1'b0; + parameter HPROT_3_CACHEABLE = 1'b1; + + // HPROT default value + parameter [3:0] HPROT_MACPROTECTIONCONTROL = {HPROT_3_NOTCACHEABLE, + HPROT_2_NOTBUFFERABLE, + HPROT_1_USERACCESS, + HPROT_0_DATAACCESS}; + + // MACDATA2AHB FSM states + parameter [1:0] AHBM_ADDR = 0; + parameter [1:0] AHBM_ADDRDATA = 1; + parameter [1:0] AHBM_IDLE = 2; + parameter [1:0] AHBM_DATA = 3; diff --git a/resources/soc/simu/testbench/vmac/mac_ram.v b/resources/soc/simu/testbench/vmac/mac_ram.v new file mode 100644 index 0000000..c388776 --- /dev/null +++ b/resources/soc/simu/testbench/vmac/mac_ram.v @@ -0,0 +1,989 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module RF2_64x16 ( + QA, + AA, + CLKA, + CENA, + AB, + DB, + CLKB, + CENB +); + parameter BITS = 16; + parameter word_depth = 64; + parameter addr_width = 6; + output [15:0] QA; + input [5:0] AA; + input CLKA; + input CENA; + input [5:0] AB; + input [15:0] DB; + input CLKB; + input CENB; + reg [15:0] QA; + + reg [BITS-1:0] mem [word_depth-1:0]; + + not (NOT_CENA, CENA); + always @ ( posedge CLKA ) if ( NOT_CENA ) QA<=mem[AA]; + + not (NOT_CENB, CENB); + always @ ( posedge CLKB ) if ( NOT_CENB ) mem[AB]<=DB; + +endmodule + +module RF2_512x32 ( + QA, + AA, + CLKA, + CENA, + AB, + DB, + CLKB, + CENB +); + parameter BITS = 32; + parameter word_depth = 512; + parameter addr_width = 9; + parameter wordx = {BITS{1'bx}}; + parameter addrx = {addr_width{1'bx}}; + + output [31:0] QA; + input [8:0] AA; + input CLKA; + input CENA; + input [8:0] AB; + input [31:0] DB; + input CLKB; + input CENB; + + reg [BITS-1:0] mem [word_depth-1:0]; + reg NOT_CONTA; + reg NOT_CONTB; + + reg NOT_CENA; + reg NOT_CENB; + + reg NOT_AA0; + reg NOT_AA1; + reg NOT_AA2; + reg NOT_AA3; + reg NOT_AA4; + reg NOT_AA5; + reg NOT_AA6; + reg NOT_AA7; + reg NOT_AA8; + reg [addr_width-1:0] NOT_AA; + reg NOT_AB0; + reg NOT_AB1; + reg NOT_AB2; + reg NOT_AB3; + reg NOT_AB4; + reg NOT_AB5; + reg NOT_AB6; + reg NOT_AB7; + reg NOT_AB8; + reg [addr_width-1:0] NOT_AB; + reg NOT_DB0; + reg NOT_DB1; + reg NOT_DB2; + reg NOT_DB3; + reg NOT_DB4; + reg NOT_DB5; + reg NOT_DB6; + reg NOT_DB7; + reg NOT_DB8; + reg NOT_DB9; + reg NOT_DB10; + reg NOT_DB11; + reg NOT_DB12; + reg NOT_DB13; + reg NOT_DB14; + reg NOT_DB15; + reg NOT_DB16; + reg NOT_DB17; + reg NOT_DB18; + reg NOT_DB19; + reg NOT_DB20; + reg NOT_DB21; + reg NOT_DB22; + reg NOT_DB23; + reg NOT_DB24; + reg NOT_DB25; + reg NOT_DB26; + reg NOT_DB27; + reg NOT_DB28; + reg NOT_DB29; + reg NOT_DB30; + reg NOT_DB31; + reg [BITS-1:0] NOT_DB; + reg NOT_CLKA_PER; + reg NOT_CLKA_MINH; + reg NOT_CLKA_MINL; + reg NOT_CLKB_PER; + reg NOT_CLKB_MINH; + reg NOT_CLKB_MINL; + + reg LAST_NOT_CENA; + reg LAST_NOT_CENB; + + + reg LAST_NOT_AA0; + reg LAST_NOT_AA1; + reg LAST_NOT_AA2; + reg LAST_NOT_AA3; + reg LAST_NOT_AA4; + reg LAST_NOT_AA5; + reg LAST_NOT_AA6; + reg LAST_NOT_AA7; + reg LAST_NOT_AA8; + reg [addr_width-1:0] LAST_NOT_AA; + reg LAST_NOT_AB0; + reg LAST_NOT_AB1; + reg LAST_NOT_AB2; + reg LAST_NOT_AB3; + reg LAST_NOT_AB4; + reg LAST_NOT_AB5; + reg LAST_NOT_AB6; + reg LAST_NOT_AB7; + reg LAST_NOT_AB8; + reg [addr_width-1:0] LAST_NOT_AB; + reg LAST_NOT_DB0; + reg LAST_NOT_DB1; + reg LAST_NOT_DB2; + reg LAST_NOT_DB3; + reg LAST_NOT_DB4; + reg LAST_NOT_DB5; + reg LAST_NOT_DB6; + reg LAST_NOT_DB7; + reg LAST_NOT_DB8; + reg LAST_NOT_DB9; + reg LAST_NOT_DB10; + reg LAST_NOT_DB11; + reg LAST_NOT_DB12; + reg LAST_NOT_DB13; + reg LAST_NOT_DB14; + reg LAST_NOT_DB15; + reg LAST_NOT_DB16; + reg LAST_NOT_DB17; + reg LAST_NOT_DB18; + reg LAST_NOT_DB19; + reg LAST_NOT_DB20; + reg LAST_NOT_DB21; + reg LAST_NOT_DB22; + reg LAST_NOT_DB23; + reg LAST_NOT_DB24; + reg LAST_NOT_DB25; + reg LAST_NOT_DB26; + reg LAST_NOT_DB27; + reg LAST_NOT_DB28; + reg LAST_NOT_DB29; + reg LAST_NOT_DB30; + reg LAST_NOT_DB31; + reg [BITS-1:0] LAST_NOT_DB; + reg LAST_NOT_CLKA_PER; + reg LAST_NOT_CLKA_MINH; + reg LAST_NOT_CLKA_MINL; + reg LAST_NOT_CLKB_PER; + reg LAST_NOT_CLKB_MINH; + reg LAST_NOT_CLKB_MINL; + + reg LAST_NOT_CONTA; + reg LAST_NOT_CONTB; + wire contA_flag; + wire contB_flag; + wire cont_flag; + + wire [BITS-1:0] _QA; + wire [addr_width-1:0] _AA; + wire [addr_width-1:0] _AB; + wire _CLKA; + wire _CLKB; + wire _CENA; + + + wire _CENB; + wire [BITS-1:0] _DB; + wire re_flagA; + + + wire re_flagB; + + reg LATCHED_CENA; + + + reg LATCHED_CENB; + reg [addr_width-1:0] LATCHED_AA; + reg [addr_width-1:0] LATCHED_AB; + reg [BITS-1:0] LATCHED_DB; + + reg CENAi; + reg CENBi; + + + reg [addr_width-1:0] AAi; + reg [addr_width-1:0] ABi; + reg [BITS-1:0] DBi; + reg [BITS-1:0] QAi; + reg [BITS-1:0] LAST_QAi; + + + + reg LAST_CLKA; + reg LAST_CLKB; + + reg valid_cycleA; + reg valid_cycleB; + + + task update_Anotifier_buses; + begin + NOT_AA = { + NOT_AA8, + NOT_AA7, + NOT_AA6, + NOT_AA5, + NOT_AA4, + NOT_AA3, + NOT_AA2, + NOT_AA1, + NOT_AA0}; + end + endtask + + task update_Bnotifier_buses; + begin + NOT_AB = { + NOT_AB8, + NOT_AB7, + NOT_AB6, + NOT_AB5, + NOT_AB4, + NOT_AB3, + NOT_AB2, + NOT_AB1, + NOT_AB0}; + NOT_DB = { + NOT_DB31, + NOT_DB30, + NOT_DB29, + NOT_DB28, + NOT_DB27, + NOT_DB26, + NOT_DB25, + NOT_DB24, + NOT_DB23, + NOT_DB22, + NOT_DB21, + NOT_DB20, + NOT_DB19, + NOT_DB18, + NOT_DB17, + NOT_DB16, + NOT_DB15, + NOT_DB14, + NOT_DB13, + NOT_DB12, + NOT_DB11, + NOT_DB10, + NOT_DB9, + NOT_DB8, + NOT_DB7, + NOT_DB6, + NOT_DB5, + NOT_DB4, + NOT_DB3, + NOT_DB2, + NOT_DB1, + NOT_DB0}; + + + end + endtask + + task mem_cycleA; + begin + valid_cycleA = 1'bx; + casez({CENAi}) + 1'b0: begin + valid_cycleA = 1; + read_memA(1,0); + end + 1'b1: ; + 1'bx: begin + valid_cycleA = 1; + read_memA(0,1); + end + endcase + end + endtask + + task mem_cycleB; + begin + valid_cycleB = 1'bx; + casez(CENBi) + 1'b0: begin + valid_cycleB = 0; + write_mem(ABi,DBi); + end + 1'b1: ; + 1'bx: begin + valid_cycleB = 0; + write_mem_x(ABi); + end + endcase + end + endtask + + task contentionA; + begin + casez(valid_cycleB) + 1'bx: ; + 1'b0:begin + read_memA(0,1); + end + 1'b1: ; + endcase + end + endtask + + task contentionB; + begin + casez(valid_cycleA) + 1'bx: ; + 1'b1:begin + read_memA(0,1); + end + 1'b0: ; + endcase + end + endtask + + task update_Alast_notifiers; + begin + LAST_NOT_AA = NOT_AA; + LAST_NOT_CENA = NOT_CENA; + LAST_NOT_CLKA_PER = NOT_CLKA_PER; + LAST_NOT_CLKA_MINH = NOT_CLKA_MINH; + LAST_NOT_CLKA_MINL = NOT_CLKA_MINL; + LAST_NOT_CONTA = NOT_CONTA; + end + endtask + + task update_Blast_notifiers; + begin + LAST_NOT_AB = NOT_AB; + LAST_NOT_DB = NOT_DB; + LAST_NOT_CENB = NOT_CENB; + LAST_NOT_CLKB_PER = NOT_CLKB_PER; + LAST_NOT_CLKB_MINH = NOT_CLKB_MINH; + LAST_NOT_CLKB_MINL = NOT_CLKB_MINL; + LAST_NOT_CONTB = NOT_CONTB; + end + endtask + + task latch_Ainputs; + begin + LATCHED_AA = _AA ; + LATCHED_CENA = _CENA ; + LAST_QAi = QAi; + end + endtask + + task latch_Binputs; + begin + LATCHED_AB = _AB ; + LATCHED_DB = _DB ; + LATCHED_CENB = _CENB ; + end + endtask + + task update_Alogic; + integer n; + begin + CENAi = LATCHED_CENA; + AAi = LATCHED_AA; + end + endtask + + task update_Blogic; + integer n; + begin + CENBi = LATCHED_CENB; + ABi = LATCHED_AB; + DBi = LATCHED_DB; + end + endtask + + + + + task x_Ainputs; + integer n; + begin + for (n=0; n QA[0]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[1]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[2]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[3]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[4]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[5]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[6]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[7]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[8]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[9]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[10]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[11]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[12]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[13]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[14]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[15]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[16]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[17]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[18]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[19]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[20]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[21]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[22]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[23]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[24]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[25]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[26]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[27]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[28]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[29]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[30]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + (CLKA => QA[31]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); + +endspecify + +endmodule diff --git a/resources/soc/simu/testbench/vmac/mac_top.v b/resources/soc/simu/testbench/vmac/mac_top.v new file mode 100644 index 0000000..2b624f4 --- /dev/null +++ b/resources/soc/simu/testbench/vmac/mac_top.v @@ -0,0 +1,13548 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +module vMAC_TOP +( + hclk, hrst_, SYS_RST_, + + hmst, hmstlock, + htrans, hburst, haddr, + hwrite, hsize, + hrdata, hwdata, hrdy, hresp, + eth_hreq, eth_hlock, eth_hgnt, + eth_htrans, eth_hburst, eth_haddr, + eth_hwrite, eth_hsize, eth_hprot, + eth_hwdata, + eth_hsel, eth_hrdy, eth_hresp, eth_hsplit, + eth_hrdata, + + interrupt, + + mtxclk, mtxen, mtxd, mtxerr, + mrxclk, mrxdv, mrxd, mrxerr, + mcoll, mcrs, + mdc, md_i, md_o, md_oe, + + bist_mode + + ); + +input hclk; +input hrst_; +input [3:0] hmst; +input hmstlock; +input [1:0] htrans; +input [2:0] hburst; +input [31:0] haddr; +input hwrite; +input [2:0] hsize; +input [31:0] hrdata; +input [31:0] hwdata; +input hrdy; +input [1:0] hresp; + +output eth_hreq; +output eth_hlock; +input eth_hgnt; +output [1:0] eth_htrans; +output [2:0] eth_hburst; +output [31:0] eth_haddr; +output eth_hwrite; +output [2:0] eth_hsize; +output [3:0] eth_hprot; +output [31:0] eth_hwdata; + +input eth_hsel; +output eth_hrdy; +output [1:0] eth_hresp; +output [15:0] eth_hsplit; +output [31:0] eth_hrdata; + +input mtxclk; +output [3:0] mtxd; +output mtxen; +output mtxerr; + +input mrxclk; +input [3:0] mrxd; +input mrxdv; +input mrxerr; + +input mcoll; +input mcrs; + +input md_i; +output mdc; +output md_o; +output md_oe; + +output interrupt; + +input bist_mode; +input SYS_RST_; + +wire tps,rps,rsttco,rstrco,sclk,scs,sdo; + `define MAHBDATAWIDTH 32 + `define TFIFODEPTH 9 + `define RFIFODEPTH 9 + `define ADDRDEPTH 6 + wire [`MAHBDATAWIDTH - 1:0] trdata; + wire twe; + wire [`TFIFODEPTH - 1:0] twaddr; + wire [`TFIFODEPTH - 1:0] traddr; + wire [`MAHBDATAWIDTH - 1:0] twdata; + wire [`MAHBDATAWIDTH - 1:0] rrdata; + wire rwe; + wire [`RFIFODEPTH - 1:0] rwaddr; + wire [`RFIFODEPTH - 1:0] rraddr; + wire [`MAHBDATAWIDTH - 1:0] rwdata; + wire [15:0] frdata; + wire fwe; + wire [`ADDRDEPTH - 1:0] fwaddr; + wire [`ADDRDEPTH - 1:0] fraddr; + wire [15:0] fwdata; + wire match; + wire matchval; + wire matchen; + wire [47:0] matchdata; + + +RF2_512x32 TX_RAM(.CLKA(mtxclk),.CENA(1'b0),.AA(traddr),.QA(trdata), + .CLKB(hclk ),.CENB(!twe),.AB(twaddr),.DB(twdata)); + + +RF2_512x32 RX_RAM(.CLKA(hclk ),.CENA(1'b0),.AA(rraddr),.QA(rrdata), + .CLKB(mrxclk),.CENB(!rwe),.AB(rwaddr),.DB(rwdata)); + +RF2_64x16 ADDR_RAM(.CLKA(mrxclk),.CENA(1'b0),.AA(fraddr),.QA(frdata), + .CLKB(hclk ),.CENB(!fwe),.AB(fwaddr),.DB(fwdata)); + + +CAM_V FIL_CAM(.clk(mrxclk), .matchen(matchen), .matchdata(matchdata), .match(match), .matchval(matchval)); +MAC_AHB_V MAC_TEST( + .clkt(mtxclk), + .clkr(mrxclk), + .rsttco(rsttco), + .rstrco(rstrco), + .interrupt(interrupt), + .tps(tps), + .rps(rps), + .mhclk(hclk), + .mhresetn(hrst_), + .mhrdata(hrdata), + .mhready(hrdy), + .mhresp(hresp), + .mhaddr(eth_haddr), + .mhtrans(eth_htrans), + .mhwrite(eth_hwrite), + .mhsize(eth_hsize), + .mhburst(eth_hburst), + .mhprot(eth_hprot), + .mhwdata(eth_hwdata), + .mhgrantmac(eth_hgnt), + .mhbusreqmac(eth_hreq), + .mhlockmac(eth_hlock), + .shclk(hclk), + .shresetn(hrst_), + .shselmac(eth_hsel), + .shaddr(haddr[7:0]), + .shwrite(hwrite), + .shreadyi(hrdy), + .shtrans(htrans), + .shsize(hsize), + .shburst(hburst), + .shwdata(hwdata), + .shreadyo(eth_hrdy), + .shresp(eth_hresp), + .shrdata(eth_hrdata), + .trdata(trdata), + .twe(twe), + .twaddr(twaddr), + .traddr(traddr), + .twdata(twdata), + .rrdata(rrdata), + .rwe(rwe), + .rwaddr(rwaddr), + .rraddr(rraddr), + .rwdata(rwdata), + .frdata(frdata), + .fwe(fwe), + .fwaddr(fwaddr), + .fraddr(fraddr), + .fwdata(fwdata), + .match(match), + .matchval(matchval), + .matchen(matchen), + .matchdata(matchdata), + .sdi(1'b0), + .sclk(sclk), + .scs(scs), + .sdo(sdo), + .rxer(mrxerr), + .rxdv(mrxdv), + .col(mcoll), + .crs(mcrs), + .rxd(mrxd), + .txen(mtxen), + .txer(mtxerr), + .txd(mtxd), + .mdc(mdc), + .mdi(md_i), + .mdo(md_o), + .mden(md_oe) + ); + +endmodule + +module BD_V ( + clk, + rst, + col, + crs, + fdp, + tprog, + preamble, + tpend, + winp, + tiack, + coll, + carrier, + bkoff, + lc, + lo, + nc, + ec, + cc + ); + + `include "utility.v" + + input clk; + input rst; + + input col; + input crs; + + input fdp; + + input tprog; + input preamble; + input tpend; + output winp; + wire winp; + input tiack; + output coll; + wire coll; + output carrier; + wire carrier; + output bkoff; + wire bkoff; + output lc; + wire lc; + output lo; + reg lo; + output nc; + wire nc; + output ec; + reg ec; + output [3:0] cc; + wire [3:0] cc; + + + reg crs_r; + reg inc; + + reg ibkoff; + reg ibkoff_r; + reg icoll; + reg ilc; + reg [3:0] ccnt; + reg [9:0] bkcnt; + reg [8:0] slcnt; + reg [9:0] bkrel_c; + wire [9:0] p_rand; + reg [31:0] lfsr; + reg [31:0] lfsr_c; + reg iwinp; + + always @(posedge clk) + begin : crs_reg_proc + if (rst) + begin + crs_r <= 1'b0 ; + lo <= 1'b0 ; + inc <= 1'b0 ; + end + else + begin + if (fdp) + begin + crs_r <= 1'b0 ; + end + else + begin + crs_r <= crs ; + end + + if (tprog & !inc & !crs_r) + begin + lo <= 1'b1 ; + end + else if(!tpend & !tprog) + begin + lo <= 1'b0 ; + end + + if (tprog & crs_r) + begin + inc <= 1'b0 ; + end + else if (!tpend & !tprog) + begin + inc <= 1'b1 ; + end + end + end + + assign nc = inc ; + + always @(ccnt or p_rand) + begin : bkrel_proc + case (ccnt) + 4'b0000 : + begin + bkrel_c <= {9'b000000000, p_rand[0]} ; + end + 4'b0001 : + begin + bkrel_c <= {8'b00000000, p_rand[1:0]} ; + end + 4'b0010 : + begin + bkrel_c <= {7'b0000000, p_rand[2:0]} ; + end + 4'b0011 : + begin + bkrel_c <= {6'b000000, p_rand[3:0]} ; + end + 4'b0100 : + begin + bkrel_c <= {5'b00000, p_rand[4:0]} ; + end + 4'b0101 : + begin + bkrel_c <= {4'b0000, p_rand[5:0]} ; + end + 4'b0110 : + begin + bkrel_c <= {3'b000, p_rand[6:0]} ; + end + 4'b0111 : + begin + bkrel_c <= {2'b00, p_rand[7:0]} ; + end + 4'b1000 : + begin + bkrel_c <= {1'b0, p_rand[8:0]} ; + end + default : + begin + bkrel_c <= p_rand[9:0] ; + end + endcase + end + + always @(posedge clk) + begin : slcnt_reg_proc + if (rst) + begin + slcnt <= {9{1'b1}} ; + end + else + begin + if (tprog & !preamble & !icoll) + begin + if (slcnt != 9'b000000000) + begin + slcnt <= slcnt - 1 ; + end + end + else if (ibkoff) + begin + if (slcnt == 9'b000000000 | icoll) + begin + slcnt <= SLOT_TIME ; + end + else + begin + slcnt <= slcnt - 1 ; + end + end + else + begin + slcnt <= SLOT_TIME ; + end + end + end + + always @(posedge clk) + begin : bkcnt_reg_proc + if (rst) + begin + bkcnt <= {10{1'b1}} ; + end + else + begin + if (icoll & !ibkoff) + begin + bkcnt <= bkrel_c ; + end + else if (slcnt == 9'b000000000) + begin + bkcnt <= bkcnt - 1 ; + end + end + end + + always @(posedge clk) + begin : rand_reg_proc + if (rst) + begin + lfsr <= {31{1'b1}}; + end + else + begin + lfsr <= lfsr_c; + end + end + + always @(lfsr) + begin : lfsr_drv + + reg [31:0] lfsr_n; + + integer i; + for(i=0; i<=30; i=i+1) + begin + lfsr_n[i] = lfsr[i+1]; + end + + lfsr_n[31] = 1'b0; + if(lfsr[0]==1'b1) + begin + lfsr_n = lfsr_n ^ 32'b10000000000000000000111010100110; + end + + lfsr_c <= lfsr_n; + + end + + assign p_rand = lfsr[9:0] ; + + + always @(posedge clk) + begin : ibkoff_reg_proc + if (rst) + begin + ibkoff <= 1'b0 ; + ibkoff_r <= 1'b0 ; + end + else + begin + ibkoff_r <= ibkoff ; + if(icoll & ccnt!=4'b1111 & !iwinp & !ilc) + begin + ibkoff <= 1'b1 ; + end + else if (bkcnt == 10'b0000000000) + begin + ibkoff <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : coll_reg_proc + if (rst) + begin + icoll <= 1'b0 ; + ilc <= 1'b0 ; + ec <= 1'b0 ; + iwinp <= 1'b1 ; + ccnt <= 4'b0000 ; + end + else + begin + if ((preamble | tprog) & col & !fdp) + begin + icoll <= 1'b1 ; + end + else if (!tprog & !preamble) + begin + icoll <= 1'b0 ; + end + + if (tiack) + begin + ilc <= 1'b0 ; + end + else if (tprog & icoll & iwinp) + begin + ilc <= 1'b1 ; + end + + if (tiack) + begin + ec <= 1'b0 ; + end + else if (icoll & ccnt == 4'b1111 & tprog) + begin + ec <= 1'b1 ; + end + + if (slcnt == 9'b000000000 | !tprog) + begin + iwinp <= 1'b1 ; + end + else + begin + iwinp <= 1'b0 ; + end + + if (!tpend & !tprog) + begin + ccnt <= 4'b0000 ; + end + else if (ibkoff & !ibkoff_r) + begin + ccnt <= ccnt + 4'b0001 ; + end + end + end + + assign winp = iwinp ; + + assign lc = ilc; + + assign carrier = crs_r ; + + assign coll = icoll ; + + assign bkoff = ibkoff ; + + assign cc = ccnt ; + +endmodule + + + +module CAM_V (clk, matchen, matchdata, match, matchval); + + input clk; + input matchen; + input [47:0] matchdata; + output match; + wire match; + output matchval; + wire matchval; + + parameter [47:0] adr0 = {8'b10111010, 8'b10011000, 8'b01110110, + 8'b01010100, 8'b00110010, 8'b00010001}; + parameter [47:0] adr1 = {8'b00000000, 8'b00000000, 8'b00000000, + 8'b00000000, 8'b00000000, 8'b00000000}; + parameter [47:0] adr2 = {8'b00000000, 8'b00000000, 8'b00000000, + 8'b00000000, 8'b00000000, 8'b00000000}; + parameter [47:0] adr3 = {8'b00000000, 8'b00000000, 8'b00000000, + 8'b00000000, 8'b00000000, 8'b00000000}; + reg imatchval; + + always @(posedge clk) + begin : imatchval_proc + imatchval <= matchen ; + end + + assign match = (imatchval & (adr0 == matchdata | + adr1 == matchdata | + adr2 == matchdata | + adr3 == matchdata)) ? 1'b1 : 1'b0 ; + + assign matchval = imatchval ; + +endmodule + + + +module CSR_V ( + clk, + rst, + interrupt, + csrreq, + csrrw, + csrbe, + csraddr, + csrdatai, + csrack, + csrdatao, + rstsofto, + tprog, + tireq, + unf, + tcsreq, + tiack, + tcsack, + fd, + ic, + etireq, + etiack, + tm, + sf, + tset, + tdes, + tbuf, + tstat, + tu, + tpollack, + ft, + tpoll, + tdbadc, + tdbad, + rcsreq, + rprog, + rcsack, + ren, + ra, + pm, + pr, + pb, + rif, + ho, + hp, + foclack, + mfclack, + oco, + mfo, + focg, + mfcg, + focl, + mfcl, + rireq, + erireq, + ru, + rpollack, + rdes, + rbuf, + rstat, + riack, + eriack, + rpoll, + rdbadc, + rdbad, + ble, + dbo, + dma_priority, + pbl, + dsl, + stoptc, + stoptlsm, + stoptfifo, + stopt, + tps, + stoprc, + stoprlsm, + stopr, + rps, + sdi, + sclk, + scs, + sdo, + mdi, + mdc, + mdo, + mden + ); + + parameter CSRWIDTH = 32; + parameter DATAWIDTH = 32; + parameter DATADEPTH = 32; + parameter RFIFODEPTH = 9; + parameter RCDEPTH = 2; + + `include "utility.v" + + input clk; + input rst; + output interrupt; + wire interrupt; + + input csrreq; + input csrrw; + input [CSRWIDTH / 8 - 1:0] csrbe; + input [CSRDEPTH - 1:0] csraddr; + input [CSRWIDTH - 1:0] csrdatai; + output csrack; + wire csrack; + output [CSRWIDTH - 1:0] csrdatao; + reg [CSRWIDTH - 1:0] csrdatao; + + output rstsofto; + reg rstsofto; + + input tprog; + input tireq; + input unf; + input tcsreq; + output tiack; + wire tiack; + output tcsack; + wire tcsack; + output fd; + wire fd; + + input ic; + input etireq; + output etiack; + wire etiack; + output [2:0] tm; + wire [2:0] tm; + output sf; + wire sf; + + input tset; + input tdes; + input tbuf; + input tstat; + input tu; + input tpollack; + input [1:0] ft; + output tpoll; + wire tpoll; + output tdbadc; + reg tdbadc; + output [DATADEPTH - 1:0] tdbad; + wire [DATADEPTH - 1:0] tdbad; + + input rcsreq; + input rprog; + output rcsack; + wire rcsack; + output ren; + wire ren; + output ra; + wire ra; + output pm; + wire pm; + output pr; + wire pr; + output pb; + wire pb; + output rif; + wire rif; + output ho; + wire ho; + output hp; + wire hp; + + input foclack; + input mfclack; + input oco; + input mfo; + input [10:0] focg; + input [15:0] mfcg; + output focl; + reg focl; + output mfcl; + reg mfcl; + + input rireq; + input erireq; + input ru; + input rpollack; + input rdes; + input rbuf; + input rstat; + output riack; + wire riack; + output eriack; + wire eriack; + output rpoll; + reg rpoll; + output rdbadc; + reg rdbadc; + output [DATADEPTH - 1:0] rdbad; + wire [DATADEPTH - 1:0] rdbad; + + output ble; + wire ble; + output dbo; + wire dbo; + output [1:0] dma_priority; + wire [1:0] dma_priority; + output [5:0] pbl; + wire [5:0] pbl; + output [4:0] dsl; + wire [4:0] dsl; + + input stoptc; + input stoptlsm; + input stoptfifo; + output stopt; + wire stopt; + output tps; + reg tps; + + input stoprc; + input stoprlsm; + output stopr; + wire stopr; + output rps; + reg rps; + + input sdi; + output sclk; + wire sclk; + output scs; + wire scs; + output sdo; + wire sdo; + + input mdi; + output mdc; + wire mdc; + output mdo; + wire mdo; + output mden; + wire mden; + + + reg [31:0] csrdata_c; + reg [3:0] csrdbe_c; + wire [1:0] csraddr10; + wire [5:0] csraddr72; + wire [1:0] csrbe10; + wire [31:0] csr0; + wire [31:0] csr5; + wire [31:0] csr6; + wire [31:0] csr7; + wire [31:0] csr8; + wire [31:0] csr9; + wire [31:0] csr11; + + reg csr0_dbo; + reg [2:0] csr0_tap; + reg [5:0] csr0_pbl; + reg csr0_ble; + reg [4:0] csr0_dsl; + reg csr0_bar; + reg csr0_swr; + + reg [31:0] csr3; + + reg [31:0] csr4; + + reg [2:0] csr5_ts; + reg [2:0] csr5_rs; + reg csr5_nis; + reg csr5_ais; + reg csr5_eri; + reg csr5_gte; + reg csr5_eti; + reg csr5_rps; + reg csr5_ru; + reg csr5_ri; + reg csr5_unf; + reg csr5_tu; + reg csr5_tps; + reg csr5_ti; + + reg csr6_ra; + reg csr6_ttm; + reg csr6_sf; + reg [1:0] csr6_tr; + reg csr6_st; + reg csr6_fd; + reg csr6_pm; + reg csr6_pr; + reg csr6_if; + reg csr6_pb; + reg csr6_ho; + reg csr6_sr; + reg csr6_hp; + + reg csr7_nie; + reg csr7_aie; + reg csr7_ere; + reg csr7_gte; + reg csr7_ete; + reg csr7_rse; + reg csr7_rue; + reg csr7_rie; + reg csr7_une; + reg csr7_tue; + reg csr7_tse; + reg csr7_tie; + + reg [10:0] csr8_foc; + reg csr8_oco; + reg [15:0] csr8_mfc; + reg csr8_mfo; + reg csr8read; + + reg csr9_mdi; + reg csr9_mii; + reg csr9_mdo; + reg csr9_mdc; + reg csr9_sdi; + reg csr9_sclk; + reg csr9_scs; + reg csr9_sdo; + + reg csr11_cs; + reg [3:0] csr11_tt; + reg [2:0] csr11_ntp; + reg [3:0] csr11_rt; + reg [2:0] csr11_nrp; + reg csr11_con; + reg [15:0] csr11_tim; + reg csr11wr; + + reg tapwr; + reg tpollcmd; + reg itpoll; + reg [2:0] tapcnt; + + reg [1:0] tpsm_c; + reg [1:0] tpsm; + reg tstopcmd; + reg tstartcmd; + reg stoptc_r; + reg stoptlsm_r; + reg stoptfifo_r; + wire [2:0] ts_c; + + reg [1:0] rpsm_c; + reg [1:0] rpsm; + reg rstopcmd; + reg rstartcmd; + reg stoprc_r; + reg stoprlsm_r; + wire [2:0] rs_c; + + reg rpollcmd; + + wire csr5wr_c; + reg csr5wr; + reg gte; + reg iint; + reg rireq_r; + reg rireq_r2; + reg eri; + reg erireq_r; + reg erireq_r2; + reg tireq_r; + reg tireq_r2; + reg eti; + reg etireq_r; + reg etireq_r2; + reg unfi; + reg unf_r; + reg unf_r2; + reg tui; + reg tu_r; + reg tu_r2; + reg rui; + reg ru_r; + reg ru_r2; + reg iic; + + reg rcsreq_r; + reg rcsreq_r1; + reg rimprog; + reg [3:0] rcscnt; + reg rcs2048; + reg rcs128; + reg [3:0] rtcnt; + reg [2:0] rcnt; + reg rimex; + + reg timprog; + reg [7:0] ttcnt; + reg [2:0] tcnt; + reg timex; + reg tcsreq_r1; + reg tcsreq_r2; + reg [3:0] tcscnt; + reg tcs2048; + reg tcs128; + + reg [10:0] foc_c; + reg [15:0] mfc_c; + reg [10:0] focg_r; + reg [15:0] mfcg_r; + + reg gstart; + reg gstart_r; + reg [15:0] gcnt; + wire [CSRWIDTH_MAX + 1:0] csrdatai_max; + wire [CSRWIDTH_MAX + 1:0] czero_max; + wire [CSRWIDTH_MAX/8 + 1:0] csrbe_max; + + assign csraddr10 = csraddr[1:0] ; + + assign csraddr72 = csraddr[7:2] ; + + assign csrbe10 = (CSRWIDTH == 16) ? csrbe_max[1:0] : {2{1'b1}} ; + + always @(csrdatai_max or csrbe_max or csraddr or csraddr10 or csrbe10) + begin : csrdata_proc + csrdata_c <= {32{1'b1}} ; + csrdbe_c <= {4{1'b1}} ; + case (CSRWIDTH) + 8 : + begin + if (csrbe_max[0]) + begin + case (csraddr10) + 2'b00 : + begin + csrdata_c[7:0] <= csrdatai_max[CSRWIDTH-1:0] ; + csrdbe_c <= 4'b0001 ; + end + 2'b01 : + begin + csrdata_c[15:8] <= csrdatai_max[CSRWIDTH-1:0] ; + csrdbe_c <= 4'b0010 ; + end + 2'b10 : + begin + csrdata_c[23:16] <= csrdatai_max[CSRWIDTH-1:0] ; + csrdbe_c <= 4'b0100 ; + end + default : + begin + csrdata_c[31:24] <= csrdatai_max[CSRWIDTH-1:0] ; + csrdbe_c <= 4'b1000 ; + end + endcase + end + else + begin + csrdbe_c <= 4'b0000 ; + end + end + 16 : + begin + case (csrbe10) + 2'b11 : + begin + if (csraddr[1]) + begin + csrdata_c[31:16] <= csrdatai_max[CSRWIDTH-1:0] ; + csrdbe_c <= 4'b1100 ; + end + else + begin + csrdata_c[15:0] <= csrdatai_max[CSRWIDTH-1:0] ; + csrdbe_c <= 4'b0011 ; + end + end + 2'b10 : + begin + if (csraddr[1]) + begin + csrdata_c[31:24] <= + csrdatai_max[CSRWIDTH - 1:CSRWIDTH / 2] ; + csrdbe_c <= 4'b1000 ; + end + else + begin + csrdata_c[15: 8] <= + csrdatai_max[CSRWIDTH - 1:CSRWIDTH / 2] ; + csrdbe_c <= 4'b0010 ; + end + end + 2'b01 : + begin + if (csraddr[1]) + begin + csrdata_c[23:16] <= csrdatai_max[7:0] ; + csrdbe_c <= 4'b0100 ; + end + else + begin + csrdata_c[7:0] <= csrdatai_max[7:0] ; + csrdbe_c <= 4'b0001 ; + end + end + default : + begin + csrdbe_c <= 4'b0000 ; + end + endcase + end + default : + begin + csrdata_c <= csrdatai_max[31:0] ; + csrdbe_c <= csrbe_max[3:0] ; + end + endcase + end + + always @(posedge clk) + begin : csr0_reg_proc + if (rst) + begin + csr0_dbo <= CSR0_RV[20] ; + csr0_tap <= CSR0_RV[19:17] ; + csr0_pbl <= CSR0_RV[13:8] ; + csr0_ble <= CSR0_RV[7] ; + csr0_dsl <= CSR0_RV[6:2] ; + csr0_bar <= CSR0_RV[1] ; + csr0_swr <= CSR0_RV[0] ; + tapwr <= 1'b0 ; + end + else + begin + if (!csrrw & csrreq & csraddr72 == CSR0_ID) + begin + if (csrdbe_c[2]) + begin + csr0_dbo <= csrdata_c[20] ; + csr0_tap <= csrdata_c[19:17] ; + tapwr <= 1'b1 ; + end + else + begin + tapwr <= 1'b0 ; + end + if (csrdbe_c[1]) + begin + csr0_pbl <= csrdata_c[13:8] ; + end + if (csrdbe_c[0]) + begin + csr0_ble <= csrdata_c[7] ; + csr0_dsl <= csrdata_c[6:2] ; + csr0_bar <= csrdata_c[1] ; + csr0_swr <= csrdata_c[0] ; + end + end + else + begin + tapwr <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : tpoolcmd_reg_proc + if (rst) + begin + tpollcmd <= 1'b0 ; + end + else + begin + if (!csrrw & csrreq & csraddr72 == CSR1_ID) + begin + tpollcmd <= 1'b1 ; + end + else + begin + tpollcmd <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : rpoolcmd_reg_proc + if (rst) + begin + rpollcmd <= 1'b0 ; + end + else + begin + if (!csrrw & csrreq & csraddr72 == CSR2_ID) + begin + rpollcmd <= 1'b1 ; + end + else + begin + rpollcmd <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : csr3_reg_proc + if (rst) + begin + csr3 <= CSR3_RV ; + end + else + begin + if (!csrrw & csrreq & csraddr72 == CSR3_ID) + begin + if (csrdbe_c[0]) + begin + csr3[7:0] <= csrdata_c[7:0] ; + end + if (csrdbe_c[1]) + begin + csr3[15:8] <= csrdata_c[15:8] ; + end + if (csrdbe_c[2]) + begin + csr3[23:16] <= csrdata_c[23:16] ; + end + if (csrdbe_c[3]) + begin + csr3[31:24] <= csrdata_c[31:24] ; + end + end + end + end + + assign rdbad = csr3[DATADEPTH - 1:0] ; + + always @(posedge clk) + begin : rdbadc_reg_proc + if (rst) + begin + rdbadc <= 1'b1 ; + end + else + begin + if (!csrrw & csrreq & csraddr72 == CSR3_ID & rpsm == PSM_STOP) + begin + rdbadc <= 1'b1 ; + end + else if (rpsm == PSM_RUN) + begin + rdbadc <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : csr4_reg_proc + if (rst) + begin + csr4 <= CSR4_RV ; + end + else + begin + if (!csrrw & csrreq & csraddr72 == CSR4_ID) + begin + if (csrdbe_c[0]) + begin + csr4[7:0] <= csrdata_c[7:0] ; + end + if (csrdbe_c[1]) + begin + csr4[15:8] <= csrdata_c[15:8] ; + end + if (csrdbe_c[2]) + begin + csr4[23:16] <= csrdata_c[23:16] ; + end + if (csrdbe_c[3]) + begin + csr4[31:24] <= csrdata_c[31:24] ; + end + end + end + end + + always @(posedge clk) + begin : tdbadc_reg_proc + if (rst) + begin + tdbadc <= 1'b1 ; + end + else + begin + if (!csrrw & csrreq & csraddr72 == CSR4_ID) + begin + tdbadc <= 1'b1 ; + end + else if (tpsm == PSM_RUN) + begin + tdbadc <= 1'b0 ; + end + end + end + + assign csr5wr_c = (!csrrw & csrreq & csraddr72 == CSR5_ID) ? 1'b1 : + 1'b0 ; + + always @(posedge clk) + begin : csr5wr_reg_proc + if (rst) + begin + csr5wr <= 1'b0 ; + end + else + begin + csr5wr <= csr5wr_c ; + end + end + + always @(posedge clk) + begin : csr5_reg_proc + if (rst) + begin + csr5_ts <= CSR5_RV[22:20] ; + csr5_rs <= CSR5_RV[19:17] ; + csr5_nis <= CSR5_RV[16] ; + csr5_ais <= CSR5_RV[15] ; + csr5_eri <= CSR5_RV[14] ; + csr5_gte <= CSR5_RV[11] ; + csr5_eti <= CSR5_RV[10] ; + csr5_rps <= CSR5_RV[8] ; + csr5_ru <= CSR5_RV[7] ; + csr5_ri <= CSR5_RV[6] ; + csr5_unf <= CSR5_RV[5] ; + csr5_tu <= CSR5_RV[2] ; + csr5_tps <= CSR5_RV[1] ; + csr5_ti <= CSR5_RV[0] ; + end + else + begin + if (csr5wr_c) + begin + if (csrdbe_c[2]) + begin + csr5_nis <= ~csrdata_c[16] & csr5_nis ; + end + if (csrdbe_c[1]) + begin + csr5_ais <= ~csrdata_c[15] & csr5_ais ; + csr5_eri <= ~csrdata_c[14] & csr5_eri ; + csr5_gte <= ~csrdata_c[11] & csr5_gte ; + csr5_eti <= ~csrdata_c[10] & csr5_eti ; + csr5_rps <= ~csrdata_c[8] & csr5_rps ; + end + if (csrdbe_c[0]) + begin + csr5_ru <= ~csrdata_c[7] & csr5_ru ; + csr5_ri <= ~csrdata_c[6] & csr5_ri ; + csr5_unf <= ~csrdata_c[5] & csr5_unf ; + csr5_tu <= ~csrdata_c[2] & csr5_tu ; + csr5_tps <= ~csrdata_c[1] & csr5_tps ; + csr5_ti <= ~csrdata_c[0] & csr5_ti ; + end + end + else + begin + if (timex) + begin + csr5_ti <= 1'b1 ; + end + if (rimex) + begin + csr5_ri <= 1'b1 ; + end + if (eti) + begin + csr5_eti <= 1'b1 ; + end + if (eri) + begin + csr5_eri <= 1'b1 ; + end + if (gte) + begin + csr5_gte <= 1'b1 ; + end + if (tpsm_c == PSM_STOP & + (tpsm == PSM_RUN | tpsm == PSM_SUSPEND)) + begin + csr5_tps <= 1'b1 ; + end + if (rpsm_c == PSM_STOP & + (rpsm == PSM_RUN | rpsm == PSM_SUSPEND)) + begin + csr5_rps <= 1'b1 ; + end + if (rui) + begin + csr5_ru <= 1'b1 ; + end + if (tui) + begin + csr5_tu <= 1'b1 ; + end + if (unfi) + begin + csr5_unf <= 1'b1 ; + end + if ((csr5_ri & csr7_rie) | + (csr5_ti & csr7_tie) | + (csr5_eri & csr7_ere) | + (csr5_tu & csr7_tue) | + (csr5_gte & csr7_gte)) + begin + csr5_nis <= 1'b1 ; + end + else + begin + csr5_nis <= 1'b0 ; + end + if ((csr5_eti & csr7_ete) | + (csr5_rps & csr7_rse) | + (csr5_ru & csr7_rue) | + (csr5_unf & csr7_une) | + (csr5_tps & csr7_tse)) + begin + csr5_ais <= 1'b1 ; + end + else + begin + csr5_ais <= 1'b0 ; + end + csr5_ts <= ts_c ; + csr5_rs <= rs_c ; + end + end + end + + always @(posedge clk) + begin : csr6_reg_proc + if (rst) + begin + csr6_ra <= CSR6_RV[30] ; + csr6_ttm <= CSR6_RV[22] ; + csr6_sf <= CSR6_RV[21] ; + csr6_tr <= CSR6_RV[15:14] ; + csr6_st <= CSR6_RV[13] ; + csr6_fd <= CSR6_RV[9] ; + csr6_pm <= CSR6_RV[7] ; + csr6_pr <= CSR6_RV[6] ; + csr6_if <= CSR6_RV[4] ; + csr6_pb <= CSR6_RV[3] ; + csr6_ho <= CSR6_RV[2] ; + csr6_sr <= CSR6_RV[1] ; + csr6_hp <= CSR6_RV[0] ; + end + else + begin + if (!csrrw & csrreq & csraddr72 == CSR6_ID) + begin + if (csrdbe_c[3]) + begin + csr6_ra <= csrdata_c[30] ; + end + if (csrdbe_c[2]) + begin + csr6_ttm <= csrdata_c[22] ; + if (tpsm == PSM_STOP) + begin + csr6_sf <= csrdata_c[21] ; + end + end + if (csrdbe_c[1]) + begin + csr6_tr <= csrdata_c[15:14] ; + csr6_st <= csrdata_c[13] ; + csr6_fd <= csrdata_c[9] ; + end + if (csrdbe_c[0]) + begin + csr6_pm <= csrdata_c[7] ; + csr6_pr <= csrdata_c[6] ; + csr6_pb <= csrdata_c[3] ; + csr6_sr <= csrdata_c[1] ; + end + end + case (ft) + FT_PERFECT : + begin + csr6_ho <= 1'b0 ; + csr6_if <= 1'b0 ; + csr6_hp <= 1'b0 ; + end + FT_HASH : + begin + csr6_ho <= 1'b0 ; + csr6_if <= 1'b0 ; + csr6_hp <= 1'b1 ; + end + FT_INVERSE : + begin + csr6_ho <= 1'b0 ; + csr6_if <= 1'b1 ; + csr6_hp <= 1'b0 ; + end + default : + begin + csr6_ho <= 1'b1 ; + csr6_if <= 1'b0 ; + csr6_hp <= 1'b1 ; + end + endcase + end + end + + always @(posedge clk) + begin : csr7_reg_proc + if (rst) + begin + csr7_nie <= CSR7_RV[16] ; + csr7_aie <= CSR7_RV[15] ; + csr7_ere <= CSR7_RV[14] ; + csr7_gte <= CSR7_RV[11] ; + csr7_ete <= CSR7_RV[10] ; + csr7_rse <= CSR7_RV[8] ; + csr7_rue <= CSR7_RV[7] ; + csr7_rie <= CSR7_RV[6] ; + csr7_une <= CSR7_RV[5] ; + csr7_tue <= CSR7_RV[2] ; + csr7_tse <= CSR7_RV[1] ; + csr7_tie <= CSR7_RV[0] ; + end + else + begin + if (!csrrw & csrreq & csraddr72 == CSR7_ID) + begin + if (csrdbe_c[2]) + begin + csr7_nie <= csrdata_c[16] ; + end + if (csrdbe_c[1]) + begin + csr7_aie <= csrdata_c[15] ; + csr7_ere <= csrdata_c[14] ; + csr7_gte <= csrdata_c[11] ; + csr7_ete <= csrdata_c[10] ; + csr7_rse <= csrdata_c[8] ; + end + if (csrdbe_c[0]) + begin + csr7_rue <= csrdata_c[7] ; + csr7_rie <= csrdata_c[6] ; + csr7_une <= csrdata_c[5] ; + csr7_tue <= csrdata_c[2] ; + csr7_tse <= csrdata_c[1] ; + csr7_tie <= csrdata_c[0] ; + end + end + end + end + + always @(posedge clk) + begin : csr8_reg_proc + if (rst) + begin + csr8_oco <= 1'b0 ; + csr8_mfo <= 1'b0 ; + csr8_foc <= {11{1'b0}} ; + csr8_mfc <= {16{1'b0}} ; + end + else + begin + if (!(csrrw & csrreq & csraddr72 == CSR8_ID)) + begin + if (!csr8read) + begin + csr8_foc <= foc_c ; + csr8_mfc <= mfc_c ; + csr8_oco <= oco ; + csr8_mfo <= mfo ; + end + end + end + end + + always @(posedge clk) + begin : csr8read_reg_proc + if (rst) + begin + csr8read <= 1'b0 ; + end + else + begin + if (csrrw & csrreq & csraddr72 == CSR8_ID) + begin + csr8read <= csrdbe_c[3] ; + end + else + begin + csr8read <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : csr9_reg_proc + if (rst) + begin + csr9_mdi <= CSR9_RV[19] ; + csr9_mii <= CSR9_RV[18] ; + csr9_mdo <= CSR9_RV[17] ; + csr9_mdc <= CSR9_RV[16] ; + csr9_sdi <= CSR9_RV[2] ; + csr9_sclk <= CSR9_RV[1] ; + csr9_scs <= CSR9_RV[0] ; + csr9_sdo <= CSR9_RV[3] ; + end + else + begin + if (!csrrw & csrreq & csraddr72 == CSR9_ID) + begin + if (csrdbe_c[0]) + begin + csr9_sclk <= csrdata_c[1] ; + csr9_scs <= csrdata_c[0] ; + csr9_sdo <= csrdata_c[3] ; + end + if (csrdbe_c[2]) + begin + csr9_mii <= csrdata_c[18] ; + csr9_mdo <= csrdata_c[17] ; + csr9_mdc <= csrdata_c[16] ; + end + end + csr9_mdi <= mdi ; + csr9_sdi <= sdi ; + end + end + + always @(posedge clk) + begin : csr11_reg_proc + if (rst) + begin + csr11_cs <= CSR11_RV[31] ; + csr11_tt <= CSR11_RV[30:27] ; + csr11_ntp <= CSR11_RV[26:24] ; + csr11_rt <= CSR11_RV[23:20] ; + csr11_nrp <= CSR11_RV[19:17] ; + csr11_con <= CSR11_RV[16] ; + csr11_tim <= CSR11_RV[15:0] ; + end + else + begin + if (!csrrw & csrreq & csraddr72 == CSR11_ID) + begin + if (csrdbe_c[3]) + begin + csr11_cs <= csrdata_c[31] ; + csr11_tt <= csrdata_c[30:27] ; + csr11_ntp <= csrdata_c[26:24] ; + end + if (csrdbe_c[2]) + begin + csr11_rt <= csrdata_c[23:20] ; + csr11_nrp <= csrdata_c[19:17] ; + csr11_con <= csrdata_c[16] ; + end + if (csrdbe_c[1]) + begin + csr11_tim[15:8] <= csrdata_c[15:8] ; + end + if (csrdbe_c[0]) + begin + csr11_tim[7:0] <= csrdata_c[7:0] ; + end + end + end + end + + always @(posedge clk) + begin : csr11wr_reg_proc + if (rst) + begin + csr11wr <= 1'b0 ; + end + else + begin + if (!csrrw & csrreq & csraddr72 == CSR11_ID) + begin + csr11wr <= 1'b1 ; + end + else + begin + csr11wr <= 1'b0 ; + end + end + end + + assign csr0 = {CSR0_RV[31:26], CSR0_RV[25:21], csr0_dbo, csr0_tap, + CSR0_RV[16:14], csr0_pbl, csr0_ble, + csr0_dsl, csr0_bar, (rst | csr0_swr)} ; + + assign csr5 = {CSR5_RV[31:23], csr5_ts, csr5_rs, csr5_nis, + csr5_ais, csr5_eri, CSR5_RV[13:12], csr5_gte, csr5_eti, + CSR5_RV[9], csr5_rps, csr5_ru, csr5_ri, csr5_unf, + CSR5_RV[4:3], csr5_tu, csr5_tps, csr5_ti} ; + + assign csr6 = {CSR6_RV[31], csr6_ra, CSR6_RV[29:26], + CSR6_RV[25:23], csr6_ttm, csr6_sf, CSR6_RV[20], + CSR6_RV[19], CSR6_RV[18], CSR6_RV[17], CSR6_RV[16], + csr6_tr, csr6_st, CSR6_RV[13], CSR6_RV[12:11], + csr6_fd, CSR6_RV[8], csr6_pm, csr6_pr, CSR6_RV[5], + csr6_if, csr6_pb, csr6_ho, csr6_sr, csr6_hp} ; + + assign csr7 = {CSR7_RV[31:17], csr7_nie, csr7_aie, csr7_ere, + CSR7_RV[13:12], csr7_gte, csr7_ete, CSR6_RV[9], + csr7_rse, csr7_rue, csr7_rie, csr7_une, + CSR7_RV[4:3], csr7_tue, csr7_tse, csr7_tie} ; + + assign csr8 = {CSR8_RV[31:29], csr8_oco, csr8_foc, + csr8_mfo, csr8_mfc} ; + + assign csr9 = {CSR9_RV[31:20], csr9_mdi, csr9_mii, csr9_mdo, + csr9_mdc, CSR9_RV[15:4], csr9_sdo, csr9_sdi, + csr9_sclk, csr9_scs} ; + + assign csr11 = {csr11_cs, ttcnt[7:4], tcnt[2:0], rtcnt[3:0], + rcnt[2:0], csr11_con, gcnt} ; + + always @(csr0 or + csr3 or + csr4 or + csr5 or + csr6 or + csr7 or + csr8 or + csr9 or + csr11 or + csraddr or + csraddr72 or + csraddr10) + begin : csrmux_proc + case (CSRWIDTH) + 8 : + begin + case (csraddr10) + 2'b00 : + begin + case (csraddr72) + CSR0_ID : + begin + csrdatao <= csr0[7:0] ; + end + CSR3_ID : + begin + csrdatao <= csr3[7:0] ; + end + CSR4_ID : + begin + csrdatao <= csr4[7:0] ; + end + CSR5_ID : + begin + csrdatao <= csr5[7:0] ; + end + CSR6_ID : + begin + csrdatao <= csr6[7:0] ; + end + CSR7_ID : + begin + csrdatao <= csr7[7:0] ; + end + CSR8_ID : + begin + csrdatao <= csr8[7:0] ; + end + CSR9_ID : + begin + csrdatao <= csr9[7:0] ; + end + CSR11_ID : + begin + csrdatao <= csr11[7:0] ; + end + default : + begin + csrdatao <= {CSRWIDTH{1'b0}} ; + end + endcase + end + 2'b01 : + begin + case (csraddr72) + CSR0_ID : + begin + csrdatao <= csr0[15:8] ; + end + CSR3_ID : + begin + csrdatao <= csr3[15:8] ; + end + CSR4_ID : + begin + csrdatao <= csr4[15:8] ; + end + CSR5_ID : + begin + csrdatao <= csr5[15:8] ; + end + CSR6_ID : + begin + csrdatao <= csr6[15:8] ; + end + CSR7_ID : + begin + csrdatao <= csr7[15:8] ; + end + CSR8_ID : + begin + csrdatao <= csr8[15:8] ; + end + CSR9_ID : + begin + csrdatao <= csr9[15:8] ; + end + CSR11_ID : + begin + csrdatao <= csr11[15:8] ; + end + default : + begin + csrdatao <= {CSRWIDTH{1'b0}} ; + end + endcase + end + 2'b10 : + begin + case (csraddr72) + CSR0_ID : + begin + csrdatao <= csr0[23:16] ; + end + CSR3_ID : + begin + csrdatao <= csr3[23:16] ; + end + CSR4_ID : + begin + csrdatao <= csr4[23:16] ; + end + CSR5_ID : + begin + csrdatao <= csr5[23:16] ; + end + CSR6_ID : + begin + csrdatao <= csr6[23:16] ; + end + CSR7_ID : + begin + csrdatao <= csr7[23:16] ; + end + CSR8_ID : + begin + csrdatao <= csr8[23:16] ; + end + CSR9_ID : + begin + csrdatao <= csr9[23:16] ; + end + CSR11_ID : + begin + csrdatao <= csr11[23:16] ; + end + default : + begin + csrdatao <= {CSRWIDTH{1'b0}} ; + end + endcase + end + 2'b11 : + begin + case (csraddr72) + CSR0_ID : + begin + csrdatao <= csr0[31:24] ; + end + CSR3_ID : + begin + csrdatao <= csr3[31:24] ; + end + CSR4_ID : + begin + csrdatao <= csr4[31:24] ; + end + CSR5_ID : + begin + csrdatao <= csr5[31:24] ; + end + CSR6_ID : + begin + csrdatao <= csr6[31:24] ; + end + CSR7_ID : + begin + csrdatao <= csr7[31:24] ; + end + CSR8_ID : + begin + csrdatao <= csr8[31:24] ; + end + CSR9_ID : + begin + csrdatao <= csr9[31:24] ; + end + CSR11_ID : + begin + csrdatao <= csr11[31:24] ; + end + default : + begin + csrdatao <= {CSRWIDTH{1'b0}} ; + end + endcase + end + default : + begin + csrdatao <= {CSRWIDTH{1'b0}} ; + end + endcase + end + 16 : + begin + case (csraddr[1]) + 1'b0 : + begin + case (csraddr72) + CSR0_ID : + begin + csrdatao <= csr0[15:0] ; + end + CSR3_ID : + begin + csrdatao <= csr3[15:0] ; + end + CSR4_ID : + begin + csrdatao <= csr4[15:0] ; + end + CSR5_ID : + begin + csrdatao <= csr5[15:0] ; + end + CSR6_ID : + begin + csrdatao <= csr6[15:0] ; + end + CSR7_ID : + begin + csrdatao <= csr7[15:0] ; + end + CSR8_ID : + begin + csrdatao <= csr8[15:0] ; + end + CSR9_ID : + begin + csrdatao <= csr9[15:0] ; + end + CSR11_ID : + begin + csrdatao <= csr11[15:0] ; + end + default : + begin + csrdatao <= {CSRWIDTH{1'b0}} ; + end + endcase + end + 1'b1 : + begin + case (csraddr72) + CSR0_ID : + begin + csrdatao <= csr0[31:16] ; + end + CSR3_ID : + begin + csrdatao <= csr3[31:16] ; + end + CSR4_ID : + begin + csrdatao <= csr4[31:16] ; + end + CSR5_ID : + begin + csrdatao <= csr5[31:16] ; + end + CSR6_ID : + begin + csrdatao <= csr6[31:16] ; + end + CSR7_ID : + begin + csrdatao <= csr7[31:16] ; + end + CSR8_ID : + begin + csrdatao <= csr8[31:16] ; + end + CSR9_ID : + begin + csrdatao <= csr9[31:16] ; + end + CSR11_ID : + begin + csrdatao <= csr11[31:16] ; + end + default : + begin + csrdatao <= {CSRWIDTH{1'b0}} ; + end + endcase + end + default : + begin + csrdatao <= {CSRWIDTH{1'b0}} ; + end + endcase + end + default : + begin + case (csraddr72) + CSR0_ID : + begin + csrdatao <= csr0 ; + end + CSR3_ID : + begin + csrdatao <= csr3 ; + end + CSR4_ID : + begin + csrdatao <= csr4 ; + end + CSR5_ID : + begin + csrdatao <= csr5 ; + end + CSR6_ID : + begin + csrdatao <= csr6 ; + end + CSR7_ID : + begin + csrdatao <= csr7 ; + end + CSR8_ID : + begin + csrdatao <= csr8 ; + end + CSR9_ID : + begin + csrdatao <= csr9 ; + end + CSR11_ID : + begin + csrdatao <= csr11 ; + end + default : + begin + csrdatao <= {CSRWIDTH{1'b0}} ; + end + endcase + end + endcase + end + + assign csrack = 1'b1 ; + + assign dma_priority = (csr0_bar & !tprog) ? 2'b01 : + (csr0_bar & tprog) ? 2'b10 : + 2'b00 ; + + assign dbo = csr0_dbo ; + + assign pbl = csr0_pbl ; + + assign dsl = csr0_dsl ; + + assign ble = csr0_ble ; + + assign tdbad = csr4[DATADEPTH - 1:0] ; + + always @(posedge clk) + begin : itpoll_reg_proc + if (rst) + begin + itpoll <= 1'b0 ; + end + else + begin + if (((((csr0_tap == 3'b001 | + csr0_tap == 3'b010 | + csr0_tap == 3'b011) & tcs2048) | + ((csr0_tap == 3'b100 | + csr0_tap == 3'b101 | + csr0_tap == 3'b110 | + csr0_tap == 3'b111) & tcs128)) & + tapcnt == 3'b000 & tpsm == PSM_SUSPEND) | + tpollcmd | tstartcmd) + begin + itpoll <= 1'b1 ; + end + else if (tpollack) + begin + itpoll <= 1'b0 ; + end + end + end + + assign tpoll = itpoll ; + + always @(posedge clk) + begin : tap_reg_proc + if (rst) + begin + tapcnt <= {3{1'b1}} ; + end + else + begin + if (((csr0_tap == 3'b001 | + csr0_tap == 3'b010 | + csr0_tap == 3'b011) & (tcs2048 | tapwr)) | + ((csr0_tap == 3'b100 | + csr0_tap == 3'b101 | + csr0_tap == 3'b110 | + csr0_tap == 3'b111) & (tcs128 | tapwr))) + begin + if (tapcnt == 3'b000 | tapwr) + begin + case (csr0_tap) + 3'b001 : + begin + tapcnt <= 3'b000 ; + end + 3'b010 : + begin + tapcnt <= 3'b010 ; + end + 3'b011 : + begin + tapcnt <= 3'b110 ; + end + 3'b100 : + begin + tapcnt <= 3'b000 ; + end + 3'b101 : + begin + tapcnt <= 3'b001 ; + end + 3'b110 : + begin + tapcnt <= 3'b010 ; + end + default : + begin + tapcnt <= 3'b111 ; + end + endcase + end + else + begin + tapcnt <= tapcnt - 1 ; + end + end + end + end + + assign tm = {csr6_ttm, csr6_tr} ; + + assign sf = csr6_sf ; + + always @(posedge clk) + begin : tim_reg_proc + if (rst) + begin + timprog <= 1'b0 ; + timex <= 1'b0 ; + ttcnt <= {8{1'b1}} ; + tcnt <= {3{1'b1}} ; + end + else + begin + if (csr5_ti) + begin + timprog <= 1'b0 ; + end + else if (tireq_r & !tireq_r2) + begin + timprog <= 1'b1 ; + end + + if (csr5_ti) + begin + timex <= 1'b0 ; + end + else if (timprog & + ((ttcnt == 8'b00000000 & csr11_tt != 4'b0000) | + (tcnt == 3'b000 & csr11_ntp != 3'b000) | + (iic) | + (csr11_tt == 4'b0000 & csr11_ntp == 3'b000))) + begin + timex <= 1'b1 ; + end + + if ((tireq_r & !tireq_r2) | csr5_ti | csr11wr) + begin + ttcnt <= {csr11_tt, 4'b0000} ; + end + else if (((tcs128 & csr11_cs) | + (tcs2048 & !csr11_cs)) & + ttcnt != 8'b00000000 & timprog) + begin + ttcnt <= ttcnt - 1 ; + end + + if (csr5_ti | csr11wr) + begin + tcnt <= csr11_ntp ; + end + else if (tireq_r & !tireq_r2 & + tcnt != 3'b000 & csr11_ntp != 3'b000) + begin + tcnt <= tcnt - 1 ; + end + end + end + + always @(posedge clk) + begin : tcscnt_reg_proc + if (rst) + begin + tcsreq_r1 <= 1'b0 ; + tcsreq_r2 <= 1'b0 ; + tcs2048 <= 1'b0 ; + tcs128 <= 1'b0 ; + tcscnt <= {4{1'b1}} ; + end + else + begin + tcsreq_r1 <= tcsreq ; + tcsreq_r2 <= tcsreq_r1 ; + + if (tcs128) + begin + if (tcscnt == 4'b0000) + begin + tcscnt <= 4'b1111 ; + end + else + begin + tcscnt <= tcscnt - 1 ; + end + end + + if (tcsreq_r1 & !tcsreq_r2) + begin + tcs128 <= 1'b1 ; + end + else + begin + tcs128 <= 1'b0 ; + end + + if (tcscnt == 4'b0000 & tcs128) + begin + tcs2048 <= 1'b1 ; + end + else + begin + tcs2048 <= 1'b0 ; + end + + end + end + + assign tcsack = tcsreq_r2 ; + + always @(posedge clk) + begin : st_reg_proc + if (rst) + begin + tstopcmd <= 1'b1 ; + tstartcmd <= 1'b0 ; + end + else + begin + if (tstartcmd) + begin + tstopcmd <= 1'b0 ; + end + else if (!csrrw & csrreq & !(csrdata_c[13]) & + csraddr72 == CSR6_ID & (csrdbe_c[1])) + begin + tstopcmd <= 1'b1 ; + end + + if (tpsm == PSM_RUN | tpsm == PSM_SUSPEND) + begin + tstartcmd <= 1'b0 ; + end + else if (!csrrw & csrreq & (csrdata_c[13]) & + csraddr72 == CSR6_ID & (csrdbe_c[1])) + begin + tstartcmd <= 1'b1 ; + end + + end + end + + assign ts_c = (tpsm == PSM_STOP) ? 3'b000 : + (tpsm == PSM_SUSPEND) ? 3'b110 : + (tstat) ? 3'b111 : + (tdes) ? 3'b001 : + (tset) ? 3'b101 : + (tbuf) ? 3'b011 : + (tprog) ? 3'b010 : + csr5_ts ; + + always @(posedge clk) + begin : tpsack_reg_proc + if (rst) + begin + stoptc_r <= 1'b0 ; + stoptlsm_r <= 1'b0 ; + stoptfifo_r <= 1'b0 ; + end + else + begin + stoptc_r <= stoptc ; + stoptlsm_r <= stoptlsm ; + stoptfifo_r <= stoptfifo ; + end + end + + always @(tpsm or + tstartcmd or + tstopcmd or + tu_r or + stoptc_r or + stoptlsm_r or + stoptfifo_r) + begin : tpsm_proc + case (tpsm) + PSM_STOP : + begin + if (tstartcmd & !stoptc_r & !stoptlsm_r & !stoptfifo_r) + begin + tpsm_c <= PSM_RUN ; + end + else + begin + tpsm_c <= PSM_STOP ; + end + end + PSM_SUSPEND : + begin + if (tstopcmd & stoptc_r & stoptlsm_r & stoptfifo_r) + begin + tpsm_c <= PSM_STOP ; + end + else if (!tu_r) + begin + tpsm_c <= PSM_RUN ; + end + else + begin + tpsm_c <= PSM_SUSPEND ; + end + end + default : + begin + if (tstopcmd & stoptc_r & stoptlsm_r & stoptfifo_r) + begin + tpsm_c <= PSM_STOP ; + end + else if (tu_r) + begin + tpsm_c <= PSM_SUSPEND ; + end + else + begin + tpsm_c <= PSM_RUN ; + end + end + endcase + end + + always @(posedge clk) + begin : tpsm_reg_proc + if (rst) + begin + tpsm <= PSM_STOP ; + end + else + begin + tpsm <= tpsm_c ; + end + end + + always @(posedge clk) + begin : tps_reg_proc + if (rst) + begin + tps <= 1'b0 ; + end + else + begin + if (tstartcmd) + begin + tps <= 1'b0 ; + end + else if (tpsm == PSM_STOP) + begin + tps <= 1'b1 ; + end + end + end + + assign stopt = tstopcmd ; + + assign ren = csr6_sr ; + + assign fd = csr6_fd ; + + assign ra = csr6_ra ; + + assign pm = csr6_pm ; + + assign pr = csr6_pr ; + + assign rif = csr6_if ; + + assign pb = csr6_pb ; + + assign ho = csr6_ho ; + + assign hp = csr6_hp ; + + always @(posedge clk) + begin : rpoll_reg_proc + if (rst) + begin + rpoll <= 1'b0 ; + end + else + begin + if (rpollcmd | rstartcmd) + begin + rpoll <= 1'b1 ; + end + else if (rpollack) + begin + rpoll <= 1'b0 ; + end + end + end + + assign rs_c = (rpsm == PSM_STOP) ? 3'b000 : + (rpsm == PSM_SUSPEND) ? 3'b100 : + (rstat) ? 3'b101 : + (rdes) ? 3'b001 : + (rbuf) ? 3'b111 : + (rprog) ? 3'b010 : + 3'b011 ; + + always @(posedge clk) + begin : rpsack_reg_proc + if (rst) + begin + stoprc_r <= 1'b0 ; + stoprlsm_r <= 1'b0 ; + end + else + begin + stoprc_r <= stoprc ; + stoprlsm_r <= stoprlsm ; + end + end + + always @(rpsm or + rstartcmd or + rstopcmd or + rui or + ru_r or + stoprc_r or + stoprlsm_r) + begin : rpsm_proc + case (rpsm) + PSM_STOP : + begin + if (rstartcmd & !stoprc_r & !stoprlsm_r) + begin + rpsm_c <= PSM_RUN ; + end + else + begin + rpsm_c <= PSM_STOP ; + end + end + PSM_SUSPEND : + begin + if (rstopcmd & stoprc_r & stoprlsm_r) + begin + rpsm_c <= PSM_STOP ; + end + else if (!ru_r) + begin + rpsm_c <= PSM_RUN ; + end + else + begin + rpsm_c <= PSM_SUSPEND ; + end + end + default : + begin + if (rstopcmd & stoprc_r & stoprlsm_r) + begin + rpsm_c <= PSM_STOP ; + end + else if (rui) + begin + rpsm_c <= PSM_SUSPEND ; + end + else + begin + rpsm_c <= PSM_RUN ; + end + end + endcase + end + + always @(posedge clk) + begin : rpsm_reg_proc + if (rst) + begin + rpsm <= PSM_STOP ; + end + else + begin + rpsm <= rpsm_c ; + end + end + + always @(posedge clk) + begin : rps_reg_proc + if (rst) + begin + rps <= 1'b0 ; + end + else + begin + if (rstartcmd) + begin + rps <= 1'b0 ; + end + else if (rpsm == PSM_STOP) + begin + rps <= 1'b1 ; + end + end + end + + always @(posedge clk) + begin : rstartcmd_reg_proc + if (rst) + begin + rstartcmd <= 1'b0 ; + rstopcmd <= 1'b0 ; + end + else + begin + if (rpsm == PSM_RUN) + begin + rstartcmd <= 1'b0 ; + end + else if (!csrrw & csrreq & (csrdata_c[1]) & + csraddr72 == CSR6_ID & (csrdbe_c[0])) + begin + rstartcmd <= 1'b1 ; + end + + if (rpsm == PSM_STOP) + begin + rstopcmd <= 1'b0 ; + end + else if (!csrrw & csrreq & !(csrdata_c[1]) & + csraddr72 == CSR6_ID & (csrdbe_c[0])) + begin + rstopcmd <= 1'b1 ; + end + end + end + + assign stopr = rstopcmd ; + + always @(posedge clk) + begin : rim_reg_proc + if (rst) + begin + rimex <= 1'b0 ; + rimprog <= 1'b0 ; + rtcnt <= {4{1'b1}} ; + rcnt <= {3{1'b1}} ; + end + else + begin + if (csr5_ri) + begin + rimex <= 1'b0 ; + end + else if (rimprog & + ((rtcnt == 4'b0000 & csr11_rt != 4'b0000) | + (rcnt == 3'b000 & csr11_nrp != 3'b000) | + (csr11_rt == 4'b0000 & csr11_nrp == 3'b000))) + begin + rimex <= 1'b1 ; + end + + if (csr5_ri) + begin + rimprog <= 1'b0 ; + end + else if (rireq_r & !rireq_r2) + begin + rimprog <= 1'b1 ; + end + + if ((rireq_r & !rireq_r2) | csr5_ri) + begin + rtcnt <= csr11_rt ; + end + else if (((rcs128 & csr11_cs) | + (rcs2048 & !csr11_cs)) & + rtcnt != 4'b0000 & rimprog) + begin + rtcnt <= rtcnt - 1 ; + end + + if (csr5_ri | csr11wr) + begin + rcnt <= csr11_nrp ; + end + else if (rireq_r & !rireq_r2 & + rcnt != 3'b000 & csr11_nrp != 3'b000) + begin + rcnt <= rcnt - 1 ; + end + + end + end + + always @(posedge clk) + begin : rcscnt_reg_proc + if (rst) + begin + rcsreq_r <= 1'b0 ; + rcsreq_r1 <= 1'b0 ; + rcscnt <= {4{1'b1}} ; + rcs128 <= 1'b0 ; + rcs2048 <= 1'b0 ; + end + else + begin + + rcsreq_r <= rcsreq ; + rcsreq_r1 <= rcsreq_r ; + + if (rcs128) + begin + if (rcscnt == 4'b0000) + begin + rcscnt <= 4'b1111 ; + end + else + begin + rcscnt <= rcscnt - 1 ; + end + end + + if (rcsreq_r & !rcsreq_r1) + begin + rcs128 <= 1'b1 ; + end + else + begin + rcs128 <= 1'b0 ; + end + + if (rcscnt == 4'b0000 & rcs128) + begin + rcs2048 <= 1'b1 ; + end + else + begin + rcs2048 <= 1'b0 ; + end + end + end + + assign rcsack = rcsreq_r ; + + always @(posedge clk) + begin : ireq_reg_proc + if (rst) + begin + rireq_r <= 1'b0 ; + rireq_r2 <= 1'b0 ; + erireq_r <= 1'b0 ; + erireq_r2 <= 1'b0 ; + tireq_r <= 1'b0 ; + tireq_r2 <= 1'b0 ; + etireq_r <= 1'b0 ; + etireq_r2 <= 1'b0 ; + unf_r <= 1'b0 ; + unf_r2 <= 1'b0 ; + tu_r <= 1'b0 ; + tu_r2 <= 1'b0 ; + ru_r <= 1'b0 ; + ru_r2 <= 1'b0 ; + end + else + begin + rireq_r <= rireq ; + rireq_r2 <= rireq_r ; + erireq_r <= erireq ; + erireq_r2 <= erireq_r ; + tireq_r <= tireq ; + tireq_r2 <= tireq_r ; + etireq_r <= etireq ; + etireq_r2 <= etireq_r ; + unf_r <= unf ; + unf_r2 <= unf_r ; + tu_r <= tu ; + tu_r2 <= tu_r ; + ru_r <= ru ; + ru_r2 <= ru_r ; + end + end + + always @(posedge clk) + begin : iic_reg_proc + if (rst) + begin + iic <= 1'b0 ; + end + else + begin + if (tireq_r & !tireq_r2) + begin + if (!ic & !iint) + begin + iic <= 1'b0 ; + end + else + begin + iic <= 1'b1 ; + end + end + end + end + + always @(posedge clk) + begin : eti_reg_proc + if (rst) + begin + eti <= 1'b0 ; + end + else + begin + if (etireq_r & !etireq_r2) + begin + eti <= 1'b1 ; + end + else if (!csr5wr_c) + begin + eti <= 1'b0 ; + end + end + end + + assign etiack = etireq_r2 ; + + always @(posedge clk) + begin : eri_reg_proc + if (rst) + begin + eri <= 1'b0 ; + end + else + begin + if (erireq_r & !erireq_r2) + begin + eri <= 1'b1 ; + end + else if (!csr5wr_c) + begin + eri <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : unfi_reg_proc + if (rst) + begin + unfi <= 1'b0 ; + end + else + begin + if (unf_r & !unf_r2) + begin + unfi <= 1'b1 ; + end + else if (!csr5wr_c) + begin + unfi <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : tui_reg_proc + if (rst) + begin + tui <= 1'b0 ; + end + else + begin + if (tu_r & !tu_r2) + begin + tui <= 1'b1 ; + end + else if (!csr5wr_c) + begin + tui <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : rui_reg_proc + if (rst) + begin + rui <= 1'b0 ; + end + else + begin + if (ru_r & !ru_r2) + begin + rui <= 1'b1 ; + end + else if (!csr5wr_c) + begin + rui <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : iint_reg_proc + if (rst) + begin + iint <= 1'b0 ; + end + else + begin + iint <= ((csr5_nis && csr7_nie) || + (csr5_ais && csr7_aie)) && ~csr5wr; + end + end + + assign interrupt = iint ; + + assign riack = rireq_r2 ; + + assign eriack = erireq_r2 ; + + assign tiack = tireq_r2 ; + + always @(focg_r) + begin : foc_proc + reg [10:0] foc_v; + + foc_v[10] = focg_r[10] ; + begin : foc_loop + integer i; + for(i = 9; i >= 0; i = i - 1) + begin + foc_v[i] = foc_v[i + 1] ^ focg_r[i] ; + end + end + foc_c = foc_v; + end + + always @(mfcg_r) + begin : mfc_proc + reg [15:0] mfc_v; + + mfc_v[15] = mfcg_r[10] ; + begin : mfc_loop + integer i; + for(i = 14; i >= 0; i = i - 1) + begin + mfc_v[i] = mfc_v[i + 1] ^ mfcg_r[i] ; + end + end + mfc_c = mfc_v; + end + + always @(posedge clk) + begin : sc_reg_proc + if (rst) + begin + focl <= 1'b0 ; + mfcl <= 1'b0 ; + focg_r <= {11{1'b0}} ; + mfcg_r <= {16{1'b0}} ; + end + else + begin + if (csr8read) + begin + focl <= 1'b1 ; + end + else if (foclack) + begin + focl <= 1'b0 ; + end + + if (csr8read) + begin + mfcl <= 1'b1 ; + end + else if (mfclack) + begin + mfcl <= 1'b0 ; + end + + mfcg_r <= mfcg ; + + focg_r <= focg ; + + end + end + + assign mdo = csr9_mdo ; + + assign mden = csr9_mii ; + + assign mdc = csr9_mdc ; + + assign sclk = csr9_sclk ; + + assign scs = csr9_scs ; + + assign sdo = csr9_sdo ; + + always @(posedge clk) + begin : gpt_reg_proc + if (rst) + begin + gstart <= 1'b0 ; + gstart_r <= 1'b0 ; + gcnt <= {16{1'b0}} ; + gte <= 1'b0 ; + end + else + begin + if (!csrrw & csrreq & (csrdbe_c[3]) & csraddr72 == CSR11_ID) + begin + gstart <= 1'b1 ; + end + else if ((!csr11_con & gte) | + csr11_tim == 16'b0000000000000000) + begin + gstart <= 1'b0 ; + end + + if(csr11_tim != 16'b0000000000000000) + begin + gstart_r <= gstart ; + end + else + begin + gstart_r <= 1'b0 ; + end + + if (gstart & !gstart_r) + begin + gcnt <= csr11_tim ; + end + else if (gcnt == 16'b0000000000000000) + begin + if (csr11_con) + begin + gcnt <= csr11_tim ; + end + end + else if (tcs2048) + begin + gcnt <= gcnt - 1 ; + end + + if (csr5wr_c) + begin + gte <= 1'b0 ; + end + else if (gstart_r & gcnt == 16'b0000000000000000 & + csr11_tim != 16'b0000000000000000) + begin + gte <= 1'b1 ; + end + + end + end + + always @(posedge clk) + begin : rstsofto_reg_proc + rstsofto <= csr0_swr; + end + + assign czero_max = {CSRWIDTH_MAX{1'b0}} ; + + assign csrdatai_max = {czero_max[CSRWIDTH_MAX+1:CSRWIDTH], + csrdatai}; + + assign csrbe_max = {czero_max[CSRWIDTH_MAX/8+1:CSRWIDTH/8], + csrbe}; + +endmodule + + + +module DMA_V ( + clk, + rst, + dma_priority, + ble, + dbo, + rdes, + rbuf, + rstat, + tdes, + tbuf, + tstat, + dataack, + datai, + datareq, + datareqc, + datarw, + dataeob, + dataeobc, + datao, + dataaddr, + idataaddr, + req1, + write1, + tcnt1, + addr1, + datai1, + ack1, + eob1, + datao1, + req2, + write2, + tcnt2, + addr2, + datai2, + ack2, + eob2, + datao2); + + parameter DATAWIDTH = 32; + parameter DATADEPTH = 32; + + `include "utility.v" + + input clk; + input rst; + + input [1:0] dma_priority; + input ble; + input dbo; + input rdes; + input rbuf; + input rstat; + input tdes; + input tbuf; + input tstat; + + + input dataack; + input [DATAWIDTH - 1:0] datai; + output datareq; + wire datareq; + output datareqc; + wire datareqc; + output datarw; + reg datarw; + output dataeob; + wire dataeob; + output dataeobc; + wire dataeobc; + output [DATAWIDTH - 1:0] datao; + wire [DATAWIDTH - 1:0] datao; + output [DATADEPTH - 1:0] dataaddr; + wire [DATADEPTH - 1:0] dataaddr; + output [DATADEPTH - 1:0] idataaddr; + wire [DATADEPTH - 1:0] idataaddr; + + input req1; + input write1; + input [FIFODEPTH_MAX - 1:0] tcnt1; + input [DATADEPTH - 1:0] addr1; + input [DATAWIDTH - 1:0] datai1; + output ack1; + wire ack1; + output eob1; + wire eob1; + output [DATAWIDTH - 1:0] datao1; + wire [DATAWIDTH - 1:0] datao1; + + input req2; + input write2; + input [FIFODEPTH_MAX - 1:0] tcnt2; + input [DATADEPTH - 1:0] addr2; + input [DATAWIDTH - 1:0] datai2; + output ack2; + wire ack2; + output eob2; + wire eob2; + output [DATAWIDTH - 1:0] datao2; + wire [DATAWIDTH - 1:0] datao2; + + + reg [1:0] dsm_c; + reg [1:0] dsm; + reg hist1; + reg hist2; + wire [1:0] dmareq; + reg [FIFODEPTH_MAX - 1:0] msmbcnt; + reg idatareq; + reg idatareqc; + reg eob; + reg eobc; + reg [DATADEPTH - 1:0] addr_c; + reg [DATADEPTH - 1:0] addr; + reg blesel_c; + reg [DATAWIDTH - 1:0] dataible_c; + reg [DATAWIDTH - 1:0] dataoble_c; + wire [DATAWIDTH_MAX + 1:0] datai_max; + reg req_c; + reg write_c; + reg [FIFODEPTH_MAX - 1:0] tcnt_c; + reg [DATADEPTH - 1:0] saddr_c; + reg [DATAWIDTH_MAX - 1:0] datai_c; + wire [DATAWIDTH_MAX + 1:0] datai_max_c; + wire [FIFODEPTH_MAX - 1:0] fzero; + wire [DATAWIDTH_MAX + 1:0] dzero; + + assign dmareq = {req2, req1} ; + + always @(dsm or + dmareq or + hist1 or + hist2 or + dma_priority or + eob or + dataack) + begin : dsm_proc + case (dsm) + DSM_IDLE : + begin + case (dmareq) + 2'b11 : + begin + case (dma_priority) + 2'b01 : + begin + if (!hist1 & !hist2) + begin + dsm_c <= DSM_CH2 ; + end + else + begin + dsm_c <= DSM_CH1 ; + end + end + 2'b10 : + begin + if (hist1 & hist2) + begin + dsm_c <= DSM_CH1 ; + end + else + begin + dsm_c <= DSM_CH2 ; + end + end + default : + begin + if (hist1) + begin + dsm_c <= DSM_CH1 ; + end + else + begin + dsm_c <= DSM_CH2 ; + end + end + endcase + end + 2'b01 : + begin + dsm_c <= DSM_CH1 ; + end + 2'b10 : + begin + dsm_c <= DSM_CH2 ; + end + default : + begin + dsm_c <= DSM_IDLE ; + end + endcase + end + DSM_CH1 : + begin + if (eob & dataack) + begin + dsm_c <= DSM_IDLE ; + end + else + begin + dsm_c <= DSM_CH1 ; + end + end + default : + begin + if (eob & dataack) + begin + dsm_c <= DSM_IDLE ; + end + else + begin + dsm_c <= DSM_CH2 ; + end + end + endcase + end + + always @(posedge clk) + begin : dsm_reg_proc + if (rst) + begin + dsm <= DSM_IDLE ; + end + else + begin + dsm <= dsm_c ; + end + end + + always @(posedge clk) + begin : hist_reg_proc + if (rst) + begin + hist1 <= 1'b1 ; + hist2 <= 1'b1 ; + end + else + begin + if (eob) + begin + case (dsm) + DSM_CH1 : + begin + hist1 <= 1'b1 ; + end + DSM_CH2 : + begin + hist1 <= 1'b0 ; + end + default : + begin + hist1 <= hist1 ; + end + endcase + end + hist2 <= hist1 ; + end + end + + always @(dbo or + ble or + dsm_c or + dsm or + tdes or + tbuf or + tstat or + rdes or + rbuf or + rstat) + begin : blesel_proc + if (dsm_c == DSM_CH1 | dsm == DSM_CH1) + begin + if ((tbuf & ble) | + ((tdes | tstat) & dbo)) + begin + blesel_c <= 1'b1 ; + end + else + begin + blesel_c <= 1'b0 ; + end + end + else + begin + if ((rbuf & ble) | + ((rdes | rstat) & dbo)) + begin + blesel_c <= 1'b1 ; + end + else + begin + blesel_c <= 1'b0 ; + end + end + end + + always @(dsm_c or + dsm or + req1 or + write1 or + tcnt1 or + addr1 or + datai1 or + req2 or + write2 or + tcnt2 or + addr2 or + datai2) + begin : chmux_proc + if (dsm_c == DSM_CH1 | dsm == DSM_CH1) + begin + req_c <= req1 ; + write_c <= write1 ; + tcnt_c <= tcnt1 ; + saddr_c <= addr1 ; + datai_c <= {{((DATAWIDTH_MAX+1)-DATAWIDTH){1'b0}},datai1} ; + end + else + begin + req_c <= req2 ; + write_c <= write2 ; + tcnt_c <= tcnt2 ; + saddr_c <= addr2 ; + datai_c <= {{((DATAWIDTH_MAX+1)-DATAWIDTH){1'b0}},datai2} ; + end + end + + assign datai_max_c = {dzero[DATAWIDTH_MAX+1:DATAWIDTH],datai_c}; + + always @(datai_max_c or blesel_c) + begin : dataoble_proc + case (DATAWIDTH) + 32 : + begin + if (blesel_c) + begin + dataoble_c <= {datai_max_c[ 7: 0], + datai_max_c[15: 8], + datai_max_c[23:16], + datai_max_c[31:24]}; + end + else + begin + dataoble_c <= datai_max_c[31:0]; + end + end + 16 : + begin + if (blesel_c) + begin + dataoble_c <= {datai_max_c[7 :0], + datai_max_c[15:8]}; + end + else + begin + dataoble_c <= datai_max_c[15:0]; + end + end + default : + begin + dataoble_c <= datai_max_c[7:0]; + end + endcase + end + + assign datai_max = {dzero[DATAWIDTH_MAX+1:DATAWIDTH],datai}; + + always @(datai_max or blesel_c) + begin : dataible_proc + case (DATAWIDTH) + 32 : + begin + if (blesel_c) + begin + dataible_c <= {datai_max[ 7: 0], + datai_max[15: 8], + datai_max[23:16], + datai_max[31:24]}; + end + else + begin + dataible_c <= datai_max[31:0]; + end + end + 16 : + begin + if (blesel_c) + begin + dataible_c <= {datai_max[7 :0], + datai_max[15:8]}; + end + else + begin + dataible_c <= datai_max[15:0]; + end + end + default : + begin + dataible_c <= datai_max[7:0]; + end + endcase + end + + always @(posedge clk) + begin : msmbcnt_reg_proc + if (rst) + begin + msmbcnt <= {FIFODEPTH_MAX{1'b0}} ; + end + else + begin + if (!idatareq) + begin + msmbcnt <= tcnt_c ; + end + else if (dataack & idatareq) + begin + msmbcnt <= msmbcnt - 1 ; + end + end + end + + always @(posedge clk) + begin : datarw_reg_proc + if (rst) + begin + datarw <= 1'b1 ; + end + else + begin + if (req_c) + begin + datarw <= ~write_c ; + end + end + end + + always @(posedge clk) + begin : idatareq_reg_proc + if (rst) + begin + idatareq <= 1'b0 ; + end + else + begin + if (eob & dataack & idatareq) + begin + idatareq <= 1'b0 ; + end + else if (req1 | req2) + begin + idatareq <= 1'b1 ; + end + end + end + + assign datareq = idatareq ; + + always @(idatareq or + dataack or + req1 or + req2 or + eob + ) + begin : idatareqc_comb_proc + if (eob & dataack & idatareq) + begin + idatareqc <= 1'b0 ; + end + else if (req1 | req2) + begin + idatareqc <= 1'b1 ; + end + else + begin + idatareqc <= idatareq ; + end + end + + assign datareqc = idatareqc ; + + assign dataeob = eob ; + + assign dataeobc = eobc ; + + assign datao1 = dataible_c ; + + assign datao2 = dataible_c ; + + assign datao = dataoble_c ; + + always @(dataack or + idatareq or + addr or + saddr_c or + req_c or + dsm) + begin : addr_proc + if (dataack & idatareq) + begin + case (DATAWIDTH) + 8 : + begin + addr_c <= addr + 1 ; + end + 16 : + begin + addr_c <= {addr[DATADEPTH - 1:1] + 1, 1'b0} ; + end + default : + begin + addr_c <= {addr[DATADEPTH - 1:2] + 1, 2'b00} ; + end + endcase + end + else if (req_c & dsm == DSM_IDLE) + begin + addr_c <= saddr_c ; + end + else + begin + addr_c <= addr ; + end + end + + always @(posedge clk) + begin : addr_reg_proc + if (rst) + begin + addr <= {DATADEPTH{1'b1}} ; + end + else + begin + addr <= addr_c ; + end + end + + assign dataaddr = addr ; + + assign idataaddr = addr ; + + assign ack1 = (dataack & dsm == DSM_CH1) ? 1'b1 : 1'b0 ; + + assign ack2 = (dataack & dsm == DSM_CH2) ? 1'b1 : 1'b0 ; + + always @(posedge clk) + begin : eob_reg_proc + if (rst) + begin + eob <= 1'b0 ; + end + else if (req_c | idatareq) + begin + if ((idatareq & + (msmbcnt == fzero | + msmbcnt == {fzero[FIFODEPTH_MAX-1:1], 1'b1} | + (msmbcnt == {fzero[FIFODEPTH_MAX-1:2], 2'b10} & dataack))) + | + (!idatareq & + (tcnt_c == fzero | + tcnt_c == {fzero[FIFODEPTH_MAX-1:1], 1'b1}))) + begin + eob <= 1'b1 ; + end + else + begin + eob <= 1'b0 ; + end + end + end + + always @(req_c or + idatareq or + msmbcnt or + dataack or + tcnt_c or + fzero or + eob) + begin : eob_comb_proc + if (req_c | idatareq) + begin + if ((idatareq & + (msmbcnt == fzero | + msmbcnt == {fzero[FIFODEPTH_MAX-1:1], 1'b1} | + (msmbcnt == {fzero[FIFODEPTH_MAX-1:2], 2'b10} & dataack))) + | + (!idatareq & + (tcnt_c == fzero | + tcnt_c == {fzero[FIFODEPTH_MAX-1:1], 1'b1}))) + begin + eobc <= 1'b1 ; + end + else + begin + eobc <= 1'b0 ; + end + end + else + begin + eobc <= eob; + end + end + + assign eob1 = eob ; + + assign eob2 = eob ; + + assign fzero = {FIFODEPTH_MAX{1'b0}} ; + + assign dzero = {(DATAWIDTH_MAX+1){1'b0}} ; + +endmodule + + +module MAC_V ( + clkdma, + clkcsr, + rstcsr, + clkt, + clkr, + rsttco, + rstrco, + interrupt, + tps, + rps, + csrreq, + csrrw, + csrbe, + csrdatai, + csraddr, + csrack, + csrdatao, + dataack, + datareq, + datareqc, + datarw, + dataeob, + dataeobc, + datai, + dataaddr, + datao, + trdata, + twe, + twaddr, + traddr, + twdata, + rrdata, + rwe, + rwaddr, + rraddr, + rwdata, + frdata, + fwe, + fwaddr, + fraddr, + fwdata, + match, + matchval, + matchen, + matchdata, + sdi, + sclk, + scs, + sdo, + rxer, + rxdv, + col, + crs, + rxd, + txen, + txer, + txd, + mdc, + mdi, + mdo, + mden + ); + + parameter CSRWIDTH = 32; + parameter DATAWIDTH = 32; + parameter DATADEPTH = 32; + parameter TFIFODEPTH = 9; + parameter RFIFODEPTH = 9; + parameter TCDEPTH = 1; + parameter RCDEPTH = 2; + + `include "utility.v" + + input clkdma; + input clkcsr; + input rstcsr; + input clkt; + input clkr; + output rsttco; + wire rsttco; + output rstrco; + wire rstrco; + + output interrupt; + wire interrupt; + + output tps; + wire tps; + output rps; + wire rps; + + input csrreq; + input csrrw; + input [CSRWIDTH / 8 - 1:0] csrbe; + input [CSRWIDTH - 1:0] csrdatai; + input [CSRDEPTH - 1:0] csraddr; + output csrack; + wire csrack; + output [CSRWIDTH - 1:0] csrdatao; + wire [CSRWIDTH - 1:0] csrdatao; + + input dataack; + output datareq; + wire datareq; + output datareqc; + wire datareqc; + output datarw; + wire datarw; + output dataeob; + wire dataeob; + output dataeobc; + wire dataeobc; + input [DATAWIDTH - 1:0] datai; + output [DATADEPTH - 1:0] dataaddr; + wire [DATADEPTH - 1:0] dataaddr; + output [DATAWIDTH - 1:0] datao; + wire [DATAWIDTH - 1:0] datao; + + input [DATAWIDTH - 1:0] trdata; + output twe; + wire twe; + output [TFIFODEPTH - 1:0] twaddr; + wire [TFIFODEPTH - 1:0] twaddr; + output [TFIFODEPTH - 1:0] traddr; + wire [TFIFODEPTH - 1:0] traddr; + output [DATAWIDTH - 1:0] twdata; + wire [DATAWIDTH - 1:0] twdata; + + input [DATAWIDTH - 1:0] rrdata; + output rwe; + wire rwe; + output [RFIFODEPTH - 1:0] rwaddr; + wire [RFIFODEPTH - 1:0] rwaddr; + output [RFIFODEPTH - 1:0] rraddr; + wire [RFIFODEPTH - 1:0] rraddr; + output [DATAWIDTH - 1:0] rwdata; + wire [DATAWIDTH - 1:0] rwdata; + + input [15:0] frdata; + output fwe; + wire fwe; + output [ADDRDEPTH - 1:0] fwaddr; + wire [ADDRDEPTH - 1:0] fwaddr; + output [ADDRDEPTH - 1:0] fraddr; + wire [ADDRDEPTH - 1:0] fraddr; + output [15:0] fwdata; + wire [15:0] fwdata; + + input match; + input matchval; + output matchen; + wire matchen; + output [47:0] matchdata; + wire [47:0] matchdata; + + input sdi; + output sclk; + wire sclk; + output scs; + wire scs; + output sdo; + wire sdo; + + input rxer; + input rxdv; + input col; + input crs; + input [MIIWIDTH - 1:0] rxd; + output txen; + wire txen; + output txer; + wire txer; + output [MIIWIDTH - 1:0] txd; + wire [MIIWIDTH - 1:0] txd; + output mdc; + wire mdc; + input mdi; + output mdo; + wire mdo; + output mden; + wire mden; + + + wire rstsoft; + wire rsttc; + wire rstrc; + wire rstdmao; + wire rstcsro; + + wire [5:0] pbl; + wire ac; + wire dpd; + wire [4:0] dsl; + wire tpoll; + wire [DATADEPTH - 1:0] tdbad; + wire sf; + wire [2:0] tm; + wire fd; + wire ble; + wire dbo; + wire ra; + wire pm; + wire pr; + wire pb; + wire rif; + wire ho; + wire hp; + wire rpoll; + wire rpollack; + wire [DATADEPTH - 1:0] rdbad; + + wire tdes; + wire tbuf; + wire tset; + wire tstat; + wire tu; + wire [1:0] ft; + wire rdes; + wire rstat; + wire ru; + wire rcomp; + wire rcompack; + wire tcomp; + wire tcompack; + + wire [1:0] dma_priority; + wire treq; + wire twrite; + wire [FIFODEPTH_MAX - 1:0] tcnt; + wire [DATADEPTH - 1:0] taddr; + wire [DATAWIDTH - 1:0] tdatai; + wire tack; + wire teob; + wire [DATAWIDTH - 1:0] tdatao; + wire rreq; + wire rwrite; + wire [FIFODEPTH_MAX - 1:0] rcnt; + wire [DATADEPTH - 1:0] raddr; + wire [DATAWIDTH - 1:0] rdatai; + wire rack; + wire reob; + wire [DATAWIDTH - 1:0] rdatao; + wire [DATADEPTH - 1:0] idataaddr; + + wire tfifonf; + wire tfifocnf; + wire tfifoval; + wire tfifowe; + wire tfifoeof; + wire [DATAWIDTH / 8 - 1:0] tfifobe; + wire [DATAWIDTH - 1:0] tfifodata; + wire [TFIFODEPTH - 1:0] tfifolev; + wire [TFIFODEPTH - 1:0] tradg; + + wire etiack; + wire etireq; + wire tcsne; + wire tcachere; + wire ic; + wire ici; + wire aci; + wire dpdi; + wire lo_o; + wire nc_o; + wire lc_o; + wire ec_o; + wire de_o; + wire ur_o; + wire [3:0] cc_o; + wire lo_i; + wire nc_i; + wire lc_i; + wire ec_i; + wire de_i; + wire ur_i; + wire [3:0] cc_i; + + wire tpollack; + wire tdbadc; + wire [DATADEPTH - 1:0] statado; + wire [DATADEPTH - 1:0] statadi; + + wire sofreq; + wire eofreq; + wire [DATAWIDTH / 8 - 1:0] be; + wire [TFIFODEPTH - 1:0] eofad; + wire [TFIFODEPTH - 1:0] twadg; + wire tireq; + wire tiack; + wire winp; + + wire coll; + wire carrier; + wire bkoff; + wire tpend; + wire tprog; + wire preamble; + + wire tcsreq; + wire tcsack; + + wire stopt; + wire stoptc; + wire stoptfifo; + wire stoptlsm; + + wire [RFIFODEPTH - 1:0] rradg; + wire [RFIFODEPTH - 1:0] rwadg; + wire rfifore; + wire [DATAWIDTH - 1:0] rfifodata; + wire rcachere; + wire rcachene; + wire rcachenf; + wire [DATAWIDTH - 1:0] irwdata; + wire irwe; + + wire riack; + wire ren; + wire rireq; + wire ff; + wire rf; + wire mf; + wire db; + wire re; + wire ce; + wire tl; + wire ftp; + wire ov; + wire cs; + wire [13:0] length; + wire rprog; + wire rcpoll; + + + wire ff_o; + wire rf_o; + wire mf_o; + wire tl_o; + wire re_o; + wire db_o; + wire ce_o; + wire ov_o; + wire cs_o; + wire [13:0] fl_o; + + wire rdbadc; + wire erireq; + wire eriack; + wire rbuf; + + wire foclack; + wire mfclack; + wire oco; + wire mfo; + wire [10:0] focg; + wire [15:0] mfcg; + wire focl; + wire mfcl; + + wire stopr; + wire stoprc; + wire stoprfifo; + wire stoprlsm; + + wire rcsack; + wire rcsreq; + + DMA_V #(DATAWIDTH, DATADEPTH) U_DMA( + .clk (clkdma), + .rst (rstdmao), + .dma_priority (dma_priority), + .ble (ble), + .dbo (dbo), + .rdes (rdes), + .rbuf (rbuf), + .rstat (rstat), + .tdes (tdes), + .tbuf (tbuf), + .tstat (tstat), + .dataack (dataack), + .datai (datai), + .datareq (datareq), + .datareqc (datareqc), + .datarw (datarw), + .dataeob (dataeob), + .dataeobc (dataeobc), + .datao (datao), + .dataaddr (dataaddr), + .idataaddr (idataaddr), + .req1 (treq), + .write1 (twrite), + .tcnt1 (tcnt), + .addr1 (taddr), + .datai1 (tdatao), + .ack1 (tack), + .eob1 (teob), + .datao1 (tdatai), + .req2 (rreq), + .write2 (rwrite), + .tcnt2 (rcnt), + .addr2 (raddr), + .datai2 (rdatao), + .ack2 (rack), + .eob2 (reob), + .datao2 (rdatai) + ); + + TLSM_V #(DATAWIDTH, DATADEPTH, TFIFODEPTH) U_TLSM( + .clk (clkdma), + .rst (rstdmao), + .fifonf (tfifonf), + .fifocnf (tfifocnf), + .fifoval (tfifoval), + .fifowe (tfifowe), + .fifoeof (tfifoeof), + .fifobe (tfifobe), + .fifodata (tfifodata), + .fifolev (tfifolev), + .ic (ici), + .ac (aci), + .dpd (dpdi), + .statado (statadi), + .csne (tcsne), + .lo (lo_i), + .nc (nc_i), + .lc (lc_i), + .ec (ec_i), + .de (de_i), + .ur (ur_i), + .cc (cc_i), + .cachere (tcachere), + .statadi (statado), + .dmaack (tack), + .dmaeob (teob), + .dmadatai (tdatai), + .dmaaddr (idataaddr), + .dmareq (treq), + .dmawr (twrite), + .dmacnt (tcnt), + .dmaaddro (taddr), + .dmadatao (tdatao), + .fwe (fwe), + .fdata (fwdata), + .faddr (fwaddr), + .dsl (dsl), + .pbl (pbl), + .poll (tpoll), + .dbadc (tdbadc), + .dbad (tdbad), + .pollack (tpollack), + .tcompack (tcompack), + .tcomp (tcomp), + .des (tdes), + .fbuf (tbuf), + .stat (tstat), + .setp (tset), + .tu (tu), + .ft (ft), + .stopi (stopt), + .stopo (stoptlsm) + ); + + TFIFO_V #(DATAWIDTH, DATADEPTH, TFIFODEPTH, TCDEPTH) U_TFIFO( + .clk (clkdma), + .rst (rstdmao), + .ramwe (twe), + .ramaddr (twaddr), + .ramdata (twdata), + .fifowe (tfifowe), + .fifoeof (tfifoeof), + .fifobe (tfifobe), + .fifodata (tfifodata), + .fifonf (tfifonf), + .fifocnf (tfifocnf), + .fifoval (tfifoval), + .flev (tfifolev), + .ici (ici), + .dpdi (dpdi), + .aci (aci), + .statadi (statadi), + .cachere (tcachere), + .deo (de_i), + .lco (lc_i), + .loo (lo_i), + .nco (nc_i), + .eco (ec_i), + .ico (ic), + .uro (ur_i), + .csne (tcsne), + .cco (cc_i), + .statado (statado), + .sofreq (sofreq), + .eofreq (eofreq), + .dpdo (dpd), + .aco (ac), + .beo (be), + .eofad (eofad), + .wadg (twadg), + .tireq (tireq), + .winp (winp), + .dei (de_o), + .lci (lc_o), + .loi (lo_o), + .nci (nc_o), + .eci (ec_o), + .uri (ur_o), + .cci (cc_o), + .radg (tradg), + .tiack (tiack), + .sf (sf), + .fdp (fd), + .tm (tm), + .pbl (pbl), + .etiack (etiack), + .etireq (etireq), + .stopi (stopt), + .stopo (stoptfifo) + ); + + TC_V #(TFIFODEPTH, DATAWIDTH) U_TC( + .clk (clkt), + .rst (rsttc), + .txen (txen), + .txer (txer), + .txd (txd), + .ramdata (trdata), + .ramaddr (traddr), + .wadg (twadg), + .radg (tradg), + .dpd (dpd), + .ac (ac), + .sofreq (sofreq), + .eofreq (eofreq), + .tiack (tiack), + .lastbe (be), + .eofadg (eofad), + .tireq (tireq), + .ur (ur_o), + .de (de_o), + .coll (coll), + .carrier (carrier), + .bkoff (bkoff), + .tpend (tpend), + .tprog (tprog), + .preamble (preamble), + .stopi (stopt), + .stopo (stoptc), + .tcsack (tcsack), + .tcsreq (tcsreq) + ); + + BD_V U_BD( + .clk (clkt), + .rst (rsttc), + .col (col), + .crs (crs), + .fdp (fd), + .tprog (tprog), + .preamble (preamble), + .tpend (tpend), + .winp (winp), + .tiack (tiack), + .coll (coll), + .carrier (carrier), + .bkoff (bkoff), + .lc (lc_o), + .lo (lo_o), + .nc (nc_o), + .ec (ec_o), + .cc (cc_o) + ); + + + + RC_V #(RFIFODEPTH, DATAWIDTH) U_RC( + .clk (clkr), + .rst (rstrc), + .col (col), + .rxdv (rxdv), + .rxer (rxer), + .rxd (rxd), + .ramwe (irwe), + .ramaddr (rwaddr), + .ramdata (irwdata), + .fdata (frdata), + .faddr (fraddr), + .cachenf (rcachenf), + .radg (rradg), + .wadg (rwadg), + .rprog (rprog), + .rcpoll (rcpoll), + .riack (riack), + .ren (ren), + .ra (ra), + .pm (pm), + .pr (pr), + .pb (pb), + .rif (rif), + .ho (ho), + .hp (hp), + .rireq (rireq), + .ff (ff), + .rf (rf), + .mf (mf), + .db (db), + .re (re), + .ce (ce), + .tl (tl), + .ftp (ftp), + .ov (ov), + .cs (cs), + .length (length), + .match (match), + .matchval (matchval), + .matchen (matchen), + .matchdata (matchdata), + .focl (focl), + .foclack (foclack), + .oco (oco), + .focg (focg), + .mfcl (mfcl), + .mfclack (mfclack), + .mfo (mfo), + .mfcg (mfcg), + .stopi (stopr), + .stopo (stoprc), + .rcsack (rcsack), + .rcsreq (rcsreq) + ); + + RFIFO_V #(DATAWIDTH, DATADEPTH, RFIFODEPTH, RCDEPTH) U_RFIFO( + .clk (clkdma), + .rst (rstdmao), + .ramdata (rrdata), + .ramaddr (rraddr), + .fifore (rfifore), + .ffo (ff_o), + .rfo (rf_o), + .mfo (mf_o), + .tlo (tl_o), + .reo (re_o), + .dbo (db_o), + .ceo (ce_o), + .ovo (ov_o), + .cso (cs_o), + .flo (fl_o), + .fifodata (rfifodata), + .cachere (rcachere), + .cachene (rcachene), + .cachenf (rcachenf), + .radg (rradg), + .rireq (rireq), + .ffi (ff), + .rfi (rf), + .mfi (mf), + .tli (tl), + .rei (re), + .dbi (db), + .cei (ce), + .ovi (ov), + .csi (cs), + .fli (length), + .wadg (rwadg), + .riack (riack) + ); + + RLSM_V #(DATAWIDTH, DATADEPTH, RFIFODEPTH) U_RLSM( + .clk (clkdma), + .rst (rstdmao), + .fifodata (rfifodata), + .fifore (rfifore), + .cachere (rcachere), + .dmaack (rack), + .dmaeob (reob), + .dmadatai (rdatai), + .dmaaddr (idataaddr), + .dmareq (rreq), + .dmawr (rwrite), + .dmacnt (rcnt), + .dmaaddro (raddr), + .dmadatao (rdatao), + .rprog (rprog), + .rcpoll (rcpoll), + .fifocne (rcachene), + .ff (ff_o), + .rf (rf_o), + .mf (mf_o), + .db (db_o), + .re (re_o), + .ce (ce_o), + .tl (tl_o), + .ftp (ftp), + .ov (ov_o), + .cs (cs_o), + .length (fl_o), + .pbl (pbl), + .dsl (dsl), + .rpoll (rpoll), + .rdbadc (rdbadc), + .rdbad (rdbad), + .rpollack (rpollack), + .bufack (eriack), + .rcompack (rcompack), + .des (rdes), + .fbuf (rbuf), + .stat (rstat), + .ru (ru), + .rcomp (rcomp), + .bufcomp (erireq), + .stopi (stopr), + .stopo (stoprlsm) + ); + + CSR_V #(CSRWIDTH, DATAWIDTH, DATADEPTH, RFIFODEPTH, RCDEPTH) U_CSR( + .clk (clkcsr), + .rst (rstcsro), + .interrupt (interrupt), + .rstsofto (rstsoft), + .csrreq (csrreq), + .csrrw (csrrw), + .csrbe (csrbe), + .csraddr (csraddr), + .csrdatai (csrdatai), + .csrack (csrack), + .csrdatao (csrdatao), + .tprog (tprog), + .tireq (tcomp), + .unf (ur_i), + .tiack (tcompack), + .tcsreq (tcsreq), + .tcsack (tcsack), + .fd (fd), + .ic (ic), + .etireq (etireq), + .etiack (etiack), + .tm (tm), + .sf (sf), + .tset (tset), + .tdes (tdes), + .tbuf (tbuf), + .tstat (tstat), + .tu (tu), + .tpollack (tpollack), + .ft (ft), + .tpoll (tpoll), + .tdbadc (tdbadc), + .tdbad (tdbad), + .rireq (rcomp), + .rcsreq (rcsreq), + .rprog (rprog), + .riack (rcompack), + .rcsack (rcsack), + .ren (ren), + .ra (ra), + .pm (pm), + .pr (pr), + .pb (pb), + .rif (rif), + .ho (ho), + .hp (hp), + .foclack (foclack), + .mfclack (mfclack), + .oco (oco), + .mfo (mfo), + .focg (focg), + .mfcg (mfcg), + .focl (focl), + .mfcl (mfcl), + .erireq (erireq), + .ru (ru), + .rpollack (rpollack), + .rdes (rdes), + .rbuf (rbuf), + .rstat (rstat), + .eriack (eriack), + .rpoll (rpoll), + .rdbadc (rdbadc), + .rdbad (rdbad), + .ble (ble), + .dbo (dbo), + .dma_priority (dma_priority), + .pbl (pbl), + .dsl (dsl), + .stoptc (stoptc), + .stoptlsm (stoptlsm), + .stoptfifo (stoptfifo), + .stopt (stopt), + .tps (tps), + .stoprc (stoprc), + .stoprlsm (stoprlsm), + .stopr (stopr), + .rps (rps), + .sdi (sdi), + .sclk (sclk), + .scs (scs), + .sdo (sdo), + .mdi (mdi), + .mdc (mdc), + .mdo (mdo), + .mden (mden) + ); + + RSTC_V U_RSTC ( + .clkdma(clkdma), + .clkcsr(clkcsr), + .clkt(clkt), + .clkr(clkr), + .rstcsr(rstcsr), + .rstsoft(rstsoft), + .rsttc(rsttc), + .rstrc(rstrc), + .rstdmao(rstdmao), + .rstcsro(rstcsro) + ); + + assign rwe = irwe ; + + assign rwdata = irwdata ; + + assign rsttco = rsttc ; + + assign rstrco = rstrc ; + +endmodule + + + + + +module MAC2AHB_V ( + mhclk, + mhresetn, + mhrdata, + mhready, + mhresp, + mhaddr, + mhtrans, + mhwrite, + mhsize, + mhburst, + mhprot, + mhwdata, + mhgrantmac, + mhbusreqmac, + mhlockmac, + shclk, + shresetn, + shselmac, + shaddr, + shwrite, + shreadyi, + shtrans, + shsize, + shburst, + shwdata, + shreadyo, + shresp, + shrdata, + datareq, + datareqc, + datarw, + dataeob, + dataeobc, + dataaddr, + datao, + dataack, + datai, + rstcsr, + csrack, + csrdatao, + csrreq, + csrrw, + csrbe, + csrdatai, + csraddr + ); + + parameter MAHBDATAWIDTH = 32; + parameter MAHBADDRESSWIDTH = 32; + + parameter SAHBDATAWIDTH = 32; + parameter SAHBADDRESSWIDTH = 32; + + parameter MACDATAWIDTH = 32; + parameter MACADDRESSWIDTH = 32; + + parameter CSRDATAWIDTH = 32; + parameter CSRADDRESSWIDTH = 32; + + `include "mac2ahb_package.v" + + input mhclk; + input mhresetn; + input [MAHBDATAWIDTH - 1:0] mhrdata; + input mhready; + input [1:0] mhresp; + output [MAHBADDRESSWIDTH - 1:0] mhaddr; + wire [MAHBADDRESSWIDTH - 1:0] mhaddr; + output [1:0] mhtrans; + wire [1:0] mhtrans; + output mhwrite; + wire mhwrite; + output [2:0] mhsize; + wire [2:0] mhsize; + output [2:0] mhburst; + wire [2:0] mhburst; + output [3:0] mhprot; + wire [3:0] mhprot; + output [MAHBDATAWIDTH - 1:0] mhwdata; + wire [MAHBDATAWIDTH - 1:0] mhwdata; + + input mhgrantmac; + output mhbusreqmac; + wire mhbusreqmac; + output mhlockmac; + wire mhlockmac; + + input shclk; + input shresetn; + input shselmac; + input [SAHBADDRESSWIDTH - 1:0] shaddr; + input shwrite; + input shreadyi; + input [1:0] shtrans; + input [2:0] shsize; + input [2:0] shburst; + input [SAHBDATAWIDTH - 1:0] shwdata; + output shreadyo; + wire shreadyo; + output [1:0] shresp; + wire [1:0] shresp; + output [SAHBDATAWIDTH - 1:0] shrdata; + wire [SAHBDATAWIDTH - 1:0] shrdata; + + + input datareq; + input datareqc; + input datarw; + input dataeob; + input dataeobc; + input [MACADDRESSWIDTH - 1:0] dataaddr; + input [MACDATAWIDTH - 1:0] datao; + output dataack; + wire dataack; + output [MACDATAWIDTH - 1:0] datai; + wire [MACDATAWIDTH - 1:0] datai; + + + output rstcsr; + wire rstcsr; + input csrack; + input [CSRDATAWIDTH - 1:0] csrdatao; + output csrreq; + wire csrreq; + output csrrw; + wire csrrw; + output [CSRDATAWIDTH / 8 - 1:0] csrbe; + wire [CSRDATAWIDTH / 8 - 1:0] csrbe; + output [CSRDATAWIDTH - 1:0] csrdatai; + wire [CSRDATAWIDTH - 1:0] csrdatai; + output [CSRADDRESSWIDTH - 1:0] csraddr; + wire [CSRADDRESSWIDTH - 1:0] csraddr; + + + MACDATA2AHB_V + #(MAHBDATAWIDTH, MAHBADDRESSWIDTH, MACDATAWIDTH, MACADDRESSWIDTH) + U_MACDATA2AHB ( + .mhclk (mhclk), + .mhresetn (mhresetn), + .mhrdata (mhrdata), + .mhready (mhready), + .mhresp (mhresp), + .mhaddr (mhaddr), + .mhtrans (mhtrans), + .mhwrite (mhwrite), + .mhsize (mhsize), + .mhburst (mhburst), + .mhprot (mhprot), + .mhwdata (mhwdata), + .mhgrantmac (mhgrantmac), + .mhbusreqmac (mhbusreqmac), + .mhlockmac (mhlockmac), + .datareq (datareq), + .datareqc (datareqc), + .datarw (datarw), + .dataeob (dataeob), + .dataeobc (dataeobc), + .dataaddr (dataaddr), + .datao (datao), + .dataack (dataack), + .datai (datai) + ); + + MACCSR2AHB_V + #(SAHBDATAWIDTH, SAHBADDRESSWIDTH, CSRDATAWIDTH, CSRADDRESSWIDTH) + U_MACCSR2AHB( + .shclk (shclk), + .shresetn (shresetn), + .shselmac (shselmac), + .shaddr (shaddr), + .shwrite (shwrite), + .shreadyi (shreadyi), + .shtrans (shtrans), + .shsize (shsize), + .shburst (shburst), + .shwdata (shwdata), + .shreadyo (shreadyo), + .shresp (shresp), + .shrdata (shrdata), + .rstcsr (rstcsr), + .csrack (csrack), + .csrdatao (csrdatao), + .csrreq (csrreq), + .csrrw (csrrw), + .csrbe (csrbe), + .csrdatai (csrdatai), + .csraddr (csraddr) + ); + +endmodule + + + + +module MAC_AHB_V ( + clkt, + clkr, + rsttco, + rstrco, + interrupt, + tps, + rps, + mhclk, + mhresetn, + mhrdata, + mhready, + mhresp, + mhaddr, + mhtrans, + mhwrite, + mhsize, + mhburst, + mhprot, + mhwdata, + mhgrantmac, + mhbusreqmac, + mhlockmac, + shclk, + shresetn, + shselmac, + shaddr, + shwrite, + shreadyi, + shtrans, + shsize, + shburst, + shwdata, + shreadyo, + shresp, + shrdata, + trdata, + twe, + twaddr, + traddr, + twdata, + rrdata, + rwe, + rwaddr, + rraddr, + rwdata, + frdata, + fwe, + fwaddr, + fraddr, + fwdata, + match, + matchval, + matchen, + matchdata, + sdi, + sclk, + scs, + sdo, + rxer, + rxdv, + col, + crs, + rxd, + txen, + txer, + txd, + mdc, + mdi, + mdo, + mden + ); + + parameter MAHBDATAWIDTH = 32; + parameter MAHBADDRESSWIDTH = 32; + parameter TFIFODEPTH = 9; + parameter RFIFODEPTH = 9; + parameter TCDEPTH = 1; + parameter RCDEPTH = 2; + + `include "utility.v" + + parameter SAHBDATAWIDTH = 32; + parameter SAHBADDRESSWIDTH = CSRDEPTH; + + input clkt; + input clkr; + output rsttco; + wire rsttco; + output rstrco; + wire rstrco; + + + output interrupt; + wire interrupt; + + output tps; + wire tps; + output rps; + wire rps; + + input mhclk; + input mhresetn; + input [MAHBDATAWIDTH - 1:0] mhrdata; + input mhready; + input [1:0] mhresp; + output [MAHBADDRESSWIDTH - 1:0] mhaddr; + wire [MAHBADDRESSWIDTH - 1:0] mhaddr; + output [1:0] mhtrans; + wire [1:0] mhtrans; + output mhwrite; + wire mhwrite; + output [2:0] mhsize; + wire [2:0] mhsize; + output [2:0] mhburst; + wire [2:0] mhburst; + output [3:0] mhprot; + wire [3:0] mhprot; + output [MAHBDATAWIDTH - 1:0] mhwdata; + wire [MAHBDATAWIDTH - 1:0] mhwdata; + input mhgrantmac; + output mhbusreqmac; + wire mhbusreqmac; + output mhlockmac; + wire mhlockmac; + + input shclk; + input shresetn; + input shselmac; + input [SAHBADDRESSWIDTH - 1:0] shaddr; + input shwrite; + input [1:0] shtrans; + input [2:0] shsize; + input shreadyi; + input [2:0] shburst; + input [SAHBDATAWIDTH - 1:0] shwdata; + output shreadyo; + wire shreadyo; + output [1:0] shresp; + wire [1:0] shresp; + output [SAHBDATAWIDTH - 1:0] shrdata; + wire [SAHBDATAWIDTH - 1:0] shrdata; + + input [MAHBDATAWIDTH - 1:0] trdata; + output twe; + wire twe; + output [TFIFODEPTH - 1:0] twaddr; + wire [TFIFODEPTH - 1:0] twaddr; + output [TFIFODEPTH - 1:0] traddr; + wire [TFIFODEPTH - 1:0] traddr; + output [MAHBDATAWIDTH - 1:0] twdata; + wire [MAHBDATAWIDTH - 1:0] twdata; + + + input [MAHBDATAWIDTH - 1:0] rrdata; + output rwe; + wire rwe; + output [RFIFODEPTH - 1:0] rwaddr; + wire [RFIFODEPTH - 1:0] rwaddr; + output [RFIFODEPTH - 1:0] rraddr; + wire [RFIFODEPTH - 1:0] rraddr; + output [MAHBDATAWIDTH - 1:0] rwdata; + wire [MAHBDATAWIDTH - 1:0] rwdata; + + input [15:0] frdata; + output fwe; + wire fwe; + output [ADDRDEPTH - 1:0] fwaddr; + wire [ADDRDEPTH - 1:0] fwaddr; + output [ADDRDEPTH - 1:0] fraddr; + wire [ADDRDEPTH - 1:0] fraddr; + output [15:0] fwdata; + wire [15:0] fwdata; + + input match; + input matchval; + output matchen; + wire matchen; + output [47:0] matchdata; + wire [47:0] matchdata; + + input sdi; + output sclk; + wire sclk; + output scs; + wire scs; + output sdo; + wire sdo; + + input rxer; + input rxdv; + input col; + input crs; + input [MIIWIDTH - 1:0] rxd; + output txen; + wire txen; + output txer; + wire txer; + output [MIIWIDTH - 1:0] txd; + wire [MIIWIDTH - 1:0] txd; + output mdc; + wire mdc; + input mdi; + output mdo; + wire mdo; + output mden; + wire mden; + + + wire datareq; + wire datareqc; + wire datarw; + wire dataeob; + wire dataeobc; + wire [(MAHBADDRESSWIDTH - 1):0] dataaddr; + wire [(MAHBDATAWIDTH - 1):0] datao; + wire dataack; + wire [(MAHBDATAWIDTH - 1):0] datai; + + wire rstcsr; + wire csrack; + wire [SAHBDATAWIDTH - 1:0] csrdatao; + wire csrreq; + wire csrrw; + wire [SAHBDATAWIDTH / 8 - 1:0] csrbe; + wire [SAHBDATAWIDTH - 1:0] csrdatai; + wire [SAHBADDRESSWIDTH - 1:0] csraddr; + + MAC_V + #(SAHBDATAWIDTH, + MAHBDATAWIDTH, + MAHBADDRESSWIDTH, + TFIFODEPTH, + RFIFODEPTH, + TCDEPTH, + RCDEPTH) + U_MAC ( + .clkdma (mhclk), + .clkcsr (shclk), + .clkt (clkt), + .clkr (clkr), + .rstcsr (rstcsr), + .rsttco (rsttco), + .rstrco (rstrco), + .interrupt (interrupt), + .rps (rps), + .tps (tps), + .csrreq (csrreq), + .csrrw (csrrw), + .csrbe (csrbe), + .csrdatai (csrdatai), + .csrack (csrack), + .csraddr (csraddr), + .csrdatao (csrdatao), + .dataack (dataack), + .datareq (datareq), + .datareqc (datareqc), + .datarw (datarw), + .dataeob (dataeob), + .dataeobc (dataeobc), + .datai (datai), + .dataaddr (dataaddr), + .datao (datao), + .trdata (trdata), + .twe (twe), + .twaddr (twaddr), + .traddr (traddr), + .twdata (twdata), + .rrdata (rrdata), + .rwe (rwe), + .rwaddr (rwaddr), + .rraddr (rraddr), + .rwdata (rwdata), + .frdata (frdata), + .fwe (fwe), + .fraddr (fraddr), + .fwaddr (fwaddr), + .fwdata (fwdata), + .match (match), + .matchval (matchval), + .matchen (matchen), + .matchdata (matchdata), + .sdi (sdi), + .sclk (sclk), + .scs (scs), + .sdo (sdo), + .rxer (rxer), + .rxdv (rxdv), + .col (col), + .crs (crs), + .rxd (rxd), + .txen (txen), + .txer (txer), + .txd (txd), + .mdi (mdi), + .mdo (mdo), + .mden (mden), + .mdc (mdc) + ); + + MAC2AHB_V + #(MAHBDATAWIDTH, + MAHBADDRESSWIDTH, + SAHBDATAWIDTH, + SAHBADDRESSWIDTH, + MAHBDATAWIDTH, + MAHBADDRESSWIDTH, + SAHBDATAWIDTH, + SAHBADDRESSWIDTH) + U_MAC2AHB ( + .mhclk (mhclk), + .mhresetn (mhresetn), + .mhrdata (mhrdata), + .mhready (mhready), + .mhresp (mhresp), + .mhaddr (mhaddr), + .mhtrans (mhtrans), + .mhwrite (mhwrite), + .mhsize (mhsize), + .mhburst (mhburst), + .mhprot (mhprot), + .mhwdata (mhwdata), + .mhgrantmac (mhgrantmac), + .mhbusreqmac (mhbusreqmac), + .mhlockmac (mhlockmac), + .shclk (shclk), + .shresetn (shresetn), + .shselmac (shselmac), + .shaddr (shaddr), + .shwrite (shwrite), + .shreadyi (shreadyi), + .shtrans (shtrans), + .shsize (shsize), + .shburst (shburst), + .shwdata (shwdata), + .shreadyo (shreadyo), + .shresp (shresp), + .shrdata (shrdata), + .datareq (datareq), + .datareqc (datareqc), + .datarw (datarw), + .dataeob (dataeob), + .dataeobc (dataeobc), + .dataaddr (dataaddr), + .datao (datao), + .dataack (dataack), + .datai (datai), + .rstcsr (rstcsr), + .csrack (csrack), + .csrdatao (csrdatao), + .csrreq (csrreq), + .csrrw (csrrw), + .csrbe (csrbe), + .csrdatai (csrdatai), + .csraddr (csraddr) + ); + + +endmodule + + + + +module MACCSR2AHB_V ( + shclk, + shresetn, + shselmac, + shaddr, + shwrite, + shreadyi, + shtrans, + shsize, + shburst, + shwdata, + shreadyo, + shresp, + shrdata, + rstcsr, + csrack, + csrdatao, + csrreq, + csrrw, + csrbe, + csrdatai, + csraddr + ); + + parameter SAHBDATAWIDTH = 32; + parameter SAHBADDRESSWIDTH = 8; + parameter CSRDATAWIDTH = 32; + parameter CSRADDRESSWIDTH = 8; + + `include "mac2ahb_package.v" + + + input shclk; + input shresetn; + input shselmac; + input [SAHBADDRESSWIDTH - 1:0] shaddr; + input shwrite; + input shreadyi; + input [1:0] shtrans; + input [2:0] shsize; + input [2:0] shburst; + input [SAHBDATAWIDTH - 1:0] shwdata; + output shreadyo; + wire shreadyo; + output [1:0] shresp; + wire [1:0] shresp; + output [SAHBDATAWIDTH - 1:0] shrdata; + wire [SAHBDATAWIDTH - 1:0] shrdata; + + + output rstcsr; + wire rstcsr; + input csrack; + input [CSRDATAWIDTH - 1:0] csrdatao; + output csrreq; + wire csrreq; + output csrrw; + wire csrrw; + output [CSRDATAWIDTH / 8 - 1:0] csrbe; + wire [CSRDATAWIDTH / 8 - 1:0] csrbe; + output [CSRDATAWIDTH - 1:0] csrdatai; + wire [CSRDATAWIDTH - 1:0] csrdatai; + output [CSRADDRESSWIDTH - 1:0] csraddr; + wire [CSRADDRESSWIDTH - 1:0] csraddr; + + + reg [CSRADDRESSWIDTH - 1:0] i_addrreg_r; + + reg i_transfind_r; + + reg i_transfdir_r; + + reg [CSRDATAWIDTH / 8 - 1:0] i_calcbe; + + reg [CSRDATAWIDTH / 8 - 1:0] i_calcbe_r; + + always @(posedge shclk) + begin : i_transfind_proc + if (!shresetn) + begin + i_transfind_r <= 1'b0 ; + end + else + begin + i_transfind_r <= 1'b0 ; + if (shtrans == HTRANS_NONSEQ & shreadyi & + shburst == HBURST_SINGLE & shselmac) + begin + i_transfind_r <= 1'b1 ; + end + end + end + + always @(posedge shclk) + begin : i_transfdir_proc + if (!shresetn) + begin + i_transfdir_r <= 1'b1 ; + end + else + begin + if (shtrans == HTRANS_NONSEQ & shselmac & shreadyi) + begin + if (shwrite) + begin + i_transfdir_r <= 1'b0 ; + end + else + begin + i_transfdir_r <= 1'b1 ; + end + end + end + end + + always @(posedge shclk) + begin : i_addrreg_proc + if (!shresetn) + begin + i_addrreg_r <= {CSRADDRESSWIDTH{1'b0}} ; + end + else + begin + i_addrreg_r <= i_addrreg_r ; + if (shtrans == HTRANS_NONSEQ & shselmac & shreadyi) + begin + i_addrreg_r <= shaddr[CSRADDRESSWIDTH - 1:0] ; + end + end + end + + always @(posedge shclk) + begin : i_calcbe_reg_proc + if (!shresetn) + begin + i_calcbe_r <= {CSRDATAWIDTH / 8{1'b0}} ; + end + else + begin + i_calcbe_r <= i_calcbe ; + end + end + + always @(shaddr or shsize) + begin : i_calcbe_proc + case (SAHBDATAWIDTH) + 8 : + begin + i_calcbe = 1'b1 ; + end + 16 : + begin + i_calcbe = {CSRDATAWIDTH / 8{1'b1}} ; + case (shsize) + HSIZE_8BIT : + begin + if (shaddr[0]) + begin + i_calcbe = 2'b10 ; + end + else + begin + i_calcbe = 2'b01 ; + end + end + HSIZE_16BIT : + begin + if (!(shaddr[0])) + begin + i_calcbe = 2'b11 ; + end + else + begin + i_calcbe = 2'b00 ; + end + end + default : + begin + end + endcase + end + 32 : + begin + i_calcbe = {CSRDATAWIDTH / 8{1'b1}} ; + case (shsize) + HSIZE_8BIT : + begin + if (shaddr[1:0] == 2'b00) + begin + i_calcbe = 4'b0001 ; + end + else if (shaddr[1:0] == 2'b01) + begin + i_calcbe = 4'b0010 ; + end + else if (shaddr[1:0] == 2'b10) + begin + i_calcbe = 4'b0100 ; + end + else + begin + i_calcbe = 4'b1000 ; + end + end + HSIZE_16BIT : + begin + if (shaddr[1:0] == 2'b00) + begin + i_calcbe = 4'b0011 ; + end + else if (shaddr[1:0] == 2'b10) + begin + i_calcbe = 4'b1100 ; + end + else + begin + i_calcbe = 4'b0000 ; + end + end + HSIZE_32BIT : + begin + if (shaddr[1:0] == 2'b00) + begin + i_calcbe = 4'b1111 ; + end + else + begin + i_calcbe = 4'b0000 ; + end + end + default : + begin + end + endcase + end + default : + begin + end + endcase + end + + assign shresp = HRESP_OKAY ; + + assign csrdatai = shwdata ; + + assign csrbe = i_calcbe_r ; + + assign csraddr = i_addrreg_r ; + + assign csrreq = i_transfind_r ; + + assign csrrw = i_transfdir_r ; + + assign rstcsr = ~shresetn ; + + assign shreadyo = csrack ; + + assign shrdata = csrdatao ; + +endmodule + + +module MACDATA2AHB_V ( + mhclk, + mhresetn, + mhrdata, + mhready, + mhresp, + mhaddr, + mhtrans, + mhwrite, + mhsize, + mhburst, + mhprot, + mhwdata, + mhgrantmac, + mhbusreqmac, + mhlockmac, + datareq, + datareqc, + datarw, + dataeob, + dataeobc, + dataaddr, + datao, + dataack, + datai + ); + + parameter MAHBDATAWIDTH = 32; + parameter MAHBADDRESSWIDTH = 32; + parameter MACDATAWIDTH = 32; + parameter MACADDRESSWIDTH = 32; + + `include "mac2ahb_package.v" + + + input mhclk; + input mhresetn; + input [MAHBDATAWIDTH - 1:0] mhrdata; + input mhready; + input [1:0] mhresp; + output [MAHBADDRESSWIDTH - 1:0] mhaddr; + wire [MAHBADDRESSWIDTH - 1:0] mhaddr; + output [1:0] mhtrans; + reg [1:0] mhtrans; + output mhwrite; + wire mhwrite; + output [2:0] mhsize; + reg [2:0] mhsize; + output [2:0] mhburst; + reg [2:0] mhburst; + output [3:0] mhprot; + wire [3:0] mhprot; + output [MAHBDATAWIDTH - 1:0] mhwdata; + wire [MAHBDATAWIDTH - 1:0] mhwdata; + + input mhgrantmac; + output mhbusreqmac; + wire mhbusreqmac; + output mhlockmac; + wire mhlockmac; + + input datareq; + input datareqc; + input datarw; + input dataeob; + input dataeobc; + input [MACADDRESSWIDTH - 1:0] dataaddr; + input [MACDATAWIDTH - 1:0] datao; + output dataack; + wire dataack; + output [MACDATAWIDTH - 1:0] datai; + wire [MACDATAWIDTH - 1:0] datai; + + + + wire [MAHBDATAWIDTH - 1:0] ahb_hrdata; + wire ahb_hready; + reg[1:0] ahb_hresp; + wire [MAHBADDRESSWIDTH - 1:0] ahb_haddr; + wire [1:0] ahb_htrans; + wire ahb_hwrite; + wire [2:0] ahb_hsize; + wire [0:0] ahb_hburst; + wire [3:0] ahb_hprot; + wire [MAHBDATAWIDTH - 1:0] ahb_hwdata; + wire ahb_hgrantmac; + reg ahb_hbusreqmac; + wire ahb_hlockmac; + wire mac_datareqc; + wire mac_datareq; + wire mac_datarw; + wire mac_dataeobc; + wire mac_dataeobcc; + wire [MACADDRESSWIDTH - 1:0] mac_dataaddr; + wire [MACDATAWIDTH - 1:0] mac_datao; + wire mac_dataack; + wire [MACDATAWIDTH - 1:0] mac_datai; + reg [1:0] fsm_macdata2ahb_nxt; + reg [1:0] fsm_macdata2ahb_r; + reg [MACADDRESSWIDTH - 1:0] i_ahb_haddr; + reg [MACADDRESSWIDTH - 1:0] i_ahb_haddr_c; + reg i_ahb_hgrant_r; + wire i_hbusreq_c; + reg i_mac_dataeobc_r; + reg i_datareqc_r; + wire i_hwritem_c; + reg i_hwritem; + wire [1:0] i_htransm_c; + reg [1:0] i_htransm; + wire i_dataack_c; + wire i_1kc; + + assign ahb_hwdata = mac_datao ; + + assign mac_datai = ahb_hrdata ; + + always @(i_ahb_haddr or + fsm_macdata2ahb_r or + ahb_hready or + mac_dataaddr or + i_ahb_hgrant_r or + i_mac_dataeobc_r or + i_datareqc_r or + dataaddr) + begin : i_ahb_haddr_proc + case (fsm_macdata2ahb_r) + AHBM_ADDR : + begin + if (ahb_hready == 1'b1 & i_mac_dataeobc_r == 1'b0) + begin + i_ahb_haddr_c = i_ahb_haddr + 3'b100 ; + end + else + begin + i_ahb_haddr_c = i_ahb_haddr ; + end + end + AHBM_ADDRDATA : + begin + if (ahb_hready == 1'b1 & i_mac_dataeobc_r == 1'b0) + begin + i_ahb_haddr_c = i_ahb_haddr + 3'b100 ; + end + else + begin + i_ahb_haddr_c = i_ahb_haddr ; + end + end + AHBM_IDLE : + begin + if (i_datareqc_r == 1'b1) + begin + i_ahb_haddr_c = dataaddr ; + end + else + begin + i_ahb_haddr_c = i_ahb_haddr ; + end + end + default : + begin + i_ahb_haddr_c = i_ahb_haddr ; + end + endcase + end + + always @(posedge mhclk) + begin : iahbaddrm_reg_proc + if (mhresetn == 1'b0) + begin + i_ahb_haddr <= {MACADDRESSWIDTH - 1+1{1'b1}} ; + end + else + begin + i_ahb_haddr <= i_ahb_haddr_c ; + end + end + + assign ahb_haddr = i_ahb_haddr ; + + assign i_1kc = (ahb_htrans == SEQ | ahb_htrans == NONSEQ) ? + (i_ahb_haddr[10] ^ i_ahb_haddr_c[10]) : 1'b0 ; + + assign i_hbusreq_c = (mac_datareqc == 1'b1 & + ( + mac_dataeobc == 1'b0 | + fsm_macdata2ahb_nxt == AHBM_IDLE + ) + ) ? 1'b1 : 1'b0 ; + + assign ahb_hwrite = i_hwritem ; + + assign ahb_htrans = (!ahb_hgrantmac & fsm_macdata2ahb_r == AHBM_ADDR) ? + IDLE : i_htransm ; + + assign ahb_hlockmac = 1'b0 ; + + + assign i_hwritem_c = (fsm_macdata2ahb_nxt == AHBM_ADDR) ? + ~mac_datarw : i_hwritem ; + + + assign ahb_hburst = INCR ; + + assign i_htransm_c = (fsm_macdata2ahb_nxt == AHBM_ADDR) ? NONSEQ : + (fsm_macdata2ahb_nxt == AHBM_ADDRDATA) ? SEQ : + IDLE ; + + assign i_dataack_c = (ahb_hready == 1'b1 & + ( + ahb_hresp == OKAY | ahb_hresp == ERROR + ) & + ( + fsm_macdata2ahb_r == AHBM_DATA | + fsm_macdata2ahb_r == AHBM_ADDRDATA + ) + ) ? 1'b1 : 1'b0 ; + + assign mac_dataack = i_dataack_c ; + + always @(fsm_macdata2ahb_r or + ahb_hgrantmac or + ahb_hresp or + ahb_hready or + i_datareqc_r or + i_mac_dataeobc_r or + mac_dataeobc or + mac_datareqc or + mac_datareq or + i_1kc) + begin : fsm_macdata2ahb_r_proc + case (fsm_macdata2ahb_r) + AHBM_IDLE : + begin + if (ahb_hgrantmac == 1'b1 & + ahb_hready == 1'b1 & + mac_datareq == 1'b1) + begin + fsm_macdata2ahb_nxt = AHBM_ADDR ; + end + else + begin + fsm_macdata2ahb_nxt = AHBM_IDLE ; + end + end + AHBM_ADDR : + begin + if(!ahb_hgrantmac) + begin + fsm_macdata2ahb_nxt = AHBM_IDLE; + end + else if (ahb_hready == 1'b1) + begin + if (i_mac_dataeobc_r == 1'b1 | + ahb_hgrantmac == 1'b0 | + i_1kc == 1'b1) + begin + fsm_macdata2ahb_nxt = AHBM_DATA ; + end + else + begin + fsm_macdata2ahb_nxt = AHBM_ADDRDATA ; + end + end + else + begin + fsm_macdata2ahb_nxt = AHBM_ADDR ; + end + end + AHBM_DATA : + begin + if (ahb_hready == 1'b1) + begin + if (ahb_hgrantmac == 1'b1 & + mac_datareqc == 1'b1 & + i_1kc == 1'b0) + begin + fsm_macdata2ahb_nxt = AHBM_ADDR ; + end + else + begin + fsm_macdata2ahb_nxt = AHBM_IDLE ; + end + end + else + begin + if (ahb_hresp == OKAY | ahb_hresp == ERROR) + begin + fsm_macdata2ahb_nxt = AHBM_DATA ; + end + else + begin + fsm_macdata2ahb_nxt = AHBM_IDLE ; + end + end + end + default: + begin + if (ahb_hready == 1'b1) + begin + if (ahb_hgrantmac == 1'b0 | + mac_dataeobc == 1'b1 | + i_1kc == 1'b1) + begin + fsm_macdata2ahb_nxt = AHBM_DATA ; + end + else + begin + fsm_macdata2ahb_nxt = AHBM_ADDRDATA ; + end + end + else + begin + if (ahb_hresp == OKAY | ahb_hresp == ERROR) + begin + fsm_macdata2ahb_nxt = AHBM_ADDRDATA ; + end + else + begin + fsm_macdata2ahb_nxt = AHBM_IDLE ; + end + end + end + endcase + end + + always @(posedge mhclk) + begin : fsm_macdata2ahb_r_reg_proc + if (mhresetn == 1'b0) + begin + fsm_macdata2ahb_r <= AHBM_IDLE ; + end + else + begin + fsm_macdata2ahb_r <= fsm_macdata2ahb_nxt ; + end + end + + always @(posedge mhclk) + begin : datactrl_reg_proc + if (mhresetn == 1'b0) + begin + i_datareqc_r <= 1'b0 ; + i_mac_dataeobc_r <= 1'b0 ; + i_ahb_hgrant_r <= 1'b0 ; + end + else + begin + i_datareqc_r <= mac_datareqc ; + i_mac_dataeobc_r <= mac_dataeobc ; + i_ahb_hgrant_r <= ahb_hgrantmac ; + end + end + + always @(posedge mhclk) + begin : ahbm_ctrl_reg_proc + if (mhresetn == 1'b0) + begin + ahb_hbusreqmac <= 1'b0 ; + i_hwritem <= 1'b0 ; + i_htransm <= IDLE ; + end + else + begin + ahb_hbusreqmac <= i_hbusreq_c ; + i_hwritem <= i_hwritem_c ; + i_htransm <= i_htransm_c ; + end + end + assign ahb_hsize = (MAHBDATAWIDTH == 8) ? HSIZE8BIT : + (MAHBDATAWIDTH == 16) ? HSIZE16BIT : + (MAHBDATAWIDTH == 32) ? HSIZE32BIT : + (MAHBDATAWIDTH == 64) ? HSIZE64BIT : + UNSUPPORTED ; + + assign ahb_hprot = HPROT_MACPROTECTIONCONTROL ; + + assign ahb_hrdata = mhrdata ; + + assign ahb_hready = mhready ; + + always @(mhresp) + begin : ahb_hresp_map_proc + case (mhresp) + HRESP_ERROR : + begin + ahb_hresp = ERROR ; + end + HRESP_RETRY : + begin + ahb_hresp = RETRY ; + end + HRESP_SPLIT : + begin + ahb_hresp = SPLIT ; + end + default : + begin + ahb_hresp = OKAY ; + end + endcase + end + + assign mhaddr = ahb_haddr ; + + always @(ahb_htrans) + begin : ahb_htrans_map_proc + case (ahb_htrans) + NONSEQ : + begin + mhtrans = HTRANS_NONSEQ ; + end + SEQ : + begin + mhtrans = HTRANS_SEQ ; + end + default : + begin + mhtrans = HTRANS_IDLE ; + end + endcase + end + + assign mhwrite = ahb_hwrite ; + + always @(ahb_hsize) + begin : ahb_hsize_map_proc + case (ahb_hsize) + HSIZE8BIT : + begin + mhsize = HSIZE_8BIT ; + end + HSIZE16BIT : + begin + mhsize = HSIZE_16BIT ; + end + default : + begin + mhsize = HSIZE_32BIT ; + end + endcase + end + + always @(ahb_hburst) + begin : ahb_hburst_map_proc + case (ahb_hburst) + INCR : + begin + mhburst = HBURST_INCR ; + end + default : + begin + mhburst = HBURST_SINGLE ; + end + endcase + end + + assign mhprot = ahb_hprot ; + + assign mhwdata = ahb_hwdata ; + + assign ahb_hgrantmac = mhgrantmac ; + + assign mhbusreqmac = ahb_hbusreqmac ; + + assign mhlockmac = ahb_hlockmac ; + + + assign mac_datareqc = datareqc ; + + assign mac_datareq = datareq ; + + assign mac_datarw = datarw ; + + assign mac_dataeobc = dataeobc ; + + assign mac_dataaddr = dataaddr ; + + assign mac_datao = datao ; + + assign dataack = mac_dataack ; + + assign datai = mac_datai ; + +endmodule + + +module RC_V ( + clk, + rst, + rxdv, + rxer, + rxd, + col, + ramwe, + ramaddr, + ramdata, + fdata, + faddr, + cachenf, + radg, + wadg, + rprog, + rcpoll, + riack, + ren, + ra, + pm, + pr, + pb, + rif, + ho, + hp, + rireq, + ff, + rf, + mf, + db, + re, + ce, + tl, + ftp, + ov, + cs, + length, + match, + matchval, + matchen, + matchdata, + focl, + foclack, + oco, + focg, + mfcl, + mfclack, + mfo, + mfcg, + stopi, + stopo, + rcsack, + rcsreq); + + parameter FIFODEPTH = 9; + parameter DATAWIDTH = 32; + + `include "utility.v" + + input clk; + input rst; + + input col; + input rxdv; + input rxer; + input [MIIWIDTH - 1:0] rxd; + + output ramwe; + wire ramwe; + output [FIFODEPTH - 1:0] ramaddr; + wire [FIFODEPTH - 1:0] ramaddr; + output [DATAWIDTH - 1:0] ramdata; + wire [DATAWIDTH - 1:0] ramdata; + + input [ADDRWIDTH - 1:0] fdata; + output [ADDRDEPTH - 1:0] faddr; + wire [ADDRDEPTH - 1:0] faddr; + + input cachenf; + input [FIFODEPTH - 1:0] radg; + output [FIFODEPTH - 1:0] wadg; + wire [FIFODEPTH - 1:0] wadg; + output rprog; + reg rprog; + output rcpoll; + wire rcpoll; + + input riack; + input ren; + input ra; + input pm; + input pr; + input pb; + input rif; + input ho; + input hp; + output rireq; + reg rireq; + output ff; + reg ff; + output rf; + reg rf; + output mf; + reg mf; + output db; + reg db; + output re; + reg re; + output ce; + reg ce; + output tl; + reg tl; + output ftp; + reg ftp; + output cs; + reg cs; + output ov; + reg ov; + output [13:0] length; + reg [13:0] length; + + input match; + input matchval; + output matchen; + reg matchen; + output [47:0] matchdata; + wire [47:0] matchdata; + + input focl; + output foclack; + wire foclack; + output oco; + reg oco; + output [10:0] focg; + reg [10:0] focg; + input mfcl; + output mfclack; + output mfo; + reg mfo; + output [15:0] mfcg; + reg [15:0] mfcg; + + input stopi; + output stopo; + reg stopo; + + input rcsack; + output rcsreq; + reg rcsreq; + + + + reg we; + reg full; + reg [FIFODEPTH - 1:0] wad; + reg [FIFODEPTH - 1:0] wadi; + reg [FIFODEPTH - 1:0] iwadg; + reg [FIFODEPTH - 1:0] wadig; + reg [FIFODEPTH - 1:0] radg_0_r; + reg [FIFODEPTH - 1:0] radg_r; + reg [FIFODEPTH - 1:0] isofad; + reg cachenf_r; + reg cachenf_2r; + reg fcfbci; + reg fcfbci_r; + reg eorfff; + + + reg col_r; + reg rxdv_r; + reg rxer_r; + reg [MIIWIDTH - 1:0] rxd_r; + wire [3:0] rxd_r4; + + reg [3:0] rsm_c; + reg [3:0] rsm; + reg [3:0] ncnt; + wire [1:0] ncnt10; + wire [2:0] ncnt20; + reg [DATAWIDTH - 1:0] data_c; + reg [DATAWIDTH - 1:0] data; + reg [31:0] crc_c; + reg [31:0] crc; + reg [6:0] bcnt; + wire [2:0] bcnt20; + reg bz; + reg winp; + wire iri_c; + reg iri; + reg riack_r; + reg [13:0] lcnt; + reg [15:0] lfield; + reg ren_r; + reg irprog; + + reg [2:0] fsm_c; + reg [2:0] fsm; + reg perfm_c; + reg perfm; + reg invm; + reg [8:0] crchash; + reg hash; + reg [47:0] dest; + reg [2:0] flcnt; + reg [ADDRDEPTH - 1:0] fa; + reg [15:0] fdata_r; + + reg rcs; + reg rcsack_r; + reg [7:0] rcscnt; + + reg [10:0] focnt; + reg focl_r; + reg [15:0] mfcnt; + reg mfcl_r; + + reg stop_r; + + wire [FIFODEPTH - 1:0] fzero; + wire [MIIWIDTH_MAX + 1:0] mzero_max; + wire [MIIWIDTH_MAX + 1:0] rxd_r_max; + + always @(posedge clk) + begin : mii_reg_proc + if (rst) + begin + col_r <= 1'b0; + rxdv_r <= 1'b0 ; + rxer_r <= 1'b0 ; + rxd_r <= {MIIWIDTH{1'b0}} ; + data <= {DATAWIDTH{1'b1}} ; + end + else + begin + col_r <= col ; + rxdv_r <= rxdv ; + rxer_r <= rxer ; + rxd_r <= rxd ; + data <= data_c ; + end + end + + assign rxd_r4 = rxd_r_max[MIIWIDTH-1:0]; + + assign ncnt10 = ncnt[1:0] ; + + assign ncnt20 = ncnt[2:0] ; + + always @(ncnt or ncnt10 or ncnt20 or rxd_r_max or data) + begin : data_proc + reg[15:0] data16; + reg[31:0] data32; + case (DATAWIDTH) + 8 : + begin + data_c <= data ; + if (!(ncnt[0])) + begin + data_c[3:0] <= rxd_r_max[MIIWIDTH-1:0] ; + end + else + begin + data_c[7:4] <= rxd_r_max[MIIWIDTH-1:0] ; + end + end + 16 : + begin + data16 = data; + case (ncnt10) + 2'b00 : + begin + data16[3:0] = rxd_r_max[MIIWIDTH-1:0]; + end + 2'b01 : + begin + data16[7:4] = rxd_r_max[MIIWIDTH-1:0]; + end + 2'b10 : + begin + data16[11:8] = rxd_r_max[MIIWIDTH-1:0]; + end + default : + begin + data16[15:12] = rxd_r_max[MIIWIDTH-1:0]; + end + endcase + data_c <= data16 ; + end + default : + begin + data32 = data; + case (ncnt20) + 3'b000 : + begin + data32[3:0] = rxd_r_max[MIIWIDTH-1:0]; + end + 3'b001 : + begin + data32[7:4] = rxd_r_max[MIIWIDTH-1:0]; + end + 3'b010 : + begin + data32[11:8] = rxd_r_max[MIIWIDTH-1:0]; + end + 3'b011 : + begin + data32[15:12] = rxd_r_max[MIIWIDTH-1:0]; + end + 3'b100 : + begin + data32[19:16] = rxd_r_max[MIIWIDTH-1:0]; + end + 3'b101 : + begin + data32[23:20] = rxd_r_max[MIIWIDTH-1:0]; + end + 3'b110 : + begin + data32[27:24] = rxd_r_max[MIIWIDTH-1:0]; + end + default : + begin + data32[31:28] = rxd_r_max[MIIWIDTH-1:0]; + end + endcase + data_c <= data32 ; + end + endcase + end + + always @(posedge clk) + begin : fifofull_reg_proc + if (rst) + begin + cachenf_r <= 1'b1 ; + cachenf_2r <= 1'b1 ; + full <= 1'b0 ; + end + else + begin + cachenf_r <= cachenf ; + + if(cachenf_2r | + ( + (!rxdv_r & cachenf_r) | + ( rxdv_r & cachenf_r & + (rsm==RSM_IDLE_RCSMT | rsm==RSM_SFD) + ) + ) + ) + begin + cachenf_2r <= cachenf ; + end + + if ((wadig == radg_r) | (iwadg == radg_r & full)) + begin + full <= 1'b1 ; + end + else + begin + full <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : addr_reg_proc + if (rst) + begin + wad <= {FIFODEPTH{1'b0}} ; + wadi <= {fzero[FIFODEPTH - 1:1], 1'b1} ; + iwadg <= {FIFODEPTH{1'b0}} ; + isofad <= {FIFODEPTH{1'b0}} ; + wadig <= {fzero[FIFODEPTH - 1:1],1'b1} ; + radg_0_r <= {FIFODEPTH{1'b0}} ; + radg_r <= {FIFODEPTH{1'b0}} ; + end + else + begin + if (rsm == RSM_BAD) + begin + wad <= isofad ; + end + else if (we) + begin + wad <= wad + 1 ; + end + + if (rsm == RSM_BAD) + begin + wadi <= isofad + 1 ; + end + else if (we) + begin + wadi <= wadi + 1 ; + end + + iwadg[FIFODEPTH - 1] <= wad[FIFODEPTH - 1] ; + begin : iwaddrg_loop + integer i; + for(i = FIFODEPTH - 2; i >= 0; i = i - 1) + begin + iwadg[i] <= wad[i + 1] ^ wad[i] ; + end + end + + wadig[FIFODEPTH - 1] <= wadi[FIFODEPTH - 1] ; + begin : waddrig_loop + integer i; + for(i = FIFODEPTH - 2; i >= 0; i = i - 1) + begin + wadig[i] <= wadi[i + 1] ^ wadi[i] ; + end + end + + if (rsm == RSM_IDLE_RCSMT) + begin + isofad <= wad ; + end + + radg_0_r <= radg ; + radg_r <= radg_0_r ; + + end + end + + always @(posedge clk) + begin : we_reg_proc + if (rst) + begin + we <= 1'b0 ; + end + else + begin + if ((rsm == RSM_INFO | + rsm == RSM_DEST | + rsm == RSM_LENGTH | + rsm == RSM_SOURCE) & + ((rxdv_r & ((DATAWIDTH == 8 & (ncnt[0])) | + (DATAWIDTH == 16 & ncnt[1:0] == 2'b11) | + (DATAWIDTH == 32 & ncnt[2:0] == 3'b111))) | + (!rxdv_r & !we & + ( + (DATAWIDTH==32 & ncnt[2:1]!=2'b00) | + (DATAWIDTH==16 & ncnt[1] !=1'b0) + ) + ) | + (full & !we))) + begin + we <= 1'b1 ; + end + else + begin + we <= 1'b0 ; + end + end + end + + assign ramdata = data ; + + assign ramwe = we ; + + assign ramaddr = wad ; + + assign wadg = iwadg ; + + always @(rsm or + rxdv_r or + rxd_r_max or + rxd_r4 or + stop_r or + bz or + fsm or + ra or + pm or + pb or + dest or + riack_r or + full or + ren_r or + winp or + irprog or + cachenf_r) + begin : rsm_proc + case (rsm) + RSM_IDLE_RCSMT : + begin + if (rxdv_r & !stop_r & ren_r) + begin + if (rxd_r_max[MIIWIDTH-1:0] == 4'b0101) + begin + rsm_c <= RSM_SFD ; + end + else + begin + rsm_c <= RSM_IDLE_RCSMT ; + end + end + else + begin + rsm_c <= RSM_IDLE_RCSMT ; + end + end + RSM_SFD : + begin + if (rxdv_r & !full & cachenf_r) + begin + case (rxd_r4) + 4'b1101 : + begin + rsm_c <= RSM_DEST ; + end + 4'b0101 : + begin + rsm_c <= RSM_SFD ; + end + default : + begin + rsm_c <= RSM_IDLE_RCSMT ; + end + endcase + end + else if (full | !cachenf_r) + begin + rsm_c <= RSM_BAD ; + end + else + begin + rsm_c <= RSM_IDLE_RCSMT ; + end + end + RSM_DEST : + begin + if (!rxdv_r | full | !cachenf_r) + begin + rsm_c <= RSM_BAD ; + end + else if (bz) + begin + rsm_c <= RSM_SOURCE ; + end + else + begin + rsm_c <= RSM_DEST ; + end + end + RSM_SOURCE : + begin + if (!rxdv_r) + begin + if ((pb) & (fsm == FSM_MATCH | ra | (pm & (dest[0])))) + begin + rsm_c <= RSM_SUCC ; + end + else + begin + rsm_c <= RSM_BAD ; + end + end + else if (full | !cachenf_r) + begin + rsm_c <= RSM_BAD ; + end + else if (bz) + begin + rsm_c <= RSM_LENGTH ; + end + else + begin + rsm_c <= RSM_SOURCE ; + end + end + RSM_LENGTH : + begin + if (!rxdv_r) + begin + if ((pb) & (fsm == FSM_MATCH | ra | (pm & (dest[0])))) + begin + rsm_c <= RSM_SUCC ; + end + else + begin + rsm_c <= RSM_BAD ; + end + end + else if (full | !cachenf_r) + begin + rsm_c <= RSM_BAD ; + end + else if (bz) + begin + rsm_c <= RSM_INFO ; + end + else + begin + rsm_c <= RSM_LENGTH ; + end + end + RSM_INFO : + begin + if (!rxdv_r) + begin + if ((winp | pb) & + (fsm == FSM_MATCH | ra | (pm & (dest[0])))) + begin + rsm_c <= RSM_SUCC ; + end + else + begin + rsm_c <= RSM_BAD ; + end + end + else if (full | !cachenf_r) + begin + if (winp) + begin + rsm_c <= RSM_SUCC ; + end + else + begin + rsm_c <= RSM_BAD ; + end + end + else if (fsm == FSM_FAIL & !ra & ~(pm & (dest[0]))) + begin + rsm_c <= RSM_BAD ; + end + else + begin + rsm_c <= RSM_INFO ; + end + end + RSM_SUCC : + begin + rsm_c <= RSM_INT ; + end + RSM_INT : + begin + if (riack_r) + begin + rsm_c <= RSM_INT1 ; + end + else + begin + rsm_c <= RSM_INT ; + end + end + RSM_INT1 : + begin + if (!rxdv_r & !riack_r) + begin + rsm_c <= RSM_IDLE_RCSMT ; + end + else + begin + rsm_c <= RSM_INT1 ; + end + end + default : + begin + if (!rxdv_r & !riack_r & !irprog) + begin + rsm_c <= RSM_IDLE_RCSMT ; + end + else + begin + rsm_c <= RSM_BAD ; + end + end + endcase + end + + always @(posedge clk) + begin : rsm_reg_proc + if (rst) + begin + rsm <= RSM_IDLE_RCSMT ; + end + else + begin + rsm <= rsm_c ; + end + end + + always @(posedge clk) + begin : rprog_reg_proc + if (rst) + begin + irprog <= 1'b0 ; + rprog <= 1'b0 ; + end + else + begin + if (rsm == RSM_IDLE_RCSMT | + rsm == RSM_BAD | + rsm == RSM_INT | + rsm == RSM_INT1) + begin + irprog <= 1'b0 ; + end + else + begin + irprog <= 1'b1 ; + end + + if (winp & irprog) + begin + rprog <= 1'b1 ; + end + else + begin + rprog <= 1'b0 ; + end + end + end + + assign rcpoll = irprog ; + + always @(posedge clk) + begin : bncnt_reg_proc + if (rst) + begin + bcnt <= {7{1'b0}} ; + bz <= 1'b0 ; + ncnt <= 4'b0000 ; + end + else + begin + if(cachenf_r) + begin + if (bz | rsm == RSM_IDLE_RCSMT) + begin + case (rsm) + RSM_IDLE_RCSMT : + begin + bcnt <= 7'b0000101 ; + end + RSM_DEST : + begin + bcnt <= 7'b0000101 ; + end + RSM_SOURCE : + begin + bcnt <= 7'b0000001 ; + end + default : + begin + bcnt <= 7'b0110001 ; + end + endcase + end + else + begin + if (ncnt[0]) + begin + bcnt <= bcnt - 1 ; + end + end + end + else + begin + if(!fcfbci_r) + begin + bcnt <= 7'b0111110 ; + end + else + begin + if (!ncnt[0]) + begin + bcnt <= bcnt - 1 ; + end + end + end + + if (bcnt == 7'b0000000 & !ncnt[0]) + begin + bz <= 1'b1 ; + end + else + begin + bz <= 1'b0 ; + end + + if (rsm == RSM_SFD | rsm == RSM_IDLE_RCSMT) + begin + ncnt <= 4'b0000 ; + end + else + begin + ncnt <= ncnt + 1 ; + end + end + end + + always @(posedge clk) + begin : winp_reg_proc + if (rst) + begin + winp <= 1'b0 ; + end + else + begin + if (rsm == RSM_IDLE_RCSMT) + begin + winp <= 1'b0 ; + end + else if ((rsm == RSM_INFO & bz & cachenf_2r) | + (rsm == RSM_BAD & bz & !cachenf_2r)) + begin + winp <= 1'b1 ; + end + end + end + + always @(crc or rsm or rxd_r_max) + begin : crc_proc + case (rsm) + RSM_IDLE_RCSMT : + begin + crc_c <= {32{1'b1}} ; + end + RSM_DEST, RSM_SOURCE, RSM_LENGTH, RSM_INFO : + begin + crc_c[0] <= crc[28] ^ + rxd_r_max[3] ; + crc_c[1] <= crc[28] ^ crc[29] ^ + rxd_r_max[2] ^ rxd_r_max[3] ; + crc_c[2] <= crc[28] ^ crc[29] ^ crc[30] ^ + rxd_r_max[1] ^ rxd_r_max[2] ^ rxd_r_max[3] ; + crc_c[3] <= crc[29] ^ crc[30] ^ crc[31] ^ + rxd_r_max[0] ^ rxd_r_max[1] ^ rxd_r_max[2] ; + crc_c[4] <= crc[0] ^ crc[28] ^ crc[30] ^ crc[31] ^ + rxd_r_max[0] ^ rxd_r_max[1] ^ rxd_r_max[3] ; + crc_c[5] <= crc[1] ^ crc[28] ^ crc[29] ^ crc[31] ^ + rxd_r_max[0] ^ rxd_r_max[2] ^ rxd_r_max[3] ; + crc_c[6] <= crc[2] ^ crc[29] ^ crc[30] ^ + rxd_r_max[1] ^ rxd_r_max[2] ; + crc_c[7] <= crc[3] ^ crc[28] ^ crc[30] ^ crc[31] ^ + rxd_r_max[0] ^ rxd_r_max[1] ^ rxd_r_max[3] ; + crc_c[8] <= crc[4] ^ crc[28] ^ crc[29] ^ crc[31] ^ + rxd_r_max[0] ^ rxd_r_max[2] ^ rxd_r_max[3] ; + crc_c[9] <= crc[5] ^ crc[29] ^ crc[30] ^ + rxd_r_max[1] ^ rxd_r_max[2] ; + crc_c[10] <= crc[6] ^ crc[28] ^ crc[30] ^ crc[31] ^ + rxd_r_max[0] ^ rxd_r_max[1] ^ rxd_r_max[3] ; + crc_c[11] <= crc[7] ^ crc[28] ^ crc[29] ^ crc[31] ^ + rxd_r_max[0] ^ rxd_r_max[2] ^ rxd_r_max[3] ; + crc_c[12] <= crc[8] ^ crc[28] ^ crc[29] ^ crc[30] ^ + rxd_r_max[1] ^ rxd_r_max[2] ^ rxd_r_max[3] ; + crc_c[13] <= crc[9] ^ crc[29] ^ crc[30] ^ crc[31] ^ + rxd_r_max[0] ^ rxd_r_max[1] ^ rxd_r_max[2] ; + crc_c[14] <= crc[10] ^ crc[30] ^ crc[31] ^ + rxd_r_max[0] ^ rxd_r_max[1] ; + crc_c[15] <= crc[11] ^ crc[31] ^ + rxd_r_max[0] ; + crc_c[16] <= crc[12] ^ crc[28] ^ + rxd_r_max[3] ; + crc_c[17] <= crc[13] ^ crc[29] ^ + rxd_r_max[2] ; + crc_c[18] <= crc[14] ^ crc[30] ^ + rxd_r_max[1] ; + crc_c[19] <= crc[15] ^ crc[31] ^ + rxd_r_max[0] ; + crc_c[20] <= crc[16] ; + crc_c[21] <= crc[17] ; + crc_c[22] <= crc[18] ^ crc[28] ^ + rxd_r_max[3] ; + crc_c[23] <= crc[19] ^ crc[28] ^ crc[29] ^ + rxd_r_max[2] ^ rxd_r_max[3] ; + crc_c[24] <= crc[20] ^ crc[29] ^ crc[30] ^ + rxd_r_max[1] ^ rxd_r_max[2] ; + crc_c[25] <= crc[21] ^ crc[30] ^ crc[31] ^ + rxd_r_max[0] ^ rxd_r_max[1] ; + crc_c[26] <= crc[22] ^ crc[28] ^ crc[31] ^ + rxd_r_max[0] ^ rxd_r_max[3] ; + crc_c[27] <= crc[23] ^ crc[29] ^ + rxd_r_max[2] ; + crc_c[28] <= crc[24] ^ crc[30] ^ + rxd_r_max[1] ; + crc_c[29] <= crc[25] ^ crc[31] ^ + rxd_r_max[0] ; + crc_c[30] <= crc[26] ; + crc_c[31] <= crc[27] ; + end + default : + begin + crc_c <= crc ; + end + endcase + end + + always @(posedge clk) + begin : crc_reg_proc + if (rst) + begin + crc <= {32{1'b1}} ; + end + else + begin + crc <= crc_c ; + end + end + + assign iri_c = (rsm == RSM_INT) ? 1'b1 : 1'b0 ; + + always @(posedge clk) + begin : rint_reg_proc + if (rst) + begin + iri <= 1'b0 ; + riack_r <= 1'b0 ; + rireq <= 1'b0 ; + end + else + begin + iri <= iri_c ; + riack_r <= riack ; + rireq <= iri ; + end + end + + always @(posedge clk) + begin : length_reg_proc + if (rst) + begin + lcnt <= {14{1'b0}} ; + length <= {14{1'b0}} ; + end + else + begin + if ((rsm == RSM_IDLE_RCSMT && cachenf_2r) | + (!fcfbci && !cachenf_2r) | + rsm == RSM_INT1) + begin + lcnt <= {14{1'b0}} ; + end + else if (((rsm == RSM_INFO | + rsm == RSM_LENGTH | + rsm == RSM_DEST | + rsm == RSM_SOURCE) & rxdv_r) | + (fcfbci && !cachenf_2r)) + begin + if (ncnt[0]) + begin + lcnt <= lcnt + 1 ; + end + end + + length[13] <= lcnt[13] ; + begin : length_loop + integer i; + for(i = 12; i >= 0; i = i - 1) + begin + length[i] <= lcnt[i + 1] ^ lcnt[i] ; + end + end + end + end + + always @(posedge clk) + begin : fcfbci_reg_proc + if (rst) + begin + fcfbci <= 1'b0 ; + fcfbci_r <= 1'b0 ; + end + else + begin + + fcfbci_r <= fcfbci ; + + if(!cachenf_2r) + begin + if(rxdv_r && rxd_r4==4'b1101) + begin + fcfbci <= 1'b1 ; + end + else if(!rxdv_r) + begin + fcfbci <= 1'b0 ; + end + end + else + begin + fcfbci <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : eorfff_reg_proc + if (rst) + begin + eorfff <= 1'b0 ; + end + else + begin + if(rsm_c==RSM_IDLE_RCSMT && rsm==RSM_BAD && !cachenf_2r) + begin + eorfff <= 1'b1 ; + end + else + begin + eorfff <= 1'b0 ; + end + end + end + + + always @(posedge clk) + begin : stat_reg_proc + if (rst) + begin + lfield <= {16{1'b0}} ; + ftp <= 1'b0 ; + tl <= 1'b0 ; + ff <= 1'b0 ; + mf <= 1'b0 ; + re <= 1'b0 ; + ce <= 1'b0 ; + db <= 1'b0 ; + rf <= 1'b0 ; + ov <= 1'b0 ; + cs <= 1'b0 ; + end + else + begin + if (rsm == RSM_LENGTH) + begin + if (bcnt[1:0] == 2'b00) + begin + if (!(ncnt[0])) + begin + lfield[3:0] <= rxd_r_max[MIIWIDTH-1:0] ; + end + else + begin + lfield[7:4] <= rxd_r_max[MIIWIDTH-1:0] ; + end + end + else + begin + if (!(ncnt[0])) + begin + lfield[11:8] <= rxd_r_max[MIIWIDTH-1:0] ; + end + else + begin + lfield[15:12] <= rxd_r_max[MIIWIDTH-1:0] ; + end + end + end + + if (lfield > MAX_SIZE) + begin + ftp <= 1'b1 ; + end + else + begin + ftp <= 1'b0 ; + end + + if (lcnt == MAX_FRAME & !iri_c) + begin + tl <= 1'b1 ; + end + else if (rsm == RSM_IDLE_RCSMT) + begin + tl <= 1'b0 ; + end + + if (!iri_c) + begin + if (fsm == FSM_MATCH) + begin + ff <= 1'b0 ; + end + else + begin + ff <= 1'b1 ; + end + end + + if (!iri_c) + begin + mf <= dest[0] ; + end + + if (rxer_r & !iri_c) + begin + re <= 1'b1 ; + end + else if (rsm == RSM_IDLE_RCSMT) + begin + re <= 1'b0 ; + end + + if (rsm == RSM_INFO & !(ncnt[0])) + begin + if (crc == CRCVAL) + begin + ce <= 1'b0 ; + end + else + begin + ce <= 1'b1 ; + end + end + + if (rsm == RSM_INFO) + begin + if (!rxdv_r & (ncnt[0])) + begin + db <= 1'b1 ; + end + else + begin + db <= 1'b0 ; + end + end + + if (!winp & iri_c) + begin + rf <= 1'b1 ; + end + else if (rsm == RSM_IDLE_RCSMT) + begin + rf <= 1'b0 ; + end + + if (rsm == RSM_IDLE_RCSMT) + begin + ov <= 1'b0 ; + end + else if (full | !cachenf_r) + begin + ov <= 1'b1 ; + end + + if (col_r & !iri_c) + begin + cs <= 1'b1 ; + end + else if (rsm == RSM_IDLE_RCSMT) + begin + cs <= 1'b0 ; + end + + + end + end + + always @(posedge clk) + begin : ren_reg_proc + if (rst) + begin + ren_r <= 1'b0 ; + end + else + begin + if (rsm == RSM_IDLE_RCSMT) + begin + ren_r <= ren ; + end + end + end + + always @(fsm or + rsm or + ho or + hp or + dest or + lcnt or + ncnt or + flcnt or + perfm or + hash or + pr or + fa or + invm or + rif or + matchval or + match) + begin : fsm_proc + case (fsm) + FSM_IDLE : + begin + if (lcnt[2:0] == 3'b101 & (ncnt[0])) + begin + if (pr) + begin + fsm_c <= FSM_MATCH ; + end + else if (ho | (hp & (dest[0]))) + begin + fsm_c <= FSM_HASH ; + end + else if (!hp) + begin + fsm_c <= FSM_PERF16 ; + end + else + begin + fsm_c <= FSM_PERF1 ; + end + end + else + begin + fsm_c <= FSM_IDLE ; + end + end + FSM_PERF1 : + begin + if (fa == 6'b101100) + begin + if(perfm | + (matchval & match)) + begin + fsm_c <= FSM_MATCH ; + end + else + begin + fsm_c <= FSM_FAIL ; + end + end + else + begin + fsm_c <= FSM_PERF1 ; + end + end + FSM_PERF16 : + begin + if ((flcnt == 3'b010 & perfm & !rif) | + (fa == 6'b110010 & rif & invm) | + (matchval & match)) + begin + fsm_c <= FSM_MATCH ; + end + else if (fa == 6'b110010) + begin + fsm_c <= FSM_FAIL ; + end + else + begin + fsm_c <= FSM_PERF16 ; + end + end + FSM_HASH : + begin + if (matchval & match) + begin + fsm_c <= FSM_MATCH ; + end + else if (flcnt == 3'b101) + begin + if (hash) + begin + fsm_c <= FSM_MATCH ; + end + else + begin + fsm_c <= FSM_FAIL ; + end + end + else + begin + fsm_c <= FSM_HASH ; + end + end + FSM_MATCH : + begin + if (rsm == RSM_IDLE_RCSMT) + begin + fsm_c <= FSM_IDLE ; + end + else + begin + fsm_c <= FSM_MATCH ; + end + end + default : + begin + if (rsm == RSM_IDLE_RCSMT) + begin + fsm_c <= FSM_IDLE ; + end + else + begin + fsm_c <= FSM_FAIL ; + end + end + endcase + end + + always @(posedge clk) + begin : fsm_reg_proc + if (rst) + begin + fsm <= FSM_IDLE ; + end + else + begin + fsm <= fsm_c ; + end + end + + assign bcnt20 = bcnt[2:0] ; + + always @(posedge clk) + begin : dest_reg_proc + if (rst) + begin + dest <= {48{1'b0}} ; + end + else + begin + if (rsm == RSM_DEST) + begin + if (!(ncnt[0])) + begin + case (bcnt20) + 3'b101 : + begin + dest[3:0] <= rxd_r_max[MIIWIDTH-1:0] ; + end + 3'b100 : + begin + dest[11:8] <= rxd_r_max[MIIWIDTH-1:0] ; + end + 3'b011 : + begin + dest[19:16] <= rxd_r_max[MIIWIDTH-1:0] ; + end + 3'b010 : + begin + dest[27:24] <= rxd_r_max[MIIWIDTH-1:0] ; + end + 3'b001 : + begin + dest[35:32] <= rxd_r_max[MIIWIDTH-1:0] ; + end + default : + begin + dest[43:40] <= rxd_r_max[MIIWIDTH-1:0] ; + end + endcase + end + else + begin + case (bcnt20) + 3'b101 : + begin + dest[7:4] <= rxd_r_max[MIIWIDTH-1:0] ; + end + 3'b100 : + begin + dest[15:12] <= rxd_r_max[MIIWIDTH-1:0] ; + end + 3'b011 : + begin + dest[23:20] <= rxd_r_max[MIIWIDTH-1:0] ; + end + 3'b010 : + begin + dest[31:28] <= rxd_r_max[MIIWIDTH-1:0] ; + end + 3'b001 : + begin + dest[39:36] <= rxd_r_max[MIIWIDTH-1:0] ; + end + default : + begin + dest[47:44] <= rxd_r_max[MIIWIDTH-1:0] ; + end + endcase + end + end + end + end + + always @(posedge clk) + begin : hash_reg_proc + if (rst) + begin + crchash <= {9{1'b0}} ; + hash <= 1'b0 ; + fdata_r <= {16{1'b0}} ; + end + else + begin + if (fsm == FSM_HASH & flcnt == 3'b000) + begin + crchash <= {crc[23], crc[24], crc[25], crc[26], + crc[27], crc[28], crc[29], crc[30], crc[31]} ; + end + + hash <= fdata_r[crchash[3:0]] ; + + fdata_r <= fdata ; + end + end + + always @(perfm or flcnt or fsm or fdata_r or dest) + begin : perfm_proc + if ((flcnt == 3'b001 & fdata_r != dest[47:32]) | + (flcnt == 3'b000 & fdata_r != dest[31:16]) | + (flcnt == 3'b010 & fdata_r != dest[15:0]) | fsm == FSM_IDLE) + begin + perfm_c <= 1'b0 ; + end + else if (flcnt == 3'b010 & fdata_r == dest[15:0]) + begin + perfm_c <= 1'b1 ; + end + else + begin + perfm_c <= perfm ; + end + end + + always @(posedge clk) + begin : perfm_reg_proc + if (rst) + begin + invm <= 1'b0 ; + perfm <= 1'b0 ; + end + else + begin + perfm <= perfm_c ; + + if (fsm == FSM_IDLE) + begin + invm <= 1'b1 ; + end + else if (flcnt == 3'b001 & perfm_c) + begin + invm <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : fa_reg_proc + if (rst) + begin + flcnt <= {3{1'b0}} ; + fa <= {ADDRDEPTH{1'b0}} ; + end + else + begin + case (fsm) + FSM_PERF1, FSM_PERF16 : + begin + fa <= fa + 1 ; + end + FSM_HASH : + begin + fa[5:0] <= {1'b0, crchash[8:4]} ; + end + default : + begin + if (hp & !(dest[0])) + begin + fa <= PERF1_ADDR ; + end + else + begin + fa <= {ADDRDEPTH{1'b0}} ; + end + end + endcase + + if (fsm_c == FSM_IDLE | + (flcnt == 3'b010 & fsm_c == FSM_PERF16) | + (flcnt == 3'b010 & fsm_c == FSM_PERF1)) + begin + flcnt <= {3{1'b0}} ; + end + else if (fsm == FSM_PERF1 | + fsm == FSM_PERF16 | + fsm == FSM_HASH) + begin + flcnt <= flcnt + 1 ; + end + end + end + + assign faddr = fa ; + + assign matchdata = dest ; + + always @(posedge clk) + begin : matchen_reg_proc + if (rst) + begin + matchen <= 1'b0 ; + end + else + begin + if (fsm == FSM_PERF1 | fsm == FSM_HASH | fsm == FSM_PERF16) + begin + matchen <= 1'b1 ; + end + else + begin + matchen <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : stop_reg_proc + if (rst) + begin + stop_r <= 1'b0 ; + stopo <= 1'b0 ; + end + else + begin + stop_r <= stopi ; + + if (stop_r & rsm == RSM_IDLE_RCSMT) + begin + stopo <= 1'b1 ; + end + else + begin + stopo <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : rcscnt_reg_proc + if (rst) + begin + rcscnt <= {8{1'b0}} ; + rcs <= 1'b0 ; + rcsreq <= 1'b0 ; + rcsack_r <= 1'b0 ; + end + else + begin + if (rcscnt == 8'b00000000) + begin + rcscnt <= 8'b10000000 ; + end + else + begin + rcscnt <= rcscnt - 1 ; + end + + if (rcscnt == 8'b00000000) + begin + rcs <= 1'b1 ; + end + else if (rcsack_r) + begin + rcs <= 1'b0 ; + end + + if (rcs & !rcsack_r) + begin + rcsreq <= 1'b1 ; + end + else if (rcsack_r) + begin + rcsreq <= 1'b0 ; + end + + rcsack_r <= rcsack ; + end + end + + always @(posedge clk) + begin : focnt_reg_proc + if (rst) + begin + focnt <= {11{1'b0}} ; + oco <= 1'b0 ; + focl_r <= 1'b0 ; + focg <= {11{1'b0}} ; + end + else + begin + if (focl_r) + begin + focnt <= {11{1'b0}} ; + end + else if ((rsm == RSM_DEST | + rsm == RSM_SOURCE | + rsm == RSM_LENGTH | + rsm == RSM_INFO | + rsm == RSM_SFD) & + full) + begin + focnt <= focnt + 1 ; + end + + if (focl_r) + begin + oco <= 1'b0 ; + end + else if ((rsm == RSM_DEST | + rsm == RSM_SOURCE | + rsm == RSM_LENGTH | + rsm == RSM_INFO) & + focnt == 11'b11111111111 & + (full | !cachenf_r)) + begin + oco <= 1'b1 ; + end + + focl_r <= focl ; + + focg[10] <= focnt[10] ; + begin : focg_loop + integer i; + for(i = 9; i >= 0; i = i - 1) + begin + focg[i] <= focnt[i] ^ focnt[i + 1] ; + end + end + end + end + + assign foclack = focl_r ; + + always @(posedge clk) + begin : mfcnt_reg_proc + if (rst) + begin + mfcnt <= {16{1'b0}} ; + mfo <= 1'b0 ; + mfcl_r <= 1'b0 ; + mfcg <= {16{1'b0}} ; + end + else + begin + if (mfcl_r) + begin + mfcnt <= {16{1'b0}} ; + end + else if ( + eorfff && + (pb | winp) && + ( + fsm==FSM_MATCH | ra | + ( + pm && dest[0] + ) + ) + ) + begin + mfcnt <= mfcnt + 1'b1 ; + end + + if (mfcl_r) + begin + mfo <= 1'b0 ; + end + else if ( + mfcnt=={16{1'b1}} && pb && + ( + fsm==FSM_MATCH | ra | + ( + pm && dest[0] + ) + ) + ) + begin + mfo <= 1'b1 ; + end + + mfcl_r <= mfcl; + + begin : mfcg_reg_write + integer i; + mfcg[15] <= mfcnt[15]; + for(i = 14; i >= 0; i = i - 1) + begin + mfcg[i] <= mfcnt[i] ^ mfcnt[i + 1]; + end + end + end + end + + assign mfclack = mfcl_r ; + + assign fzero = {FIFODEPTH{1'b0}} ; + + assign mzero_max = {(MIIWIDTH_MAX + 1){1'b0}} ; + + assign rxd_r_max = {mzero_max[MIIWIDTH_MAX + 1:MIIWIDTH], + rxd_r}; + +endmodule + + + +module RFIFO_V ( + clk, + rst, + ramdata, + ramaddr, + fifore, + ffo, + rfo, + mfo, + tlo, + reo, + dbo, + ceo, + ovo, + cso, + flo, + fifodata, + cachere, + cachene, + cachenf, + radg, + rireq, + ffi, + rfi, + mfi, + tli, + rei, + dbi, + cei, + ovi, + csi, + fli, + wadg, + riack + ); + + parameter DATAWIDTH = 32; + parameter DATADEPTH = 32; + parameter FIFODEPTH = 9; + parameter CACHEDEPTH = 2; + + input clk; + input rst; + + input [DATAWIDTH - 1:0] ramdata; + output [FIFODEPTH - 1:0] ramaddr; + wire [FIFODEPTH - 1:0] ramaddr; + + input fifore; + output ffo; + wire ffo; + output rfo; + wire rfo; + output mfo; + wire mfo; + output tlo; + wire tlo; + output reo; + wire reo; + output dbo; + wire dbo; + output ceo; + wire ceo; + output ovo; + wire ovo; + output cso; + wire cso; + output [13:0] flo; + wire [13:0] flo; + output [DATAWIDTH - 1:0] fifodata; + wire [DATAWIDTH - 1:0] fifodata; + + input cachere; + output cachene; + wire cachene; + + output cachenf; + wire cachenf; + output [FIFODEPTH - 1:0] radg; + reg [FIFODEPTH - 1:0] radg; + + input rireq; + input ffi; + input rfi; + input mfi; + input tli; + input rei; + input dbi; + input cei; + input ovi; + input csi; + input [13:0] fli; + input [FIFODEPTH - 1:0] wadg; + output riack; + wire riack; + + + parameter CSWIDTH = 23; + reg [CSWIDTH - 1:0] csmem[(1'b1 << CACHEDEPTH) - 1:0]; + wire cswe; + wire csre; + reg csnf; + reg csne; + reg [CACHEDEPTH - 1:0] cswad; + reg [CACHEDEPTH - 1:0] cswadi; + reg [CACHEDEPTH - 1:0] csrad; + reg [CACHEDEPTH - 1:0] csrad_r; + wire [CSWIDTH - 1:0] csdi; + wire [CSWIDTH - 1:0] csdo; + + reg [FIFODEPTH - 1:0] stat; + reg [FIFODEPTH - 1:0] rad_c; + reg [FIFODEPTH - 1:0] rad; + reg [FIFODEPTH - 1:0] wad_c; + reg [FIFODEPTH - 1:0] wad; + reg [FIFODEPTH - 1:0] wadg_0_r; + reg [FIFODEPTH - 1:0] wadg_r; + reg [13:0] flibin_c; + reg [13:0] flibin; + reg [13:0] fli_r; + + reg rireq_r; + reg iriack; + + wire [FIFODEPTH - 1:0] fzero; + + always @(posedge clk) + begin : csmem_reg_proc + if (rst) + begin : csmem_reset + integer i; + for(i = ((1'b1 << CACHEDEPTH) - 1); i >= 0; i = i - 1) + begin + csmem[i] <= {CSWIDTH{1'b0}}; + end + csrad_r <= csrad ; + end + else + begin + csmem[cswad] <= csdi ; + csrad_r <= csrad ; + end + end + + always @(posedge clk) + begin : cswad_reg_proc + if (rst) + begin + cswad <= {CACHEDEPTH{1'b1}} ; + end + else + begin + if (cswe) + begin + cswad <= cswad + 1 ; + end + end + end + + always @(posedge clk) + begin : csrad_reg_proc + if (rst) + begin + csrad <= {CACHEDEPTH{1'b1}} ; + end + else + begin + if (csre) + begin + csrad <= csrad + 1 ; + end + end + end + + always @(posedge clk) + begin : csne_reg_proc + if (rst) + begin + csne <= 1'b0 ; + end + else + begin + if (cswad == csrad) + begin + csne <= 1'b0 ; + end + else + begin + csne <= 1'b1 ; + end + end + end + + always @(cswad) + begin : cswadi_drv + cswadi <= cswad + 1; + end + + always @(posedge clk) + begin : csnf_reg_proc + if (rst) + begin + csnf <= 1'b0 ; + end + else + begin + if (cswadi == csrad) + begin + csnf <= 1'b0 ; + end + else + begin + csnf <= 1'b1 ; + end + end + end + + always @(fli_r) + begin : flibin_proc + reg[13:0] flibin_v; + flibin_v[13] = fli_r[13]; + begin : flibin_loop + integer i; + for(i = 12; i >= 0; i = i - 1) + begin + flibin_v[i] = flibin_v[i + 1] ^ fli_r[i]; + end + end + flibin_c = flibin_v ; + end + + always @(posedge clk) + begin : flibin_reg_proc + if (rst) + begin + flibin <= {14{1'b0}} ; + fli_r <= {14{1'b0}} ; + end + else + begin + flibin <= flibin_c ; + fli_r <= fli ; + end + end + + assign cachene = csne ; + + assign cachenf = csnf ; + + assign cswe = rireq_r & ~iriack ; + + assign csdo = csmem[csrad_r] ; + + assign csdi = {ffi, rfi, mfi, tli, rei, dbi, cei, ovi, csi, flibin} ; + + assign ffo = csdo[CSWIDTH - 1] ; + + assign rfo = csdo[CSWIDTH - 2] ; + + assign mfo = csdo[CSWIDTH - 3] ; + + assign tlo = csdo[CSWIDTH - 4] ; + + assign reo = csdo[CSWIDTH - 5] ; + + assign dbo = csdo[CSWIDTH - 6] ; + + assign ceo = csdo[CSWIDTH - 7] ; + + assign ovo = csdo[CSWIDTH - 8] ; + + assign cso = csdo[CSWIDTH - 9]; + + assign flo = csdo[13:0] ; + + assign csre = cachere ; + + always @(posedge clk) + begin : rireq_reg_proc + if (rst) + begin + rireq_r <= 1'b0 ; + end + else + begin + rireq_r <= rireq ; + end + end + + always @(posedge clk) + begin : irecack_reg_proc + if (rst) + begin + iriack <= 1'b0 ; + end + else + begin + iriack <= rireq_r ; + end + end + + assign riack = iriack ; + + always @(rad or fifore) + begin : rad_proc + if (fifore) + begin + rad_c <= rad + 1 ; + end + else + begin + rad_c <= rad ; + end + end + + always @(posedge clk) + begin : rad_reg_proc + if (rst) + begin + rad <= {FIFODEPTH{1'b0}} ; + end + else + begin + rad <= rad_c ; + end + end + + always @(posedge clk) + begin : radg_reg_proc + if (rst) + begin + radg <= {FIFODEPTH{1'b0}} ; + end + else + begin + radg[FIFODEPTH - 1] <= rad[FIFODEPTH - 1] ; + begin : radg_loop + integer i; + for(i = FIFODEPTH - 2; i >= 0; i = i - 1) + begin + radg[i] <= rad[i] ^ rad[i + 1] ; + end + end + end + end + + always @(posedge clk) + begin : wadg_reg_proc + if (rst) + begin + wadg_0_r <= {FIFODEPTH{1'b0}} ; + wadg_r <= {FIFODEPTH{1'b0}} ; + end + else + begin + wadg_0_r <= wadg; + wadg_r <= wadg_0_r; + end + end + + always @(wadg_r) + begin : wad_proc + reg[FIFODEPTH - 1:0] wad_v; + wad_v[FIFODEPTH - 1] = wadg_r[FIFODEPTH - 1]; + begin : wad_loop + integer i; + for(i = FIFODEPTH - 2; i >= 0; i = i - 1) + begin + wad_v[i] = wad_v[i + 1] ^ wadg_r[i]; + end + end + wad_c = wad_v ; + end + + always @(posedge clk) + begin : ad_reg_proc + if (rst) + begin + wad <= {FIFODEPTH{1'b0}} ; + end + else + begin + wad <= wad_c ; + end + end + + always @(posedge clk) + begin : stat_reg_proc + if (rst) + begin + stat <= {FIFODEPTH{1'b0}} ; + end + else + begin + stat <= wad - rad ; + end + end + + assign ramaddr = rad_c ; + + assign fifodata = ramdata ; + + + assign fzero = {FIFODEPTH{1'b0}}; + +endmodule + + + +module RLSM_V ( + clk, + rst, + fifodata, + fifore, + cachere, + dmaack, + dmaeob, + dmadatai, + dmaaddr, + dmareq, + dmawr, + dmacnt, + dmaaddro, + dmadatao, + rprog, + rcpoll, + fifocne, + ff, + rf, + mf, + db, + re, + ce, + tl, + ftp, + ov, + cs, + length, + pbl, + dsl, + rpoll, + rdbadc, + rdbad, + rpollack, + rcompack, + bufack, + des, + fbuf, + stat, + ru, + rcomp, + bufcomp, + stopi, + stopo + ); + + parameter DATAWIDTH = 32; + parameter DATADEPTH = 32; + parameter FIFODEPTH = 9; + + `include "utility.v" + + input clk; + input rst; + + input [DATAWIDTH - 1:0] fifodata; + output fifore; + wire fifore; + output cachere; + wire cachere; + + input dmaack; + input dmaeob; + input [DATAWIDTH - 1:0] dmadatai; + input [DATADEPTH - 1:0] dmaaddr; + output dmareq; + wire dmareq; + output dmawr; + wire dmawr; + output [FIFODEPTH_MAX - 1:0] dmacnt; + reg [FIFODEPTH_MAX - 1:0] dmacnt; + output [DATADEPTH - 1:0] dmaaddro; + reg [DATADEPTH - 1:0] dmaaddro; + output [DATAWIDTH - 1:0] dmadatao; + reg [DATAWIDTH - 1:0] dmadatao; + + input rprog; + input rcpoll; + input fifocne; + input ff; + input rf; + input mf; + input db; + input re; + input ce; + input tl; + input ftp; + input ov; + input cs; + input [13:0] length; + + input [5:0] pbl; + input [4:0] dsl; + input rpoll; + input rdbadc; + input [DATADEPTH - 1:0] rdbad; + output rpollack; + reg rpollack; + + input rcompack; + input bufack; + output des; + reg des; + output fbuf; + reg fbuf; + output stat; + reg stat; + output ru; + reg ru; + output rcomp; + reg rcomp; + output bufcomp; + reg bufcomp; + + input stopi; + output stopo; + reg stopo; + + + + reg [3:0] lsm_c; + reg [3:0] lsm; + reg [3:0] lsm_r; + reg own_c; + reg own; + reg rch; + reg rer; + reg rls; + reg rfs; + reg rde; + wire res_c; + reg [10:0] bs1; + reg [10:0] bs2; + + reg adwrite; + reg [DATADEPTH - 1:0] bad; + reg [DATADEPTH - 1:0] dad; + reg [10:0] bcnt; + reg [DATADEPTH - 1:0] statad; + reg [DATADEPTH - 1:0] tstatad; + reg dbadc_r; + + reg req_c; + reg req; + wire [2:0] dmaaddr20; + wire [1:0] addr10; + reg [DATADEPTH_MAX - 1:0] dataimax_r; + wire [31:0] fstat; + + reg rprog_r; + reg rcpoll_r; + reg rcpoll_r2; + reg whole; + + reg [13:0] fifolev_r; + reg [13:0] fbcnt; + reg [13:0] fbcnt_c; + reg [13:0] length_r; + wire ififore; + reg ififore_r; + reg icachere; + wire [FIFODEPTH_MAX - 1:0] bsmax; + wire [FIFODEPTH_MAX - 1:0] flmax; + wire [FIFODEPTH_MAX - 1:0] blmax; + reg fl_g_16; + reg fl_g_bs; + reg fl_g_bl; + reg bl_g_bs; + reg pblz; + + reg stop_r; + + wire [FIFODEPTH_MAX - 1:0] fzero_max; + wire [DATAWIDTH_MAX + 1:0] dmadatai_max; + wire [DATAWIDTH_MAX + 1:0] dzero_max; + + always @(posedge clk) + begin : dataimax_reg_proc + if (rst) + begin + dataimax_r <= {DATADEPTH_MAX{1'b1}} ; + end + else + begin + case (DATAWIDTH) + 8 : + begin + case (dmaaddr20) + 3'b000, 3'b100 : + begin + dataimax_r[7:0] <= dmadatai_max[DATAWIDTH-1:0] ; + end + 3'b001, 3'b101 : + begin + dataimax_r[15:8] <= dmadatai_max[DATAWIDTH-1:0] ; + end + 3'b010, 3'b110 : + begin + dataimax_r[23:16] <= dmadatai_max[DATAWIDTH-1:0] ; + end + default : + begin + dataimax_r[31:24] <= dmadatai_max[DATAWIDTH-1:0] ; + end + endcase + end + 16 : + begin + if (!(dmaaddr[1])) + begin + dataimax_r[15:0] <= dmadatai_max[DATAWIDTH-1:0] ; + end + else + begin + dataimax_r[31:16] <= dmadatai_max[DATAWIDTH-1:0] ; + end + end + default : + begin + dataimax_r <= dmadatai_max[31:0] ; + end + endcase + end + end + + always @(posedge clk) + begin : fifolev_reg_proc + if (rst) + begin + length_r <= {14{1'b0}} ; + fifolev_r <= {14{1'b0}} ; + fl_g_bs <= 1'b0 ; + fl_g_16 <= 1'b0 ; + fl_g_bl <= 1'b0 ; + bl_g_bs <= 1'b0 ; + pblz <= 1'b0 ; + end + else + begin + length_r <= length; + + fifolev_r <= length_r - fbcnt_c ; + + if (flmax >= bsmax) + begin + fl_g_bs <= 1'b1 ; + end + else + begin + fl_g_bs <= 1'b0 ; + end + + case (DATAWIDTH) + 8 : + begin + if (flmax > ({fzero_max[FIFODEPTH_MAX - 1:6], + 6'b111111})) + begin + fl_g_16 <= 1'b1 ; + end + else + begin + fl_g_16 <= 1'b0 ; + end + end + 16 : + begin + if (flmax > ({fzero_max[FIFODEPTH_MAX - 1:5], + 5'b11111})) + begin + fl_g_16 <= 1'b1 ; + end + else + begin + fl_g_16 <= 1'b0 ; + end + end + default : + begin + if (flmax > ({fzero_max[FIFODEPTH_MAX - 1:4], + 4'b1111})) + begin + fl_g_16 <= 1'b1 ; + end + else + begin + fl_g_16 <= 1'b0 ; + end + end + endcase + + if (flmax >= (blmax + 1'b1)) + begin + fl_g_bl <= 1'b1 ; + end + else + begin + fl_g_bl <= 1'b0 ; + end + + if (blmax >= bsmax) + begin + bl_g_bs <= 1'b1 ; + end + else + begin + bl_g_bs <= 1'b0 ; + end + + if (pbl == 6'b000000) + begin + pblz <= 1'b1 ; + end + else + begin + pblz <= 1'b0 ; + end + end + end + + assign flmax = (DATAWIDTH == 8) ? {fzero_max[FIFODEPTH_MAX - 1:14], + fifolev_r} : + (DATAWIDTH == 16) ? {fzero_max[FIFODEPTH_MAX - 1:13], + fifolev_r[13:1]} : + {fzero_max[FIFODEPTH_MAX - 1:12], + fifolev_r[13:2]} ; + + assign blmax = {fzero_max[FIFODEPTH_MAX - 1:6], pbl} ; + + assign bsmax = (DATAWIDTH == 8) ? {fzero_max[FIFODEPTH_MAX - 1:11], + bcnt} : + (DATAWIDTH == 16) ? {fzero_max[FIFODEPTH_MAX - 1:10], + bcnt[10:1]} : + {fzero_max[FIFODEPTH_MAX - 1:9], + bcnt[10:2]} ; + + always @(lsm or + fl_g_bs or + fl_g_bl or + bl_g_bs or + pblz or + blmax or + bsmax or + flmax or + fzero_max) + begin : dmacnt_proc + if (lsm == LSM_DES0 | + lsm == LSM_DES1 | + lsm == LSM_DES2 | + lsm == LSM_DES3 | + lsm == LSM_STAT | + lsm == LSM_FSTAT | + lsm == LSM_DES0P) + begin + case (DATAWIDTH) + 8 : + begin + dmacnt <= {fzero_max[FIFODEPTH_MAX - 1:3], 3'b100} ; + end + 16 : + begin + dmacnt <= {fzero_max[FIFODEPTH_MAX - 1:3], 3'b010} ; + end + default : + begin + dmacnt <= {fzero_max[FIFODEPTH_MAX - 1:3], 3'b001} ; + end + endcase + end + else + begin + if (pblz) + begin + if (fl_g_bs) + begin + dmacnt <= bsmax ; + end + else + begin + dmacnt <= flmax ; + end + end + else + begin + if (fl_g_bl) + begin + if (bl_g_bs) + begin + dmacnt <= bsmax ; + end + else + begin + dmacnt <= blmax ; + end + end + else + begin + if (fl_g_bs) + begin + dmacnt <= bsmax ; + end + else + begin + dmacnt <= flmax ; + end + end + end + end + end + + always @(req or + lsm or + lsm_c or + fifocne or + fl_g_bl or + fl_g_16 or + pblz or + whole or + rprog_r or + dmaack or + dmaeob or + flmax or + fzero_max) + begin : req_proc + case (lsm) + LSM_BUF1, LSM_BUF2 : + begin + if ((dmaack & dmaeob) | lsm_c==LSM_NXT) + begin + req_c <= 1'b0 ; + end + else if (fifocne | (rprog_r & ((fl_g_bl & !pblz) | + (fl_g_16 & pblz)))) + begin + req_c <= 1'b1 ; + end + else + begin + req_c <= req ; + end + end + LSM_DES0, LSM_DES1, LSM_DES2, + LSM_DES3, LSM_STAT, LSM_DES0P : + begin + if (dmaack) + begin + req_c <= 1'b0 ; + end + else + begin + req_c <= 1'b1 ; + end + end + LSM_FSTAT : + begin + if (dmaack | !whole | + (DATAWIDTH == 8 & flmax[1:0] != fzero_max[1:0]) + | + (DATAWIDTH == 16 & flmax[ 1] != fzero_max[1])) + begin + req_c <= 1'b0 ; + end + else + begin + req_c <= 1'b1 ; + end + end + default : + begin + req_c <= 1'b0 ; + end + endcase + end + + always @(posedge clk) + begin : req_reg_proc + if (rst) + begin + req <= 1'b0 ; + end + else + begin + req <= req_c ; + end + end + + always @(lsm or bad or dad or statad) + begin : dmaaddro_proc + case (lsm) + LSM_BUF1, LSM_BUF2 : + begin + dmaaddro <= bad ; + end + LSM_STAT, LSM_FSTAT : + begin + dmaaddro <= statad ; + end + default : + begin + dmaaddro <= dad ; + end + endcase + end + + assign fstat = {1'b0, ff, length, res_c, rde, + RDES0_RV[13:12], rf, mf, rfs, rls, tl, + cs, ftp, RDES0_RV[4], re, db, ce, ov} ; + + assign dmawr = (lsm == LSM_STAT | + lsm == LSM_FSTAT | + lsm == LSM_BUF1 | + lsm == LSM_BUF2) ? 1'b1 : 1'b0 ; + + always @(fifodata or lsm or addr10 or fstat) + begin : dmadatao_proc + if (lsm == LSM_BUF1 | lsm == LSM_BUF2) + begin + dmadatao <= fifodata ; + end + else + begin + case (DATAWIDTH) + 8 : + begin + case (addr10) + 2'b00 : + begin + dmadatao <= fstat[7:0] ; + end + 2'b01 : + begin + dmadatao <= fstat[15:8] ; + end + 2'b10 : + begin + dmadatao <= fstat[23:16] ; + end + default : + begin + dmadatao <= fstat[31:24] ; + end + endcase + end + 16 : + begin + if (addr10 == 2'b00) + begin + dmadatao <= fstat[15:0] ; + end + else + begin + dmadatao <= fstat[31:16] ; + end + end + default : + begin + dmadatao <= fstat ; + end + endcase + end + end + + assign dmareq = req ; + + always @(lsm or + rcpoll_r or + rcpoll_r2 or + rpoll or + dmaack or + dmaeob or + own_c or + bs1 or + bs2 or + whole or + rch or + stop_r or + own or + bcnt or + dbadc_r) + begin : lsm_proc + case (lsm) + LSM_IDLE : + begin + if (!dbadc_r & !stop_r & ((rcpoll_r & !rcpoll_r2) | rpoll)) + begin + lsm_c <= LSM_DES0 ; + end + else + begin + lsm_c <= LSM_IDLE ; + end + end + LSM_DES0 : + begin + if (dmaack & dmaeob) + begin + if (own_c) + begin + lsm_c <= LSM_DES1 ; + end + else + begin + lsm_c <= LSM_IDLE ; + end + end + else + begin + lsm_c <= LSM_DES0 ; + end + end + LSM_DES0P : + begin + if (dmaack & dmaeob) + begin + if (!own_c | whole) + begin + lsm_c <= LSM_FSTAT ; + end + else + begin + lsm_c <= LSM_STAT ; + end + end + else + begin + lsm_c <= LSM_DES0P ; + end + end + LSM_DES1 : + begin + if (dmaack & dmaeob) + begin + lsm_c <= LSM_DES2 ; + end + else + begin + lsm_c <= LSM_DES1 ; + end + end + LSM_DES2 : + begin + if (dmaack & dmaeob) + begin + if (bs1 == 11'b00000000000) + begin + lsm_c <= LSM_DES3 ; + end + else + begin + lsm_c <= LSM_BUF1 ; + end + end + else + begin + lsm_c <= LSM_DES2 ; + end + end + LSM_DES3 : + begin + if (dmaack & dmaeob) + begin + if (bs2 != 11'b00000000000 & !rch) + begin + lsm_c <= LSM_BUF2 ; + end + else + begin + lsm_c <= LSM_NXT ; + end + end + else + begin + lsm_c <= LSM_DES3 ; + end + end + LSM_BUF1 : + begin + if (whole | bcnt == 11'b00000000000) + begin + lsm_c <= LSM_DES3 ; + end + else if(dbadc_r) + begin + lsm_c <= LSM_IDLE ; + end + else + begin + lsm_c <= LSM_BUF1 ; + end + end + LSM_BUF2 : + begin + if (whole | bcnt == 11'b00000000000) + begin + lsm_c <= LSM_NXT ; + end + else if(dbadc_r) + begin + lsm_c <= LSM_IDLE ; + end + else + begin + lsm_c <= LSM_BUF2 ; + end + end + LSM_NXT : + begin + if (whole) + begin + if (stop_r) + begin + lsm_c <= LSM_FSTAT ; + end + else + begin + lsm_c <= LSM_DES0P ; + end + end + else + begin + lsm_c <= LSM_DES0P ; + end + end + LSM_STAT : + begin + if (dmaack & dmaeob) + begin + lsm_c <= LSM_DES1 ; + end + else + begin + lsm_c <= LSM_STAT ; + end + end + default : + begin + if (dmaack & dmaeob) + begin + if (own & !stop_r) + begin + lsm_c <= LSM_DES1 ; + end + else + begin + lsm_c <= LSM_IDLE ; + end + end + else + begin + lsm_c <= LSM_FSTAT ; + end + end + endcase + end + + always @(posedge clk) + begin : rlsm_reg_proc + if (rst) + begin + lsm <= LSM_IDLE ; + lsm_r <= LSM_IDLE ; + end + else + begin + lsm <= lsm_c ; + lsm_r <= lsm ; + end + end + + always @(posedge clk) + begin : rpollack_reg_proc + if (rst) + begin + rpollack <= 1'b0 ; + end + else + begin + if (rpoll & !dbadc_r) + begin + rpollack <= 1'b1 ; + end + else if (!rpoll) + begin + rpollack <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : bcnt_reg_proc + if (rst) + begin + bcnt <= {11{1'b1}} ; + end + else + begin + if (lsm == LSM_DES2) + begin + bcnt <= bs1 ; + end + else if (lsm == LSM_DES3) + begin + bcnt <= bs2 ; + end + else + begin + if (dmaack) + begin + case (DATAWIDTH) + 8 : + begin + bcnt <= bcnt - 1 ; + end + 16 : + begin + bcnt <= {(bcnt[10:1] - 1), 1'b0} ; + end + default : + begin + bcnt <= {(bcnt[10:2] - 1), 2'b00} ; + end + endcase + end + end + end + end + + always @(own or + dmaack or + dmaeob or + lsm or + dmadatai_max) + begin : own_proc + if (dmaack & dmaeob & (lsm == LSM_DES0 | lsm == LSM_DES0P)) + begin + own_c <= dmadatai_max[DATAWIDTH - 1] ; + end + else + begin + own_c <= own ; + end + end + + always @(posedge clk) + begin : des1_reg_proc + reg ft22; + if (rst) + begin + rer <= 1'b0 ; + rch <= 1'b0 ; + bs2 <= {11{1'b0}} ; + bs1 <= {11{1'b0}} ; + end + else + begin + if (lsm == LSM_DES1 & dmaack) + begin + case (DATAWIDTH) + 8 : + begin + case (dmaaddr20) + 3'b000, 3'b100 : + begin + bs1[7:0] <= dmadatai_max[7:0] ; + end + 3'b001, 3'b101 : + begin + bs1[10:8] <= dmadatai_max[2:0] ; + bs2[4:0] <= dmadatai_max[7:3] ; + end + 3'b010, 3'b110 : + begin + bs2[10:5] <= dmadatai_max[5:0] ; + end + default : + begin + rer <= dmadatai_max[1] ; + rch <= dmadatai_max[0] ; + end + endcase + end + 16 : + begin + case (dmaaddr20) + 3'b000, 3'b100 : + begin + bs1[10:0] <= dmadatai_max[10:0] ; + bs2[4:0] <= dmadatai_max[15:11] ; + end + default : + begin + bs2[10:5] <= dmadatai_max[5:0] ; + rer <= dmadatai_max[9] ; + rch <= dmadatai_max[8] ; + end + endcase + end + default : + begin + rer <= dmadatai_max[25] ; + rch <= dmadatai_max[24] ; + bs2 <= dmadatai_max[21:11] ; + bs1 <= dmadatai_max[10:0] ; + end + endcase + end + end + end + + always @(posedge clk) + begin : rdes_reg_proc + if (rst) + begin + own <= 1'b0 ; + rfs <= 1'b1 ; + rls <= 1'b0 ; + rde <= 1'b0 ; + end + else + begin + if (lsm == LSM_FSTAT & dmaack & dmaeob) + begin + rfs <= 1'b1 ; + end + else if (lsm == LSM_STAT & dmaack & dmaeob) + begin + rfs <= 1'b0 ; + end + + if (lsm == LSM_FSTAT) + begin + rls <= 1'b1 ; + end + else + begin + rls <= 1'b0 ; + end + + if (lsm == LSM_FSTAT & !whole) + begin + rde <= 1'b1 ; + end + else if (lsm == LSM_IDLE) + begin + rde <= 1'b0 ; + end + + own <= own_c ; + end + end + + assign res_c = rf | ce | rde | cs | tl ; + + always @(posedge clk) + begin : adwrite_reg_proc + if (rst) + begin + adwrite <= 1'b0 ; + dbadc_r <= 1'b0 ; + end + else + begin + if (dmaack & dmaeob) + begin + adwrite <= 1'b1 ; + end + else + begin + adwrite <= 1'b0 ; + end + + dbadc_r <= rdbadc ; + end + end + + always @(posedge clk) + begin : dad_reg_proc + if (rst) + begin + dad <= {DATADEPTH{1'b1}} ; + end + else + begin + if (dbadc_r) + begin + dad <= rdbad ; + end + else if (adwrite & lsm == LSM_NXT & rch) + begin + dad <= dataimax_r[DATADEPTH - 1:0] ; + end + else if (adwrite) + begin + case (lsm_r) + LSM_DES3 : + begin + if (rer) + begin + dad <= rdbad ; + end + else + begin + dad <= dmaaddr + ({dsl, 2'b00}) ; + end + end + LSM_DES0, LSM_DES0P : + begin + if (own) + begin + dad <= dmaaddr ; + end + end + LSM_DES2 : + begin + dad <= dmaaddr ; + end + LSM_DES1 : + begin + dad <= dmaaddr ; + end + LSM_FSTAT : + begin + dad <= (lsm == LSM_IDLE) ? rdbad : dad; + end + default : + begin + dad <= dad ; + end + endcase + end + end + end + + always @(posedge clk) + begin : bad_reg_proc + if (rst) + begin + bad <= {DATADEPTH{1'b1}} ; + end + else + begin + if (adwrite) + begin + if (lsm_r == LSM_BUF1 | lsm_r == LSM_BUF2) + begin + bad <= dmaaddr ; + end + else + begin + bad <= dataimax_r[DATADEPTH - 1:0] ; + end + end + end + end + + always @(posedge clk) + begin : stataddr_reg_proc + if (rst) + begin + tstatad <= {DATADEPTH{1'b1}} ; + statad <= {DATADEPTH{1'b1}} ; + end + else + begin + if (lsm == LSM_DES1 & adwrite) + begin + statad <= tstatad ; + end + + if ((lsm == LSM_DES0 | lsm == LSM_DES0P) & dmaack & dmaeob) + begin + tstatad <= dad ; + end + end + end + + always @(fbcnt or icachere or ififore) + begin : fbcnt_proc + if (icachere) + begin + fbcnt_c <= {14{1'b0}} ; + end + else + begin + if (ififore) + begin + case (DATAWIDTH) + 8 : + begin + fbcnt_c <= fbcnt + 1 ; + end + 16 : + begin + fbcnt_c <= fbcnt + 2'b10 ; + end + default : + begin + fbcnt_c <= fbcnt + 3'b100 ; + end + endcase + end + else + begin + fbcnt_c <= fbcnt; + end + end + end + + always @(posedge clk) + begin : fbcnt_reg_proc + if(rst) + begin + fbcnt <= {14{1'b0}}; + end + else + begin + fbcnt <= fbcnt_c; + end + end + + always @(fbcnt or length or fifocne) + begin : whole_proc + if (fbcnt >= length & fifocne) + begin + whole <= 1'b1 ; + end + else + begin + whole <= 1'b0 ; + end + end + + assign ififore = (((lsm == LSM_BUF1 | lsm == LSM_BUF2) & dmaack) | + (lsm == LSM_FSTAT & !whole & + flmax != fzero_max[14:0] & !ififore_r) | + (lsm == LSM_FSTAT & !whole & + fifocne & !ififore_r)) ? 1'b1 : 1'b0 ; + + always @(posedge clk) + begin : ififore_reg_proc + if (rst) + begin + ififore_r <= 1'b0 ; + icachere <= 1'b0 ; + end + else + begin + ififore_r <= ififore ; + + if (lsm == LSM_FSTAT & dmaack & dmaeob) + begin + icachere <= 1'b1 ; + end + else + begin + icachere <= 1'b0 ; + end + end + end + + assign fifore = ififore ; + + assign cachere = icachere ; + + always @(posedge clk) + begin : rprog_reg_proc + if (rst) + begin + rprog_r <= 1'b0 ; + rcpoll_r <= 1'b0 ; + rcpoll_r2 <= 1'b0 ; + end + else + begin + rprog_r <= rprog ; + rcpoll_r <= rcpoll ; + if (lsm == LSM_IDLE) + begin + rcpoll_r2 <= rcpoll_r ; + end + end + end + + always @(posedge clk) + begin : stat_reg_drv + if (rst) + begin + des <= 1'b0 ; + fbuf <= 1'b0 ; + stat <= 1'b0 ; + rcomp <= 1'b0 ; + bufcomp <= 1'b0 ; + ru <= 1'b0 ; + end + else + begin + if (lsm == LSM_DES0 | + lsm == LSM_DES1 | + lsm == LSM_DES2 | + lsm == LSM_DES3 | + lsm == LSM_DES0P) + begin + des <= 1'b1 ; + end + else + begin + des <= 1'b0 ; + end + + if ((lsm == LSM_BUF1 | lsm == LSM_BUF2) & req) + begin + fbuf <= 1'b1 ; + end + else + begin + fbuf <= 1'b0 ; + end + + if (lsm == LSM_STAT | lsm == LSM_FSTAT) + begin + stat <= 1'b1 ; + end + else + begin + stat <= 1'b0 ; + end + + if (lsm == LSM_FSTAT & dmaack & dmaeob) + begin + rcomp <= 1'b1 ; + end + else if (rcompack) + begin + rcomp <= 1'b0 ; + end + + if (lsm == LSM_STAT & dmaack & dmaeob) + begin + bufcomp <= 1'b1 ; + end + else if (bufack) + begin + bufcomp <= 1'b0 ; + end + + if (own & !own_c) + begin + ru <= 1'b1 ; + end + else if (own) + begin + ru <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : stop_reg_proc + if (rst) + begin + stop_r <= 1'b1 ; + stopo <= 1'b1 ; + end + else + begin + stop_r <= stopi ; + + if (stop_r & (lsm == LSM_IDLE | + ((lsm == LSM_BUF1 | lsm == LSM_BUF2) & + !fifocne & !rprog_r))) + begin + stopo <= 1'b1 ; + end + else + begin + stopo <= 1'b0 ; + end + end + end + + assign dzero_max = {DATAWIDTH_MAX{1'b0}} ; + + assign fzero_max = {FIFODEPTH_MAX{1'b0}} ; + + assign dmadatai_max = {dzero_max[DATAWIDTH_MAX+1:DATAWIDTH], + dmadatai}; + + assign dmaaddr20 = dmaaddr[2:0] ; + + assign addr10 = dmaaddr[1:0] ; + +endmodule + + + +module RSTC_V ( + clkdma, + clkcsr, + clkt, + clkr, + rstcsr, + rstsoft, + rsttc, + rstrc, + rstdmao, + rstcsro + ); + + input clkdma; + input clkcsr; + input clkt; + input clkr; + + input rstcsr; + input rstsoft; + output rsttc; + reg rsttc; + output rstrc; + reg rstrc; + output rstdmao; + reg rstdmao; + output rstcsro; + reg rstcsro; + + + reg rstsoft_rc1; + reg rstsoft_rc2; + reg rstsoft_rc3; + reg rstsoft_tc1; + reg rstsoft_tc2; + reg rstsoft_tc3; + reg rstsoft_dma1; + reg rstsoft_dma2; + reg rstsoft_dma3; + reg rstsoft_csr; + reg rstsoft_dma_csr1; + reg rstsoft_dma_csr2; + reg rstsoft_rc_csr1; + reg rstsoft_rc_csr2; + reg rstsoft_tc_csr1; + reg rstsoft_tc_csr2; + reg rstcsr_r1; + reg rstcsr_r2; + reg rstcsr_tc1; + reg rstcsr_tc2; + reg rstcsr_rc1; + reg rstcsr_rc2; + reg rstcsr_dma1; + reg rstcsr_dma2; + + + always @(posedge clkcsr) + begin : rstsoft_csr_reg_proc + if (rstcsr_r2) + begin + rstsoft_csr <= 1'b0 ; + rstsoft_dma_csr1 <= 1'b0 ; + rstsoft_dma_csr2 <= 1'b0 ; + rstsoft_tc_csr1 <= 1'b0 ; + rstsoft_tc_csr2 <= 1'b0 ; + rstsoft_rc_csr1 <= 1'b0 ; + rstsoft_rc_csr2 <= 1'b0 ; + end + else + begin + if (rstsoft) + begin + rstsoft_csr <= 1'b1 ; + end + else if (rstsoft_rc_csr2 & rstsoft_tc_csr2 & rstsoft_dma_csr2) + begin + rstsoft_csr <= 1'b0 ; + end + rstsoft_dma_csr1 <= rstsoft_dma3; + rstsoft_dma_csr2 <= rstsoft_dma_csr1; + rstsoft_tc_csr1 <= rstsoft_tc3; + rstsoft_tc_csr2 <= rstsoft_tc_csr1; + rstsoft_rc_csr1 <= rstsoft_rc3; + rstsoft_rc_csr2 <= rstsoft_rc_csr1; + end + end + + always @(posedge clkcsr) + begin : rstcsro_reg_proc + rstcsr_r1 <= rstcsr; + rstcsr_r2 <= rstcsr_r1; + rstcsro <= rstcsr_r2 | rstsoft_csr; + end + + always @(posedge clkr) + begin : rstrc_reg_proc + rstcsr_rc1 <= rstcsr; + rstcsr_rc2 <= rstcsr_rc1; + rstsoft_rc1 <= rstsoft_csr; + rstsoft_rc2 <= rstsoft_rc1; + rstsoft_rc3 <= rstsoft_rc2; + rstrc <= rstcsr_rc2 | rstsoft_rc2; + end + + always @(posedge clkt) + begin : rsttc_proc + rstcsr_tc1 <= rstcsr; + rstcsr_tc2 <= rstcsr_tc1; + rstsoft_tc1 <= rstsoft_csr; + rstsoft_tc2 <= rstsoft_tc1; + rstsoft_tc3 <= rstsoft_tc2; + rsttc <= rstcsr_tc2 | rstsoft_tc2; + end + + always @(posedge clkdma) + begin : rstdma_reg_proc + rstcsr_dma1 <= rstcsr; + rstcsr_dma2 <= rstcsr_dma1; + rstsoft_dma1 <= rstsoft_csr; + rstsoft_dma2 <= rstsoft_dma1; + rstsoft_dma3 <= rstsoft_dma2; + rstdmao <= rstcsr_dma2 | rstsoft_dma2; + end + +endmodule + +module TC_V ( + clk, + rst, + txen, + txer, + txd, + ramdata, + ramaddr, + wadg, + radg, + dpd, + ac, + sofreq, + eofreq, + tiack, + lastbe, + eofadg, + tireq, + ur, + de, + coll, + carrier, + bkoff, + tpend, + tprog, + preamble, + stopi, + stopo, + tcsack, + tcsreq + ); + + parameter FIFODEPTH = 9; + parameter DATAWIDTH = 32; + + `include "utility.v" + + input clk; + input rst; + + output txen; + reg txen; + output txer; + wire txer; + output [MIIWIDTH - 1:0] txd; + reg [MIIWIDTH - 1:0] txd; + + input [DATAWIDTH - 1:0] ramdata; + output [FIFODEPTH - 1:0] ramaddr; + wire [FIFODEPTH - 1:0] ramaddr; + + input [FIFODEPTH - 1:0] wadg; + output [FIFODEPTH - 1:0] radg; + wire [FIFODEPTH - 1:0] radg; + + input dpd; + input ac; + input sofreq; + input eofreq; + input tiack; + input [DATAWIDTH / 8 - 1:0] lastbe; + input [FIFODEPTH - 1:0] eofadg; + output tireq; + reg tireq; + output ur; + wire ur; + output de; + reg de; + + input coll; + input carrier; + input bkoff; + output tpend; + wire tpend; + output tprog; + reg tprog; + output preamble; + reg preamble; + + input stopi; + output stopo; + reg stopo; + + input tcsack; + output tcsreq; + reg tcsreq; + + + reg re_c; + reg re; + reg empty_c; + reg empty; + reg [FIFODEPTH - 1:0] rad_r; + reg [FIFODEPTH - 1:0] rad; + reg [FIFODEPTH - 1:0] iradg; + reg [FIFODEPTH - 1:0] wadg_0_r; + reg [FIFODEPTH - 1:0] iwadg; + reg [FIFODEPTH - 1:0] iwad_c; + reg [FIFODEPTH - 1:0] iwad; + reg [FIFODEPTH - 1:0] sofad; + reg [FIFODEPTH - 1:0] eofadg_r; + reg sofreq_r; + reg eofreq_r; + reg whole; + reg eof; + reg [DATAWIDTH - 1:0] ramdata_r; + + reg [MIIWIDTH - 1:0] itxd0; + reg [DATAWIDTH - 1:0] pmux; + reg [DATAWIDTH - 1:0] datamux_c; + wire [DATAWIDTH_MAX + 1:0] datamux_c_max; + reg txen1; + reg txen_rise; + reg [MIIWIDTH - 1:0] txd_rise; + + reg [3:0] tsm_c; + reg [3:0] tsm; + reg nset; + reg [3:0] ncnt; + wire [1:0] ncnt10; + wire [2:0] ncnt20; + reg [6:0] brel; + reg bset; + reg [6:0] bcnt; + reg bz; + reg nopad; + reg crcgen; + reg crcsend; + reg [31:0] crc_c; + reg [31:0] crc; + reg [31:0] crcneg_c; + reg itprog; + reg itpend; + reg iur; + reg iti; + reg tiack_r; + reg [3:0] ifscnt; + + reg tcsack_r; + reg [7:0] tcscnt; + reg tcs; + + reg ifs1p; + reg ifs2p; + wire defer; + + reg bkoff_r; + + reg stop_r; + wire [3:0] hnibble; + wire [MIIWIDTH_MAX + 1:0] itxd0_max; + wire [MIIWIDTH_MAX + 1:0] itxd0zero_max; + wire [DATAWIDTH_MAX + 1:0] dzero_max; + + always @(posedge clk) + begin : faddr_reg_proc + if (rst) + begin + rad <= {FIFODEPTH{1'b0}} ; + rad_r <= {FIFODEPTH{1'b0}} ; + iradg <= {FIFODEPTH{1'b0}} ; + sofad <= {FIFODEPTH{1'b0}} ; + eofadg_r <= {FIFODEPTH{1'b0}} ; + iwad <= {FIFODEPTH{1'b0}} ; + wadg_0_r <= {FIFODEPTH{1'b0}} ; + iwadg <= {FIFODEPTH{1'b0}} ; + end + else + begin + if (bkoff_r) + begin + rad <= sofad ; + end + else if (re_c) + begin + rad <= rad + 1 ; + end + else if (eof & tsm == TSM_FLUSH) + begin + rad <= iwad ; + end + + rad_r <= rad ; + + iradg <= rad ^ {1'b0, rad[FIFODEPTH - 1:1]} ; + + if (tsm == TSM_IDLE_TCSMT) + begin + sofad <= rad_r ; + end + + eofadg_r <= eofadg ; + + iwad <= iwad_c ; + + wadg_0_r <= wadg; + if (eofreq_r) + begin + iwadg <= eofadg_r ; + end + else + begin + iwadg <= wadg_0_r ; + end + end + end + + always @(iwadg) + begin : iwad_proc + reg[FIFODEPTH - 1:0] wad_v; + wad_v[FIFODEPTH - 1] = iwadg[FIFODEPTH - 1]; + begin : iwad_loop + integer i; + for(i = FIFODEPTH - 2; i >= 0; i = i - 1) + begin + wad_v[i] = wad_v[i + 1] ^ iwadg[i]; + end + end + iwad_c = wad_v ; + end + + always @(rad or iwad) + begin : empty_proc + if (rad == iwad) + begin + empty_c <= 1'b1 ; + end + else + begin + empty_c <= 1'b0 ; + end + end + + always @(posedge clk) + begin : empty_reg_proc + if (rst) + begin + empty <= 1'b1 ; + end + else + begin + empty <= empty_c ; + end + end + + always @(tsm or empty_c or ncnt) + begin : re_proc + if ((tsm == TSM_INFO | + tsm == TSM_SFD | + tsm == TSM_FLUSH) & !empty_c & + ((DATAWIDTH == 8 & !(ncnt[0])) | + (DATAWIDTH == 16 & ncnt[1:0] == 2'b10) | + (DATAWIDTH == 32 & ncnt[2:0] == 3'b110))) + begin + re_c <= 1'b1 ; + end + else + begin + re_c <= 1'b0 ; + end + end + + always @(posedge clk) + begin : re_reg_proc + if (rst) + begin + re <= 1'b0 ; + end + else + begin + re <= re_c ; + end + end + + assign ramaddr = rad ; + + assign radg = iradg ; + + always @(posedge clk) + begin : whole_reg_proc + if (rst) + begin + whole <= 1'b0 ; + end + else + begin + if (iti) + begin + whole <= 1'b0 ; + end + else if (eofreq_r) + begin + whole <= 1'b1 ; + end + end + end + + always @(posedge clk) + begin : se_reg_proc + if (rst) + begin + sofreq_r <= 1'b0 ; + eofreq_r <= 1'b0 ; + end + else + begin + sofreq_r <= sofreq ; + eofreq_r <= eofreq ; + end + end + + always @(tsm or + itpend or + bkoff_r or + defer or bz or + ncnt or dpd or + iur or + hnibble or + ac or + empty or + whole or + tiack_r or + nopad or + coll or + eof) + begin : tsm_proc + case (tsm) + TSM_IDLE_TCSMT : + begin + if (itpend & !bkoff_r & !defer) + begin + tsm_c <= TSM_PREA ; + end + else + begin + tsm_c <= TSM_IDLE_TCSMT ; + end + end + TSM_PREA : + begin + if (bz & (ncnt[0])) + begin + tsm_c <= TSM_SFD ; + end + else + begin + tsm_c <= TSM_PREA ; + end + end + TSM_SFD : + begin + if (bz & (ncnt[0])) + begin + tsm_c <= TSM_INFO ; + end + else + begin + tsm_c <= TSM_SFD ; + end + end + TSM_INFO : + begin + if (coll) + begin + tsm_c <= TSM_JAM ; + end + else if (empty) + begin + if (!whole & ncnt == hnibble) + begin + tsm_c <= TSM_JAM ; + end + else if (eof & (nopad | dpd)) + begin + if (ac) + begin + tsm_c <= TSM_INT ; + end + else + begin + tsm_c <= TSM_CRC ; + end + end + else if (eof) + begin + tsm_c <= TSM_PAD ; + end + else + begin + tsm_c <= TSM_INFO ; + end + end + else + begin + tsm_c <= TSM_INFO ; + end + end + TSM_PAD : + begin + if (coll) + begin + tsm_c <= TSM_JAM ; + end + else if (nopad & (ncnt[0])) + begin + tsm_c <= TSM_CRC ; + end + else + begin + tsm_c <= TSM_PAD ; + end + end + TSM_CRC : + begin + if (coll) + begin + tsm_c <= TSM_JAM ; + end + else if (bz & (ncnt[0])) + begin + tsm_c <= TSM_INT ; + end + else + begin + tsm_c <= TSM_CRC ; + end + end + TSM_JAM : + begin + if (bz & (ncnt[0])) + begin + if (!bkoff_r | iur) + begin + tsm_c <= TSM_FLUSH ; + end + else + begin + tsm_c <= TSM_IDLE_TCSMT ; + end + end + else + begin + tsm_c <= TSM_JAM ; + end + end + TSM_FLUSH : + begin + if (whole & empty) + begin + tsm_c <= TSM_INT ; + end + else + begin + tsm_c <= TSM_FLUSH ; + end + end + default : + begin + if (tiack_r) + begin + tsm_c <= TSM_IDLE_TCSMT ; + end + else + begin + tsm_c <= TSM_INT ; + end + end + endcase + end + + always @(posedge clk) + begin : tsm_reg_proc + if (rst) + begin + tsm <= TSM_IDLE_TCSMT ; + end + else + begin + tsm <= tsm_c ; + end + end + + assign defer = ifs1p | ifs2p ; + + always @(posedge clk) + begin : ifs_reg_proc + if (rst) + begin + ifs1p <= 1'b0 ; + ifs2p <= 1'b0 ; + ifscnt <= IFS1_TIME ; + end + else + begin + if (!itprog & !ifs1p & !ifs2p & ifscnt != 4'b0000) + begin + ifs1p <= 1'b1 ; + end + else if (ifscnt == 4'b0000 | ifs2p) + begin + ifs1p <= 1'b0 ; + end + + if (ifs1p & ifscnt == 4'b0000) + begin + ifs2p <= 1'b1 ; + end + else if (ifs2p & ifscnt == 4'b0000) + begin + ifs2p <= 1'b0 ; + end + + if (itprog | + (carrier & ifs1p) | + (carrier & ifscnt == 4'b0000 & !itpend) | + (carrier & ifscnt == 4'b0000 & bkoff_r)) + begin + ifscnt <= IFS1_TIME ; + end + else if (ifs1p & ifscnt == 4'b0000) + begin + ifscnt <= IFS2_TIME ; + end + else if (ifscnt != 4'b0000) + begin + ifscnt <= ifscnt - 1 ; + end + end + end + + always @(posedge clk) + begin : de_reg_proc + if (rst) + begin + de <= 1'b0 ; + end + else + begin + if (ifs1p & itpend & carrier & tsm == TSM_IDLE_TCSMT) + begin + de <= 1'b1 ; + end + else if (tiack_r) + begin + de <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : eof_reg_proc + if (rst) + begin + eof <= 1'b0 ; + end + else + begin + case (DATAWIDTH) + 8 : + begin + if (whole & !(ncnt[0])) + begin + eof <= 1'b1 ; + end + else + begin + eof <= 1'b0 ; + end + end + 16 : + begin + if (whole & ((lastbe == 2'b11 & ncnt[1:0] == 2'b10) | + (lastbe == 2'b01 & ncnt[1:0] == 2'b00))) + begin + eof <= 1'b1 ; + end + else + begin + eof <= 1'b0 ; + end + end + default : + begin + if (whole & ((lastbe == 4'b1111 & ncnt[2:0] == 3'b110) | + (lastbe == 4'b0111 & ncnt[2:0] == 3'b100) | + (lastbe == 4'b0011 & ncnt[2:0] == 3'b010) | + (lastbe == 4'b0001 & ncnt[2:0] == 3'b000))) + begin + eof <= 1'b1 ; + end + else + begin + eof <= 1'b0 ; + end + end + endcase + end + end + + always @(coll or tsm or ncnt or bz or empty or eof or nopad) + begin : bset_reg_proc + if ((coll & (tsm == TSM_INFO | + tsm == TSM_PAD | + tsm == TSM_CRC)) | + (tsm == TSM_PAD & nopad & !(ncnt[0])) | + (tsm == TSM_PREA & bz & !(ncnt[0])) | + (tsm == TSM_SFD & (ncnt[0])) | + (tsm == TSM_INFO & empty & eof & nopad) | + (tsm == TSM_IDLE_TCSMT)) + begin + bset <= 1'b1 ; + end + else + begin + bset <= 1'b0 ; + end + end + + always @(posedge clk) + begin : bcnt_reg_proc + if (rst) + begin + bcnt <= {7{1'b1}} ; + brel <= 7'b0000110 ; + bz <= 1'b0 ; + end + else + begin + if (bset) + begin + if(coll & tsm==TSM_INFO) + begin + bcnt <= 7'b0000011; + end + else + begin + bcnt <= brel ; + end + end + else if ((ncnt[0]) & !bz) + begin + bcnt <= bcnt - 1 ; + end + + case (tsm) + TSM_IDLE_TCSMT : + begin + brel <= 7'b0000110 ; + end + TSM_PREA : + begin + brel <= 7'b0000000 ; + end + TSM_SFD : + begin + if (coll) + begin + brel <= 7'b0000011 ; + end + else + begin + brel <= MIN_FRAME - 1 ; + end + end + default : + begin + brel <= 7'b0000011 ; + end + endcase + + if (bset & brel != 7'b0000000) + begin + bz <= 1'b0 ; + end + else if (bcnt == 7'b0000001 & (ncnt[0]) & !bz) + begin + bz <= 1'b1 ; + end + end + end + + always @(posedge clk) + begin : nopad_reg_proc + if (rst) + begin + nopad <= 1'b0 ; + end + else + begin + if ((tsm == TSM_INFO & bcnt == 7'b0000100 & !ac) | + (tsm == TSM_INFO & bcnt == 7'b0000001 & ac) | + (tsm == TSM_PAD & bcnt == 7'b0000100) | (dpd & !ac)) + begin + nopad <= 1'b1 ; + end + else if (tsm == TSM_IDLE_TCSMT) + begin + nopad <= 1'b0 ; + end + end + end + + always @(tsm or + itpend or + bkoff_r or + defer or + ncnt or + eof or + empty or + nopad) + begin : nset_proc + if ((tsm == TSM_IDLE_TCSMT & ~(itpend & !bkoff_r & !defer)) | + (tsm == TSM_INFO & empty & eof) | + (tsm == TSM_PAD & nopad & (ncnt[0]))) + begin + nset <= 1'b1 ; + end + else + begin + nset <= 1'b0 ; + end + end + + always @(posedge clk) + begin : ncnt_reg_proc + if (rst) + begin + ncnt <= {4{1'b0}} ; + end + else + begin + if (nset) + begin + ncnt <= {4{1'b0}} ; + end + else if (tsm != TSM_IDLE_TCSMT) + begin + ncnt <= ncnt + 1 ; + end + end + end + + always @(tsm or crc or itxd0_max or crcgen) + begin : crc_proc + if (tsm == TSM_PREA) + begin + crc_c <= {32{1'b1}} ; + end + else if (crcgen) + begin + crc_c[0] <= crc[28] ^ + itxd0_max[3] ; + crc_c[1] <= crc[28] ^ crc[29] ^ + itxd0_max[2] ^ itxd0_max[3] ; + crc_c[2] <= crc[28] ^ crc[29] ^ crc[30] ^ + itxd0_max[1] ^ itxd0_max[2] ^ itxd0_max[3] ; + crc_c[3] <= crc[29] ^ crc[30] ^ crc[31] ^ + itxd0_max[0] ^ itxd0_max[1] ^ itxd0_max[2] ; + crc_c[4] <= crc[0] ^ crc[28] ^ crc[30] ^ crc[31] ^ + itxd0_max[0] ^ itxd0_max[1] ^ itxd0_max[3] ; + crc_c[5] <= crc[1] ^ crc[28] ^ crc[29] ^ crc[31] ^ + itxd0_max[0] ^ itxd0_max[2] ^ itxd0_max[3] ; + crc_c[6] <= crc[2] ^ crc[29] ^ crc[30] ^ + itxd0_max[1] ^ itxd0_max[2] ; + crc_c[7] <= crc[3] ^ crc[28] ^ crc[30] ^ crc[31] ^ + itxd0_max[0] ^ itxd0_max[1] ^ itxd0_max[3] ; + crc_c[8] <= crc[4] ^ crc[28] ^ crc[29] ^ crc[31] ^ + itxd0_max[0] ^ itxd0_max[2] ^ itxd0_max[3] ; + crc_c[9] <= crc[5] ^ crc[29] ^ crc[30] ^ + itxd0_max[1] ^ itxd0_max[2] ; + crc_c[10] <= crc[6] ^ crc[28] ^ crc[30] ^ crc[31] ^ + itxd0_max[0] ^ itxd0_max[1] ^ itxd0_max[3] ; + crc_c[11] <= crc[7] ^ crc[28] ^ crc[29] ^ crc[31] ^ + itxd0_max[0] ^ itxd0_max[2] ^ itxd0_max[3] ; + crc_c[12] <= crc[8] ^ crc[28] ^ crc[29] ^ crc[30] ^ + itxd0_max[1] ^ itxd0_max[2] ^ itxd0_max[3] ; + crc_c[13] <= crc[9] ^ crc[29] ^ crc[30] ^ crc[31] ^ + itxd0_max[0] ^ itxd0_max[1] ^ itxd0_max[2] ; + crc_c[14] <= crc[10] ^ crc[30] ^ crc[31] ^ + itxd0_max[0] ^ itxd0_max[1] ; + crc_c[15] <= crc[11] ^ crc[31] ^ + itxd0_max[0] ; + crc_c[16] <= crc[12] ^ crc[28] ^ + itxd0_max[3] ; + crc_c[17] <= crc[13] ^ crc[29] ^ + itxd0_max[2] ; + crc_c[18] <= crc[14] ^ crc[30] ^ + itxd0_max[1] ; + crc_c[19] <= crc[15] ^ crc[31] ^ + itxd0_max[0] ; + crc_c[20] <= crc[16] ; + crc_c[21] <= crc[17] ; + crc_c[22] <= crc[18] ^ crc[28] ^ + itxd0_max[3] ; + crc_c[23] <= crc[19] ^ crc[28] ^ crc[29] ^ + itxd0_max[2] ^ itxd0_max[3] ; + crc_c[24] <= crc[20] ^ crc[29] ^ crc[30] ^ + itxd0_max[1] ^ itxd0_max[2] ; + crc_c[25] <= crc[21] ^ crc[30] ^ crc[31] ^ + itxd0_max[0] ^ itxd0_max[1] ; + crc_c[26] <= crc[22] ^ crc[28] ^ crc[31] ^ + itxd0_max[0] ^ itxd0_max[3] ; + crc_c[27] <= crc[23] ^ crc[29] ^ + itxd0_max[2] ; + crc_c[28] <= crc[24] ^ crc[30] ^ + itxd0_max[1] ; + crc_c[29] <= crc[25] ^ crc[31] ^ + itxd0_max[0] ; + crc_c[30] <= crc[26] ; + crc_c[31] <= crc[27] ; + end + else + begin + crc_c <= crc ; + end + end + + always @(posedge clk) + begin : crc_reg_proc + if (rst) + begin + crcgen <= 1'b0 ; + crcsend <= 1'b0 ; + crc <= {32{1'b1}} ; + end + else + begin + crc <= crc_c ; + + if (tsm == TSM_INFO | tsm == TSM_PAD) + begin + crcgen <= 1'b1 ; + end + else + begin + crcgen <= 1'b0 ; + end + + if (tsm == TSM_CRC) + begin + crcsend <= 1'b1 ; + end + else + begin + crcsend <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : tstate_reg_proc + if (rst) + begin + itprog <= 1'b0 ; + itpend <= 1'b0 ; + tprog <= 1'b0 ; + preamble <= 1'b0 ; + end + else + begin + if (tsm == TSM_INFO | tsm == TSM_PAD | tsm == TSM_CRC | + tsm == TSM_JAM) + begin + itprog <= 1'b1 ; + end + else + begin + itprog <= 1'b0 ; + end + + if (sofreq_r) + begin + itpend <= 1'b1 ; + end + else + begin + itpend <= 1'b0 ; + end + + if (tsm == TSM_PREA | + tsm == TSM_SFD | + tsm == TSM_INFO | + tsm == TSM_PAD | + tsm == TSM_CRC | + tsm == TSM_JAM) + begin + tprog <= 1'b1 ; + end + else + begin + tprog <= 1'b0 ; + end + + if (tsm == TSM_PREA | tsm == TSM_SFD) + begin + preamble <= 1'b1 ; + end + else + begin + preamble <= 1'b0 ; + end + end + end + + assign tpend = itpend ; + + always @(posedge clk) + begin : iti_reg_proc + if (rst) + begin + iti <= 1'b0 ; + tireq <= 1'b0 ; + tiack_r <= 1'b0 ; + end + else + begin + if (tsm == TSM_INT) + begin + iti <= 1'b1 ; + end + else if (tiack) + begin + iti <= 1'b0 ; + end + + tireq <= iti ; + tiack_r <= tiack ; + end + end + + always @(posedge clk) + begin : iur_reg_proc + if (rst) + begin + iur <= 1'b0 ; + end + else + begin + if (itprog & empty & !whole) + begin + iur <= 1'b1 ; + end + else if (tiack_r) + begin + iur <= 1'b0 ; + end + end + end + + assign ur = iur ; + + always @(tsm or ramdata_r or pmux) + begin : datamux_proc + if (tsm == TSM_INFO) + begin + datamux_c <= ramdata_r ; + end + else + begin + datamux_c <= pmux ; + end + end + + assign ncnt10 = ncnt[1:0] ; + + assign ncnt20 = ncnt[2:0] ; + + assign datamux_c_max = {dzero_max[DATAWIDTH_MAX + 1:DATAWIDTH], + datamux_c}; + + always @(crc) + begin : crcneg_proc + begin : crcneg_loop + integer i; + for(i = 31; i >= 0; i = i - 1) + begin + crcneg_c[i] <= ~crc[31 - i] ; + end + end + end + + always @(posedge clk) + begin : txd_proc + if (rst) + begin + txd_rise <= {MIIWIDTH{1'b1}} ; + pmux <= {DATAWIDTH{1'b1}} ; + itxd0 <= {MIIWIDTH{1'b1}} ; + ramdata_r <= {DATAWIDTH{1'b0}} ; + end + else + begin + case (tsm_c) + TSM_PAD : + begin + pmux <= PAD_PATTERN[63:64 - DATAWIDTH] ; + end + TSM_JAM : + begin + pmux <= JAM_PATTERN[63:64 - DATAWIDTH] ; + end + TSM_PREA : + begin + pmux <= PRE_PATTERN[63:64 - DATAWIDTH] ; + end + TSM_SFD : + begin + pmux <= SFD_PATTERN[63:64 - DATAWIDTH] ; + end + default : + begin + pmux <= {DATAWIDTH{1'b1}} ; + end + endcase + + case (DATAWIDTH) + 32 : + begin + case (ncnt20) + 3'b000 : + begin + itxd0 <= datamux_c_max[3:0] ; + end + 3'b001 : + begin + itxd0 <= datamux_c_max[7:4] ; + end + 3'b010 : + begin + itxd0 <= datamux_c_max[11:8] ; + end + 3'b011 : + begin + itxd0 <= datamux_c_max[15:12] ; + end + 3'b100 : + begin + itxd0 <= datamux_c_max[19:16] ; + end + 3'b101 : + begin + itxd0 <= datamux_c_max[23:20] ; + end + 3'b110 : + begin + itxd0 <= datamux_c_max[27:24] ; + end + default : + begin + itxd0 <= datamux_c_max[31:28] ; + end + endcase + end + 16 : + begin + case (ncnt10) + 2'b00 : + begin + itxd0 <= datamux_c_max[3:0] ; + end + 2'b01 : + begin + itxd0 <= datamux_c_max[7:4] ; + end + 2'b10 : + begin + itxd0 <= datamux_c_max[11:8] ; + end + default : + begin + itxd0 <= datamux_c_max[15:12] ; + end + endcase + end + default : + begin + if (!(ncnt[0])) + begin + itxd0 <= datamux_c_max[3:0] ; + end + else + begin + itxd0 <= datamux_c_max[7:4] ; + end + end + endcase + + if (re) + begin + ramdata_r <= ramdata ; + end + + if (crcsend) + begin + case (ncnt) + 4'b0001 : + begin + txd_rise <= crcneg_c[3:0] ; + end + 4'b0010 : + begin + txd_rise <= crcneg_c[7:4] ; + end + 4'b0011 : + begin + txd_rise <= crcneg_c[11:8] ; + end + 4'b0100 : + begin + txd_rise <= crcneg_c[15:12] ; + end + 4'b0101 : + begin + txd_rise <= crcneg_c[19:16] ; + end + 4'b0110 : + begin + txd_rise <= crcneg_c[23:20] ; + end + 4'b0111 : + begin + txd_rise <= crcneg_c[27:24] ; + end + default : + begin + txd_rise <= crcneg_c[31:28] ; + end + endcase + end + else + begin + txd_rise <= itxd0 ; + end + end + end + + always @(posedge clk) + begin : txen_reg_proc + if (rst) + begin + txen1 <= 1'b0 ; + txen_rise <= 1'b0 ; + end + else + begin + txen_rise <= txen1 ; + if (tsm == TSM_IDLE_TCSMT | + tsm == TSM_INT | + tsm == TSM_FLUSH) + begin + txen1 <= 1'b0 ; + end + else + begin + txen1 <= 1'b1 ; + end + end + end + + always @(posedge clk) + begin : mii_fall_reg_proc + txen <= txen_rise ; + txd <= txd_rise; + end + + assign txer = 1'b0 ; + + always @(posedge clk) + begin : bkoff_reg_proc + if (rst) + begin + bkoff_r <= 1'b0 ; + end + else + begin + if (bkoff) + begin + bkoff_r <= 1'b1 ; + end + else if (tsm != TSM_JAM) + begin + bkoff_r <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : stopo_reg_proc + if (rst) + begin + stop_r <= 1'b0 ; + stopo <= 1'b0 ; + end + else + begin + stop_r <= stopi; + + if (stop_r & tsm == TSM_IDLE_TCSMT & !itpend) + begin + stopo <= 1'b1 ; + end + else + begin + stopo <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : cscnt_reg_proc + if (rst) + begin + tcscnt <= {8{1'b0}} ; + tcs <= 1'b0 ; + tcsreq <= 1'b0 ; + tcsack_r <= 1'b0 ; + end + else + begin + if (tcscnt == 8'b00000000) + begin + tcscnt <= 8'b10000000 ; + end + else + begin + tcscnt <= tcscnt - 1 ; + end + + if (tcscnt == 8'b00000000) + begin + tcs <= 1'b1 ; + end + else if (tcsack_r) + begin + tcs <= 1'b0 ; + end + + if (tcs & !tcsack_r) + begin + tcsreq <= 1'b1 ; + end + else if (tcsack_r) + begin + tcsreq <= 1'b0 ; + end + + tcsack_r <= tcsack ; + + end + end + + assign hnibble = (DATAWIDTH == 32) ? 4'b0111 : + (DATAWIDTH == 16) ? 4'b0011 : + 4'b0001 ; + + assign itxd0zero_max = {(MIIWIDTH_MAX + 1){1'b0}} ; + + assign itxd0_max = {itxd0zero_max[MIIWIDTH_MAX + 1:MIIWIDTH], + itxd0}; + + assign dzero_max = {(DATAWIDTH_MAX + 1){1'b0}} ; + +endmodule + + + +module TFIFO_V ( + clk, + rst, + ramwe, + ramaddr, + ramdata, + fifowe, + fifoeof, + fifobe, + fifodata, + fifonf, + fifocnf, + fifoval, + flev, + ici, + dpdi, + aci, + statadi, + cachere, + deo, + lco, + loo, + nco, + eco, + csne, + ico, + uro, + cco, + statado, + sofreq, + eofreq, + dpdo, + aco, + beo, + eofad, + wadg, + tireq, + winp, + dei, + lci, + loi, + nci, + eci, + uri, + cci, + radg, + tiack, + sf, + fdp, + tm, + pbl, + etiack, + etireq, + stopi, + stopo + ); + + parameter DATAWIDTH = 32; + parameter DATADEPTH = 32; + parameter FIFODEPTH = 9; + parameter CACHEDEPTH = 1; + + `include "utility.v" + + input clk; + input rst; + + output ramwe; + wire ramwe; + output [FIFODEPTH - 1:0] ramaddr; + wire [FIFODEPTH - 1:0] ramaddr; + output [DATAWIDTH - 1:0] ramdata; + wire [DATAWIDTH - 1:0] ramdata; + + input fifowe; + input fifoeof; + input [DATAWIDTH / 8 - 1:0] fifobe; + input [DATAWIDTH - 1:0] fifodata; + output fifonf; + reg fifonf; + output fifocnf; + wire fifocnf; + output fifoval; + reg fifoval; + output [FIFODEPTH - 1:0] flev; + wire [FIFODEPTH - 1:0] flev; + + input ici; + input dpdi; + input aci; + input [DATADEPTH - 1:0] statadi; + + input cachere; + output deo; + wire deo; + output lco; + wire lco; + output loo; + wire loo; + output nco; + wire nco; + output eco; + wire eco; + output csne; + wire csne; + output ico; + wire ico; + output uro; + wire uro; + output [3:0] cco; + wire [3:0] cco; + output [DATADEPTH - 1:0] statado; + wire [DATADEPTH - 1:0] statado; + + output sofreq; + wire sofreq; + output eofreq; + reg eofreq; + output dpdo; + wire dpdo; + output aco; + wire aco; + output [DATAWIDTH / 8 - 1:0] beo; + wire [DATAWIDTH / 8 - 1:0] beo; + output [FIFODEPTH - 1:0] eofad; + reg [FIFODEPTH - 1:0] eofad; + output [FIFODEPTH - 1:0] wadg; + reg [FIFODEPTH - 1:0] wadg; + + input tireq; + input winp; + input dei; + input lci; + input loi; + input nci; + input eci; + input uri; + input [3:0] cci; + input [FIFODEPTH - 1:0] radg; + output tiack; + wire tiack; + + input sf; + input fdp; + input [2:0] tm; + input [5:0] pbl; + + input etiack; + output etireq; + reg etireq; + + input stopi; + output stopo; + reg stopo; + + + parameter CCWIDTH = (3 + DATADEPTH + DATAWIDTH / 8 + FIFODEPTH); + reg [CCWIDTH - 1:0] ccmem[(1'b1 << CACHEDEPTH) - 1:0]; + wire ccwe; + wire ccre; + reg ccne; + reg iccnf; + wire [CACHEDEPTH - 1:0] ccwad_c; + reg [CACHEDEPTH - 1:0] ccwad; + reg [CACHEDEPTH - 1:0] ccrad; + reg [CACHEDEPTH - 1:0] ccrad_r; + wire [CCWIDTH - 1:0] ccdi; + wire [CCWIDTH - 1:0] ccdo; + + parameter CSWIDTH = (DATADEPTH + 11); + reg [CSWIDTH - 1:0] csmem[(1'b1 << CACHEDEPTH) - 1:0]; + wire cswe; + reg csre; + reg [CACHEDEPTH - 1:0] cswad; + wire [CACHEDEPTH - 1:0] csrad_c; + reg [CACHEDEPTH - 1:0] csrad; + reg [CACHEDEPTH - 1:0] csrad_r; + wire [CSWIDTH - 1:0] csdi; + wire [CSWIDTH - 1:0] csdo; + wire [DATADEPTH - 1:0] statad; + wire ic; + reg icsne; + + reg tprog; + reg tprog_r; + + reg winp_r; + reg [FIFODEPTH_MAX - 1:0] tlev_c; + reg tresh; + reg [FIFODEPTH - 1:0] stat; + reg [FIFODEPTH - 1:0] wad; + reg [FIFODEPTH - 1:0] rad_c; + reg [FIFODEPTH - 1:0] rad; + reg [FIFODEPTH - 1:0] radg_0_r; + reg [FIFODEPTH - 1:0] radg_r; + reg [FIFODEPTH - 1:0] sad; + wire [FIFODEPTH - 1:0] eofad_bin; + reg pblz; + reg [FIFODEPTH_MAX - 1:0] sflev_c; + + reg tireq_r; + reg tireq_r2; + + reg stop_r; + + wire [FIFODEPTH - 1:0] fone; + wire [FIFODEPTH - 1:0] fzero; + + always @(posedge clk) + begin : ccmem_reg_proc + if (rst) + begin : ccmem_reset + integer i; + for(i = ((1'b1 << CACHEDEPTH) - 1); i >= 0; i = i - 1) + begin + ccmem[i] <= {CCWIDTH{1'b0}}; + end + ccrad_r <= {CACHEDEPTH{1'b0}} ; + end + else + begin + if (fifowe | fifoeof) + begin + ccmem[ccwad] <= ccdi ; + end + ccrad_r <= ccrad ; + end + end + + assign ccwad_c = (fifoeof) ? ccwad + 1 : ccwad ; + + always @(posedge clk) + begin : ccaddr_reg_proc + if (rst) + begin + ccwad <= {CACHEDEPTH{1'b0}} ; + ccrad <= {CACHEDEPTH{1'b0}} ; + end + else + begin + ccwad <= ccwad_c ; + + if (ccre) + begin + ccrad <= ccrad + 1 ; + end + end + end + + always @(posedge clk) + begin : ccfe_reg_proc + if (rst) + begin + iccnf <= 1'b1 ; + ccne <= 1'b0 ; + end + else + begin + if ((ccwad_c == ccrad) & ccwe) + begin + iccnf <= 1'b0 ; + end + else if (ccre) + begin + iccnf <= 1'b1 ; + end + + if (ccwad == ccrad & iccnf) + begin + ccne <= 1'b0 ; + end + else + begin + ccne <= 1'b1 ; + end + end + end + + assign fifocnf = iccnf ; + + assign ccdo = ccmem[ccrad_r] ; + + assign ccdi = {ici, aci, dpdi, wad, fifobe, statadi} ; + + assign ccwe = fifoeof ; + + assign ccre = tireq_r & ~tireq_r2 ; + + assign ic = ccdo[CCWIDTH - 1] ; + + assign aco = ccdo[CCWIDTH - 2] ; + + assign dpdo = ccdo[CCWIDTH - 3] ; + + assign eofad_bin = ccdo[CCWIDTH - 4:CCWIDTH - 3 - FIFODEPTH] ; + + always @(posedge clk) + begin : eofad_reg_proc + if (rst) + begin + eofad <= {FIFODEPTH{1'b0}} ; + end + else + begin + eofad[FIFODEPTH - 1] <= eofad_bin[FIFODEPTH - 1] ; + begin : eofad_loop + integer i; + for(i = FIFODEPTH - 2; i >= 0; i = i - 1) + begin + eofad[i] <= eofad_bin[i] ^ eofad_bin[i + 1] ; + end + end + end + end + + assign beo = ccdo[DATADEPTH + DATAWIDTH / 8 - 1:DATADEPTH] ; + + assign statad = ccdo[DATADEPTH - 1:0] ; + + always @(posedge clk) + begin : csmem_reg_proc + if (rst) + begin : csmem_reset + integer i; + for(i = ((1'b1 << CACHEDEPTH) - 1); i >= 0; i = i - 1) + begin + csmem[i] <= {CSWIDTH{1'b0}}; + end + csrad_r <= {CACHEDEPTH{1'b0}}; + end + else + begin + csmem[cswad] <= csdi ; + csrad_r <= csrad ; + end + end + + always @(posedge clk) + begin : csaddr_reg_proc + if (rst) + begin + cswad <= {CACHEDEPTH{1'b0}} ; + csrad <= {CACHEDEPTH{1'b0}} ; + end + else + begin + if (cswe) + begin + cswad <= cswad + 1 ; + end + + csrad <= csrad_c ; + end + end + + assign csrad_c = (csre) ? csrad + 1 : csrad ; + + always @(posedge clk) + begin : icsne_reg_proc + if (rst) + begin + icsne <= 1'b0 ; + end + else + begin + if (cswad == csrad | (csre & cswad == csrad_c)) + begin + icsne <= 1'b0 ; + end + else + begin + icsne <= 1'b1 ; + end + end + end + + assign csne = icsne; + + assign csdo = csmem[csrad_r] ; + + assign csdi = {dei, lci, loi, nci, eci, ic, cci, uri, statad} ; + + assign deo = csdo[CSWIDTH - 1] ; + + assign lco = csdo[CSWIDTH - 2] ; + + assign loo = csdo[CSWIDTH - 3] ; + + assign nco = csdo[CSWIDTH - 4] ; + + assign eco = csdo[CSWIDTH - 5] ; + + assign ico = csdo[CSWIDTH - 6] ; + + assign cco = csdo[CSWIDTH - 7:CSWIDTH - 10] ; + + assign uro = csdo[CSWIDTH - 11] ; + + assign statado = csdo[DATADEPTH - 1:0] ; + + assign cswe = tireq_r & tprog ; + + always @(posedge clk) + begin : csre_reg_proc + if (rst) + begin + csre <= 1'b0 ; + end + else + begin + csre <= cachere ; + end + end + + always @(posedge clk) + begin : tprog_reg_proc + if (rst) + begin + tprog <= 1'b0 ; + tprog_r <= 1'b0 ; + end + else + begin + tprog_r <= tprog ; + if (tireq_r) + begin + tprog <= 1'b0 ; + end + else if ((!sf & !tprog & !tireq_r & tresh) | ccne) + begin + tprog <= 1'b1 ; + end + end + end + + always @(posedge clk) + begin : eofreq_reg_proc + if (rst) + begin + eofreq <= 1'b0 ; + end + else + begin + if (tprog & ccne) + begin + eofreq <= 1'b1 ; + end + else if (tireq_r) + begin + eofreq <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : tireq_reg_proc + if (rst) + begin + tireq_r <= 1'b0 ; + tireq_r2 <= 1'b0 ; + end + else + begin + tireq_r <= tireq ; + tireq_r2 <= tireq_r ; + end + end + + always @(posedge clk) + begin : etireq_reg_proc + if (rst) + begin + etireq <= 1'b0 ; + end + else + begin + if (fifoeof) + begin + etireq <= 1'b1 ; + end + else if (etiack) + begin + etireq <= 1'b0 ; + end + end + end + + assign tiack = tireq_r2 ; + + assign sofreq = tprog ; + + always @(posedge clk) + begin : addr_reg_proc + if (rst) + begin + wad <= {FIFODEPTH{1'b0}} ; + wadg <= {FIFODEPTH{1'b0}} ; + radg_0_r <= {FIFODEPTH{1'b0}} ; + radg_r <= {FIFODEPTH{1'b0}} ; + rad <= {FIFODEPTH{1'b0}} ; + sad <= {FIFODEPTH{1'b0}} ; + end + else + begin + if (fifowe) + begin + wad <= wad + 1 ; + end + + wadg[FIFODEPTH - 1] <= wad[FIFODEPTH - 1] ; + begin : wadg_loop + integer i; + for(i = FIFODEPTH - 2; i >= 0; i = i - 1) + begin + wadg[i] <= wad[i] ^ wad[i + 1] ; + end + end + + radg_0_r <= radg ; + radg_r <= radg_0_r ; + + rad <= rad_c ; + + if (!tprog & tprog_r) + begin + sad <= eofad_bin ; + end + end + end + + always @(radg_r) + begin : rad_proc + reg[FIFODEPTH - 1:0] rad_v; + rad_v[FIFODEPTH - 1] = radg_r[FIFODEPTH - 1]; + begin : rad_loop + integer i; + for(i = FIFODEPTH - 2; i >= 0; i = i - 1) + begin + rad_v[i] = rad_v[i + 1] ^ radg_r[i]; + end + end + rad_c = rad_v ; + end + + always @(posedge clk) + begin : stat_reg_proc + if (rst) + begin + stat <= {FIFODEPTH{1'b0}} ; + end + else + begin + if ((!winp_r & !fdp & tprog & !tireq_r) | !tprog_r) + begin + stat <= wad - sad ; + end + else + begin + stat <= wad - rad ; + end + end + end + + always @(posedge clk) + begin : winp_reg_proc + if (rst) + begin + winp_r <= 1'b0 ; + end + else + begin + winp_r <= winp ; + end + end + + always @(tm) + begin : tresh_proc + tlev_c <= {FIFODEPTH_MAX{1'b0}} ; + case (DATAWIDTH) + 8 : + begin + case (tm) + 3'b000, 3'b101, 3'b110 : + begin + tlev_c[10:0] <= 11'b00010000000 ; + end + 3'b001, 3'b111 : + begin + tlev_c[10:0] <= 11'b00100000000 ; + end + 3'b010 : + begin + tlev_c[10:0] <= 11'b01000000000 ; + end + 3'b011 : + begin + tlev_c[10:0] <= 11'b10000000000 ; + end + default : + begin + tlev_c[10:0] <= 11'b00001000000 ; + end + endcase + end + 16 : + begin + case (tm) + 3'b000, 3'b101, 3'b110 : + begin + tlev_c[10:0] <= 11'b00001000000 ; + end + 3'b001, 3'b111 : + begin + tlev_c[10:0] <= 11'b00010000000 ; + end + 3'b010 : + begin + tlev_c[10:0] <= 11'b00100000000 ; + end + 3'b011 : + begin + tlev_c[10:0] <= 11'b01000000000 ; + end + default : + begin + tlev_c[10:0] <= 11'b00000100000 ; + end + endcase + end + default : + begin + case (tm) + 3'b000, 3'b101, 3'b110 : + begin + tlev_c[10:0] <= 11'b00000100000 ; + end + 3'b001, 3'b111 : + begin + tlev_c[10:0] <= 11'b00001000000 ; + end + 3'b010 : + begin + tlev_c[10:0] <= 11'b00010000000 ; + end + 3'b011 : + begin + tlev_c[10:0] <= 11'b00100000000 ; + end + default : + begin + tlev_c[10:0] <= 11'b00000010000 ; + end + endcase + end + endcase + end + + always @(posedge clk) + begin : tresh_reg_proc + if (rst) + begin + tresh <= 1'b0 ; + end + else + begin + if (stat >= tlev_c[FIFODEPTH - 1:0]) + begin + tresh <= 1'b1 ; + end + else + begin + tresh <= 1'b0 ; + end + end + end + + always @(pbl or pblz) + begin : sflev_proc + sflev_c[FIFODEPTH_MAX - 1:6] <= {(FIFODEPTH_MAX-6){1'b1}} ; + if (pblz) + begin + sflev_c[5:0] <= 6'b000000 ; + end + else + begin + sflev_c[5:0] <= ~pbl ; + end + end + + always @(posedge clk) + begin : fifoval_reg_proc + if (rst) + begin + fifoval <= 1'b0 ; + end + else + begin + if (stat <= sflev_c[FIFODEPTH - 1:0]) + begin + fifoval <= 1'b1 ; + end + else + begin + fifoval <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : pblz_reg_proc + if (rst) + begin + pblz <= 1'b0 ; + end + else + begin + if (pbl == 6'b000000) + begin + pblz <= 1'b1 ; + end + else + begin + pblz <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : fifonf_reg_proc + if (rst) + begin + fifonf <= 1'b1 ; + end + else + begin + if ((stat == {fone[FIFODEPTH - 1:1], 1'b0} & fifowe) | + (stat == fone)) + begin + fifonf <= 1'b0 ; + end + else + begin + fifonf <= 1'b1 ; + end + end + end + + assign flev = stat ; + + assign ramaddr = wad ; + + assign ramdata = fifodata ; + + assign ramwe = fifowe ; + + always @(posedge clk) + begin : tstop_reg_proc + if (rst) + begin + stop_r <= 1'b1 ; + stopo <= 1'b0 ; + end + else + begin + stop_r <= stopi ; + + if (stop_r & !ccne & !icsne & stat == fzero & !tprog) + begin + stopo <= 1'b1 ; + end + else + begin + stopo <= 1'b0 ; + end + end + end + + assign fone = {FIFODEPTH{1'b1}} ; + + assign fzero = {FIFODEPTH{1'b0}} ; + +endmodule + + + +module TLSM_V ( + clk, + rst, + fifonf, + fifocnf, + fifoval, + fifolev, + fifowe, + fifoeof, + fifobe, + fifodata, + ic, + ac, + dpd, + statado, + csne, + lo, + nc, + lc, + ec, + de, + ur, + cc, + statadi, + cachere, + dmaack, + dmaeob, + dmadatai, + dmaaddr, + dmareq, + dmawr, + dmacnt, + dmaaddro, + dmadatao, + fwe, + fdata, + faddr, + dsl, + pbl, + poll, + dbadc, + dbad, + pollack, + tcompack, + tcomp, + des, + fbuf, + stat, + setp, + tu, + ft, + stopi, + stopo + ); + + parameter DATAWIDTH = 32; + parameter DATADEPTH = 32; + parameter FIFODEPTH = 9; + + `include "utility.v" + + input clk; + input rst; + + input fifonf; + input fifocnf; + input fifoval; + input [FIFODEPTH - 1:0] fifolev; + output fifowe; + wire fifowe; + output fifoeof; + wire fifoeof; + output [DATAWIDTH / 8 - 1:0] fifobe; + reg [DATAWIDTH / 8 - 1:0] fifobe; + output [DATAWIDTH - 1:0] fifodata; + wire [DATAWIDTH - 1:0] fifodata; + + output ic; + reg ic; + output ac; + reg ac; + output dpd; + reg dpd; + output [DATADEPTH - 1:0] statado; + wire [DATADEPTH - 1:0] statado; + + input csne; + input lo; + input nc; + input lc; + input ec; + input de; + input ur; + input [3:0] cc; + input [DATADEPTH - 1:0] statadi; + output cachere; + wire cachere; + + input dmaack; + input dmaeob; + input [DATAWIDTH - 1:0] dmadatai; + input [DATADEPTH - 1:0] dmaaddr; + output dmareq; + wire dmareq; + output dmawr; + wire dmawr; + output [FIFODEPTH_MAX - 1:0] dmacnt; + wire [FIFODEPTH_MAX - 1:0] dmacnt; + output [DATADEPTH - 1:0] dmaaddro; + reg [DATADEPTH - 1:0] dmaaddro; + output [DATAWIDTH - 1:0] dmadatao; + reg [DATAWIDTH - 1:0] dmadatao; + + output fwe; + wire fwe; + output [ADDRWIDTH - 1:0] fdata; + wire [ADDRWIDTH - 1:0] fdata; + output [ADDRDEPTH - 1:0] faddr; + wire [ADDRDEPTH - 1:0] faddr; + + input [4:0] dsl; + input [5:0] pbl; + input poll; + input dbadc; + input [DATADEPTH - 1:0] dbad; + output pollack; + wire pollack; + + input tcompack; + output tcomp; + wire tcomp; + output des; + reg des; + output fbuf; + reg fbuf; + output stat; + reg stat; + output setp; + reg setp; + output tu; + reg tu; + output [1:0] ft; + reg [1:0] ft; + + input stopi; + output stopo; + reg stopo; + + + wire [DATAWIDTH_MAX + 1:0] dmadatai_max; + reg [DATAWIDTH_MAX - 1:0] dataimax_r; + wire [1:0] dataimax_r10; + wire [2:0] dmaaddr20; + reg req_c; + reg req; + reg [2:0] req_r; + + reg idmareq; + wire [31:0] datao32; + wire [FIFODEPTH_MAX - 1:0] bsmax; + wire [FIFODEPTH_MAX - 1:0] flmax; + wire [FIFODEPTH - 1:0] flmax_sub; + wire [FIFODEPTH_MAX - 1:0] blmax; + reg fl_g_bs; + reg fl_g_bl; + reg bl_g_bs; + reg pblz; + reg buffetch; + reg dmaack_r; + + reg [3:0] lsm_c; + reg [3:0] lsm; + reg [3:0] lsm_r; + reg [2:0] csm_c; + reg [2:0] csm; + reg [2:0] lsmcnt; + reg tsprog; + reg [DATADEPTH - 1:0] statad; + wire es_c; + reg own_c; + reg own; + reg tch; + reg ter; + reg set; + reg tls; + reg tfs; + wire [10:0] bs_c; + wire [1:0] bs_c10; + reg [10:0] bs1; + reg [10:0] bs2; + reg adwrite; + reg [DATADEPTH - 1:0] bad; + reg [DATADEPTH - 1:0] dad; + reg dbadc_r; + wire [31:0] tstat; + reg lastdma; + reg icachere; + reg poll_r; + reg [FIFODEPTH_MAX - 1:0] dmacnt_c; + reg [FIFODEPTH_MAX - 1:0] dmacnt_r; + + wire [1:0] addsel16; + wire [3:0] addsel32; + reg [3:0] addv_c; + reg [1:0] badd_c; + reg [11:0] bcnt; + reg ififowe; + wire bufwe; + wire firstb_c; + reg firstb; + reg [DATAWIDTH - 1:0] buf0_c; + reg [DATAWIDTH * 2 - 9:0] buf_c; + reg [DATAWIDTH * 2 - 9:0] buf_r; + reg [3:0] buflev_c; + reg [3:0] buflev; + reg [DATAWIDTH / 8 - 1:0] firstbe; + reg [DATAWIDTH / 8 - 1:0] lastbe; + reg [DATAWIDTH / 8 - 1:0] be; + wire [1:0] be10; + wire [3:0] be30; + + reg itcomp; + reg tcompack_r; + + reg ifwe; + reg [ADDRDEPTH - 1:0] ifaddr; + + reg stop_r; + + wire [FIFODEPTH_MAX - 1:0] fzero_max; + wire [DATAWIDTH_MAX + 1:0] dzero_max; + wire [DATAWIDTH_MAX * 2 - 7:0] buf_r_max; + wire [DATAWIDTH_MAX * 2 - 7:0] bufzero_max; + + + always @(posedge clk) + begin : idmareq_reg_proc + if (rst) + begin + idmareq <= 1'b0 ; + end + else + begin + if (req_c) + begin + idmareq <= 1'b1 ; + end + else if (dmaack & dmaeob) + begin + idmareq <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : cachere_reg_proc + if (rst) + begin + icachere <= 1'b0 ; + end + else + begin + if (itcomp & tcompack_r) + begin + icachere <= 1'b1 ; + end + else + begin + icachere <= 1'b0 ; + end + end + end + + assign cachere = icachere ; + + always @(lsm or + csm or + poll_r or + dmaack or + dmaeob or + own_c or + tch or + bs1 or + bs2 or + stop_r or + lsmcnt or + fifocnf or + tsprog or + lastdma or + dbadc_r) + begin : lsm_proc + case (lsm) + LSM_IDLE : + begin + if (!dbadc_r & !stop_r & fifocnf & (poll_r | (tsprog & dmaack & dmaeob))) + begin + lsm_c <= LSM_DES0 ; + end + else + begin + lsm_c <= LSM_IDLE ; + end + end + LSM_DES0 : + begin + if (dmaack & dmaeob & !tsprog) + begin + if (own_c) + begin + lsm_c <= LSM_DES1 ; + end + else + begin + lsm_c <= LSM_IDLE ; + end + end + else + begin + lsm_c <= LSM_DES0 ; + end + end + LSM_DES1 : + begin + if (dmaack & dmaeob & !tsprog) + begin + lsm_c <= LSM_DES2 ; + end + else + begin + lsm_c <= LSM_DES1 ; + end + end + LSM_DES2 : + begin + if (dmaack & dmaeob & !tsprog) + begin + if (bs1 == 11'b00000000000 | csm == CSM_IDLE) + begin + lsm_c <= LSM_DES3 ; + end + else + begin + lsm_c <= LSM_BUF1 ; + end + end + else + begin + lsm_c <= LSM_DES2 ; + end + end + LSM_DES3 : + begin + if (dmaack & dmaeob & !tsprog) + begin + if (bs2 == 11'b00000000000 | tch | csm == CSM_IDLE) + begin + lsm_c <= LSM_NXT ; + end + else + begin + lsm_c <= LSM_BUF2 ; + end + end + else + begin + lsm_c <= LSM_DES3 ; + end + end + LSM_BUF1 : + begin + if (!tsprog & dmaack & dmaeob & lastdma) + begin + lsm_c <= LSM_DES3 ; + end + else + begin + lsm_c <= LSM_BUF1 ; + end + end + LSM_BUF2 : + begin + if (!tsprog & dmaack & dmaeob & lastdma) + begin + lsm_c <= LSM_NXT ; + end + else + begin + lsm_c <= LSM_BUF2 ; + end + end + LSM_NXT : + begin + if (lsmcnt == 3'b000) + begin + if (csm == CSM_L | csm == CSM_FL) + begin + if (stop_r | !fifocnf) + begin + lsm_c <= LSM_IDLE ; + end + else + begin + lsm_c <= LSM_DES0 ; + end + end + else + begin + lsm_c <= LSM_STAT ; + end + end + else + begin + lsm_c <= LSM_NXT ; + end + end + default : + begin + if (dmaack & dmaeob & !tsprog) + begin + if (stop_r) + begin + lsm_c <= LSM_IDLE ; + end + else + begin + lsm_c <= LSM_DES0 ; + end + end + else + begin + lsm_c <= LSM_STAT ; + end + end + endcase + end + + always @(posedge clk) + begin : lsm_reg_proc + if (rst) + begin + lsm <= LSM_IDLE ; + lsm_r <= LSM_IDLE ; + end + else + begin + lsm <= lsm_c ; + lsm_r <= lsm ; + end + end + + always @(csm or lsm or tfs or tls or own or set or bs1 or bs2) + begin : csm_proc + case (csm) + CSM_IDLE : + begin + if (lsm == LSM_DES2) + begin + if (!set & tfs & tls) + begin + csm_c <= CSM_FL ; + end + else if (!set & tfs & !tls) + begin + csm_c <= CSM_F ; + end + else if (set & !tfs & !tls) + begin + csm_c <= CSM_SET ; + end + else + begin + csm_c <= CSM_IDLE ; + end + end + else + begin + csm_c <= CSM_IDLE ; + end + end + CSM_FL : + begin + if (lsm == LSM_DES0 | lsm == LSM_IDLE) + begin + csm_c <= CSM_IDLE ; + end + else if (lsm == LSM_DES2 & + bs1 == 11'b00000000000 & + bs2 == 11'b00000000000) + begin + csm_c <= CSM_BAD ; + end + else + begin + csm_c <= CSM_FL ; + end + end + CSM_F : + begin + if (tls) + begin + csm_c <= CSM_L ; + end + else if (lsm == LSM_DES1 & !tfs) + begin + csm_c <= CSM_I ; + end + else + begin + csm_c <= CSM_F ; + end + end + CSM_L : + begin + if (lsm == LSM_DES0 | lsm == LSM_IDLE) + begin + csm_c <= CSM_IDLE ; + end + else + begin + csm_c <= CSM_L ; + end + end + CSM_SET : + begin + if (lsm == LSM_DES0 | lsm == LSM_IDLE) + begin + csm_c <= CSM_IDLE ; + end + else + begin + csm_c <= CSM_SET ; + end + end + CSM_I : + begin + if (tls) + begin + csm_c <= CSM_L ; + end + else + begin + csm_c <= CSM_I ; + end + end + default : + begin + if (lsm == LSM_NXT) + begin + csm_c <= CSM_IDLE ; + end + else + begin + csm_c <= CSM_BAD ; + end + end + endcase + end + + always @(posedge clk) + begin : csm_reg_proc + if (rst) + begin + csm <= CSM_IDLE ; + end + else + begin + csm <= csm_c ; + end + end + + always @(posedge clk) + begin : lsmcnt_reg_proc + if (rst) + begin + lsmcnt <= {3{1'b1}} ; + end + else + begin + if (lsm == LSM_NXT) + begin + lsmcnt <= lsmcnt - 1 ; + end + else + begin + lsmcnt <= {3{1'b1}} ; + end + end + end + + always @(posedge clk) + begin : poll_reg_proc + if (rst) + begin + poll_r <= 1'b0 ; + end + else + begin + if (poll) + begin + poll_r <= 1'b1 ; + end + else if (!dbadc_r) + begin + poll_r <= 1'b0 ; + end + end + end + + assign pollack = poll_r ; + + always @(own or dmaack or dmaeob or lsm or dmadatai_max or tsprog) + begin : own_proc + if (dmaack & dmaeob & lsm == LSM_DES0 & !tsprog) + begin + own_c <= dmadatai_max[DATAWIDTH - 1] ; + end + else + begin + own_c <= own ; + end + end + + always @(posedge clk) + begin : own_reg_proc + if (rst) + begin + own <= 1'b1 ; + end + else + begin + own <= own_c ; + end + end + + always @(posedge clk) + begin : des1_reg_proc + reg ft22; + if (rst) + begin + ft22 = 1'b0; + tls <= 1'b0 ; + tfs <= 1'b0 ; + set <= 1'b0 ; + ac <= 1'b0 ; + ter <= 1'b0 ; + tch <= 1'b0 ; + dpd <= 1'b0 ; + ic <= 1'b0 ; + bs2 <= {11{1'b0}} ; + bs1 <= {11{1'b0}} ; + ft <= {2{1'b0}} ; + end + else + begin + if (lsm == LSM_DES1 & dmaack & !tsprog) + begin + case (DATAWIDTH) + 8 : + begin + case (dmaaddr20) + 3'b000, 3'b100 : + begin + bs1[7:0] <= dmadatai_max[7:0] ; + end + 3'b001, 3'b101 : + begin + bs1[10:8] <= dmadatai_max[2:0] ; + bs2[4:0] <= dmadatai_max[7:3] ; + end + 3'b010, 3'b110 : + begin + bs2[10:5] <= dmadatai_max[5:0] ; + dpd <= dmadatai_max[7] ; + ft22 = dmadatai_max[6]; + end + default : + begin + ic <= dmadatai_max[7] ; + tls <= dmadatai_max[6] ; + tfs <= dmadatai_max[5] ; + set <= dmadatai_max[3] ; + ac <= dmadatai_max[2] ; + ter <= dmadatai_max[1] ; + tch <= dmadatai_max[0] ; + if (dmadatai_max[3]) + begin + ft <= {dmadatai_max[4], ft22} ; + end + end + endcase + end + 16 : + begin + case (dmaaddr20) + 3'b000, 3'b100 : + begin + bs1[10:0] <= dmadatai_max[10:0] ; + bs2[4:0] <= dmadatai_max[15:11] ; + end + default : + begin + bs2[10:5] <= dmadatai_max[5:0] ; + ic <= dmadatai_max[15] ; + tls <= dmadatai_max[14] ; + tfs <= dmadatai_max[13] ; + set <= dmadatai_max[11] ; + ac <= dmadatai_max[10] ; + ter <= dmadatai_max[9] ; + tch <= dmadatai_max[8] ; + dpd <= dmadatai_max[7] ; + if (dmadatai_max[11]) + begin + ft <= {dmadatai_max[12], dmadatai_max[6]} ; + end + end + endcase + end + default : + begin + ic <= dmadatai_max[31] ; + tls <= dmadatai_max[30] ; + tfs <= dmadatai_max[29] ; + set <= dmadatai_max[27] ; + ac <= dmadatai_max[26] ; + ter <= dmadatai_max[25] ; + tch <= dmadatai_max[24] ; + dpd <= dmadatai_max[23] ; + bs2 <= dmadatai_max[21:11] ; + bs1 <= dmadatai_max[10:0] ; + if (dmadatai_max[27]) + begin + ft <= {dmadatai_max[28], dmadatai_max[22]} ; + end + end + endcase + end + end + end + + always @(posedge clk) + begin : adwrite_reg_proc + if (rst) + begin + adwrite <= 1'b0 ; + end + else + begin + if (dmaack & dmaeob & !tsprog) + begin + adwrite <= 1'b1 ; + end + else + begin + adwrite <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : dbadc_reg_proc + if (rst) + begin + dbadc_r <= 1'b0 ; + end + else + begin + dbadc_r <= dbadc ; + end + end + + always @(posedge clk) + begin : dad_reg_proc + if (rst) + begin + dad <= {DATADEPTH{1'b1}} ; + end + else + begin + if (dbadc_r) + begin + dad <= dbad ; + end + else if (adwrite) + begin + case (lsm_r) + LSM_DES3 : + begin + if (ter) + begin + dad <= dbad ; + end + else if (tch) + begin + dad <= dataimax_r[DATADEPTH - 1:0] ; + end + else + begin + dad <= dmaaddr + ({dsl, 2'b00}) ; + end + end + LSM_DES0 : + begin + if (own) + begin + dad <= dmaaddr ; + end + end + LSM_DES2 : + begin + dad <= dmaaddr ; + end + LSM_DES1 : + begin + dad <= dmaaddr ; + end + default : + begin + end + endcase + end + end + end + + always @(posedge clk) + begin : bad_reg_proc + if (rst) + begin + bad <= {DATADEPTH{1'b1}} ; + end + else + begin + if (adwrite) + begin + if (lsm_r == LSM_DES2 | lsm_r == LSM_DES3) + begin + case (DATAWIDTH) + 8 : + begin + bad <= dataimax_r[DATADEPTH - 1:0] ; + end + 16 : + begin + bad <= {dataimax_r[DATADEPTH - 1:1], 1'b0} ; + end + default : + begin + bad <= {dataimax_r[DATADEPTH - 1:2], 2'b00} ; + end + endcase + end + else + begin + bad <= dmaaddr ; + end + end + end + end + + always @(posedge clk) + begin : stataddr_reg_proc + if (rst) + begin + statad <= {DATADEPTH{1'b1}} ; + end + else + begin + if (lsm_r == LSM_DES0 & adwrite & own) + begin + statad <= dad ; + end + end + end + + assign statado = statad ; + + assign bs_c = (lsm_r == LSM_DES2) ? bs1 : bs2 ; + + assign addsel16 = {dataimax_r[0], bs_c[0]} ; + + assign addsel32 = {dataimax_r10, bs_c10} ; + + always @(addsel16 or addsel32) + begin : badd_proc + case (DATAWIDTH) + 8 : + begin + badd_c <= 2'b00 ; + end + 16 : + begin + if (addsel16 == 2'b01 | + addsel16 == 2'b10 | + addsel16 == 2'b11) + begin + badd_c <= 2'b01 ; + end + else + begin + badd_c <= 2'b00 ; + end + end + default : + begin + case (addsel32) + 4'b0000 : + begin + badd_c <= 2'b00 ; + end + 4'b1011, 4'b1110, 4'b1111 : + begin + badd_c <= 2'b10 ; + end + default : + begin + badd_c <= 2'b01 ; + end + endcase + end + endcase + end + + always @(posedge clk) + begin : bcnt_reg_proc + if (rst) + begin + bcnt <= {12{1'b1}} ; + end + else + begin + case (DATAWIDTH) + 8 : + begin + if (lsm_r == LSM_DES2 | lsm_r == LSM_DES3) + begin + bcnt <= {1'b0, bs_c} ; + end + else if (dmaack & !tsprog) + begin + bcnt <= bcnt - 1 ; + end + end + 16 : + begin + if (lsm_r == LSM_DES2 | lsm_r == LSM_DES3) + begin + bcnt <= {(({1'b0, bs_c[10:1]}) + badd_c), 1'b0} ; + end + else if (dmaack & !tsprog) + begin + bcnt <= {(bcnt[11:1] - 1), 1'b0} ; + end + end + default : + begin + if (lsm_r == LSM_DES2 | lsm_r == LSM_DES3) + begin + bcnt <= {(({1'b0, bs_c[10:2]}) + badd_c), 2'b00} ; + end + else if (dmaack & !tsprog) + begin + bcnt <= {(bcnt[11:2] - 1), 2'b00} ; + end + end + endcase + end + end + + + assign bs_c10 = bs_c[1:0] ; + + assign dataimax_r10 = dataimax_r[1:0] ; + + always @(posedge clk) + begin : firstbe_reg_proc + if (rst) + begin + firstbe <= {(DATAWIDTH/8){1'b1}} ; + end + else + begin + if (lsm_r == LSM_DES2 | lsm_r == LSM_DES3) + begin + case (DATAWIDTH) + 8 : + begin + firstbe <= 1'b1 ; + end + 16 : + begin + if (dataimax_r[0]) + begin + firstbe <= 2'b10 ; + end + else + begin + firstbe <= 2'b11 ; + end + end + default : + begin + case (dataimax_r10) + 2'b00 : + begin + firstbe <= 4'b1111 ; + end + 2'b01 : + begin + firstbe <= 4'b1110 ; + end + 2'b10 : + begin + firstbe <= 4'b1100 ; + end + default : + begin + firstbe <= 4'b1000 ; + end + endcase + end + endcase + end + end + end + + always @(posedge clk) + begin : lastbe_reg_proc + if (rst) + begin + lastbe <= {(DATAWIDTH/8){1'b1}} ; + end + else + begin + if (lsm_r == LSM_DES2 | lsm_r == LSM_DES3) + begin + case (DATAWIDTH) + 8 : + begin + lastbe <= 1'b1 ; + end + 16 : + begin + if ((!(dataimax_r[0]) & !(bs_c[0])) | + ((dataimax_r[0]) & (bs_c[0]))) + begin + lastbe <= 2'b11 ; + end + else + begin + lastbe <= 2'b01 ; + end + end + default : + begin + case (dataimax_r10) + 2'b00 : + begin + case (bs_c10) + 2'b00 : + begin + lastbe <= 4'b1111 ; + end + 2'b01 : + begin + lastbe <= 4'b0001 ; + end + 2'b10 : + begin + lastbe <= 4'b0011 ; + end + default : + begin + lastbe <= 4'b0111 ; + end + endcase + end + 2'b01 : + begin + case (bs_c10) + 2'b00 : + begin + lastbe <= 4'b0001 ; + end + 2'b01 : + begin + lastbe <= 4'b0011 ; + end + 2'b10 : + begin + lastbe <= 4'b0111 ; + end + default : + begin + lastbe <= 4'b1111 ; + end + endcase + end + 2'b10 : + begin + case (bs_c10) + 2'b00 : + begin + lastbe <= 4'b0011 ; + end + 2'b01 : + begin + lastbe <= 4'b0111 ; + end + 2'b10 : + begin + lastbe <= 4'b1111 ; + end + default : + begin + lastbe <= 4'b0001 ; + end + endcase + end + default : + begin + case (bs_c10) + 2'b00 : + begin + lastbe <= 4'b0111 ; + end + 2'b01 : + begin + lastbe <= 4'b1111 ; + end + 2'b10 : + begin + lastbe <= 4'b0001 ; + end + default : + begin + lastbe <= 4'b0011 ; + end + endcase + end + endcase + end + endcase + end + end + end + + always @(posedge clk) + begin : tfwe_reg_proc + if (rst) + begin + ififowe <= 1'b0 ; + end + else + begin + if (((DATAWIDTH == 8 & buflev_c >= 4'b0001 & bufwe) | + (DATAWIDTH ==16 & buflev_c >= 4'b0010 & bufwe) | + (DATAWIDTH ==32 & buflev_c >= 4'b0100 & bufwe) | + (buflev_c != 4'b0000 & lsm == LSM_NXT & + (csm == CSM_L | csm == CSM_FL))) & fifonf) + begin + ififowe <= 1'b1 ; + end + else + begin + ififowe <= 1'b0 ; + end + end + end + + assign fifoeof = ((csm == CSM_L | csm == CSM_FL) & + lsm == LSM_NXT & lsmcnt == 3'b001) ? 1'b1 : 1'b0 ; + + assign fifowe = ififowe ; + + assign firstb_c = (bufwe) ? 1'b0 : + (lsm == LSM_DES2 | lsm == LSM_DES3) ? 1'b1 : + firstb ; + + always @(firstb or firstbe or lastbe or dmaeob or lastdma) + begin : be_proc + if (dmaeob & lastdma) + begin + be <= lastbe ; + end + else if (firstb) + begin + be <= firstbe ; + end + else + begin + be <= {(DATAWIDTH/8){1'b1}} ; + end + end + + always @(be or be30 or dmadatai_max) + begin : tbuf0_proc + reg[15:0] buf0_16; + reg[31:0] buf0_32; + buf0_c <= {DATAWIDTH{1'b0}} ; + case (DATAWIDTH) + 8 : + begin + buf0_c <= dmadatai_max[7:0]; + end + 16 : + begin + buf0_16 = {16{1'b0}}; + if (be == 2'b10) + begin + buf0_16[7:0] = dmadatai_max[15:8]; + end + else + begin + buf0_16 = dmadatai_max[15:0]; + end + buf0_c <= buf0_16 ; + end + default : + begin + buf0_32 = {32{1'b0}}; + case (be30) + 4'b1110 : + begin + buf0_32[23:0] = dmadatai_max[31:8]; + end + 4'b1100 : + begin + buf0_32[15:0] = dmadatai_max[31:16]; + end + 4'b1000 : + begin + buf0_32[7:0] = dmadatai_max[31:24]; + end + default : + begin + buf0_32 = dmadatai_max[31:0]; + end + endcase + buf0_c <= buf0_32 ; + end + endcase + end + + always @(buflev or buf_r_max or buf0_c or bufwe or ififowe) + begin : tbuf_proc + reg[23:0] buf_16; + reg[55:0] buf_32; + case (DATAWIDTH) + 8 : + begin + buf_c <= buf0_c ; + end + 16 : + begin + buf_16 = buf_r_max[DATAWIDTH * 2 - 9:0]; + if (bufwe) + begin + case (buflev) + 4'b0000 : + begin + buf_16[15:0] = buf0_c; + end + 4'b0001 : + begin + buf_16[23:8] = buf0_c; + end + 4'b0010 : + begin + buf_16[15:0] = buf0_c; + end + default : + begin + buf_16[23:8] = buf0_c; + buf_16[7:0] = buf_r_max[23:16]; + end + endcase + end + else if (ififowe) + begin + buf_16 = {buf_r_max[23:8], buf_r_max[23:16]}; + end + buf_c <= buf_16 ; + end + default : + begin + buf_32 = buf_r_max[DATAWIDTH * 2 - 9:0]; + if (bufwe) + begin + case (buflev) + 4'b0000 : + begin + buf_32[31:0] = buf0_c; + end + 4'b0001 : + begin + buf_32[39:8] = buf0_c; + end + 4'b0010 : + begin + buf_32[47:16] = buf0_c; + end + 4'b0011 : + begin + buf_32[55:24] = buf0_c; + end + 4'b0100 : + begin + buf_32[31:0] = buf0_c; + end + 4'b0101 : + begin + buf_32[39:8] = buf0_c; + buf_32[7:0] = buf_r_max[39:32]; + end + 4'b0110 : + begin + buf_32[47:16] = buf0_c; + buf_32[15:0] = buf_r_max[47:32]; + end + default : + begin + buf_32[55:24] = buf0_c; + buf_32[23:0] = buf_r_max[55:32]; + end + endcase + end + else if (ififowe) + begin + buf_32 = {buf_r_max[55:24], buf_r_max[55:32]}; + end + buf_c <= buf_32 ; + end + endcase + end + + assign bufwe = (dmaack & !set & fifonf & !tsprog & + (lsm == LSM_BUF1 | lsm == LSM_BUF2)) ? 1'b1 : 1'b0 ; + + assign fifodata = buf_r_max[DATAWIDTH - 1:0] ; + + assign be10 = (DATAWIDTH == 16) ? be : {2{1'b1}} ; + + assign be30 = (DATAWIDTH == 32) ? be : {4{1'b1}} ; + + always @(be10 or be30) + begin : addv_proc + case (DATAWIDTH) + 8 : + begin + addv_c <= 4'b0000 ; + end + 16 : + begin + case (be10) + 2'b01, 2'b10 : + begin + addv_c <= 4'b0001 ; + end + default : + begin + addv_c <= 4'b0010 ; + end + endcase + end + default : + begin + case (be30) + 4'b0001, 4'b1000 : + begin + addv_c <= 4'b0001 ; + end + 4'b0011, 4'b1100 : + begin + addv_c <= 4'b0010 ; + end + 4'b0111, 4'b1110 : + begin + addv_c <= 4'b0011 ; + end + default : + begin + addv_c <= 4'b0100 ; + end + endcase + end + endcase + end + + always @(buflev or bufwe or ififowe or addv_c) + begin : buflev_proc + case (DATAWIDTH) + 8 : + begin + if (bufwe) + begin + buflev_c <= 4'b0001 ; + end + else if (ififowe) + begin + buflev_c <= 4'b0000 ; + end + else + begin + buflev_c <= buflev ; + end + end + 16 : + begin + if (bufwe) + begin + buflev_c <= ({buflev[3:2], 1'b0, buflev[0]}) + addv_c ; + end + else if (ififowe & (buflev[1])) + begin + buflev_c <= {buflev[3:2], 1'b0, buflev[0]} ; + end + else if (ififowe & !(buflev[1])) + begin + buflev_c <= {buflev[3:1], 1'b0} ; + end + else + begin + buflev_c <= buflev ; + end + end + default : + begin + if (bufwe) + begin + buflev_c <= ({buflev[3:3], 1'b0, buflev[1:0]}) + addv_c ; + end + else if (ififowe & (buflev[2])) + begin + buflev_c <= {buflev[3:3], 1'b0, buflev[1:0]} ; + end + else if (ififowe & !(buflev[2])) + begin + buflev_c <= {buflev[3:2], 2'b00} ; + end + else + begin + buflev_c <= buflev ; + end + end + endcase + end + + always @(posedge clk) + begin : buf_reg_proc + if (rst) + begin + buflev <= {4{1'b0}} ; + firstb <= 1'b1 ; + buf_r <= {(DATAWIDTH*2){1'b0}} ; + end + else + begin + buflev <= buflev_c ; + firstb <= firstb_c ; + buf_r <= buf_c ; + end + end + + always @(posedge clk) + begin : lbe_reg_proc + if (rst) + begin + fifobe <= {(DATAWIDTH/8){1'b1}} ; + end + else + begin + if (ififowe) + begin + case (DATAWIDTH) + 8 : + begin + fifobe <= 1'b1 ; + end + 16 : + begin + case (buflev) + 4'b0001 : + begin + fifobe <= 2'b01 ; + end + default : + begin + fifobe <= 2'b11 ; + end + endcase + end + default : + begin + case (buflev) + 4'b0001 : + begin + fifobe <= 4'b0001 ; + end + 4'b0010 : + begin + fifobe <= 4'b0011 ; + end + 4'b0011 : + begin + fifobe <= 4'b0111 ; + end + default : + begin + fifobe <= 4'b1111 ; + end + endcase + end + endcase + end + end + end + + assign es_c = ur | lc | lo | nc | ec ; + + assign tstat = {1'b0, TDES0_RV[30:16], + es_c, TDES0_RV[14:12], lo, nc, lc, + ec, TDES0_RV[7], + cc, TDES0_RV[2], ur, de}; + + assign datao32 = (tsprog) ? tstat : (set) ? SET0_RV : TDES0_RV ; + + always @(posedge clk) + begin : dataimax_reg_proc + if (rst) + begin + dataimax_r <= {DATADEPTH_MAX{1'b1}} ; + end + else + begin + case (DATAWIDTH) + 8 : + begin + case (dmaaddr20) + 3'b000, 3'b100 : + begin + dataimax_r[7:0] <= dmadatai_max[DATAWIDTH-1:0] ; + end + 3'b001, 3'b101 : + begin + dataimax_r[15:8] <= dmadatai_max[DATAWIDTH-1:0] ; + end + 3'b010, 3'b110 : + begin + dataimax_r[23:16] <= dmadatai_max[DATAWIDTH-1:0] ; + end + default : + begin + dataimax_r[31:24] <= dmadatai_max[DATAWIDTH-1:0] ; + end + endcase + end + 16 : + begin + if (!(dmaaddr[1])) + begin + dataimax_r[15:0] <= dmadatai_max[DATAWIDTH-1:0] ; + end + else + begin + dataimax_r[31:16] <= dmadatai_max[DATAWIDTH-1:0] ; + end + end + default : + begin + dataimax_r <= dmadatai_max[31:0] ; + end + endcase + end + end + + always @(datao32 or dmaaddr) + begin : datao_proc + reg[1:0] addr10; + addr10 = dmaaddr[1:0]; + case (DATAWIDTH) + 8 : + begin + case (addr10) + 2'b00 : + begin + dmadatao <= datao32[7:0] ; + end + 2'b01 : + begin + dmadatao <= datao32[15:8] ; + end + 2'b10 : + begin + dmadatao <= datao32[23:16] ; + end + default : + begin + dmadatao <= datao32[31:24] ; + end + endcase + end + 16 : + begin + if (!(addr10[1])) + begin + dmadatao <= datao32[15:0] ; + end + else + begin + dmadatao <= datao32[31:16] ; + end + end + default : + begin + dmadatao <= datao32 ; + end + endcase + end + + assign flmax_sub = fzero_max[FIFODEPTH - 1:0] - 1 - fifolev ; + + assign flmax = {fzero_max[FIFODEPTH_MAX - 1:FIFODEPTH], + flmax_sub} ; + + assign blmax = {fzero_max[FIFODEPTH_MAX - 1:6], pbl} ; + + assign bsmax = (DATAWIDTH == 8) ? {fzero_max[FIFODEPTH_MAX - 1:12], + bcnt} : + (DATAWIDTH ==16) ? {fzero_max[FIFODEPTH_MAX - 1:11], + bcnt[11:1]} : + {fzero_max[FIFODEPTH_MAX - 1:10], + bcnt[11:2]} ; + + always @(posedge clk) + begin : fifolev_reg_proc + if (rst) + begin + fl_g_bs <= 1'b0 ; + fl_g_bl <= 1'b0 ; + bl_g_bs <= 1'b0 ; + pblz <= 1'b0 ; + end + else + begin + if (flmax >= bsmax) + begin + fl_g_bs <= 1'b1 ; + end + else + begin + fl_g_bs <= 1'b0 ; + end + + if (flmax >= blmax) + begin + fl_g_bl <= 1'b1 ; + end + else + begin + fl_g_bl <= 1'b0 ; + end + + if (blmax >= bsmax) + begin + bl_g_bs <= 1'b1 ; + end + else + begin + bl_g_bs <= 1'b0 ; + end + + if (pbl == 6'b000000) + begin + pblz <= 1'b1 ; + end + else + begin + pblz <= 1'b0 ; + end + end + end + + always @(csm or + lsm or + pblz or + tsprog or + fl_g_bs or + fl_g_bl or + bl_g_bs or + blmax or + bsmax or + flmax or + fzero_max or + buffetch or + dmacnt_r) + begin : dmacnt_proc + if (lsm == LSM_DES0 | + lsm == LSM_DES1 | + lsm == LSM_DES2 | + lsm == LSM_DES3 | + lsm == LSM_STAT | tsprog) + begin + case (DATAWIDTH) + 8 : + begin + dmacnt_c <= {fzero_max[FIFODEPTH_MAX - 1:3], 3'b100} ; + end + 16 : + begin + dmacnt_c <= {fzero_max[FIFODEPTH_MAX - 1:3], 3'b010} ; + end + default : + begin + dmacnt_c <= {fzero_max[FIFODEPTH_MAX - 1:3], 3'b001} ; + end + endcase + end + else if(!buffetch) + begin + if (pblz) + begin + if (fl_g_bs | csm == CSM_SET) + begin + dmacnt_c <= bsmax ; + end + else + begin + dmacnt_c <= flmax ; + end + end + else + begin + if (fl_g_bl | csm == CSM_SET) + begin + if (bl_g_bs) + begin + dmacnt_c <= bsmax ; + end + else + begin + dmacnt_c <= blmax ; + end + end + else + begin + if (fl_g_bs) + begin + dmacnt_c <= bsmax ; + end + else + begin + dmacnt_c <= flmax ; + end + end + end + end + else + begin + dmacnt_c <= dmacnt_r; + end + end + + always @(posedge clk) + begin : dmacnt_reg_proc + if (rst) + begin + dmacnt_r <= {FIFODEPTH_MAX{1'b0}}; + end + else + begin + dmacnt_r <= dmacnt_c; + end + end + + assign dmacnt = dmacnt_c; + + always @(posedge clk) + begin : lastdma_reg_proc + if (rst) + begin + lastdma <= 1'b1 ; + end + else + begin + if (lsm == LSM_DES0 | + lsm == LSM_DES1 | + lsm == LSM_DES2 | + lsm == LSM_DES3 | + lsm == LSM_STAT | tsprog) + begin + lastdma <= 1'b1 ; + end + else if (!buffetch) + begin + if (pblz) + begin + if (fl_g_bs | csm == CSM_SET) + begin + lastdma <= 1'b1 ; + end + else + begin + lastdma <= 1'b0 ; + end + end + else + begin + if (fl_g_bl | csm == CSM_SET) + begin + if (bl_g_bs) + begin + lastdma <= 1'b1 ; + end + else + begin + lastdma <= 1'b0 ; + end + end + else + begin + if (fl_g_bs) + begin + lastdma <= 1'b1 ; + end + else + begin + lastdma <= 1'b0 ; + end + end + end + end + end + end + + always @(tsprog or lsm or statadi or bad or dad or statad) + begin : dmaaddro_proc + if (tsprog) + begin + dmaaddro <= statadi ; + end + else + begin + case (lsm) + LSM_BUF1, LSM_BUF2 : + begin + dmaaddro <= bad ; + end + LSM_STAT : + begin + dmaaddro <= statad ; + end + default : + begin + dmaaddro <= dad ; + end + endcase + end + end + + always @(req or + dmaack or + dmaeob or + lsm or + tsprog or + fifoval or + req_r) + begin : req_proc + case (lsm) + LSM_BUF1, LSM_BUF2 : + begin + if (dmaack & dmaeob) + begin + req_c <= 1'b0 ; + end + else if ((fifoval & req_r == 3'b000) | tsprog) + begin + req_c <= 1'b1 ; + end + else + begin + req_c <= req ; + end + end + LSM_DES0, LSM_DES1, LSM_DES2, LSM_DES3, LSM_STAT : + begin + if (dmaack) + begin + req_c <= 1'b0 ; + end + else + begin + req_c <= 1'b1 ; + end + end + default : + begin + if (dmaack) + begin + req_c <= 1'b0 ; + end + else if (tsprog) + begin + req_c <= 1'b1 ; + end + else + begin + req_c <= 1'b0 ; + end + end + endcase + end + + always @(posedge clk) + begin : req_reg_proc + if (rst) + begin + req <= 1'b0 ; + req_r <= {3{1'b0 }}; + dmaack_r <= 1'b0 ; + end + else + begin + req <= req_c ; + req_r[0] <= req; + req_r[1] <= req_r[0]; + req_r[2] <= req_r[1]; + dmaack_r <= dmaack & dmaeob ; + end + end + + assign dmawr = (tsprog | lsm == LSM_STAT) ? 1'b1 : 1'b0 ; + + assign dmareq = req ; + + always @(posedge clk) + begin : stat_reg_proc + if (rst) + begin + des <= 1'b0 ; + fbuf <= 1'b0 ; + stat <= 1'b0 ; + tsprog <= 1'b0 ; + buffetch <= 1'b0 ; + tu <= 1'b0 ; + end + else + begin + if (lsm == LSM_DES0 | + lsm == LSM_DES1 | + lsm == LSM_DES2 | + lsm == LSM_DES3) + begin + des <= 1'b1 ; + end + else + begin + des <= 1'b0 ; + end + + if (lsm == LSM_BUF1 | lsm == LSM_BUF2) + begin + fbuf <= 1'b1 ; + end + else + begin + fbuf <= 1'b0 ; + end + + if (tsprog) + begin + stat <= 1'b1 ; + end + else + begin + stat <= 1'b0 ; + end + + if ((dmaeob & dmaack) | itcomp | tcompack_r) + begin + tsprog <= 1'b0 ; + end + else if (csne & !idmareq & !icachere) + begin + tsprog <= 1'b1 ; + end + + if (dmaack_r) + begin + buffetch <= 1'b0 ; + end + else if (req_r[0] & (lsm == LSM_BUF1 | lsm == LSM_BUF2)) + begin + buffetch <= 1'b1 ; + end + + if (lsm == LSM_IDLE & !own) + begin + tu <= 1'b1 ; + end + else if (own_c) + begin + tu <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : tcompack_reg_proc + if (rst) + begin + tcompack_r <= 1'b0 ; + itcomp <= 1'b0 ; + end + else + begin + tcompack_r <= tcompack ; + + if (tsprog & dmaeob & dmaack) + begin + itcomp <= 1'b1 ; + end + else if (tcompack_r) + begin + itcomp <= 1'b0 ; + end + end + end + + assign tcomp = itcomp ; + + always @(posedge clk) + begin : setp_reg_proc + if (rst) + begin + setp <= 1'b0 ; + end + else + begin + if (csm == CSM_SET) + begin + setp <= 1'b1 ; + end + else + begin + setp <= 1'b0 ; + end + end + end + + always @(posedge clk) + begin : ifaddr_reg_proc + if (rst) + begin + ifaddr <= {ADDRDEPTH{1'b0}} ; + end + else + begin + if (csm == CSM_IDLE) + begin + ifaddr <= {ADDRDEPTH{1'b0}} ; + end + else if (ifwe) + begin + ifaddr <= ifaddr + 1 ; + end + end + end + + always @(posedge clk) + begin : ifwe_reg_proc + if (rst) + begin + ifwe <= 1'b0 ; + end + else + begin + case (DATAWIDTH) + 8 : + begin + if (csm == CSM_SET & + dmaack & + dmaaddr[1:0] == 2'b11 & + lsm == LSM_BUF1) + begin + ifwe <= 1'b1 ; + end + else + begin + ifwe <= 1'b0 ; + end + end + 16 : + begin + if (csm == CSM_SET & + dmaack & + dmaaddr[1] & + lsm == LSM_BUF1) + begin + ifwe <= 1'b1 ; + end + else + begin + ifwe <= 1'b0 ; + end + end + default : + begin + if (csm == CSM_SET & dmaack & + lsm == LSM_BUF1) + begin + ifwe <= 1'b1 ; + end + else + begin + ifwe <= 1'b0 ; + end + end + endcase + end + end + + assign faddr = ifaddr ; + + assign fwe = ifwe ; + + assign fdata = dataimax_r[15:0] ; + + always @(posedge clk) + begin : stop_reg_proc + if (rst) + begin + stop_r <= 1'b1 ; + stopo <= 1'b1 ; + end + else + begin + stop_r <= stopi ; + + if (lsm == LSM_IDLE & stop_r) + begin + stopo <= 1'b1 ; + end + else + begin + stopo <= 1'b0 ; + end + end + end + + assign fzero_max = {FIFODEPTH_MAX{1'b0}} ; + + assign dzero_max = {DATAWIDTH_MAX{1'b0}} ; + + assign bufzero_max = {(DATAWIDTH_MAX * 2 - 9){1'b0}} ; + + assign dmaaddr20 = dmaaddr[2:0] ; + + assign dmadatai_max = {dzero_max[DATAWIDTH_MAX+1:DATAWIDTH], + dmadatai}; + + assign buf_r_max = {bufzero_max[DATAWIDTH_MAX * 2 - 7: + DATAWIDTH * 2 - 8], + buf_r}; + +endmodule + diff --git a/resources/soc/simu/testbench/vmac/ram.vlog b/resources/soc/simu/testbench/vmac/ram.vlog new file mode 100644 index 0000000..8722327 --- /dev/null +++ b/resources/soc/simu/testbench/vmac/ram.vlog @@ -0,0 +1,22018 @@ +@400 +80000000 +61000100 +00002000 +00001080 + +@420 +80000000 +61000100 +00003000 +00001000 + +@440 +80000000 +00000100 +00004000 +00000000 + +@800 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +43224355 +54245245 +67654766 +43524524 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +43524524 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +45657478 +09979866 +32413141 +34134324 +32434123 +54356455 +65436554 +67467565 +78578578 +78568783 +32432434 +54665867 +12113233 +45256475 +56748678 +56435355 +63543565 +67465765 +12313133 +54654563 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +34234254 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +32154254 +42543523 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +32410987 +21543243 +65745623 +12342342 +24132123 +01234567 +01234567 +89a0cdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 +89abcdef +01234567 diff --git a/resources/soc/simu/testbench/vmac/virtual_mac.v b/resources/soc/simu/testbench/vmac/virtual_mac.v new file mode 100644 index 0000000..f913c52 --- /dev/null +++ b/resources/soc/simu/testbench/vmac/virtual_mac.v @@ -0,0 +1,406 @@ +/*------------------------------------------------------------------------------ +-------------------------------------------------------------------------------- +Copyright (c) 2016, Loongson Technology Corporation Limited. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +3. Neither the name of Loongson Technology Corporation Limited nor the names of +its contributors may be used to endorse or promote products derived from this +software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE +TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +------------------------------------------------------------------------------*/ + +`timescale 1ns/1ps +`define IO_DELAY 2.5 + +module virtual_mac( + hclk, hrst_n, + mtxclk, mtxen, mtxd, mtxerr, + mrxclk, mrxdv, mrxd, mrxerr, + mcoll, mcrs, + mdc, md_io, + gpio); + +input hclk, hrst_n; +input mtxclk; +output [3:0] mtxd; +output mtxen; +output mtxerr; + +input mrxclk; +input [3:0] mrxd; +input mrxdv; +input mrxerr; + +input mcoll; +input mcrs; + +inout md_io; +output mdc; + +input gpio; + +wire md_oe, md_o; +wire mdio = md_oe ? md_o : 1'bz; +wire md_i = mdio; + +wire [1:0] v_htrans; +wire [2:0] v_hburst; +wire [31:0] v_haddr; +wire v_hwrite; +wire [2:0] v_hsize; +wire [31:0] v_hrdata; +wire [31:0] v_hwdata; +wire v_hrdy; +wire [1:0] v_hresp = 2'b0; + +wire m_hreq, m_hlock, m_hgnt; +wire [1:0] m_htrans; +wire [2:0] m_hburst; +wire [31:0] m_haddr; +wire m_hwrite; +wire [2:0] m_hsize; +wire [3:0] m_hprot; +wire [31:0] m_hwdata; + +wire s_hsel, s_hrdy; +wire [1:0] s_hresp; +wire [15:0] s_hsplit; +wire [31:0] s_hrdata; + +wire read_complete; +assign m_hgnt = ~s_hsel; +reg grant_dly; +always @(posedge hclk) + grant_dly <= m_hgnt & m_hreq; + +wire [3:0] mtxd_mid; +wire mtxen_mid; +wire mtxerr_mid; +wire mdc_mid; +assign #`IO_DELAY mtxd = mtxd_mid; +assign #`IO_DELAY mtxen = mtxen_mid; +assign #`IO_DELAY mtxerr = mtxerr_mid; +assign #`IO_DELAY mdc = mdc_mid; +vMAC_TOP virtual_core +( + .hclk(hclk), .hrst_(hrst_n), .SYS_RST_(hrst_n), + + .hmst(4'b1), .hmstlock(1'b0), + .htrans(v_htrans), .hburst(v_hburst), .haddr(v_haddr), + .hwrite(v_hwrite), .hsize(v_hsize), + .hrdata(v_hrdata), .hwdata(v_hwdata), .hrdy(v_hrdy), .hresp(v_hresp), + .eth_hreq(m_hreq), .eth_hlock(m_hlock), .eth_hgnt(m_hgnt), + .eth_htrans(m_htrans), .eth_hburst(m_hburst), .eth_haddr(m_haddr), + .eth_hwrite(m_hwrite), .eth_hsize(m_hsize), .eth_hprot(m_hprot), + .eth_hwdata(m_hwdata), + .eth_hsel(s_hsel), .eth_hrdy(s_hrdy), .eth_hresp(s_hresp), .eth_hsplit(s_hsplit), + .eth_hrdata(s_hrdata), + + .interrupt(), + .mtxclk(mtxclk), .mtxen(mtxen_mid), .mtxd(mtxd_mid), .mtxerr(mtxerr_mid), + .mrxclk(mrxclk), .mrxdv(mrxdv), .mrxd(mrxd), .mrxerr(mrxerr), + .mcoll(mcoll), .mcrs(mcrs), + .mdc(mdc_mid), .md_i(md_i), .md_o(md_o), .md_oe(md_oe), + + .bist_mode(1'b0) + ); + +virtual_mac_slave virtual_mac_slave_0( + .hclk(hclk), .hrst_n(hrst_n), + .hreq(m_hreq), .hlock(m_hlock), .hgnt(m_hgnt), .hrdy(v_hrdy), + .htrans(m_htrans), .hburst(m_hburst), .haddr(m_haddr), .hrdata(v_hrdata), + .hwrite(m_hwrite), .hsize(m_hsize), .hprot(m_hprot), .hwdata(m_hwdata), .read_complete(read_complete)); + +virtual_mac_master virtual_mac_master_0( + .hclk(hclk), .hrst_n(hrst_n), .grant_dly(grant_dly), + .hsel(s_hsel), .htrans(v_htrans), .hburst(v_hburst), .hsize(v_hsize), .hrdy(s_hrdy), + .hwrite(v_hwrite), .hrdata(s_hrdata), .hwdata(v_hwdata), .haddr(v_haddr), .hprot(), .read_complete(read_complete), + .gpio(gpio)); +endmodule + +module virtual_mac_slave( + hclk, hrst_n, + hreq, hlock, hgnt, hrdy, + htrans, hburst, haddr, hrdata, + hwrite, hsize, hprot, hwdata, read_complete); +input hclk, hrst_n; +input hreq, hlock, hgnt; +input [1:0] htrans; +input [2:0] hburst; +input [31:0] haddr; +output[31:0] hrdata; +input hwrite; +input [2:0] hsize; +input [3:0] hprot; +input [31:0] hwdata; +output hrdy; +input read_complete; + +wire hrdy = 1'b1; +wire s_command = (htrans[1] == 1'b1) & hrdy; + + +reg [31:0] MEM_in[1048575:0]; +reg [31:0] MEM_out[1048575:0]; +reg reg_enable; +wire s_end = hrdy & reg_enable; +always @(posedge hclk) + if (~hrst_n) + reg_enable <= 1'b0; + else if (s_command) + reg_enable <= 1'b1; + else if (s_end) + reg_enable <= 1'b0; + +reg reg_we; +always @(posedge hclk) + if (~hrst_n) + reg_we <= 1'b0; + else if (s_command) + reg_we <= hwrite; + else if (s_end) + reg_we <= 1'b0; + +reg [31:0] reg_addr; +always @(posedge hclk) + if (~hrst_n) + reg_addr <= 31'b0; + else if (s_command) + reg_addr <= {2'b00,haddr[31:2]}; + +integer i; +`ifdef VIRTUAL_MAC +initial +begin + for (i = 0 ;i <1048576; i = i+1) MEM_out[i] = 32'b0; + #100; + $readmemh("../../testbench/vmac/ram.vlog", MEM_out); + $display("[%t]:)[virtual_mac]:reading ../../testbench/vmac/ram.vlog",$time); + $display("DEBUG: MEM_out[32'h1040]=%h, MEM_out[32'h840]=%h", MEM_out[32'h1040], MEM_out[32'h840]); +end +`endif + +initial +begin + @(posedge read_complete); + for (i= 0; i < 32'h40; i= i+1) + if (MEM_out[i+32'h800] != MEM_out[i+32'h1000]) + $display("[%t]:[virtual_mac]:error data, MEM_out[%h] = %h, correct is %h",$time, i, MEM_out[i+32'h1000], MEM_out[i+32'h800]); + else + $display("data, MEM_out[%h] = %h", i, MEM_out[i+32'h1000]); +`ifdef MAC_DEBUG + $display("[%t]:[virtual_mac]:valuation complete",$time); +`endif +end + +reg flag; +initial + begin + flag = 1'b0; + end + +always @(posedge hclk) + if (hrst_n & reg_we & s_end) + begin + MEM_out[reg_addr] <= hwdata; + if (reg_addr==32'h1040) flag = 1'b1; + end + +assign hrdata = (reg_addr == 32'h400 |reg_addr == 32'h420)? 32'h80000000: MEM_out[reg_addr]; + +endmodule + +module virtual_mac_master( + hclk, hrst_n, grant_dly, + hsel, htrans, hburst, hsize, hrdy, + hwrite, hrdata, hwdata, haddr, hprot, read_complete, + gpio); +input hclk, hrst_n; +input grant_dly; +output hsel; +output [1:0] htrans; +output [2:0] hburst; +output [2:0] hsize; +input hrdy; +output hwrite; +input [31:0] hrdata; +output [31:0] hwdata; +output [31:0] haddr; +output [3:0] hprot; +output read_complete; +input gpio; + +reg ready; +reg hsel; +reg [1:0] htrans; +reg [2:0] hburst; +reg [2:0] hsize; +reg hwrite; +reg [31:0] hwdata; +reg [31:0] haddr; +reg [3:0] hprot; + +reg read_complete; + +`ifdef MAC_DEBUG +wire debug = 1; +`else +wire debug = 0; +`endif + +initial begin + +htrans = 2'b00; +haddr = 2'b00; +hburst = 3'b00; +hwrite = 1'b0; +hsize = 3'b000; +hwdata = 32'b0; +hsel = 1'b0; +hprot = 4'b0; + +read_complete = 1'b0; + +ready = 1'b0; + +`ifdef VIRTUAL_MAC +@(posedge hrst_n); + +wait(gpio); + +@(posedge hclk) + +if (debug) $display("[%t]:[virtual_mac]:start transmit process ",$time); +while (grant_dly) @(posedge hclk); +one_write(32'h00,32'h0000, 2); + +while (grant_dly) @(posedge hclk); +one_write(32'h20,32'h1000, 2); + +while (grant_dly) @(posedge hclk); +one_write(32'h18,32'h1100, 2); + +while (grant_dly) @(posedge hclk); +one_write(32'h30,32'h40002002, 2); + +@(posedge hclk) + +while (grant_dly) @(posedge hclk); +one_read(32'h28,2); +while (hrdata[6]==0) +begin + while (grant_dly) @(posedge hclk); + one_read(32'h28,2); + repeat(10)@(posedge hclk); + #3; +end +read_complete = 1'b1; + +if (debug) $display("[%t]:[virtual_mac]:receive process complete",$time); + +`endif +end + + +task one_write; +input [11:0] addr; +input [31:0] wdata; +input [2:0] size; +begin +if (debug) $display("[%t]:[virtual_mac]: write address phase begin: haddr = %x",$time, addr); +htrans = 2'b10; +haddr = addr; +hburst = 3'b00; +hwrite = 1'b1; +hsize = size; +hsel = 1'b1; +ready = 1'b0; + +@(posedge hclk); + if( hrdy == 1'b1) ready = 1'b1; +while (ready != 1'b1) +begin + @(posedge hclk); + if( hrdy == 1'b1) ready = 1'b1; + #3; +end +ready = 1'b0; + +if (debug) $display("[%t]:[virtual_mac]: write data phase begin: haddr = %x", $time, addr); + +hwdata = wdata; +hsel = 1'b0; +htrans = 2'b00; +@(posedge hclk); + if( hrdy == 1'b1) ready = 1'b1; +while (ready != 1'b1) +begin + @(posedge hclk); + if( hrdy == 1'b1) ready = 1'b1; + #3; +end +ready = 1'b0; + +if (debug) $display("[%t]:[virtual_mac]: write complete!!!", $time); +end +endtask + +task one_read; +input [11:0] addr; +input [2:0] size; +begin +htrans = 2'b10; +haddr = addr; +hburst = 3'b00; +hwrite = 1'b0; +hsize = size; +hsel = 1'b1; + + +@(posedge hclk); + if( hrdy == 1'b1) ready = 1'b1; +while (ready != 1'b1) +begin + @(posedge hclk); + if( hrdy == 1'b1) ready = 1'b1; + #3; +end +ready = 1'b0; + +htrans = 2'b00; + +hsel = 1'b0; +@(posedge hclk); + if( hrdy == 1'b1) ready = 1'b1; +while (ready != 1'b1) +begin + @(posedge hclk); + if( hrdy == 1'b1) ready = 1'b1; +end +ready = 1'b0; +end +endtask + +endmodule diff --git a/resources/soc/vivado_xpr/project_1/project_1/project_1.xpr b/resources/soc/vivado_xpr/project_1/project_1/project_1.xpr new file mode 100644 index 0000000..cea8981 --- /dev/null +++ b/resources/soc/vivado_xpr/project_1/project_1/project_1.xpr @@ -0,0 +1,1154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Vivado Synthesis Defaults + + + + + + + + + + + + Vivado Synthesis Defaults + + + + + + + + + + + + Vivado Synthesis Defaults + + + + + + + + + + + + Vivado Synthesis Defaults + + + + + + + + + + + + Vivado Synthesis Defaults + + + + + + + + + + + + Vivado Synthesis Defaults + + + + + + + + + + + + Vivado Synthesis Defaults + + + + + + + + + + + + Vivado Synthesis Defaults + + + + + + + + + + + + Vivado Synthesis Defaults + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Default settings for Implementation. + + + + + + + + + + + + + + + + + + + Default settings for Implementation. + + + + + + + + + + + + + + + + + + + Default settings for Implementation. + + + + + + + + + + + + + + + + + + + Default settings for Implementation. + + + + + + + + + + + + + + + + + + + Default settings for Implementation. + + + + + + + + + + + + + + + + + + + Default settings for Implementation. + + + + + + + + + + + + + + + + + + + Default settings for Implementation. + + + + + + + + + + + + + + + + + + + Default settings for Implementation. + + + + + + + + + + + + + + + + + + + Default settings for Implementation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + default_dashboard + + + diff --git a/resources/soc/vivado_xpr/project_1/xilinx_ip/axi_interconnect_0/axi_interconnect_0.xci b/resources/soc/vivado_xpr/project_1/xilinx_ip/axi_interconnect_0/axi_interconnect_0.xci new file mode 100644 index 0000000..c3afcac --- /dev/null +++ b/resources/soc/vivado_xpr/project_1/xilinx_ip/axi_interconnect_0/axi_interconnect_0.xci @@ -0,0 +1,1520 @@ + + + xilinx.com + xci + unknown + 1.0 + + + axi_interconnect_0 + + + 32 + 0 + 0 + 0 + + 32 + 100000000 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 8 + 0 + 256 + 2 + 1 + 2 + 1 + 0.000 + AXI4 + READ_WRITE + 0 + 0 + 1 + 0 + 0 + 32 + 0 + 0 + 0 + + 32 + 100000000 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 4 + 0 + 256 + 2 + 1 + 2 + 1 + 0.000 + AXI4 + READ_WRITE + 0 + 0 + 1 + 0 + 0 + 32 + 0 + 0 + 0 + + 32 + 100000000 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 4 + 0 + 256 + 2 + 1 + 2 + 1 + 0.000 + AXI4 + READ_WRITE + 0 + 0 + 1 + 0 + 0 + 32 + 0 + 0 + 0 + + 64 + 100000000 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 4 + 0 + 256 + 2 + 1 + 2 + 1 + 0.000 + AXI4 + READ_WRITE + 0 + 0 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + + + + 100000000 + 0 + 0.000 + 0 + ACTIVE_LOW + + + + 100000000 + 0 + 0.000 + + + + 100000000 + 0 + 0.000 + + + + 100000000 + 0 + 0.000 + + + + 100000000 + 0 + 0.000 + + + + 100000000 + 0 + 0.000 + + + + 100000000 + 0 + 0.000 + + + + 100000000 + 0 + 0.000 + + + + 100000000 + 0 + 0.000 + + + + 100000000 + 0 + 0.000 + + + + 100000000 + 0 + 0.000 + + + + 100000000 + 0 + 0.000 + + + + 100000000 + 0 + 0.000 + + + + 100000000 + 0 + 0.000 + + + + 100000000 + 0 + 0.000 + + + + 100000000 + 0 + 0.000 + + + + 100000000 + 0 + 0.000 + + + + 100000000 + 0 + 0.000 + 32 + artix7 + 32 + 1:1 + 32 + 0 + 0 + 512 + 8 + 1 + 0 + 512 + 8 + 3 + 1:1 + 0 + 32 + 1 + 4 + 0 + 32 + READ/WRITE + 1 + 4 + 0 + 32 + 1:1 + 0 + 32 + 1 + 2 + 0 + 32 + READ/WRITE + 1 + 2 + 0 + 32 + 1:1 + 0 + 64 + 1 + 2 + 0 + 32 + READ/WRITE + 1 + 2 + 0 + 32 + 1:1 + 0 + 32 + 0 + 1 + 0 + 0 + READ/WRITE + 0 + 1 + 0 + 0 + 1:1 + 0 + 32 + 0 + 1 + 0 + 0 + READ/WRITE + 0 + 1 + 0 + 0 + 1:1 + 0 + 32 + 0 + 1 + 0 + 0 + READ/WRITE + 0 + 1 + 0 + 0 + 1:1 + 0 + 32 + 0 + 1 + 0 + 0 + READ/WRITE + 0 + 1 + 0 + 0 + 1:1 + 0 + 32 + 0 + 1 + 0 + 0 + READ/WRITE + 0 + 1 + 0 + 0 + 1:1 + 0 + 32 + 0 + 1 + 0 + 0 + READ/WRITE + 0 + 1 + 0 + 0 + 1:1 + 0 + 32 + 0 + 1 + 0 + 0 + READ/WRITE + 0 + 1 + 0 + 0 + 1:1 + 0 + 32 + 0 + 1 + 0 + 0 + READ/WRITE + 0 + 1 + 0 + 0 + 1:1 + 0 + 32 + 0 + 1 + 0 + 0 + READ/WRITE + 0 + 1 + 0 + 0 + 1:1 + 0 + 32 + 0 + 1 + 0 + 0 + READ/WRITE + 0 + 1 + 0 + 0 + 1:1 + 0 + 32 + 0 + 1 + 0 + 0 + READ/WRITE + 0 + 1 + 0 + 0 + 1:1 + 0 + 32 + 0 + 1 + 0 + 0 + READ/WRITE + 0 + 1 + 0 + 0 + 1:1 + 0 + 32 + 0 + 1 + 0 + 0 + READ/WRITE + 0 + 1 + 0 + 0 + 2 + 4 + 4 + 0 + 32 + axi_interconnect_0 + 32 + 1:1 + 32 + 0 + 0 + 512 + 8 + 1 + 0 + 512 + 8 + 3 + 1:1 + 0 + 32 + 1 + 4 + 0 + 32 + READ/WRITE + 1 + 4 + 0 + 32 + 1:1 + 0 + 32 + 1 + 2 + 0 + 32 + READ/WRITE + 1 + 2 + 0 + 32 + 1:1 + 0 + 64 + 1 + 2 + 0 + 32 + READ/WRITE + 1 + 2 + 0 + 32 + 1:1 + 0 + 32 + 0 + 1 + 0 + 0 + READ/WRITE + 0 + 1 + 0 + 0 + 1:1 + 0 + 32 + 0 + 1 + 0 + 0 + READ/WRITE + 0 + 1 + 0 + 0 + 1:1 + 0 + 32 + 0 + 1 + 0 + 0 + READ/WRITE + 0 + 1 + 0 + 0 + 1:1 + 0 + 32 + 0 + 1 + 0 + 0 + READ/WRITE + 0 + 1 + 0 + 0 + 1:1 + 0 + 32 + 0 + 1 + 0 + 0 + READ/WRITE + 0 + 1 + 0 + 0 + 1:1 + 0 + 32 + 0 + 1 + 0 + 0 + READ/WRITE + 0 + 1 + 0 + 0 + 1:1 + 0 + 32 + 0 + 1 + 0 + 0 + READ/WRITE + 0 + 1 + 0 + 0 + 1:1 + 0 + 32 + 0 + 1 + 0 + 0 + READ/WRITE + 0 + 1 + 0 + 0 + 1:1 + 0 + 32 + 0 + 1 + 0 + 0 + READ/WRITE + 0 + 1 + 0 + 0 + 1:1 + 0 + 32 + 0 + 1 + 0 + 0 + READ/WRITE + 0 + 1 + 0 + 0 + 1:1 + 0 + 32 + 0 + 1 + 0 + 0 + READ/WRITE + 0 + 1 + 0 + 0 + 1:1 + 0 + 32 + 0 + 1 + 0 + 0 + READ/WRITE + 0 + 1 + 0 + 0 + 1:1 + 0 + 32 + 0 + 1 + 0 + 0 + READ/WRITE + 0 + 1 + 0 + 0 + 2 + 4 + artix7 + + + xc7a200t + fbg676 + VERILOG + + MIXED + -2 + + + TRUE + TRUE + IP_Flow + 17 + TRUE + . + + . + 2019.2 + OUT_OF_CONTEXT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/soc/vivado_xpr/project_1/xilinx_ip/clk_pll_33/clk_pll_33.xci b/resources/soc/vivado_xpr/project_1/xilinx_ip/clk_pll_33/clk_pll_33.xci new file mode 100644 index 0000000..47f82a4 --- /dev/null +++ b/resources/soc/vivado_xpr/project_1/xilinx_ip/clk_pll_33/clk_pll_33.xci @@ -0,0 +1,716 @@ + + + xilinx.com + xci + unknown + 1.0 + + + clk_pll_33 + + + false + 100000000 + false + 100000000 + false + 100000000 + false + 100000000 + + + + 100000000 + 0 + 0.000 + + + + 100000000 + 0 + 0.000 + 1 + LEVEL_HIGH + + + + 100000000 + 0 + 0.000 + 0 + 0 + + 100000000 + 0 + 0.000 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 0 + MMCM + cddcdone + cddcreq + 0000 + 0000 + clkfb_in_n + clkfb_in + clkfb_in_p + SINGLE + clkfb_out_n + clkfb_out + clkfb_out_p + clkfb_stopped + 100.0 + 100.0 + 0000 + 0000 + 33.00000 + 0000 + 0000 + 100.000 + BUFG + 50.0 + false + 33.00000 + 0.000 + 50.000 + 33.000 + 0.000 + 1 + 0000 + 0000 + 100.000 + BUFG + 50.000 + false + 100.000 + 0.000 + 50.000 + 100.000 + 0.000 + 1 + 0 + 0000 + 0000 + 100.000 + BUFG + 50.000 + false + 100.000 + 0.000 + 50.000 + 100.000 + 0.000 + 1 + 0 + 0000 + 0000 + 100.000 + BUFG + 50.000 + false + 100.000 + 0.000 + 50.000 + 100.000 + 0.000 + 1 + 0 + 0000 + 0000 + 100.000 + BUFG + 50.000 + false + 100.000 + 0.000 + 50.000 + 100.000 + 0.000 + 1 + 0 + 0000 + 0000 + 100.000 + BUFG + 50.000 + false + 100.000 + 0.000 + 50.000 + 100.000 + 0.000 + 1 + 0 + BUFG + 50.000 + false + 100.000 + 0.000 + 50.000 + 100.000 + 0.000 + 1 + 0 + VCO + clk_in_sel + clk_out1 + clk_out2 + clk_out3 + clk_out4 + clk_out5 + clk_out6 + clk_out7 + CLK_VALID + NA + daddr + dclk + den + din + 0000 + 1 + 0.33 + 0.33 + 0.33 + 0.33 + 0.33 + 0.33 + dout + drdy + dwe + 49.000 + 1.000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + FDBK_AUTO + 0000 + 0000 + 0 + Input Clock Freq (MHz) Input Jitter (UI) + __primary_________100.000____________0.010 + no_secondary_input_clock + input_clk_stopped + 0 + Units_MHz + No_Jitter + locked + 0000 + 0000 + 0000 + false + false + false + false + false + false + false + false + OPTIMIZED + 33.000 + 0.000 + FALSE + 10.000 + 10.000 + 25.000 + 0.500 + 0.000 + FALSE + 1 + 0.500 + 0.000 + FALSE + 1 + 0.500 + 0.000 + FALSE + 1 + 0.500 + 0.000 + FALSE + FALSE + 1 + 0.500 + 0.000 + FALSE + 1 + 0.500 + 0.000 + FALSE + 1 + 0.500 + 0.000 + FALSE + FALSE + ZHOLD + 4 + None + 0.010 + 0.010 + FALSE + 64.000 + 2.000 + 1 + Output Output Phase Duty Cycle Pk-to-Pk Phase + Clock Freq (MHz) (degrees) (%) Jitter (ps) Error (ps) + clk_out1__33.00000______0.000______50.0______333.104____261.747 + no_CLK_OUT2_output + no_CLK_OUT3_output + no_CLK_OUT4_output + no_CLK_OUT5_output + no_CLK_OUT6_output + no_CLK_OUT7_output + 0 + 0 + 128.000 + 1.000 + WAVEFORM + UNKNOWN + false + false + false + false + false + OPTIMIZED + 1 + 0.000 + 1.000 + 1 + 0.500 + 0.000 + 1 + 0.500 + 0.000 + 1 + 0.500 + 0.000 + 1 + 0.500 + 0.000 + 1 + 0.500 + 0.000 + 1 + 0.500 + 0.000 + CLKFBOUT + SYSTEM_SYNCHRONOUS + 1 + No notes + 0.010 + power_down + 0000 + 1 + clk_in1 + PLL + AUTO + 100.000 + 0.010 + 10.000 + No_buffer + psclk + psdone + psen + psincdec + 100.0 + 0 + reset + 100.000 + 0.010 + 10.000 + clk_in2 + Single_ended_clock_capable_pin + CENTER_HIGH + 4000 + 0.004 + STATUS + 11 + 32 + 100.0 + 100.0 + 100.0 + 100.0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1866.000 + 800.000 + clk_pll_33 + MMCM + false + empty + cddcdone + cddcreq + clkfb_in_n + clkfb_in + clkfb_in_p + SINGLE + clkfb_out_n + clkfb_out + clkfb_out_p + clkfb_stopped + 100.0 + 0.010 + 100.0 + 0.010 + BUFG + 333.104 + false + 261.747 + 50.000 + 33.000 + 0.000 + 1 + true + BUFG + 0.0 + false + 0.0 + 50.000 + 100.000 + 0.000 + 1 + false + BUFG + 0.0 + false + 0.0 + 50.000 + 100.000 + 0.000 + 1 + false + BUFG + 0.0 + false + 0.0 + 50.000 + 100.000 + 0.000 + 1 + false + BUFG + 0.0 + false + 0.0 + 50.000 + 100.000 + 0.000 + 1 + false + BUFG + 0.0 + false + 0.0 + 50.000 + 100.000 + 0.000 + 1 + false + BUFG + 0.0 + false + 0.0 + 50.000 + 100.000 + 0.000 + 1 + false + 600.000 + Custom + Custom + clk_in_sel + clk_out1 + false + clk_out2 + false + clk_out3 + false + clk_out4 + false + clk_out5 + false + clk_out6 + false + clk_out7 + false + CLK_VALID + auto + clk_pll_33 + daddr + dclk + den + Custom + Custom + din + dout + drdy + dwe + false + false + false + false + false + false + false + false + false + FDBK_AUTO + input_clk_stopped + frequency + Enable_AXI + Units_MHz + Units_UI + UI + No_Jitter + locked + OPTIMIZED + 33 + 0.000 + false + 10.000 + 10.000 + 25 + 0.500 + 0.000 + false + 1 + 0.500 + 0.000 + false + 1 + 0.500 + 0.000 + false + 1 + 0.500 + 0.000 + false + false + 1 + 0.500 + 0.000 + false + 1 + 0.500 + 0.000 + false + 1 + 0.500 + 0.000 + false + false + ZHOLD + 4 + None + 0.010 + 0.010 + false + 1 + false + false + WAVEFORM + false + UNKNOWN + OPTIMIZED + 4 + 0.000 + 10.000 + 1 + 0.500 + 0.000 + 1 + 0.500 + 0.000 + 1 + 0.500 + 0.000 + 1 + 0.500 + 0.000 + 1 + 0.500 + 0.000 + 1 + 0.500 + 0.000 + CLKFBOUT + SYSTEM_SYNCHRONOUS + 1 + None + 0.010 + power_down + 1 + clk_in1 + PLL + mmcm_adv + 100.000 + 0.010 + 10.000 + No_buffer + psclk + psdone + psen + psincdec + 100.0 + REL_PRIMARY + Custom + reset + ACTIVE_HIGH + 100.000 + 0.010 + 10.000 + clk_in2 + Single_ended_clock_capable_pin + CENTER_HIGH + 250 + 0.004 + STATUS + empty + 100.0 + 100.0 + 100.0 + 100.0 + false + false + false + false + false + false + false + true + false + false + false + false + false + false + true + false + false + false + false + false + artix7 + + + xc7a200t + fbg676 + VERILOG + + MIXED + -2 + + + TRUE + TRUE + IP_Flow + 4 + TRUE + . + + . + 2019.2 + OUT_OF_CONTEXT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/soc/vivado_xpr/project_1/xilinx_ip/clk_wiz_0/clk_wiz_0.xci b/resources/soc/vivado_xpr/project_1/xilinx_ip/clk_wiz_0/clk_wiz_0.xci new file mode 100644 index 0000000..3430950 --- /dev/null +++ b/resources/soc/vivado_xpr/project_1/xilinx_ip/clk_wiz_0/clk_wiz_0.xci @@ -0,0 +1,716 @@ + + + xilinx.com + xci + unknown + 1.0 + + + clk_wiz_0 + + + false + 100000000 + false + 100000000 + false + 100000000 + false + 100000000 + + + + 100000000 + 0 + 0.000 + + + + 100000000 + 0 + 0.000 + 1 + LEVEL_HIGH + + + + 100000000 + 0 + 0.000 + 0 + 0 + + 100000000 + 0 + 0.000 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 0 + MMCM + cddcdone + cddcreq + 0000 + 0000 + clkfb_in_n + clkfb_in + clkfb_in_p + SINGLE + clkfb_out_n + clkfb_out + clkfb_out_p + clkfb_stopped + 100.0 + 100.0 + 0000 + 0000 + 200.00000 + 0000 + 0000 + 100.000 + BUFG + 50.0 + false + 200.00000 + 0.000 + 50.000 + 200.000 + 0.000 + 1 + 0000 + 0000 + 100.000 + BUFG + 50.000 + false + 100.000 + 0.000 + 50.000 + 100.000 + 0.000 + 1 + 0 + 0000 + 0000 + 100.000 + BUFG + 50.000 + false + 100.000 + 0.000 + 50.000 + 100.000 + 0.000 + 1 + 0 + 0000 + 0000 + 100.000 + BUFG + 50.000 + false + 100.000 + 0.000 + 50.000 + 100.000 + 0.000 + 1 + 0 + 0000 + 0000 + 100.000 + BUFG + 50.000 + false + 100.000 + 0.000 + 50.000 + 100.000 + 0.000 + 1 + 0 + 0000 + 0000 + 100.000 + BUFG + 50.000 + false + 100.000 + 0.000 + 50.000 + 100.000 + 0.000 + 1 + 0 + BUFG + 50.000 + false + 100.000 + 0.000 + 50.000 + 100.000 + 0.000 + 1 + 0 + VCO + clk_in_sel + clk_out1 + clk_out2 + clk_out3 + clk_out4 + clk_out5 + clk_out6 + clk_out7 + CLK_VALID + NA + daddr + dclk + den + din + 0000 + 1 + 2.0 + 2.0 + 2.0 + 2.0 + 2.0 + 2.0 + dout + drdy + dwe + 49.000 + 1.000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + FDBK_AUTO + 0000 + 0000 + 0 + Input Clock Freq (MHz) Input Jitter (UI) + __primary_________100.000____________0.010 + no_secondary_input_clock + input_clk_stopped + 0 + Units_MHz + No_Jitter + locked + 0000 + 0000 + 0000 + false + false + false + false + false + false + false + false + OPTIMIZED + 10.000 + 0.000 + FALSE + 10.000 + 10.000 + 5.000 + 0.500 + 0.000 + FALSE + 1 + 0.500 + 0.000 + FALSE + 1 + 0.500 + 0.000 + FALSE + 1 + 0.500 + 0.000 + FALSE + FALSE + 1 + 0.500 + 0.000 + FALSE + 1 + 0.500 + 0.000 + FALSE + 1 + 0.500 + 0.000 + FALSE + FALSE + ZHOLD + 1 + None + 0.010 + 0.010 + FALSE + 64.000 + 2.000 + 1 + Output Output Phase Duty Cycle Pk-to-Pk Phase + Clock Freq (MHz) (degrees) (%) Jitter (ps) Error (ps) + clk_out1__200.00000______0.000______50.0______114.829_____98.575 + no_CLK_OUT2_output + no_CLK_OUT3_output + no_CLK_OUT4_output + no_CLK_OUT5_output + no_CLK_OUT6_output + no_CLK_OUT7_output + 0 + 0 + 128.000 + 1.000 + WAVEFORM + UNKNOWN + false + false + false + false + false + OPTIMIZED + 1 + 0.000 + 1.000 + 1 + 0.500 + 0.000 + 1 + 0.500 + 0.000 + 1 + 0.500 + 0.000 + 1 + 0.500 + 0.000 + 1 + 0.500 + 0.000 + 1 + 0.500 + 0.000 + CLKFBOUT + SYSTEM_SYNCHRONOUS + 1 + No notes + 0.010 + power_down + 0000 + 1 + clk_in1 + PLL + AUTO + 100.000 + 0.010 + 10.000 + No_buffer + psclk + psdone + psen + psincdec + 100.0 + 0 + reset + 100.000 + 0.010 + 10.000 + clk_in2 + Single_ended_clock_capable_pin + CENTER_HIGH + 4000 + 0.004 + STATUS + 11 + 32 + 100.0 + 100.0 + 100.0 + 100.0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1866.000 + 800.000 + clk_wiz_0 + MMCM + false + empty + cddcdone + cddcreq + clkfb_in_n + clkfb_in + clkfb_in_p + SINGLE + clkfb_out_n + clkfb_out + clkfb_out_p + clkfb_stopped + 100.0 + 0.010 + 100.0 + 0.010 + BUFG + 126.455 + false + 114.212 + 50.000 + 200.000 + 0.000 + 1 + true + BUFG + 0.0 + false + 0.0 + 50.000 + 100.000 + 0.000 + 1 + false + BUFG + 0.0 + false + 0.0 + 50.000 + 100.000 + 0.000 + 1 + false + BUFG + 0.0 + false + 0.0 + 50.000 + 100.000 + 0.000 + 1 + false + BUFG + 0.0 + false + 0.0 + 50.000 + 100.000 + 0.000 + 1 + false + BUFG + 0.0 + false + 0.0 + 50.000 + 100.000 + 0.000 + 1 + false + BUFG + 0.0 + false + 0.0 + 50.000 + 100.000 + 0.000 + 1 + false + 600.000 + Custom + Custom + clk_in_sel + clk_out1 + false + clk_out2 + false + clk_out3 + false + clk_out4 + false + clk_out5 + false + clk_out6 + false + clk_out7 + false + CLK_VALID + auto + clk_wiz_0 + daddr + dclk + den + Custom + Custom + din + dout + drdy + dwe + false + false + false + false + false + false + false + false + false + FDBK_AUTO + input_clk_stopped + frequency + Enable_AXI + Units_MHz + Units_UI + UI + No_Jitter + locked + OPTIMIZED + 10 + 0.000 + false + 10.000 + 10.000 + 5 + 0.500 + 0.000 + false + 1 + 0.500 + 0.000 + false + 1 + 0.500 + 0.000 + false + 1 + 0.500 + 0.000 + false + false + 1 + 0.500 + 0.000 + false + 1 + 0.500 + 0.000 + false + 1 + 0.500 + 0.000 + false + false + ZHOLD + 1 + None + 0.010 + 0.010 + false + 1 + false + false + WAVEFORM + false + UNKNOWN + OPTIMIZED + 4 + 0.000 + 10.000 + 1 + 0.500 + 0.000 + 1 + 0.500 + 0.000 + 1 + 0.500 + 0.000 + 1 + 0.500 + 0.000 + 1 + 0.500 + 0.000 + 1 + 0.500 + 0.000 + CLKFBOUT + SYSTEM_SYNCHRONOUS + 1 + None + 0.010 + power_down + 1 + clk_in1 + PLL + mmcm_adv + 100.000 + 0.010 + 10.000 + No_buffer + psclk + psdone + psen + psincdec + 100.0 + REL_PRIMARY + Custom + reset + ACTIVE_HIGH + 100.000 + 0.010 + 10.000 + clk_in2 + Single_ended_clock_capable_pin + CENTER_HIGH + 250 + 0.004 + STATUS + empty + 100.0 + 100.0 + 100.0 + 100.0 + false + false + false + false + false + false + false + true + false + false + false + false + false + false + true + false + false + false + false + false + artix7 + + + xc7a200t + fbg676 + VERILOG + + MIXED + -2 + + + TRUE + TRUE + IP_Flow + 4 + TRUE + . + + . + 2019.2 + OUT_OF_CONTEXT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/soc/vivado_xpr/project_1/xilinx_ip/dpram_512x32/dpram_512x32.xci b/resources/soc/vivado_xpr/project_1/xilinx_ip/dpram_512x32/dpram_512x32.xci new file mode 100644 index 0000000..9bd132f --- /dev/null +++ b/resources/soc/vivado_xpr/project_1/xilinx_ip/dpram_512x32/dpram_512x32.xci @@ -0,0 +1,315 @@ + + + xilinx.com + xci + unknown + 1.0 + + + dpram_512x32 + + + 4096 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + OTHER + NONE + 8192 + 32 + 1 + + OTHER + NONE + 8192 + 32 + 1 + + + 100000000 + 0 + 0.000 + 0 + 9 + 9 + 1 + 4 + 0 + 1 + 9 + 0 + 1 + 0 + NONE + 0 + 0 + 0 + ./ + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + Estimated Power for IP : 3.68295 mW + artix7 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + dpram_512x32.mem + no_coe_file_loaded + 0 + 0 + 1 + 0 + 1 + 512 + 512 + 1 + 1 + 32 + 32 + 0 + 0 + CE + CE + ALL + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 512 + 512 + NO_CHANGE + WRITE_FIRST + 32 + 32 + artix7 + 4 + Memory_Slave + AXI4_Full + false + Minimum_Area + false + 9 + NONE + no_coe_file_loaded + ALL + dpram_512x32 + false + false + false + false + false + false + false + false + false + Use_ENA_Pin + Always_Enabled + Single_Bit_Error_Injection + false + Native + false + no_mem_loaded + Simple_Dual_Port_RAM + NO_CHANGE + WRITE_FIRST + 0 + 0 + BRAM + 0 + 100 + 100 + 50 + 100 + 100 + 0 + 8kx2 + false + false + 1 + 1 + 32 + 32 + false + false + false + false + 0 + false + false + CE + CE + SYNC + false + false + false + false + false + false + false + 512 + 32 + 32 + No_ECC + false + false + false + Stand_Alone + artix7 + + + xc7a200t + fbg676 + VERILOG + + MIXED + -2 + + + TRUE + TRUE + IP_Flow + 4 + TRUE + . + + . + 2019.2 + OUT_OF_CONTEXT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/soc/vivado_xpr/project_1/xilinx_ip/mig_axi_32/mig_a.prj b/resources/soc/vivado_xpr/project_1/xilinx_ip/mig_axi_32/mig_a.prj new file mode 100644 index 0000000..2937b9b --- /dev/null +++ b/resources/soc/vivado_xpr/project_1/xilinx_ip/mig_axi_32/mig_a.prj @@ -0,0 +1,131 @@ + + + + mig_axi_32 + 1 + 1 + OFF + 1024 + OFF + Enabled + xc7a200t-fbg676/-2 + 2.3 + No Buffer + No Buffer + ACTIVE LOW + FALSE + 1 + 50 Ohms + 0 + + DDR3_SDRAM/Components/MT41J64M16XX-125 + 2500 + 1.8V + 4:1 + 100 + 0 + 800 + 1.000 + 1 + 1 + 1 + 1 + 16 + 1 + 1 + Disabled + Normal + FALSE + + 13 + 10 + 3 + 1.5V + BANK_ROW_COLUMN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 8 - Fixed + Sequential + 6 + Normal + No + Slow Exit + Enable + RZQ/7 + Disable + Disable + RZQ/4 + 0 + Disabled + Enabled + Output Buffer Enabled + Full Array + 5 + Enabled + Normal + Dynamic ODT off + AXI + + RD_PRI_REG + 27 + 32 + 8 + 1 + + + + diff --git a/resources/soc/vivado_xpr/project_1/xilinx_ip/mig_axi_32/mig_axi_32.xci b/resources/soc/vivado_xpr/project_1/xilinx_ip/mig_axi_32/mig_axi_32.xci new file mode 100644 index 0000000..806bf11 --- /dev/null +++ b/resources/soc/vivado_xpr/project_1/xilinx_ip/mig_axi_32/mig_axi_32.xci @@ -0,0 +1,2647 @@ + + + xilinx.com + xci + unknown + 1.0 + + + mig_axi_32 + + + 0 + 0 + + 0 + TDM + 8 + false + 11 + 11 + true + + true + 8 + + COMPONENTS + ROW_COLUMN_BANK + Single + 1250 + 0 + TDM + 8 + false + 11 + 11 + true + + true + 8 + + COMPONENTS + ROW_COLUMN_BANK + Single + 1250 + 0 + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + 0 + 0 + 0 + 0 + false + 100000000 + + + + 100000000 + 0 + 0.000 + 0 + + 0 + TDM + 8 + false + 11 + 11 + true + + true + 8 + + COMPONENTS + ROW_COLUMN_BANK + Single + 1250 + 0 + TDM + 8 + false + 11 + 11 + true + + true + 8 + + COMPONENTS + ROW_COLUMN_BANK + Single + 1250 + 0 + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + 0 + 0 + 0 + 0 + false + 100000000 + + + + 100000000 + 0 + 0.000 + 0 + + 0 + TDM + 8 + false + 11 + 11 + true + + true + 8 + + COMPONENTS + ROW_COLUMN_BANK + Single + 1250 + 0 + TDM + 8 + false + 11 + 11 + true + + true + 8 + + COMPONENTS + ROW_COLUMN_BANK + Single + 1250 + 0 + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + 0 + 0 + 0 + 0 + false + 100000000 + + + + 100000000 + 0 + 0.000 + 0 + + 0 + TDM + 8 + false + 11 + 11 + true + + true + 8 + + COMPONENTS + ROW_COLUMN_BANK + Single + 1250 + 0 + TDM + 8 + false + 11 + 11 + true + + true + 8 + + COMPONENTS + ROW_COLUMN_BANK + Single + 1250 + 0 + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + 0 + 0 + 0 + 0 + false + 100000000 + + + + 100000000 + 0 + 0.000 + 0 + + 0 + TDM + 8 + false + 11 + 11 + true + + true + 8 + + COMPONENTS + ROW_COLUMN_BANK + Single + 1250 + 0 + TDM + 8 + false + 11 + 11 + true + + true + 8 + + COMPONENTS + ROW_COLUMN_BANK + Single + 1250 + 0 + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + 0 + 0 + 0 + 0 + false + 100000000 + + + + 100000000 + 0 + 0.000 + 0 + + 0 + TDM + 8 + false + 11 + 11 + true + + true + 8 + + COMPONENTS + ROW_COLUMN_BANK + Single + 1250 + 0 + TDM + 8 + false + 11 + 11 + true + + true + 8 + + COMPONENTS + ROW_COLUMN_BANK + Single + 1250 + 0 + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + 0 + 0 + 0 + 0 + false + 100000000 + + + + 100000000 + 0 + 0.000 + 0 + + 0 + TDM + 8 + false + 11 + 11 + true + + true + 8 + + COMPONENTS + ROW_COLUMN_BANK + Single + 1250 + 0 + TDM + 8 + false + 11 + 11 + true + + true + 8 + + COMPONENTS + ROW_COLUMN_BANK + Single + 1250 + 0 + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + 0 + 0 + 0 + 0 + false + 100000000 + + + + 100000000 + 0 + 0.000 + 0 + + 0 + TDM + 8 + false + 11 + 11 + true + + true + 8 + + COMPONENTS + ROW_COLUMN_BANK + Single + 1250 + 0 + TDM + 8 + false + 11 + 11 + true + + true + 8 + + COMPONENTS + ROW_COLUMN_BANK + Single + 1250 + 0 + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + 0 + 0 + 0 + 0 + false + 100000000 + + + + 100000000 + 0 + 0.000 + false + 100000000 + + + + 100000000 + 0 + 0.000 + + 0 + TDM + 8 + false + 11 + 11 + true + + true + 8 + + COMPONENTS + ROW_COLUMN_BANK + Single + 1250 + 0 + TDM + 8 + false + 11 + 11 + true + + true + 8 + + COMPONENTS + ROW_COLUMN_BANK + Single + 1250 + 0 + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 0 + false + 100000000 + + + + 100000000 + 0 + 0.000 + 27 + 0 + 0 + 0 + + 32 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 8 + 0 + 256 + 2 + 1 + 2 + 1 + 0.000 + AXI4 + READ_WRITE + 0 + 0 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 32 + 32 + 32 + 4 + 1048576 + 32 + 4 + 1048576 + 8 + 3 + 1 + 1 + 1 + 8 + OFF + 1 + 1 + 1 + 8 + 1 + OFF + 14 + 1 + 1 + 1 + 2 + 1 + 8 + 3 + 1 + 1 + 1 + 8 + OFF + 1 + 1 + 1 + 8 + 1 + OFF + 14 + 1 + 1 + 1 + 2 + 1 + 8 + 8 + 2 + OFF + 1 + OFF + 100.0 + FALSE + 8 + 3 + 1 + 1 + 1 + 8 + OFF + 1 + 1 + 1 + 8 + OFF + 14 + 1 + 1 + 1 + 2 + 1 + DDR3 + FALSE + 10.0 + FALSE + 10 + FALSE + 10 + FALSE + 10 + FALSE + 10 + 1200.0 + 0.000 + ACTIVE_LOW + 29 + 1 + 8 + 18 + OFF + 1 + 29 + 2 + 1 + 1 + 18 + OFF + 1 + 1 + 1 + 8 + 1 + 29 + 1 + 29 + 2 + 1 + 1 + 18 + OFF + 1 + 1 + 1 + 8 + 1 + 29 + 1 + 29 + 2 + 1 + 18 + 1 + 1 + DIFF + FALSE + 0 + 32 + 32 + 32 + 4 + 1048576 + 32 + 4 + 1048576 + 8 + 3 + 1 + 1 + 1 + 8 + OFF + 1 + 1 + 1 + 8 + 1 + OFF + 14 + 1 + 1 + 1 + 2 + 1 + 8 + 3 + 1 + 1 + 1 + 8 + OFF + 1 + 1 + 1 + 8 + 1 + OFF + 14 + 1 + 1 + 1 + 2 + 1 + 8 + 8 + 2 + OFF + 1 + OFF + 100.0 + FALSE + 8 + 3 + 1 + 1 + 1 + 8 + OFF + 1 + 1 + 1 + 8 + OFF + 14 + 1 + 1 + 1 + 2 + 1 + DDR3 + FALSE + 10.0 + FALSE + 10 + FALSE + 10 + FALSE + 10 + FALSE + 10 + 1200.0 + 0.000 + ACTIVE_LOW + 29 + 1 + 8 + 18 + OFF + 1 + 29 + 2 + 1 + 1 + 18 + OFF + 1 + 1 + 1 + 8 + 1 + 29 + 1 + 29 + 2 + 1 + 1 + 18 + OFF + 1 + 1 + 1 + 8 + 1 + 29 + 1 + 29 + 2 + 1 + 18 + 1 + 1 + DIFF + FALSE + 0 + 32 + 32 + 32 + 4 + 1048576 + 32 + 4 + 1048576 + 8 + 3 + 1 + 1 + 1 + 8 + OFF + 1 + 1 + 1 + 8 + 1 + OFF + 14 + 1 + 1 + 1 + 2 + 1 + 8 + 3 + 1 + 1 + 1 + 8 + OFF + 1 + 1 + 1 + 8 + 1 + OFF + 14 + 1 + 1 + 1 + 2 + 1 + 8 + 8 + 2 + OFF + 1 + OFF + 100.0 + FALSE + 8 + 3 + 1 + 1 + 1 + 8 + OFF + 1 + 1 + 1 + 8 + OFF + 14 + 1 + 1 + 1 + 2 + 1 + DDR3 + FALSE + 10.0 + FALSE + 10 + FALSE + 10 + FALSE + 10 + FALSE + 10 + 1200.0 + 0.000 + ACTIVE_LOW + 29 + 1 + 8 + 18 + OFF + 1 + 29 + 2 + 1 + 1 + 18 + OFF + 1 + 1 + 1 + 8 + 1 + 29 + 1 + 29 + 2 + 1 + 1 + 18 + OFF + 1 + 1 + 1 + 8 + 1 + 29 + 1 + 29 + 2 + 1 + 18 + 1 + 1 + DIFF + FALSE + 0 + 32 + 32 + 32 + 4 + 1048576 + 32 + 4 + 1048576 + 8 + 3 + 1 + 1 + 1 + 8 + OFF + 1 + 1 + 1 + 8 + 1 + OFF + 14 + 1 + 1 + 1 + 2 + 1 + 8 + 3 + 1 + 1 + 1 + 8 + OFF + 1 + 1 + 1 + 8 + 1 + OFF + 14 + 1 + 1 + 1 + 2 + 1 + 8 + 8 + 2 + OFF + 1 + OFF + 100.0 + FALSE + 8 + 3 + 1 + 1 + 1 + 8 + OFF + 1 + 1 + 1 + 8 + OFF + 14 + 1 + 1 + 1 + 2 + 1 + DDR3 + FALSE + 10.0 + FALSE + 10 + FALSE + 10 + FALSE + 10 + FALSE + 10 + 1200.0 + 0.000 + ACTIVE_LOW + 29 + 1 + 8 + 18 + OFF + 1 + 29 + 2 + 1 + 1 + 18 + OFF + 1 + 1 + 1 + 8 + 1 + 29 + 1 + 29 + 2 + 1 + 1 + 18 + OFF + 1 + 1 + 1 + 8 + 1 + 29 + 1 + 29 + 2 + 1 + 18 + 1 + 1 + DIFF + FALSE + 0 + 32 + 32 + 32 + 4 + 1048576 + 32 + 4 + 1048576 + 8 + 3 + 1 + 1 + 1 + 8 + OFF + 1 + 1 + 1 + 8 + 1 + OFF + 14 + 1 + 1 + 1 + 2 + 1 + 8 + 3 + 1 + 1 + 1 + 8 + OFF + 1 + 1 + 1 + 8 + 1 + OFF + 14 + 1 + 1 + 1 + 2 + 1 + 8 + 8 + 2 + OFF + 1 + OFF + 100.0 + FALSE + 8 + 3 + 1 + 1 + 1 + 8 + OFF + 1 + 1 + 1 + 8 + OFF + 14 + 1 + 1 + 1 + 2 + 1 + DDR3 + FALSE + 10.0 + FALSE + 10 + FALSE + 10 + FALSE + 10 + FALSE + 10 + 1200.0 + 0.000 + ACTIVE_LOW + 29 + 1 + 8 + 18 + OFF + 1 + 29 + 2 + 1 + 1 + 18 + OFF + 1 + 1 + 1 + 8 + 1 + 29 + 1 + 29 + 2 + 1 + 1 + 18 + OFF + 1 + 1 + 1 + 8 + 1 + 29 + 1 + 29 + 2 + 1 + 18 + 1 + 1 + DIFF + FALSE + 0 + 32 + 32 + 32 + 4 + 1048576 + 32 + 4 + 1048576 + 8 + 3 + 1 + 1 + 1 + 8 + OFF + 1 + 1 + 1 + 8 + 1 + OFF + 14 + 1 + 1 + 1 + 2 + 1 + 8 + 3 + 1 + 1 + 1 + 8 + OFF + 1 + 1 + 1 + 8 + 1 + OFF + 14 + 1 + 1 + 1 + 2 + 1 + 8 + 8 + 2 + OFF + 1 + OFF + 100.0 + FALSE + 8 + 3 + 1 + 1 + 1 + 8 + OFF + 1 + 1 + 1 + 8 + OFF + 14 + 1 + 1 + 1 + 2 + 1 + DDR3 + FALSE + 10.0 + FALSE + 10 + FALSE + 10 + FALSE + 10 + FALSE + 10 + 1200.0 + 0.000 + ACTIVE_LOW + 29 + 1 + 8 + 18 + OFF + 1 + 29 + 2 + 1 + 1 + 18 + OFF + 1 + 1 + 1 + 8 + 1 + 29 + 1 + 29 + 2 + 1 + 1 + 18 + OFF + 1 + 1 + 1 + 8 + 1 + 29 + 1 + 29 + 2 + 1 + 18 + 1 + 1 + DIFF + FALSE + 0 + 32 + 32 + 32 + 4 + 1048576 + 32 + 4 + 1048576 + 8 + 3 + 1 + 1 + 1 + 8 + OFF + 1 + 1 + 1 + 8 + 1 + OFF + 14 + 1 + 1 + 1 + 2 + 1 + 8 + 3 + 1 + 1 + 1 + 8 + OFF + 1 + 1 + 1 + 8 + 1 + OFF + 14 + 1 + 1 + 1 + 2 + 1 + 8 + 8 + 2 + OFF + 1 + OFF + 100.0 + FALSE + 8 + 3 + 1 + 1 + 1 + 8 + OFF + 1 + 1 + 1 + 8 + OFF + 14 + 1 + 1 + 1 + 2 + 1 + DDR3 + FALSE + 10.0 + FALSE + 10 + FALSE + 10 + FALSE + 10 + FALSE + 10 + 1200.0 + 0.000 + ACTIVE_LOW + 29 + 1 + 8 + 18 + OFF + 1 + 29 + 2 + 1 + 1 + 18 + OFF + 1 + 1 + 1 + 8 + 1 + 29 + 1 + 29 + 2 + 1 + 1 + 18 + OFF + 1 + 1 + 1 + 8 + 1 + 29 + 1 + 29 + 2 + 1 + 18 + 1 + 1 + DIFF + FALSE + 0 + 32 + 32 + 32 + 4 + 1048576 + 32 + 4 + 1048576 + 8 + 3 + 1 + 1 + 1 + 8 + OFF + 1 + 1 + 1 + 8 + 1 + OFF + 14 + 1 + 1 + 1 + 2 + 1 + 8 + 3 + 1 + 1 + 1 + 8 + OFF + 1 + 1 + 1 + 8 + 1 + OFF + 14 + 1 + 1 + 1 + 2 + 1 + 8 + 8 + 2 + OFF + 1 + OFF + 100.0 + FALSE + 8 + 3 + 1 + 1 + 1 + 8 + OFF + 1 + 1 + 1 + 8 + OFF + 14 + 1 + 1 + 1 + 2 + 1 + DDR3 + FALSE + 10.0 + FALSE + 10 + FALSE + 10 + FALSE + 10 + FALSE + 10 + 1200.0 + 0.000 + ACTIVE_LOW + 29 + 1 + 8 + 18 + OFF + 1 + 29 + 2 + 1 + 1 + 18 + OFF + 1 + 1 + 1 + 8 + 1 + 29 + 1 + 29 + 2 + 1 + 1 + 18 + OFF + 1 + 1 + 1 + 8 + 1 + 29 + 1 + 29 + 2 + 1 + 18 + 1 + 1 + DIFF + FALSE + 0 + 0 + 27 + 32 + 32 + 4 + 1048576 + 32 + 8 + 134217728 + 8 + 3 + 1 + 1 + 1 + 8 + OFF + 1 + 1 + 1 + 8 + 1 + OFF + 14 + 1 + 1 + 1 + 2 + 1 + 27 + 3 + 1 + 1 + 1 + 16 + OFF + 2 + 1 + 2 + 16 + 1 + OFF + 13 + 0 + 1 + 1 + 4 + 1 + 8 + 8 + 2 + OFF + 1 + OFF + 100000000 + FALSE + 8 + 3 + 1 + 1 + 1 + 8 + OFF + 1 + 1 + 1 + 8 + OFF + 14 + 1 + 1 + 1 + 2 + 1 + DDR3 + FALSE + 10.0 + FALSE + 10 + FALSE + 10 + FALSE + 10 + FALSE + 10 + 800 + 1 + 0.000 + ACTIVE_LOW + 29 + 1 + 8 + 18 + OFF + 1 + NOBUF + 29 + 2 + 1 + 1 + 18 + OFF + 1 + 1 + 1 + 8 + 1 + 29 + 1 + 29 + 2 + 1 + 1 + 18 + OFF + 1 + 1 + 1 + 8 + 1 + 29 + 1 + 29 + 2 + 1 + 18 + 1 + 1 + NOBUF + INTERNAL + FALSE + 1 + Custom + mig_axi_32 + Custom + Custom + mig_a.prj + artix7 + + + xc7a200t + fbg676 + VERILOG + + MIXED + -2 + + + TRUE + TRUE + IP_Flow + 1 + TRUE + . + + . + 2019.2 + OUT_OF_CONTEXT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/soc/vivado_xpr/project_1/xilinx_ip/mig_axi_32/mig_b.prj b/resources/soc/vivado_xpr/project_1/xilinx_ip/mig_axi_32/mig_b.prj new file mode 100644 index 0000000..1b7a3db --- /dev/null +++ b/resources/soc/vivado_xpr/project_1/xilinx_ip/mig_axi_32/mig_b.prj @@ -0,0 +1,131 @@ + + + + mig_axi_32 + 1 + 1 + OFF + 1024 + OFF + Enabled + xc7a200t-fbg676/-2 + 2.3 + No Buffer + No Buffer + ACTIVE LOW + FALSE + 1 + 50 Ohms + 0 + + DDR3_SDRAM/Components/MT41J64M16XX-125 + 2500 + 1.8V + 4:1 + 100 + 0 + 800 + 1.000 + 1 + 1 + 1 + 1 + 16 + 1 + 1 + Disabled + Normal + FALSE + + 13 + 10 + 3 + 1.5V + BANK_ROW_COLUMN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 8 - Fixed + Sequential + 6 + Normal + No + Slow Exit + Enable + RZQ/7 + Disable + Disable + RZQ/4 + 0 + Disabled + Enabled + Output Buffer Enabled + Full Array + 5 + Enabled + Normal + Dynamic ODT off + AXI + + RD_PRI_REG + 27 + 32 + 8 + 0 + + + + diff --git a/resources/soc/vivado_xpr/project_1/xilinx_ip/sram_128x22/sram_128x22.xci b/resources/soc/vivado_xpr/project_1/xilinx_ip/sram_128x22/sram_128x22.xci new file mode 100644 index 0000000..c8e50c9 --- /dev/null +++ b/resources/soc/vivado_xpr/project_1/xilinx_ip/sram_128x22/sram_128x22.xci @@ -0,0 +1,309 @@ + + + xilinx.com + xci + unknown + 1.0 + + + sram_128x22 + + + 4096 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + OTHER + NONE + 8192 + 32 + 1 + + OTHER + NONE + 8192 + 32 + 1 + + + 100000000 + 0 + 0.000 + 0 + 7 + 7 + 1 + 4 + 0 + 1 + 9 + 0 + 1 + 0 + NONE + 0 + 0 + 0 + ./ + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + Estimated Power for IP : 3.12245 mW + artix7 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + sram_128x22.mem + no_coe_file_loaded + 0 + 0 + 0 + 0 + 1 + 128 + 128 + 1 + 1 + 22 + 22 + 0 + 0 + CE + CE + ALL + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 128 + 128 + WRITE_FIRST + WRITE_FIRST + 22 + 22 + artix7 + 4 + Memory_Slave + AXI4_Full + false + Minimum_Area + false + 9 + NONE + no_coe_file_loaded + ALL + sram_128x22 + false + false + false + false + false + false + false + false + false + Use_ENA_Pin + Always_Enabled + Single_Bit_Error_Injection + false + Native + false + no_mem_loaded + Single_Port_RAM + WRITE_FIRST + WRITE_FIRST + 0 + 0 + BRAM + 0 + 100 + 100 + 50 + 0 + 0 + 0 + 8kx2 + false + false + 1 + 1 + 22 + 22 + false + false + false + false + 0 + false + false + CE + CE + SYNC + false + false + false + false + false + false + false + 128 + 22 + 22 + No_ECC + false + false + false + Stand_Alone + artix7 + + + xc7a200t + fbg676 + VERILOG + + MIXED + -2 + + + TRUE + TRUE + IP_Flow + 4 + TRUE + . + + . + 2019.2 + OUT_OF_CONTEXT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/soc/vivado_xpr/project_1/xilinx_ip/sram_128x32/sram_128x32.xci b/resources/soc/vivado_xpr/project_1/xilinx_ip/sram_128x32/sram_128x32.xci new file mode 100644 index 0000000..6f97f47 --- /dev/null +++ b/resources/soc/vivado_xpr/project_1/xilinx_ip/sram_128x32/sram_128x32.xci @@ -0,0 +1,309 @@ + + + xilinx.com + xci + unknown + 1.0 + + + sram_128x32 + + + 4096 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + OTHER + NONE + 8192 + 32 + 1 + + OTHER + NONE + 8192 + 32 + 1 + + + 100000000 + 0 + 0.000 + 0 + 7 + 7 + 1 + 4 + 0 + 1 + 9 + 0 + 1 + 0 + NONE + 0 + 0 + 0 + ./ + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + Estimated Power for IP : 3.53845 mW + artix7 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + sram_128x32.mem + no_coe_file_loaded + 0 + 0 + 0 + 0 + 1 + 128 + 128 + 1 + 1 + 32 + 32 + 0 + 0 + CE + CE + ALL + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 128 + 128 + WRITE_FIRST + WRITE_FIRST + 32 + 32 + artix7 + 4 + Memory_Slave + AXI4_Full + false + Minimum_Area + false + 9 + NONE + no_coe_file_loaded + ALL + sram_128x32 + false + false + false + false + false + false + false + false + false + Use_ENA_Pin + Always_Enabled + Single_Bit_Error_Injection + false + Native + false + no_mem_loaded + Single_Port_RAM + WRITE_FIRST + WRITE_FIRST + 0 + 0 + BRAM + 0 + 100 + 100 + 50 + 0 + 0 + 0 + 8kx2 + false + false + 1 + 1 + 32 + 32 + false + false + false + false + 0 + false + false + CE + CE + SYNC + false + false + false + false + false + false + false + 128 + 32 + 32 + No_ECC + false + false + false + Stand_Alone + artix7 + + + xc7a200t + fbg676 + VERILOG + + MIXED + -2 + + + TRUE + TRUE + IP_Flow + 4 + TRUE + . + + . + 2019.2 + OUT_OF_CONTEXT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/soc/vivado_xpr/project_1/xilinx_ip/sram_128x64/sram_128x64.xci b/resources/soc/vivado_xpr/project_1/xilinx_ip/sram_128x64/sram_128x64.xci new file mode 100644 index 0000000..200b408 --- /dev/null +++ b/resources/soc/vivado_xpr/project_1/xilinx_ip/sram_128x64/sram_128x64.xci @@ -0,0 +1,311 @@ + + + xilinx.com + xci + unknown + 1.0 + + + sram_128x64 + + + 4096 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + OTHER + NONE + 8192 + 32 + 1 + + OTHER + NONE + 8192 + 32 + 1 + + + 100000000 + 0 + 0.000 + 0 + 7 + 7 + 1 + 4 + 0 + 1 + 8 + 0 + 0 + 1 + NONE + 0 + 0 + 0 + ./ + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + Estimated Power for IP : 6.700549 mW + artix7 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + sram_128x64.mem + no_coe_file_loaded + 0 + 0 + 0 + 0 + 1 + 128 + 128 + 1 + 1 + 64 + 64 + 0 + 0 + CE + CE + ALL + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 8 + 8 + 128 + 128 + WRITE_FIRST + WRITE_FIRST + 64 + 64 + artix7 + 4 + Memory_Slave + AXI4_Full + false + Minimum_Area + false + 8 + NONE + no_coe_file_loaded + ALL + sram_128x64 + false + false + false + false + false + false + false + false + false + Use_ENA_Pin + Always_Enabled + Single_Bit_Error_Injection + false + Native + false + no_mem_loaded + Single_Port_RAM + WRITE_FIRST + WRITE_FIRST + 0 + 0 + BRAM + 0 + 100 + 100 + 50 + 0 + 0 + 0 + 8kx2 + false + false + 1 + 1 + 64 + 64 + false + false + false + false + 0 + false + false + CE + CE + SYNC + false + true + false + false + false + false + false + 128 + 64 + 64 + No_ECC + false + false + false + Stand_Alone + artix7 + + + xc7a200t + fbg676 + VERILOG + + MIXED + -2 + + + TRUE + TRUE + IP_Flow + 4 + TRUE + . + + . + 2019.2 + OUT_OF_CONTEXT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/soc/vivado_xpr/project_1/xilinx_ip/sram_32x52bit/sram_32x52bit.xci b/resources/soc/vivado_xpr/project_1/xilinx_ip/sram_32x52bit/sram_32x52bit.xci new file mode 100644 index 0000000..9bd5d2e --- /dev/null +++ b/resources/soc/vivado_xpr/project_1/xilinx_ip/sram_32x52bit/sram_32x52bit.xci @@ -0,0 +1,309 @@ + + + xilinx.com + xci + unknown + 1.0 + + + sram_32x52bit + + + 4096 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + 1 + 100000000 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 0.000 + AXI4LITE + READ_WRITE + 0 + 0 + 0 + 0 + 0 + OTHER + NONE + 8192 + 32 + 1 + + OTHER + NONE + 8192 + 32 + 1 + + + 100000000 + 0 + 0.000 + 0 + 5 + 5 + 1 + 4 + 0 + 1 + 9 + 0 + 0 + 1 + NONE + 0 + 0 + 0 + ./ + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + Estimated Power for IP : 6.27815 mW + artix7 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + sram_32x52bit.mem + no_coe_file_loaded + 0 + 0 + 0 + 0 + 1 + 32 + 32 + 1 + 1 + 52 + 52 + 0 + 0 + CE + CE + ALL + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 32 + 32 + WRITE_FIRST + WRITE_FIRST + 52 + 52 + artix7 + 4 + Memory_Slave + AXI4_Full + false + Minimum_Area + false + 9 + NONE + no_coe_file_loaded + ALL + sram_32x52bit + false + false + false + false + false + false + false + false + false + Use_ENA_Pin + Always_Enabled + Single_Bit_Error_Injection + false + Native + false + no_mem_loaded + Single_Port_RAM + WRITE_FIRST + WRITE_FIRST + 0 + 0 + BRAM + 0 + 100 + 100 + 50 + 0 + 0 + 0 + 8kx2 + false + false + 1 + 1 + 52 + 52 + false + false + false + false + 0 + false + false + CE + CE + SYNC + false + false + false + false + false + false + false + 32 + 52 + 52 + No_ECC + false + false + false + Stand_Alone + artix7 + + + xc7a200t + fbg676 + VERILOG + + MIXED + -2 + + + TRUE + TRUE + IP_Flow + 4 + TRUE + . + + . + 2019.2 + OUT_OF_CONTEXT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/soc/vivado_xpr/soc_up.xdc b/resources/soc/vivado_xpr/soc_up.xdc new file mode 100644 index 0000000..08585b5 --- /dev/null +++ b/resources/soc/vivado_xpr/soc_up.xdc @@ -0,0 +1,197 @@ +#set_property SEVERITY {Warning} [get_drc_checks RTSTAT-2] +#时钟信号连接 +#create_clock -period 10.000 [get_ports clk] +set_property PACKAGE_PIN AC19 [get_ports clk] +set_property CLOCK_DEDICATED_ROUTE BACKBONE [get_nets clk] +create_clock -period 10.000 -name clk -waveform {0.000 5.000} [get_ports clk] + +#reset +set_property PACKAGE_PIN Y3 [get_ports resetn] + +#LED +set_property PACKAGE_PIN K23 [get_ports {led[0]}] +set_property PACKAGE_PIN J21 [get_ports {led[1]}] +set_property PACKAGE_PIN H23 [get_ports {led[2]}] +set_property PACKAGE_PIN J19 [get_ports {led[3]}] +set_property PACKAGE_PIN G9 [get_ports {led[4]}] +set_property PACKAGE_PIN J26 [get_ports {led[5]}] +set_property PACKAGE_PIN J23 [get_ports {led[6]}] +set_property PACKAGE_PIN J8 [get_ports {led[7]}] +set_property PACKAGE_PIN H8 [get_ports {led[8]}] +set_property PACKAGE_PIN G8 [get_ports {led[9]}] +set_property PACKAGE_PIN F7 [get_ports {led[10]}] +set_property PACKAGE_PIN A4 [get_ports {led[11]}] +set_property PACKAGE_PIN A5 [get_ports {led[12]}] +set_property PACKAGE_PIN A3 [get_ports {led[13]}] +set_property PACKAGE_PIN D5 [get_ports {led[14]}] +set_property PACKAGE_PIN H7 [get_ports {led[15]}] + +#led_rg 0/1 +set_property PACKAGE_PIN G7 [get_ports {led_rg0[0]}] +set_property PACKAGE_PIN F8 [get_ports {led_rg0[1]}] +set_property PACKAGE_PIN B5 [get_ports {led_rg1[0]}] +set_property PACKAGE_PIN D6 [get_ports {led_rg1[1]}] + +#NUM +set_property PACKAGE_PIN D3 [get_ports {num_csn[7]}] +set_property PACKAGE_PIN D25 [get_ports {num_csn[6]}] +set_property PACKAGE_PIN D26 [get_ports {num_csn[5]}] +set_property PACKAGE_PIN E25 [get_ports {num_csn[4]}] +set_property PACKAGE_PIN E26 [get_ports {num_csn[3]}] +set_property PACKAGE_PIN G25 [get_ports {num_csn[2]}] +set_property PACKAGE_PIN G26 [get_ports {num_csn[1]}] +set_property PACKAGE_PIN H26 [get_ports {num_csn[0]}] + +set_property PACKAGE_PIN C3 [get_ports {num_a_g[0]}] +set_property PACKAGE_PIN E6 [get_ports {num_a_g[1]}] +set_property PACKAGE_PIN B2 [get_ports {num_a_g[2]}] +set_property PACKAGE_PIN B4 [get_ports {num_a_g[3]}] +set_property PACKAGE_PIN E5 [get_ports {num_a_g[4]}] +set_property PACKAGE_PIN D4 [get_ports {num_a_g[5]}] +set_property PACKAGE_PIN A2 [get_ports {num_a_g[6]}] +#set_property PACKAGE_PIN C4 :DP + +#switch +set_property PACKAGE_PIN AC21 [get_ports {switch[7]}] +set_property PACKAGE_PIN AD24 [get_ports {switch[6]}] +set_property PACKAGE_PIN AC22 [get_ports {switch[5]}] +set_property PACKAGE_PIN AC23 [get_ports {switch[4]}] +set_property PACKAGE_PIN AB6 [get_ports {switch[3]}] +set_property PACKAGE_PIN W6 [get_ports {switch[2]}] +set_property PACKAGE_PIN AA7 [get_ports {switch[1]}] +set_property PACKAGE_PIN Y6 [get_ports {switch[0]}] + +#btn_key +set_property PACKAGE_PIN V8 [get_ports {btn_key_col[0]}] +set_property PACKAGE_PIN V9 [get_ports {btn_key_col[1]}] +set_property PACKAGE_PIN Y8 [get_ports {btn_key_col[2]}] +set_property PACKAGE_PIN V7 [get_ports {btn_key_col[3]}] +set_property PACKAGE_PIN U7 [get_ports {btn_key_row[0]}] +set_property PACKAGE_PIN W8 [get_ports {btn_key_row[1]}] +set_property PACKAGE_PIN Y7 [get_ports {btn_key_row[2]}] +set_property PACKAGE_PIN AA8 [get_ports {btn_key_row[3]}] + +#btn_step +set_property PACKAGE_PIN Y5 [get_ports btn_step[0]] +set_property PACKAGE_PIN V6 [get_ports btn_step[1]] + +#SPI flash +set_property PACKAGE_PIN P20 [get_ports SPI_CLK] +set_property PACKAGE_PIN R20 [get_ports SPI_CS] +set_property PACKAGE_PIN P19 [get_ports SPI_MISO] +set_property PACKAGE_PIN N18 [get_ports SPI_MOSI] + +#mac phy connect +set_property PACKAGE_PIN AB21 [get_ports mtxclk_0] +set_property PACKAGE_PIN AA19 [get_ports mrxclk_0] +set_property PACKAGE_PIN AA15 [get_ports mtxen_0] +set_property PACKAGE_PIN AF18 [get_ports {mtxd_0[0]}] +set_property PACKAGE_PIN AE18 [get_ports {mtxd_0[1]}] +set_property PACKAGE_PIN W15 [get_ports {mtxd_0[2]}] +set_property PACKAGE_PIN W14 [get_ports {mtxd_0[3]}] +set_property PACKAGE_PIN AB20 [get_ports mtxerr_0] +set_property PACKAGE_PIN AE22 [get_ports mrxdv_0] +set_property PACKAGE_PIN V1 [get_ports {mrxd_0[0]}] +set_property PACKAGE_PIN V4 [get_ports {mrxd_0[1]}] +set_property PACKAGE_PIN V2 [get_ports {mrxd_0[2]}] +set_property PACKAGE_PIN V3 [get_ports {mrxd_0[3]}] +set_property PACKAGE_PIN W16 [get_ports mrxerr_0] +set_property PACKAGE_PIN Y15 [get_ports mcoll_0] +set_property PACKAGE_PIN AF20 [get_ports mcrs_0] +set_property PACKAGE_PIN W3 [get_ports mdc_0] +set_property PACKAGE_PIN W1 [get_ports mdio_0] +set_property PACKAGE_PIN AE26 [get_ports phy_rstn] + +#uart +set_property PACKAGE_PIN F23 [get_ports UART_RX] +set_property IOSTANDARD LVCMOS33 [get_ports UART_RX] +set_property PACKAGE_PIN H19 [get_ports UART_TX] +set_property IOSTANDARD LVCMOS33 [get_ports UART_TX] + +#nand flash +set_property PACKAGE_PIN V19 [get_ports NAND_CLE] +set_property PACKAGE_PIN W20 [get_ports NAND_ALE] +set_property PACKAGE_PIN AA25 [get_ports NAND_RDY] +set_property PACKAGE_PIN AA24 [get_ports NAND_RD] +set_property PACKAGE_PIN AB24 [get_ports NAND_CE] +set_property PACKAGE_PIN AA22 [get_ports NAND_WR] +set_property PACKAGE_PIN W19 [get_ports {NAND_DATA[7]}] +set_property PACKAGE_PIN Y20 [get_ports {NAND_DATA[6]}] +set_property PACKAGE_PIN Y21 [get_ports {NAND_DATA[5]}] +set_property PACKAGE_PIN V18 [get_ports {NAND_DATA[4]}] +set_property PACKAGE_PIN U19 [get_ports {NAND_DATA[3]}] +set_property PACKAGE_PIN U20 [get_ports {NAND_DATA[2]}] +set_property PACKAGE_PIN W21 [get_ports {NAND_DATA[1]}] +set_property PACKAGE_PIN AC24 [get_ports {NAND_DATA[0]}] + +#ejtag +set_property PACKAGE_PIN J18 [get_ports EJTAG_TRST] +set_property PACKAGE_PIN K18 [get_ports EJTAG_TCK] +set_property PACKAGE_PIN K20 [get_ports EJTAG_TDI] +set_property PACKAGE_PIN K22 [get_ports EJTAG_TMS] +set_property PACKAGE_PIN K21 [get_ports EJTAG_TDO] + + +set_property IOSTANDARD LVCMOS33 [get_ports clk] +set_property IOSTANDARD LVCMOS33 [get_ports resetn] +set_property IOSTANDARD LVCMOS33 [get_ports {led[*]}] +set_property IOSTANDARD LVCMOS33 [get_ports {led_rg0[*]}] +set_property IOSTANDARD LVCMOS33 [get_ports {led_rg1[*]}] +set_property IOSTANDARD LVCMOS33 [get_ports {num_a_g[*]}] +set_property IOSTANDARD LVCMOS33 [get_ports {num_csn[*]}] +set_property IOSTANDARD LVCMOS33 [get_ports {switch[*]}] +set_property IOSTANDARD LVCMOS33 [get_ports {btn_key_col[*]}] +set_property IOSTANDARD LVCMOS33 [get_ports {btn_key_row[*]}] +set_property IOSTANDARD LVCMOS33 [get_ports {btn_step[*]}] + +set_property IOSTANDARD LVCMOS33 [get_ports SPI_MOSI] +set_property IOSTANDARD LVCMOS33 [get_ports SPI_MISO] +set_property IOSTANDARD LVCMOS33 [get_ports SPI_CS] +set_property IOSTANDARD LVCMOS33 [get_ports SPI_CLK] + +set_property IOSTANDARD LVCMOS33 [get_ports {mrxd_0[*]}] +set_property IOSTANDARD LVCMOS33 [get_ports {mtxd_0[*]}] +set_property IOSTANDARD LVCMOS33 [get_ports phy_rstn] +set_property IOSTANDARD LVCMOS33 [get_ports mtxerr_0] +set_property IOSTANDARD LVCMOS33 [get_ports mtxen_0] +set_property IOSTANDARD LVCMOS33 [get_ports mtxclk_0] +set_property IOSTANDARD LVCMOS33 [get_ports mrxerr_0] +set_property IOSTANDARD LVCMOS33 [get_ports mcoll_0] +set_property IOSTANDARD LVCMOS33 [get_ports mcrs_0] +set_property IOSTANDARD LVCMOS33 [get_ports mdc_0] +set_property IOSTANDARD LVCMOS33 [get_ports mdio_0] +set_property IOSTANDARD LVCMOS33 [get_ports mrxclk_0] +set_property IOSTANDARD LVCMOS33 [get_ports mrxdv_0] + +set_property IOSTANDARD LVCMOS33 [get_ports NAND_CLE] +set_property IOSTANDARD LVCMOS33 [get_ports NAND_ALE] +set_property IOSTANDARD LVCMOS33 [get_ports NAND_RDY] +set_property IOSTANDARD LVCMOS33 [get_ports NAND_RD] +set_property IOSTANDARD LVCMOS33 [get_ports NAND_CE] +set_property IOSTANDARD LVCMOS33 [get_ports NAND_WR] +set_property IOSTANDARD LVCMOS33 [get_ports {NAND_DATA[7]}] +set_property IOSTANDARD LVCMOS33 [get_ports {NAND_DATA[6]}] +set_property IOSTANDARD LVCMOS33 [get_ports {NAND_DATA[5]}] +set_property IOSTANDARD LVCMOS33 [get_ports {NAND_DATA[4]}] +set_property IOSTANDARD LVCMOS33 [get_ports {NAND_DATA[3]}] +set_property IOSTANDARD LVCMOS33 [get_ports {NAND_DATA[2]}] +set_property IOSTANDARD LVCMOS33 [get_ports {NAND_DATA[1]}] +set_property IOSTANDARD LVCMOS33 [get_ports {NAND_DATA[0]}] + +set_property IOSTANDARD LVCMOS33 [get_ports EJTAG_TRST] +set_property IOSTANDARD LVCMOS33 [get_ports EJTAG_TCK] +set_property IOSTANDARD LVCMOS33 [get_ports EJTAG_TDI] +set_property IOSTANDARD LVCMOS33 [get_ports EJTAG_TMS] +set_property IOSTANDARD LVCMOS33 [get_ports EJTAG_TDO] +set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets EJTAG_TCK_IBUF] + +create_clock -period 40.000 -name mrxclk_0 -waveform {0.000 20.000} [get_ports mrxclk_0] +create_clock -period 40.000 -name mtxclk_0 -waveform {0.000 20.000} [get_ports mtxclk_0] + +set_false_path -from [get_clocks clk_pll_i] -to [get_clocks clk_out1_clk_pll_33] +set_false_path -from [get_clocks mrxclk_0] -to [get_clocks clk_out1_clk_pll_33] +set_false_path -from [get_clocks mtxclk_0] -to [get_clocks clk_out1_clk_pll_33] +set_false_path -from [get_clocks clk_out1_clk_pll_33] -to [get_clocks mrxclk_0] +set_false_path -from [get_clocks clk_out1_clk_pll_33] -to [get_clocks mrxclk_0] +set_false_path -from [get_clocks clk_out1_clk_pll_33] -to [get_clocks mtxclk_0] +set_false_path -from [get_clocks clk_out1_clk_pll_33] -to [get_clocks mtxclk_0] From 932639a64be3751b400cf06e5e778b2052907549 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Tue, 24 Aug 2021 11:37:54 +0800 Subject: [PATCH 04/56] fix top --- resources/soc/rtl/TOP/soc_up_top.v | 31 ++++++++++------------------- resources/soc/vivado_xpr/soc_up.xdc | 28 ++++++++++++++++---------- 2 files changed, 27 insertions(+), 32 deletions(-) diff --git a/resources/soc/rtl/TOP/soc_up_top.v b/resources/soc/rtl/TOP/soc_up_top.v index 53156dc..ab0661f 100644 --- a/resources/soc/rtl/TOP/soc_up_top.v +++ b/resources/soc/rtl/TOP/soc_up_top.v @@ -84,11 +84,11 @@ module soc_up_top( output phy_rstn, //------EJTAG------- - input EJTAG_TRST, - input EJTAG_TCK, - input EJTAG_TDI, - input EJTAG_TMS, - output EJTAG_TDO, + // input EJTAG_TRST, + // input EJTAG_TCK, + // input EJTAG_TDI, + // input EJTAG_TMS, + // output EJTAG_TDO, //------uart------- inout UART_RX, @@ -555,12 +555,10 @@ assign int_out = {1'b0,dma_int,nand_int,spi_inta_o,uart0_int,mac_int}; assign int_n_i = ~int_out; // cpu -godson_cpu_mid cpu_mid( - .coreclock (aclk), - .interrupt_i (int_n_i[4:0]), //232 only 5bit - .nmi (1'b1), - - .areset_n (aresetn ), +mycpu_top mycpu( + .aclk (aclk ), + .ext_int (int_out ), + .aresetn (aresetn ), .arid (m0_arid[3:0] ), .araddr (m0_araddr ), .arlen (m0_arlen ), @@ -596,16 +594,7 @@ godson_cpu_mid cpu_mid( .bid (m0_bid[3:0] ), .bresp (m0_bresp ), .bvalid (m0_bvalid ), - .bready (m0_bready ), - - .EJTAG_TCK (EJTAG_TCK ), - .EJTAG_TDI (EJTAG_TDI ), - .EJTAG_TMS (EJTAG_TMS ), - .EJTAG_TRST (EJTAG_TRST ), - .EJTAG_TDO (EJTAG_TDO ), - .prrst_to_core ( ), - - .testmode (1'b0 ) + .bready (m0_bready ) ); // AXI_MUX diff --git a/resources/soc/vivado_xpr/soc_up.xdc b/resources/soc/vivado_xpr/soc_up.xdc index 08585b5..5f911f4 100644 --- a/resources/soc/vivado_xpr/soc_up.xdc +++ b/resources/soc/vivado_xpr/soc_up.xdc @@ -125,11 +125,11 @@ set_property PACKAGE_PIN W21 [get_ports {NAND_DATA[1]}] set_property PACKAGE_PIN AC24 [get_ports {NAND_DATA[0]}] #ejtag -set_property PACKAGE_PIN J18 [get_ports EJTAG_TRST] -set_property PACKAGE_PIN K18 [get_ports EJTAG_TCK] -set_property PACKAGE_PIN K20 [get_ports EJTAG_TDI] -set_property PACKAGE_PIN K22 [get_ports EJTAG_TMS] -set_property PACKAGE_PIN K21 [get_ports EJTAG_TDO] +# set_property PACKAGE_PIN J18 [get_ports EJTAG_TRST] +# set_property PACKAGE_PIN K18 [get_ports EJTAG_TCK] +# set_property PACKAGE_PIN K20 [get_ports EJTAG_TDI] +# set_property PACKAGE_PIN K22 [get_ports EJTAG_TMS] +# set_property PACKAGE_PIN K21 [get_ports EJTAG_TDO] set_property IOSTANDARD LVCMOS33 [get_ports clk] @@ -178,12 +178,12 @@ set_property IOSTANDARD LVCMOS33 [get_ports {NAND_DATA[2]}] set_property IOSTANDARD LVCMOS33 [get_ports {NAND_DATA[1]}] set_property IOSTANDARD LVCMOS33 [get_ports {NAND_DATA[0]}] -set_property IOSTANDARD LVCMOS33 [get_ports EJTAG_TRST] -set_property IOSTANDARD LVCMOS33 [get_ports EJTAG_TCK] -set_property IOSTANDARD LVCMOS33 [get_ports EJTAG_TDI] -set_property IOSTANDARD LVCMOS33 [get_ports EJTAG_TMS] -set_property IOSTANDARD LVCMOS33 [get_ports EJTAG_TDO] -set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets EJTAG_TCK_IBUF] +# set_property IOSTANDARD LVCMOS33 [get_ports EJTAG_TRST] +# set_property IOSTANDARD LVCMOS33 [get_ports EJTAG_TCK] +# set_property IOSTANDARD LVCMOS33 [get_ports EJTAG_TDI] +# set_property IOSTANDARD LVCMOS33 [get_ports EJTAG_TMS] +# set_property IOSTANDARD LVCMOS33 [get_ports EJTAG_TDO] +# set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets EJTAG_TCK_IBUF] create_clock -period 40.000 -name mrxclk_0 -waveform {0.000 20.000} [get_ports mrxclk_0] create_clock -period 40.000 -name mtxclk_0 -waveform {0.000 20.000} [get_ports mtxclk_0] @@ -195,3 +195,9 @@ set_false_path -from [get_clocks clk_out1_clk_pll_33] -to [get_clocks mrxclk_0] set_false_path -from [get_clocks clk_out1_clk_pll_33] -to [get_clocks mrxclk_0] set_false_path -from [get_clocks clk_out1_clk_pll_33] -to [get_clocks mtxclk_0] set_false_path -from [get_clocks clk_out1_clk_pll_33] -to [get_clocks mtxclk_0] + +set_false_path -from [get_clocks -of_objects [get_pins mig_axi/u_mig_axi_32_mig/u_ddr3_infrastructure/gen_mmcm.mmcm_i/CLKFBOUT]] -to [get_clocks -of_objects [get_pins clk_pll_33/inst/plle2_adv_inst/CLKOUT0]] +set_false_path -from [get_clocks -of_objects [get_pins mig_axi/u_mig_axi_32_mig/u_ddr3_infrastructure/gen_mmcm.mmcm_i/CLKFBOUT]] -to [get_clocks -of_objects [get_pins clk_pll_33/inst/plle2_adv_inst/CLKOUT1]] + +set_false_path -from [get_clocks -of_objects [get_pins clk_pll_33/inst/plle2_adv_inst/CLKOUT0]] -to [get_clocks -of_objects [get_pins mig_axi/u_mig_axi_32_mig/u_ddr3_infrastructure/gen_mmcm.mmcm_i/CLKFBOUT]] +set_false_path -from [get_clocks -of_objects [get_pins clk_pll_33/inst/plle2_adv_inst/CLKOUT1]] -to [get_clocks -of_objects [get_pins mig_axi/u_mig_axi_32_mig/u_ddr3_infrastructure/gen_mmcm.mmcm_i/CLKFBOUT]] From 5f889492c8778749ed34cd00e3f2adee972c532e Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Tue, 24 Aug 2021 11:41:06 +0800 Subject: [PATCH 05/56] clean up --- .editorconfig | 5 - .gitignore | 4 +- src/testbench/Controller/Makefile | 22 - src/testbench/Controller/Testbench.cpp | 32 - src/testbench/Controller/Testbench.sv | 99 - src/testbench/MMU/axi_wrap.v | 133 - src/testbench/MMU/axi_wrap_ram.v | 260 - src/testbench/MMU/confreg.v | 683 - src/testbench/MMU/inst_ram.coe | 144381 ---------------------- src/testbench/MMU/soc_lite_top.sv | 894 - src/testbench/MMU/tmp.coe | 4098 - src/testbench/alu/makefile | 19 - src/testbench/alu/testbench.sv | 82 - src/testbench/happy/DCData_bram.sv | 13 - src/testbench/happy/DCTag_bram.sv | 13 - src/testbench/happy/ICData_bram.sv | 13 - src/testbench/happy/ICTag_bram.sv | 13 - src/testbench/happy/div_signed.sv | 12 - src/testbench/happy/div_unsigned.sv | 12 - src/testbench/happy/happy.sv | 170 - src/testbench/happy/mul_signed.sv | 9 - src/testbench/happy/mul_unsigned.sv | 9 - src/testbench/icache/.gitignore | 1 - src/testbench/icache/coe.cpp | 14 - src/testbench/icache/test.sv | 178 - src/testbench/icache/tmp.coe | 4098 - src/testbench/instrqueue/testbench.sv | 113 - src/testbench/makefile | 28 - 28 files changed, 3 insertions(+), 155405 deletions(-) delete mode 100644 src/testbench/Controller/Makefile delete mode 100644 src/testbench/Controller/Testbench.cpp delete mode 100644 src/testbench/Controller/Testbench.sv delete mode 100644 src/testbench/MMU/axi_wrap.v delete mode 100644 src/testbench/MMU/axi_wrap_ram.v delete mode 100644 src/testbench/MMU/confreg.v delete mode 100644 src/testbench/MMU/inst_ram.coe delete mode 100644 src/testbench/MMU/soc_lite_top.sv delete mode 100644 src/testbench/MMU/tmp.coe delete mode 100644 src/testbench/alu/makefile delete mode 100644 src/testbench/alu/testbench.sv delete mode 100644 src/testbench/happy/DCData_bram.sv delete mode 100644 src/testbench/happy/DCTag_bram.sv delete mode 100644 src/testbench/happy/ICData_bram.sv delete mode 100644 src/testbench/happy/ICTag_bram.sv delete mode 100644 src/testbench/happy/div_signed.sv delete mode 100644 src/testbench/happy/div_unsigned.sv delete mode 100644 src/testbench/happy/happy.sv delete mode 100644 src/testbench/happy/mul_signed.sv delete mode 100644 src/testbench/happy/mul_unsigned.sv delete mode 100644 src/testbench/icache/.gitignore delete mode 100644 src/testbench/icache/coe.cpp delete mode 100644 src/testbench/icache/test.sv delete mode 100644 src/testbench/icache/tmp.coe delete mode 100644 src/testbench/instrqueue/testbench.sv delete mode 100644 src/testbench/makefile diff --git a/.editorconfig b/.editorconfig index 1bec2c2..0d55951 100644 --- a/.editorconfig +++ b/.editorconfig @@ -15,8 +15,3 @@ indent_style = tab charset = utf-8 indent_style = tab indent_size = 8 - -[resources/project/include/*.h] -charset = utf-8 -indent_style = tab -indent_size = 8 diff --git a/.gitignore b/.gitignore index 3bb4906..c3699a9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ vivado.log -vivado.jou \ No newline at end of file +vivado.jou +.library_mapping.xml +.project \ No newline at end of file diff --git a/src/testbench/Controller/Makefile b/src/testbench/Controller/Makefile deleted file mode 100644 index e6bc6a6..0000000 --- a/src/testbench/Controller/Makefile +++ /dev/null @@ -1,22 +0,0 @@ -HOME = ../.. -INC = ${HOME}/include/ - -sources += Testbench.cpp -sources += Testbench.sv -sources += ${HOME}/Core/Controller.sv -sources += ${HOME}/Gadgets.sv - -run: test.vcd - open test.vcd - -clean: - rm -rf obj_dir - rm -f test.vcd - -test.vcd: ./obj_dir/test.out - $^ +trace - -./obj_dir/test.out: ${sources} - verilator -Wall -Wno-fatal -I${INC} +1800-2017ext+s --cc --trace --exe --build -o test.out $^ - -.PHONY: run clean diff --git a/src/testbench/Controller/Testbench.cpp b/src/testbench/Controller/Testbench.cpp deleted file mode 100644 index e6164c8..0000000 --- a/src/testbench/Controller/Testbench.cpp +++ /dev/null @@ -1,32 +0,0 @@ -#include -#include "VTestbench.h" -#include "verilated.h" - -double sc_time_stamp() { return 0; } - -std::unique_ptr contextp; -std::unique_ptr top; - -int main(int argc, char **argv, char **env) { - contextp = std::make_unique(); - - contextp->debug(0); - contextp->randReset(2); - contextp->traceEverOn(true); - contextp->commandArgs(argc, argv); - - top = std::make_unique(contextp.get()); - - top->eq = 0; - top->ltz = 0; - - top->inst = 0x26100001; - top->eval(); - contextp->timeInc(5); - top->inst = 0x82040000; - top->eval(); - contextp->timeInc(5); - top->eval(); - top->final(); - return 0; -} diff --git a/src/testbench/Controller/Testbench.sv b/src/testbench/Controller/Testbench.sv deleted file mode 100644 index 129de25..0000000 --- a/src/testbench/Controller/Testbench.sv +++ /dev/null @@ -1,99 +0,0 @@ -`include "defines.svh" - -module Testbench( - input word_t inst, - input logic eq, - input logic ltz -); - - Ctrl_t ctrl; - word_t imm; - logic [4:0] sa; - - Controller controller( - inst, - eq, - ltz, - ctrl, - imm, - sa - ); - - - logic SYSCALL; - logic BREAK; - logic ERET; - logic OFA; - - logic [4:0] RS; - logic [4:0] RT; - - logic BJRJ; - logic B; - logic JR; - logic J; - logic BGO; - logic DP0; - logic DP1; - logic DS; - logic DT; - logic ES; - logic ET; - - SA_t ECtrl_SA; - SB_t ECtrl_SB; - aluctrl_t ECtrl_OP; - - RS0_t MCtrl0_RS0; - logic MCtrl0_HW; - logic MCtrl0_LW; - logic [4:0] MCtrl0_C0D; - logic MCtrl0_C0W; - HLS_t MCtrl0_HLS; - logic MCtrl1_MR; - logic MCtrl1_MWR; - logic MCtrl1_MX; - logic [1:0] MCtrl1_SZ; - - logic [4:0] RD; - logic WCtrl_RW; - - assign SYSCALL = ctrl.SYSCALL; - assign BREAK = ctrl.BREAK; - assign ERET = ctrl.ERET; - assign OFA = ctrl.OFA; - assign RS = ctrl.RS; - assign RT = ctrl.RT; - assign BJRJ = ctrl.BJRJ; - assign B = ctrl.B; - assign JR = ctrl.JR; - assign J = ctrl.J; - assign BGO = ctrl.BGO; - assign DP0 = ctrl.DP0; - assign DP1 = ctrl.DP1; - assign DS = ctrl.DS; - assign DT = ctrl.DT; - assign ES = ctrl.ES; - assign ET = ctrl.ET; - assign ECtrl_SA = ctrl.ECtrl.SA; - assign ECtrl_SB = ctrl.ECtrl.SB; - assign ECtrl_OP = ctrl.ECtrl.OP; - assign MCtrl0_RS0 = ctrl.MCtrl0.RS0; - assign MCtrl0_HW = ctrl.MCtrl0.HW; - assign MCtrl0_LW = ctrl.MCtrl0.LW; - assign MCtrl0_C0D = ctrl.MCtrl0.C0D; - assign MCtrl0_C0W = ctrl.MCtrl0.C0W; - assign MCtrl0_HLS = ctrl.MCtrl0.HLS; - - assign MCtrl1_MR = ctrl.MCtrl1.MR; - assign MCtrl1_MWR = ctrl.MCtrl1.MWR; - assign MCtrl1_MX = ctrl.MCtrl1.MX; - assign MCtrl1_SZ = ctrl.MCtrl1.SZ; - assign RD = ctrl.RD; - assign WCtrl_RW = ctrl.WCtrl.RW; - - initial begin - $dumpfile("test.vcd"); - $dumpvars(0, Testbench); - end -endmodule diff --git a/src/testbench/MMU/axi_wrap.v b/src/testbench/MMU/axi_wrap.v deleted file mode 100644 index 2ed1cd7..0000000 --- a/src/testbench/MMU/axi_wrap.v +++ /dev/null @@ -1,133 +0,0 @@ -module axi_wrap( - input m_aclk, - input m_aresetn, - //ar - input [3 :0] m_arid , - input [31:0] m_araddr , - input [3 :0] m_arlen , - input [2 :0] m_arsize , - input [1 :0] m_arburst, - input [1 :0] m_arlock , - input [3 :0] m_arcache, - input [2 :0] m_arprot , - input m_arvalid, - output m_arready, - //r - output [3 :0] m_rid , - output [31:0] m_rdata , - output [1 :0] m_rresp , - output m_rlast , - output m_rvalid , - input m_rready , - //aw - input [3 :0] m_awid , - input [31:0] m_awaddr , - input [3 :0] m_awlen , - input [2 :0] m_awsize , - input [1 :0] m_awburst, - input [1 :0] m_awlock , - input [3 :0] m_awcache, - input [2 :0] m_awprot , - input m_awvalid, - output m_awready, - //w - input [3 :0] m_wid , - input [31:0] m_wdata , - input [3 :0] m_wstrb , - input m_wlast , - input m_wvalid , - output m_wready , - //b - output [3 :0] m_bid , - output [1 :0] m_bresp , - output m_bvalid , - input m_bready , - - output s_aclk, - output s_aresetn, - //ar - output [3 :0] s_arid , - output [31:0] s_araddr , - output [3 :0] s_arlen , - output [2 :0] s_arsize , - output [1 :0] s_arburst, - output [1 :0] s_arlock , - output [3 :0] s_arcache, - output [2 :0] s_arprot , - output s_arvalid, - input s_arready, - //r - input [3 :0] s_rid , - input [31:0] s_rdata , - input [1 :0] s_rresp , - input s_rlast , - input s_rvalid , - output s_rready , - //aw - output [3 :0] s_awid , - output [31:0] s_awaddr , - output [3 :0] s_awlen , - output [2 :0] s_awsize , - output [1 :0] s_awburst, - output [1 :0] s_awlock , - output [3 :0] s_awcache, - output [2 :0] s_awprot , - output s_awvalid, - input s_awready, - //w - output [3 :0] s_wid , - output [31:0] s_wdata , - output [3 :0] s_wstrb , - output s_wlast , - output s_wvalid , - input s_wready , - //b - input [3 :0] s_bid , - input [1 :0] s_bresp , - input s_bvalid , - output s_bready -); -assign s_aclk = m_aclk ; -assign s_aresetn = m_aresetn; -//ar -assign s_arid = m_arid ; -assign s_araddr = m_araddr ; -assign s_arlen = m_arlen ; -assign s_arsize = m_arsize ; -assign s_arburst = m_arburst; -assign s_arlock = m_arlock ; -assign s_arcache = m_arcache; -assign s_arprot = m_arprot ; -assign s_arvalid = m_arvalid; -assign m_arready = s_arready; -//r -assign m_rid = m_rvalid ? s_rid : 4'd0 ; -assign m_rdata = m_rvalid ? s_rdata : 32'd0 ; -assign m_rresp = m_rvalid ? s_rresp : 2'd0 ; -assign m_rlast = m_rvalid ? s_rlast : 1'd0 ; -assign m_rvalid = s_rvalid; -assign s_rready = m_rready; -//aw -assign s_awid = m_awid ; -assign s_awaddr = m_awaddr ; -assign s_awlen = m_awlen ; -assign s_awsize = m_awsize ; -assign s_awburst = m_awburst; -assign s_awlock = m_awlock ; -assign s_awcache = m_awcache; -assign s_awprot = m_awprot ; -assign s_awvalid = m_awvalid; -assign m_awready = s_awready; -//w -assign s_wid = m_wid ; -assign s_wdata = m_wdata ; -assign s_wstrb = m_wstrb ; -assign s_wlast = m_wlast ; -assign s_wvalid = m_wvalid ; -assign m_wready = s_wready ; -//b -assign m_bid = m_bvalid ? s_bid : 4'd0 ; -assign m_bresp = m_bvalid ? s_bresp : 2'd0 ; -assign m_bvalid = s_bvalid ; -assign s_bready = m_bready ; -endmodule diff --git a/src/testbench/MMU/axi_wrap_ram.v b/src/testbench/MMU/axi_wrap_ram.v deleted file mode 100644 index 4d63573..0000000 --- a/src/testbench/MMU/axi_wrap_ram.v +++ /dev/null @@ -1,260 +0,0 @@ -`define RUN_PERF_TEST -`define RUN_PERF_NO_DELAY - -module axi_wrap_ram( - input aclk, - input aresetn, - //ar - input [3 :0] axi_arid , - input [31:0] axi_araddr , - input [7 :0] axi_arlen , - input [2 :0] axi_arsize , - input [1 :0] axi_arburst, - input [1 :0] axi_arlock , - input [3 :0] axi_arcache, - input [2 :0] axi_arprot , - input axi_arvalid, - output axi_arready, - //r - output [3 :0] axi_rid , - output [31:0] axi_rdata , - output [1 :0] axi_rresp , - output axi_rlast , - output axi_rvalid , - input axi_rready , - //aw - input [3 :0] axi_awid , - input [31:0] axi_awaddr , - input [7 :0] axi_awlen , - input [2 :0] axi_awsize , - input [1 :0] axi_awburst, - input [1 :0] axi_awlock , - input [3 :0] axi_awcache, - input [2 :0] axi_awprot , - input axi_awvalid, - output axi_awready, - //w - input [3 :0] axi_wid , - input [31:0] axi_wdata , - input [3 :0] axi_wstrb , - input axi_wlast , - input axi_wvalid , - output axi_wready , - //b - output [3 :0] axi_bid , - output [1 :0] axi_bresp , - output axi_bvalid , - input axi_bready , - - //from confreg - input [4 :0] ram_random_mask -); -wire axi_arvalid_m_masked; -wire axi_rready_m_masked; -wire axi_awvalid_m_masked; -wire axi_wvalid_m_masked; -wire axi_bready_m_masked; - -wire axi_arready_s_unmasked; -wire axi_rvalid_s_unmasked; -wire axi_awready_s_unmasked; -wire axi_wready_s_unmasked; -wire axi_bvalid_s_unmasked; - -wire ar_and; -wire r_and; -wire aw_and; -wire w_and; -wire b_and; -reg ar_nomask; -reg aw_nomask; -reg w_nomask; -reg [4:0] pf_r2r; -reg [1:0] pf_b2b; -wire pf_r2r_nomask= pf_r2r==5'd0; -wire pf_b2b_nomask= pf_b2b==2'd0; - -//mask -`ifdef RUN_PERF_TEST - assign ar_and = 1'b1; - assign aw_and = 1'b1; - assign w_and = 1'b1; - `ifdef RUN_PERF_NO_DELAY - assign r_and = 1'b1; - assign b_and = 1'b1; - `else - assign r_and = pf_r2r_nomask; - assign b_and = pf_b2b_nomask; - `endif -`else - assign ar_and = ram_random_mask[4] | ar_nomask; - assign r_and = ram_random_mask[3] ; - assign aw_and = ram_random_mask[2] | aw_nomask; - assign w_and = ram_random_mask[1] | w_nomask; - assign b_and = ram_random_mask[0] ; -`endif -always @(posedge aclk) -begin - //for func test, random mask - ar_nomask <= !aresetn ? 1'b0 : - axi_arvalid_m_masked&&axi_arready ? 1'b0 : - axi_arvalid_m_masked ? 1'b1 : ar_nomask; - - aw_nomask <= !aresetn ? 1'b0 : - axi_awvalid_m_masked&&axi_awready ? 1'b0 : - axi_awvalid_m_masked ? 1'b1 : aw_nomask; - - w_nomask <= !aresetn ? 1'b0 : - axi_wvalid_m_masked&&axi_wready ? 1'b0 : - axi_wvalid_m_masked ? 1'b1 : w_nomask; - //for perf test - pf_r2r <= !aresetn ? 5'd0 : - axi_arvalid_m_masked&&axi_arready ? 5'd25 : - !pf_r2r_nomask ? pf_r2r-1'b1 : pf_r2r; - pf_b2b <= !aresetn ? 2'd0 : - axi_awvalid_m_masked&&axi_awready ? 2'd3 : - !pf_b2b_nomask ? pf_b2b-1'b1 : pf_b2b; -end - - -//-----{master -> slave}----- -assign axi_arvalid_m_masked = axi_arvalid & ar_and; -assign axi_rready_m_masked = axi_rready & r_and; -assign axi_awvalid_m_masked = axi_awvalid & aw_and; -assign axi_wvalid_m_masked = axi_wvalid & w_and; -assign axi_bready_m_masked = axi_bready & b_and; - -//-----{slave -> master}----- -assign axi_arready = axi_arready_s_unmasked & ar_and; -assign axi_rvalid = axi_rvalid_s_unmasked & r_and; -assign axi_awready = axi_awready_s_unmasked & aw_and; -assign axi_wready = axi_wready_s_unmasked & w_and; -assign axi_bvalid = axi_bvalid_s_unmasked & b_and; - -//ram axi -//ar -wire [3 :0] ram_arid ; -wire [31:0] ram_araddr ; -wire [7 :0] ram_arlen ; -wire [2 :0] ram_arsize ; -wire [1 :0] ram_arburst; -wire [1 :0] ram_arlock ; -wire [3 :0] ram_arcache; -wire [2 :0] ram_arprot ; -wire ram_arvalid; -wire ram_arready; -//r -wire [3 :0] ram_rid ; -wire [31:0] ram_rdata ; -wire [1 :0] ram_rresp ; -wire ram_rlast ; -wire ram_rvalid ; -wire ram_rready ; -//aw -wire [3 :0] ram_awid ; -wire [31:0] ram_awaddr ; -wire [7 :0] ram_awlen ; -wire [2 :0] ram_awsize ; -wire [1 :0] ram_awburst; -wire [1 :0] ram_awlock ; -wire [3 :0] ram_awcache; -wire [2 :0] ram_awprot ; -wire ram_awvalid; -wire ram_awready; -//w -wire [3 :0] ram_wid ; -wire [31:0] ram_wdata ; -wire [3 :0] ram_wstrb ; -wire ram_wlast ; -wire ram_wvalid ; -wire ram_wready ; -//b -wire [3 :0] ram_bid ; -wire [1 :0] ram_bresp ; -wire ram_bvalid ; -wire ram_bready ; - - -// inst ram axi -axi_ram ram( - .s_aclk (aclk ), - .s_aresetn (aresetn ), - - //ar - .s_axi_arid (ram_arid ), - .s_axi_araddr (ram_araddr ), - .s_axi_arlen (ram_arlen ), - .s_axi_arsize (ram_arsize ), - .s_axi_arburst (ram_arburst ), - .s_axi_arvalid (ram_arvalid ), - .s_axi_arready (ram_arready ), - //r - .s_axi_rid (ram_rid ), - .s_axi_rdata (ram_rdata ), - .s_axi_rresp (ram_rresp ), - .s_axi_rlast (ram_rlast ), - .s_axi_rvalid (ram_rvalid ), - .s_axi_rready (ram_rready ), - //aw - .s_axi_awid (ram_awid ), - .s_axi_awaddr (ram_awaddr ), - .s_axi_awlen (ram_awlen ), - .s_axi_awsize (ram_awsize ), - .s_axi_awburst (ram_awburst ), - .s_axi_awvalid (ram_awvalid ), - .s_axi_awready (ram_awready ), - //w - .s_axi_wdata (ram_wdata ), - .s_axi_wstrb (ram_wstrb ), - .s_axi_wlast (ram_wlast ), - .s_axi_wvalid (ram_wvalid ), - .s_axi_wready (ram_wready ), - //b - .s_axi_bid (ram_bid ), - .s_axi_bresp (ram_bresp ), - .s_axi_bvalid (ram_bvalid ), - .s_axi_bready (ram_bready ) -); - -//ar -assign ram_arid = axi_arid ; -assign ram_araddr = axi_araddr ; -assign ram_arlen = axi_arlen ; -assign ram_arsize = axi_arsize ; -assign ram_arburst = axi_arburst; -assign ram_arlock = axi_arlock ; -assign ram_arcache = axi_arcache; -assign ram_arprot = axi_arprot ; -assign ram_arvalid = axi_arvalid_m_masked; -assign axi_arready_s_unmasked = ram_arready; -//r -assign axi_rid = axi_rvalid ? ram_rid : 4'd0 ; -assign axi_rdata = axi_rvalid ? ram_rdata : 32'd0 ; -assign axi_rresp = axi_rvalid ? ram_rresp : 2'd0 ; -assign axi_rlast = axi_rvalid ? ram_rlast : 1'd0 ; -assign axi_rvalid_s_unmasked = ram_rvalid; -assign ram_rready = axi_rready_m_masked; -//aw -assign ram_awid = axi_awid ; -assign ram_awaddr = axi_awaddr ; -assign ram_awlen = axi_awlen ; -assign ram_awsize = axi_awsize ; -assign ram_awburst = axi_awburst; -assign ram_awlock = axi_awlock ; -assign ram_awcache = axi_awcache; -assign ram_awprot = axi_awprot ; -assign ram_awvalid = axi_awvalid_m_masked; -assign axi_awready_s_unmasked = ram_awready; -//w -assign ram_wid = axi_wid ; -assign ram_wdata = axi_wdata ; -assign ram_wstrb = axi_wstrb ; -assign ram_wlast = axi_wlast ; -assign ram_wvalid = axi_wvalid_m_masked; -assign axi_wready_s_unmasked = ram_wready ; -//b -assign axi_bid = axi_bvalid ? ram_bid : 4'd0 ; -assign axi_bresp = axi_bvalid ? ram_bresp : 2'd0 ; -assign axi_bvalid_s_unmasked = ram_bvalid ; -assign ram_bready = axi_bready_m_masked; -endmodule diff --git a/src/testbench/MMU/confreg.v b/src/testbench/MMU/confreg.v deleted file mode 100644 index c109a51..0000000 --- a/src/testbench/MMU/confreg.v +++ /dev/null @@ -1,683 +0,0 @@ -`define RANDOM_SEED {7'b1010101,16'h00FF} - -`define CR0_ADDR 16'h8000 //32'hbfaf_8000 -`define CR1_ADDR 16'h8004 //32'hbfaf_8004 -`define CR2_ADDR 16'h8008 //32'hbfaf_8008 -`define CR3_ADDR 16'h800c //32'hbfaf_800c -`define CR4_ADDR 16'h8010 //32'hbfaf_8010 -`define CR5_ADDR 16'h8014 //32'hbfaf_8014 -`define CR6_ADDR 16'h8018 //32'hbfaf_8018 -`define CR7_ADDR 16'h801c //32'hbfaf_801c - -`define LED_ADDR 16'hf000 //32'hbfaf_f000 -`define LED_RG0_ADDR 16'hf004 //32'hbfaf_f004 -`define LED_RG1_ADDR 16'hf008 //32'hbfaf_f008 -`define NUM_ADDR 16'hf010 //32'hbfaf_f010 -`define SWITCH_ADDR 16'hf020 //32'hbfaf_f020 -`define BTN_KEY_ADDR 16'hf024 //32'hbfaf_f024 -`define BTN_STEP_ADDR 16'hf028 //32'hbfaf_f028 -`define SW_INTER_ADDR 16'hf02c //32'hbfaf_f02c -`define TIMER_ADDR 16'he000 //32'hbfaf_e000 - -`define IO_SIMU_ADDR 16'hffec //32'hbfaf_ffec -`define VIRTUAL_UART_ADDR 16'hfff0 //32'hbfaf_fff0 -`define SIMU_FLAG_ADDR 16'hfff4 //32'hbfaf_fff4 -`define OPEN_TRACE_ADDR 16'hfff8 //32'hbfaf_fff8 -`define NUM_MONITOR_ADDR 16'hfffc //32'hbfaf_fffc -module confreg #( - parameter SIMULATION = 1'b0 -) ( - input aclk, - input timer_clk, - input aresetn, - // read and write from cpu - //ar - input [3 : 0] arid, - input [ 31:0] araddr, - input [7 : 0] arlen, - input [2 : 0] arsize, - input [1 : 0] arburst, - input [1 : 0] arlock, - input [3 : 0] arcache, - input [2 : 0] arprot, - input arvalid, - output arready, - //r - output [3 : 0] rid, - output [ 31:0] rdata, - output [1 : 0] rresp, - output rlast, - output rvalid, - input rready, - //aw - input [3 : 0] awid, - input [ 31:0] awaddr, - input [7 : 0] awlen, - input [2 : 0] awsize, - input [1 : 0] awburst, - input [1 : 0] awlock, - input [3 : 0] awcache, - input [2 : 0] awprot, - input awvalid, - output awready, - //w - input [3 : 0] wid, - input [ 31:0] wdata, - input [3 : 0] wstrb, - input wlast, - input wvalid, - output wready, - //b - output [3 : 0] bid, - output [1 : 0] bresp, - output bvalid, - input bready, - - //for lab6 - output [4 : 0] ram_random_mask, - - // read and write to device on board - output [ 15:0] led, - output [1 : 0] led_rg0, - output [1 : 0] led_rg1, - output reg [7 : 0] num_csn, - output reg [6 : 0] num_a_g, - input [7 : 0] switch, - output [3 : 0] btn_key_col, - input [3 : 0] btn_key_row, - input [1 : 0] btn_step -); - reg [ 31:0] cr0; - reg [ 31:0] cr1; - reg [ 31:0] cr2; - reg [ 31:0] cr3; - reg [ 31:0] cr4; - reg [ 31:0] cr5; - reg [ 31:0] cr6; - reg [ 31:0] cr7; - - reg [ 31:0] led_data; - reg [ 31:0] led_rg0_data; - reg [ 31:0] led_rg1_data; - reg [ 31:0] num_data; - wire [ 31:0] switch_data; - wire [ 31:0] sw_inter_data; //switch interleave - wire [ 31:0] btn_key_data; - wire [ 31:0] btn_step_data; - reg [ 31:0] timer_r2; - reg [ 31:0] simu_flag; - reg [ 31:0] io_simu; - reg [7 : 0] virtual_uart_data; - reg open_trace; - reg num_monitor; - - //--------------------------{axi interface}begin-------------------------// - reg busy, write, R_or_W; - reg s_wready; - - wire ar_enter = arvalid & arready; - wire r_retire = rvalid & rready & rlast; - wire aw_enter = awvalid & awready; - wire w_enter = wvalid & wready & wlast; - wire b_retire = bvalid & bready; - - assign arready = ~busy & (!R_or_W | !awvalid); - assign awready = ~busy & (R_or_W | !arvalid); - - reg [3 : 0] buf_id; - reg [ 31:0] buf_addr; - reg [7 : 0] buf_len; - reg [2 : 0] buf_size; - - always @(posedge aclk) begin - if (~aresetn) busy <= 1'b0; - else if (ar_enter | aw_enter) busy <= 1'b1; - else if (r_retire | b_retire) busy <= 1'b0; - end - - always @(posedge aclk) begin - if (~aresetn) begin - R_or_W <= 1'b0; - buf_id <= 4'b0; - buf_addr <= 32'b0; - buf_len <= 8'b0; - buf_size <= 3'b0; - end else if (ar_enter | aw_enter) begin - R_or_W <= ar_enter; - buf_id <= ar_enter ? arid : awid; - buf_addr <= ar_enter ? araddr : awaddr; - buf_len <= ar_enter ? arlen : awlen; - buf_size <= ar_enter ? arsize : awsize; - end - end - - reg conf_wready_reg; - assign wready = conf_wready_reg; - always @(posedge aclk) begin - if (~aresetn) conf_wready_reg <= 1'b0; - else if (aw_enter) conf_wready_reg <= 1'b1; - else if (w_enter & wlast) conf_wready_reg <= 1'b0; - end - - // read data has one cycle delay - reg [31:0] conf_rdata_reg; - reg conf_rvalid_reg; - reg conf_rlast_reg; - assign rdata = conf_rdata_reg; - assign rvalid = conf_rvalid_reg; - assign rlast = conf_rlast_reg; - always @(posedge aclk) begin - if (~aresetn) begin - conf_rdata_reg <= 32'd0; - conf_rvalid_reg <= 1'd0; - conf_rlast_reg <= 1'd0; - end else if (busy & R_or_W & !r_retire) begin - conf_rvalid_reg <= 1'd1; - conf_rlast_reg <= 1'd1; - case (buf_addr[15:0]) - `CR0_ADDR: conf_rdata_reg <= cr0; - `CR1_ADDR: conf_rdata_reg <= cr1; - `CR2_ADDR: conf_rdata_reg <= cr2; - `CR3_ADDR: conf_rdata_reg <= cr3; - `CR4_ADDR: conf_rdata_reg <= cr4; - `CR5_ADDR: conf_rdata_reg <= cr5; - `CR6_ADDR: conf_rdata_reg <= cr6; - `CR7_ADDR: conf_rdata_reg <= cr7; - `LED_ADDR: conf_rdata_reg <= led_data; - `LED_RG0_ADDR: conf_rdata_reg <= led_rg0_data; - `LED_RG1_ADDR: conf_rdata_reg <= led_rg1_data; - `NUM_ADDR: conf_rdata_reg <= num_data; - `SWITCH_ADDR: conf_rdata_reg <= switch_data; - `BTN_KEY_ADDR: conf_rdata_reg <= btn_key_data; - `BTN_STEP_ADDR: conf_rdata_reg <= btn_step_data; - `SW_INTER_ADDR: conf_rdata_reg <= sw_inter_data; - `TIMER_ADDR: conf_rdata_reg <= timer_r2; - `SIMU_FLAG_ADDR: conf_rdata_reg <= simu_flag; - `IO_SIMU_ADDR: conf_rdata_reg <= io_simu; - `VIRTUAL_UART_ADDR: conf_rdata_reg <= {24'd0, virtual_uart_data}; - `OPEN_TRACE_ADDR: conf_rdata_reg <= {31'd0, open_trace}; - `NUM_MONITOR_ADDR: conf_rdata_reg <= {31'd0, num_monitor}; - default: conf_rdata_reg <= 32'd0; - endcase - end else if (r_retire) begin - conf_rvalid_reg <= 1'b0; - end - end - - //conf write, only support a word write - wire conf_we; - wire [31:0] conf_addr; - wire [31:0] conf_wdata; - assign conf_we = w_enter; - assign conf_addr = buf_addr; - assign conf_wdata = wdata; - - reg conf_bvalid_reg; - assign bvalid = conf_bvalid_reg; - always @(posedge aclk) begin - if (~aresetn) conf_bvalid_reg <= 1'b0; - else if (w_enter) conf_bvalid_reg <= 1'b1; - else if (b_retire) conf_bvalid_reg <= 1'b0; - end - - assign rid = buf_id; - assign bid = buf_id; - assign bresp = 2'b0; - assign rresp = 2'b0; - //---------------------------{axi interface}end--------------------------// - - //-------------------------{confreg register}begin-----------------------// - wire write_cr0 = conf_we & (conf_addr[15:0] == `CR0_ADDR); - wire write_cr1 = conf_we & (conf_addr[15:0] == `CR1_ADDR); - wire write_cr2 = conf_we & (conf_addr[15:0] == `CR2_ADDR); - wire write_cr3 = conf_we & (conf_addr[15:0] == `CR3_ADDR); - wire write_cr4 = conf_we & (conf_addr[15:0] == `CR4_ADDR); - wire write_cr5 = conf_we & (conf_addr[15:0] == `CR5_ADDR); - wire write_cr6 = conf_we & (conf_addr[15:0] == `CR6_ADDR); - wire write_cr7 = conf_we & (conf_addr[15:0] == `CR7_ADDR); - always @(posedge aclk) begin - cr0 <= !aresetn ? 32'd0 : write_cr0 ? conf_wdata : cr0; - cr1 <= !aresetn ? 32'd0 : write_cr1 ? conf_wdata : cr1; - cr2 <= !aresetn ? 32'd0 : write_cr2 ? conf_wdata : cr2; - cr3 <= !aresetn ? 32'd0 : write_cr3 ? conf_wdata : cr3; - cr4 <= !aresetn ? 32'd0 : write_cr4 ? conf_wdata : cr4; - cr5 <= !aresetn ? 32'd0 : write_cr5 ? conf_wdata : cr5; - cr6 <= !aresetn ? 32'd0 : write_cr6 ? conf_wdata : cr6; - cr7 <= !aresetn ? 32'd0 : write_cr7 ? conf_wdata : cr7; - end - //--------------------------{confreg register}end------------------------// - - //-------------------------------{timer}begin----------------------------// - reg write_timer_begin, write_timer_begin_r1, write_timer_begin_r2, write_timer_begin_r3; - reg write_timer_end_r1, write_timer_end_r2; - reg [31:0] conf_wdata_r, conf_wdata_r1, conf_wdata_r2; - - reg [31:0] timer_r1; - reg [31:0] timer; - - wire write_timer = conf_we & (conf_addr[15:0] == `TIMER_ADDR); - always @(posedge aclk) begin - if (!aresetn) begin - write_timer_begin <= 1'b0; - end else if (write_timer) begin - write_timer_begin <= 1'b1; - conf_wdata_r <= conf_wdata; - end else if (write_timer_end_r2) begin - write_timer_begin <= 1'b0; - end - - write_timer_end_r1 <= write_timer_begin_r2; - write_timer_end_r2 <= write_timer_end_r1; - end - - always @(posedge timer_clk) begin - write_timer_begin_r1 <= write_timer_begin; - write_timer_begin_r2 <= write_timer_begin_r1; - write_timer_begin_r3 <= write_timer_begin_r2; - conf_wdata_r1 <= conf_wdata_r; - conf_wdata_r2 <= conf_wdata_r1; - - if (!aresetn) begin - timer <= 32'd0; - end else if (write_timer_begin_r2 && !write_timer_begin_r3) begin - timer <= conf_wdata_r2[31:0]; - end else begin - timer <= timer + 1'b1; - end - end - - always @(posedge aclk) begin - timer_r1 <= timer; - timer_r2 <= timer_r1; - end - //--------------------------------{timer}end-----------------------------// - - //--------------------------{simulation flag}begin-----------------------// - always @(posedge aclk) begin - if (!aresetn) begin - simu_flag <= {32{SIMULATION}}; - end - end - //---------------------------{simulation flag}end------------------------// - - //---------------------------{io simulation}begin------------------------// - wire write_io_simu = conf_we & (conf_addr[15:0] == `IO_SIMU_ADDR); - always @(posedge aclk) begin - if (!aresetn) begin - io_simu <= 32'd0; - end else if (write_io_simu) begin - io_simu <= {conf_wdata[15:0], conf_wdata[31:16]}; - end - end - //----------------------------{io simulation}end-------------------------// - - //-----------------------------{open trace}begin-------------------------// - wire write_open_trace = conf_we & (conf_addr[15:0] == `OPEN_TRACE_ADDR); - always @(posedge aclk) begin - if (!aresetn) begin - open_trace <= 1'b1; - end else if (write_open_trace) begin - open_trace <= |conf_wdata; - end - end - //-----------------------------{open trace}end---------------------------// - - //----------------------------{num monitor}begin-------------------------// - wire write_num_monitor = conf_we & (conf_addr[15:0] == `NUM_MONITOR_ADDR); - always @(posedge aclk) begin - if (!aresetn) begin - num_monitor <= 1'b1; - end else if (write_num_monitor) begin - num_monitor <= conf_wdata[0]; - end - end - //----------------------------{num monitor}end---------------------------// - - //---------------------------{virtual uart}begin-------------------------// - wire [7:0] write_uart_data; - wire write_uart_valid = conf_we & (conf_addr[15:0] == `VIRTUAL_UART_ADDR); - assign write_uart_data = conf_wdata[7:0]; - always @(posedge aclk) begin - if (!aresetn) begin - virtual_uart_data <= 8'd0; - end else if (write_uart_valid) begin - virtual_uart_data <= write_uart_data; - end - end - //----------------------------{virtual uart}end--------------------------// - - //--------------------------{axirandom mask}begin------------------------// - wire [15:0] switch_led; - wire [15:0] led_r_n; - assign led_r_n = ~switch_led; - - reg [22:0] pseudo_random_23; - reg no_mask; //if led_r_n is all 1, no mask - reg short_delay; //memory long delay - always @(posedge aclk) begin - if (!aresetn) pseudo_random_23 <= simu_flag[0] ? `RANDOM_SEED : {7'b1010101, led_r_n}; - else pseudo_random_23 <= {pseudo_random_23[21:0], pseudo_random_23[22] ^ pseudo_random_23[17]}; - - if (!aresetn) no_mask <= pseudo_random_23[15:0] == 16'h00FF; - - if (!aresetn) short_delay <= pseudo_random_23[7:0] == 8'hFF; - end - assign ram_random_mask[0] = (pseudo_random_23[10]&pseudo_random_23[20]) & (short_delay|(pseudo_random_23[11]^pseudo_random_23[5])) - | no_mask; - assign ram_random_mask[1] = (pseudo_random_23[ 9]&pseudo_random_23[17]) & (short_delay|(pseudo_random_23[12]^pseudo_random_23[4])) - | no_mask; - assign ram_random_mask[2] = (pseudo_random_23[ 8]^pseudo_random_23[22]) & (short_delay|(pseudo_random_23[13]^pseudo_random_23[3])) - | no_mask; - assign ram_random_mask[3] = (pseudo_random_23[ 7]&pseudo_random_23[19]) & (short_delay|(pseudo_random_23[14]^pseudo_random_23[2])) - | no_mask; - assign ram_random_mask[4] = (pseudo_random_23[ 6]^pseudo_random_23[16]) & (short_delay|(pseudo_random_23[15]^pseudo_random_23[1])) - | no_mask; - - //---------------------------{axirandom mask}end-------------------------// - - //--------------------------------{led}begin-----------------------------// - //led display - //led_data[31:0] - wire write_led = conf_we & (conf_addr[15:0] == `LED_ADDR); - - assign led = led_data[15:0]; - - assign switch_led = { - {2{switch[7]}}, - {2{switch[6]}}, - {2{switch[5]}}, - {2{switch[4]}}, - {2{switch[3]}}, - {2{switch[2]}}, - {2{switch[1]}}, - {2{switch[0]}} - }; - always @(posedge aclk) begin - if (!aresetn) begin - led_data <= {16'h0, switch_led}; - end else if (write_led) begin - led_data <= conf_wdata[31:0]; - end - end - //---------------------------------{led}end------------------------------// - - //-------------------------------{switch}begin---------------------------// - //switch data - //switch_data[7:0] - assign switch_data = {24'd0, switch}; - assign sw_inter_data = { - 16'd0, - switch[7], - 1'b0, - switch[6], - 1'b0, - switch[5], - 1'b0, - switch[4], - 1'b0, - switch[3], - 1'b0, - switch[2], - 1'b0, - switch[1], - 1'b0, - switch[0], - 1'b0 - }; - //--------------------------------{switch}end----------------------------// - - //------------------------------{btn key}begin---------------------------// - //btn key data - reg [15:0] btn_key_r; - assign btn_key_data = {16'd0, btn_key_r}; - - //state machine - reg [ 2:0] state; - wire [ 2:0] next_state; - - //eliminate jitter - reg key_flag; - reg [19:0] key_count; - reg [ 3:0] state_count; - wire key_start = (state == 3'b000) && !(&btn_key_row); - wire key_end = (state == 3'b111) && (&btn_key_row); - wire key_sample = key_count[19]; - always @(posedge aclk) begin - if (!aresetn) begin - key_flag <= 1'd0; - end else if (key_sample && state_count[3]) begin - key_flag <= 1'b0; - end else if (key_start || key_end) begin - key_flag <= 1'b1; - end - - if (!aresetn || !key_flag) begin - key_count <= 20'd0; - end else begin - key_count <= key_count + 1'b1; - end - end - - always @(posedge aclk) begin - if (!aresetn || state_count[3]) begin - state_count <= 4'd0; - end else begin - state_count <= state_count + 1'b1; - end - end - - always @(posedge aclk) begin - if (!aresetn) begin - state <= 3'b000; - end else if (state_count[3]) begin - state <= next_state; - end - end - - assign next_state = (state == 3'b000) ? ( (key_sample && !(&btn_key_row)) ? 3'b001 : 3'b000 ) : - (state == 3'b001) ? ( !(&btn_key_row) ? 3'b111 : 3'b010 ) : - (state == 3'b010) ? ( !(&btn_key_row) ? 3'b111 : 3'b011 ) : - (state == 3'b011) ? ( !(&btn_key_row) ? 3'b111 : 3'b100 ) : - (state == 3'b100) ? ( !(&btn_key_row) ? 3'b111 : 3'b000 ) : - (state == 3'b111) ? ( (key_sample && (&btn_key_row)) ? 3'b000 : 3'b111 ) : - 3'b000; - assign btn_key_col = (state == 3'b000) ? 4'b0000: - (state == 3'b001) ? 4'b1110: - (state == 3'b010) ? 4'b1101: - (state == 3'b011) ? 4'b1011: - (state == 3'b100) ? 4'b0111: - 4'b0000; - wire [15:0] btn_key_tmp; - always @(posedge aclk) begin - if (!aresetn) begin - btn_key_r <= 16'd0; - end else if (next_state == 3'b000) begin - btn_key_r <= 16'd0; - end else if (next_state == 3'b111 && state != 3'b111 && state_count[3]) begin - btn_key_r <= btn_key_tmp; - end - end - - assign btn_key_tmp = (state == 3'b001)&(btn_key_row == 4'b1110) ? 16'h0001: - (state == 3'b001)&(btn_key_row == 4'b1101) ? 16'h0010: - (state == 3'b001)&(btn_key_row == 4'b1011) ? 16'h0100: - (state == 3'b001)&(btn_key_row == 4'b0111) ? 16'h1000: - (state == 3'b010)&(btn_key_row == 4'b1110) ? 16'h0002: - (state == 3'b010)&(btn_key_row == 4'b1101) ? 16'h0020: - (state == 3'b010)&(btn_key_row == 4'b1011) ? 16'h0200: - (state == 3'b010)&(btn_key_row == 4'b0111) ? 16'h2000: - (state == 3'b011)&(btn_key_row == 4'b1110) ? 16'h0004: - (state == 3'b011)&(btn_key_row == 4'b1101) ? 16'h0040: - (state == 3'b011)&(btn_key_row == 4'b1011) ? 16'h0400: - (state == 3'b011)&(btn_key_row == 4'b0111) ? 16'h4000: - (state == 3'b100)&(btn_key_row == 4'b1110) ? 16'h0008: - (state == 3'b100)&(btn_key_row == 4'b1101) ? 16'h0080: - (state == 3'b100)&(btn_key_row == 4'b1011) ? 16'h0800: - (state == 3'b100)&(btn_key_row == 4'b0111) ? 16'h8000:16'h0000; - //-------------------------------{btn key}end----------------------------// - - //-----------------------------{btn step}begin---------------------------// - //btn step data - reg btn_step0_r; //0:press - reg btn_step1_r; //0:press - assign btn_step_data = {30'd0, ~btn_step0_r, ~btn_step1_r}; //1:press - - //-----step0 - //eliminate jitter - reg step0_flag; - reg [19:0] step0_count; - wire step0_start = btn_step0_r && !btn_step[0]; - wire step0_end = !btn_step0_r && btn_step[0]; - wire step0_sample = step0_count[19]; - always @(posedge aclk) begin - if (!aresetn) begin - step0_flag <= 1'd0; - end else if (step0_sample) begin - step0_flag <= 1'b0; - end else if (step0_start || step0_end) begin - step0_flag <= 1'b1; - end - - if (!aresetn || !step0_flag) begin - step0_count <= 20'd0; - end else begin - step0_count <= step0_count + 1'b1; - end - - if (!aresetn) begin - btn_step0_r <= 1'b1; - end else if (step0_sample) begin - btn_step0_r <= btn_step[0]; - end - end - - //-----step1 - //eliminate jitter - reg step1_flag; - reg [19:0] step1_count; - wire step1_start = btn_step1_r && !btn_step[1]; - wire step1_end = !btn_step1_r && btn_step[1]; - wire step1_sample = step1_count[19]; - always @(posedge aclk) begin - if (!aresetn) begin - step1_flag <= 1'd0; - end else if (step1_sample) begin - step1_flag <= 1'b0; - end else if (step1_start || step1_end) begin - step1_flag <= 1'b1; - end - - if (!aresetn || !step1_flag) begin - step1_count <= 20'd0; - end else begin - step1_count <= step1_count + 1'b1; - end - - if (!aresetn) begin - btn_step1_r <= 1'b1; - end else if (step1_sample) begin - btn_step1_r <= btn_step[1]; - end - end - //------------------------------{btn step}end----------------------------// - - //-------------------------------{led rg}begin---------------------------// - //led_rg0_data[31:0] led_rg0_data[31:0] - //bfd0_f010 bfd0_f014 - wire write_led_rg0 = conf_we & (conf_addr[15:0] == `LED_RG0_ADDR); - wire write_led_rg1 = conf_we & (conf_addr[15:0] == `LED_RG1_ADDR); - assign led_rg0 = led_rg0_data[1:0]; - assign led_rg1 = led_rg1_data[1:0]; - always @(posedge aclk) begin - if (!aresetn) begin - led_rg0_data <= 32'h0; - end else if (write_led_rg0) begin - led_rg0_data <= conf_wdata[31:0]; - end - - if (!aresetn) begin - led_rg1_data <= 32'h0; - end else if (write_led_rg1) begin - led_rg1_data <= conf_wdata[31:0]; - end - end - //--------------------------------{led rg}end----------------------------// - - //---------------------------{digital number}begin-----------------------// - //digital number display - //num_data[31:0] - wire write_num = conf_we & (conf_addr[15:0] == `NUM_ADDR); - always @(posedge aclk) begin - if (!aresetn) begin - num_data <= 32'h0; - end else if (write_num) begin - num_data <= conf_wdata[31:0]; - end - end - - - reg [19:0] count; - always @(posedge aclk) begin - if (!aresetn) begin - count <= 20'd0; - end else begin - count <= count + 1'b1; - end - end - //scan data - reg [3:0] scan_data; - always @(posedge aclk) begin - if (!aresetn) begin - scan_data <= 32'd0; - num_csn <= 8'b1111_1111; - end else begin - case (count[19:17]) - 3'b000: scan_data <= num_data[31:28]; - 3'b001: scan_data <= num_data[27:24]; - 3'b010: scan_data <= num_data[23:20]; - 3'b011: scan_data <= num_data[19:16]; - 3'b100: scan_data <= num_data[15:12]; - 3'b101: scan_data <= num_data[11:8]; - 3'b110: scan_data <= num_data[7 : 4]; - 3'b111: scan_data <= num_data[3 : 0]; - endcase - - case (count[19:17]) - 3'b000: num_csn <= 8'b0111_1111; - 3'b001: num_csn <= 8'b1011_1111; - 3'b010: num_csn <= 8'b1101_1111; - 3'b011: num_csn <= 8'b1110_1111; - 3'b100: num_csn <= 8'b1111_0111; - 3'b101: num_csn <= 8'b1111_1011; - 3'b110: num_csn <= 8'b1111_1101; - 3'b111: num_csn <= 8'b1111_1110; - endcase - end - end - - always @(posedge aclk) begin - if (!aresetn) begin - num_a_g <= 7'b0000000; - end else begin - case (scan_data) - 4'd0: num_a_g <= 7'b1111110; //0 - 4'd1: num_a_g <= 7'b0110000; //1 - 4'd2: num_a_g <= 7'b1101101; //2 - 4'd3: num_a_g <= 7'b1111001; //3 - 4'd4: num_a_g <= 7'b0110011; //4 - 4'd5: num_a_g <= 7'b1011011; //5 - 4'd6: num_a_g <= 7'b1011111; //6 - 4'd7: num_a_g <= 7'b1110000; //7 - 4'd8: num_a_g <= 7'b1111111; //8 - 4'd9: num_a_g <= 7'b1111011; //9 - 4'd10: num_a_g <= 7'b1110111; //a - 4'd11: num_a_g <= 7'b0011111; //b - 4'd12: num_a_g <= 7'b1001110; //c - 4'd13: num_a_g <= 7'b0111101; //d - 4'd14: num_a_g <= 7'b1001111; //e - 4'd15: num_a_g <= 7'b1000111; //f - endcase - end - end - //----------------------------{digital number}end------------------------// -endmodule diff --git a/src/testbench/MMU/inst_ram.coe b/src/testbench/MMU/inst_ram.coe deleted file mode 100644 index 346d20c..0000000 --- a/src/testbench/MMU/inst_ram.coe +++ /dev/null @@ -1,144381 +0,0 @@ -memory_initialization_radix = 16; -memory_initialization_vector = -2408ffff -2408ffff -100001ab -00000000 -3c088000 -25290001 -01005025 -01ae5821 -8d0c0000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -3c088000 -25290001 -01005025 -01ae5821 -8d0c0000 -25080001 -240900ff -3c0abfaf -354afff0 -ad490000 -1000fffa -00000000 -3c088000 -25290001 -01005025 -01ae5821 -8d0c0000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 -0000d010 -0000d812 -3c1a800d -8f5b0000 -241a0001 -137a0016 -00000000 -241a0002 -137a0024 -00000000 -241a0003 -137a0032 -00000000 -241a0004 -137a003f -00000000 -241a0005 -137a004d -00000000 -241a0006 -137a005b -00000000 -241a0007 -137a006a -00000000 -241a0008 -137a0078 -00000000 -00009021 -401a7000 -1754009f -00000000 -401a6800 -335a007c -241b0020 -175b009a -00000000 -401a6000 -335a0002 -241b0002 -175b0095 -00000000 -3c120001 -10000092 -00000000 -00009021 -401a7000 -1754008e -00000000 -401a6800 -335a007c -241b0024 -175b0089 -00000000 -401a6000 -335a0002 -241b0002 -175b0084 -00000000 -3c120002 -10000081 -00000000 -00009021 -401a7000 -1754007d -401a6800 -335a007c -241b0030 -175b0079 -00000000 -401a6000 -335a0002 -241b0002 -175b0074 -00000000 -3c120003 -10000071 -00000000 -00009021 -401a7000 -1754006d -00000000 -401a6800 -335a007c -241b0010 -175b0068 -00000000 -401a6000 -335a0002 -241b0002 -175b0063 -00000000 -3c120004 -10000060 -00000000 -00009021 -401a7000 -1754005c -00000000 -401a6800 -335a007c -241b0014 -175b0057 -00000000 -401a6000 -335a0002 -241b0002 -175b0052 -00000000 -3c120005 -1000004f -00000000 -00009021 -401a7000 -1754004b -00000000 -40957000 -401a6800 -335a007c -241b0010 -175b0045 -00000000 -401a6000 -335a0002 -241b0002 -175b0040 -00000000 -3c120006 -1000003d -00000000 -00009021 -401a7000 -17540039 -00000000 -401a6800 -335a007c -241b0028 -175b0034 -00000000 -401a6000 -335a0002 -241b0002 -175b002f -00000000 -3c120007 -1000002c -00000000 -00009021 -401a7000 -17540028 -00000000 -275a0008 -409a7000 -3c1bbfb0 -af608ffc -af608ffc -af60fff8 -af608ffc -af608ffc -8f608ffc -8f7bfff8 -401a6800 -3c1bbfb0 -af608ffc -af608ffc -af7bfff8 -af608ffc -af608ffc -8f608ffc -8f7bfff8 -335a007c -241b0000 -175b0011 -00000000 -00000000 -401a6000 -00000000 -335a0002 -241b0002 -175b000a -00000000 -00000000 -241affff -241b0000 -409a5800 -00000000 -409b6800 -10000010 -3c120008 -00000000 -401a6800 -3c1b8000 -035bd024 -401b7000 -00000000 -13400003 -277b0004 -00000000 -277b0004 -409b7000 -16400003 -00000000 -00000000 -3c12ffff -42000018 -00000000 -3c04bfaf -3484f008 -3c05bfaf -34a5f004 -3c11bfaf -3631f010 -24090002 -240a0001 -3c130000 -ac890000 -acaa0000 -ae330000 -3c100000 -3c09bfc0 -25290704 -3c0a2000 -012ac823 -03200008 -00000000 -0ff01440 -00000000 -0ff00353 -00000000 -3c19bfc0 -27390724 -03200008 -00000000 -0ff17638 -00000000 -0ff00353 -00000000 -0ff22494 -00000000 -0ff00353 -00000000 -0ff0e9e8 -00000000 -0ff00353 -00000000 -0ff08de4 -00000000 -0ff00353 -00000000 -0ff1257c -00000000 -0ff00353 -00000000 -0ff1a824 -00000000 -0ff00353 -00000000 -0ff13f90 -00000000 -0ff00353 -00000000 -0ff00d58 -00000000 -0ff00353 -00000000 -0ff0f59c -00000000 -0ff00353 -00000000 -0ff1bac8 -00000000 -0ff00353 -00000000 -0ff00610 -00000000 -0ff00353 -00000000 -0ff0fc84 -00000000 -0ff00353 -00000000 -0ff18e08 -00000000 -0ff00353 -00000000 -0ff20e8c -00000000 -0ff00353 -00000000 -0ff1e7d8 -00000000 -0ff00353 -00000000 -0ff2050c -00000000 -0ff00353 -00000000 -0ff0e69c -00000000 -0ff00353 -00000000 -0ff0db68 -00000000 -0ff00353 -00000000 -0ff21f3c -00000000 -0ff00353 -00000000 -0ff1fca0 -00000000 -0ff00353 -00000000 -0ff029ac -00000000 -0ff00353 -00000000 -0ff0ca0c -00000000 -0ff00353 -00000000 -0ff183d0 -00000000 -0ff00353 -00000000 -0ff1e9dc -00000000 -0ff00353 -00000000 -0ff132f4 -00000000 -0ff00353 -00000000 -0ff1b3e0 -00000000 -0ff00353 -00000000 -0ff227f4 -00000000 -0ff00353 -00000000 -0ff1dff8 -00000000 -0ff00353 -00000000 -0ff11b44 -00000000 -0ff00353 -00000000 -0ff0210c -00000000 -0ff00353 -00000000 -0ff1d76c -00000000 -0ff00353 -00000000 -0ff108d8 -00000000 -0ff00353 -00000000 -0ff0324c -00000000 -0ff00353 -00000000 -0ff018d8 -00000000 -0ff00353 -00000000 -0ff16cd0 -00000000 -0ff00353 -00000000 -0ff157a0 -00000000 -0ff00353 -00000000 -0ff077f8 -00000000 -0ff00353 -00000000 -0ff1c238 -00000000 -0ff00353 -00000000 -0ff1489c -00000000 -0ff00353 -00000000 -0ff0a2bc -00000000 -0ff00353 -00000000 -0ff06120 -00000000 -0ff00353 -00000000 -0ff044a8 -00000000 -0ff00353 -00000000 -0ff1f5f0 -00000000 -0ff00353 -00000000 -0ff03af0 -00000000 -0ff00353 -00000000 -0ff0d24c -00000000 -0ff00353 -00000000 -0ff20650 -00000000 -0ff00353 -00000000 -0ff220f4 -00000000 -0ff00353 -00000000 -0ff05d80 -00000000 -0ff00353 -00000000 -0ff18070 -00000000 -0ff00353 -00000000 -0ff0a014 -00000000 -0ff00353 -00000000 -0ff00bb0 -00000000 -0ff00353 -00000000 -0ff00368 -00000000 -0ff00353 -00000000 -0ff2322c -00000000 -0ff00353 -00000000 -0ff1f408 -00000000 -0ff00353 -00000000 -0ff05a94 -00000000 -0ff00353 -00000000 -0ff0e800 -00000000 -0ff00353 -00000000 -0ff13d50 -00000000 -0ff00353 -00000000 -0ff0dc5c -00000000 -0ff00353 -00000000 -0ff19e48 -00000000 -0ff00353 -00000000 -0ff0b884 -00000000 -0ff00353 -00000000 -0ff12a7c -00000000 -0ff00353 -00000000 -0ff11040 -00000000 -0ff00353 -00000000 -0ff0bf98 -00000000 -0ff00353 -00000000 -0ff1a7d4 -00000000 -0ff00353 -00000000 -0ff0e75c -00000000 -0ff00353 -00000000 -0ff1f2e8 -00000000 -0ff00353 -00000000 -0ff1f37c -00000000 -0ff00353 -00000000 -0ff0e548 -00000000 -0ff00353 -00000000 -0ff00550 -00000000 -0ff00353 -00000000 -0ff08d24 -00000000 -0ff00353 -00000000 -0ff0318c -00000000 -0ff00353 -00000000 -0ff0204c -00000000 -0ff00353 -00000000 -0ff17578 -00000000 -0ff00353 -00000000 -0ff13cc4 -00000000 -0ff00353 -00000000 -0ff0e7ac -00000000 -0ff00353 -00000000 -0ff1325c -00000000 -0ff00353 -00000000 -0ff0c94c -00000000 -0ff00353 -00000000 -0ff1b320 -00000000 -0ff00353 -00000000 -0ff028ec -00000000 -0ff00353 -00000000 -0ff1e91c -00000000 -0ff00353 -00000000 -0ff0e5dc -00000000 -0ff00353 -00000000 -0ff13ed0 -00000000 -0ff00353 -00000000 -0ff22030 -00000000 -0ff00353 -00000000 -0ff1b25c -00000000 -0ff00353 -00000000 -0ff0a1fc -00000000 -0ff00353 -00000000 -0ff11a80 -00000000 -0ff00353 -00000000 -0ff09f54 -00000000 -0ff00353 -00000000 -0ff05cbc -00000000 -0ff00353 -00000000 -3c04bfaf -3484ffec -24081234 -ac880000 -8c890000 -00084400 -15090009 -00000000 -3c085678 -ac880000 -00084402 -8c890000 -15090003 -00000000 -10000003 -00000000 -26100001 -ae300000 -24100059 -1213000d -00000000 -3c04bfaf -3484f000 -3c05bfaf -34a5f008 -3c06bfaf -34c6f004 -24090002 -ac800000 -aca90000 -acc90000 -10000008 -00000000 -24090001 -3c04bfaf -3484f008 -3c05bfaf -34a5f004 -ac890000 -aca90000 -0ff00040 -00000000 -3c08bfaf -3508f02c -3409aaaa -8d0a0000 -01495026 -000a5a40 -256b0001 -256bffff -8d0a0000 -01495026 -000a5240 -016a602b -15800002 -00000000 -254b0000 -1560fff7 -00000000 -03e00008 -00000000 -00000000 -00000000 -26100001 -24120000 -3c048000 -3c057fff -34a5ffff -1c800006 -3c08800d -3c16800d -151601da -00000000 -1ca00003 -3c17800d -100001d6 -00000000 -16f601d4 -00000000 -3c048000 -3c057fff -34a5ffff -1c800006 -25098123 -25168123 -153601cc -00000000 -1ca00003 -25178123 -100001c8 -00000000 -16f601c6 -00000000 -3c048000 -3c057fff -34a5ffff -1c800006 -ad098ee0 -ad168ee0 -153601be -00000000 -1ca00003 -ad178ee0 -100001ba -00000000 -16f601b8 -00000000 -3c048000 -3c057fff -34a5ffff -1c800006 -8d0a8ee0 -8d168ee0 -155601b0 -00000000 -1ca00003 -8d178ee0 -100001ac -00000000 -16f601aa -00000000 -3c048000 -3c057fff -34a5ffff -1c800006 -012a5821 -012ab021 -157601a2 -00000000 -1ca00003 -012ab821 -1000019e -00000000 -16f6019c -00000000 -3c048000 -3c057fff -34a5ffff -1c800006 -02326025 -0232b025 -15960194 -00000000 -1ca00003 -0232b825 -10000190 -00000000 -16f6018e -00000000 -3c048000 -3c057fff -34a5ffff -1c800006 -0253682a -0253b02a -15b60186 -00000000 -1ca00003 -0253b82a -10000182 -00000000 -16f60180 -00000000 -3c048000 -3c057fff -34a5ffff -1c800006 -2a4e8011 -2a568011 -15d60178 -00000000 -1ca00003 -2a578011 -10000174 -00000000 -16f60172 -00000000 -3c048000 -3c057fff -34a5ffff -1c800006 -2e4f8011 -2e568011 -15f6016a -00000000 -1ca00003 -2e578011 -10000166 -00000000 -16f60164 -00000000 -3c048000 -3c057fff -34a5ffff -1c800006 -0253c02b -0253b02b -1716015c -00000000 -1ca00003 -0253b82b -10000158 -00000000 -16f60156 -00000000 -3c048000 -3c057fff -34a5ffff -1c800006 -00124c40 -0012b440 -1536014e -00000000 -1ca00003 -0012bc40 -1000014a -00000000 -16f60148 -00000000 -3c048000 -3c057fff -34a5ffff -1c800006 -01105020 -0110b020 -15560140 -00000000 -1ca00003 -0110b820 -1000013c -00000000 -16f6013a -00000000 -3c048000 -3c057fff -34a5ffff -1c800006 -220b8002 -22168002 -15760132 -00000000 -1ca00003 -22178002 -1000012e -00000000 -16f6012c -00000000 -3c048000 -3c057fff -34a5ffff -1c800006 -01106022 -0110b022 -15960124 -00000000 -1ca00003 -0110b822 -10000120 -00000000 -16f6011e -00000000 -3c048000 -3c057fff -34a5ffff -1c800006 -01106823 -0110b023 -15b60116 -00000000 -1ca00003 -0110b823 -10000112 -00000000 -16f60110 -00000000 -3c048000 -3c057fff -34a5ffff -1c800006 -01107024 -0110b024 -15d60108 -00000000 -1ca00003 -0110b824 -10000104 -00000000 -16f60102 -00000000 -3c048000 -3c057fff -34a5ffff -1c800006 -320f8ff2 -32168ff2 -15f600fa -00000000 -1ca00003 -32178ff2 -100000f6 -00000000 -16f600f4 -00000000 -3c048000 -3c057fff -34a5ffff -1c800006 -0110c027 -0110b027 -171600ec -00000000 -1ca00003 -0110b827 -100000e8 -00000000 -16f600e6 -00000000 -3c048000 -3c057fff -34a5ffff -1c800006 -36098ff2 -36168ff2 -153600de -00000000 -1ca00003 -36178ff2 -100000da -00000000 -16f600d8 -00000000 -3c048000 -3c057fff -34a5ffff -1c800006 -01105026 -0110b026 -155600d0 -00000000 -1ca00003 -0110b826 -100000cc -00000000 -16f600ca -00000000 -3c048000 -3c057fff -34a5ffff -1c800006 -3a0b8ff2 -3a168ff2 -157600c2 -00000000 -1ca00003 -3a178ff2 -100000be -00000000 -16f600bc -00000000 -3c048000 -3c057fff -34a5ffff -1c800006 -02086004 -0208b004 -159600b4 -00000000 -1ca00003 -0208b804 -100000b0 -00000000 -16f600ae -00000000 -3c048000 -3c057fff -34a5ffff -1c800006 -00106a03 -0010b203 -15b600a6 -00000000 -1ca00003 -0010ba03 -100000a2 -00000000 -16f600a0 -00000000 -3c048000 -3c057fff -34a5ffff -1c800006 -02087007 -0208b007 -15d60098 -00000000 -1ca00003 -0208b807 -10000094 -00000000 -16f60092 -00000000 -3c048000 -3c057fff -34a5ffff -1c800006 -00107a02 -0010b202 -15f6008a -00000000 -1ca00003 -0010ba02 -10000086 -00000000 -16f60084 -00000000 -3c048000 -3c057fff -34a5ffff -1c800006 -0208c006 -0208b006 -1716007c -00000000 -1ca00003 -0208b806 -10000078 -00000000 -16f60076 -00000000 -3c088000 -34098000 -3c048000 -3c057fff -34a5ffff -24020000 -24030000 -1c80000a -0109001a -00001012 -00800013 -0109001a -0000b012 -14560067 -00000000 -00800013 -1ca00003 -0109001a -10000062 -00000000 -00001812 -1476005f -00000000 -3c048000 -3c057fff -34a5ffff -24020000 -24030000 -1c80000a -0109001b -00001012 -00800013 -0109001b -0000b012 -14560052 -00000000 -00800013 -1ca00003 -0109001b -1000004d -00000000 -00001812 -1476004a -00000000 -3c048000 -3c057fff -34a5ffff -24020000 -24030000 -1c80000a -01090018 -00001012 -00800013 -01090018 -0000b012 -1456003d -00000000 -00800013 -1ca00003 -01090018 -10000038 -00000000 -00001812 -14760035 -00000000 -3c048000 -3c057fff -34a5ffff -24020000 -24030000 -1c80000a -01090019 -00001012 -00800013 -01090019 -0000b012 -14560028 -00000000 -00800013 -1ca00003 -01090019 -10000023 -00000000 -00001812 -14760020 -00000000 -3c048000 -3c057fff -34a5ffff -1c800006 -00007810 -0000b010 -15f60018 -00000000 -1ca00003 -0000b810 -10000014 -00000000 -16f60012 -00000000 -3c048000 -3c057fff -34a5ffff -1c800006 -00007012 -0000b012 -15d6000a -00000000 -1ca00003 -0000b812 -10000006 -00000000 -16f60004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -3c08800d -24120004 -ad120000 -40805800 -3c170040 -40976000 -00000000 -3c170004 -3c023958 -3442f252 -3c033958 -3463f252 -3c04800d -3484759c -3c05b27f -34a59788 -24878845 -3c010001 -00240821 -ac258844 -3c14bfc0 -2694159c -8c828845 -1657009f -00000000 -1443009d -00000000 -40164000 -14f6009a -00000000 -24120004 -3c02c044 -34422bd0 -3c03c044 -34632bd0 -3c04800d -34847748 -3c053101 -34a5bbec -24870ea2 -ac850ea0 -3c14bfc0 -269415f8 -ad080004 -ad140004 -8c820ea2 -ad140000 -8d090004 -15340086 -00000000 -16570084 -00000000 -14430082 -00000000 -40164000 -14f6007f -00000000 -24120004 -ad120000 -24120004 -3c026892 -34429b5c -3c036892 -34639b5c -3c04800d -348459dc -3c0594a1 -34a5ade4 -24877cee -ac857cec -3c14bfc0 -2694166c -01000011 -0110001b -8c827cee -00004810 -1128006a -00000000 -16570068 -00000000 -14430066 -00000000 -40164000 -14f60063 -00000000 -24120004 -3c027423 -3442d85f -3c037423 -3463d85f -3c04800d -34847748 -3c05e2b0 -34a5a2c0 -24874973 -ac854970 -3c14bfc0 -269416cc -8c824973 -0208001b -16570052 -00000000 -14430050 -00000000 -40164000 -14f6004d -00000000 -24120004 -3c02dd06 -34424458 -3c03dd06 -34634458 -3c04800d -34845bac -3c050f9e -34a5dafa -2487003e -ac85003c -3c14bfc0 -2694172c -01000013 -01100019 -8c82003e -00004810 -1128003a -00000000 -16570038 -00000000 -14430036 -00000000 -40164000 -14f60033 -00000000 -24120004 -3c021514 -34428b6c -3c031514 -34638b6c -3c04800d -34840704 -3c055077 -34a5f320 -2487e53f -3c010001 -00240821 -ac25e53c -3c14bfc0 -26941794 -8c82e53f -01120019 -16570020 -00000000 -1443001e -00000000 -40164000 -14f6001b -00000000 -24120004 -3c023958 -3442f252 -3c033958 -3463f252 -3c04800d -3484759c -3c05b27f -34a59788 -24878845 -3c010001 -00240821 -ac258844 -3c14bfc0 -269417f8 -40927000 -8c828845 -40887000 -16570007 -00000000 -14430005 -00000000 -40164000 -14f60002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -00000000 -26100001 -24120000 -3c096175 -35294443 -3c08800d -350877a0 -3c036175 -34634443 -ad097b14 -25040004 -2505fffc -ac847b14 -aca57b14 -8d027b14 -8c867b14 -8ca47b14 -8ca67b14 -14430587 -00000000 -3c095c4f -3529b45a -3c08800d -35084aac -3c035c4f -3463b45a -ad09776c -25040004 -2505fffc -ac84776c -aca5776c -8d02776c -8c86776c -8ca4776c -8ca6776c -14430576 -00000000 -3c091490 -35298300 -3c08800d -35084ae8 -3c031490 -34638300 -ad095bd8 -25040004 -2505fffc -ac845bd8 -aca55bd8 -8d025bd8 -8c865bd8 -8ca45bd8 -8ca65bd8 -14430565 -00000000 -3c09516d -3529a739 -3c08800d -350860cc -3c03516d -3463a739 -3c010001 -00280821 -ac298950 -25040004 -2505fffc -3c010001 -00240821 -ac248950 -3c010001 -00250821 -ac258950 -3c020001 -00481021 -8c428950 -3c060001 -00c43021 -8cc68950 -3c040001 -00852021 -8c848950 -3c060001 -00c53021 -8cc68950 -14430546 -00000000 -3c098567 -35295a34 -3c08800d -35085510 -3c038567 -34635a34 -ad0930b0 -25040004 -2505fffc -ac8430b0 -aca530b0 -8d0230b0 -8c8630b0 -8ca430b0 -8ca630b0 -14430535 -00000000 -3c090e4d -3529ac98 -3c08800d -3508b040 -3c030e4d -3463ac98 -ad094000 -25040004 -2505fffc -ac844000 -aca54000 -8d024000 -8c864000 -8ca44000 -8ca64000 -14430524 -00000000 -3c09d9c6 -3529eddb -3c08800d -35087180 -3c03d9c6 -3463eddb -ad0922e0 -25040004 -2505fffc -ac8422e0 -aca522e0 -8d0222e0 -8c8622e0 -8ca422e0 -8ca622e0 -14430513 -00000000 -3c095753 -3529dd01 -3c08800d -35082ca0 -3c035753 -3463dd01 -ad092780 -25040004 -2505fffc -ac842780 -aca52780 -8d022780 -8c862780 -8ca42780 -8ca62780 -14430502 -00000000 -3c09e543 -3529b9f3 -3c08800d -3508331c -3c03e543 -3463b9f3 -ad0969b8 -25040004 -2505fffc -ac8469b8 -aca569b8 -8d0269b8 -8c8669b8 -8ca469b8 -8ca669b8 -144304f1 -00000000 -3c094726 -3529aca2 -3c08800d -35086cf8 -3c034726 -3463aca2 -ad095b70 -25040004 -2505fffc -ac845b70 -aca55b70 -8d025b70 -8c865b70 -8ca45b70 -8ca65b70 -144304e0 -00000000 -3c09b022 -3529040a -3c08800d -35080800 -3c03b022 -3463040a -3c010001 -00280821 -ac29aa6c -25040004 -2505fffc -3c010001 -00240821 -ac24aa6c -3c010001 -00250821 -ac25aa6c -3c020001 -00481021 -8c42aa6c -3c060001 -00c43021 -8cc6aa6c -3c040001 -00852021 -8c84aa6c -3c060001 -00c53021 -8cc6aa6c -144304c1 -00000000 -3c095ca0 -3529fd00 -3c08800d -35089834 -3c035ca0 -3463fd00 -ad095070 -25040004 -2505fffc -ac845070 -aca55070 -8d025070 -8c865070 -8ca45070 -8ca65070 -144304b0 -00000000 -3c09063b -3529a000 -3c08800d -35081c64 -3c03063b -3463a000 -ad0945fc -25040004 -2505fffc -ac8445fc -aca545fc -8d0245fc -8c8645fc -8ca445fc -8ca645fc -1443049f -00000000 -3c09c226 -35298cfe -3c08800d -350881e8 -3c03c226 -34638cfe -ad095c54 -25040004 -2505fffc -ac845c54 -aca55c54 -8d025c54 -8c865c54 -8ca45c54 -8ca65c54 -1443048e -00000000 -3c091611 -3529444c -3c08800d -35080484 -3c031611 -3463444c -3c010001 -00280821 -ac29ec90 -25040004 -2505fffc -3c010001 -00240821 -ac24ec90 -3c010001 -00250821 -ac25ec90 -3c020001 -00481021 -8c42ec90 -3c060001 -00c43021 -8cc6ec90 -3c040001 -00852021 -8c84ec90 -3c060001 -00c53021 -8cc6ec90 -1443046f -00000000 -3c0933cc -35296f2a -3c08800d -350871dc -3c0333cc -34636f2a -ad092e30 -25040004 -2505fffc -ac842e30 -aca52e30 -8d022e30 -8c862e30 -8ca42e30 -8ca62e30 -1443045e -00000000 -3c09c2b4 -35296f21 -3c08800d -35081388 -3c03c2b4 -34636f21 -ad096264 -25040004 -2505fffc -ac846264 -aca56264 -8d026264 -8c866264 -8ca46264 -8ca66264 -1443044d -00000000 -3c0963a8 -35296040 -3c08800d -350802a8 -3c0363a8 -34636040 -3c010001 -00280821 -ac29bab0 -25040004 -2505fffc -3c010001 -00240821 -ac24bab0 -3c010001 -00250821 -ac25bab0 -3c020001 -00481021 -8c42bab0 -3c060001 -00c43021 -8cc6bab0 -3c040001 -00852021 -8c84bab0 -3c060001 -00c53021 -8cc6bab0 -1443042e -00000000 -3c09e08d -352945d0 -3c08800d -35081d14 -3c03e08d -346345d0 -3c010001 -00280821 -ac29daac -25040004 -2505fffc -3c010001 -00240821 -ac24daac -3c010001 -00250821 -ac25daac -3c020001 -00481021 -8c42daac -3c060001 -00c43021 -8cc6daac -3c040001 -00852021 -8c84daac -3c060001 -00c53021 -8cc6daac -1443040f -00000000 -3c09f383 -35299208 -3c08800d -35085308 -3c03f383 -34639208 -ad09066c -25040004 -2505fffc -ac84066c -aca5066c -8d02066c -8c86066c -8ca4066c -8ca6066c -144303fe -00000000 -3c094268 -3529fd38 -3c08800d -35083f00 -3c034268 -3463fd38 -ad0903c0 -25040004 -2505fffc -ac8403c0 -aca503c0 -8d0203c0 -8c8603c0 -8ca403c0 -8ca603c0 -144303ed -00000000 -3c091281 -35296280 -3c08800d -35081b94 -3c031281 -34636280 -3c010001 -00280821 -ac298aa0 -25040004 -2505fffc -3c010001 -00240821 -ac248aa0 -3c010001 -00250821 -ac258aa0 -3c020001 -00481021 -8c428aa0 -3c060001 -00c43021 -8cc68aa0 -3c040001 -00852021 -8c848aa0 -3c060001 -00c53021 -8cc68aa0 -144303ce -00000000 -3c095404 -3529b496 -3c08800d -35081698 -3c035404 -3463b496 -3c010001 -00280821 -ac29e188 -25040004 -2505fffc -3c010001 -00240821 -ac24e188 -3c010001 -00250821 -ac25e188 -3c020001 -00481021 -8c42e188 -3c060001 -00c43021 -8cc6e188 -3c040001 -00852021 -8c84e188 -3c060001 -00c53021 -8cc6e188 -144303af -00000000 -3c09f11c -35291c02 -3c08800d -35081de0 -3c03f11c -34631c02 -3c010001 -00280821 -ac29b4c8 -25040004 -2505fffc -3c010001 -00240821 -ac24b4c8 -3c010001 -00250821 -ac25b4c8 -3c020001 -00481021 -8c42b4c8 -3c060001 -00c43021 -8cc6b4c8 -3c040001 -00852021 -8c84b4c8 -3c060001 -00c53021 -8cc6b4c8 -14430390 -00000000 -3c093109 -35290da2 -3c08800d -35089400 -3c033109 -34630da2 -ad091150 -25040004 -2505fffc -ac841150 -aca51150 -8d021150 -8c861150 -8ca41150 -8ca61150 -1443037f -00000000 -3c099480 -35299b50 -3c08800d -350827c8 -3c039480 -34639b50 -ad0924c0 -25040004 -2505fffc -ac8424c0 -aca524c0 -8d0224c0 -8c8624c0 -8ca424c0 -8ca624c0 -1443036e -00000000 -3c09ff1e -3529d37c -3c08800d -35081488 -3c03ff1e -3463d37c -3c010001 -00280821 -ac29d664 -25040004 -2505fffc -3c010001 -00240821 -ac24d664 -3c010001 -00250821 -ac25d664 -3c020001 -00481021 -8c42d664 -3c060001 -00c43021 -8cc6d664 -3c040001 -00852021 -8c84d664 -3c060001 -00c53021 -8cc6d664 -1443034f -00000000 -3c095e23 -3529d200 -3c08800d -3508a074 -3c035e23 -3463d200 -ad092558 -25040004 -2505fffc -ac842558 -aca52558 -8d022558 -8c862558 -8ca42558 -8ca62558 -1443033e -00000000 -3c096883 -35291248 -3c08800d -350863ec -3c036883 -34631248 -ad095f40 -25040004 -2505fffc -ac845f40 -aca55f40 -8d025f40 -8c865f40 -8ca45f40 -8ca65f40 -1443032d -00000000 -3c094558 -3529e910 -3c08800d -35080cc0 -3c034558 -3463e910 -ad093d8c -25040004 -2505fffc -ac843d8c -aca53d8c -8d023d8c -8c863d8c -8ca43d8c -8ca63d8c -1443031c -00000000 -3c09c983 -352927b0 -3c08800d -350804e0 -3c03c983 -346327b0 -3c010001 -00280821 -ac29a808 -25040004 -2505fffc -3c010001 -00240821 -ac24a808 -3c010001 -00250821 -ac25a808 -3c020001 -00481021 -8c42a808 -3c060001 -00c43021 -8cc6a808 -3c040001 -00852021 -8c84a808 -3c060001 -00c53021 -8cc6a808 -144302fd -00000000 -3c09fea2 -3529f1ad -3c08800d -35081b68 -3c03fea2 -3463f1ad -3c010001 -00280821 -ac29adec -25040004 -2505fffc -3c010001 -00240821 -ac24adec -3c010001 -00250821 -ac25adec -3c020001 -00481021 -8c42adec -3c060001 -00c43021 -8cc6adec -3c040001 -00852021 -8c84adec -3c060001 -00c53021 -8cc6adec -144302de -00000000 -3c09ac52 -3529b354 -3c08800d -3c03ac52 -3463b354 -3c010001 -00280821 -ac29c3dc -25040004 -2505fffc -3c010001 -00240821 -ac24c3dc -3c010001 -00250821 -ac25c3dc -3c020001 -00481021 -8c42c3dc -3c060001 -00c43021 -8cc6c3dc -3c040001 -00852021 -8c84c3dc -3c060001 -00c53021 -8cc6c3dc -144302c0 -00000000 -3c094f61 -35292db4 -3c08800d -3c034f61 -34632db4 -ad094a74 -25040004 -2505fffc -ac844a74 -aca54a74 -8d024a74 -8c864a74 -8ca44a74 -8ca64a74 -144302b0 -00000000 -3c0981e4 -3529a52c -3c08800d -3c0381e4 -3463a52c -ad093370 -25040004 -2505fffc -ac843370 -aca53370 -8d023370 -8c863370 -8ca43370 -8ca63370 -144302a0 -00000000 -3c096b61 -35295254 -3c08800d -3c036b61 -34635254 -ad09729c -25040004 -2505fffc -ac84729c -aca5729c -8d02729c -8c86729c -8ca4729c -8ca6729c -14430290 -00000000 -3c092447 -3529d85d -3c08800d -3c032447 -3463d85d -ad097490 -25040004 -2505fffc -ac847490 -aca57490 -8d027490 -8c867490 -8ca47490 -8ca67490 -14430280 -00000000 -3c098dde -35291c20 -3c08800d -3c038dde -34631c20 -ad09307c -25040004 -2505fffc -ac84307c -aca5307c -8d02307c -8c86307c -8ca4307c -8ca6307c -14430270 -00000000 -3c09cf30 -35294a09 -3c08800d -3c03cf30 -34634a09 -3c010001 -00280821 -ac29fba0 -25040004 -2505fffc -3c010001 -00240821 -ac24fba0 -3c010001 -00250821 -ac25fba0 -3c020001 -00481021 -8c42fba0 -3c060001 -00c43021 -8cc6fba0 -3c040001 -00852021 -8c84fba0 -3c060001 -00c53021 -8cc6fba0 -14430252 -00000000 -3c09431f -352945e2 -3c08800d -3c03431f -346345e2 -3c010001 -00280821 -ac29ca58 -25040004 -2505fffc -3c010001 -00240821 -ac24ca58 -3c010001 -00250821 -ac25ca58 -3c020001 -00481021 -8c42ca58 -3c060001 -00c43021 -8cc6ca58 -3c040001 -00852021 -8c84ca58 -3c060001 -00c53021 -8cc6ca58 -14430234 -00000000 -3c0999db -35299a50 -3c08800d -3c0399db -34639a50 -ad093248 -25040004 -2505fffc -ac843248 -aca53248 -8d023248 -8c863248 -8ca43248 -8ca63248 -14430224 -00000000 -3c09e73f -35290fdc -3c08800d -3c03e73f -34630fdc -3c010001 -00280821 -ac298718 -25040004 -2505fffc -3c010001 -00240821 -ac248718 -3c010001 -00250821 -ac258718 -3c020001 -00481021 -8c428718 -3c060001 -00c43021 -8cc68718 -3c040001 -00852021 -8c848718 -3c060001 -00c53021 -8cc68718 -14430206 -00000000 -3c09450b -3529bdc0 -3c08800d -3c03450b -3463bdc0 -ad095128 -25040004 -2505fffc -ac845128 -aca55128 -8d025128 -8c865128 -8ca45128 -8ca65128 -144301f6 -00000000 -3c09c0c7 -3529c830 -3c08800d -3c03c0c7 -3463c830 -3c010001 -00280821 -ac298980 -25040004 -2505fffc -3c010001 -00240821 -ac248980 -3c010001 -00250821 -ac258980 -3c020001 -00481021 -8c428980 -3c060001 -00c43021 -8cc68980 -3c040001 -00852021 -8c848980 -3c060001 -00c53021 -8cc68980 -144301d8 -00000000 -3c098006 -3529ca23 -3c08800d -3c038006 -3463ca23 -ad095430 -25040004 -2505fffc -ac845430 -aca55430 -8d025430 -8c865430 -8ca45430 -8ca65430 -144301c8 -00000000 -3c094004 -35297d98 -3c08800d -3c034004 -34637d98 -3c010001 -00280821 -ac29a5e8 -25040004 -2505fffc -3c010001 -00240821 -ac24a5e8 -3c010001 -00250821 -ac25a5e8 -3c020001 -00481021 -8c42a5e8 -3c060001 -00c43021 -8cc6a5e8 -3c040001 -00852021 -8c84a5e8 -3c060001 -00c53021 -8cc6a5e8 -144301aa -00000000 -3c09c95d -3529e720 -3c08800d -3c03c95d -3463e720 -ad097c80 -25040004 -2505fffc -ac847c80 -aca57c80 -8d027c80 -8c867c80 -8ca47c80 -8ca67c80 -1443019a -00000000 -3c09d047 -35296900 -3c08800d -3c03d047 -34636900 -3c010001 -00280821 -ac29c2e0 -25040004 -2505fffc -3c010001 -00240821 -ac24c2e0 -3c010001 -00250821 -ac25c2e0 -3c020001 -00481021 -8c42c2e0 -3c060001 -00c43021 -8cc6c2e0 -3c040001 -00852021 -8c84c2e0 -3c060001 -00c53021 -8cc6c2e0 -1443017c -00000000 -3c09873f -3529383a -3c08800d -3c03873f -3463383a -ad0947b8 -25040004 -2505fffc -ac8447b8 -aca547b8 -8d0247b8 -8c8647b8 -8ca447b8 -8ca647b8 -1443016c -00000000 -3c0950d5 -35294ce0 -3c08800d -3c0350d5 -34634ce0 -3c010001 -00280821 -ac298320 -25040004 -2505fffc -3c010001 -00240821 -ac248320 -3c010001 -00250821 -ac258320 -3c020001 -00481021 -8c428320 -3c060001 -00c43021 -8cc68320 -3c040001 -00852021 -8c848320 -3c060001 -00c53021 -8cc68320 -1443014e -00000000 -3c098502 -3529ea18 -3c08800d -3c038502 -3463ea18 -3c010001 -00280821 -ac29f2f0 -25040004 -2505fffc -3c010001 -00240821 -ac24f2f0 -3c010001 -00250821 -ac25f2f0 -3c020001 -00481021 -8c42f2f0 -3c060001 -00c43021 -8cc6f2f0 -3c040001 -00852021 -8c84f2f0 -3c060001 -00c53021 -8cc6f2f0 -14430130 -00000000 -3c0909f2 -3529b630 -3c08800d -3c0309f2 -3463b630 -3c010001 -00280821 -ac29aa24 -25040004 -2505fffc -3c010001 -00240821 -ac24aa24 -3c010001 -00250821 -ac25aa24 -3c020001 -00481021 -8c42aa24 -3c060001 -00c43021 -8cc6aa24 -3c040001 -00852021 -8c84aa24 -3c060001 -00c53021 -8cc6aa24 -14430112 -00000000 -3c09e807 -35299b47 -3c08800d -3c03e807 -34639b47 -ad0941e0 -25040004 -2505fffc -ac8441e0 -aca541e0 -8d0241e0 -8c8641e0 -8ca441e0 -8ca641e0 -14430102 -00000000 -3c095de6 -3529e330 -3c08800d -3c035de6 -3463e330 -ad090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -144300f2 -00000000 -3c09bf63 -35297404 -3c08800d -3c03bf63 -34637404 -ad090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -144300e2 -00000000 -3c099922 -35297ac0 -3c08800d -3c039922 -34637ac0 -ad090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -144300d2 -00000000 -3c09ddec -3529d270 -3c08800d -3c03ddec -3463d270 -ad090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -144300c2 -00000000 -3c0906a0 -35296018 -3c08800d -3c0306a0 -34636018 -ad090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -144300b2 -00000000 -3c09f428 -3529d0c8 -3c08800d -3c03f428 -3463d0c8 -ad090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -144300a2 -00000000 -3c09a6ce -352933ec -3c08800d -3c03a6ce -346333ec -ad090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -14430092 -00000000 -3c09a781 -35293bc0 -3c08800d -3c03a781 -34633bc0 -ad090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -14430082 -00000000 -3c097244 -35290e8c -3c08800d -3c037244 -34630e8c -ad090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -14430072 -00000000 -3c09a413 -35290340 -3c08800d -3c03a413 -34630340 -ad090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -14430062 -00000000 -3c09b6ca -35290800 -3c08800d -3c03b6ca -34630800 -ad090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -14430052 -00000000 -3c091733 -35291928 -3c08800d -3c031733 -34631928 -ad090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -14430042 -00000000 -3c090953 -35297c5f -3c08800d -3c030953 -34637c5f -ad090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -14430032 -00000000 -3c093696 -35294fd0 -3c08800d -3c033696 -34634fd0 -ad090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -14430022 -00000000 -3c09e67b -35291aa6 -3c08800d -3c03e67b -34631aa6 -ad090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -14430012 -00000000 -24090000 -3c08800d -24030000 -ad090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -26100001 -24120000 -3c048000 -04810006 -3c08800d -3c16800d -1516019c -00000000 -04010003 -3c17800d -10000198 -00000000 -16f60196 -00000000 -3c048000 -04810006 -25098123 -25168123 -15360190 -00000000 -04010003 -25178123 -1000018c -00000000 -16f6018a -00000000 -3c048000 -04810006 -ad098ee0 -ad168ee0 -15360184 -00000000 -04010003 -ad178ee0 -10000180 -00000000 -16f6017e -00000000 -3c048000 -04810006 -8d0a8ee0 -8d168ee0 -15560178 -00000000 -04010003 -8d178ee0 -10000174 -00000000 -16f60172 -00000000 -3c048000 -04810006 -012a5821 -012ab021 -1576016c -00000000 -04010003 -012ab821 -10000168 -00000000 -16f60166 -00000000 -3c048000 -04810006 -02326025 -0232b025 -15960160 -00000000 -04010003 -0232b825 -1000015c -00000000 -16f6015a -00000000 -3c048000 -04810006 -0253682a -0253b02a -15b60154 -00000000 -04010003 -0253b82a -10000150 -00000000 -16f6014e -00000000 -3c048000 -04810006 -2a4e8011 -2a568011 -15d60148 -00000000 -04010003 -2a578011 -10000144 -00000000 -16f60142 -00000000 -3c048000 -04810006 -2e4f8011 -2e568011 -15f6013c -00000000 -04010003 -2e578011 -10000138 -00000000 -16f60136 -00000000 -3c048000 -04810006 -0253c02b -0253b02b -17160130 -00000000 -04010003 -0253b82b -1000012c -00000000 -16f6012a -00000000 -3c048000 -04810006 -00124c40 -0012b440 -15360124 -00000000 -04010003 -0012bc40 -10000120 -00000000 -16f6011e -00000000 -3c048000 -04810006 -01105020 -0110b020 -15560118 -00000000 -04010003 -0110b820 -10000114 -00000000 -16f60112 -00000000 -3c048000 -04810006 -220b8002 -22168002 -1576010c -00000000 -04010003 -22178002 -10000108 -00000000 -16f60106 -00000000 -3c048000 -04810006 -01106022 -0110b022 -15960100 -00000000 -04010003 -0110b822 -100000fc -00000000 -16f600fa -00000000 -3c048000 -04810006 -01106823 -0110b023 -15b600f4 -00000000 -04010003 -0110b823 -100000f0 -00000000 -16f600ee -00000000 -3c048000 -04810006 -01107024 -0110b024 -15d600e8 -00000000 -04010003 -0110b824 -100000e4 -00000000 -16f600e2 -00000000 -3c048000 -04810006 -320f8ff2 -32168ff2 -15f600dc -00000000 -04010003 -32178ff2 -100000d8 -00000000 -16f600d6 -00000000 -3c048000 -04810006 -0110c027 -0110b027 -171600d0 -00000000 -04010003 -0110b827 -100000cc -00000000 -16f600ca -00000000 -3c048000 -04810006 -36098ff2 -36168ff2 -153600c4 -00000000 -04010003 -36178ff2 -100000c0 -00000000 -16f600be -00000000 -3c048000 -04810006 -01105026 -0110b026 -155600b8 -00000000 -04010003 -0110b826 -100000b4 -00000000 -16f600b2 -00000000 -3c048000 -04810006 -3a0b8ff2 -3a168ff2 -157600ac -00000000 -04010003 -3a178ff2 -100000a8 -00000000 -16f600a6 -00000000 -3c048000 -04810006 -02086004 -0208b004 -159600a0 -00000000 -04010003 -0208b804 -1000009c -00000000 -16f6009a -00000000 -3c048000 -04810006 -00106a03 -0010b203 -15b60094 -00000000 -04010003 -0010ba03 -10000090 -00000000 -16f6008e -00000000 -3c048000 -04810006 -02087007 -0208b007 -15d60088 -00000000 -04010003 -0208b807 -10000084 -00000000 -16f60082 -00000000 -3c048000 -04810006 -00107a02 -0010b202 -15f6007c -00000000 -04010003 -0010ba02 -10000078 -00000000 -16f60076 -00000000 -3c048000 -04810006 -0208c006 -0208b006 -17160070 -00000000 -04010003 -0208b806 -1000006c -00000000 -16f6006a -00000000 -3c088000 -34098000 -3c048000 -24020000 -24030000 -0481000a -0109001a -00001012 -00800013 -0109001a -0000b012 -1456005d -00000000 -00800013 -04010003 -0109001a -10000058 -00000000 -00001812 -14760055 -00000000 -3c048000 -24020000 -24030000 -0481000a -0109001b -00001012 -00800013 -0109001b -0000b012 -1456004a -00000000 -00800013 -04010003 -0109001b -10000045 -00000000 -00001812 -14760042 -00000000 -3c048000 -24020000 -24030000 -0481000a -01090018 -00001012 -00800013 -01090018 -0000b012 -14560037 -00000000 -00800013 -04010003 -01090018 -10000032 -00000000 -00001812 -1476002f -00000000 -3c048000 -24020000 -24030000 -0481000a -01090019 -00001012 -00800013 -01090019 -0000b012 -14560024 -00000000 -00800013 -04010003 -01090019 -1000001f -00000000 -00001812 -1476001c -00000000 -3c048000 -04810006 -00007810 -0000b010 -15f60016 -00000000 -04010003 -0000b810 -10000012 -00000000 -16f60010 -00000000 -3c048000 -04810006 -00007012 -0000b012 -15d6000a -00000000 -04010003 -0000b812 -10000006 -00000000 -16f60004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -24120000 -3c08d9d1 -350829b5 -24030001 -29020988 -144306d9 -00000000 -3c08bc13 -3508c90c -24030001 -2902a5e9 -144306d3 -00000000 -3c089c7c -35088fa6 -24030001 -29026db8 -144306cd -00000000 -3c08fa9c -35088750 -24030001 -290237fe -144306c7 -00000000 -3c085a57 -350823dc -24030000 -29025220 -144306c1 -00000000 -3c083bdd -3508b5bc -24030000 -29021444 -144306bb -00000000 -3c08f3dc -3508cb50 -24030001 -290233fb -144306b5 -00000000 -3c08db8e -35085d8c -24030001 -2902d516 -144306af -00000000 -3c081da0 -35088490 -24030000 -29024dfc -144306a9 -00000000 -3c088e7b -35081468 -24030001 -2902efa2 -144306a3 -00000000 -3c08aa24 -350875a4 -24030001 -29028422 -1443069d -00000000 -3c08aafd -35082bb9 -24030001 -29025940 -14430697 -00000000 -3c08f19c -3508cee8 -24030001 -2902ea93 -14430691 -00000000 -3c08ca73 -35085fec -24030001 -29029d80 -1443068b -00000000 -3c08c79b -35089e5b -24030001 -29029e28 -14430685 -00000000 -3c089e0a -35088c68 -24030001 -290273e6 -1443067f -00000000 -3c08d72d -350813b0 -24030001 -2902d2b7 -14430679 -00000000 -3c085d7c -3508a028 -24030000 -29027db1 -14430673 -00000000 -3c089bf7 -3508ee64 -24030001 -29022669 -1443066d -00000000 -3c080d42 -35087626 -24030000 -29020a20 -14430667 -00000000 -3c08032f -3508acb0 -24030000 -29022824 -14430661 -00000000 -3c08a4e2 -3508d4d0 -24030001 -2902971a -1443065b -00000000 -3c08e391 -350803b2 -24030001 -29029ee8 -14430655 -00000000 -3c08b9de -3508dbd8 -24030001 -29020ff6 -1443064f -00000000 -3c086ade -350805c0 -24030000 -29025342 -14430649 -00000000 -3c08f098 -350802fe -24030001 -29026848 -14430643 -00000000 -3c0869ae -35080890 -24030000 -29023c64 -1443063d -00000000 -3c089e94 -3508a558 -24030001 -29026346 -14430637 -00000000 -3c08466f -35082934 -24030000 -2902008c -14430631 -00000000 -3c080e10 -3508b5f4 -24030000 -2902b612 -1443062b -00000000 -3c083cbd -3508b4d8 -24030000 -2902ce48 -14430625 -00000000 -3c0848c1 -350839e4 -24030000 -290271fe -1443061f -00000000 -3c08f124 -350895c0 -24030001 -2902a276 -14430619 -00000000 -3c08ee77 -350879f8 -24030001 -29020846 -14430613 -00000000 -3c088251 -350871d4 -24030001 -290231aa -1443060d -00000000 -3c088693 -350819b9 -24030001 -2902df80 -14430607 -00000000 -3c083030 -35089ba0 -24030000 -2902a60f -14430601 -00000000 -3c08e038 -350883f0 -24030001 -2902f6e8 -144305fb -00000000 -3c08da55 -3508bac8 -24030001 -290295da -144305f5 -00000000 -3c08c6b8 -35087920 -24030001 -2902bc64 -144305ef -00000000 -3c0807ce -35083c21 -24030000 -2902c0d0 -144305e9 -00000000 -3c08aaf9 -35081929 -24030001 -29023e1c -144305e3 -00000000 -3c08f6fd -35081f6c -24030001 -29025ab3 -144305dd -00000000 -3c0823d6 -3508311c -24030000 -290240ab -144305d7 -00000000 -3c082f8f -3508cbc4 -24030000 -2902a280 -144305d1 -00000000 -3c08b363 -3508ac00 -24030001 -2902261e -144305cb -00000000 -3c08d900 -3508bca1 -24030001 -29020764 -144305c5 -00000000 -3c08286a -350822d8 -24030000 -29021cbf -144305bf -00000000 -3c084eb4 -35086b88 -24030000 -2902ce78 -144305b9 -00000000 -3c08c1c2 -350879a0 -24030001 -29029f30 -144305b3 -00000000 -3c08aa47 -3508d640 -24030001 -29022fea -144305ad -00000000 -3c082df2 -35081920 -24030000 -2902d1c6 -144305a7 -00000000 -3c0861aa -3508b5a0 -24030000 -2902c551 -144305a1 -00000000 -3c088961 -3508e1cc -24030001 -29024270 -1443059b -00000000 -3c089a57 -35085ae0 -24030001 -29028d5d -14430595 -00000000 -3c086267 -3508e6c3 -24030000 -29025e60 -1443058f -00000000 -3c084707 -3508aae0 -24030000 -29026813 -14430589 -00000000 -3c08df33 -35088b11 -24030001 -2902cc14 -14430583 -00000000 -3c0874a3 -350803d0 -24030000 -29022e3f -1443057d -00000000 -3c089657 -3508c972 -24030001 -2902436e -14430577 -00000000 -3c0828fe -3508c0a0 -24030000 -2902b2b8 -14430571 -00000000 -3c08656d -350861a8 -24030000 -290246cc -1443056b -00000000 -3c08c2ff -35081fac -24030001 -2902ac10 -14430565 -00000000 -3c0899d8 -3508263c -24030001 -2902fced -1443055f -00000000 -3c082689 -350845ee -24030000 -2902fea4 -14430559 -00000000 -3c085d12 -35085cfa -24030000 -2902d3d8 -14430553 -00000000 -3c08945f -3508eee4 -24030001 -2902cc69 -1443054d -00000000 -3c08a125 -3508469a -24030001 -2902cb56 -14430547 -00000000 -3c085b95 -350804bd -24030000 -29025fc0 -14430541 -00000000 -3c088bcf -3508f665 -24030001 -29020581 -1443053b -00000000 -3c0854ce -35081638 -24030000 -29029554 -14430535 -00000000 -3c08d379 -35088b40 -24030001 -2902eb88 -1443052f -00000000 -3c0865bf -35083f80 -24030000 -29024b00 -14430529 -00000000 -3c087d70 -35081d1c -24030000 -29029914 -14430523 -00000000 -3c082db1 -3508f790 -24030000 -29027714 -1443051d -00000000 -3c087b1c -3508d680 -24030000 -29028140 -14430517 -00000000 -3c08e8dd -3508eba8 -24030001 -2902b670 -14430511 -00000000 -3c08fca7 -35083e0c -24030001 -2902dd77 -1443050b -00000000 -3c0888de -35085aca -24030001 -2902948c -14430505 -00000000 -3c083997 -3508a398 -24030000 -2902eafe -144304ff -00000000 -3c08d38a -3508055e -24030001 -290233bd -144304f9 -00000000 -3c082758 -3508c952 -24030000 -29022af0 -144304f3 -00000000 -3c086669 -3508f950 -24030000 -2902ee01 -144304ed -00000000 -3c08ecf1 -3508f250 -24030001 -29027b70 -144304e7 -00000000 -3c08c583 -350846ba -24030001 -29028e9e -144304e1 -00000000 -3c080a39 -350853d5 -24030000 -29026808 -144304db -00000000 -3c08dcbf -350875c0 -24030001 -29020376 -144304d5 -00000000 -3c089379 -350889cc -24030001 -2902bf74 -144304cf -00000000 -3c08bcf1 -3508d9f8 -24030001 -29021bad -144304c9 -00000000 -3c083249 -35084814 -24030000 -2902573d -144304c3 -00000000 -3c088597 -3508e19d -24030001 -29020c17 -144304bd -00000000 -3c08883c -35080c54 -24030001 -29021848 -144304b7 -00000000 -3c08b8d3 -3508b526 -24030001 -2902f036 -144304b1 -00000000 -3c08cbc4 -3508663a -24030001 -29021cfe -144304ab -00000000 -3c084426 -350828e4 -24030000 -29022076 -144304a5 -00000000 -3c08f53e -35088868 -24030001 -290285e6 -1443049f -00000000 -3c088348 -3508eb10 -24030001 -2902d500 -14430499 -00000000 -3c08448b -350860e0 -24030000 -29023e51 -14430493 -00000000 -3c08b3e1 -350852a2 -24030001 -2902670d -1443048d -00000000 -3c08180c -3508cff0 -24030000 -2902d60d -14430487 -00000000 -3c083f22 -3508cb44 -24030000 -2902d1d2 -14430481 -00000000 -3c08703f -35088a72 -24030000 -29024948 -1443047b -00000000 -3c08df85 -3508d006 -24030001 -290276f1 -14430475 -00000000 -3c089407 -3508fc00 -24030001 -2902280c -1443046f -00000000 -3c08b4e2 -3508a5bc -24030001 -2902c84b -14430469 -00000000 -3c08a02c -35081aa2 -24030001 -29029ecb -14430463 -00000000 -3c083e83 -3508b8a0 -24030000 -290223e6 -1443045d -00000000 -3c08c64e -3508ae40 -24030001 -29028c1c -14430457 -00000000 -3c08fb0f -3508c32c -24030001 -2902026f -14430451 -00000000 -3c08b8d3 -35083566 -24030001 -29026810 -1443044b -00000000 -3c080c93 -35088a60 -24030000 -29028e8b -14430445 -00000000 -3c0837bf -350806a0 -24030000 -29029fc8 -1443043f -00000000 -3c08f78c -3508b180 -24030001 -29026bb8 -14430439 -00000000 -3c081349 -35082c46 -24030000 -2902de4e -14430433 -00000000 -3c08c7ce -35088857 -24030001 -29021efa -1443042d -00000000 -3c086ba7 -35086bc0 -24030000 -290236e0 -14430427 -00000000 -3c080de3 -3508c024 -24030000 -29022d60 -14430421 -00000000 -3c089e3f -3508ddce -24030001 -29029154 -1443041b -00000000 -3c08440c -3508ac96 -24030000 -290241a4 -14430415 -00000000 -3c08d4c8 -3508a1c8 -24030001 -290245f4 -1443040f -00000000 -3c08351f -35080854 -24030000 -29027d08 -14430409 -00000000 -3c08de09 -3508743c -24030001 -2902b30e -14430403 -00000000 -3c0885c7 -3508db36 -24030001 -2902028e -144303fd -00000000 -3c08018d -35088b10 -24030000 -2902a290 -144303f7 -00000000 -3c084f8a -3508bf20 -24030000 -2902a312 -144303f1 -00000000 -3c08e83d -3508342a -24030001 -2902e3bf -144303eb -00000000 -3c0847d3 -3508b94a -24030000 -2902a6c4 -144303e5 -00000000 -3c085351 -35084a00 -24030000 -2902a7e2 -144303df -00000000 -3c08313f -35085220 -24030000 -29025c48 -144303d9 -00000000 -3c084b78 -3508c354 -24030000 -290298ca -144303d3 -00000000 -3c08ed35 -3508c6c9 -24030001 -2902a9f4 -144303cd -00000000 -3c082a50 -35086368 -24030000 -290231a6 -144303c7 -00000000 -3c0838f4 -35087f2c -24030000 -29024f04 -144303c1 -00000000 -3c08973b -35082c38 -24030001 -2902d5ac -144303bb -00000000 -3c085b2b -35085b16 -24030000 -29020a03 -144303b5 -00000000 -3c08a146 -35086aef -24030001 -2902e1aa -144303af -00000000 -3c08ff3a -3508d1e6 -24030001 -2902f3fc -144303a9 -00000000 -3c08cf3b -35084e50 -24030001 -2902df30 -144303a3 -00000000 -3c084f6a -3508fec0 -24030000 -2902f65a -1443039d -00000000 -3c087680 -35087780 -24030000 -2902dbb0 -14430397 -00000000 -3c08c2bc -350812c0 -24030001 -2902ea9c -14430391 -00000000 -3c08a670 -3508369c -24030001 -2902a66d -1443038b -00000000 -3c086e70 -35081f70 -24030000 -2902d650 -14430385 -00000000 -3c089e66 -35089bc0 -24030001 -2902ca20 -1443037f -00000000 -3c08b88e -35085a50 -24030001 -290283dd -14430379 -00000000 -3c089d8a -35085458 -24030001 -29028ebc -14430373 -00000000 -3c08b376 -3508373e -24030001 -29020178 -1443036d -00000000 -3c080c5c -35089db3 -24030000 -2902b61b -14430367 -00000000 -3c089b79 -3508a3d8 -24030001 -29026060 -14430361 -00000000 -3c08e5cb -350814c8 -24030001 -2902990c -1443035b -00000000 -3c08c5ff -3508c83c -24030001 -29021f05 -14430355 -00000000 -3c08b321 -3508a45f -24030001 -290257b2 -1443034f -00000000 -3c08be9a -3508cec8 -24030001 -29025266 -14430349 -00000000 -3c0885b6 -3508bec0 -24030001 -29021280 -14430343 -00000000 -3c081040 -350887d8 -24030000 -2902b8cd -1443033d -00000000 -3c0847d5 -3508f3d4 -24030000 -29025dda -14430337 -00000000 -3c08e71c -3508d5f0 -24030001 -2902a4a6 -14430331 -00000000 -3c081e0f -35088f82 -24030000 -29029784 -1443032b -00000000 -3c081026 -3508a9de -24030000 -290254c4 -14430325 -00000000 -3c081c3f -3508e1ee -24030000 -290245ae -1443031f -00000000 -3c08fcab -3508c854 -24030001 -2902e965 -14430319 -00000000 -3c0868b3 -35084bf0 -24030000 -29023284 -14430313 -00000000 -3c087bba -3508498e -24030000 -2902cf2d -1443030d -00000000 -3c08c7df -3508176e -24030001 -2902607a -14430307 -00000000 -3c088674 -35087248 -24030001 -29027d1f -14430301 -00000000 -3c08d549 -350842c0 -24030001 -2902101b -144302fb -00000000 -3c089915 -350854c4 -24030001 -2902baad -144302f5 -00000000 -3c08907f -35087dc0 -24030001 -2902cab4 -144302ef -00000000 -3c08a97e -350843ec -24030001 -29022780 -144302e9 -00000000 -3c0877ad -3508839e -24030000 -29024b1e -144302e3 -00000000 -3c081862 -35086458 -24030000 -2902c2cc -144302dd -00000000 -3c0851fe -350855f0 -24030000 -29027a55 -144302d7 -00000000 -3c08f9b5 -3508d7c1 -24030001 -290291e8 -144302d1 -00000000 -3c08c3dc -3508f7f1 -24030001 -2902a10e -144302cb -00000000 -3c088a2b -35082010 -24030001 -2902b0ba -144302c5 -00000000 -3c087b29 -3508e272 -24030000 -2902c46e -144302bf -00000000 -3c08b2b2 -35080a1c -24030001 -29026910 -144302b9 -00000000 -3c089b04 -350825c0 -24030001 -29026100 -144302b3 -00000000 -3c08a8a4 -3508fecb -24030001 -2902982b -144302ad -00000000 -3c0813d5 -3508fe08 -24030000 -2902bde4 -144302a7 -00000000 -3c081213 -3508f626 -24030000 -2902f19c -144302a1 -00000000 -3c08bc4d -3508c5ce -24030001 -2902a190 -1443029b -00000000 -3c080e2c -35087a84 -24030000 -29022250 -14430295 -00000000 -3c088731 -35088000 -24030001 -2902b048 -1443028f -00000000 -3c084f63 -350853e3 -24030000 -2902af0a -14430289 -00000000 -3c08f316 -35082eb4 -24030001 -290287b4 -14430283 -00000000 -3c08f73c -35089f5c -24030001 -2902bd2f -1443027d -00000000 -3c080f83 -3508a1e6 -24030000 -29029382 -14430277 -00000000 -3c08b575 -3508b172 -24030001 -29026d26 -14430271 -00000000 -3c085567 -35083b4f -24030000 -2902f681 -1443026b -00000000 -3c0845c3 -35082ed4 -24030000 -2902136a -14430265 -00000000 -3c08f98e -3508d1fc -24030001 -29024f84 -1443025f -00000000 -3c0800fa -35085c08 -24030000 -29028d8c -14430259 -00000000 -3c0852e2 -35088a84 -24030000 -2902de58 -14430253 -00000000 -3c08efaa -3508cac8 -24030001 -2902e867 -1443024d -00000000 -3c08c275 -350892b8 -24030001 -2902b6c4 -14430247 -00000000 -3c084522 -35085370 -24030000 -2902f1b3 -14430241 -00000000 -3c080e41 -35083b53 -24030000 -2902a0f5 -1443023b -00000000 -3c081b19 -3508286c -24030000 -29023b8d -14430235 -00000000 -3c0827e8 -3508e268 -24030000 -2902e1e0 -1443022f -00000000 -3c083792 -35086548 -24030000 -29020000 -14430229 -00000000 -3c089a74 -3508b580 -24030001 -29020000 -14430223 -00000000 -3c08b4a7 -3508def0 -24030001 -29020000 -1443021d -00000000 -3c086bb7 -3508ee0d -24030000 -29020000 -14430217 -00000000 -3c08d608 -3508b460 -24030001 -29020000 -14430211 -00000000 -3c08d25d -35086422 -24030001 -29020000 -1443020b -00000000 -3c08226a -3508f9c0 -24030000 -29020000 -14430205 -00000000 -3c086899 -35087bdd -24030000 -29020000 -144301ff -00000000 -3c086bc2 -3508f560 -24030000 -29020000 -144301f9 -00000000 -3c083e9f -3508e5a2 -24030000 -29020000 -144301f3 -00000000 -3c08cd97 -3508048e -24030001 -29020000 -144301ed -00000000 -3c081108 -3508b6d4 -24030000 -29020000 -144301e7 -00000000 -3c081629 -35083334 -24030000 -29020000 -144301e1 -00000000 -3c088640 -35087bb0 -24030001 -29020000 -144301db -00000000 -3c088d34 -3508a030 -24030001 -29020000 -144301d5 -00000000 -3c084162 -3508f981 -24030000 -29020000 -144301cf -00000000 -3c0858a6 -35089718 -24030000 -29020000 -144301c9 -00000000 -3c08d522 -3508770a -24030001 -29020000 -144301c3 -00000000 -3c081221 -3508adca -24030000 -29020000 -144301bd -00000000 -3c085a15 -35089dc3 -24030000 -29020000 -144301b7 -00000000 -3c08e550 -35085b24 -24030001 -29020000 -144301b1 -00000000 -3c08da7b -35081d60 -24030001 -29020000 -144301ab -00000000 -3c08af2d -35081540 -24030001 -29020000 -144301a5 -00000000 -3c087945 -3508204a -24030000 -29020000 -1443019f -00000000 -3c087fb9 -350869a0 -24030000 -29020000 -14430199 -00000000 -3c088d7d -3508d358 -24030001 -29020000 -14430193 -00000000 -3c08f2b2 -35083a40 -24030001 -29020000 -1443018d -00000000 -3c0858f0 -3508f6e0 -24030000 -29020000 -14430187 -00000000 -3c0869b6 -35083e31 -24030000 -29020000 -14430181 -00000000 -3c08c919 -3508d37c -24030001 -29020000 -1443017b -00000000 -3c08a4a9 -3508dcb5 -24030001 -29020000 -14430175 -00000000 -3c087d8b -3508a484 -24030000 -29020000 -1443016f -00000000 -3c088418 -35084007 -24030001 -29020000 -14430169 -00000000 -3c084b29 -3508d000 -24030000 -29020000 -14430163 -00000000 -3c08c74c -3508d6ea -24030001 -29020000 -1443015d -00000000 -3c08ff0a -35084d60 -24030001 -29020000 -14430157 -00000000 -3c082efa -3508ab54 -24030000 -29020000 -14430151 -00000000 -3c0865d6 -3508057a -24030000 -29020000 -1443014b -00000000 -3c084a39 -35081008 -24030000 -29020000 -14430145 -00000000 -3c0858ca -350824f4 -24030000 -29020000 -1443013f -00000000 -3c0808fc -3508c510 -24030000 -29020000 -14430139 -00000000 -3c084111 -3508c2d0 -24030000 -29020000 -14430133 -00000000 -3c080558 -3508e878 -24030000 -29020000 -1443012d -00000000 -3c082f54 -3508e72c -24030000 -29020000 -14430127 -00000000 -3c08ec4a -35081ea0 -24030001 -29020000 -14430121 -00000000 -3c08e2a6 -35084e16 -24030001 -29020000 -1443011b -00000000 -3c081973 -3508d690 -24030000 -29020000 -14430115 -00000000 -3c08d42c -350843d0 -24030001 -29020000 -1443010f -00000000 -3c08fb04 -3508a4f0 -24030001 -29020000 -14430109 -00000000 -3c08ba63 -3508960c -24030001 -29020000 -14430103 -00000000 -24080000 -24030001 -29027ef6 -144300fe -00000000 -24080000 -24030001 -2902338c -144300f9 -00000000 -24080000 -24030000 -2902cac4 -144300f4 -00000000 -24080000 -24030001 -2902016d -144300ef -00000000 -24080000 -24030000 -2902a2c8 -144300ea -00000000 -24080000 -24030001 -29024c72 -144300e5 -00000000 -24080000 -24030000 -2902e24e -144300e0 -00000000 -24080000 -24030000 -2902a614 -144300db -00000000 -24080000 -24030000 -2902f51a -144300d6 -00000000 -24080000 -24030000 -29029130 -144300d1 -00000000 -24080000 -24030001 -2902249a -144300cc -00000000 -24080000 -24030001 -29021a7c -144300c7 -00000000 -24080000 -24030001 -29026a84 -144300c2 -00000000 -24080000 -24030000 -2902c02c -144300bd -00000000 -24080000 -24030000 -2902b71e -144300b8 -00000000 -24080000 -24030001 -29026489 -144300b3 -00000000 -24080000 -24030000 -2902e115 -144300ae -00000000 -24080000 -24030001 -29025fb3 -144300a9 -00000000 -24080000 -24030000 -2902e7f4 -144300a4 -00000000 -24080000 -24030000 -2902fcf5 -1443009f -00000000 -24080000 -24030000 -2902ded0 -1443009a -00000000 -24080000 -24030001 -2902460c -14430095 -00000000 -24080000 -24030001 -29020a44 -14430090 -00000000 -24080000 -24030001 -290211b8 -1443008b -00000000 -24080000 -24030000 -2902cfa7 -14430086 -00000000 -24080000 -24030000 -2902afbb -14430081 -00000000 -24080000 -24030001 -29023481 -1443007c -00000000 -24080000 -24030001 -29022bc8 -14430077 -00000000 -24080000 -24030001 -29024978 -14430072 -00000000 -24080000 -24030000 -2902a3c0 -1443006d -00000000 -24080000 -24030001 -29020066 -14430068 -00000000 -24080000 -24030000 -29029b0c -14430063 -00000000 -24080000 -24030000 -290283d8 -1443005e -00000000 -24080000 -24030001 -29024307 -14430059 -00000000 -24080000 -24030001 -29022ecd -14430054 -00000000 -24080000 -24030000 -2902cde2 -1443004f -00000000 -24080000 -24030001 -29023282 -1443004a -00000000 -24080000 -24030000 -2902c58d -14430045 -00000000 -24080000 -24030000 -2902c056 -14430040 -00000000 -24080000 -24030001 -29025e50 -1443003b -00000000 -24080000 -24030001 -29021f0d -14430036 -00000000 -24080000 -24030001 -29027f00 -14430031 -00000000 -24080000 -24030001 -290202d0 -1443002c -00000000 -24080000 -24030000 -2902ccea -14430027 -00000000 -24080000 -24030001 -29023cc9 -14430022 -00000000 -24080000 -24030001 -29023570 -1443001d -00000000 -24080000 -24030000 -29028550 -14430018 -00000000 -24080000 -24030000 -29029a91 -14430013 -00000000 -24080000 -24030000 -29028096 -1443000e -00000000 -24080000 -24030000 -2902a394 -14430009 -00000000 -24080000 -24030000 -29020000 -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -00000000 -26100001 -24120000 -3c0a0001 -24090000 -3c040000 -3c080000 -00892021 -012a4821 -15040489 -00000000 -3c040000 -3c080001 -00892021 -012a4821 -15040483 -00000000 -3c040000 -3c080002 -00892021 -012a4821 -1504047d -00000000 -3c040000 -3c080003 -00892021 -012a4821 -15040477 -00000000 -3c040000 -3c080004 -00892021 -012a4821 -15040471 -00000000 -3c040000 -3c080005 -00892021 -012a4821 -1504046b -00000000 -3c040000 -3c080006 -00892021 -012a4821 -15040465 -00000000 -3c040000 -3c080007 -00892021 -012a4821 -1504045f -00000000 -3c040000 -3c080008 -00892021 -012a4821 -15040459 -00000000 -3c040000 -3c080009 -00892021 -012a4821 -15040453 -00000000 -3c040000 -3c08000a -00892021 -012a4821 -1504044d -00000000 -3c040000 -3c08000b -00892021 -012a4821 -15040447 -00000000 -3c040000 -3c08000c -00892021 -012a4821 -15040441 -00000000 -3c040000 -3c08000d -00892021 -012a4821 -1504043b -00000000 -3c040000 -3c08000e -00892021 -012a4821 -15040435 -00000000 -3c040000 -3c08000f -00892021 -012a4821 -1504042f -00000000 -24090000 -3c041010 -3c081010 -00892021 -012a4821 -15040428 -00000000 -3c041010 -3c081011 -00892021 -012a4821 -15040422 -00000000 -3c041010 -3c081012 -00892021 -012a4821 -1504041c -00000000 -3c041010 -3c081013 -00892021 -012a4821 -15040416 -00000000 -3c041010 -3c081014 -00892021 -012a4821 -15040410 -00000000 -3c041010 -3c081015 -00892021 -012a4821 -1504040a -00000000 -3c041010 -3c081016 -00892021 -012a4821 -15040404 -00000000 -3c041010 -3c081017 -00892021 -012a4821 -150403fe -00000000 -3c041010 -3c081018 -00892021 -012a4821 -150403f8 -00000000 -3c041010 -3c081019 -00892021 -012a4821 -150403f2 -00000000 -3c041010 -3c08101a -00892021 -012a4821 -150403ec -00000000 -3c041010 -3c08101b -00892021 -012a4821 -150403e6 -00000000 -3c041010 -3c08101c -00892021 -012a4821 -150403e0 -00000000 -3c041010 -3c08101d -00892021 -012a4821 -150403da -00000000 -3c041010 -3c08101e -00892021 -012a4821 -150403d4 -00000000 -3c041010 -3c08101f -00892021 -012a4821 -150403ce -00000000 -24090000 -3c042020 -3c082020 -00892021 -012a4821 -150403c7 -00000000 -3c042020 -3c082021 -00892021 -012a4821 -150403c1 -00000000 -3c042020 -3c082022 -00892021 -012a4821 -150403bb -00000000 -3c042020 -3c082023 -00892021 -012a4821 -150403b5 -00000000 -3c042020 -3c082024 -00892021 -012a4821 -150403af -00000000 -3c042020 -3c082025 -00892021 -012a4821 -150403a9 -00000000 -3c042020 -3c082026 -00892021 -012a4821 -150403a3 -00000000 -3c042020 -3c082027 -00892021 -012a4821 -1504039d -00000000 -3c042020 -3c082028 -00892021 -012a4821 -15040397 -00000000 -3c042020 -3c082029 -00892021 -012a4821 -15040391 -00000000 -3c042020 -3c08202a -00892021 -012a4821 -1504038b -00000000 -3c042020 -3c08202b -00892021 -012a4821 -15040385 -00000000 -3c042020 -3c08202c -00892021 -012a4821 -1504037f -00000000 -3c042020 -3c08202d -00892021 -012a4821 -15040379 -00000000 -3c042020 -3c08202e -00892021 -012a4821 -15040373 -00000000 -3c042020 -3c08202f -00892021 -012a4821 -1504036d -00000000 -24090000 -3c043030 -3c083030 -00892021 -012a4821 -15040366 -00000000 -3c043030 -3c083031 -00892021 -012a4821 -15040360 -00000000 -3c043030 -3c083032 -00892021 -012a4821 -1504035a -00000000 -3c043030 -3c083033 -00892021 -012a4821 -15040354 -00000000 -3c043030 -3c083034 -00892021 -012a4821 -1504034e -00000000 -3c043030 -3c083035 -00892021 -012a4821 -15040348 -00000000 -3c043030 -3c083036 -00892021 -012a4821 -15040342 -00000000 -3c043030 -3c083037 -00892021 -012a4821 -1504033c -00000000 -3c043030 -3c083038 -00892021 -012a4821 -15040336 -00000000 -3c043030 -3c083039 -00892021 -012a4821 -15040330 -00000000 -3c043030 -3c08303a -00892021 -012a4821 -1504032a -00000000 -3c043030 -3c08303b -00892021 -012a4821 -15040324 -00000000 -3c043030 -3c08303c -00892021 -012a4821 -1504031e -00000000 -3c043030 -3c08303d -00892021 -012a4821 -15040318 -00000000 -3c043030 -3c08303e -00892021 -012a4821 -15040312 -00000000 -3c043030 -3c08303f -00892021 -012a4821 -1504030c -00000000 -24090000 -3c044040 -3c084040 -00892021 -012a4821 -15040305 -00000000 -3c044040 -3c084041 -00892021 -012a4821 -150402ff -00000000 -3c044040 -3c084042 -00892021 -012a4821 -150402f9 -00000000 -3c044040 -3c084043 -00892021 -012a4821 -150402f3 -00000000 -3c044040 -3c084044 -00892021 -012a4821 -150402ed -00000000 -3c044040 -3c084045 -00892021 -012a4821 -150402e7 -00000000 -3c044040 -3c084046 -00892021 -012a4821 -150402e1 -00000000 -3c044040 -3c084047 -00892021 -012a4821 -150402db -00000000 -3c044040 -3c084048 -00892021 -012a4821 -150402d5 -00000000 -3c044040 -3c084049 -00892021 -012a4821 -150402cf -00000000 -3c044040 -3c08404a -00892021 -012a4821 -150402c9 -00000000 -3c044040 -3c08404b -00892021 -012a4821 -150402c3 -00000000 -3c044040 -3c08404c -00892021 -012a4821 -150402bd -00000000 -3c044040 -3c08404d -00892021 -012a4821 -150402b7 -00000000 -3c044040 -3c08404e -00892021 -012a4821 -150402b1 -00000000 -3c044040 -3c08404f -00892021 -012a4821 -150402ab -00000000 -24090000 -3c045040 -3c085040 -00892021 -012a4821 -150402a4 -00000000 -3c045040 -3c085041 -00892021 -012a4821 -1504029e -00000000 -3c045040 -3c085042 -00892021 -012a4821 -15040298 -00000000 -3c045040 -3c085043 -00892021 -012a4821 -15040292 -00000000 -3c045040 -3c085044 -00892021 -012a4821 -1504028c -00000000 -3c045040 -3c085045 -00892021 -012a4821 -15040286 -00000000 -3c045040 -3c085046 -00892021 -012a4821 -15040280 -00000000 -3c045040 -3c085047 -00892021 -012a4821 -1504027a -00000000 -3c045040 -3c085048 -00892021 -012a4821 -15040274 -00000000 -3c045040 -3c085049 -00892021 -012a4821 -1504026e -00000000 -3c045040 -3c08504a -00892021 -012a4821 -15040268 -00000000 -3c045040 -3c08504b -00892021 -012a4821 -15040262 -00000000 -3c045040 -3c08504c -00892021 -012a4821 -1504025c -00000000 -3c045040 -3c08504d -00892021 -012a4821 -15040256 -00000000 -3c045040 -3c08504e -00892021 -012a4821 -15040250 -00000000 -3c045040 -3c08504f -00892021 -012a4821 -1504024a -00000000 -24090000 -3c046050 -3c086050 -00892021 -012a4821 -15040243 -00000000 -3c046050 -3c086051 -00892021 -012a4821 -1504023d -00000000 -3c046050 -3c086052 -00892021 -012a4821 -15040237 -00000000 -3c046050 -3c086053 -00892021 -012a4821 -15040231 -00000000 -3c046050 -3c086054 -00892021 -012a4821 -1504022b -00000000 -3c046050 -3c086055 -00892021 -012a4821 -15040225 -00000000 -3c046050 -3c086056 -00892021 -012a4821 -1504021f -00000000 -3c046050 -3c086057 -00892021 -012a4821 -15040219 -00000000 -3c046050 -3c086058 -00892021 -012a4821 -15040213 -00000000 -3c046050 -3c086059 -00892021 -012a4821 -1504020d -00000000 -3c046050 -3c08605a -00892021 -012a4821 -15040207 -00000000 -3c046050 -3c08605b -00892021 -012a4821 -15040201 -00000000 -3c046050 -3c08605c -00892021 -012a4821 -150401fb -00000000 -3c046050 -3c08605d -00892021 -012a4821 -150401f5 -00000000 -3c046050 -3c08605e -00892021 -012a4821 -150401ef -00000000 -3c046050 -3c08605f -00892021 -012a4821 -150401e9 -00000000 -24090000 -3c048060 -3c088060 -00892021 -012a4821 -150401e2 -00000000 -3c048060 -3c088061 -00892021 -012a4821 -150401dc -00000000 -3c048060 -3c088062 -00892021 -012a4821 -150401d6 -00000000 -3c048060 -3c088063 -00892021 -012a4821 -150401d0 -00000000 -3c048060 -3c088064 -00892021 -012a4821 -150401ca -00000000 -3c048060 -3c088065 -00892021 -012a4821 -150401c4 -00000000 -3c048060 -3c088066 -00892021 -012a4821 -150401be -00000000 -3c048060 -3c088067 -00892021 -012a4821 -150401b8 -00000000 -3c048060 -3c088068 -00892021 -012a4821 -150401b2 -00000000 -3c048060 -3c088069 -00892021 -012a4821 -150401ac -00000000 -3c048060 -3c08806a -00892021 -012a4821 -150401a6 -00000000 -3c048060 -3c08806b -00892021 -012a4821 -150401a0 -00000000 -3c048060 -3c08806c -00892021 -012a4821 -1504019a -00000000 -3c048060 -3c08806d -00892021 -012a4821 -15040194 -00000000 -3c048060 -3c08806e -00892021 -012a4821 -1504018e -00000000 -3c048060 -3c08806f -00892021 -012a4821 -15040188 -00000000 -24090000 -3c04a070 -3c08a070 -00892021 -012a4821 -15040181 -00000000 -3c04a070 -3c08a071 -00892021 -012a4821 -1504017b -00000000 -3c04a070 -3c08a072 -00892021 -012a4821 -15040175 -00000000 -3c04a070 -3c08a073 -00892021 -012a4821 -1504016f -00000000 -3c04a070 -3c08a074 -00892021 -012a4821 -15040169 -00000000 -3c04a070 -3c08a075 -00892021 -012a4821 -15040163 -00000000 -3c04a070 -3c08a076 -00892021 -012a4821 -1504015d -00000000 -3c04a070 -3c08a077 -00892021 -012a4821 -15040157 -00000000 -3c04a070 -3c08a078 -00892021 -012a4821 -15040151 -00000000 -3c04a070 -3c08a079 -00892021 -012a4821 -1504014b -00000000 -3c04a070 -3c08a07a -00892021 -012a4821 -15040145 -00000000 -3c04a070 -3c08a07b -00892021 -012a4821 -1504013f -00000000 -3c04a070 -3c08a07c -00892021 -012a4821 -15040139 -00000000 -3c04a070 -3c08a07d -00892021 -012a4821 -15040133 -00000000 -3c04a070 -3c08a07e -00892021 -012a4821 -1504012d -00000000 -3c04a070 -3c08a07f -00892021 -012a4821 -15040127 -00000000 -24090000 -3c04c080 -3c08c080 -00892021 -012a4821 -15040120 -00000000 -3c04c080 -3c08c081 -00892021 -012a4821 -1504011a -00000000 -3c04c080 -3c08c082 -00892021 -012a4821 -15040114 -00000000 -3c04c080 -3c08c083 -00892021 -012a4821 -1504010e -00000000 -3c04c080 -3c08c084 -00892021 -012a4821 -15040108 -00000000 -3c04c080 -3c08c085 -00892021 -012a4821 -15040102 -00000000 -3c04c080 -3c08c086 -00892021 -012a4821 -150400fc -00000000 -3c04c080 -3c08c087 -00892021 -012a4821 -150400f6 -00000000 -3c04c080 -3c08c088 -00892021 -012a4821 -150400f0 -00000000 -3c04c080 -3c08c089 -00892021 -012a4821 -150400ea -00000000 -3c04c080 -3c08c08a -00892021 -012a4821 -150400e4 -00000000 -3c04c080 -3c08c08b -00892021 -012a4821 -150400de -00000000 -3c04c080 -3c08c08c -00892021 -012a4821 -150400d8 -00000000 -3c04c080 -3c08c08d -00892021 -012a4821 -150400d2 -00000000 -3c04c080 -3c08c08e -00892021 -012a4821 -150400cc -00000000 -3c04c080 -3c08c08f -00892021 -012a4821 -150400c6 -00000000 -24090000 -3c04e090 -3c08e090 -00892021 -012a4821 -150400bf -00000000 -3c04e090 -3c08e091 -00892021 -012a4821 -150400b9 -00000000 -3c04e090 -3c08e092 -00892021 -012a4821 -150400b3 -00000000 -3c04e090 -3c08e093 -00892021 -012a4821 -150400ad -00000000 -3c04e090 -3c08e094 -00892021 -012a4821 -150400a7 -00000000 -3c04e090 -3c08e095 -00892021 -012a4821 -150400a1 -00000000 -3c04e090 -3c08e096 -00892021 -012a4821 -1504009b -00000000 -3c04e090 -3c08e097 -00892021 -012a4821 -15040095 -00000000 -3c04e090 -3c08e098 -00892021 -012a4821 -1504008f -00000000 -3c04e090 -3c08e099 -00892021 -012a4821 -15040089 -00000000 -3c04e090 -3c08e09a -00892021 -012a4821 -15040083 -00000000 -3c04e090 -3c08e09b -00892021 -012a4821 -1504007d -00000000 -3c04e090 -3c08e09c -00892021 -012a4821 -15040077 -00000000 -3c04e090 -3c08e09d -00892021 -012a4821 -15040071 -00000000 -3c04e090 -3c08e09e -00892021 -012a4821 -1504006b -00000000 -3c04e090 -3c08e09f -00892021 -012a4821 -15040065 -00000000 -24090000 -3c04f0a0 -3c08f0a0 -00892021 -012a4821 -1504005e -00000000 -3c04f0a0 -3c08f0a1 -00892021 -012a4821 -15040058 -00000000 -3c04f0a0 -3c08f0a2 -00892021 -012a4821 -15040052 -00000000 -3c04f0a0 -3c08f0a3 -00892021 -012a4821 -1504004c -00000000 -3c04f0a0 -3c08f0a4 -00892021 -012a4821 -15040046 -00000000 -3c04f0a0 -3c08f0a5 -00892021 -012a4821 -15040040 -00000000 -3c04f0a0 -3c08f0a6 -00892021 -012a4821 -1504003a -00000000 -3c04f0a0 -3c08f0a7 -00892021 -012a4821 -15040034 -00000000 -3c04f0a0 -3c08f0a8 -00892021 -012a4821 -1504002e -00000000 -3c04f0a0 -3c08f0a9 -00892021 -012a4821 -15040028 -00000000 -3c04f0a0 -3c08f0aa -00892021 -012a4821 -15040022 -00000000 -3c04f0a0 -3c08f0ab -00892021 -012a4821 -1504001c -00000000 -3c04f0a0 -3c08f0ac -00892021 -012a4821 -15040016 -00000000 -3c04f0a0 -3c08f0ad -00892021 -012a4821 -15040010 -00000000 -3c04f0a0 -3c08f0ae -00892021 -012a4821 -1504000a -00000000 -3c04f0a0 -3c08f0af -00892021 -012a4821 -15040004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -26100001 -24120000 -3c088e8f -3508fce0 -3c0323a3 -3463ff38 -00081082 -14430767 -00000000 -3c084929 -35081230 -34039252 -000813c2 -14430761 -00000000 -3c0825da -350868a0 -3c03025d -3463a68a -00081102 -1443075a -00000000 -3c08ecac -3508f656 -3c030003 -3463b2b3 -00081382 -14430753 -00000000 -3c08e7bf -3508c848 -24030001 -000817c2 -1443074d -00000000 -3c080011 -35085809 -24030000 -000817c2 -14430747 -00000000 -3c087a88 -35086604 -2403003d -00081642 -14430741 -00000000 -3c087fe7 -3508a7de -3403ffcf -000813c2 -1443073b -00000000 -3c0876c2 -35089838 -3c0303b6 -346314c1 -00081142 -14430734 -00000000 -3c08a93f -35085944 -2403549f -00081442 -1443072e -00000000 -3c085ec1 -3508c900 -24030000 -000817c2 -14430728 -00000000 -3c086098 -3508e740 -3c030182 -3463639d -00081182 -14430721 -00000000 -3c089181 -35086b68 -24030048 -00081642 -1443071b -00000000 -3c089bca -35083384 -24031379 -000814c2 -14430715 -00000000 -3c08c389 -35085628 -3c030003 -34630e25 -00081382 -1443070e -00000000 -3c088fe9 -35089e00 -3c0311fd -346333c0 -000810c2 -14430707 -00000000 -3c08cae3 -35088c68 -3c030001 -346395c7 -000813c2 -14430700 -00000000 -3c08e2c8 -350828e8 -3c03001c -34635905 -000812c2 -144306f9 -00000000 -3c084b95 -3508ed24 -3c0304b9 -34635ed2 -00081102 -144306f2 -00000000 -3c083047 -3508310f -3c030001 -34638239 -00081342 -144306eb -00000000 -3c086ef2 -35086b90 -3c036ef2 -34636b90 -00081002 -144306e4 -00000000 -3c0815f0 -3508f288 -3c030005 -34637c3c -00081282 -144306dd -00000000 -3c082c6d -350899c8 -3c030005 -34638db3 -000812c2 -144306d6 -00000000 -3c08438e -3508e8fa -24030087 -000815c2 -144306d0 -00000000 -3c08eff6 -35088344 -3c0377fb -346341a2 -00081042 -144306c9 -00000000 -3c080d15 -350842d0 -3c03068a -3463a168 -00081042 -144306c2 -00000000 -3c08e809 -35085d20 -3c030007 -3463404a -00081342 -144306bb -00000000 -3c08afdd -35082416 -3c0315fb -3463a482 -000810c2 -144306b4 -00000000 -3c083d6b -3508dbfc -2403007a -000815c2 -144306ae -00000000 -3c0831be -35083200 -24030c6f -00081482 -144306a8 -00000000 -3c089687 -35082aa0 -2403012d -000815c2 -144306a2 -00000000 -3c08dccd -35085e68 -24031b99 -000814c2 -1443069c -00000000 -3c088c8c -350832ca -24031191 -000814c2 -14430696 -00000000 -3c083ab9 -3508a2d6 -24030757 -000814c2 -14430690 -00000000 -3c086277 -3508fc92 -3c030062 -346377fc -00081202 -14430689 -00000000 -3c0829b4 -35083f27 -2403000a -00081682 -14430683 -00000000 -3c08a1c2 -3508d700 -24030001 -000817c2 -1443067d -00000000 -3c08284f -3508ab97 -24031427 -00081442 -14430677 -00000000 -3c0813dc -35083d58 -2403009e -00081542 -14430671 -00000000 -3c08feec -35088f70 -3c0301fd -3463d91e -000811c2 -1443066a -00000000 -3c08be67 -35086615 -24030017 -000816c2 -14430664 -00000000 -3c08eb19 -3508335a -24030eb1 -00081502 -1443065e -00000000 -3c08cc5b -3508cb06 -3c0300cc -34635bcb -00081202 -14430657 -00000000 -3c08d390 -3508a600 -24030069 -00081642 -14430651 -00000000 -3c08155f -35088f7c -240300aa -00081542 -1443064b -00000000 -3c083be8 -35081cbb -24031df4 -00081442 -14430645 -00000000 -3c083f32 -35087950 -3c030001 -3463f993 -00081342 -1443063e -00000000 -3c08523d -350893ea -24030002 -00081742 -14430638 -00000000 -3c08029f -3508d640 -3403a7f5 -00081282 -14430632 -00000000 -3c08966f -3508a4dc -3c03004b -346337d2 -00081242 -1443062b -00000000 -3c086d7c -35088c68 -24030006 -00081702 -14430625 -00000000 -3c084938 -35088980 -3c030092 -34637113 -000811c2 -1443061e -00000000 -3c08d95e -35080458 -3c030d95 -3463e045 -00081102 -14430617 -00000000 -3c08fe52 -350859f1 -240301fc -000815c2 -14430611 -00000000 -3c08adff -350820c0 -3c03adff -346320c0 -00081002 -1443060a -00000000 -3c08ad4a -35088872 -3c032b52 -3463a21c -00081082 -14430603 -00000000 -3c08ac74 -35087dce -3c03563a -34633ee7 -00081042 -144305fc -00000000 -3c0845cf -35082481 -34038b9e -000813c2 -144305f6 -00000000 -3c08d220 -3508e6d8 -3c03000d -3463220e -00081302 -144305ef -00000000 -3c08fc07 -35083b24 -3c037e03 -34639d92 -00081042 -144305e8 -00000000 -3c089e49 -35083883 -3c039e49 -34633883 -00081002 -144305e1 -00000000 -3c088d02 -35088cd0 -3c030023 -346340a3 -00081282 -144305da -00000000 -3c0866ff -35086a59 -240300cd -000815c2 -144305d4 -00000000 -3c08ffc9 -3508bfa4 -2403000f -00081702 -144305ce -00000000 -3c08b7cc -35082258 -3c03000b -34637cc2 -00081302 -144305c7 -00000000 -3c086b31 -35088f8c -2403006b -00081602 -144305c1 -00000000 -3c08ca80 -35086bd4 -3c03ca80 -34636bd4 -00081002 -144305ba -00000000 -3c08df80 -3508ebb0 -24030001 -000817c2 -144305b4 -00000000 -3c0815de -350826d8 -24030577 -00081482 -144305ae -00000000 -3c08b120 -35084d16 -24030016 -000816c2 -144305a8 -00000000 -3c0829aa -35083074 -24035354 -000813c2 -144305a2 -00000000 -3c088cfd -35089d90 -3c03119f -3463b3b2 -000810c2 -1443059b -00000000 -3c0892fe -350881b8 -24030497 -00081542 -14430595 -00000000 -3c08351f -350810b4 -24030003 -00081702 -1443058f -00000000 -3c08c0d3 -350871af -3c030303 -34634dc6 -00081182 -14430588 -00000000 -3c081f72 -3508d53c -3c03000f -3463b96a -00081242 -14430581 -00000000 -3c085afe -35089f52 -3c0305af -3463e9f5 -00081102 -1443057a -00000000 -3c08c500 -35087654 -2403000c -00081702 -14430574 -00000000 -3c08df34 -3508c906 -3c0306f9 -3463a648 -00081142 -1443056d -00000000 -3c081ba6 -350893e2 -3c0306e9 -3463a4f8 -00081082 -14430566 -00000000 -3c08bb47 -350823a4 -3c03002e -3463d1c8 -00081282 -1443055f -00000000 -3c081912 -3508074c -24030006 -00081682 -14430559 -00000000 -3c08a441 -3508c500 -24031488 -000814c2 -14430553 -00000000 -3c089417 -35081c81 -24030002 -00081782 -1443054d -00000000 -3c089183 -3508d7ce -24030091 -00081602 -14430547 -00000000 -3c08129c -35088a70 -2403004a -00081582 -14430541 -00000000 -3c08bf41 -350818f0 -240302fd -00081582 -1443053b -00000000 -3c088486 -35080eec -3c030004 -34632430 -00081342 -14430534 -00000000 -3c089517 -35083198 -3c030012 -3463a2e6 -000812c2 -1443052d -00000000 -3c08e1d7 -35083a20 -3c03001c -34633ae7 -000812c2 -14430526 -00000000 -3c082473 -350858ec -3c030004 -34638e6b -000812c2 -1443051f -00000000 -3c0873c5 -35082105 -2403073c -00081502 -14430519 -00000000 -3c08d905 -3508fa84 -3c030001 -3463b20b -000813c2 -14430512 -00000000 -3c08e783 -350814d8 -240373c1 -00081442 -1443050c -00000000 -3c085585 -35081990 -24030005 -00081702 -14430506 -00000000 -3c083bac -35080f11 -3c030077 -3463581e -000811c2 -144304ff -00000000 -3c08568d -3508eaa8 -240300ad -000815c2 -144304f9 -00000000 -3c087f3c -3508f4a0 -3c030007 -3463f3cf -00081302 -144304f2 -00000000 -3c08db04 -350821e6 -3c03006d -34638210 -00081242 -144304eb -00000000 -3c083bdb -350898c0 -3c03003b -3463db98 -00081202 -144304e4 -00000000 -3c085475 -3508f578 -24035475 -00081402 -144304de -00000000 -3c086908 -3508094a -3c030d21 -34630129 -000810c2 -144304d7 -00000000 -3c08ded0 -3508771c -24030001 -000817c2 -144304d1 -00000000 -3c0810be -35089685 -3c030217 -3463d2d0 -000810c2 -144304ca -00000000 -3c08ba0e -350847fa -3c030001 -3463741c -000813c2 -144304c3 -00000000 -3c085a8b -3508fd48 -3403b517 -000813c2 -144304bd -00000000 -3c08a2b8 -3508964e -24030002 -00081782 -144304b7 -00000000 -3c08c1c8 -350816c0 -24030003 -00081782 -144304b1 -00000000 -3c08d035 -3508e940 -3c030340 -3463d7a5 -00081182 -144304aa -00000000 -3c0842df -350891ac -3c030004 -34632df9 -00081302 -144304a3 -00000000 -3c08fedd -3508d2dc -24030007 -00081742 -1443049d -00000000 -3c084771 -35082ac2 -2403011d -00081582 -14430497 -00000000 -3c08736c -3508ddf8 -3c0339b6 -34636efc -00081042 -14430490 -00000000 -3c089f86 -3508657e -240309f8 -00081502 -1443048a -00000000 -3c088b3e -35086480 -24030011 -000816c2 -14430484 -00000000 -3c080d5a -3508849c -2403006a -00081542 -1443047e -00000000 -3c0849b8 -35080128 -3c030024 -3463dc00 -00081242 -14430477 -00000000 -3c08bbbb -3508f940 -3c030bbb -3463bf94 -00081102 -14430470 -00000000 -3c082ef1 -35080c70 -24030000 -000817c2 -1443046a -00000000 -3c082600 -35088fee -3c032600 -34638fee -00081002 -14430463 -00000000 -3c0868fa -3508f2e6 -24031a3e -00081482 -1443045d -00000000 -3c08b08f -3508704f -3c031611 -3463ee09 -000810c2 -14430456 -00000000 -3c08679f -35087248 -3c030001 -34639e7d -00081382 -1443044f -00000000 -3c08345c -3508d56a -3c030001 -3463a2e6 -00081342 -14430448 -00000000 -3c082394 -3508e93c -3c030004 -3463729d -000812c2 -14430441 -00000000 -3c08dd1e -350822b0 -3c031ba3 -3463c456 -000810c2 -1443043a -00000000 -3c0893dd -350833eb -3c0324f7 -34634cfa -00081082 -14430433 -00000000 -3c085a72 -3508cb08 -2403005a -00081602 -1443042d -00000000 -3c08da4e -35084434 -2403000d -00081702 -14430427 -00000000 -3c080cd9 -350852a0 -3c030336 -346354a8 -00081082 -14430420 -00000000 -3c087da4 -3508fba4 -3c03007d -3463a4fb -00081202 -14430419 -00000000 -3c0817d1 -35084b64 -240302fa -000814c2 -14430413 -00000000 -3c083dea -3508e382 -3c0307bd -34635c70 -000810c2 -1443040c -00000000 -3c085db9 -35081e00 -3c030176 -3463e478 -00081182 -14430405 -00000000 -3c08a13b -35085140 -240300a1 -00081602 -144303ff -00000000 -3c084b12 -35085b37 -3c030258 -346392d9 -00081142 -144303f8 -00000000 -3c082821 -3508de00 -24032821 -00081402 -144303f2 -00000000 -3c08a1e1 -35080762 -2403143c -000814c2 -144303ec -00000000 -3c08bd6e -3508a4d8 -24030017 -000816c2 -144303e6 -00000000 -3c081751 -3508c2f2 -240302ea -000814c2 -144303e0 -00000000 -3c085746 -3508f770 -24032ba3 -00081442 -144303da -00000000 -3c0818f4 -35087ec0 -3c030006 -34633d1f -00081282 -144303d3 -00000000 -3c081837 -35087db1 -24030306 -000814c2 -144303cd -00000000 -3c089612 -3508ed20 -2403012c -000815c2 -144303c7 -00000000 -3c083ff8 -350833c1 -3c030ffe -34630cf0 -00081082 -144303c0 -00000000 -3c0890de -35083f60 -3c03121b -3463c7ec -000810c2 -144303b9 -00000000 -3c080fcd -3508ca28 -3c0301f9 -3463b945 -000810c2 -144303b2 -00000000 -3c08d42d -350871c0 -240301a8 -000815c2 -144303ac -00000000 -3c085de1 -35083940 -3c030017 -3463784e -00081282 -144303a5 -00000000 -3c08f6a0 -3508da2a -240303da -00081582 -1443039f -00000000 -3c089960 -3508cb98 -24032658 -00081482 -14430399 -00000000 -3c0848c7 -35080640 -24030918 -000814c2 -14430393 -00000000 -3c086ade -35083a10 -2403006a -00081602 -1443038d -00000000 -3c08a818 -3508867c -24030001 -000817c2 -14430387 -00000000 -3c082174 -35082cc4 -240310ba -00081442 -14430381 -00000000 -3c08a991 -3508afba -24030002 -00081782 -1443037b -00000000 -3c081044 -3508822e -24030000 -000817c2 -14430375 -00000000 -3c08594e -3508b0c9 -3c030005 -346394eb -00081302 -1443036e -00000000 -3c08cab8 -350845e0 -24030032 -00081682 -14430368 -00000000 -3c08b885 -3508f1b0 -2403005c -00081642 -14430362 -00000000 -3c08bb4d -3508a25e -2403000b -00081702 -1443035c -00000000 -3c089913 -3508d5a8 -3c034c89 -3463ead4 -00081042 -14430355 -00000000 -3c08deb2 -3508a9ac -3c03001b -3463d655 -000812c2 -1443034e -00000000 -3c080cec -3508eeef -3c030019 -3463d9dd -000811c2 -14430347 -00000000 -3c08c689 -3508d515 -24030c68 -00081502 -14430341 -00000000 -3c085322 -3508069a -3c035322 -3463069a -00081002 -1443033a -00000000 -3c08c011 -350853e0 -3c0300c0 -34631153 -00081202 -14430333 -00000000 -3c088ad5 -350831ce -24030002 -00081782 -1443032d -00000000 -3c087cbe -35087e40 -24030007 -00081702 -14430327 -00000000 -3c08248c -3508ac4c -24030004 -000816c2 -14430321 -00000000 -3c08193c -35089e68 -3c03000c -34639e4f -00081242 -1443031a -00000000 -3c0896fc -3508b75e -2403025b -00081582 -14430314 -00000000 -3c087c66 -3508d8a8 -240300f8 -000815c2 -1443030e -00000000 -3c0897c6 -35088582 -240312f8 -000814c2 -14430308 -00000000 -3c0867e9 -3508d088 -2403019f -00081582 -14430302 -00000000 -3c08ac7c -3508a5f0 -24030158 -000815c2 -144302fc -00000000 -3c0836ea -350827a0 -24030036 -00081602 -144302f6 -00000000 -3c088edc -35088558 -24030008 -00081702 -144302f0 -00000000 -3c08c817 -350862b0 -24033205 -00081482 -144302ea -00000000 -3c080764 -35083feb -3c0301d9 -34630ffa -00081082 -144302e3 -00000000 -3c0803cb -35085a9a -24030001 -00081642 -144302dd -00000000 -3c085f6e -35089b04 -3c030001 -34637dba -00081382 -144302d6 -00000000 -3c08f938 -35081ef8 -3c030007 -3463c9c0 -00081342 -144302cf -00000000 -3c089f2a -3508e4bd -3c030027 -3463cab9 -00081282 -144302c8 -00000000 -3c08fccd -35086510 -3c031f99 -3463aca2 -000810c2 -144302c1 -00000000 -3c08f4d0 -350822a3 -24030007 -00081742 -144302bb -00000000 -3c08d01e -35081628 -3c03d01e -34631628 -00081002 -144302b4 -00000000 -3c0850d2 -3508eb64 -240300a1 -000815c2 -144302ae -00000000 -3c08f7fe -35081380 -3c03003d -3463ff84 -00081282 -144302a7 -00000000 -3c083f20 -35088b00 -24030001 -00081742 -144302a1 -00000000 -3c08b050 -3508fbc4 -3c030582 -346387de -00081142 -1443029a -00000000 -3c08d7cf -35089260 -240300d7 -00081602 -14430294 -00000000 -3c08c9f5 -3508e6f8 -3c030006 -34634faf -00081342 -1443028d -00000000 -3c0813c1 -35083f3c -2403013c -00081502 -14430287 -00000000 -3c085609 -3508a2fa -3c0302b0 -34634d17 -00081142 -14430280 -00000000 -3c0882b7 -3508b880 -3c0320ad -3463ee20 -00081082 -14430279 -00000000 -3c0810e0 -35081b20 -24030008 -00081642 -14430273 -00000000 -3c0854c7 -35084415 -24031531 -00081482 -1443026d -00000000 -3c084bcc -3508116e -34039798 -000813c2 -14430267 -00000000 -3c08644c -35083ef8 -24030191 -00081582 -14430261 -00000000 -3c0848d1 -35088780 -3c0348d1 -34638780 -00081002 -1443025a -00000000 -3c08b4bf -350857b8 -3c03b4bf -346357b8 -00081002 -14430253 -00000000 -3c087100 -35080c2b -3c037100 -34630c2b -00081002 -1443024c -00000000 -3c08ccae -3508bba5 -3c03ccae -3463bba5 -00081002 -14430245 -00000000 -3c0835d5 -3508c040 -3c0335d5 -3463c040 -00081002 -1443023e -00000000 -3c08bbaf -3508be33 -3c03bbaf -3463be33 -00081002 -14430237 -00000000 -3c083098 -3508b297 -3c033098 -3463b297 -00081002 -14430230 -00000000 -3c088404 -350818eb -3c038404 -346318eb -00081002 -14430229 -00000000 -3c089889 -3508fdd0 -3c039889 -3463fdd0 -00081002 -14430222 -00000000 -3c08eb66 -35082556 -3c03eb66 -34632556 -00081002 -1443021b -00000000 -3c08d92d -3508d10e -3c03d92d -3463d10e -00081002 -14430214 -00000000 -3c08eb62 -350840b4 -3c03eb62 -346340b4 -00081002 -1443020d -00000000 -3c087936 -35088c54 -3c037936 -34638c54 -00081002 -14430206 -00000000 -3c08fdaa -35088940 -3c03fdaa -34638940 -00081002 -144301ff -00000000 -3c08f3e9 -35089110 -3c03f3e9 -34639110 -00081002 -144301f8 -00000000 -3c080526 -35080ce8 -3c030526 -34630ce8 -00081002 -144301f1 -00000000 -3c089d3f -35087cee -3c039d3f -34637cee -00081002 -144301ea -00000000 -3c08ae5f -3508b658 -3c03ae5f -3463b658 -00081002 -144301e3 -00000000 -3c083166 -350838e8 -3c033166 -346338e8 -00081002 -144301dc -00000000 -3c085251 -3508b1e0 -3c035251 -3463b1e0 -00081002 -144301d5 -00000000 -3c08a1ca -350869a0 -3c03a1ca -346369a0 -00081002 -144301ce -00000000 -3c080208 -35086f98 -3c030208 -34636f98 -00081002 -144301c7 -00000000 -3c08266e -3508f6d8 -3c03266e -3463f6d8 -00081002 -144301c0 -00000000 -3c08f57b -3508d214 -3c03f57b -3463d214 -00081002 -144301b9 -00000000 -3c08ddce -35085bbc -3c03ddce -34635bbc -00081002 -144301b2 -00000000 -3c086f27 -35086284 -3c036f27 -34636284 -00081002 -144301ab -00000000 -3c0859c0 -35084a2c -3c0359c0 -34634a2c -00081002 -144301a4 -00000000 -3c08aa2f -35080e2a -3c03aa2f -34630e2a -00081002 -1443019d -00000000 -3c08ee78 -35083ae8 -3c03ee78 -34633ae8 -00081002 -14430196 -00000000 -3c083e22 -350875b4 -3c033e22 -346375b4 -00081002 -1443018f -00000000 -3c08553a -3508dec3 -3c03553a -3463dec3 -00081002 -14430188 -00000000 -3c088189 -3508671d -3c038189 -3463671d -00081002 -14430181 -00000000 -3c08cab1 -35082b0e -3c03cab1 -34632b0e -00081002 -1443017a -00000000 -3c08d591 -35086d44 -3c03d591 -34636d44 -00081002 -14430173 -00000000 -3c0829d5 -350842b4 -3c0329d5 -346342b4 -00081002 -1443016c -00000000 -3c086273 -35088600 -3c036273 -34638600 -00081002 -14430165 -00000000 -3c08ce75 -35083aa8 -3c03ce75 -34633aa8 -00081002 -1443015e -00000000 -3c08b145 -3508be00 -3c03b145 -3463be00 -00081002 -14430157 -00000000 -3c08b56d -35089f5e -3c03b56d -34639f5e -00081002 -14430150 -00000000 -3c08880f -35080d04 -3c03880f -34630d04 -00081002 -14430149 -00000000 -3c088a4d -35086fa0 -3c038a4d -34636fa0 -00081002 -14430142 -00000000 -3c08217a -3508a622 -3c03217a -3463a622 -00081002 -1443013b -00000000 -3c08a80f -3508a30b -3c03a80f -3463a30b -00081002 -14430134 -00000000 -3c083eb6 -350836b0 -3c033eb6 -346336b0 -00081002 -1443012d -00000000 -3c08ed86 -3508d00a -3c03ed86 -3463d00a -00081002 -14430126 -00000000 -3c08df73 -350834a0 -3c03df73 -346334a0 -00081002 -1443011f -00000000 -3c0803e1 -3508477c -3c0303e1 -3463477c -00081002 -14430118 -00000000 -3c08fd67 -3508f422 -3c03fd67 -3463f422 -00081002 -14430111 -00000000 -3c0838b1 -3508ac50 -3c0338b1 -3463ac50 -00081002 -1443010a -00000000 -3c081acb -35085040 -3c031acb -34635040 -00081002 -14430103 -00000000 -24080000 -24030000 -00081242 -144300fe -00000000 -24080000 -24030000 -00081302 -144300f9 -00000000 -24080000 -24030000 -000810c2 -144300f4 -00000000 -24080000 -24030000 -00081302 -144300ef -00000000 -24080000 -24030000 -00081402 -144300ea -00000000 -24080000 -24030000 -000813c2 -144300e5 -00000000 -24080000 -24030000 -00081582 -144300e0 -00000000 -24080000 -24030000 -00081182 -144300db -00000000 -24080000 -24030000 -000814c2 -144300d6 -00000000 -24080000 -24030000 -000815c2 -144300d1 -00000000 -24080000 -24030000 -00081402 -144300cc -00000000 -24080000 -24030000 -00081342 -144300c7 -00000000 -24080000 -24030000 -000815c2 -144300c2 -00000000 -24080000 -24030000 -000813c2 -144300bd -00000000 -24080000 -24030000 -00081442 -144300b8 -00000000 -24080000 -24030000 -00081342 -144300b3 -00000000 -24080000 -24030000 -00081642 -144300ae -00000000 -24080000 -24030000 -000812c2 -144300a9 -00000000 -24080000 -24030000 -00081202 -144300a4 -00000000 -24080000 -24030000 -00081302 -1443009f -00000000 -24080000 -24030000 -000814c2 -1443009a -00000000 -24080000 -24030000 -00081082 -14430095 -00000000 -24080000 -24030000 -00081502 -14430090 -00000000 -24080000 -24030000 -000811c2 -1443008b -00000000 -24080000 -24030000 -00081402 -14430086 -00000000 -24080000 -24030000 -00081282 -14430081 -00000000 -24080000 -24030000 -000813c2 -1443007c -00000000 -24080000 -24030000 -00081602 -14430077 -00000000 -24080000 -24030000 -00081242 -14430072 -00000000 -24080000 -24030000 -00081282 -1443006d -00000000 -24080000 -24030000 -000815c2 -14430068 -00000000 -24080000 -24030000 -00081702 -14430063 -00000000 -24080000 -24030000 -00081402 -1443005e -00000000 -24080000 -24030000 -00081002 -14430059 -00000000 -24080000 -24030000 -000817c2 -14430054 -00000000 -24080000 -24030000 -000814c2 -1443004f -00000000 -24080000 -24030000 -000814c2 -1443004a -00000000 -24080000 -24030000 -00081582 -14430045 -00000000 -24080000 -24030000 -00081102 -14430040 -00000000 -24080000 -24030000 -00081602 -1443003b -00000000 -24080000 -24030000 -00081082 -14430036 -00000000 -24080000 -24030000 -00081742 -14430031 -00000000 -24080000 -24030000 -00081402 -1443002c -00000000 -24080000 -24030000 -00081402 -14430027 -00000000 -24080000 -24030000 -00081602 -14430022 -00000000 -24080000 -24030000 -00081242 -1443001d -00000000 -24080000 -24030000 -00081682 -14430018 -00000000 -24080000 -24030000 -00081702 -14430013 -00000000 -24080000 -24030000 -00081602 -1443000e -00000000 -24080000 -24030000 -00081102 -14430009 -00000000 -24080000 -24030000 -00081002 -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -3c08800d -24120005 -ad120000 -40805800 -3c170040 -40976000 -00000000 -3c170005 -3c02b189 -3442c470 -3c03b189 -3463c470 -3c04800d -34847bd1 -3c05b189 -34a5c470 -24877974 -ac827973 -3c14bfc1 -26948184 -ac857974 -165700a2 -00000000 -8c827973 -1443009f -00000000 -40164000 -14f6009c -00000000 -24120005 -3c02c052 -3442b3f0 -3c03c052 -3463b3f0 -3c04800d -348423d4 -3c05c052 -34a5b3f0 -248764a2 -ac8264a0 -3c14bfc1 -269481e4 -ad080004 -ad140004 -ac8564a2 -ad140000 -8d090004 -15340088 -00000000 -16570086 -00000000 -8c8264a0 -14430083 -00000000 -40164000 -14f60080 -00000000 -24120005 -ad120000 -24120005 -3c02a10f -3442ebaf -3c03a10f -3463ebaf -3c04800d -34848850 -3c05994c -34a50280 -2487418b -ac824188 -3c14bfc1 -2694825c -01000011 -0110001b -ac85418b -00004810 -1128006b -00000000 -16570069 -00000000 -8c824188 -14430066 -00000000 -40164000 -14f60063 -00000000 -24120005 -3c02eb54 -3442b87c -3c03eb54 -3463b87c -3c04800d -3484a256 -3c05eb54 -34a5b87c -248700c3 -ac8200c2 -3c14bfc1 -269482c0 -ac8500c3 -0208001b -16570052 -00000000 -8c8200c2 -1443004f -00000000 -40164000 -14f6004c -00000000 -24120005 -3c028003 -34422066 -3c038003 -34632066 -3c04800d -3484206c -3c05ebdc -34a58860 -2487ccc2 -ac82ccc0 -3c14bfc1 -26948324 -01000013 -01100019 -ac85ccc2 -00004810 -11280039 -00000000 -16570037 -00000000 -8c82ccc0 -14430034 -00000000 -40164000 -14f60031 -00000000 -24120005 -3c026348 -344258c8 -3c036348 -346358c8 -3c04800d -348482d8 -3c050c41 -34a5f5e8 -24878889 -ac828888 -3c14bfc1 -26948388 -ac858889 -01120019 -16570020 -00000000 -8c828888 -1443001d -00000000 -40164000 -14f6001a -00000000 -24120005 -3c028003 -34421751 -3c038003 -34631751 -3c04800d -34841750 -3c05cb09 -34a5da60 -24879b27 -ac829b24 -3c14bfc1 -269483e8 -40927000 -ac859b27 -40887000 -16570008 -00000000 -8c829b24 -14430005 -00000000 -40164000 -14f60002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -26100001 -24120000 -3c084406 -3508a500 -3c034406 -3463b1bf -390214bf -144307d2 -00000000 -3c08b5f5 -35082460 -3c03b5f5 -34639ede -3902babe -144307cb -00000000 -3c083454 -35087fee -3c033454 -3463e314 -39029cfa -144307c4 -00000000 -3c084d7c -35086e70 -3c034d7c -34639384 -3902fdf4 -144307bd -00000000 -3c080f04 -3508a9e8 -3c030f04 -34633af6 -3902931e -144307b6 -00000000 -3c08ebec -35084441 -3c03ebec -3463c04a -3902840b -144307af -00000000 -3c086634 -3508ae18 -3c036634 -34639d90 -39023388 -144307a8 -00000000 -3c0891ab -35081a58 -3c0391ab -3463a07f -3902ba27 -144307a1 -00000000 -3c08799c -35082469 -3c03799c -346316ee -39023287 -1443079a -00000000 -3c083341 -35082a00 -3c033341 -346343cd -390269cd -14430793 -00000000 -3c083e00 -3508f810 -3c033e00 -346385b6 -39027da6 -1443078c -00000000 -3c087a5a -35087b1e -3c037a5a -346321ea -39025af4 -14430785 -00000000 -3c0854f7 -35080200 -3c0354f7 -3463d6c2 -3902d4c2 -1443077e -00000000 -3c08b076 -3508900d -3c03b076 -34639ae1 -39020aec -14430777 -00000000 -3c08efb3 -35084e75 -3c03efb3 -34637ea5 -390230d0 -14430770 -00000000 -3c088238 -3508b723 -3c038238 -3463ca80 -39027da3 -14430769 -00000000 -3c088fd1 -3508c50e -3c038fd1 -3463101d -3902d513 -14430762 -00000000 -3c08527c -3508fe40 -3c03527c -3463900c -39026e4c -1443075b -00000000 -3c08a791 -35086af8 -3c03a791 -346334f8 -39025e00 -14430754 -00000000 -3c082a7e -3508f402 -3c032a7e -3463dacb -39022ec9 -1443074d -00000000 -3c08eaa4 -3508370c -3c03eaa4 -3463f877 -3902cf7b -14430746 -00000000 -3c08398d -350882c0 -3c03398d -3463ede0 -39026f20 -1443073f -00000000 -3c08c179 -350873c0 -3c03c179 -3463d1c4 -3902a204 -14430738 -00000000 -3c08509b -35085930 -3c03509b -34634fcb -390216fb -14430731 -00000000 -3c0802f1 -3508a8c0 -3c0302f1 -3463c98a -3902614a -1443072a -00000000 -3c089f1f -35081918 -3c039f1f -34636898 -39027180 -14430723 -00000000 -3c08a999 -35085a23 -3c03a999 -3463ecf3 -3902b6d0 -1443071c -00000000 -3c08790d -350838e8 -3c03790d -3463b2a3 -39028a4b -14430715 -00000000 -3c08e7b8 -350871a0 -3c03e7b8 -3463cf0d -3902bead -1443070e -00000000 -3c0843c6 -35083446 -3c0343c6 -34634f66 -39027b20 -14430707 -00000000 -3c0867ed -35084840 -3c0367ed -3463b30b -3902fb4b -14430700 -00000000 -3c08d039 -35089730 -3c03d039 -34639e02 -39020932 -144306f9 -00000000 -3c08ffce -35086838 -3c03ffce -3463d644 -3902be7c -144306f2 -00000000 -3c082185 -350808a0 -3c032185 -3463b7a6 -3902bf06 -144306eb -00000000 -3c08d57c -3508a985 -3c03d57c -346309ad -3902a028 -144306e4 -00000000 -3c08b4dc -3508272e -3c03b4dc -34636b96 -39024cb8 -144306dd -00000000 -3c0836d7 -3508bfad -3c0336d7 -346382b6 -39023d1b -144306d6 -00000000 -3c0850e3 -350864b4 -3c0350e3 -34635f34 -39023b80 -144306cf -00000000 -3c08b4dd -3508f452 -3c03b4dd -346339ea -3902cdb8 -144306c8 -00000000 -3c08b8f6 -35081d50 -3c03b8f6 -34639050 -39028d00 -144306c1 -00000000 -3c085e68 -35086f00 -3c035e68 -34636709 -39020809 -144306ba -00000000 -3c089d18 -35085660 -3c039d18 -3463bb42 -3902ed22 -144306b3 -00000000 -3c0887fe -35081678 -3c0387fe -34632fe8 -39023990 -144306ac -00000000 -3c081e5e -3508eff6 -3c031e5e -34635889 -3902b77f -144306a5 -00000000 -3c08ecf1 -3508b0c0 -3c03ecf1 -34636474 -3902d4b4 -1443069e -00000000 -3c0806f1 -3508fc80 -3c0306f1 -34633b0b -3902c78b -14430697 -00000000 -3c084bd3 -35088394 -3c034bd3 -3463549e -3902d70a -14430690 -00000000 -3c086ccb -350850d0 -3c036ccb -34637296 -39022246 -14430689 -00000000 -3c088569 -35089cc0 -3c038569 -34630660 -39029aa0 -14430682 -00000000 -3c08f02b -3508f6f4 -3c03f02b -34635ea8 -3902a85c -1443067b -00000000 -3c08d9cf -35087ecc -3c03d9cf -3463bb34 -3902c5f8 -14430674 -00000000 -3c089fa2 -3508ec6c -3c039fa2 -34635464 -3902b808 -1443066d -00000000 -3c08f40a -35087ab6 -3c03f40a -3463d653 -3902ace5 -14430666 -00000000 -3c08221f -3508169c -3c03221f -34635c99 -39024a05 -1443065f -00000000 -3c088bc9 -35084c7c -3c038bc9 -34639293 -3902deef -14430658 -00000000 -3c089f1b -3508301a -3c039f1b -3463b9d4 -390289ce -14430651 -00000000 -3c08bae4 -35089c78 -3c03bae4 -3463739f -3902efe7 -1443064a -00000000 -3c0820c1 -3508bee2 -3c0320c1 -3463a797 -39021975 -14430643 -00000000 -3c088719 -3508f46e -3c038719 -34638830 -39027c5e -1443063c -00000000 -3c088ee1 -350832b0 -3c038ee1 -346302a3 -39023013 -14430635 -00000000 -3c084876 -3508e8e0 -3c034876 -34637075 -39029895 -1443062e -00000000 -3c08a13c -3508076b -3c03a13c -3463b343 -3902b428 -14430627 -00000000 -3c08eb47 -3508bdb0 -3c03eb47 -3463e01c -39025dac -14430620 -00000000 -3c08a4d5 -3508085e -3c03a4d5 -34630286 -39020ad8 -14430619 -00000000 -3c0808c5 -3508015c -3c0308c5 -34634162 -3902403e -14430612 -00000000 -3c08dc7f -35084352 -3c03dc7f -3463e87a -3902ab28 -1443060b -00000000 -3c081b2f -350816d0 -3c031b2f -34639ce0 -39028a30 -14430604 -00000000 -3c08bb07 -3508d7ee -3c03bb07 -34637b62 -3902ac8c -144305fd -00000000 -3c0817ab -35085626 -3c0317ab -34636d9a -39023bbc -144305f6 -00000000 -3c08e262 -35080f20 -3c03e262 -34636ff2 -390260d2 -144305ef -00000000 -3c08a755 -3508ccd8 -3c03a755 -34635a79 -390296a1 -144305e8 -00000000 -3c08d8d4 -35089d01 -3c03d8d4 -34636e11 -3902f310 -144305e1 -00000000 -3c08fea7 -3508acb8 -3c03fea7 -3463c02e -39026c96 -144305da -00000000 -3c08fe6d -35086cc0 -3c03fe6d -34634684 -39022a44 -144305d3 -00000000 -3c080e8d -3508bac0 -3c030e8d -3463e21e -390258de -144305cc -00000000 -3c08ab40 -35080ea0 -3c03ab40 -3463c92a -3902c78a -144305c5 -00000000 -3c086173 -35086ae4 -3c036173 -34637e26 -390214c2 -144305be -00000000 -3c082c83 -35082410 -3c032c83 -3463295e -39020d4e -144305b7 -00000000 -3c081a39 -3508efe0 -3c031a39 -346308dc -3902e73c -144305b0 -00000000 -3c08c879 -35083d1b -3c03c879 -34631183 -39022c98 -144305a9 -00000000 -3c08bfc7 -3508c7ce -3c03bfc7 -346355d4 -3902921a -144305a2 -00000000 -3c087fde -35087f40 -3c037fde -346383a7 -3902fce7 -1443059b -00000000 -3c081b06 -35089f4d -3c031b06 -346361e5 -3902fea8 -14430594 -00000000 -3c0854b7 -35083140 -3c0354b7 -34632aca -39021b8a -1443058d -00000000 -3c084430 -3508bfbe -3c034430 -3463d85d -390267e3 -14430586 -00000000 -3c089ccd -35085ae2 -3c039ccd -34635d02 -390207e0 -1443057f -00000000 -3c080682 -3508c23a -3c030682 -3463c9e4 -39020bde -14430578 -00000000 -3c084351 -350811ec -3c034351 -346347c1 -3902562d -14430571 -00000000 -3c08c694 -3508f6f0 -3c03c694 -3463206c -3902d69c -1443056a -00000000 -3c0825fe -35080d60 -3c0325fe -34635766 -39025a06 -14430563 -00000000 -3c08340d -3508e130 -3c03340d -3463a115 -39024025 -1443055c -00000000 -3c0827b0 -3508e95c -3c0327b0 -3463bb9c -390252c0 -14430555 -00000000 -3c081083 -3508e8f8 -3c031083 -3463aa62 -3902429a -1443054e -00000000 -3c086d9a -350863c8 -3c036d9a -3463e668 -390285a0 -14430547 -00000000 -3c08e747 -3508d940 -3c03e747 -3463b1ce -3902688e -14430540 -00000000 -3c08820f -3508f0a0 -3c03820f -3463e5b4 -39021514 -14430539 -00000000 -3c08bd08 -3508a2d0 -3c03bd08 -3463647a -3902c6aa -14430532 -00000000 -3c08951b -3508bfac -3c03951b -34633030 -39028f9c -1443052b -00000000 -3c08cb4a -35082fe5 -3c03cb4a -3463fd58 -3902d2bd -14430524 -00000000 -3c084cac -35085398 -3c034cac -346309e2 -39025a7a -1443051d -00000000 -3c0852d7 -3508c970 -3c0352d7 -346348b2 -390281c2 -14430516 -00000000 -3c0848d5 -3508cb40 -3c0348d5 -34638340 -39024800 -1443050f -00000000 -3c08b627 -35087340 -3c03b627 -3463eb15 -39029855 -14430508 -00000000 -3c081c5a -35085198 -3c031c5a -3463392b -390268b3 -14430501 -00000000 -3c083ec2 -3508c29c -3c033ec2 -34630e84 -3902cc18 -144304fa -00000000 -3c084f93 -3508d6e2 -3c034f93 -3463e452 -390232b0 -144304f3 -00000000 -3c0835f7 -3508338b -3c0335f7 -34633577 -390206fc -144304ec -00000000 -3c087d96 -3508e6a0 -3c037d96 -34636f74 -390289d4 -144304e5 -00000000 -3c08241f -35088e98 -3c03241f -346381e2 -39020f7a -144304de -00000000 -3c086448 -3508e8d0 -3c036448 -34630f5b -3902e78b -144304d7 -00000000 -3c088e72 -3508acb4 -3c038e72 -3463c45c -390268e8 -144304d0 -00000000 -3c081675 -3508bfc8 -3c031675 -3463192b -3902a6e3 -144304c9 -00000000 -3c08b6c0 -3508b746 -3c03b6c0 -3463bda9 -39020aef -144304c2 -00000000 -3c08d65d -35083a44 -3c03d65d -34632b52 -39021116 -144304bb -00000000 -3c086312 -3508b7e0 -3c036312 -34632900 -39029ee0 -144304b4 -00000000 -3c084d2d -35080e7c -3c034d2d -3463a79a -3902a9e6 -144304ad -00000000 -3c0869cc -35088da4 -3c0369cc -3463ade1 -39022045 -144304a6 -00000000 -3c0877c9 -35086582 -3c0377c9 -346366fe -3902037c -1443049f -00000000 -3c085d88 -3508d5c0 -3c035d88 -34636060 -3902b5a0 -14430498 -00000000 -3c089519 -35081d82 -3c039519 -3463f62a -3902eba8 -14430491 -00000000 -3c08a8e3 -3508fae0 -3c03a8e3 -3463ee93 -39021473 -1443048a -00000000 -3c084b89 -35080a92 -3c034b89 -34633d74 -390237e6 -14430483 -00000000 -3c084f16 -3508942d -3c034f16 -34635ed2 -3902caff -1443047c -00000000 -3c087651 -3508e248 -3c037651 -34638878 -39026a30 -14430475 -00000000 -3c08d5aa -3508e6f8 -3c03d5aa -3463b8a2 -39025e5a -1443046e -00000000 -3c084c4f -3508f410 -3c034c4f -3463fa10 -39020e00 -14430467 -00000000 -3c0885a5 -350810c8 -3c0385a5 -3463ab90 -3902bb58 -14430460 -00000000 -3c08bded -35082e10 -3c03bded -346337e0 -390219f0 -14430459 -00000000 -3c081b77 -35081d7c -3c031b77 -34636275 -39027f09 -14430452 -00000000 -3c086135 -35080040 -3c036135 -3463cb2d -3902cb6d -1443044b -00000000 -3c08d8b2 -35082e76 -3c03d8b2 -34633c51 -39021227 -14430444 -00000000 -3c081077 -3508f310 -3c031077 -3463e8e8 -39021bf8 -1443043d -00000000 -3c084090 -35087e16 -3c034090 -3463c26a -3902bc7c -14430436 -00000000 -3c080180 -350899e0 -3c030180 -3463264a -3902bfaa -1443042f -00000000 -3c08c929 -3508a3e2 -3c03c929 -346372a8 -3902d14a -14430428 -00000000 -3c08b323 -35084f60 -3c03b323 -3463b0c5 -3902ffa5 -14430421 -00000000 -3c084caf -35085120 -3c034caf -34634021 -39021101 -1443041a -00000000 -3c083d9d -35087798 -3c033d9d -3463913b -3902e6a3 -14430413 -00000000 -3c087b3b -3508ec00 -3c037b3b -3463eb80 -39020780 -1443040c -00000000 -3c0841b0 -3508e100 -3c0341b0 -3463689e -3902899e -14430405 -00000000 -3c082bff -3508f038 -3c032bff -3463c94e -39023976 -144303fe -00000000 -3c088e2c -35082c64 -3c038e2c -34634bf0 -39026794 -144303f7 -00000000 -3c08b960 -3508d030 -3c03b960 -34631400 -3902c430 -144303f0 -00000000 -3c089053 -350840c0 -3c039053 -34639d94 -3902dd54 -144303e9 -00000000 -3c0822c7 -350866b0 -3c0322c7 -34636c84 -39020a34 -144303e2 -00000000 -3c0813d4 -35085580 -3c0313d4 -34638abc -3902df3c -144303db -00000000 -3c08a805 -35081560 -3c03a805 -34639739 -39028259 -144303d4 -00000000 -3c0869ae -3508cf80 -3c0369ae -3463b228 -39027da8 -144303cd -00000000 -3c08bd80 -35083cf2 -3c03bd80 -3463716e -39024d9c -144303c6 -00000000 -3c0888a0 -35081000 -3c0388a0 -346373ea -390263ea -144303bf -00000000 -3c08980f -35082f00 -3c03980f -34631a9f -3902359f -144303b8 -00000000 -3c0829ba -3508fada -3c0329ba -346360f8 -39029a22 -144303b1 -00000000 -3c08b9b4 -3508e2c4 -3c03b9b4 -346396ad -39027469 -144303aa -00000000 -3c085e33 -35080605 -3c035e33 -34636d7b -39026b7e -144303a3 -00000000 -3c083a98 -35080396 -3c033a98 -3463c915 -3902ca83 -1443039c -00000000 -3c08f6b2 -3508c980 -3c03f6b2 -34632b9c -3902e21c -14430395 -00000000 -3c087121 -3508a34c -3c037121 -34630fc9 -3902ac85 -1443038e -00000000 -3c08ed08 -3508d0e0 -3c03ed08 -34639c2c -39024ccc -14430387 -00000000 -3c0831a5 -3508f9bc -3c0331a5 -346327dc -3902de60 -14430380 -00000000 -3c08a041 -35080dd0 -3c03a041 -3463670e -39026ade -14430379 -00000000 -3c08c82a -3508429c -3c03c82a -34635f84 -39021d18 -14430372 -00000000 -3c08c38c -350882be -3c03c38c -34633512 -3902b7ac -1443036b -00000000 -3c083ac9 -35080f58 -3c033ac9 -3463914e -39029e16 -14430364 -00000000 -3c08b49c -3508c0b6 -3c03b49c -3463ae66 -39026ed0 -1443035d -00000000 -3c084e0a -35083b1f -3c034e0a -34633efe -390205e1 -14430356 -00000000 -3c08e38d -3508bdc0 -3c03e38d -34631872 -3902a5b2 -1443034f -00000000 -3c0803b5 -3508e51e -3c0303b5 -3463038a -3902e694 -14430348 -00000000 -3c08011a -35080400 -3c03011a -34632856 -39022c56 -14430341 -00000000 -3c08c897 -35088c6c -3c03c897 -3463f36c -39027f00 -1443033a -00000000 -3c08330d -35083704 -3c03330d -346382a7 -3902b5a3 -14430333 -00000000 -3c08a1d1 -35083000 -3c03a1d1 -3463426e -3902726e -1443032c -00000000 -3c08d2c3 -35083998 -3c03d2c3 -3463652c -39025cb4 -14430325 -00000000 -3c08efc6 -3508bfc8 -3c03efc6 -34631852 -3902a79a -1443031e -00000000 -3c08f079 -35089810 -3c03f079 -3463aed1 -390236c1 -14430317 -00000000 -3c081728 -35086f40 -3c031728 -3463e212 -39028d52 -14430310 -00000000 -3c08af9a -35083039 -3c03af9a -3463d70a -3902e733 -14430309 -00000000 -3c081123 -3508ed00 -3c031123 -3463b180 -39025c80 -14430302 -00000000 -3c08b229 -35081b00 -3c03b229 -3463726e -3902696e -144302fb -00000000 -3c08ea53 -3508a8fa -3c03ea53 -3463c848 -390260b2 -144302f4 -00000000 -3c0867cb -350864f5 -3c0367cb -3463f109 -390295fc -144302ed -00000000 -3c080037 -3508fc20 -3c030037 -34638255 -39027e75 -144302e6 -00000000 -3c08b7e1 -350897c8 -3c03b7e1 -3463a318 -390234d0 -144302df -00000000 -3c08d994 -3508d5cd -3c03d994 -34631a63 -3902cfae -144302d8 -00000000 -3c082f4e -3508bfd0 -3c032f4e -34636f98 -3902d048 -144302d1 -00000000 -3c088788 -3508a528 -3c038788 -3463a210 -39020738 -144302ca -00000000 -3c083343 -3508c212 -3c033343 -34637d66 -3902bf74 -144302c3 -00000000 -3c08c238 -3508ba00 -3c03c238 -346318fb -3902a2fb -144302bc -00000000 -3c0868db -35083cc5 -3c0368db -3463da35 -3902e6f0 -144302b5 -00000000 -3c08ccc7 -3508d200 -3c03ccc7 -34633083 -3902e283 -144302ae -00000000 -3c082bcf -3508a162 -3c032bcf -3463b705 -39021667 -144302a7 -00000000 -3c082458 -35082940 -3c032458 -34636694 -39024fd4 -144302a0 -00000000 -3c08cbc2 -350880c0 -3c03cbc2 -34637fec -3902ff2c -14430299 -00000000 -3c08d2f1 -3508abb0 -3c03d2f1 -3463a485 -39020f35 -14430292 -00000000 -3c08e729 -35081c4a -3c03e729 -3463ad7b -3902b131 -1443028b -00000000 -3c0823c6 -35087bdd -3c0323c6 -346314cd -39026f10 -14430284 -00000000 -3c0838c2 -3508e188 -3c0338c2 -346302c0 -3902e348 -1443027d -00000000 -3c08d773 -3508f2db -3c03d773 -34630ddc -3902ff07 -14430276 -00000000 -3c083ca1 -3508541a -3c033ca1 -34638598 -3902d182 -1443026f -00000000 -3c0811ee -350801e0 -3c0311ee -3463a138 -3902a0d8 -14430268 -00000000 -3c08be8c -35086ea0 -3c03be8c -346341e0 -39022f40 -14430261 -00000000 -3c08fe2a -35085f18 -3c03fe2a -34635f18 -39020000 -1443025a -00000000 -3c085d8f -3508ecc0 -3c035d8f -3463ecc0 -39020000 -14430253 -00000000 -3c08629e -350818f4 -3c03629e -346318f4 -39020000 -1443024c -00000000 -3c08bf9f -35089e88 -3c03bf9f -34639e88 -39020000 -14430245 -00000000 -3c0880e1 -35083969 -3c0380e1 -34633969 -39020000 -1443023e -00000000 -3c08188a -3508fd20 -3c03188a -3463fd20 -39020000 -14430237 -00000000 -3c086677 -35083ad0 -3c036677 -34633ad0 -39020000 -14430230 -00000000 -3c08bd00 -35082d78 -3c03bd00 -34632d78 -39020000 -14430229 -00000000 -3c082309 -3508efac -3c032309 -3463efac -39020000 -14430222 -00000000 -3c08214b -3508b0c0 -3c03214b -3463b0c0 -39020000 -1443021b -00000000 -3c0870b6 -35086650 -3c0370b6 -34636650 -39020000 -14430214 -00000000 -3c08961a -3508aab8 -3c03961a -3463aab8 -39020000 -1443020d -00000000 -3c08347d -3508d2a2 -3c03347d -3463d2a2 -39020000 -14430206 -00000000 -3c086fe4 -35080f00 -3c036fe4 -34630f00 -39020000 -144301ff -00000000 -3c0889aa -3508c5c0 -3c0389aa -3463c5c0 -39020000 -144301f8 -00000000 -3c086ee9 -3508a990 -3c036ee9 -3463a990 -39020000 -144301f1 -00000000 -3c08636c -35082ebc -3c03636c -34632ebc -39020000 -144301ea -00000000 -3c08ff5d -3508d5cc -3c03ff5d -3463d5cc -39020000 -144301e3 -00000000 -3c0834a6 -3508426e -3c0334a6 -3463426e -39020000 -144301dc -00000000 -3c08ccb4 -35086c87 -3c03ccb4 -34636c87 -39020000 -144301d5 -00000000 -3c080e0e -35084962 -3c030e0e -34634962 -39020000 -144301ce -00000000 -3c0885ec -3508db21 -3c0385ec -3463db21 -39020000 -144301c7 -00000000 -3c08bbe8 -35084760 -3c03bbe8 -34634760 -39020000 -144301c0 -00000000 -3c081956 -35088250 -3c031956 -34638250 -39020000 -144301b9 -00000000 -3c080f69 -3508f5c4 -3c030f69 -3463f5c4 -39020000 -144301b2 -00000000 -3c089f14 -3508f1e1 -3c039f14 -3463f1e1 -39020000 -144301ab -00000000 -3c084f22 -3508541c -3c034f22 -3463541c -39020000 -144301a4 -00000000 -3c087922 -35086200 -3c037922 -34636200 -39020000 -1443019d -00000000 -3c084731 -35087d40 -3c034731 -34637d40 -39020000 -14430196 -00000000 -3c08f314 -3508cdd6 -3c03f314 -3463cdd6 -39020000 -1443018f -00000000 -3c0849d1 -350856e0 -3c0349d1 -346356e0 -39020000 -14430188 -00000000 -3c084740 -350820d6 -3c034740 -346320d6 -39020000 -14430181 -00000000 -3c083a80 -3508da50 -3c033a80 -3463da50 -39020000 -1443017a -00000000 -3c085b24 -3508a2d7 -3c035b24 -3463a2d7 -39020000 -14430173 -00000000 -3c08c60e -350808d4 -3c03c60e -346308d4 -39020000 -1443016c -00000000 -3c088a93 -3508a68c -3c038a93 -3463a68c -39020000 -14430165 -00000000 -3c0898c5 -350889ba -3c0398c5 -346389ba -39020000 -1443015e -00000000 -3c0814f4 -3508dc08 -3c0314f4 -3463dc08 -39020000 -14430157 -00000000 -3c08dc9a -35080398 -3c03dc9a -34630398 -39020000 -14430150 -00000000 -3c085785 -35080870 -3c035785 -34630870 -39020000 -14430149 -00000000 -3c089411 -3508ecad -3c039411 -3463ecad -39020000 -14430142 -00000000 -3c08918b -3508e1ef -3c03918b -3463e1ef -39020000 -1443013b -00000000 -3c08b47c -3508ced9 -3c03b47c -3463ced9 -39020000 -14430134 -00000000 -3c084bbe -3508dad2 -3c034bbe -3463dad2 -39020000 -1443012d -00000000 -3c080e54 -3508c7f0 -3c030e54 -3463c7f0 -39020000 -14430126 -00000000 -3c08ebaf -350886d8 -3c03ebaf -346386d8 -39020000 -1443011f -00000000 -3c08e82f -3508bf0e -3c03e82f -3463bf0e -39020000 -14430118 -00000000 -3c081cb3 -3508f250 -3c031cb3 -3463f250 -39020000 -14430111 -00000000 -3c0875f9 -35089ed0 -3c0375f9 -34639ed0 -39020000 -1443010a -00000000 -3c0895fb -350846f8 -3c0395fb -346346f8 -39020000 -14430103 -00000000 -24080000 -240329f4 -390229f4 -144300fe -00000000 -24080000 -3403d098 -3902d098 -144300f9 -00000000 -24080000 -24037701 -39027701 -144300f4 -00000000 -24080000 -24032f1d -39022f1d -144300ef -00000000 -24080000 -2403779e -3902779e -144300ea -00000000 -24080000 -24032ec9 -39022ec9 -144300e5 -00000000 -24080000 -3403a0a4 -3902a0a4 -144300e0 -00000000 -24080000 -240366b6 -390266b6 -144300db -00000000 -24080000 -3403d5c4 -3902d5c4 -144300d6 -00000000 -24080000 -24037f41 -39027f41 -144300d1 -00000000 -24080000 -3403e5cc -3902e5cc -144300cc -00000000 -24080000 -3403a94c -3902a94c -144300c7 -00000000 -24080000 -24037f06 -39027f06 -144300c2 -00000000 -24080000 -24037f84 -39027f84 -144300bd -00000000 -24080000 -24034a4d -39024a4d -144300b8 -00000000 -24080000 -3403def8 -3902def8 -144300b3 -00000000 -24080000 -24033804 -39023804 -144300ae -00000000 -24080000 -3403f9d0 -3902f9d0 -144300a9 -00000000 -24080000 -3403f394 -3902f394 -144300a4 -00000000 -24080000 -34038383 -39028383 -1443009f -00000000 -24080000 -3403bec8 -3902bec8 -1443009a -00000000 -24080000 -3403d9a8 -3902d9a8 -14430095 -00000000 -24080000 -3403c10a -3902c10a -14430090 -00000000 -24080000 -34039362 -39029362 -1443008b -00000000 -24080000 -3403c5c6 -3902c5c6 -14430086 -00000000 -24080000 -24031764 -39021764 -14430081 -00000000 -24080000 -3403b690 -3902b690 -1443007c -00000000 -24080000 -24037309 -39027309 -14430077 -00000000 -24080000 -24031748 -39021748 -14430072 -00000000 -24080000 -24035fa0 -39025fa0 -1443006d -00000000 -24080000 -240307ec -390207ec -14430068 -00000000 -24080000 -3403feaa -3902feaa -14430063 -00000000 -24080000 -24031f26 -39021f26 -1443005e -00000000 -24080000 -3403c9ad -3902c9ad -14430059 -00000000 -24080000 -34039baf -39029baf -14430054 -00000000 -24080000 -3403a726 -3902a726 -1443004f -00000000 -24080000 -3403b432 -3902b432 -1443004a -00000000 -24080000 -2403766e -3902766e -14430045 -00000000 -24080000 -3403eff0 -3902eff0 -14430040 -00000000 -24080000 -240304ce -390204ce -1443003b -00000000 -24080000 -3403be24 -3902be24 -14430036 -00000000 -24080000 -3403e1e1 -3902e1e1 -14430031 -00000000 -24080000 -3403ed90 -3902ed90 -1443002c -00000000 -24080000 -34038a2d -39028a2d -14430027 -00000000 -24080000 -2403205c -3902205c -14430022 -00000000 -24080000 -240322a8 -390222a8 -1443001d -00000000 -24080000 -2403016d -3902016d -14430018 -00000000 -24080000 -24031502 -39021502 -14430013 -00000000 -24080000 -24034ac5 -39024ac5 -1443000e -00000000 -24080000 -3403d918 -3902d918 -14430009 -00000000 -24080000 -24030000 -39020000 -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -26100001 -3c08800d -40805800 -3c170040 -40976000 -00000000 -24120001 -3c170001 -ad120000 -3c14bfc1 -2694a3dc -040100af -0000000c -165700ad -00000000 -24120001 -3c14bfc1 -2694a3f8 -050100a8 -0000000c -165700a6 -00000000 -24120002 -3c170002 -ad120000 -3c14bfc1 -2694a41c -0401009f -0000000d -1657009d -00000000 -24120002 -3c14bfc1 -2694a438 -05010098 -0000000d -16570096 -00000000 -24120003 -3c170003 -ad120000 -3c14bfc1 -2694a46c -3c04ba03 -34844f60 -3c05b615 -34a5fd67 -0401008b -0085b820 -16570089 -00000000 -24120003 -3c14bfc1 -2694a488 -05010084 -0085b820 -ad170000 -16570081 -00000000 -24120003 -ad120000 -3c14bfc1 -2694a4b4 -3c047fff -3484c19e -04010079 -20976512 -16570077 -00000000 -24120003 -3c14bfc1 -2694a4d0 -05010072 -20976512 -16570070 -00000000 -24120003 -3c14bfc1 -2694a4fc -3c04a85e -34847d00 -3c056b7e -34a58e36 -04010067 -0085b822 -16570065 -00000000 -24120003 -3c14bfc1 -2694a518 -05010060 -0085b822 -1657005e -00000000 -24120004 -3c170004 -ad120000 -3c14bfc1 -2694a53c -04010057 -8d170002 -16570055 -00000000 -24120004 -3c14bfc1 -2694a558 -05010050 -8d170002 -1657004e -00000000 -24120004 -3c14bfc1 -2694a574 -04010049 -85170001 -02f2001b -16570046 -00000000 -24120004 -3c14bfc1 -2694a594 -05010041 -85170001 -1657003f -00000000 -3c14bfc1 -2694a5ac -0401003b -95170003 -16570039 -00000000 -24120004 -3c14bfc1 -2694a5c8 -05010034 -95170003 -16570032 -00000000 -24120005 -3c170005 -ad120000 -3c14bfc1 -2694a5ec -0401002b -ad170002 -16570029 -00000000 -24120005 -3c14bfc1 -2694a608 -05010024 -ad170002 -16570022 -00000000 -24120005 -3c14bfc1 -2694a624 -0401001d -a5170001 -1657001b -00000000 -24120005 -3c14bfc1 -2694a640 -05010016 -a5170001 -16570014 -00000000 -24120007 -3c170007 -ad120000 -3c14bfc1 -2694a664 -0401000d -9e3c56aa -02f20018 -1657000a -00000000 -24120007 -3c14bfc1 -2694a688 -02f20018 -05010004 -ec1ba960 -16570002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -24120000 -3c080151 -3508e5c0 -3c030151 -34639f05 -2102b945 -144307d2 -00000000 -3c086482 -35081568 -3c036481 -3463f98b -2102e423 -144307cb -00000000 -3c08f487 -35086ad2 -3c03f487 -346327f2 -2102bd20 -144307c4 -00000000 -3c081fea -35084dca -3c031fea -346368d2 -21021b08 -144307bd -00000000 -3c08a139 -3508a6db -3c03a139 -3463aa77 -2102039c -144307b6 -00000000 -3c084557 -35081c50 -3c034557 -34630ff8 -2102f3a8 -144307af -00000000 -3c0851ab -350823a0 -3c0351aa -3463f610 -2102d270 -144307a8 -00000000 -3c08d4e4 -35085ee7 -3c03d4e4 -3463c55c -21026675 -144307a1 -00000000 -3c08d18c -350816f3 -3c03d18c -34630e9c -2102f7a9 -1443079a -00000000 -3c087675 -3508a804 -3c037675 -3463298a -21028186 -14430793 -00000000 -3c084584 -350885a8 -3c034584 -3463dd50 -210257a8 -1443078c -00000000 -3c0852bd -35088c72 -3c0352bd -3463ef12 -210262a0 -14430785 -00000000 -3c08c96a -3508c0d3 -3c03c96a -3463691d -2102a84a -1443077e -00000000 -3c08e9b6 -35088570 -3c03e9b6 -3463e7c8 -21026258 -14430777 -00000000 -3c083d8c -35084400 -3c033d8c -346307cd -2102c3cd -14430770 -00000000 -3c0867a7 -35081a80 -3c0367a7 -34637306 -21025886 -14430769 -00000000 -3c08c4a3 -3508a594 -3c03c4a3 -34633529 -21028f95 -14430762 -00000000 -3c085a7c -35087374 -3c035a7c -34630991 -2102961d -1443075b -00000000 -3c085aab -3508699a -3c035aab -3463305e -2102c6c4 -14430754 -00000000 -3c081ff4 -3508330c -3c031ff4 -34631840 -2102e534 -1443074d -00000000 -3c08082b -3508cd60 -3c03082b -3463f8d8 -21022b78 -14430746 -00000000 -3c089c9e -35081220 -3c039c9d -3463e07e -2102ce5e -1443073f -00000000 -3c083151 -3508da50 -3c033151 -34637b90 -2102a140 -14430738 -00000000 -3c08f3c5 -3508a870 -3c03f3c5 -3463e8b0 -21024040 -14430731 -00000000 -3c0873bb -35080fee -3c0373bb -3463458e -210235a0 -1443072a -00000000 -3c0885d9 -3508c268 -3c0385da -34631960 -210256f8 -14430723 -00000000 -3c08bdb8 -35082bd1 -3c03bdb8 -34637721 -21024b50 -1443071c -00000000 -3c086144 -35087354 -3c036144 -34632b34 -2102b7e0 -14430715 -00000000 -3c08c6b1 -35081000 -3c03c6b0 -3463a0d4 -210290d4 -1443070e -00000000 -3c08afd1 -35082ba4 -3c03afd1 -346341b6 -21021612 -14430707 -00000000 -3c089cc9 -3508c1d0 -3c039cc9 -346354de -2102930e -14430700 -00000000 -3c0830b8 -35085a68 -3c0330b8 -34631c18 -2102c1b0 -144306f9 -00000000 -3c08ec88 -3508b498 -3c03ec88 -34633d8e -210288f6 -144306f2 -00000000 -3c088265 -35082c2f -3c038265 -34636b12 -21023ee3 -144306eb -00000000 -3c087bf0 -3508a346 -3c037bf0 -34633d73 -21029a2d -144306e4 -00000000 -3c0824fd -3508ce96 -3c0324fd -34636296 -21029400 -144306dd -00000000 -3c08415d -350868a0 -3c03415d -3463d3e4 -21026b44 -144306d6 -00000000 -3c08d39b -350890a4 -3c03d39b -34637cb8 -2102ec14 -144306cf -00000000 -3c08c057 -3508761c -3c03c057 -34636a06 -2102f3ea -144306c8 -00000000 -3c081dd7 -35089b95 -3c031dd7 -3463ba4d -21021eb8 -144306c1 -00000000 -3c08c867 -3508e930 -3c03c867 -3463751e -21028bee -144306ba -00000000 -3c08b833 -3508fdf2 -3c03b834 -346372d2 -210274e0 -144306b3 -00000000 -3c088b8d -3508cf70 -3c038b8d -346366e5 -21029775 -144306ac -00000000 -3c08b675 -3508c5e0 -3c03b676 -34633c4b -2102766b -144306a5 -00000000 -3c08214a -3508e000 -3c03214b -3463186a -2102386a -1443069e -00000000 -3c083b1e -3508e7a0 -3c033b1f -34633910 -21025170 -14430697 -00000000 -3c084434 -3508d95c -3c034435 -34631da0 -21024444 -14430690 -00000000 -3c0829b8 -35085e98 -3c0329b7 -3463def2 -2102805a -14430689 -00000000 -3c08ff5f -3508a9cc -3c03ff5f -3463ff14 -21025548 -14430682 -00000000 -3c083773 -3508e968 -3c033774 -34635810 -21026ea8 -1443067b -00000000 -3c08fcf8 -3508f94c -3c03fcf8 -3463b6eb -2102bd9f -14430674 -00000000 -3c085926 -3508be78 -3c035926 -3463d7e0 -21021968 -1443066d -00000000 -3c08c211 -350835e4 -3c03c211 -346364a5 -21022ec1 -14430666 -00000000 -3c08d7ad -3508a528 -3c03d7ad -34636805 -2102c2dd -1443065f -00000000 -3c087429 -35089f8a -3c037429 -3463eba7 -21024c1d -14430658 -00000000 -3c08c7b0 -350822b2 -3c03c7b0 -34632332 -21020080 -14430651 -00000000 -3c083f9f -3508fe80 -3c033f9f -3463eb00 -2102ec80 -1443064a -00000000 -3c08fed9 -3508c020 -3c03fed9 -3463ff30 -21023f10 -14430643 -00000000 -3c08b803 -35089474 -3c03b803 -3463f483 -2102600f -1443063c -00000000 -3c087804 -350809ce -3c037803 -3463ae02 -2102a434 -14430635 -00000000 -3c08d6d6 -3508e944 -3c03d6d6 -3463b0da -2102c796 -1443062e -00000000 -3c0849dc -3508b574 -3c0349dd -3463242b -21026eb7 -14430627 -00000000 -3c08db1d -35084000 -3c03db1d -34630136 -2102c136 -14430620 -00000000 -3c085496 -350826b2 -3c035496 -346339d2 -21021320 -14430619 -00000000 -3c087377 -350835c0 -3c037377 -346332cc -2102fd0c -14430612 -00000000 -3c08fee6 -3508ef20 -3c03fee6 -3463c89c -2102d97c -1443060b -00000000 -3c087b17 -35088120 -3c037b17 -3463a4b6 -21022396 -14430604 -00000000 -3c08c228 -350838ec -3c03c227 -3463f3e3 -2102baf7 -144305fd -00000000 -3c08eafc -3508bbc0 -3c03eafd -346321d0 -21026610 -144305f6 -00000000 -3c08d3e8 -35089922 -3c03d3e8 -3463ee4a -21025528 -144305ef -00000000 -3c08d0e1 -3508acd4 -3c03d0e1 -3463443d -21029769 -144305e8 -00000000 -3c08719a -35088fb2 -3c03719a -3463acae -21021cfc -144305e1 -00000000 -3c089d71 -35087a82 -3c039d71 -34639df6 -21022374 -144305da -00000000 -3c0869bb -35086dd8 -3c0369bb -34633931 -2102cb59 -144305d3 -00000000 -3c0857e2 -3508d92c -3c0357e2 -3463c770 -2102ee44 -144305cc -00000000 -3c082aaf -3508b760 -3c032ab0 -34632678 -21026f18 -144305c5 -00000000 -3c08dbd1 -35085be3 -3c03dbd1 -34636e63 -21021280 -144305be -00000000 -3c087206 -35086f32 -3c037206 -34638c43 -21021d11 -144305b7 -00000000 -3c0828ae -3508ccb8 -3c0328ae -3463c9e8 -2102fd30 -144305b0 -00000000 -3c08d4ff -3508f733 -3c03d500 -34633d0b -210245d8 -144305a9 -00000000 -3c089c2b -3508d862 -3c039c2b -34637470 -21029c0e -144305a2 -00000000 -3c086264 -3508e5f0 -3c036264 -3463b9a0 -2102d3b0 -1443059b -00000000 -3c081aee -35082654 -3c031aed -3463d65a -2102b006 -14430594 -00000000 -3c08cfe5 -3508e6f4 -3c03cfe5 -3463a53f -2102be4b -1443058d -00000000 -3c082926 -35087cec -3c032926 -3463b924 -21023c38 -14430586 -00000000 -3c082580 -350849d6 -3c032580 -34631b93 -2102d1bd -1443057f -00000000 -3c08e8dc -350862c0 -3c03e8dc -346330d6 -2102ce16 -14430578 -00000000 -3c08cc78 -3508608c -3c03cc77 -3463f81c -21029790 -14430571 -00000000 -3c085dea -3508681e -3c035dea -346374d2 -21020cb4 -1443056a -00000000 -3c08c780 -35088052 -3c03c780 -3463a092 -21022040 -14430563 -00000000 -3c0832a9 -3508bd1a -3c0332a9 -34638334 -2102c61a -1443055c -00000000 -3c08215c -35084c38 -3c03215c -3463b86f -21026c37 -14430555 -00000000 -3c081e55 -35089998 -3c031e55 -34635dc9 -2102c431 -1443054e -00000000 -3c083850 -350800c4 -3c033850 -34637e2c -21027d68 -14430547 -00000000 -3c086203 -3508d8b0 -3c036204 -346316c6 -21023e16 -14430540 -00000000 -3c08f96e -35086418 -3c03f96e -346300bf -21029ca7 -14430539 -00000000 -3c08b8b1 -3508c057 -3c03b8b2 -34632d5d -21026d06 -14430532 -00000000 -3c08145a -3508c108 -3c03145a -3463808c -2102bf84 -1443052b -00000000 -3c089693 -35080314 -3c039693 -346343be -210240aa -14430524 -00000000 -3c083b87 -35088510 -3c033b88 -34630040 -21027b30 -1443051d -00000000 -3c08a552 -3508b361 -3c03a552 -3463a4c8 -2102f167 -14430516 -00000000 -3c08ded9 -3508f604 -3c03deda -3463054d -21020f49 -1443050f -00000000 -3c08b299 -35080762 -3c03b299 -34637464 -21026d02 -14430508 -00000000 -3c08bd4b -35089c87 -3c03bd4b -34639f5f -210202d8 -14430501 -00000000 -3c088453 -35085734 -3c038453 -34631294 -2102bb60 -144304fa -00000000 -3c081cbe -35088e60 -3c031cbe -3463f92c -21026acc -144304f3 -00000000 -3c0817bd -3508eef0 -3c0317be -34633534 -21024644 -144304ec -00000000 -3c080b15 -350805c0 -3c030b15 -346345c0 -21024000 -144304e5 -00000000 -3c088d45 -35085444 -3c038d44 -3463f51e -2102a0da -144304de -00000000 -3c083b86 -35085e84 -3c033b86 -3463bb0d -21025c89 -144304d7 -00000000 -3c08fe2e -35089704 -3c03fe2e -34637c28 -2102e524 -144304d0 -00000000 -3c08810f -35089a90 -3c03810f -3463703a -2102d5aa -144304c9 -00000000 -3c08729a -350855e7 -3c03729a -3463b9b8 -210263d1 -144304c2 -00000000 -3c087dda -3508e5cf -3c037ddb -34633362 -21024d93 -144304bb -00000000 -3c084485 -3508c05e -3c034485 -34639156 -2102d0f8 -144304b4 -00000000 -3c08a2cd -350875d0 -3c03a2cd -34633a0c -2102c43c -144304ad -00000000 -3c0829dd -350899fa -3c0329dd -34631f44 -2102854a -144304a6 -00000000 -3c08597a -35085200 -3c03597a -34633d96 -2102eb96 -1443049f -00000000 -3c083f61 -3508ed98 -3c033f62 -34633de4 -2102504c -14430498 -00000000 -3c087c03 -3508729a -3c037c03 -34636aa9 -2102f80f -14430491 -00000000 -3c08f998 -35089018 -3c03f998 -34631064 -2102804c -1443048a -00000000 -3c086c5f -3508982c -3c036c5f -34634d2d -2102b501 -14430483 -00000000 -3c08df25 -3508dc18 -3c03df25 -3463e79d -21020b85 -1443047c -00000000 -3c089282 -35087704 -3c039282 -3463c420 -21024d1c -14430475 -00000000 -3c082fd2 -3508bbd5 -3c032fd2 -3463ae69 -2102f294 -1443046e -00000000 -3c088592 -3508e65e -3c038593 -34632dba -2102475c -14430467 -00000000 -3c08e7b1 -3508c100 -3c03e7b2 -3463391c -2102781c -14430460 -00000000 -3c089f92 -3508ef00 -3c039f92 -3463c9a4 -2102daa4 -14430459 -00000000 -3c08dd57 -3508b6b8 -3c03dd57 -3463ad61 -2102f6a9 -14430452 -00000000 -3c088167 -3508e198 -3c038167 -3463f161 -21020fc9 -1443044b -00000000 -3c084631 -350886ee -3c034631 -34634ade -2102c3f0 -14430444 -00000000 -3c081dbf -35089f18 -3c031dbf -34638e2c -2102ef14 -1443043d -00000000 -3c08526b -35081b50 -3c03526b -3463329c -2102174c -14430436 -00000000 -3c087c24 -35089fb9 -3c037c24 -3463aa41 -21020a88 -1443042f -00000000 -3c08acc1 -3508d76c -3c03acc2 -346309ac -21023240 -14430428 -00000000 -3c08dbcf -3508a630 -3c03dbcf -3463eb66 -21024536 -14430421 -00000000 -3c08baa5 -35082f90 -3c03baa4 -3463e8a8 -2102b918 -1443041a -00000000 -3c08dc9b -35089fed -3c03dc9b -34636633 -2102c646 -14430413 -00000000 -3c086fa1 -350866ac -3c036fa1 -34637dbb -2102170f -1443040c -00000000 -3c08345c -3508cf3c -3c03345c -34635f14 -21028fd8 -14430405 -00000000 -3c08737e -35084d08 -3c03737d -3463e5e4 -210298dc -144303fe -00000000 -3c08ff7a -3508fc4d -3c03ff7a -34639585 -21029938 -144303f7 -00000000 -3c085677 -3508bb0f -3c035677 -3463565d -21029b4e -144303f0 -00000000 -3c084f98 -35088da1 -3c034f98 -346399f8 -21020c57 -144303e9 -00000000 -3c0888f3 -3508019a -3c0388f2 -3463f992 -2102f7f8 -144303e2 -00000000 -3c080190 -350821c0 -3c03018f -3463ea30 -2102c870 -144303db -00000000 -3c08c95a -3508e608 -3c03c95a -3463c2c8 -2102dcc0 -144303d4 -00000000 -3c084e04 -35080790 -3c034e04 -34635f27 -21025797 -144303cd -00000000 -3c0805fb -350811f4 -3c0305fb -34632648 -21021454 -144303c6 -00000000 -3c083c38 -350831da -3c033c38 -3463778e -210245b4 -144303bf -00000000 -3c08c0d1 -3508d947 -3c03c0d1 -34638de3 -2102b49c -144303b8 -00000000 -3c082d9d -35086978 -3c032d9d -34634da7 -2102e42f -144303b1 -00000000 -3c08f670 -35084b63 -3c03f670 -34637c0f -210230ac -144303aa -00000000 -3c08c8f1 -35082ee0 -3c03c8f1 -34634229 -21021349 -144303a3 -00000000 -3c086235 -35082180 -3c036235 -3463783b -210256bb -1443039c -00000000 -3c084f9f -350807c0 -3c034f9f -34635808 -21025048 -14430395 -00000000 -3c08996b -3508ff6f -3c03996b -3463b7c1 -2102b852 -1443038e -00000000 -3c086336 -3508a506 -3c036337 -34631b33 -2102762d -14430387 -00000000 -3c0846a9 -3508a3c8 -3c0346aa -34631dd8 -21027a10 -14430380 -00000000 -3c0864bd -35084600 -3c0364bd -346324b0 -2102deb0 -14430379 -00000000 -3c089231 -35089e67 -3c039231 -34634dc3 -2102af5c -14430372 -00000000 -3c086cae -3508c316 -3c036caf -34631986 -21025670 -1443036b -00000000 -3c0855a5 -3508eb38 -3c0355a5 -3463a6b8 -2102bb80 -14430364 -00000000 -3c0806fd -3508d3af -3c0306fd -3463f8c1 -21022512 -1443035d -00000000 -3c08a3b1 -35089490 -3c03a3b1 -34638713 -2102f283 -14430356 -00000000 -3c0882af -350831b6 -3c0382af -346360b8 -21022f02 -1443034f -00000000 -3c086708 -3508baac -3c036708 -34633f7c -210284d0 -14430348 -00000000 -3c08caca -3508acc0 -3c03cacb -34632c30 -21027f70 -14430341 -00000000 -3c08ad80 -3508136f -3c03ad7f -3463b3d5 -2102a066 -1443033a -00000000 -3c081043 -35084714 -3c031043 -34630df4 -2102c6e0 -14430333 -00000000 -3c081573 -35088c00 -3c031573 -3463472b -2102bb2b -1443032c -00000000 -3c0840d9 -350818c7 -3c0340d9 -3463116f -2102f8a8 -14430325 -00000000 -3c084d54 -3508c800 -3c034d54 -34636c2c -2102a42c -1443031e -00000000 -3c08710c -3508e180 -3c03710c -3463b2f6 -2102d176 -14430317 -00000000 -3c088a0c -35082d90 -3c038a0c -3463a494 -21027704 -14430310 -00000000 -3c089d03 -3508ef78 -3c039d04 -34630f89 -21022011 -14430309 -00000000 -3c0800a0 -3508124c -3c0300a0 -3463349f -21022253 -14430302 -00000000 -3c08548e -3508f2a6 -3c03548f -34630f8e -21021ce8 -144302fb -00000000 -3c082267 -35086612 -3c032267 -3463a911 -210242ff -144302f4 -00000000 -3c088f54 -35081d96 -3c038f54 -34631a7a -2102fce4 -144302ed -00000000 -3c0848d6 -350843e8 -3c0348d6 -34631284 -2102ce9c -144302e6 -00000000 -3c083c3a -35086780 -3c033c3a -34636dd2 -21020652 -144302df -00000000 -3c08933f -350829c2 -3c03933f -34632c55 -21020293 -144302d8 -00000000 -3c08759a -3508613e -3c03759a -3463cc55 -21026b17 -144302d1 -00000000 -3c082ca8 -35084503 -3c032ca8 -34638c33 -21024730 -144302ca -00000000 -3c086ec8 -3508e770 -3c036ec8 -3463de91 -2102f721 -144302c3 -00000000 -3c0822b5 -35087c97 -3c0322b5 -3463b2bc -21023625 -144302bc -00000000 -3c0805d4 -3508b1b4 -3c0305d4 -3463579e -2102a5ea -144302b5 -00000000 -3c08c610 -35083de8 -3c03c60f -3463f413 -2102b62b -144302ae -00000000 -3c08cc6c -3508bc66 -3c03cc6d -346316e7 -21025a81 -144302a7 -00000000 -3c08505e -3508d600 -3c03505e -3463840a -2102ae0a -144302a0 -00000000 -3c08d969 -35085bc0 -3c03d969 -3463090c -2102ad4c -14430299 -00000000 -3c08bcf9 -3508a40a -3c03bcf9 -3463ec2e -21024824 -14430292 -00000000 -3c0860e2 -35081e48 -3c0360e2 -34636af5 -21024cad -1443028b -00000000 -3c08dbaa -3508fa0a -3c03dbab -346364c2 -21026ab8 -14430284 -00000000 -3c0893a1 -35089838 -3c0393a1 -3463dca2 -2102446a -1443027d -00000000 -3c08a815 -350832af -3c03a815 -34636e9f -21023bf0 -14430276 -00000000 -3c0895cf -35083f04 -3c0395ce -3463ef0b -2102b007 -1443026f -00000000 -3c082493 -35086e58 -3c032492 -3463fe9a -21029042 -14430268 -00000000 -3c08bcbf -3508dbe0 -3c03bcbf -3463d2a0 -2102f6c0 -14430261 -00000000 -3c08d33b -350801eb -3c03d33b -346301eb -21020000 -1443025a -00000000 -3c08e77f -3508bd50 -3c03e77f -3463bd50 -21020000 -14430253 -00000000 -3c08048a -3508c180 -3c03048a -3463c180 -21020000 -1443024c -00000000 -3c086b80 -35085e70 -3c036b80 -34635e70 -21020000 -14430245 -00000000 -3c080bf6 -35082560 -3c030bf6 -34632560 -21020000 -1443023e -00000000 -3c080f61 -3508c17a -3c030f61 -3463c17a -21020000 -14430237 -00000000 -3c080129 -350801a0 -3c030129 -346301a0 -21020000 -14430230 -00000000 -3c0875c7 -35081bfc -3c0375c7 -34631bfc -21020000 -14430229 -00000000 -3c0833c0 -35082734 -3c0333c0 -34632734 -21020000 -14430222 -00000000 -3c08acd9 -3508a7a0 -3c03acd9 -3463a7a0 -21020000 -1443021b -00000000 -3c08f1f3 -3508efa4 -3c03f1f3 -3463efa4 -21020000 -14430214 -00000000 -3c08b581 -350863f6 -3c03b581 -346363f6 -21020000 -1443020d -00000000 -3c0890eb -35089000 -3c0390eb -34639000 -21020000 -14430206 -00000000 -3c08f10b -35080ab0 -3c03f10b -34630ab0 -21020000 -144301ff -00000000 -3c089857 -3508c6d8 -3c039857 -3463c6d8 -21020000 -144301f8 -00000000 -3c080fae -3508514e -3c030fae -3463514e -21020000 -144301f1 -00000000 -3c08027a -3508edac -3c03027a -3463edac -21020000 -144301ea -00000000 -3c0898e5 -35088646 -3c0398e5 -34638646 -21020000 -144301e3 -00000000 -3c084902 -35089d00 -3c034902 -34639d00 -21020000 -144301dc -00000000 -3c0830ef -350889dc -3c0330ef -346389dc -21020000 -144301d5 -00000000 -3c08f063 -3508c6b4 -3c03f063 -3463c6b4 -21020000 -144301ce -00000000 -3c086ba4 -35084dc0 -3c036ba4 -34634dc0 -21020000 -144301c7 -00000000 -3c080be2 -35081350 -3c030be2 -34631350 -21020000 -144301c0 -00000000 -3c087697 -3508ce00 -3c037697 -3463ce00 -21020000 -144301b9 -00000000 -3c08e32b -35082eb4 -3c03e32b -34632eb4 -21020000 -144301b2 -00000000 -3c08bd35 -3508a8ec -3c03bd35 -3463a8ec -21020000 -144301ab -00000000 -3c081a49 -35084b90 -3c031a49 -34634b90 -21020000 -144301a4 -00000000 -3c08194f -35081c52 -3c03194f -34631c52 -21020000 -1443019d -00000000 -3c0843c7 -35086e00 -3c0343c7 -34636e00 -21020000 -14430196 -00000000 -3c081666 -3508c310 -3c031666 -3463c310 -21020000 -1443018f -00000000 -3c08a44f -3508bf60 -3c03a44f -3463bf60 -21020000 -14430188 -00000000 -3c086c9c -3508ad6e -3c036c9c -3463ad6e -21020000 -14430181 -00000000 -3c0878c8 -3508099c -3c0378c8 -3463099c -21020000 -1443017a -00000000 -3c086f85 -35085e10 -3c036f85 -34635e10 -21020000 -14430173 -00000000 -3c083af0 -3508f50c -3c033af0 -3463f50c -21020000 -1443016c -00000000 -3c085aec -3508f84e -3c035aec -3463f84e -21020000 -14430165 -00000000 -3c08a5c3 -35080c48 -3c03a5c3 -34630c48 -21020000 -1443015e -00000000 -3c0835a0 -3508c0b4 -3c0335a0 -3463c0b4 -21020000 -14430157 -00000000 -3c08b9a0 -350857d3 -3c03b9a0 -346357d3 -21020000 -14430150 -00000000 -3c084dec -35085d00 -3c034dec -34635d00 -21020000 -14430149 -00000000 -3c08b51d -35089f68 -3c03b51d -34639f68 -21020000 -14430142 -00000000 -3c087bff -35084ea0 -3c037bff -34634ea0 -21020000 -1443013b -00000000 -3c08019a -350899ac -3c03019a -346399ac -21020000 -14430134 -00000000 -3c08f3f5 -3508ae48 -3c03f3f5 -3463ae48 -21020000 -1443012d -00000000 -3c0883cc -35089b04 -3c0383cc -34639b04 -21020000 -14430126 -00000000 -3c081eca -3508a2e0 -3c031eca -3463a2e0 -21020000 -1443011f -00000000 -3c08ee7b -35086128 -3c03ee7b -34636128 -21020000 -14430118 -00000000 -3c08c5b2 -350869aa -3c03c5b2 -346369aa -21020000 -14430111 -00000000 -3c081b6b -35082228 -3c031b6b -34632228 -21020000 -1443010a -00000000 -3c0800d6 -35081b80 -3c0300d6 -34631b80 -21020000 -14430103 -00000000 -24080000 -2403af9a -2102af9a -144300fe -00000000 -24080000 -240371fe -210271fe -144300f9 -00000000 -24080000 -24036f32 -21026f32 -144300f4 -00000000 -24080000 -24033d93 -21023d93 -144300ef -00000000 -24080000 -2403a928 -2102a928 -144300ea -00000000 -24080000 -2403c461 -2102c461 -144300e5 -00000000 -24080000 -240321e0 -210221e0 -144300e0 -00000000 -24080000 -2403b114 -2102b114 -144300db -00000000 -24080000 -24034030 -21024030 -144300d6 -00000000 -24080000 -2403f3cd -2102f3cd -144300d1 -00000000 -24080000 -2403c8e2 -2102c8e2 -144300cc -00000000 -24080000 -24034d75 -21024d75 -144300c7 -00000000 -24080000 -2403be00 -2102be00 -144300c2 -00000000 -24080000 -240370d0 -210270d0 -144300bd -00000000 -24080000 -240309a0 -210209a0 -144300b8 -00000000 -24080000 -2403440c -2102440c -144300b3 -00000000 -24080000 -24034b97 -21024b97 -144300ae -00000000 -24080000 -2403a8ca -2102a8ca -144300a9 -00000000 -24080000 -24035100 -21025100 -144300a4 -00000000 -24080000 -2403c3c4 -2102c3c4 -1443009f -00000000 -24080000 -2403f419 -2102f419 -1443009a -00000000 -24080000 -240371ee -210271ee -14430095 -00000000 -24080000 -24038808 -21028808 -14430090 -00000000 -24080000 -24033648 -21023648 -1443008b -00000000 -24080000 -24033e18 -21023e18 -14430086 -00000000 -24080000 -2403013e -2102013e -14430081 -00000000 -24080000 -24037180 -21027180 -1443007c -00000000 -24080000 -24034e94 -21024e94 -14430077 -00000000 -24080000 -2403106d -2102106d -14430072 -00000000 -24080000 -2403222d -2102222d -1443006d -00000000 -24080000 -24033634 -21023634 -14430068 -00000000 -24080000 -24039634 -21029634 -14430063 -00000000 -24080000 -2403deb4 -2102deb4 -1443005e -00000000 -24080000 -2403a4bd -2102a4bd -14430059 -00000000 -24080000 -24036238 -21026238 -14430054 -00000000 -24080000 -2403ef31 -2102ef31 -1443004f -00000000 -24080000 -2403a3a2 -2102a3a2 -1443004a -00000000 -24080000 -2403e5c8 -2102e5c8 -14430045 -00000000 -24080000 -24036770 -21026770 -14430040 -00000000 -24080000 -240374a2 -210274a2 -1443003b -00000000 -24080000 -2403f010 -2102f010 -14430036 -00000000 -24080000 -2403378a -2102378a -14430031 -00000000 -24080000 -2403dc3f -2102dc3f -1443002c -00000000 -24080000 -2403ad00 -2102ad00 -14430027 -00000000 -24080000 -2403f96c -2102f96c -14430022 -00000000 -24080000 -24035e1c -21025e1c -1443001d -00000000 -24080000 -24031642 -21021642 -14430018 -00000000 -24080000 -240341a8 -210241a8 -14430013 -00000000 -24080000 -2403dcc1 -2102dcc1 -1443000e -00000000 -24080000 -24033e0c -21023e0c -14430009 -00000000 -24080000 -24030000 -21020000 -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -26100001 -3c08800d -24120004 -ad120000 -40805800 -3c170040 -40976000 -00000000 -3c170004 -3c028003 -34420514 -3c038003 -34630514 -3c04800d -34840514 -3c050dc5 -34a5e542 -2487b239 -3c010001 -00240821 -ac25b238 -3c14bfc1 -2694c68c -9482b239 -1657009f -00000000 -1443009d -00000000 -40164000 -14f6009a -00000000 -24120004 -3c028003 -34422fbc -3c038003 -34632fbc -3c04800d -34842fbc -3c05f781 -34a52ae2 -24879c35 -3c010001 -00240821 -ac259c34 -3c14bfc1 -2694c6f0 -ad080004 -ad140004 -94829c35 -ad140000 -8d090004 -15340084 -00000000 -16570082 -00000000 -14430080 -00000000 -40164000 -14f6007d -00000000 -24120004 -ad120000 -24120004 -3c029134 -3442bbd0 -3c039134 -3463bbd0 -3c04800d -34847fa6 -3c059ef6 -34a55910 -2487537f -ac85537e -3c14bfc1 -2694c764 -01000011 -0110001b -9482537f -00004810 -11280068 -00000000 -16570066 -00000000 -14430064 -00000000 -40164000 -14f60061 -00000000 -24120004 -3c02fe29 -3442b934 -3c03fe29 -3463b934 -3c04800d -3484628c -3c05a15a -34a50146 -248756cf -ac8556cc -3c14bfc1 -2694c7c4 -948256cf -0208001b -16570050 -00000000 -1443004e -00000000 -40164000 -14f6004b -00000000 -24120004 -3c028003 -344224b4 -3c038003 -346324b4 -3c04800d -348424b4 -3c05566d -34a5adc2 -2487d5c3 -3c010001 -00240821 -ac25d5c0 -3c14bfc1 -2694c82c -01000013 -01100019 -9482d5c3 -00004810 -11280036 -00000000 -16570034 -00000000 -14430032 -00000000 -40164000 -14f6002f -00000000 -24120004 -3c0252b9 -3442c98a -3c0352b9 -3463c98a -3c04800d -34846024 -3c05038f -34a518a2 -24870765 -ac850764 -3c14bfc1 -2694c88c -94820765 -01120019 -1657001e -00000000 -1443001c -00000000 -40164000 -14f60019 -00000000 -24120004 -3c022b77 -34421238 -3c032b77 -34631238 -3c04800d -34848294 -3c05cd7a -34a5b654 -248779f5 -ac8579f4 -3c14bfc1 -2694c8e8 -40927000 -948279f5 -40887000 -16570007 -00000000 -14430005 -00000000 -40164000 -14f60002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -00000000 -26100001 -24120000 -3c083e59 -35084300 -24090003 -3c0307cb -34632860 -01281007 -14430896 -00000000 -3c08171e -35080116 -24090004 -3c030171 -3463e011 -01281007 -1443088e -00000000 -3c08fb98 -3508a1c4 -24090017 -2403fff7 -01281007 -14430887 -00000000 -3c086ff8 -3508fac0 -24090019 -24030037 -01281007 -14430880 -00000000 -3c0809d9 -35089740 -24090015 -2403004e -01281007 -14430879 -00000000 -3c089dce -350837bf -2409000d -3c03fffc -3463ee71 -01281007 -14430871 -00000000 -3c085eb1 -3508157a -24090015 -240302f5 -01281007 -1443086a -00000000 -3c0888f1 -35080b2d -2409000b -3c03fff1 -34631e21 -01281007 -14430862 -00000000 -3c08b107 -350809b0 -2409001a -2403ffec -01281007 -1443085b -00000000 -3c0812de -35088e6c -24090016 -2403004b -01281007 -14430854 -00000000 -3c085a19 -3508d7d4 -2409000a -3c030016 -34638675 -01281007 -1443084c -00000000 -3c08f868 -3508eb20 -24090017 -2403fff0 -01281007 -14430845 -00000000 -3c08e1af -35083806 -2409001a -2403fff8 -01281007 -1443083e -00000000 -3c08ac60 -35083472 -24090018 -2403ffac -01281007 -14430837 -00000000 -3c08b4c2 -35080d00 -2409001d -2403fffd -01281007 -14430830 -00000000 -3c085f70 -35089bf3 -24090010 -24035f70 -01281007 -14430829 -00000000 -3c0804bb -3508f65d -24090012 -2403012e -01281007 -14430822 -00000000 -3c08864b -350821c8 -24090001 -3c03c325 -346390e4 -01281007 -1443081a -00000000 -3c08e368 -3508847c -24090004 -3c03fe36 -34638847 -01281007 -14430812 -00000000 -3c08773b -3508c92a -2409000b -3c03000e -3463e779 -01281007 -1443080a -00000000 -3c08c543 -350813f6 -24090002 -3c03f150 -3463c4fd -01281007 -14430802 -00000000 -3c086dcf -350866ac -24090005 -3c03036e -34637b35 -01281007 -144307fa -00000000 -3c083cdb -35085ca8 -24090001 -3c031e6d -3463ae54 -01281007 -144307f2 -00000000 -3c087dc9 -3508eb37 -24090011 -24033ee4 -01281007 -144307eb -00000000 -3c084909 -350838fc -2409000b -3c030009 -34632127 -01281007 -144307e3 -00000000 -3c08edaa -350850e2 -24090000 -3c03edaa -346350e2 -01281007 -144307db -00000000 -3c08d1e3 -3508223a -24090012 -2403f478 -01281007 -144307d4 -00000000 -3c080333 -3508e830 -2409000e -24030ccf -01281007 -144307cd -00000000 -3c0826a9 -3508b764 -24090008 -3c030026 -3463a9b7 -01281007 -144307c5 -00000000 -3c08da95 -35088664 -24090007 -3c03ffb5 -34632b0c -01281007 -144307bd -00000000 -3c08a591 -350819ec -24090003 -3c03f4b2 -3463233d -01281007 -144307b5 -00000000 -3c088032 -35086b50 -24090019 -2403ffc0 -01281007 -144307ae -00000000 -3c08e5ff -350843e6 -2409000c -3c03fffe -34635ff4 -01281007 -144307a6 -00000000 -3c08a915 -35082f58 -2409000d -3c03fffd -346348a9 -01281007 -1443079e -00000000 -3c08ee20 -35084600 -24090005 -3c03ff71 -34630230 -01281007 -14430796 -00000000 -3c08f5e5 -35087858 -24090017 -2403ffeb -01281007 -1443078f -00000000 -3c08ef21 -35083eb4 -24090013 -2403fde4 -01281007 -14430788 -00000000 -3c085ecf -35084490 -2409001a -24030017 -01281007 -14430781 -00000000 -3c087c1c -3508a88a -2409000a -3c03001f -3463072a -01281007 -14430779 -00000000 -3c08c76d -3508dd2a -24090004 -3c03fc76 -3463ddd2 -01281007 -14430771 -00000000 -3c087709 -35080678 -24090008 -3c030077 -34630906 -01281007 -14430769 -00000000 -3c0831ae -3508bb40 -24090006 -3c0300c6 -3463baed -01281007 -14430761 -00000000 -3c081c1d -3508401c -2409000f -2403383a -01281007 -1443075a -00000000 -3c089835 -350831da -24090015 -2403fcc1 -01281007 -14430753 -00000000 -3c08fb26 -3508fb10 -2409001a -2403fffe -01281007 -1443074c -00000000 -3c087b80 -3508fa5c -2409001b -2403000f -01281007 -14430745 -00000000 -3c0847b7 -350847ac -24090005 -3c03023d -3463ba3d -01281007 -1443073d -00000000 -3c08e93f -35080edc -24090000 -3c03e93f -34630edc -01281007 -14430735 -00000000 -3c08c9a1 -35080238 -2409001a -2403fff2 -01281007 -1443072e -00000000 -3c0818a8 -3508e82c -2409001e -24030000 -01281007 -14430727 -00000000 -3c081a74 -3508f36e -24090016 -24030069 -01281007 -14430720 -00000000 -3c08c025 -3508ee5c -2409001c -2403fffc -01281007 -14430719 -00000000 -3c0877c7 -350811a0 -2409001a -2403001d -01281007 -14430712 -00000000 -3c084d5a -3508d8a4 -24090010 -24034d5a -01281007 -1443070b -00000000 -3c086ff3 -35083800 -24090011 -240337f9 -01281007 -14430704 -00000000 -3c0866e3 -350862d8 -24090007 -3c0300cd -3463c6c5 -01281007 -144306fc -00000000 -3c08ff07 -3508fbbc -24090002 -3c03ffc1 -3463feef -01281007 -144306f4 -00000000 -3c081511 -35083868 -24090000 -3c031511 -34633868 -01281007 -144306ec -00000000 -3c087ec8 -35086dc8 -2409000e -3c030001 -3463fb21 -01281007 -144306e4 -00000000 -3c085c36 -3508fdc2 -24090006 -3c030170 -3463dbf7 -01281007 -144306dc -00000000 -3c08614b -35089c32 -2409000f -3403c297 -01281007 -144306d5 -00000000 -3c088b8a -35085040 -2409000a -3c03ffe2 -3463e294 -01281007 -144306cd -00000000 -3c08946e -3508e990 -24090018 -2403ff94 -01281007 -144306c6 -00000000 -3c0853d2 -3508cf20 -24090005 -3c03029e -34639679 -01281007 -144306be -00000000 -3c08f86b -35081c54 -24090000 -3c03f86b -34631c54 -01281007 -144306b6 -00000000 -3c082425 -3508f532 -24090007 -3c030048 -34634bea -01281007 -144306ae -00000000 -3c08fb78 -3508fcea -2409000c -2403b78f -01281007 -144306a7 -00000000 -3c0805e6 -3508850f -2409001c -24030000 -01281007 -144306a0 -00000000 -3c08d5a6 -35087a1a -24090002 -3c03f569 -34639e86 -01281007 -14430698 -00000000 -3c089991 -3508c778 -2409001b -2403fff3 -01281007 -14430691 -00000000 -3c08e6c7 -35087bd8 -24090002 -3c03f9b1 -3463def6 -01281007 -14430689 -00000000 -3c08ac14 -35080820 -24090009 -3c03ffd6 -34630a04 -01281007 -14430681 -00000000 -3c08ffa1 -35080eb0 -24090002 -3c03ffe8 -346343ac -01281007 -14430679 -00000000 -3c080b0d -3508ceb8 -2409000b -3c030001 -346361b9 -01281007 -14430671 -00000000 -3c081958 -35081c80 -2409001f -24030000 -01281007 -1443066a -00000000 -3c08712a -3508de78 -2409001c -24030007 -01281007 -14430663 -00000000 -3c082d6b -3508668c -24090014 -240302d6 -01281007 -1443065c -00000000 -3c089ea8 -3508226c -24090010 -24039ea8 -01281007 -14430655 -00000000 -3c087409 -3508305a -24090000 -3c037409 -3463305a -01281007 -1443064d -00000000 -3c089f84 -350861d0 -24090001 -3c03cfc2 -346330e8 -01281007 -14430645 -00000000 -3c082413 -35084820 -2409001d -24030001 -01281007 -1443063e -00000000 -3c082964 -35087820 -2409001c -24030002 -01281007 -14430637 -00000000 -3c088f25 -35087894 -24090019 -2403ffc7 -01281007 -14430630 -00000000 -3c086618 -3508bc6f -2409000b -3c03000c -3463c317 -01281007 -14430628 -00000000 -3c083a52 -35085817 -24090014 -240303a5 -01281007 -14430621 -00000000 -3c089e71 -35085b80 -2409001d -2403fffc -01281007 -1443061a -00000000 -3c082d8e -3508a788 -24090005 -3c03016c -3463753c -01281007 -14430612 -00000000 -3c08694c -3508b17c -2409001f -24030000 -01281007 -1443060b -00000000 -3c084174 -350848bc -24090003 -3c03082e -34638917 -01281007 -14430603 -00000000 -3c089cd9 -35085d7c -24090009 -3c03ffce -34636cae -01281007 -144305fb -00000000 -3c08cbb5 -35080b08 -24090015 -2403fe5d -01281007 -144305f4 -00000000 -3c08b367 -3508daa3 -2409001e -2403fffe -01281007 -144305ed -00000000 -3c087e82 -3508ff40 -24090003 -3c030fd0 -34635fe8 -01281007 -144305e5 -00000000 -3c08d5a0 -350829af -24090012 -2403f568 -01281007 -144305de -00000000 -3c0898ae -350804c2 -24090014 -2403f98a -01281007 -144305d7 -00000000 -3c0875b1 -3508649a -24090002 -3c031d6c -34635926 -01281007 -144305cf -00000000 -3c0878b8 -35082ec0 -24090001 -3c033c5c -34631760 -01281007 -144305c7 -00000000 -3c087aea -35088920 -2409000e -3c030001 -3463ebaa -01281007 -144305bf -00000000 -3c084cd3 -3508b4e0 -2409000a -3c030013 -346334ed -01281007 -144305b7 -00000000 -3c081082 -3508d204 -24090019 -24030008 -01281007 -144305b0 -00000000 -3c08c908 -35084f48 -24090000 -3c03c908 -34634f48 -01281007 -144305a8 -00000000 -3c0872e5 -3508457a -2409000d -3c030003 -3463972a -01281007 -144305a0 -00000000 -3c08b9f1 -35089eee -24090003 -3c03f73e -346333dd -01281007 -14430598 -00000000 -3c0846a5 -3508694f -2409001c -24030004 -01281007 -14430591 -00000000 -3c0808ad -3508259e -24090010 -240308ad -01281007 -1443058a -00000000 -3c08fdfd -3508e280 -24090010 -2403fdfd -01281007 -14430583 -00000000 -3c0870e3 -35084c62 -24090008 -3c030070 -3463e34c -01281007 -1443057b -00000000 -3c08aa2d -35089442 -24090003 -3c03f545 -3463b288 -01281007 -14430573 -00000000 -3c083a1d -35083af8 -24090007 -3c030074 -34633a75 -01281007 -1443056b -00000000 -3c08182c -35085238 -2409001d -24030000 -01281007 -14430564 -00000000 -3c08063e -3508e80a -24090000 -3c03063e -3463e80a -01281007 -1443055c -00000000 -3c08dd00 -350831c0 -24090016 -2403ff74 -01281007 -14430555 -00000000 -3c08d555 -3508d880 -2409000b -3c03fffa -3463aabb -01281007 -1443054d -00000000 -3c08a22f -3508b96a -24090004 -3c03fa22 -3463fb96 -01281007 -14430545 -00000000 -3c087c73 -35086c64 -24090004 -3c0307c7 -346336c6 -01281007 -1443053d -00000000 -3c08ff3f -3508202c -24090001 -3c03ff9f -34639016 -01281007 -14430535 -00000000 -3c08035c -350846dc -2409001c -24030000 -01281007 -1443052e -00000000 -3c080a5d -35084aec -24090001 -3c03052e -3463a576 -01281007 -14430526 -00000000 -3c08d5b5 -35084600 -24090001 -3c03eada -3463a300 -01281007 -1443051e -00000000 -3c084ef2 -350862cc -24090014 -240304ef -01281007 -14430517 -00000000 -3c08cbaa -3508a7a0 -24090016 -2403ff2e -01281007 -14430510 -00000000 -3c087f86 -350849a0 -2409000c -3c030007 -3463f864 -01281007 -14430508 -00000000 -3c0887cd -35089140 -24090002 -3c03e1f3 -34636450 -01281007 -14430500 -00000000 -3c0873df -3508acf0 -24090010 -240373df -01281007 -144304f9 -00000000 -3c08e165 -35089cfc -2409001c -2403fffe -01281007 -144304f2 -00000000 -3c086494 -3508ad40 -24090015 -24030324 -01281007 -144304eb -00000000 -3c08c0e5 -35087d70 -24090010 -2403c0e5 -01281007 -144304e4 -00000000 -3c085c4f -3508ca8c -24090014 -240305c4 -01281007 -144304dd -00000000 -3c08c720 -3508d219 -24090004 -3c03fc72 -34630d21 -01281007 -144304d5 -00000000 -3c085111 -3508c9bb -24090014 -24030511 -01281007 -144304ce -00000000 -3c08bf46 -35081946 -2409000f -3c03ffff -34637e8c -01281007 -144304c6 -00000000 -3c08538a -3508e800 -24090014 -24030538 -01281007 -144304bf -00000000 -3c083bea -3508bc40 -24090002 -3c030efa -3463af10 -01281007 -144304b7 -00000000 -3c0879da -3508aef2 -2409001e -24030001 -01281007 -144304b0 -00000000 -3c086408 -3508cf7c -24090018 -24030064 -01281007 -144304a9 -00000000 -3c0830e0 -35082858 -24090004 -3c03030e -34630285 -01281007 -144304a1 -00000000 -3c089568 -3508d5e8 -24090015 -2403fcab -01281007 -1443049a -00000000 -3c082236 -35081ecc -2409000f -2403446c -01281007 -14430493 -00000000 -3c0825b3 -35082830 -2409000e -340396cc -01281007 -1443048c -00000000 -3c08d0f0 -35081a33 -24090000 -3c03d0f0 -34631a33 -01281007 -14430484 -00000000 -3c087069 -350894dc -2409001b -2403000e -01281007 -1443047d -00000000 -3c08974b -3508a6c6 -2409000c -3c03fff9 -346374ba -01281007 -14430475 -00000000 -3c082f99 -3508bcfc -24090005 -3c03017c -3463cde7 -01281007 -1443046d -00000000 -3c086fc9 -3508a830 -24090014 -240306fc -01281007 -14430466 -00000000 -3c088f11 -3508af9a -2409001c -2403fff8 -01281007 -1443045f -00000000 -3c082544 -35087260 -2409001a -24030009 -01281007 -14430458 -00000000 -3c08621a -35088d6e -2409001a -24030018 -01281007 -14430451 -00000000 -3c087157 -3508f254 -2409000d -3c030003 -34638abf -01281007 -14430449 -00000000 -3c087250 -3508e14e -24090001 -3c033928 -346370a7 -01281007 -14430441 -00000000 -3c082298 -3508b0ff -24090005 -3c030114 -3463c587 -01281007 -14430439 -00000000 -3c089f21 -35083000 -24090014 -2403f9f2 -01281007 -14430432 -00000000 -3c086fb1 -3508fd24 -2409000d -3c030003 -34637d8f -01281007 -1443042a -00000000 -3c08c2e3 -3508142a -24090016 -2403ff0b -01281007 -14430423 -00000000 -3c08640e -35089214 -24090012 -24031903 -01281007 -1443041c -00000000 -3c0805ad -350850a8 -2409001f -24030000 -01281007 -14430415 -00000000 -3c08ba4e -3508c160 -24090008 -3c03ffba -34634ec1 -01281007 -1443040d -00000000 -3c08e619 -3508de82 -2409000b -3c03fffc -3463c33b -01281007 -14430405 -00000000 -3c0809c0 -35083afc -24090015 -2403004e -01281007 -144303fe -00000000 -3c08b700 -35089540 -2409000f -3c03ffff -34636e01 -01281007 -144303f6 -00000000 -3c08d158 -3508d6b4 -2409001e -2403ffff -01281007 -144303ef -00000000 -3c08c7da -35088990 -24090000 -3c03c7da -34638990 -01281007 -144303e7 -00000000 -3c080831 -350843c4 -24090016 -24030020 -01281007 -144303e0 -00000000 -3c083c5f -35080500 -24090000 -3c033c5f -34630500 -01281007 -144303d8 -00000000 -3c08a9e4 -35080838 -2409001c -2403fffa -01281007 -144303d1 -00000000 -3c08d986 -35087f14 -2409001f -2403ffff -01281007 -144303ca -00000000 -3c08090a -35081550 -24090015 -24030048 -01281007 -144303c3 -00000000 -3c08a1c5 -3508ea00 -24090006 -3c03fe87 -346317a8 -01281007 -144303bb -00000000 -3c086904 -3508a70e -2409000c -3c030006 -3463904a -01281007 -144303b3 -00000000 -3c0879c6 -3508bb60 -24090004 -3c03079c -34636bb6 -01281007 -144303ab -00000000 -3c08408c -3508241f -2409001e -24030001 -01281007 -144303a4 -00000000 -3c08e01c -3508b59e -24090015 -2403ff00 -01281007 -1443039d -00000000 -3c088868 -3508bb00 -24090009 -3c03ffc4 -3463345d -01281007 -14430395 -00000000 -3c086cc8 -3508f4f8 -2409000f -3403d991 -01281007 -1443038e -00000000 -3c081c5f -35085cd1 -24090012 -24030717 -01281007 -14430387 -00000000 -3c08bdb7 -35083b00 -2409001f -2403ffff -01281007 -14430380 -00000000 -3c0844ab -350880f0 -24090005 -3c030225 -34635c07 -01281007 -14430378 -00000000 -3c08c2d0 -35085ae0 -24090015 -2403fe16 -01281007 -14430371 -00000000 -3c08ba4a -35080cb8 -2409001a -2403ffee -01281007 -1443036a -00000000 -3c08b808 -35083f72 -24090019 -2403ffdc -01281007 -14430363 -00000000 -3c088caf -3508c504 -24090005 -3c03fc65 -34637e28 -01281007 -1443035b -00000000 -3c0858be -350802b8 -2409000f -3403b17c -01281007 -14430354 -00000000 -3c087182 -3508ad1d -24090019 -24030038 -01281007 -1443034d -00000000 -3c087e8e -3508e7da -24090017 -240300fd -01281007 -14430346 -00000000 -3c087f4e -35081334 -24090016 -240301fd -01281007 -1443033f -00000000 -3c08ac95 -35086b06 -24090005 -3c03fd64 -3463ab58 -01281007 -14430337 -00000000 -3c0897c8 -350874a0 -24090003 -3c03f2f9 -34630e94 -01281007 -1443032f -00000000 -3c089731 -35082710 -24090000 -3c039731 -34632710 -01281007 -14430327 -00000000 -3c0810ce -3508f5ec -24090009 -3c030008 -3463677a -01281007 -1443031f -00000000 -3c080dea -3508d34e -24090017 -2403001b -01281007 -14430318 -00000000 -3c08ff16 -35084008 -24090011 -2403ff8b -01281007 -14430311 -00000000 -3c08010a -3508dbd0 -24090009 -3403856d -01281007 -1443030a -00000000 -3c0826ee -3508c740 -2409000c -3c030002 -34636eec -01281007 -14430302 -00000000 -3c080764 -35083f99 -24090003 -3c0300ec -346387f3 -01281007 -144302fa -00000000 -3c08aad5 -3508a53c -24090009 -3c03ffd5 -34636ad2 -01281007 -144302f2 -00000000 -3c0830d1 -350842e8 -24090015 -24030186 -01281007 -144302eb -00000000 -3c0814b6 -3508b644 -24090015 -240300a5 -01281007 -144302e4 -00000000 -3c083271 -3508e3e8 -2409001b -24030006 -01281007 -144302dd -00000000 -3c086c56 -35089ec0 -24090011 -2403362b -01281007 -144302d6 -00000000 -3c08be1c -3508738e -24090008 -3c03ffbe -34631c73 -01281007 -144302ce -00000000 -3c08dbba -3508d0b0 -24090005 -3c03fedd -3463d685 -01281007 -144302c6 -00000000 -3c080b24 -3508d560 -24090000 -3c030b24 -3463d560 -01281007 -144302be -00000000 -3c08f234 -3508887c -24090000 -3c03f234 -3463887c -01281007 -144302b6 -00000000 -3c08fa3c -35088e40 -24090000 -3c03fa3c -34638e40 -01281007 -144302ae -00000000 -3c083ec5 -3508955c -24090000 -3c033ec5 -3463955c -01281007 -144302a6 -00000000 -3c08418e -350801e6 -24090000 -3c03418e -346301e6 -01281007 -1443029e -00000000 -3c08fdf5 -3508ab83 -24090000 -3c03fdf5 -3463ab83 -01281007 -14430296 -00000000 -3c0864f8 -3508dfc0 -24090000 -3c0364f8 -3463dfc0 -01281007 -1443028e -00000000 -3c0891d2 -350823b0 -24090000 -3c0391d2 -346323b0 -01281007 -14430286 -00000000 -3c08c983 -35089777 -24090000 -3c03c983 -34639777 -01281007 -1443027e -00000000 -3c08b40a -3508b300 -24090000 -3c03b40a -3463b300 -01281007 -14430276 -00000000 -3c087c90 -3508adc0 -24090000 -3c037c90 -3463adc0 -01281007 -1443026e -00000000 -3c080598 -35085ce0 -24090000 -3c030598 -34635ce0 -01281007 -14430266 -00000000 -3c08d987 -3508f83c -24090000 -3c03d987 -3463f83c -01281007 -1443025e -00000000 -3c0885a3 -3508fe8e -24090000 -3c0385a3 -3463fe8e -01281007 -14430256 -00000000 -3c082862 -350824b2 -24090000 -3c032862 -346324b2 -01281007 -1443024e -00000000 -3c081c23 -35080e10 -24090000 -3c031c23 -34630e10 -01281007 -14430246 -00000000 -3c0872f1 -3508fa98 -24090000 -3c0372f1 -3463fa98 -01281007 -1443023e -00000000 -3c0822a8 -3508cd3b -24090000 -3c0322a8 -3463cd3b -01281007 -14430236 -00000000 -3c08beb3 -35080f70 -24090000 -3c03beb3 -34630f70 -01281007 -1443022e -00000000 -3c089b78 -350838d8 -24090000 -3c039b78 -346338d8 -01281007 -14430226 -00000000 -3c0800b9 -3508d580 -24090000 -3c0300b9 -3463d580 -01281007 -1443021e -00000000 -3c082fad -3508d0de -24090000 -3c032fad -3463d0de -01281007 -14430216 -00000000 -3c08577f -3508089c -24090000 -3c03577f -3463089c -01281007 -1443020e -00000000 -3c08863e -350830b4 -24090000 -3c03863e -346330b4 -01281007 -14430206 -00000000 -3c086926 -3508a1a0 -24090000 -3c036926 -3463a1a0 -01281007 -144301fe -00000000 -3c086f4e -3508cb50 -24090000 -3c036f4e -3463cb50 -01281007 -144301f6 -00000000 -3c08e15c -35083cca -24090000 -3c03e15c -34633cca -01281007 -144301ee -00000000 -3c085f7c -350833a2 -24090000 -3c035f7c -346333a2 -01281007 -144301e6 -00000000 -3c08a267 -3508ac08 -24090000 -3c03a267 -3463ac08 -01281007 -144301de -00000000 -3c088b00 -35081228 -24090000 -3c038b00 -34631228 -01281007 -144301d6 -00000000 -3c0853f7 -3508d6b8 -24090000 -3c0353f7 -3463d6b8 -01281007 -144301ce -00000000 -3c08e85d -35085600 -24090000 -3c03e85d -34635600 -01281007 -144301c6 -00000000 -3c08f1ec -3508fb76 -24090000 -3c03f1ec -3463fb76 -01281007 -144301be -00000000 -3c080fc9 -3508ea7e -24090000 -3c030fc9 -3463ea7e -01281007 -144301b6 -00000000 -3c08cee8 -35083180 -24090000 -3c03cee8 -34633180 -01281007 -144301ae -00000000 -3c085e34 -35089f20 -24090000 -3c035e34 -34639f20 -01281007 -144301a6 -00000000 -3c08c9ec -3508e2a0 -24090000 -3c03c9ec -3463e2a0 -01281007 -1443019e -00000000 -3c088e75 -35088928 -24090000 -3c038e75 -34638928 -01281007 -14430196 -00000000 -3c08cb9f -3508f9bd -24090000 -3c03cb9f -3463f9bd -01281007 -1443018e -00000000 -3c084aa3 -3508f3f4 -24090000 -3c034aa3 -3463f3f4 -01281007 -14430186 -00000000 -3c081025 -35089cc6 -24090000 -3c031025 -34639cc6 -01281007 -1443017e -00000000 -3c086bbc -3508dee0 -24090000 -3c036bbc -3463dee0 -01281007 -14430176 -00000000 -3c080b55 -350801c0 -24090000 -3c030b55 -346301c0 -01281007 -1443016e -00000000 -3c088449 -35080bba -24090000 -3c038449 -34630bba -01281007 -14430166 -00000000 -3c0860f7 -3508f7e4 -24090000 -3c0360f7 -3463f7e4 -01281007 -1443015e -00000000 -3c08de98 -35086fe0 -24090000 -3c03de98 -34636fe0 -01281007 -14430156 -00000000 -3c082a8a -35086da8 -24090000 -3c032a8a -34636da8 -01281007 -1443014e -00000000 -3c08ac02 -3508d2b0 -24090000 -3c03ac02 -3463d2b0 -01281007 -14430146 -00000000 -3c0874c0 -35084f80 -24090000 -3c0374c0 -34634f80 -01281007 -1443013e -00000000 -3c084043 -3508b9ee -24090000 -3c034043 -3463b9ee -01281007 -14430136 -00000000 -24080000 -24090005 -24030000 -01281007 -14430130 -00000000 -24080000 -2409000b -24030000 -01281007 -1443012a -00000000 -24080000 -24090019 -24030000 -01281007 -14430124 -00000000 -24080000 -24090000 -24030000 -01281007 -1443011e -00000000 -24080000 -2409000f -24030000 -01281007 -14430118 -00000000 -24080000 -24090016 -24030000 -01281007 -14430112 -00000000 -24080000 -24090007 -24030000 -01281007 -1443010c -00000000 -24080000 -24090005 -24030000 -01281007 -14430106 -00000000 -24080000 -24090008 -24030000 -01281007 -14430100 -00000000 -24080000 -24090002 -24030000 -01281007 -144300fa -00000000 -24080000 -24090015 -24030000 -01281007 -144300f4 -00000000 -24080000 -24090016 -24030000 -01281007 -144300ee -00000000 -24080000 -24090018 -24030000 -01281007 -144300e8 -00000000 -24080000 -24090001 -24030000 -01281007 -144300e2 -00000000 -24080000 -24090011 -24030000 -01281007 -144300dc -00000000 -24080000 -2409001e -24030000 -01281007 -144300d6 -00000000 -24080000 -24090016 -24030000 -01281007 -144300d0 -00000000 -24080000 -24090019 -24030000 -01281007 -144300ca -00000000 -24080000 -24090001 -24030000 -01281007 -144300c4 -00000000 -24080000 -2409001f -24030000 -01281007 -144300be -00000000 -24080000 -24090004 -24030000 -01281007 -144300b8 -00000000 -24080000 -2409001e -24030000 -01281007 -144300b2 -00000000 -24080000 -24090006 -24030000 -01281007 -144300ac -00000000 -24080000 -24090013 -24030000 -01281007 -144300a6 -00000000 -24080000 -2409001c -24030000 -01281007 -144300a0 -00000000 -24080000 -2409001b -24030000 -01281007 -1443009a -00000000 -24080000 -2409001b -24030000 -01281007 -14430094 -00000000 -24080000 -2409000e -24030000 -01281007 -1443008e -00000000 -24080000 -24090017 -24030000 -01281007 -14430088 -00000000 -24080000 -24090002 -24030000 -01281007 -14430082 -00000000 -24080000 -24090001 -24030000 -01281007 -1443007c -00000000 -24080000 -2409001c -24030000 -01281007 -14430076 -00000000 -24080000 -24090002 -24030000 -01281007 -14430070 -00000000 -24080000 -2409001e -24030000 -01281007 -1443006a -00000000 -24080000 -2409000c -24030000 -01281007 -14430064 -00000000 -24080000 -24090010 -24030000 -01281007 -1443005e -00000000 -24080000 -24090006 -24030000 -01281007 -14430058 -00000000 -24080000 -2409001f -24030000 -01281007 -14430052 -00000000 -24080000 -24090008 -24030000 -01281007 -1443004c -00000000 -24080000 -24090011 -24030000 -01281007 -14430046 -00000000 -24080000 -24090012 -24030000 -01281007 -14430040 -00000000 -24080000 -2409000e -24030000 -01281007 -1443003a -00000000 -24080000 -24090000 -24030000 -01281007 -14430034 -00000000 -24080000 -24090008 -24030000 -01281007 -1443002e -00000000 -24080000 -24090019 -24030000 -01281007 -14430028 -00000000 -24080000 -24090010 -24030000 -01281007 -14430022 -00000000 -24080000 -24090012 -24030000 -01281007 -1443001c -00000000 -24080000 -24090011 -24030000 -01281007 -14430016 -00000000 -24080000 -24090014 -24030000 -01281007 -14430010 -00000000 -24080000 -24090012 -24030000 -01281007 -1443000a -00000000 -24080000 -24090000 -24030000 -01281007 -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -24120000 -3c084e77 -35085a80 -3c09b267 -352995ec -0109001b -0000a812 -0000b010 -24020000 -3c034e77 -34635a80 -145509a6 -00000000 -147609a4 -00000000 -3c084e88 -35088700 -3c09f0d8 -35294fce -0109001b -0000a812 -0000b010 -24020000 -3c034e88 -34638700 -14550998 -00000000 -14760996 -00000000 -3c0801de -3508a048 -3c09f2c7 -35294100 -0109001b -0000a812 -0000b010 -24020000 -3c0301de -3463a048 -1455098a -00000000 -14760988 -00000000 -3c0877e6 -35088950 -3c098b0d -3529dad0 -0109001b -0000a812 -0000b010 -24020000 -3c0377e6 -34638950 -1455097c -00000000 -1476097a -00000000 -3c087201 -35083c68 -3c0948cb -35298680 -0109001b -0000a812 -0000b010 -24020001 -3c032935 -3463b5e8 -1455096e -00000000 -1476096c -00000000 -3c087fb2 -3508e9a0 -3c09c9af -35295700 -0109001b -0000a812 -0000b010 -24020000 -3c037fb2 -3463e9a0 -14550960 -00000000 -1476095e -00000000 -3c08d704 -35082938 -3c09018a -35297078 -0109001b -0000a812 -0000b010 -2402008b -3c0300d9 -34631810 -14550952 -00000000 -14760950 -00000000 -3c08bf81 -3508441b -3c09704e -35293f24 -0109001b -0000a812 -0000b010 -24020001 -3c034f33 -346304f7 -14550944 -00000000 -14760942 -00000000 -3c08eb59 -350894e6 -3c09622f -35291558 -0109001b -0000a812 -0000b010 -24020002 -3c0326fb -34636a36 -14550936 -00000000 -14760934 -00000000 -3c081117 -35086c40 -3c098128 -3529af78 -0109001b -0000a812 -0000b010 -24020000 -3c031117 -34636c40 -14550928 -00000000 -14760926 -00000000 -3c083289 -35083870 -3c09ab09 -3529b9c0 -0109001b -0000a812 -0000b010 -24020000 -3c033289 -34633870 -1455091a -00000000 -14760918 -00000000 -3c08403c -350860c0 -3c096fe7 -35299f00 -0109001b -0000a812 -0000b010 -24020000 -3c03403c -346360c0 -1455090c -00000000 -1476090a -00000000 -3c08af85 -35085e42 -3c09314b -35293730 -0109001b -0000a812 -0000b010 -24020003 -3c031ba3 -3463b8b2 -145508fe -00000000 -147608fc -00000000 -3c08daa8 -3508cd0c -3c09d8f7 -3529eb07 -0109001b -0000a812 -0000b010 -24020001 -3c0301b0 -3463e205 -145508f0 -00000000 -147608ee -00000000 -3c0826aa -35088c2c -3c092db5 -35292200 -0109001b -0000a812 -0000b010 -24020000 -3c0326aa -34638c2c -145508e2 -00000000 -147608e0 -00000000 -3c089338 -350824b0 -3c099742 -35292b30 -0109001b -0000a812 -0000b010 -24020000 -3c039338 -346324b0 -145508d4 -00000000 -147608d2 -00000000 -3c080d52 -35087980 -3c091923 -35293f98 -0109001b -0000a812 -0000b010 -24020000 -3c030d52 -34637980 -145508c6 -00000000 -147608c4 -00000000 -3c08fcb1 -3508d1f0 -3c092cc8 -35299437 -0109001b -0000a812 -0000b010 -24020005 -3c031cc6 -3463ecdd -145508b8 -00000000 -147608b6 -00000000 -3c08d711 -3508e228 -3c09dc4d -352982f5 -0109001b -0000a812 -0000b010 -24020000 -3c03d711 -3463e228 -145508aa -00000000 -147608a8 -00000000 -3c08e3e9 -3508c400 -3c095e37 -3529e5e0 -0109001b -0000a812 -0000b010 -24020002 -3c032779 -3463f840 -1455089c -00000000 -1476089a -00000000 -3c08ec9a -35088080 -3c092124 -35290ee0 -0109001b -0000a812 -0000b010 -24020007 -3c03049e -34631860 -1455088e -00000000 -1476088c -00000000 -3c08b0e3 -35085480 -3c098947 -3529ed80 -0109001b -0000a812 -0000b010 -24020001 -3c03279b -34636700 -14550880 -00000000 -1476087e -00000000 -3c080392 -3508b91c -3c09985e -3529f388 -0109001b -0000a812 -0000b010 -24020000 -3c030392 -3463b91c -14550872 -00000000 -14760870 -00000000 -3c083985 -35086e38 -3c09b0c0 -3529860c -0109001b -0000a812 -0000b010 -24020000 -3c033985 -34636e38 -14550864 -00000000 -14760862 -00000000 -3c089a86 -3508f9a7 -3c0962ff -35294728 -0109001b -0000a812 -0000b010 -24020001 -3c033787 -3463b27f -14550856 -00000000 -14760854 -00000000 -3c080ce5 -3508e850 -3c0947ad -3529bcf0 -0109001b -0000a812 -0000b010 -24020000 -3c030ce5 -3463e850 -14550848 -00000000 -14760846 -00000000 -3c08f461 -35081640 -3c095d25 -3529556e -0109001b -0000a812 -0000b010 -24020002 -3c033a16 -34636b64 -1455083a -00000000 -14760838 -00000000 -3c08b7f4 -3508a7f2 -3c092dbc -3529ce30 -0109001b -0000a812 -0000b010 -24020004 -3c030101 -34636f32 -1455082c -00000000 -1476082a -00000000 -3c08d5e7 -35084ce0 -3c097cc6 -352962f7 -0109001b -0000a812 -0000b010 -24020001 -3c035920 -3463e9e9 -1455081e -00000000 -1476081c -00000000 -3c089988 -3508ceac -3c09f076 -3529e887 -0109001b -0000a812 -0000b010 -24020000 -3c039988 -3463ceac -14550810 -00000000 -1476080e -00000000 -3c08850d -3508cbd5 -3c0959d7 -35295300 -0109001b -0000a812 -0000b010 -24020001 -3c032b36 -346378d5 -14550802 -00000000 -14760800 -00000000 -3c0816d3 -35087c76 -3c09674d -3529c83e -0109001b -0000a812 -0000b010 -24020000 -3c0316d3 -34637c76 -145507f4 -00000000 -147607f2 -00000000 -3c08a958 -35089416 -3c09a35b -3529ff94 -0109001b -0000a812 -0000b010 -24020001 -3c0305fc -34639482 -145507e6 -00000000 -147607e4 -00000000 -3c08a190 -35089a9f -3c09a060 -35291410 -0109001b -0000a812 -0000b010 -24020001 -3c030130 -3463868f -145507d8 -00000000 -147607d6 -00000000 -3c0821e6 -3508ad92 -3c093893 -35297558 -0109001b -0000a812 -0000b010 -24020000 -3c0321e6 -3463ad92 -145507ca -00000000 -147607c8 -00000000 -3c083409 -35087bd4 -3c092433 -35294f00 -0109001b -0000a812 -0000b010 -24020001 -3c030fd6 -34632cd4 -145507bc -00000000 -147607ba -00000000 -3c0800d6 -35089f51 -3c096383 -352998c6 -0109001b -0000a812 -0000b010 -24020000 -3c0300d6 -34639f51 -145507ae -00000000 -147607ac -00000000 -3c08ce52 -35083680 -3c093aa4 -352921ac -0109001b -0000a812 -0000b010 -24020003 -3c031e65 -3463d17c -145507a0 -00000000 -1476079e -00000000 -3c0806be -35082bd0 -3c097e04 -352969c0 -0109001b -0000a812 -0000b010 -24020000 -3c0306be -34632bd0 -14550792 -00000000 -14760790 -00000000 -3c083c8a -35083ed0 -3c0996ba -352984a4 -0109001b -0000a812 -0000b010 -24020000 -3c033c8a -34633ed0 -14550784 -00000000 -14760782 -00000000 -3c08cdb7 -3508e7a0 -3c09f02e -3529c50b -0109001b -0000a812 -0000b010 -24020000 -3c03cdb7 -3463e7a0 -14550776 -00000000 -14760774 -00000000 -3c083e73 -3508f907 -3c09343c -3529b0fc -0109001b -0000a812 -0000b010 -24020001 -3c030a37 -3463480b -14550768 -00000000 -14760766 -00000000 -3c0880c6 -35084528 -3c095140 -352902d0 -0109001b -0000a812 -0000b010 -24020001 -3c032f86 -34634258 -1455075a -00000000 -14760758 -00000000 -3c08307f -3508f23f -3c0949cb -35294594 -0109001b -0000a812 -0000b010 -24020000 -3c03307f -3463f23f -1455074c -00000000 -1476074a -00000000 -3c081a5c -35081b18 -3c09354f -35293820 -0109001b -0000a812 -0000b010 -24020000 -3c031a5c -34631b18 -1455073e -00000000 -1476073c -00000000 -3c08152a -3508dedb -3c099236 -35297480 -0109001b -0000a812 -0000b010 -24020000 -3c03152a -3463dedb -14550730 -00000000 -1476072e -00000000 -3c0887c6 -3508b4d4 -3c095fe2 -3529d74f -0109001b -0000a812 -0000b010 -24020001 -3c0327e3 -3463dd85 -14550722 -00000000 -14760720 -00000000 -3c080a97 -35089968 -3c099563 -35296cf8 -0109001b -0000a812 -0000b010 -24020000 -3c030a97 -34639968 -14550714 -00000000 -14760712 -00000000 -3c089a02 -35082056 -3c09ba1f -3529cd4e -0109001b -0000a812 -0000b010 -24020000 -3c039a02 -34632056 -14550706 -00000000 -14760704 -00000000 -3c0889ed -35089f82 -3c096ede -3529448c -0109001b -0000a812 -0000b010 -24020001 -3c031b0f -34635af6 -145506f8 -00000000 -147606f6 -00000000 -3c08e277 -350800a0 -3c0996ae -3529437e -0109001b -0000a812 -0000b010 -24020001 -3c034bc8 -3463bd22 -145506ea -00000000 -147606e8 -00000000 -3c08fa35 -3508607c -3c090c84 -35295564 -0109001b -0000a812 -0000b010 -24020013 -3c030c63 -34630a10 -145506dc -00000000 -147606da -00000000 -3c08fd23 -3508f6f0 -3c09679b -3529a312 -0109001b -0000a812 -0000b010 -24020002 -3c032dec -3463b0cc -145506ce -00000000 -147606cc -00000000 -3c0880ed -3508e740 -3c099166 -35299d00 -0109001b -0000a812 -0000b010 -24020000 -3c0380ed -3463e740 -145506c0 -00000000 -147606be -00000000 -3c088163 -3508addd -3c099c11 -3529473c -0109001b -0000a812 -0000b010 -24020000 -3c038163 -3463addd -145506b2 -00000000 -147606b0 -00000000 -3c08a8ff -35085154 -3c09b2f0 -35294618 -0109001b -0000a812 -0000b010 -24020000 -3c03a8ff -34635154 -145506a4 -00000000 -147606a2 -00000000 -3c087f59 -350838cd -3c090b29 -35297e38 -0109001b -0000a812 -0000b010 -2402000b -3c030490 -3463cc65 -14550696 -00000000 -14760694 -00000000 -3c08c024 -3508b7e4 -3c098cd2 -352958b8 -0109001b -0000a812 -0000b010 -24020001 -3c033352 -34635f2c -14550688 -00000000 -14760686 -00000000 -3c08e4c9 -3508469c -3c0906d9 -35292da8 -0109001b -0000a812 -0000b010 -24020021 -3c0302ca -346363f4 -1455067a -00000000 -14760678 -00000000 -3c08945f -3508dc7a -3c092f80 -35290526 -0109001b -0000a812 -0000b010 -24020003 -3c0305df -3463cd08 -1455066c -00000000 -1476066a -00000000 -3c08cfc7 -3508186c -3c090dec -352923ce -0109001b -0000a812 -0000b010 -2402000e -3c030cdd -34632328 -1455065e -00000000 -1476065c -00000000 -3c081c80 -3508a1b0 -3c09c1ca -3529066e -0109001b -0000a812 -0000b010 -24020000 -3c031c80 -3463a1b0 -14550650 -00000000 -1476064e -00000000 -3c088c14 -3508bff0 -3c09dbeb -3529f5fc -0109001b -0000a812 -0000b010 -24020000 -3c038c14 -3463bff0 -14550642 -00000000 -14760640 -00000000 -3c08fbef -3508ef80 -3c091017 -352946e1 -0109001b -0000a812 -0000b010 -2402000f -3c030a92 -3463c851 -14550634 -00000000 -14760632 -00000000 -3c08fd96 -3508711e -3c09af0f -3529c990 -0109001b -0000a812 -0000b010 -24020001 -3c034e86 -3463a78e -14550626 -00000000 -14760624 -00000000 -3c087fb0 -3508d7f1 -3c09137f -3529f578 -0109001b -0000a812 -0000b010 -24020006 -3c030ab1 -34631721 -14550618 -00000000 -14760616 -00000000 -3c086123 -3508f8e8 -3c09698d -3529919c -0109001b -0000a812 -0000b010 -24020000 -3c036123 -3463f8e8 -1455060a -00000000 -14760608 -00000000 -3c081bc6 -3508d70c -3c091752 -352903f8 -0109001b -0000a812 -0000b010 -24020001 -3c030474 -3463d314 -145505fc -00000000 -147605fa -00000000 -3c0849a7 -35088e40 -3c09b481 -352980ca -0109001b -0000a812 -0000b010 -24020000 -3c0349a7 -34638e40 -145505ee -00000000 -147605ec -00000000 -3c0802f0 -35089920 -3c0925c6 -3529fee0 -0109001b -0000a812 -0000b010 -24020000 -3c0302f0 -34639920 -145505e0 -00000000 -147605de -00000000 -3c080a15 -3508a7d4 -3c0936fc -35298496 -0109001b -0000a812 -0000b010 -24020000 -3c030a15 -3463a7d4 -145505d2 -00000000 -147605d0 -00000000 -3c08fbd9 -35081080 -3c09c13d -35292d2a -0109001b -0000a812 -0000b010 -24020001 -3c033a9b -3463e356 -145505c4 -00000000 -147605c2 -00000000 -3c08d0a0 -3508b000 -3c0970de -3529dc87 -0109001b -0000a812 -0000b010 -24020001 -3c035fc1 -3463d379 -145505b6 -00000000 -147605b4 -00000000 -3c0829a5 -3508da10 -3c09b87e -35299c40 -0109001b -0000a812 -0000b010 -24020000 -3c0329a5 -3463da10 -145505a8 -00000000 -147605a6 -00000000 -3c086067 -35080d88 -3c092b23 -35291300 -0109001b -0000a812 -0000b010 -24020002 -3c030a20 -3463e788 -1455059a -00000000 -14760598 -00000000 -3c089e58 -350828c2 -3c094040 -3529cf00 -0109001b -0000a812 -0000b010 -24020002 -3c031dd6 -34638ac2 -1455058c -00000000 -1476058a -00000000 -3c0861a9 -35087c80 -3c090a24 -352968b8 -0109001b -0000a812 -0000b010 -24020009 -3c030661 -3463ce08 -1455057e -00000000 -1476057c -00000000 -3c0894e8 -3508395f -3c09e5bd -3529280c -0109001b -0000a812 -0000b010 -24020000 -3c0394e8 -3463395f -14550570 -00000000 -1476056e -00000000 -3c082aba -35084e7a -3c09482d -35297bc0 -0109001b -0000a812 -0000b010 -24020000 -3c032aba -34634e7a -14550562 -00000000 -14760560 -00000000 -3c080f57 -35088130 -3c096a1d -35290b70 -0109001b -0000a812 -0000b010 -24020000 -3c030f57 -34638130 -14550554 -00000000 -14760552 -00000000 -3c089e85 -350836f4 -3c097a2f -3529eeb0 -0109001b -0000a812 -0000b010 -24020001 -3c032455 -34634844 -14550546 -00000000 -14760544 -00000000 -3c086b7d -3508c118 -3c09034f -3529b77a -0109001b -0000a812 -0000b010 -24020020 -3c030186 -3463d1d8 -14550538 -00000000 -14760536 -00000000 -3c08c8b2 -3508bb64 -3c091e12 -352993c0 -0109001b -0000a812 -0000b010 -24020006 -3c031443 -346344e4 -1455052a -00000000 -14760528 -00000000 -3c085a45 -3508b336 -3c09d4fd -3529d710 -0109001b -0000a812 -0000b010 -24020000 -3c035a45 -3463b336 -1455051c -00000000 -1476051a -00000000 -3c086a65 -35084c20 -3c098148 -3529b638 -0109001b -0000a812 -0000b010 -24020000 -3c036a65 -34634c20 -1455050e -00000000 -1476050c -00000000 -3c08e794 -35080e6c -3c097526 -3529c3ea -0109001b -0000a812 -0000b010 -24020001 -3c03726d -34634a82 -14550500 -00000000 -147604fe -00000000 -3c0818be -35087274 -3c09e279 -35292f48 -0109001b -0000a812 -0000b010 -24020000 -3c0318be -34637274 -145504f2 -00000000 -147604f0 -00000000 -3c08e434 -3508cf56 -3c097ce3 -3529a860 -0109001b -0000a812 -0000b010 -24020001 -3c036751 -346326f6 -145504e4 -00000000 -147604e2 -00000000 -3c08fa77 -3508a0a8 -3c09b9d3 -35299f88 -0109001b -0000a812 -0000b010 -24020001 -3c0340a4 -34630120 -145504d6 -00000000 -147604d4 -00000000 -3c085033 -35085bbb -3c09950a -3529a144 -0109001b -0000a812 -0000b010 -24020000 -3c035033 -34635bbb -145504c8 -00000000 -147604c6 -00000000 -3c0863c4 -350827d6 -3c09e8d2 -35295300 -0109001b -0000a812 -0000b010 -24020000 -3c0363c4 -346327d6 -145504ba -00000000 -147604b8 -00000000 -3c0816c3 -3508484f -3c09db11 -35294140 -0109001b -0000a812 -0000b010 -24020000 -3c0316c3 -3463484f -145504ac -00000000 -147604aa -00000000 -3c08120a -35087000 -3c09abcd -3529db30 -0109001b -0000a812 -0000b010 -24020000 -3c03120a -34637000 -1455049e -00000000 -1476049c -00000000 -3c081f58 -3508c45c -3c09ad2e -35293d9f -0109001b -0000a812 -0000b010 -24020000 -3c031f58 -3463c45c -14550490 -00000000 -1476048e -00000000 -3c0824db -3508af34 -3c099aeb -3529deca -0109001b -0000a812 -0000b010 -24020000 -3c0324db -3463af34 -14550482 -00000000 -14760480 -00000000 -3c08a8b7 -35085800 -3c097de0 -35291766 -0109001b -0000a812 -0000b010 -24020001 -3c032ad7 -3463409a -14550474 -00000000 -14760472 -00000000 -3c08bdba -35086308 -3c09c7fa -35292550 -0109001b -0000a812 -0000b010 -24020000 -3c03bdba -34636308 -14550466 -00000000 -14760464 -00000000 -3c0899a3 -3508fd70 -3c0967bd -35297960 -0109001b -0000a812 -0000b010 -24020001 -3c0331e6 -34638410 -14550458 -00000000 -14760456 -00000000 -3c086a9d -3508cfc0 -3c0943d0 -352997e7 -0109001b -0000a812 -0000b010 -24020001 -3c0326cd -346337d9 -1455044a -00000000 -14760448 -00000000 -3c08c89c -3508e2a6 -3c09ffeb -35291c50 -0109001b -0000a812 -0000b010 -24020000 -3c03c89c -3463e2a6 -1455043c -00000000 -1476043a -00000000 -3c08f908 -35087cc8 -3c091240 -35290558 -0109001b -0000a812 -0000b010 -2402000d -3c030bc8 -34633750 -1455042e -00000000 -1476042c -00000000 -3c0871d7 -35089ea0 -3c09f9c3 -35295ddc -0109001b -0000a812 -0000b010 -24020000 -3c0371d7 -34639ea0 -14550420 -00000000 -1476041e -00000000 -3c08a18e -35089d80 -3c094e03 -35297d7c -0109001b -0000a812 -0000b010 -24020002 -3c030587 -3463a288 -14550412 -00000000 -14760410 -00000000 -3c089fd0 -3508aeb1 -3c09f59b -3529f246 -0109001b -0000a812 -0000b010 -24020000 -3c039fd0 -3463aeb1 -14550404 -00000000 -14760402 -00000000 -3c08d832 -35080444 -3c09716e -35295200 -0109001b -0000a812 -0000b010 -24020001 -3c0366c3 -3463b244 -145503f6 -00000000 -147603f4 -00000000 -3c08e484 -3508070c -3c0973d4 -35295434 -0109001b -0000a812 -0000b010 -24020001 -3c0370af -3463b2d8 -145503e8 -00000000 -147603e6 -00000000 -3c08f4d6 -35083b98 -3c09b57f -3529c508 -0109001b -0000a812 -0000b010 -24020001 -3c033f56 -34637690 -145503da -00000000 -147603d8 -00000000 -3c08e2f5 -35085044 -3c09f538 -352919b4 -0109001b -0000a812 -0000b010 -24020000 -3c03e2f5 -34635044 -145503cc -00000000 -147603ca -00000000 -3c082a24 -35081bb0 -3c09318e -35293806 -0109001b -0000a812 -0000b010 -24020000 -3c032a24 -34631bb0 -145503be -00000000 -147603bc -00000000 -3c08f66b -35082609 -3c094934 -35296ff4 -0109001b -0000a812 -0000b010 -24020003 -3c031acd -3463d62d -145503b0 -00000000 -147603ae -00000000 -3c080692 -35087823 -3c09cc06 -35295fbd -0109001b -0000a812 -0000b010 -24020000 -3c030692 -34637823 -145503a2 -00000000 -147603a0 -00000000 -3c085aa7 -3508865c -3c093703 -35297ada -0109001b -0000a812 -0000b010 -24020001 -3c0323a4 -34630b82 -14550394 -00000000 -14760392 -00000000 -3c089770 -3508dac0 -3c09e866 -35299633 -0109001b -0000a812 -0000b010 -24020000 -3c039770 -3463dac0 -14550386 -00000000 -14760384 -00000000 -3c08a96b -35086404 -3c0936e6 -3529cb60 -0109001b -0000a812 -0000b010 -24020003 -3c0304b7 -346301e4 -14550378 -00000000 -14760376 -00000000 -3c08fc71 -3508887e -3c099986 -352980d0 -0109001b -0000a812 -0000b010 -24020001 -3c0362eb -346307ae -1455036a -00000000 -14760368 -00000000 -3c081966 -3508d6a4 -3c09647c -35297020 -0109001b -0000a812 -0000b010 -24020000 -3c031966 -3463d6a4 -1455035c -00000000 -1476035a -00000000 -3c08a8e2 -350820c4 -3c09eb56 -3529ad48 -0109001b -0000a812 -0000b010 -24020000 -3c03a8e2 -346320c4 -1455034e -00000000 -1476034c -00000000 -3c085950 -3508b640 -3c093874 -35292cd3 -0109001b -0000a812 -0000b010 -24020001 -3c0320dc -3463896d -14550340 -00000000 -1476033e -00000000 -3c08a11a -35083e87 -3c095af3 -352951a0 -0109001b -0000a812 -0000b010 -24020001 -3c034626 -3463ece7 -14550332 -00000000 -14760330 -00000000 -3c0863d2 -3508bd00 -3c0942d0 -3529a200 -0109001b -0000a812 -0000b010 -24020001 -3c032102 -34631b00 -14550324 -00000000 -14760322 -00000000 -3c088fe9 -35080d8e -3c09b366 -3529c608 -0109001b -0000a812 -0000b010 -24020000 -3c038fe9 -34630d8e -14550316 -00000000 -14760314 -00000000 -3c080908 -3508a490 -3c095991 -35298c08 -0109001b -0000a812 -0000b010 -24020000 -3c030908 -3463a490 -14550308 -00000000 -14760306 -00000000 -3c08d30c -35088a6c -3c092ae7 -35293552 -0109001b -0000a812 -0000b010 -24020004 -3c03276f -3463b524 -145502fa -00000000 -147602f8 -00000000 -3c0861e9 -350824f8 -3c0961be -3529c600 -0109001b -0000a812 -0000b010 -24020001 -3c03002a -34635ef8 -145502ec -00000000 -147602ea -00000000 -3c08f45f -35086ed8 -3c09131b -3529fc78 -0109001b -0000a812 -0000b010 -2402000c -3c030f0f -34639938 -145502de -00000000 -147602dc -00000000 -3c081fbf -35081006 -3c0964e4 -352904e0 -0109001b -0000a812 -0000b010 -24020000 -3c031fbf -34631006 -145502d0 -00000000 -147602ce -00000000 -3c0870e2 -350816ac -3c09a748 -3529d3f9 -0109001b -0000a812 -0000b010 -24020000 -3c0370e2 -346316ac -145502c2 -00000000 -147602c0 -00000000 -3c089ca2 -35080f65 -3c09b354 -3529a050 -0109001b -0000a812 -0000b010 -24020000 -3c039ca2 -34630f65 -145502b4 -00000000 -147602b2 -00000000 -3c083aa6 -35085400 -3c094728 -352977d0 -0109001b -0000a812 -0000b010 -24020000 -3c033aa6 -34635400 -145502a6 -00000000 -147602a4 -00000000 -3c08aa24 -35085e30 -3c093f5a -35292ef4 -0109001b -0000a812 -0000b010 -24020002 -3c032b70 -34630048 -14550298 -00000000 -14760296 -00000000 -3c0876e2 -35087de0 -3c09bef0 -3529a908 -0109001b -0000a812 -0000b010 -24020000 -3c0376e2 -34637de0 -1455028a -00000000 -14760288 -00000000 -3c088bd8 -3508dae8 -3c0995a7 -3529b198 -0109001b -0000a812 -0000b010 -24020000 -3c038bd8 -3463dae8 -1455027c -00000000 -1476027a -00000000 -3c08771f -3508ef95 -3c0940f8 -35296998 -0109001b -0000a812 -0000b010 -24020001 -3c033627 -346385fd -1455026e -00000000 -1476026c -00000000 -3c084b88 -35081a60 -3c0945aa -35298b18 -0109001b -0000a812 -0000b010 -24020001 -3c0305dd -34638f48 -14550260 -00000000 -1476025e -00000000 -3c0830bd -3508c4e9 -3c098116 -35298740 -0109001b -0000a812 -0000b010 -24020000 -3c0330bd -3463c4e9 -14550252 -00000000 -14760250 -00000000 -3c08770c -35085798 -3c093f28 -3529fa66 -0109001b -0000a812 -0000b010 -24020001 -3c0337e3 -34635d32 -14550244 -00000000 -14760242 -00000000 -3c08deb9 -3508ee04 -3c093126 -3529ea9c -0109001b -0000a812 -0000b010 -24020004 -3c031a1e -34634394 -14550236 -00000000 -14760234 -00000000 -3c0848ae -350881f0 -3c095e0c -3529351c -0109001b -0000a812 -0000b010 -24020000 -3c0348ae -346381f0 -14550228 -00000000 -14760226 -00000000 -3c088c73 -3508948c -3c09e6c8 -3529142a -0109001b -0000a812 -0000b010 -24020000 -3c038c73 -3463948c -1455021a -00000000 -14760218 -00000000 -3c082d02 -3508be90 -3c093d69 -3529ba94 -0109001b -0000a812 -0000b010 -24020000 -3c032d02 -3463be90 -1455020c -00000000 -1476020a -00000000 -3c08622d -35080eec -3c097b68 -3529c7db -0109001b -0000a812 -0000b010 -24020000 -3c03622d -34630eec -145501fe -00000000 -147601fc -00000000 -3c0823ae -3508abc0 -3c09a675 -35297640 -0109001b -0000a812 -0000b010 -24020000 -3c0323ae -3463abc0 -145501f0 -00000000 -147601ee -00000000 -3c08a424 -350805dc -3c0981ae -352985b0 -0109001b -0000a812 -0000b010 -24020001 -3c032275 -3463802c -145501e2 -00000000 -147601e0 -00000000 -3c085ffb -35085218 -3c09e6ff -35291010 -0109001b -0000a812 -0000b010 -24020000 -3c035ffb -34635218 -145501d4 -00000000 -147601d2 -00000000 -3c087d92 -3508100f -3c0954b4 -3529ea50 -0109001b -0000a812 -0000b010 -24020001 -3c0328dd -346325bf -145501c6 -00000000 -147601c4 -00000000 -3c08890e -3508fcf8 -3c094489 -35290dbe -0109001b -0000a812 -0000b010 -24020001 -3c034485 -3463ef3a -145501b8 -00000000 -147601b6 -00000000 -3c08a40c -3508e6b4 -3c09b028 -35295cf8 -0109001b -0000a812 -0000b010 -24020000 -3c03a40c -3463e6b4 -145501aa -00000000 -147601a8 -00000000 -3c082c2a -35089fc2 -3c092c67 -35297764 -0109001b -0000a812 -0000b010 -24020000 -3c032c2a -34639fc2 -1455019c -00000000 -1476019a -00000000 -3c082238 -35087270 -3c091ffa -3529c566 -0109001b -0000a812 -0000b010 -24020001 -3c03023d -3463ad0a -1455018e -00000000 -1476018c -00000000 -3c08a41f -350802e0 -3c09ba83 -35291348 -0109001b -0000a812 -0000b010 -24020000 -3c03a41f -346302e0 -14550180 -00000000 -1476017e -00000000 -3c0874d4 -3508d90c -3c09f943 -3529bdf7 -0109001b -0000a812 -0000b010 -24020000 -3c0374d4 -3463d90c -14550172 -00000000 -14760170 -00000000 -3c087f8f -350869a8 -3c09101d -352939a2 -0109001b -0000a812 -0000b010 -24020007 -3c030ec2 -3463d63a -14550164 -00000000 -14760162 -00000000 -3c08f36e -3508a730 -3c0918ad -352984b0 -0109001b -0000a812 -0000b010 -24020009 -3c031554 -3463fd00 -14550156 -00000000 -14760154 -00000000 -3c08b95e -3508fa94 -3c090f34 -3529d9c6 -0109001b -0000a812 -0000b010 -2402000c -3c0302e4 -3463c54c -14550148 -00000000 -14760146 -00000000 -3c0836a2 -3508aa20 -3c09ad41 -35294f06 -0109001b -0000a812 -0000b010 -24020000 -3c0336a2 -3463aa20 -1455013a -00000000 -14760138 -00000000 -3c08fad6 -35089b46 -3c09d353 -352919d4 -0109001b -0000a812 -0000b010 -24020001 -3c032783 -34638172 -1455012c -00000000 -1476012a -00000000 -3c083a7d -3508ca48 -3c09d026 -35299d48 -0109001b -0000a812 -0000b010 -24020000 -3c033a7d -3463ca48 -1455011e -00000000 -1476011c -00000000 -3c08c01f -3508c0f0 -3c095f2b -3529dce0 -0109001b -0000a812 -0000b010 -24020002 -3c0301c8 -34630730 -14550110 -00000000 -1476010e -00000000 -3c08136c -35082456 -3c09d2f7 -3529a520 -0109001b -0000a812 -0000b010 -24020000 -3c03136c -34632456 -14550102 -00000000 -14760100 -00000000 -3c08ea64 -350862b8 -3c092747 -35295ad2 -0109001b -0000a812 -0000b010 -24020005 -3c0325ff -34639c9e -145500f4 -00000000 -147600f2 -00000000 -3c0845f1 -3508cbe2 -3c09187f -35299910 -0109001b -0000a812 -0000b010 -24020002 -3c0314f2 -346399c2 -145500e6 -00000000 -147600e4 -00000000 -3c08c33b -350885ca -3c091264 -352949e8 -0109001b -0000a812 -0000b010 -2402000a -3c030b50 -3463a2ba -145500d8 -00000000 -147600d6 -00000000 -3c082027 -35083480 -3c09f35d -3529b380 -0109001b -0000a812 -0000b010 -24020000 -3c032027 -34633480 -145500ca -00000000 -147600c8 -00000000 -3c08afa6 -35086e60 -3c09eb2a -3529c674 -0109001b -0000a812 -0000b010 -24020000 -3c03afa6 -34636e60 -145500bc -00000000 -147600ba -00000000 -3c08ad86 -35088694 -3c09d786 -35296c44 -0109001b -0000a812 -0000b010 -24020000 -3c03ad86 -34638694 -145500ae -00000000 -147600ac -00000000 -3c08702f -35081d39 -3c09cba2 -3529eeb0 -0109001b -0000a812 -0000b010 -24020000 -3c03702f -34631d39 -145500a0 -00000000 -1476009e -00000000 -3c0883f8 -35086060 -3c092937 -35290ff3 -0109001b -0000a812 -0000b010 -24020003 -3c030853 -34633087 -14550092 -00000000 -14760090 -00000000 -3c08af7a -3508dfb0 -3c09b142 -35294b48 -0109001b -0000a812 -0000b010 -24020000 -3c03af7a -3463dfb0 -14550084 -00000000 -14760082 -00000000 -3c089adb -35080050 -3c09a09f -3529cd00 -0109001b -0000a812 -0000b010 -24020000 -3c039adb -34630050 -14550076 -00000000 -14760074 -00000000 -3c08f2f1 -35086e2e -3c097573 -3529d2f8 -0109001b -0000a812 -0000b010 -24020002 -3c030809 -3463c83e -14550068 -00000000 -14760066 -00000000 -3c089995 -35081902 -3c098a36 -35290740 -0109001b -0000a812 -0000b010 -24020001 -3c030f5f -346311c2 -1455005a -00000000 -14760058 -00000000 -24080000 -3c09bea6 -352985ab -0109001b -0000a812 -0000b010 -24020000 -24030000 -1455004e -00000000 -1476004c -00000000 -24080000 -3c09207e -3529d850 -0109001b -0000a812 -0000b010 -24020000 -24030000 -14550042 -00000000 -14760040 -00000000 -24080000 -3c0972c1 -35294afa -0109001b -0000a812 -0000b010 -24020000 -24030000 -14550036 -00000000 -14760034 -00000000 -24080000 -3c09ae53 -352965c0 -0109001b -0000a812 -0000b010 -24020000 -24030000 -1455002a -00000000 -14760028 -00000000 -24080000 -3c099670 -3529f9f0 -0109001b -0000a812 -0000b010 -24020000 -24030000 -1455001e -00000000 -1476001c -00000000 -24080000 -3c098e85 -3529bf30 -0109001b -0000a812 -0000b010 -24020000 -24030000 -14550012 -00000000 -14760010 -00000000 -24080000 -3c0911f1 -3529eca7 -0109001b -0000a812 -0000b010 -24020000 -24030000 -14550006 -00000000 -14760004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -24120000 -001fb821 -24020000 -24030000 -3c08bfc1 -250812cc -3c09bfc1 -252912f8 -10000008 -00000000 -03e02021 -3c026e6b -3442362a -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03240b -3463af26 -0017f821 -3c156e6b -36b5362a -3c16240b -36d6af26 -145515c6 -00000000 -147615c4 -00000000 -3c15bfc1 -26b512e0 -3c16bfc1 -26d612f0 -149615be -00000000 -14b515bc -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508136c -3c09bfc1 -25291398 -10000008 -00000000 -03e02021 -3c025d0f -3442cbc0 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03dba3 -3463ac64 -0017f821 -3c155d0f -36b5cbc0 -3c16dba3 -36d6ac64 -1455159e -00000000 -1476159c -00000000 -3c15bfc1 -26b51380 -3c16bfc1 -26d61390 -14961596 -00000000 -14b51594 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508140c -3c09bfc1 -25291438 -10000008 -00000000 -03e02021 -3c02a832 -3442bb00 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03f43f -3463a620 -0017f821 -3c15a832 -36b5bb00 -3c16f43f -36d6a620 -14551576 -00000000 -14761574 -00000000 -3c15bfc1 -26b51420 -3c16bfc1 -26d61430 -1496156e -00000000 -14b5156c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250814ac -3c09bfc1 -252914d8 -10000008 -00000000 -03e02021 -3c021e2a -3442a5ca -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c034782 -3463fd22 -0017f821 -3c151e2a -36b5a5ca -3c164782 -36d6fd22 -1455154e -00000000 -1476154c -00000000 -3c15bfc1 -26b514c0 -3c16bfc1 -26d614d0 -14961546 -00000000 -14b51544 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508154c -3c09bfc1 -25291578 -10000008 -00000000 -03e02021 -3c02188e -34423538 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03278b -34635208 -0017f821 -3c15188e -36b53538 -3c16278b -36d65208 -14551526 -00000000 -14761524 -00000000 -3c15bfc1 -26b51560 -3c16bfc1 -26d61570 -1496151e -00000000 -14b5151c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250815ec -3c09bfc1 -25291618 -10000008 -00000000 -03e02021 -3c02e03f -3442ef90 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03d294 -3463c6c0 -0017f821 -3c15e03f -36b5ef90 -3c16d294 -36d6c6c0 -145514fe -00000000 -147614fc -00000000 -3c15bfc1 -26b51600 -3c16bfc1 -26d61610 -149614f6 -00000000 -14b514f4 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508168c -3c09bfc1 -252916b8 -10000008 -00000000 -03e02021 -3c0223a4 -34429840 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03d067 -34637a68 -0017f821 -3c1523a4 -36b59840 -3c16d067 -36d67a68 -145514d6 -00000000 -147614d4 -00000000 -3c15bfc1 -26b516a0 -3c16bfc1 -26d616b0 -149614ce -00000000 -14b514cc -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508172c -3c09bfc1 -25291758 -10000008 -00000000 -03e02021 -3c025578 -34421794 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03af21 -34633480 -0017f821 -3c155578 -36b51794 -3c16af21 -36d63480 -145514ae -00000000 -147614ac -00000000 -3c15bfc1 -26b51740 -3c16bfc1 -26d61750 -149614a6 -00000000 -14b514a4 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250817cc -3c09bfc1 -252917f8 -10000008 -00000000 -03e02021 -3c0278d9 -344276ca -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c030f5c -34637b6e -0017f821 -3c1578d9 -36b576ca -3c160f5c -36d67b6e -14551486 -00000000 -14761484 -00000000 -3c15bfc1 -26b517e0 -3c16bfc1 -26d617f0 -1496147e -00000000 -14b5147c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508186c -3c09bfc1 -25291898 -10000008 -00000000 -03e02021 -3c0241be -34428dfc -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03ea0d -34633954 -0017f821 -3c1541be -36b58dfc -3c16ea0d -36d63954 -1455145e -00000000 -1476145c -00000000 -3c15bfc1 -26b51880 -3c16bfc1 -26d61890 -14961456 -00000000 -14b51454 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508190c -3c09bfc1 -25291938 -10000008 -00000000 -03e02021 -3c025975 -3442ddea -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03191b -3463fc2c -0017f821 -3c155975 -36b5ddea -3c16191b -36d6fc2c -14551436 -00000000 -14761434 -00000000 -3c15bfc1 -26b51920 -3c16bfc1 -26d61930 -1496142e -00000000 -14b5142c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250819ac -3c09bfc1 -252919d8 -10000008 -00000000 -03e02021 -3c022af9 -34423360 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c036d4e -3463d976 -0017f821 -3c152af9 -36b53360 -3c166d4e -36d6d976 -1455140e -00000000 -1476140c -00000000 -3c15bfc1 -26b519c0 -3c16bfc1 -26d619d0 -14961406 -00000000 -14b51404 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25081a4c -3c09bfc1 -25291a78 -10000008 -00000000 -03e02021 -3c028b28 -3442908c -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c032506 -3463cdf6 -0017f821 -3c158b28 -36b5908c -3c162506 -36d6cdf6 -145513e6 -00000000 -147613e4 -00000000 -3c15bfc1 -26b51a60 -3c16bfc1 -26d61a70 -149613de -00000000 -14b513dc -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25081aec -3c09bfc1 -25291b18 -10000008 -00000000 -03e02021 -3c02b880 -3442f72b -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c0378b6 -34635ab0 -0017f821 -3c15b880 -36b5f72b -3c1678b6 -36d65ab0 -145513be -00000000 -147613bc -00000000 -3c15bfc1 -26b51b00 -3c16bfc1 -26d61b10 -149613b6 -00000000 -14b513b4 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25081b8c -3c09bfc1 -25291bb8 -10000008 -00000000 -03e02021 -3c029abc -34422fae -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c031fcc -3463c210 -0017f821 -3c159abc -36b52fae -3c161fcc -36d6c210 -14551396 -00000000 -14761394 -00000000 -3c15bfc1 -26b51ba0 -3c16bfc1 -26d61bb0 -1496138e -00000000 -14b5138c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25081c2c -3c09bfc1 -25291c58 -10000008 -00000000 -03e02021 -3c02468c -3442a120 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c0363a8 -3463cd28 -0017f821 -3c15468c -36b5a120 -3c1663a8 -36d6cd28 -1455136e -00000000 -1476136c -00000000 -3c15bfc1 -26b51c40 -3c16bfc1 -26d61c50 -14961366 -00000000 -14b51364 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25081ccc -3c09bfc1 -25291cf8 -10000008 -00000000 -03e02021 -3c02bd5f -34428d6a -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c039ccc -34635a00 -0017f821 -3c15bd5f -36b58d6a -3c169ccc -36d65a00 -14551346 -00000000 -14761344 -00000000 -3c15bfc1 -26b51ce0 -3c16bfc1 -26d61cf0 -1496133e -00000000 -14b5133c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25081d6c -3c09bfc1 -25291d98 -10000008 -00000000 -03e02021 -3c025ff3 -34423ad0 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c038d63 -34633be8 -0017f821 -3c155ff3 -36b53ad0 -3c168d63 -36d63be8 -1455131e -00000000 -1476131c -00000000 -3c15bfc1 -26b51d80 -3c16bfc1 -26d61d90 -14961316 -00000000 -14b51314 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25081e0c -3c09bfc1 -25291e38 -10000008 -00000000 -03e02021 -3c028af0 -34424fe8 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c033eaf -34635ed6 -0017f821 -3c158af0 -36b54fe8 -3c163eaf -36d65ed6 -145512f6 -00000000 -147612f4 -00000000 -3c15bfc1 -26b51e20 -3c16bfc1 -26d61e30 -149612ee -00000000 -14b512ec -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25081eac -3c09bfc1 -25291ed8 -10000008 -00000000 -03e02021 -3c02e392 -344249c6 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03adcd -34637888 -0017f821 -3c15e392 -36b549c6 -3c16adcd -36d67888 -145512ce -00000000 -147612cc -00000000 -3c15bfc1 -26b51ec0 -3c16bfc1 -26d61ed0 -149612c6 -00000000 -14b512c4 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25081f4c -3c09bfc1 -25291f78 -10000008 -00000000 -03e02021 -3c02e40a -3442da2a -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c031085 -34637a80 -0017f821 -3c15e40a -36b5da2a -3c161085 -36d67a80 -145512a6 -00000000 -147612a4 -00000000 -3c15bfc1 -26b51f60 -3c16bfc1 -26d61f70 -1496129e -00000000 -14b5129c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25081fec -3c09bfc1 -25292018 -10000008 -00000000 -03e02021 -3c025e3b -3442e25a -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03147f -3463379c -0017f821 -3c155e3b -36b5e25a -3c16147f -36d6379c -1455127e -00000000 -1476127c -00000000 -3c15bfc1 -26b52000 -3c16bfc1 -26d62010 -14961276 -00000000 -14b51274 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508208c -3c09bfc1 -252920b8 -10000008 -00000000 -03e02021 -3c02411b -3442d014 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03cbdb -346391f0 -0017f821 -3c15411b -36b5d014 -3c16cbdb -36d691f0 -14551256 -00000000 -14761254 -00000000 -3c15bfc1 -26b520a0 -3c16bfc1 -26d620b0 -1496124e -00000000 -14b5124c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508212c -3c09bfc1 -25292158 -10000008 -00000000 -03e02021 -3c028bf6 -34426f88 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c039c01 -3463e678 -0017f821 -3c158bf6 -36b56f88 -3c169c01 -36d6e678 -1455122e -00000000 -1476122c -00000000 -3c15bfc1 -26b52140 -3c16bfc1 -26d62150 -14961226 -00000000 -14b51224 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250821cc -3c09bfc1 -252921f8 -10000008 -00000000 -03e02021 -3c02d2db -3442e41e -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03c555 -3463e593 -0017f821 -3c15d2db -36b5e41e -3c16c555 -36d6e593 -14551206 -00000000 -14761204 -00000000 -3c15bfc1 -26b521e0 -3c16bfc1 -26d621f0 -149611fe -00000000 -14b511fc -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508226c -3c09bfc1 -25292298 -10000008 -00000000 -03e02021 -3c024a63 -3442d80f -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c030be2 -3463df78 -0017f821 -3c154a63 -36b5d80f -3c160be2 -36d6df78 -145511de -00000000 -147611dc -00000000 -3c15bfc1 -26b52280 -3c16bfc1 -26d62290 -149611d6 -00000000 -14b511d4 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508230c -3c09bfc1 -25292338 -10000008 -00000000 -03e02021 -3c02349a -3442f1fb -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03ada0 -34635010 -0017f821 -3c15349a -36b5f1fb -3c16ada0 -36d65010 -145511b6 -00000000 -147611b4 -00000000 -3c15bfc1 -26b52320 -3c16bfc1 -26d62330 -149611ae -00000000 -14b511ac -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250823ac -3c09bfc1 -252923d8 -10000008 -00000000 -03e02021 -3c0230ed -344273d0 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03f431 -346385b8 -0017f821 -3c1530ed -36b573d0 -3c16f431 -36d685b8 -1455118e -00000000 -1476118c -00000000 -3c15bfc1 -26b523c0 -3c16bfc1 -26d623d0 -14961186 -00000000 -14b51184 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508244c -3c09bfc1 -25292478 -10000008 -00000000 -03e02021 -3c025488 -3442c147 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03ef42 -34633493 -0017f821 -3c155488 -36b5c147 -3c16ef42 -36d63493 -14551166 -00000000 -14761164 -00000000 -3c15bfc1 -26b52460 -3c16bfc1 -26d62470 -1496115e -00000000 -14b5115c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250824ec -3c09bfc1 -25292518 -10000008 -00000000 -03e02021 -3c02280d -3442cfb0 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03654b -346302dc -0017f821 -3c15280d -36b5cfb0 -3c16654b -36d602dc -1455113e -00000000 -1476113c -00000000 -3c15bfc1 -26b52500 -3c16bfc1 -26d62510 -14961136 -00000000 -14b51134 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508258c -3c09bfc1 -252925b8 -10000008 -00000000 -03e02021 -3c020ac9 -34422d20 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03704b -3463ae70 -0017f821 -3c150ac9 -36b52d20 -3c16704b -36d6ae70 -14551116 -00000000 -14761114 -00000000 -3c15bfc1 -26b525a0 -3c16bfc1 -26d625b0 -1496110e -00000000 -14b5110c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508262c -3c09bfc1 -25292658 -10000008 -00000000 -03e02021 -3c021ef2 -34422360 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c0373a8 -3463e5f8 -0017f821 -3c151ef2 -36b52360 -3c1673a8 -36d6e5f8 -145510ee -00000000 -147610ec -00000000 -3c15bfc1 -26b52640 -3c16bfc1 -26d62650 -149610e6 -00000000 -14b510e4 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250826cc -3c09bfc1 -252926f8 -10000008 -00000000 -03e02021 -3c02cbde -3442cc5e -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c032ad3 -34631d30 -0017f821 -3c15cbde -36b5cc5e -3c162ad3 -36d61d30 -145510c6 -00000000 -147610c4 -00000000 -3c15bfc1 -26b526e0 -3c16bfc1 -26d626f0 -149610be -00000000 -14b510bc -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508276c -3c09bfc1 -25292798 -10000008 -00000000 -03e02021 -3c02cd0c -34427478 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03be1a -34632679 -0017f821 -3c15cd0c -36b57478 -3c16be1a -36d62679 -1455109e -00000000 -1476109c -00000000 -3c15bfc1 -26b52780 -3c16bfc1 -26d62790 -14961096 -00000000 -14b51094 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508280c -3c09bfc1 -25292838 -10000008 -00000000 -03e02021 -3c02b22d -3442bf3a -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c036a75 -34639f80 -0017f821 -3c15b22d -36b5bf3a -3c166a75 -36d69f80 -14551076 -00000000 -14761074 -00000000 -3c15bfc1 -26b52820 -3c16bfc1 -26d62830 -1496106e -00000000 -14b5106c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250828ac -3c09bfc1 -252928d8 -10000008 -00000000 -03e02021 -3c029212 -34428c02 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c035c00 -3463f61b -0017f821 -3c159212 -36b58c02 -3c165c00 -36d6f61b -1455104e -00000000 -1476104c -00000000 -3c15bfc1 -26b528c0 -3c16bfc1 -26d628d0 -14961046 -00000000 -14b51044 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508294c -3c09bfc1 -25292978 -10000008 -00000000 -03e02021 -3c029f65 -3442ad30 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c039df7 -3463b834 -0017f821 -3c159f65 -36b5ad30 -3c169df7 -36d6b834 -14551026 -00000000 -14761024 -00000000 -3c15bfc1 -26b52960 -3c16bfc1 -26d62970 -1496101e -00000000 -14b5101c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250829ec -3c09bfc1 -25292a18 -10000008 -00000000 -03e02021 -3c0251c4 -344288e0 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03f5d6 -3463fc20 -0017f821 -3c1551c4 -36b588e0 -3c16f5d6 -36d6fc20 -14550ffe -00000000 -14760ffc -00000000 -3c15bfc1 -26b52a00 -3c16bfc1 -26d62a10 -14960ff6 -00000000 -14b50ff4 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25082a8c -3c09bfc1 -25292ab8 -10000008 -00000000 -03e02021 -3c029f55 -344201c0 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03d3e3 -34631474 -0017f821 -3c159f55 -36b501c0 -3c16d3e3 -36d61474 -14550fd6 -00000000 -14760fd4 -00000000 -3c15bfc1 -26b52aa0 -3c16bfc1 -26d62ab0 -14960fce -00000000 -14b50fcc -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25082b2c -3c09bfc1 -25292b58 -10000008 -00000000 -03e02021 -3c02536d -3442e97e -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03c2bb -3463d95c -0017f821 -3c15536d -36b5e97e -3c16c2bb -36d6d95c -14550fae -00000000 -14760fac -00000000 -3c15bfc1 -26b52b40 -3c16bfc1 -26d62b50 -14960fa6 -00000000 -14b50fa4 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25082bcc -3c09bfc1 -25292bf8 -10000008 -00000000 -03e02021 -3c02e61b -3442e653 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03b66c -3463d180 -0017f821 -3c15e61b -36b5e653 -3c16b66c -36d6d180 -14550f86 -00000000 -14760f84 -00000000 -3c15bfc1 -26b52be0 -3c16bfc1 -26d62bf0 -14960f7e -00000000 -14b50f7c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25082c6c -3c09bfc1 -25292c98 -10000008 -00000000 -03e02021 -3c0206ed -344293e0 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c038013 -3463cb46 -0017f821 -3c1506ed -36b593e0 -3c168013 -36d6cb46 -14550f5e -00000000 -14760f5c -00000000 -3c15bfc1 -26b52c80 -3c16bfc1 -26d62c90 -14960f56 -00000000 -14b50f54 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25082d0c -3c09bfc1 -25292d38 -10000008 -00000000 -03e02021 -3c024db2 -3442624a -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03882a -3463a40a -0017f821 -3c154db2 -36b5624a -3c16882a -36d6a40a -14550f36 -00000000 -14760f34 -00000000 -3c15bfc1 -26b52d20 -3c16bfc1 -26d62d30 -14960f2e -00000000 -14b50f2c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25082dac -3c09bfc1 -25292dd8 -10000008 -00000000 -03e02021 -3c029c18 -3442c981 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03d46b -34630540 -0017f821 -3c159c18 -36b5c981 -3c16d46b -36d60540 -14550f0e -00000000 -14760f0c -00000000 -3c15bfc1 -26b52dc0 -3c16bfc1 -26d62dd0 -14960f06 -00000000 -14b50f04 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25082e4c -3c09bfc1 -25292e78 -10000008 -00000000 -03e02021 -3c022036 -34422ea8 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03dda4 -3463e301 -0017f821 -3c152036 -36b52ea8 -3c16dda4 -36d6e301 -14550ee6 -00000000 -14760ee4 -00000000 -3c15bfc1 -26b52e60 -3c16bfc1 -26d62e70 -14960ede -00000000 -14b50edc -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25082eec -3c09bfc1 -25292f18 -10000008 -00000000 -03e02021 -3c02bd4e -3442b617 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03d586 -346364c0 -0017f821 -3c15bd4e -36b5b617 -3c16d586 -36d664c0 -14550ebe -00000000 -14760ebc -00000000 -3c15bfc1 -26b52f00 -3c16bfc1 -26d62f10 -14960eb6 -00000000 -14b50eb4 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25082f8c -3c09bfc1 -25292fb8 -10000008 -00000000 -03e02021 -3c021b55 -344248ff -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03f3cd -34635356 -0017f821 -3c151b55 -36b548ff -3c16f3cd -36d65356 -14550e96 -00000000 -14760e94 -00000000 -3c15bfc1 -26b52fa0 -3c16bfc1 -26d62fb0 -14960e8e -00000000 -14b50e8c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508302c -3c09bfc1 -25293058 -10000008 -00000000 -03e02021 -3c02268d -3442cc90 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03fb3b -346387a0 -0017f821 -3c15268d -36b5cc90 -3c16fb3b -36d687a0 -14550e6e -00000000 -14760e6c -00000000 -3c15bfc1 -26b53040 -3c16bfc1 -26d63050 -14960e66 -00000000 -14b50e64 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250830cc -3c09bfc1 -252930f8 -10000008 -00000000 -03e02021 -3c02dac4 -34429479 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03ba03 -34636d18 -0017f821 -3c15dac4 -36b59479 -3c16ba03 -36d66d18 -14550e46 -00000000 -14760e44 -00000000 -3c15bfc1 -26b530e0 -3c16bfc1 -26d630f0 -14960e3e -00000000 -14b50e3c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508316c -3c09bfc1 -25293198 -10000008 -00000000 -03e02021 -3c0235b5 -34428838 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c0384dd -3463d8a0 -0017f821 -3c1535b5 -36b58838 -3c1684dd -36d6d8a0 -14550e1e -00000000 -14760e1c -00000000 -3c15bfc1 -26b53180 -3c16bfc1 -26d63190 -14960e16 -00000000 -14b50e14 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508320c -3c09bfc1 -25293238 -10000008 -00000000 -03e02021 -3c02731a -34428e00 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03f885 -3463d33c -0017f821 -3c15731a -36b58e00 -3c16f885 -36d6d33c -14550df6 -00000000 -14760df4 -00000000 -3c15bfc1 -26b53220 -3c16bfc1 -26d63230 -14960dee -00000000 -14b50dec -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250832ac -3c09bfc1 -252932d8 -10000008 -00000000 -03e02021 -3c02a5d3 -344267b4 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c035aa8 -34632d10 -0017f821 -3c15a5d3 -36b567b4 -3c165aa8 -36d62d10 -14550dce -00000000 -14760dcc -00000000 -3c15bfc1 -26b532c0 -3c16bfc1 -26d632d0 -14960dc6 -00000000 -14b50dc4 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508334c -3c09bfc1 -25293378 -10000008 -00000000 -03e02021 -3c029b23 -3442b0f0 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c031a1b -34639780 -0017f821 -3c159b23 -36b5b0f0 -3c161a1b -36d69780 -14550da6 -00000000 -14760da4 -00000000 -3c15bfc1 -26b53360 -3c16bfc1 -26d63370 -14960d9e -00000000 -14b50d9c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250833ec -3c09bfc1 -25293418 -10000008 -00000000 -03e02021 -3c02a631 -3442c6e6 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03c01e -34635184 -0017f821 -3c15a631 -36b5c6e6 -3c16c01e -36d65184 -14550d7e -00000000 -14760d7c -00000000 -3c15bfc1 -26b53400 -3c16bfc1 -26d63410 -14960d76 -00000000 -14b50d74 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508348c -3c09bfc1 -252934b8 -10000008 -00000000 -03e02021 -3c02cf03 -344250d0 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c0352e0 -3463a720 -0017f821 -3c15cf03 -36b550d0 -3c1652e0 -36d6a720 -14550d56 -00000000 -14760d54 -00000000 -3c15bfc1 -26b534a0 -3c16bfc1 -26d634b0 -14960d4e -00000000 -14b50d4c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508352c -3c09bfc1 -25293558 -10000008 -00000000 -03e02021 -3c023a50 -34428bf0 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c031dc1 -3463acf7 -0017f821 -3c153a50 -36b58bf0 -3c161dc1 -36d6acf7 -14550d2e -00000000 -14760d2c -00000000 -3c15bfc1 -26b53540 -3c16bfc1 -26d63550 -14960d26 -00000000 -14b50d24 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250835cc -3c09bfc1 -252935f8 -10000008 -00000000 -03e02021 -3c025343 -3442dc05 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03b235 -3463ce3d -0017f821 -3c155343 -36b5dc05 -3c16b235 -36d6ce3d -14550d06 -00000000 -14760d04 -00000000 -3c15bfc1 -26b535e0 -3c16bfc1 -26d635f0 -14960cfe -00000000 -14b50cfc -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508366c -3c09bfc1 -25293698 -10000008 -00000000 -03e02021 -3c02bb96 -3442b500 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03a62b -3463f360 -0017f821 -3c15bb96 -36b5b500 -3c16a62b -36d6f360 -14550cde -00000000 -14760cdc -00000000 -3c15bfc1 -26b53680 -3c16bfc1 -26d63690 -14960cd6 -00000000 -14b50cd4 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508370c -3c09bfc1 -25293738 -10000008 -00000000 -03e02021 -3c023a4c -3442eaac -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c030236 -3463e7f0 -0017f821 -3c153a4c -36b5eaac -3c160236 -36d6e7f0 -14550cb6 -00000000 -14760cb4 -00000000 -3c15bfc1 -26b53720 -3c16bfc1 -26d63730 -14960cae -00000000 -14b50cac -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250837ac -3c09bfc1 -252937d8 -10000008 -00000000 -03e02021 -3c022a6d -3442a2ec -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c038ca2 -34637828 -0017f821 -3c152a6d -36b5a2ec -3c168ca2 -36d67828 -14550c8e -00000000 -14760c8c -00000000 -3c15bfc1 -26b537c0 -3c16bfc1 -26d637d0 -14960c86 -00000000 -14b50c84 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508384c -3c09bfc1 -25293878 -10000008 -00000000 -03e02021 -3c02dd11 -3442c93c -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03008c -34635880 -0017f821 -3c15dd11 -36b5c93c -3c16008c -36d65880 -14550c66 -00000000 -14760c64 -00000000 -3c15bfc1 -26b53860 -3c16bfc1 -26d63870 -14960c5e -00000000 -14b50c5c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250838ec -3c09bfc1 -25293918 -10000008 -00000000 -03e02021 -3c02514f -34421f08 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03912f -3463a124 -0017f821 -3c15514f -36b51f08 -3c16912f -36d6a124 -14550c3e -00000000 -14760c3c -00000000 -3c15bfc1 -26b53900 -3c16bfc1 -26d63910 -14960c36 -00000000 -14b50c34 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508398c -3c09bfc1 -252939b8 -10000008 -00000000 -03e02021 -3c02d137 -3442f020 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c035028 -3463a644 -0017f821 -3c15d137 -36b5f020 -3c165028 -36d6a644 -14550c16 -00000000 -14760c14 -00000000 -3c15bfc1 -26b539a0 -3c16bfc1 -26d639b0 -14960c0e -00000000 -14b50c0c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25083a2c -3c09bfc1 -25293a58 -10000008 -00000000 -03e02021 -3c02d227 -34424400 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03bab4 -3463fdb0 -0017f821 -3c15d227 -36b54400 -3c16bab4 -36d6fdb0 -14550bee -00000000 -14760bec -00000000 -3c15bfc1 -26b53a40 -3c16bfc1 -26d63a50 -14960be6 -00000000 -14b50be4 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25083acc -3c09bfc1 -25293af8 -10000008 -00000000 -03e02021 -3c021c78 -3442ea70 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03ff1c -3463183c -0017f821 -3c151c78 -36b5ea70 -3c16ff1c -36d6183c -14550bc6 -00000000 -14760bc4 -00000000 -3c15bfc1 -26b53ae0 -3c16bfc1 -26d63af0 -14960bbe -00000000 -14b50bbc -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25083b6c -3c09bfc1 -25293b98 -10000008 -00000000 -03e02021 -3c0249a7 -3442b38c -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c032dd5 -34632c00 -0017f821 -3c1549a7 -36b5b38c -3c162dd5 -36d62c00 -14550b9e -00000000 -14760b9c -00000000 -3c15bfc1 -26b53b80 -3c16bfc1 -26d63b90 -14960b96 -00000000 -14b50b94 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25083c0c -3c09bfc1 -25293c38 -10000008 -00000000 -03e02021 -3c02eec8 -34420e06 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c034c46 -3463dc50 -0017f821 -3c15eec8 -36b50e06 -3c164c46 -36d6dc50 -14550b76 -00000000 -14760b74 -00000000 -3c15bfc1 -26b53c20 -3c16bfc1 -26d63c30 -14960b6e -00000000 -14b50b6c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25083cac -3c09bfc1 -25293cd8 -10000008 -00000000 -03e02021 -3c0299f5 -344215c6 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c030ac4 -3463da04 -0017f821 -3c1599f5 -36b515c6 -3c160ac4 -36d6da04 -14550b4e -00000000 -14760b4c -00000000 -3c15bfc1 -26b53cc0 -3c16bfc1 -26d63cd0 -14960b46 -00000000 -14b50b44 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25083d4c -3c09bfc1 -25293d78 -10000008 -00000000 -03e02021 -3c02af18 -3442a348 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03e934 -34632d00 -0017f821 -3c15af18 -36b5a348 -3c16e934 -36d62d00 -14550b26 -00000000 -14760b24 -00000000 -3c15bfc1 -26b53d60 -3c16bfc1 -26d63d70 -14960b1e -00000000 -14b50b1c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25083dec -3c09bfc1 -25293e18 -10000008 -00000000 -03e02021 -3c029f2f -3442f980 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03ce65 -3463a118 -0017f821 -3c159f2f -36b5f980 -3c16ce65 -36d6a118 -14550afe -00000000 -14760afc -00000000 -3c15bfc1 -26b53e00 -3c16bfc1 -26d63e10 -14960af6 -00000000 -14b50af4 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25083e8c -3c09bfc1 -25293eb8 -10000008 -00000000 -03e02021 -3c023cbf -34427f40 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03cb5d -34634589 -0017f821 -3c153cbf -36b57f40 -3c16cb5d -36d64589 -14550ad6 -00000000 -14760ad4 -00000000 -3c15bfc1 -26b53ea0 -3c16bfc1 -26d63eb0 -14960ace -00000000 -14b50acc -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25083f2c -3c09bfc1 -25293f58 -10000008 -00000000 -03e02021 -3c02563a -34421054 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03776a -34633d12 -0017f821 -3c15563a -36b51054 -3c16776a -36d63d12 -14550aae -00000000 -14760aac -00000000 -3c15bfc1 -26b53f40 -3c16bfc1 -26d63f50 -14960aa6 -00000000 -14b50aa4 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25083fcc -3c09bfc1 -25293ff8 -10000008 -00000000 -03e02021 -3c02199a -34425570 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c037ce1 -3463721b -0017f821 -3c15199a -36b55570 -3c167ce1 -36d6721b -14550a86 -00000000 -14760a84 -00000000 -3c15bfc1 -26b53fe0 -3c16bfc1 -26d63ff0 -14960a7e -00000000 -14b50a7c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508406c -3c09bfc1 -25294098 -10000008 -00000000 -03e02021 -3c0261aa -34423900 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03416d -3463dfc7 -0017f821 -3c1561aa -36b53900 -3c16416d -36d6dfc7 -14550a5e -00000000 -14760a5c -00000000 -3c15bfc1 -26b54080 -3c16bfc1 -26d64090 -14960a56 -00000000 -14b50a54 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508410c -3c09bfc1 -25294138 -10000008 -00000000 -03e02021 -3c02af13 -3442ac90 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c0323ff -3463f7b0 -0017f821 -3c15af13 -36b5ac90 -3c1623ff -36d6f7b0 -14550a36 -00000000 -14760a34 -00000000 -3c15bfc1 -26b54120 -3c16bfc1 -26d64130 -14960a2e -00000000 -14b50a2c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250841ac -3c09bfc1 -252941d8 -10000008 -00000000 -03e02021 -3c02deaf -3442bdfb -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03b227 -3463d4a0 -0017f821 -3c15deaf -36b5bdfb -3c16b227 -36d6d4a0 -14550a0e -00000000 -14760a0c -00000000 -3c15bfc1 -26b541c0 -3c16bfc1 -26d641d0 -14960a06 -00000000 -14b50a04 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508424c -3c09bfc1 -25294278 -10000008 -00000000 -03e02021 -3c02a66f -34423a2a -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c030cf9 -3463c0d4 -0017f821 -3c15a66f -36b53a2a -3c160cf9 -36d6c0d4 -145509e6 -00000000 -147609e4 -00000000 -3c15bfc1 -26b54260 -3c16bfc1 -26d64270 -149609de -00000000 -14b509dc -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250842ec -3c09bfc1 -25294318 -10000008 -00000000 -03e02021 -3c02982c -344251e8 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03f359 -346305fe -0017f821 -3c15982c -36b551e8 -3c16f359 -36d605fe -145509be -00000000 -147609bc -00000000 -3c15bfc1 -26b54300 -3c16bfc1 -26d64310 -149609b6 -00000000 -14b509b4 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508438c -3c09bfc1 -252943b8 -10000008 -00000000 -03e02021 -3c0278dc -34425240 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c0399ce -3463ce05 -0017f821 -3c1578dc -36b55240 -3c1699ce -36d6ce05 -14550996 -00000000 -14760994 -00000000 -3c15bfc1 -26b543a0 -3c16bfc1 -26d643b0 -1496098e -00000000 -14b5098c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508442c -3c09bfc1 -25294458 -10000008 -00000000 -03e02021 -3c0227aa -34429988 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c0363bd -34632180 -0017f821 -3c1527aa -36b59988 -3c1663bd -36d62180 -1455096e -00000000 -1476096c -00000000 -3c15bfc1 -26b54440 -3c16bfc1 -26d64450 -14960966 -00000000 -14b50964 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250844cc -3c09bfc1 -252944f8 -10000008 -00000000 -03e02021 -3c0298c5 -34425e18 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c034c8a -346323cc -0017f821 -3c1598c5 -36b55e18 -3c164c8a -36d623cc -14550946 -00000000 -14760944 -00000000 -3c15bfc1 -26b544e0 -3c16bfc1 -26d644f0 -1496093e -00000000 -14b5093c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508456c -3c09bfc1 -25294598 -10000008 -00000000 -03e02021 -3c020864 -3442e8d8 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03efa3 -3463c11f -0017f821 -3c150864 -36b5e8d8 -3c16efa3 -36d6c11f -1455091e -00000000 -1476091c -00000000 -3c15bfc1 -26b54580 -3c16bfc1 -26d64590 -14960916 -00000000 -14b50914 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508460c -3c09bfc1 -25294638 -10000008 -00000000 -03e02021 -3c02a012 -34429080 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03f8be -34632c38 -0017f821 -3c15a012 -36b59080 -3c16f8be -36d62c38 -145508f6 -00000000 -147608f4 -00000000 -3c15bfc1 -26b54620 -3c16bfc1 -26d64630 -149608ee -00000000 -14b508ec -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250846ac -3c09bfc1 -252946d8 -10000008 -00000000 -03e02021 -3c027fe9 -3442274c -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c037805 -3463ef1c -0017f821 -3c157fe9 -36b5274c -3c167805 -36d6ef1c -145508ce -00000000 -147608cc -00000000 -3c15bfc1 -26b546c0 -3c16bfc1 -26d646d0 -149608c6 -00000000 -14b508c4 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508474c -3c09bfc1 -25294778 -10000008 -00000000 -03e02021 -3c02f857 -34423c00 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c038d9a -34636b22 -0017f821 -3c15f857 -36b53c00 -3c168d9a -36d66b22 -145508a6 -00000000 -147608a4 -00000000 -3c15bfc1 -26b54760 -3c16bfc1 -26d64770 -1496089e -00000000 -14b5089c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250847ec -3c09bfc1 -25294818 -10000008 -00000000 -03e02021 -3c026d21 -34421770 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c0393e4 -3463396a -0017f821 -3c156d21 -36b51770 -3c1693e4 -36d6396a -1455087e -00000000 -1476087c -00000000 -3c15bfc1 -26b54800 -3c16bfc1 -26d64810 -14960876 -00000000 -14b50874 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508488c -3c09bfc1 -252948b8 -10000008 -00000000 -03e02021 -3c028a54 -34423f20 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c032e5d -3463a834 -0017f821 -3c158a54 -36b53f20 -3c162e5d -36d6a834 -14550856 -00000000 -14760854 -00000000 -3c15bfc1 -26b548a0 -3c16bfc1 -26d648b0 -1496084e -00000000 -14b5084c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508492c -3c09bfc1 -25294958 -10000008 -00000000 -03e02021 -3c02ba56 -3442e260 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c030fe2 -3463487a -0017f821 -3c15ba56 -36b5e260 -3c160fe2 -36d6487a -1455082e -00000000 -1476082c -00000000 -3c15bfc1 -26b54940 -3c16bfc1 -26d64950 -14960826 -00000000 -14b50824 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250849cc -3c09bfc1 -252949f8 -10000008 -00000000 -03e02021 -3c023c6a -34422b4a -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c031857 -3463965a -0017f821 -3c153c6a -36b52b4a -3c161857 -36d6965a -14550806 -00000000 -14760804 -00000000 -3c15bfc1 -26b549e0 -3c16bfc1 -26d649f0 -149607fe -00000000 -14b507fc -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25084a6c -3c09bfc1 -25294a98 -10000008 -00000000 -03e02021 -3c020d29 -34421e8b -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c030050 -34637018 -0017f821 -3c150d29 -36b51e8b -3c160050 -36d67018 -145507de -00000000 -147607dc -00000000 -3c15bfc1 -26b54a80 -3c16bfc1 -26d64a90 -149607d6 -00000000 -14b507d4 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25084b0c -3c09bfc1 -25294b38 -10000008 -00000000 -03e02021 -3c02cffd -34424000 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03c0fe -3463c614 -0017f821 -3c15cffd -36b54000 -3c16c0fe -36d6c614 -145507b6 -00000000 -147607b4 -00000000 -3c15bfc1 -26b54b20 -3c16bfc1 -26d64b30 -149607ae -00000000 -14b507ac -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25084bac -3c09bfc1 -25294bd8 -10000008 -00000000 -03e02021 -3c02257f -34429580 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c0351b6 -346301dc -0017f821 -3c15257f -36b59580 -3c1651b6 -36d601dc -1455078e -00000000 -1476078c -00000000 -3c15bfc1 -26b54bc0 -3c16bfc1 -26d64bd0 -14960786 -00000000 -14b50784 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25084c4c -3c09bfc1 -25294c78 -10000008 -00000000 -03e02021 -3c02e3ef -3442b2e4 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c033ece -34632a1e -0017f821 -3c15e3ef -36b5b2e4 -3c163ece -36d62a1e -14550766 -00000000 -14760764 -00000000 -3c15bfc1 -26b54c60 -3c16bfc1 -26d64c70 -1496075e -00000000 -14b5075c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25084cec -3c09bfc1 -25294d18 -10000008 -00000000 -03e02021 -3c026c5f -3442a775 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03ea5d -3463eeac -0017f821 -3c156c5f -36b5a775 -3c16ea5d -36d6eeac -1455073e -00000000 -1476073c -00000000 -3c15bfc1 -26b54d00 -3c16bfc1 -26d64d10 -14960736 -00000000 -14b50734 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25084d8c -3c09bfc1 -25294db8 -10000008 -00000000 -03e02021 -3c02a22f -344261a0 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c036188 -34637758 -0017f821 -3c15a22f -36b561a0 -3c166188 -36d67758 -14550716 -00000000 -14760714 -00000000 -3c15bfc1 -26b54da0 -3c16bfc1 -26d64db0 -1496070e -00000000 -14b5070c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25084e2c -3c09bfc1 -25294e58 -10000008 -00000000 -03e02021 -3c0269cd -34429484 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c037d39 -3463cf3c -0017f821 -3c1569cd -36b59484 -3c167d39 -36d6cf3c -145506ee -00000000 -147606ec -00000000 -3c15bfc1 -26b54e40 -3c16bfc1 -26d64e50 -149606e6 -00000000 -14b506e4 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25084ecc -3c09bfc1 -25294ef8 -10000008 -00000000 -03e02021 -3c0295a3 -3442f330 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c0361db -34635f48 -0017f821 -3c1595a3 -36b5f330 -3c1661db -36d65f48 -145506c6 -00000000 -147606c4 -00000000 -3c15bfc1 -26b54ee0 -3c16bfc1 -26d64ef0 -149606be -00000000 -14b506bc -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25084f6c -3c09bfc1 -25294f98 -10000008 -00000000 -03e02021 -3c020435 -34429d84 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03a0f4 -3463fb5f -0017f821 -3c150435 -36b59d84 -3c16a0f4 -36d6fb5f -1455069e -00000000 -1476069c -00000000 -3c15bfc1 -26b54f80 -3c16bfc1 -26d64f90 -14960696 -00000000 -14b50694 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508500c -3c09bfc1 -25295038 -10000008 -00000000 -03e02021 -3c024bb0 -344228b2 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c033bff -3463a5ec -0017f821 -3c154bb0 -36b528b2 -3c163bff -36d6a5ec -14550676 -00000000 -14760674 -00000000 -3c15bfc1 -26b55020 -3c16bfc1 -26d65030 -1496066e -00000000 -14b5066c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250850ac -3c09bfc1 -252950d8 -10000008 -00000000 -03e02021 -3c02e2b0 -3442a2c0 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03f225 -34635610 -0017f821 -3c15e2b0 -36b5a2c0 -3c16f225 -36d65610 -1455064e -00000000 -1476064c -00000000 -3c15bfc1 -26b550c0 -3c16bfc1 -26d650d0 -14960646 -00000000 -14b50644 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508514c -3c09bfc1 -25295178 -10000008 -00000000 -03e02021 -3c02a794 -3442d358 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03dd1b -3463da33 -0017f821 -3c15a794 -36b5d358 -3c16dd1b -36d6da33 -14550626 -00000000 -14760624 -00000000 -3c15bfc1 -26b55160 -3c16bfc1 -26d65170 -1496061e -00000000 -14b5061c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250851ec -3c09bfc1 -25295218 -10000008 -00000000 -03e02021 -3c02b7ff -3442a000 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03d9b9 -3463d158 -0017f821 -3c15b7ff -36b5a000 -3c16d9b9 -36d6d158 -145505fe -00000000 -147605fc -00000000 -3c15bfc1 -26b55200 -3c16bfc1 -26d65210 -149605f6 -00000000 -14b505f4 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508528c -3c09bfc1 -252952b8 -10000008 -00000000 -03e02021 -3c02308a -344297a0 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c032ea8 -346384ea -0017f821 -3c15308a -36b597a0 -3c162ea8 -36d684ea -145505d6 -00000000 -147605d4 -00000000 -3c15bfc1 -26b552a0 -3c16bfc1 -26d652b0 -149605ce -00000000 -14b505cc -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508532c -3c09bfc1 -25295358 -10000008 -00000000 -03e02021 -3c02c2aa -3442fe00 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03cba8 -3463aeda -0017f821 -3c15c2aa -36b5fe00 -3c16cba8 -36d6aeda -145505ae -00000000 -147605ac -00000000 -3c15bfc1 -26b55340 -3c16bfc1 -26d65350 -149605a6 -00000000 -14b505a4 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250853cc -3c09bfc1 -252953f8 -10000008 -00000000 -03e02021 -3c020c23 -34425ca6 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c0308da -3463d9f0 -0017f821 -3c150c23 -36b55ca6 -3c1608da -36d6d9f0 -14550586 -00000000 -14760584 -00000000 -3c15bfc1 -26b553e0 -3c16bfc1 -26d653f0 -1496057e -00000000 -14b5057c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508546c -3c09bfc1 -25295498 -10000008 -00000000 -03e02021 -3c020027 -344258af -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c034f22 -346395d4 -0017f821 -3c150027 -36b558af -3c164f22 -36d695d4 -1455055e -00000000 -1476055c -00000000 -3c15bfc1 -26b55480 -3c16bfc1 -26d65490 -14960556 -00000000 -14b50554 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508550c -3c09bfc1 -25295538 -10000008 -00000000 -03e02021 -3c02cb1c -34427cd3 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03f1c1 -34639a19 -0017f821 -3c15cb1c -36b57cd3 -3c16f1c1 -36d69a19 -14550536 -00000000 -14760534 -00000000 -3c15bfc1 -26b55520 -3c16bfc1 -26d65530 -1496052e -00000000 -14b5052c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250855ac -3c09bfc1 -252955d8 -10000008 -00000000 -03e02021 -3c020503 -3442f3ca -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03c5a0 -3463d14e -0017f821 -3c150503 -36b5f3ca -3c16c5a0 -36d6d14e -1455050e -00000000 -1476050c -00000000 -3c15bfc1 -26b555c0 -3c16bfc1 -26d655d0 -14960506 -00000000 -14b50504 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508564c -3c09bfc1 -25295678 -10000008 -00000000 -03e02021 -3c02ea7e -3442a380 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03f200 -3463d2c8 -0017f821 -3c15ea7e -36b5a380 -3c16f200 -36d6d2c8 -145504e6 -00000000 -147604e4 -00000000 -3c15bfc1 -26b55660 -3c16bfc1 -26d65670 -149604de -00000000 -14b504dc -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250856ec -3c09bfc1 -25295718 -10000008 -00000000 -03e02021 -3c02b35a -3442a088 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c039b4c -34631034 -0017f821 -3c15b35a -36b5a088 -3c169b4c -36d61034 -145504be -00000000 -147604bc -00000000 -3c15bfc1 -26b55700 -3c16bfc1 -26d65710 -149604b6 -00000000 -14b504b4 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508578c -3c09bfc1 -252957b8 -10000008 -00000000 -03e02021 -3c02524c -3442f520 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c036066 -3463b320 -0017f821 -3c15524c -36b5f520 -3c166066 -36d6b320 -14550496 -00000000 -14760494 -00000000 -3c15bfc1 -26b557a0 -3c16bfc1 -26d657b0 -1496048e -00000000 -14b5048c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508582c -3c09bfc1 -25295858 -10000008 -00000000 -03e02021 -3c029300 -3442ed06 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c0317d0 -34638cb4 -0017f821 -3c159300 -36b5ed06 -3c1617d0 -36d68cb4 -1455046e -00000000 -1476046c -00000000 -3c15bfc1 -26b55840 -3c16bfc1 -26d65850 -14960466 -00000000 -14b50464 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250858cc -3c09bfc1 -252958f8 -10000008 -00000000 -03e02021 -3c026686 -3442ce3c -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03a49a -3463ce88 -0017f821 -3c156686 -36b5ce3c -3c16a49a -36d6ce88 -14550446 -00000000 -14760444 -00000000 -3c15bfc1 -26b558e0 -3c16bfc1 -26d658f0 -1496043e -00000000 -14b5043c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508596c -3c09bfc1 -25295998 -10000008 -00000000 -03e02021 -3c026499 -3442fc7a -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03af67 -34631f66 -0017f821 -3c156499 -36b5fc7a -3c16af67 -36d61f66 -1455041e -00000000 -1476041c -00000000 -3c15bfc1 -26b55980 -3c16bfc1 -26d65990 -14960416 -00000000 -14b50414 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25085a0c -3c09bfc1 -25295a38 -10000008 -00000000 -03e02021 -3c02d7f6 -34423668 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c038506 -34633ab8 -0017f821 -3c15d7f6 -36b53668 -3c168506 -36d63ab8 -145503f6 -00000000 -147603f4 -00000000 -3c15bfc1 -26b55a20 -3c16bfc1 -26d65a30 -149603ee -00000000 -14b503ec -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25085aac -3c09bfc1 -25295ad8 -10000008 -00000000 -03e02021 -3c021cb4 -3442afc0 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c0366cc -3463792c -0017f821 -3c151cb4 -36b5afc0 -3c1666cc -36d6792c -145503ce -00000000 -147603cc -00000000 -3c15bfc1 -26b55ac0 -3c16bfc1 -26d65ad0 -149603c6 -00000000 -14b503c4 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25085b4c -3c09bfc1 -25295b78 -10000008 -00000000 -03e02021 -3c0260fa -34420e0a -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03d870 -34636ed8 -0017f821 -3c1560fa -36b50e0a -3c16d870 -36d66ed8 -145503a6 -00000000 -147603a4 -00000000 -3c15bfc1 -26b55b60 -3c16bfc1 -26d65b70 -1496039e -00000000 -14b5039c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25085bec -3c09bfc1 -25295c18 -10000008 -00000000 -03e02021 -3c0200c1 -34427a40 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03be7d -34632bc0 -0017f821 -3c1500c1 -36b57a40 -3c16be7d -36d62bc0 -1455037e -00000000 -1476037c -00000000 -3c15bfc1 -26b55c00 -3c16bfc1 -26d65c10 -14960376 -00000000 -14b50374 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25085c8c -3c09bfc1 -25295cb8 -10000008 -00000000 -03e02021 -3c029afa -34429d98 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03980b -34630c54 -0017f821 -3c159afa -36b59d98 -3c16980b -36d60c54 -14550356 -00000000 -14760354 -00000000 -3c15bfc1 -26b55ca0 -3c16bfc1 -26d65cb0 -1496034e -00000000 -14b5034c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25085d2c -3c09bfc1 -25295d58 -10000008 -00000000 -03e02021 -3c02ce0b -3442e588 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03e44b -346384f2 -0017f821 -3c15ce0b -36b5e588 -3c16e44b -36d684f2 -1455032e -00000000 -1476032c -00000000 -3c15bfc1 -26b55d40 -3c16bfc1 -26d65d50 -14960326 -00000000 -14b50324 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25085dcc -3c09bfc1 -25295df8 -10000008 -00000000 -03e02021 -3c027970 -344279e4 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c038fbf -3463b80d -0017f821 -3c157970 -36b579e4 -3c168fbf -36d6b80d -14550306 -00000000 -14760304 -00000000 -3c15bfc1 -26b55de0 -3c16bfc1 -26d65df0 -149602fe -00000000 -14b502fc -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25085e6c -3c09bfc1 -25295e98 -10000008 -00000000 -03e02021 -3c02116f -34424350 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03e8af -3463c208 -0017f821 -3c15116f -36b54350 -3c16e8af -36d6c208 -145502de -00000000 -147602dc -00000000 -3c15bfc1 -26b55e80 -3c16bfc1 -26d65e90 -149602d6 -00000000 -14b502d4 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25085f0c -3c09bfc1 -25295f38 -10000008 -00000000 -03e02021 -3c02e372 -34429f6c -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c0382fb -3463efc2 -0017f821 -3c15e372 -36b59f6c -3c1682fb -36d6efc2 -145502b6 -00000000 -147602b4 -00000000 -3c15bfc1 -26b55f20 -3c16bfc1 -26d65f30 -149602ae -00000000 -14b502ac -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -25085fac -3c09bfc1 -25295fd8 -10000008 -00000000 -03e02021 -3c020a78 -3442e944 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03e8b1 -3463a12a -0017f821 -3c150a78 -36b5e944 -3c16e8b1 -36d6a12a -1455028e -00000000 -1476028c -00000000 -3c15bfc1 -26b55fc0 -3c16bfc1 -26d65fd0 -14960286 -00000000 -14b50284 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508604c -3c09bfc1 -25296078 -10000008 -00000000 -03e02021 -3c02dba0 -3442a468 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c034452 -34631de4 -0017f821 -3c15dba0 -36b5a468 -3c164452 -36d61de4 -14550266 -00000000 -14760264 -00000000 -3c15bfc1 -26b56060 -3c16bfc1 -26d66070 -1496025e -00000000 -14b5025c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250860ec -3c09bfc1 -25296118 -10000008 -00000000 -03e02021 -3c02877c -344299c0 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c0392ec -34639cd0 -0017f821 -3c15877c -36b599c0 -3c1692ec -36d69cd0 -1455023e -00000000 -1476023c -00000000 -3c15bfc1 -26b56100 -3c16bfc1 -26d66110 -14960236 -00000000 -14b50234 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508618c -3c09bfc1 -252961b8 -10000008 -00000000 -03e02021 -3c023f4b -34421534 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03aa78 -3463dc0e -0017f821 -3c153f4b -36b51534 -3c16aa78 -36d6dc0e -14550216 -00000000 -14760214 -00000000 -3c15bfc1 -26b561a0 -3c16bfc1 -26d661b0 -1496020e -00000000 -14b5020c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508622c -3c09bfc1 -25296258 -10000008 -00000000 -03e02021 -3c025a2b -3442a14e -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c0346a0 -3463b8e0 -0017f821 -3c155a2b -36b5a14e -3c1646a0 -36d6b8e0 -145501ee -00000000 -147601ec -00000000 -3c15bfc1 -26b56240 -3c16bfc1 -26d66250 -149601e6 -00000000 -14b501e4 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250862cc -3c09bfc1 -252962f8 -10000008 -00000000 -03e02021 -3c02c6cd -3442a210 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03b73d -34631daa -0017f821 -3c15c6cd -36b5a210 -3c16b73d -36d61daa -145501c6 -00000000 -147601c4 -00000000 -3c15bfc1 -26b562e0 -3c16bfc1 -26d662f0 -149601be -00000000 -14b501bc -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508636c -3c09bfc1 -25296398 -10000008 -00000000 -03e02021 -3c02faa6 -34429f00 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c034638 -3463b0f0 -0017f821 -3c15faa6 -36b59f00 -3c164638 -36d6b0f0 -1455019e -00000000 -1476019c -00000000 -3c15bfc1 -26b56380 -3c16bfc1 -26d66390 -14960196 -00000000 -14b50194 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508640c -3c09bfc1 -25296438 -10000008 -00000000 -03e02021 -3c0281e3 -344237f8 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c039c82 -3463c3a0 -0017f821 -3c1581e3 -36b537f8 -3c169c82 -36d6c3a0 -14550176 -00000000 -14760174 -00000000 -3c15bfc1 -26b56420 -3c16bfc1 -26d66430 -1496016e -00000000 -14b5016c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250864ac -3c09bfc1 -252964d8 -10000008 -00000000 -03e02021 -3c023e29 -34428dc8 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c0302ac -34636cd8 -0017f821 -3c153e29 -36b58dc8 -3c1602ac -36d66cd8 -1455014e -00000000 -1476014c -00000000 -3c15bfc1 -26b564c0 -3c16bfc1 -26d664d0 -14960146 -00000000 -14b50144 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508654c -3c09bfc1 -25296578 -10000008 -00000000 -03e02021 -3c02d365 -3442fd70 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c036a23 -34633e98 -0017f821 -3c15d365 -36b5fd70 -3c166a23 -36d63e98 -14550126 -00000000 -14760124 -00000000 -3c15bfc1 -26b56560 -3c16bfc1 -26d66570 -1496011e -00000000 -14b5011c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250865ec -3c09bfc1 -25296618 -10000008 -00000000 -03e02021 -3c027f72 -3442a67b -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c0347ba -346367c6 -0017f821 -3c157f72 -36b5a67b -3c1647ba -36d667c6 -145500fe -00000000 -147600fc -00000000 -3c15bfc1 -26b56600 -3c16bfc1 -26d66610 -149600f6 -00000000 -14b500f4 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508668c -3c09bfc1 -252966b8 -10000008 -00000000 -03e02021 -3c0230e3 -34422f10 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03028a -34639ed0 -0017f821 -3c1530e3 -36b52f10 -3c16028a -36d69ed0 -145500d6 -00000000 -147600d4 -00000000 -3c15bfc1 -26b566a0 -3c16bfc1 -26d666b0 -149600ce -00000000 -14b500cc -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508672c -3c09bfc1 -25296758 -10000008 -00000000 -03e02021 -3c02aa6a -34422f86 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03574e -3463a69d -0017f821 -3c15aa6a -36b52f86 -3c16574e -36d6a69d -145500ae -00000000 -147600ac -00000000 -3c15bfc1 -26b56740 -3c16bfc1 -26d66750 -149600a6 -00000000 -14b500a4 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250867cc -3c09bfc1 -252967f8 -10000008 -00000000 -03e02021 -3c026fe2 -34420051 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03e6d2 -346386d2 -0017f821 -3c156fe2 -36b50051 -3c16e6d2 -36d686d2 -14550086 -00000000 -14760084 -00000000 -3c15bfc1 -26b567e0 -3c16bfc1 -26d667f0 -1496007e -00000000 -14b5007c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508686c -3c09bfc1 -25296898 -10000008 -00000000 -03e02021 -3c02fb9c -3442fd6d -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c0339ae -34634860 -0017f821 -3c15fb9c -36b5fd6d -3c1639ae -36d64860 -1455005e -00000000 -1476005c -00000000 -3c15bfc1 -26b56880 -3c16bfc1 -26d66890 -14960056 -00000000 -14b50054 -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -2508690c -3c09bfc1 -25296938 -10000008 -00000000 -03e02021 -3c02138b -34428d70 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03edd5 -346382e5 -0017f821 -3c15138b -36b58d70 -3c16edd5 -36d682e5 -14550036 -00000000 -14760034 -00000000 -3c15bfc1 -26b56920 -3c16bfc1 -26d66930 -1496002e -00000000 -14b5002c -00000000 -001fb821 -24020000 -24030000 -3c08bfc1 -250869ac -3c09bfc1 -252969d8 -10000008 -00000000 -03e02021 -3c02f1c9 -34421b75 -0120f809 -00000000 -10000008 -00000000 -0100f809 -00000000 -10000004 -00000000 -03e02821 -3c03c478 -34633b2e -0017f821 -3c15f1c9 -36b51b75 -3c16c478 -36d63b2e -1455000e -00000000 -1476000c -00000000 -3c15bfc1 -26b569c0 -3c16bfc1 -26d669d0 -14960006 -00000000 -14b50004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -26100001 -24120000 -001fb821 -3c048000 -3c057fff -34a5ffff -04b00006 -3c08800d -3c16800d -15160219 -00000000 -04900003 -3c15800d -10000215 -00000000 -0017f821 -16b60212 -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -04b00006 -25098123 -25168123 -15360209 -00000000 -04900003 -25158123 -10000205 -00000000 -0017f821 -16b60202 -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -04b00006 -ad098ee0 -ad168ee0 -153601f9 -00000000 -04900003 -ad158ee0 -100001f5 -00000000 -0017f821 -16b601f2 -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -04b00006 -8d0a8ee0 -8d168ee0 -155601e9 -00000000 -04900003 -8d158ee0 -100001e5 -00000000 -0017f821 -16b601e2 -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -04b00006 -012a5821 -012ab021 -157601d9 -00000000 -04900003 -012aa821 -100001d5 -00000000 -0017f821 -16b601d2 -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -04b00006 -02326025 -0232b025 -159601c9 -00000000 -04900003 -0232a825 -100001c5 -00000000 -0017f821 -16b601c2 -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -04b00006 -0253682a -0253b02a -15b601b9 -00000000 -04900003 -0253a82a -100001b5 -00000000 -0017f821 -16b601b2 -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -04b00006 -2a4e8011 -2a568011 -15d601a9 -00000000 -04900003 -2a558011 -100001a5 -00000000 -0017f821 -16b601a2 -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -04b00006 -2e4f8011 -2e568011 -15f60199 -00000000 -04900003 -2e558011 -10000195 -00000000 -0017f821 -16b60192 -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -04b00006 -0253c02b -0253b02b -17160189 -00000000 -04900003 -0253a82b -10000185 -00000000 -0017f821 -16b60182 -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -04b00006 -00124c40 -0012b440 -15360179 -00000000 -04900003 -0012ac40 -10000175 -00000000 -0017f821 -16b60172 -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -04b00006 -01105020 -0110b020 -15560169 -00000000 -04900003 -0110a820 -10000165 -00000000 -0017f821 -16b60162 -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -04b00006 -220b8002 -22168002 -15760159 -00000000 -04900003 -22158002 -10000155 -00000000 -0017f821 -16b60152 -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -04b00006 -01106022 -0110b022 -15960149 -00000000 -04900003 -0110a822 -10000145 -00000000 -0017f821 -16b60142 -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -04b00006 -01106823 -0110b023 -15b60139 -00000000 -04900003 -0110a823 -10000135 -00000000 -0017f821 -16b60132 -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -04b00006 -01107024 -0110b024 -15d60129 -00000000 -04900003 -0110a824 -10000125 -00000000 -0017f821 -16b60122 -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -04b00006 -320f8ff2 -32168ff2 -15f60119 -00000000 -04900003 -32158ff2 -10000115 -00000000 -0017f821 -16b60112 -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -04b00006 -0110c027 -0110b027 -17160109 -00000000 -04900003 -0110a827 -10000105 -00000000 -0017f821 -16b60102 -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -04b00006 -36098ff2 -36168ff2 -153600f9 -00000000 -04900003 -36158ff2 -100000f5 -00000000 -0017f821 -16b600f2 -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -04b00006 -01105026 -0110b026 -155600e9 -00000000 -04900003 -0110a826 -100000e5 -00000000 -0017f821 -16b600e2 -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -04b00006 -3a0b8ff2 -3a168ff2 -157600d9 -00000000 -04900003 -3a158ff2 -100000d5 -00000000 -0017f821 -16b600d2 -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -04b00006 -02086004 -0208b004 -159600c9 -00000000 -04900003 -0208a804 -100000c5 -00000000 -0017f821 -16b600c2 -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -04b00006 -00106a03 -0010b203 -15b600b9 -00000000 -04900003 -0010aa03 -100000b5 -00000000 -0017f821 -16b600b2 -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -04b00006 -02087007 -0208b007 -15d600a9 -00000000 -04900003 -0208a807 -100000a5 -00000000 -0017f821 -16b600a2 -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -04b00006 -00107a02 -0010b202 -15f60099 -00000000 -04900003 -0010aa02 -10000095 -00000000 -0017f821 -16b60092 -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -04b00006 -0208c006 -0208b006 -17160089 -00000000 -04900003 -0208a806 -10000085 -00000000 -0017f821 -16b60082 -00000000 -3c088000 -34098000 -001fb821 -3c048000 -3c057fff -34a5ffff -24020000 -24030000 -04b0000a -0109001a -00001012 -00800013 -0109001a -0000b012 -14560072 -00000000 -00800013 -04900003 -0109001a -1000006d -00000000 -0017f821 -00001812 -14760069 -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -24020000 -24030000 -04b0000a -0109001b -00001012 -00800013 -0109001b -0000b012 -1456005b -00000000 -00800013 -04900003 -0109001b -10000056 -00000000 -0017f821 -00001812 -14760052 -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -24020000 -24030000 -04b0000a -01090018 -00001012 -00800013 -01090018 -0000b012 -14560044 -00000000 -00800013 -04900003 -01090018 -1000003f -00000000 -0017f821 -00001812 -1476003b -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -24020000 -24030000 -04b0000a -01090019 -00001012 -00800013 -01090019 -0000b012 -1456002d -00000000 -00800013 -04900003 -01090019 -10000028 -00000000 -0017f821 -00001812 -14760024 -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -04b00006 -00007810 -0000b010 -15f6001b -00000000 -04900003 -0000a810 -10000017 -00000000 -0017f821 -16b60014 -00000000 -001fb821 -3c048000 -3c057fff -34a5ffff -04b00006 -00007012 -0000b012 -15d6000b -00000000 -04900003 -0000a812 -10000007 -00000000 -0017f821 -16b60004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -03e0b021 -26100001 -3c08800d -40805800 -3c170040 -40976000 -00000000 -24120001 -3c170001 -ad120000 -3c14bfc1 -26947320 -0240f809 -0000000c -165700ad -00000000 -24120001 -3c14bfc1 -2694733c -0100f809 -0000000c -165700a6 -00000000 -24120002 -3c170002 -ad120000 -3c14bfc1 -26947360 -0240f809 -0000000d -1657009d -00000000 -24120002 -3c14bfc1 -2694737c -0100f809 -0000000d -16570096 -00000000 -24120003 -3c170003 -ad120000 -3c14bfc1 -269473b0 -3c04ba03 -34844f60 -3c05b615 -34a5fd67 -0240f809 -0085b820 -16570089 -00000000 -24120003 -3c14bfc1 -269473cc -0100f809 -0085b820 -ad170000 -16570081 -00000000 -24120003 -ad120000 -3c14bfc1 -269473f8 -3c047fff -3484c19e -0240f809 -20976512 -16570077 -00000000 -24120003 -3c14bfc1 -26947414 -0100f809 -20976512 -16570070 -00000000 -24120003 -3c14bfc1 -26947440 -3c04a85e -34847d00 -3c056b7e -34a58e36 -0240f809 -0085b822 -16570065 -00000000 -24120003 -3c14bfc1 -2694745c -0100f809 -0085b822 -1657005e -00000000 -24120004 -3c170004 -ad120000 -3c14bfc1 -26947480 -0240f809 -8d170002 -16570055 -00000000 -24120004 -3c14bfc1 -2694749c -0100f809 -8d170002 -1657004e -00000000 -24120004 -3c14bfc1 -269474b8 -0240f809 -85170001 -02f2001b -16570046 -00000000 -24120004 -3c14bfc1 -269474d8 -0100f809 -85170001 -1657003f -00000000 -3c14bfc1 -269474f0 -0240f809 -95170003 -16570039 -00000000 -24120004 -3c14bfc1 -2694750c -0100f809 -95170003 -16570032 -00000000 -24120005 -3c170005 -ad120000 -3c14bfc1 -26947530 -0240f809 -ad170002 -16570029 -00000000 -24120005 -3c14bfc1 -2694754c -0100f809 -ad170002 -16570022 -00000000 -24120005 -3c14bfc1 -26947568 -0240f809 -a5170001 -1657001b -00000000 -24120005 -3c14bfc1 -26947584 -0100f809 -a5170001 -16570014 -00000000 -24120007 -3c170007 -ad120000 -3c14bfc1 -269475a8 -0240f809 -9e3c56aa -02f20018 -1657000a -00000000 -24120007 -3c14bfc1 -269475cc -02f20018 -0100f809 -ec1ba960 -16570002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -02c0f821 -03e00008 -00000000 -00000000 -00000000 -26100001 -24120000 -3c0808fc -01000013 -00001012 -3c1508fc -14550392 -00000000 -3c08c021 -3508e948 -01000013 -00001012 -3c15c021 -36b5e948 -1455038a -00000000 -3c08eff0 -3508883e -01000013 -00001012 -3c15eff0 -36b5883e -14550382 -00000000 -3c088d1c -3508588c -01000013 -00001012 -3c158d1c -36b5588c -1455037a -00000000 -3c0804eb -3508a480 -01000013 -00001012 -3c1504eb -36b5a480 -14550372 -00000000 -3c084f6c -3508eec0 -01000013 -00001012 -3c154f6c -36b5eec0 -1455036a -00000000 -3c08bfc9 -3508f610 -01000013 -00001012 -3c15bfc9 -36b5f610 -14550362 -00000000 -3c08a1b5 -35089045 -01000013 -00001012 -3c15a1b5 -36b59045 -1455035a -00000000 -3c089499 -35081e58 -01000013 -00001012 -3c159499 -36b51e58 -14550352 -00000000 -3c081752 -35083780 -01000013 -00001012 -3c151752 -36b53780 -1455034a -00000000 -3c08ae6c -350887b5 -01000013 -00001012 -3c15ae6c -36b587b5 -14550342 -00000000 -3c08d100 -3508fad4 -01000013 -00001012 -3c15d100 -36b5fad4 -1455033a -00000000 -3c089b90 -3508bc1a -01000013 -00001012 -3c159b90 -36b5bc1a -14550332 -00000000 -3c08a31b -35080900 -01000013 -00001012 -3c15a31b -36b50900 -1455032a -00000000 -3c08f96f -3508ee06 -01000013 -00001012 -3c15f96f -36b5ee06 -14550322 -00000000 -3c0839b6 -3508da7c -01000013 -00001012 -3c1539b6 -36b5da7c -1455031a -00000000 -3c081e4a -3508f85a -01000013 -00001012 -3c151e4a -36b5f85a -14550312 -00000000 -3c082ef1 -3508759b -01000013 -00001012 -3c152ef1 -36b5759b -1455030a -00000000 -3c084e9b -35089200 -01000013 -00001012 -3c154e9b -36b59200 -14550302 -00000000 -3c089b13 -35080250 -01000013 -00001012 -3c159b13 -36b50250 -145502fa -00000000 -3c08dcee -350801c8 -01000013 -00001012 -3c15dcee -36b501c8 -145502f2 -00000000 -3c084eb3 -35082d84 -01000013 -00001012 -3c154eb3 -36b52d84 -145502ea -00000000 -3c0857a0 -35080240 -01000013 -00001012 -3c1557a0 -36b50240 -145502e2 -00000000 -3c08dbcd -35088ea4 -01000013 -00001012 -3c15dbcd -36b58ea4 -145502da -00000000 -3c086a50 -3508c5a8 -01000013 -00001012 -3c156a50 -36b5c5a8 -145502d2 -00000000 -3c08d469 -35089cd9 -01000013 -00001012 -3c15d469 -36b59cd9 -145502ca -00000000 -3c0889c4 -3508604e -01000013 -00001012 -3c1589c4 -36b5604e -145502c2 -00000000 -3c084385 -35085984 -01000013 -00001012 -3c154385 -36b55984 -145502ba -00000000 -3c082134 -3508659c -01000013 -00001012 -3c152134 -36b5659c -145502b2 -00000000 -3c08d0b1 -3508a0a0 -01000013 -00001012 -3c15d0b1 -36b5a0a0 -145502aa -00000000 -3c08164d -35080d80 -01000013 -00001012 -3c15164d -36b50d80 -145502a2 -00000000 -3c08b2ec -3508642c -01000013 -00001012 -3c15b2ec -36b5642c -1455029a -00000000 -3c0840d0 -35082caa -01000013 -00001012 -3c1540d0 -36b52caa -14550292 -00000000 -3c08713e -35083840 -01000013 -00001012 -3c15713e -36b53840 -1455028a -00000000 -3c082a02 -3508c9ff -01000013 -00001012 -3c152a02 -36b5c9ff -14550282 -00000000 -3c082366 -3508722b -01000013 -00001012 -3c152366 -36b5722b -1455027a -00000000 -3c08ad99 -35083150 -01000013 -00001012 -3c15ad99 -36b53150 -14550272 -00000000 -3c086568 -3508c99e -01000013 -00001012 -3c156568 -36b5c99e -1455026a -00000000 -3c08f17a -35081170 -01000013 -00001012 -3c15f17a -36b51170 -14550262 -00000000 -3c08a336 -350841a9 -01000013 -00001012 -3c15a336 -36b541a9 -1455025a -00000000 -3c0899ab -350821a0 -01000013 -00001012 -3c1599ab -36b521a0 -14550252 -00000000 -3c088611 -3508118c -01000013 -00001012 -3c158611 -36b5118c -1455024a -00000000 -3c0809e8 -3508f575 -01000013 -00001012 -3c1509e8 -36b5f575 -14550242 -00000000 -3c08f43f -350840ae -01000013 -00001012 -3c15f43f -36b540ae -1455023a -00000000 -3c08397a -35081bb9 -01000013 -00001012 -3c15397a -36b51bb9 -14550232 -00000000 -3c08171e -3508590c -01000013 -00001012 -3c15171e -36b5590c -1455022a -00000000 -3c086c38 -35087e12 -01000013 -00001012 -3c156c38 -36b57e12 -14550222 -00000000 -3c0809be -3508cd5f -01000013 -00001012 -3c1509be -36b5cd5f -1455021a -00000000 -3c0873e0 -35087a20 -01000013 -00001012 -3c1573e0 -36b57a20 -14550212 -00000000 -3c08d2d6 -35084d50 -01000013 -00001012 -3c15d2d6 -36b54d50 -1455020a -00000000 -3c08cae4 -3508b160 -01000013 -00001012 -3c15cae4 -36b5b160 -14550202 -00000000 -3c0846d4 -35085ca8 -01000013 -00001012 -3c1546d4 -36b55ca8 -145501fa -00000000 -3c083c84 -35083dce -01000013 -00001012 -3c153c84 -36b53dce -145501f2 -00000000 -3c0890d1 -3508a267 -01000013 -00001012 -3c1590d1 -36b5a267 -145501ea -00000000 -3c08129d -35084a7e -01000013 -00001012 -3c15129d -36b54a7e -145501e2 -00000000 -3c08fccd -3508b42e -01000013 -00001012 -3c15fccd -36b5b42e -145501da -00000000 -3c08d705 -35089700 -01000013 -00001012 -3c15d705 -36b59700 -145501d2 -00000000 -3c080a4b -3508664c -01000013 -00001012 -3c150a4b -36b5664c -145501ca -00000000 -3c08abed -3508fcc0 -01000013 -00001012 -3c15abed -36b5fcc0 -145501c2 -00000000 -3c0804f0 -35089b68 -01000013 -00001012 -3c1504f0 -36b59b68 -145501ba -00000000 -3c08b726 -35081aa0 -01000013 -00001012 -3c15b726 -36b51aa0 -145501b2 -00000000 -3c08b2ae -3508d1e0 -01000013 -00001012 -3c15b2ae -36b5d1e0 -145501aa -00000000 -3c08725b -3508f330 -01000013 -00001012 -3c15725b -36b5f330 -145501a2 -00000000 -3c08a2ed -350862c4 -01000013 -00001012 -3c15a2ed -36b562c4 -1455019a -00000000 -3c0839bb -3508041e -01000013 -00001012 -3c1539bb -36b5041e -14550192 -00000000 -3c08076f -3508516a -01000013 -00001012 -3c15076f -36b5516a -1455018a -00000000 -3c084771 -350824e0 -01000013 -00001012 -3c154771 -36b524e0 -14550182 -00000000 -3c08aa6a -35089390 -01000013 -00001012 -3c15aa6a -36b59390 -1455017a -00000000 -3c08cce6 -35083c0c -01000013 -00001012 -3c15cce6 -36b53c0c -14550172 -00000000 -3c081dc7 -3508b89c -01000013 -00001012 -3c151dc7 -36b5b89c -1455016a -00000000 -3c083c39 -350850e0 -01000013 -00001012 -3c153c39 -36b550e0 -14550162 -00000000 -3c08ae49 -350826a2 -01000013 -00001012 -3c15ae49 -36b526a2 -1455015a -00000000 -3c08e091 -35087420 -01000013 -00001012 -3c15e091 -36b57420 -14550152 -00000000 -3c08a36e -35086448 -01000013 -00001012 -3c15a36e -36b56448 -1455014a -00000000 -3c08df56 -3508da8b -01000013 -00001012 -3c15df56 -36b5da8b -14550142 -00000000 -3c08aced -3508effc -01000013 -00001012 -3c15aced -36b5effc -1455013a -00000000 -3c08771b -3508fc28 -01000013 -00001012 -3c15771b -36b5fc28 -14550132 -00000000 -3c08418e -3508f953 -01000013 -00001012 -3c15418e -36b5f953 -1455012a -00000000 -3c08af65 -3508ef96 -01000013 -00001012 -3c15af65 -36b5ef96 -14550122 -00000000 -3c08e739 -3508d10c -01000013 -00001012 -3c15e739 -36b5d10c -1455011a -00000000 -3c0817b0 -3508f8d4 -01000013 -00001012 -3c1517b0 -36b5f8d4 -14550112 -00000000 -3c08da94 -35087912 -01000013 -00001012 -3c15da94 -36b57912 -1455010a -00000000 -3c082c1b -3508d684 -01000013 -00001012 -3c152c1b -36b5d684 -14550102 -00000000 -3c08da0f -3508792c -01000013 -00001012 -3c15da0f -36b5792c -145500fa -00000000 -3c08465d -350856f8 -01000013 -00001012 -3c15465d -36b556f8 -145500f2 -00000000 -3c081f06 -3508c400 -01000013 -00001012 -3c151f06 -36b5c400 -145500ea -00000000 -3c08aba4 -3508647f -01000013 -00001012 -3c15aba4 -36b5647f -145500e2 -00000000 -3c089a03 -35085369 -01000013 -00001012 -3c159a03 -36b55369 -145500da -00000000 -3c08be93 -35083612 -01000013 -00001012 -3c15be93 -36b53612 -145500d2 -00000000 -3c08c479 -3508087c -01000013 -00001012 -3c15c479 -36b5087c -145500ca -00000000 -3c0882f5 -350818c8 -01000013 -00001012 -3c1582f5 -36b518c8 -145500c2 -00000000 -3c08263c -35084f70 -01000013 -00001012 -3c15263c -36b54f70 -145500ba -00000000 -3c08a5e0 -35088312 -01000013 -00001012 -3c15a5e0 -36b58312 -145500b2 -00000000 -3c080c5d -35083937 -01000013 -00001012 -3c150c5d -36b53937 -145500aa -00000000 -3c08d4de -3508fa00 -01000013 -00001012 -3c15d4de -36b5fa00 -145500a2 -00000000 -3c088eae -3508b5be -01000013 -00001012 -3c158eae -36b5b5be -1455009a -00000000 -3c08f515 -35084cd0 -01000013 -00001012 -3c15f515 -36b54cd0 -14550092 -00000000 -3c08c0e5 -3508f104 -01000013 -00001012 -3c15c0e5 -36b5f104 -1455008a -00000000 -3c0845ba -35089b88 -01000013 -00001012 -3c1545ba -36b59b88 -14550082 -00000000 -3c080c6f -35084b7d -01000013 -00001012 -3c150c6f -36b54b7d -1455007a -00000000 -3c0884d2 -3508ee9d -01000013 -00001012 -3c1584d2 -36b5ee9d -14550072 -00000000 -3c080b8c -3508ca60 -01000013 -00001012 -3c150b8c -36b5ca60 -1455006a -00000000 -3c083417 -35087838 -01000013 -00001012 -3c153417 -36b57838 -14550062 -00000000 -3c08d497 -3508762d -01000013 -00001012 -3c15d497 -36b5762d -1455005a -00000000 -3c08a9d9 -3508686c -01000013 -00001012 -3c15a9d9 -36b5686c -14550052 -00000000 -3c0870e5 -35088844 -01000013 -00001012 -3c1570e5 -36b58844 -1455004a -00000000 -3c08a359 -350863da -01000013 -00001012 -3c15a359 -36b563da -14550042 -00000000 -3c08d596 -3508c72c -01000013 -00001012 -3c15d596 -36b5c72c -1455003a -00000000 -3c086d90 -3508cae6 -01000013 -00001012 -3c156d90 -36b5cae6 -14550032 -00000000 -3c08aecd -350804a4 -01000013 -00001012 -3c15aecd -36b504a4 -1455002a -00000000 -3c08d0db -350839f8 -01000013 -00001012 -3c15d0db -36b539f8 -14550022 -00000000 -3c082751 -3508a62f -01000013 -00001012 -3c152751 -36b5a62f -1455001a -00000000 -3c087759 -35087560 -01000013 -00001012 -3c157759 -36b57560 -14550012 -00000000 -3c087a82 -3508fb9e -01000013 -00001012 -3c157a82 -36b5fb9e -1455000a -00000000 -24080000 -01000013 -00001012 -24150000 -14550004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -26100001 -24120000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02029a -3442af84 -0511000c -00000000 -1000000d -00000000 -3c089ec9 -3508db66 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a584b0 -10000004 -00000000 -03e02821 -3c03b5a8 -3463cca0 -0017f821 -24150000 -24160000 -145516b4 -00000000 -147616b2 -00000000 -3c15bfc2 -26b584b0 -3c16bfc2 -26d684c8 -149616ac -00000000 -14b516aa -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02288d -3442bddc -0511000c -00000000 -1000000d -00000000 -3c0848f5 -350855d0 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5854c -10000004 -00000000 -03e02821 -3c03abcf -346387b8 -0017f821 -3c15288d -36b5bddc -3c16abcf -36d687b8 -1455168b -00000000 -14761689 -00000000 -3c15bfc2 -26b5854c -3c16bfc2 -26d68564 -14961683 -00000000 -14b51681 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02c6bf -344236e0 -0511000c -00000000 -1000000d -00000000 -3c08e47b -35082aa0 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a585f0 -10000004 -00000000 -03e02821 -3c031eb3 -3463e3a0 -0017f821 -24150000 -24160000 -14551664 -00000000 -14761662 -00000000 -3c15bfc2 -26b585f0 -3c16bfc2 -26d68608 -1496165c -00000000 -14b5165a -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02a444 -344267a3 -0511000c -00000000 -1000000d -00000000 -3c085955 -3508ebd6 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5868c -10000004 -00000000 -03e02821 -3c03dbe0 -346304f7 -0017f821 -3c15a444 -36b567a3 -3c16dbe0 -36d604f7 -1455163b -00000000 -14761639 -00000000 -3c15bfc2 -26b5868c -3c16bfc2 -26d686a4 -14961633 -00000000 -14b51631 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c027998 -3442f600 -0511000c -00000000 -1000000d -00000000 -3c083baa -35084ab0 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a58730 -10000004 -00000000 -03e02821 -3c03f047 -3463d898 -0017f821 -3c157998 -36b5f600 -3c16f047 -36d6d898 -14551612 -00000000 -14761610 -00000000 -3c15bfc2 -26b58730 -3c16bfc2 -26d68748 -1496160a -00000000 -14b51608 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0282bf -34429c2c -0511000c -00000000 -1000000d -00000000 -3c08bff7 -3508aa00 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a587d4 -10000004 -00000000 -03e02821 -3c0368d4 -34634fa0 -0017f821 -24150000 -24160000 -145515eb -00000000 -147615e9 -00000000 -3c15bfc2 -26b587d4 -3c16bfc2 -26d687ec -149615e3 -00000000 -14b515e1 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0272df -34425726 -0511000c -00000000 -1000000d -00000000 -3c08f72c -3508d104 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a58870 -10000004 -00000000 -03e02821 -3c03dfbd -34638610 -0017f821 -24150000 -24160000 -145515c4 -00000000 -147615c2 -00000000 -3c15bfc2 -26b58870 -3c16bfc2 -26d68888 -149615bc -00000000 -14b515ba -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c023c5b -3442a4aa -0511000c -00000000 -1000000d -00000000 -3c08d8b3 -3508ba00 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5890c -10000004 -00000000 -03e02821 -3c037af3 -34632580 -0017f821 -24150000 -24160000 -1455159d -00000000 -1476159b -00000000 -3c15bfc2 -26b5890c -3c16bfc2 -26d68924 -14961595 -00000000 -14b51593 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02cc24 -3442a355 -0511000c -00000000 -1000000d -00000000 -3c087ade -35087232 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a589a8 -10000004 -00000000 -03e02821 -3c0338bd -34630e50 -0017f821 -3c15cc24 -36b5a355 -3c1638bd -36d60e50 -14551574 -00000000 -14761572 -00000000 -3c15bfc2 -26b589a8 -3c16bfc2 -26d689c0 -1496156c -00000000 -14b5156a -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02b7b7 -344216b0 -0511000c -00000000 -1000000d -00000000 -3c088ec7 -35087978 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a58a4c -10000004 -00000000 -03e02821 -3c0388cb -34630974 -0017f821 -24150000 -24160000 -1455154d -00000000 -1476154b -00000000 -3c15bfc2 -26b58a4c -3c16bfc2 -26d68a64 -14961545 -00000000 -14b51543 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c020ef6 -34429dd0 -0511000c -00000000 -1000000d -00000000 -3c08c15e -3508fd20 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a58ae8 -10000004 -00000000 -03e02821 -3c03fa8c -3463e8f4 -0017f821 -24150000 -24160000 -14551526 -00000000 -14761524 -00000000 -3c15bfc2 -26b58ae8 -3c16bfc2 -26d68b00 -1496151e -00000000 -14b5151c -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02ee20 -3442a3d8 -0511000c -00000000 -1000000d -00000000 -3c089c29 -3508f658 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a58b84 -10000004 -00000000 -03e02821 -3c032cb2 -34630ac8 -0017f821 -24150000 -24160000 -145514ff -00000000 -147614fd -00000000 -3c15bfc2 -26b58b84 -3c16bfc2 -26d68b9c -149614f7 -00000000 -14b514f5 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02838d -34420cd4 -0511000c -00000000 -1000000d -00000000 -3c081c62 -35084d80 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a58c20 -10000004 -00000000 -03e02821 -3c03c0a5 -3463f39a -0017f821 -3c15838d -36b50cd4 -3c16c0a5 -36d6f39a -145514d6 -00000000 -147614d4 -00000000 -3c15bfc2 -26b58c20 -3c16bfc2 -26d68c38 -149614ce -00000000 -14b514cc -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c022277 -3442d010 -0511000c -00000000 -1000000d -00000000 -3c08fafd -35081778 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a58cc4 -10000004 -00000000 -03e02821 -3c03a318 -346358e4 -0017f821 -24150000 -24160000 -145514af -00000000 -147614ad -00000000 -3c15bfc2 -26b58cc4 -3c16bfc2 -26d68cdc -149614a7 -00000000 -14b514a5 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c024e4c -3442f3c3 -0511000c -00000000 -1000000d -00000000 -3c08b129 -3508bb70 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a58d60 -10000004 -00000000 -03e02821 -3c0365cb -34633d2a -0017f821 -24150000 -24160000 -14551488 -00000000 -14761486 -00000000 -3c15bfc2 -26b58d60 -3c16bfc2 -26d68d78 -14961480 -00000000 -14b5147e -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c023b80 -34420bd9 -0511000c -00000000 -1000000d -00000000 -3c087ab4 -3508682c -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a58dfc -10000004 -00000000 -03e02821 -3c03dc10 -34632e20 -0017f821 -3c153b80 -36b50bd9 -3c16dc10 -36d62e20 -1455145f -00000000 -1476145d -00000000 -3c15bfc2 -26b58dfc -3c16bfc2 -26d68e14 -14961457 -00000000 -14b51455 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c023d76 -34422dfa -0511000c -00000000 -1000000d -00000000 -3c08f0c2 -35083ef0 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a58ea0 -10000004 -00000000 -03e02821 -3c03bf9f -3463bd50 -0017f821 -24150000 -24160000 -14551438 -00000000 -14761436 -00000000 -3c15bfc2 -26b58ea0 -3c16bfc2 -26d68eb8 -14961430 -00000000 -14b5142e -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c025116 -3442d1f8 -0511000c -00000000 -1000000d -00000000 -3c083e78 -3508666e -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a58f3c -10000004 -00000000 -03e02821 -3c03cdab -3463d338 -0017f821 -3c155116 -36b5d1f8 -3c16cdab -36d6d338 -1455140f -00000000 -1476140d -00000000 -3c15bfc2 -26b58f3c -3c16bfc2 -26d68f54 -14961407 -00000000 -14b51405 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02172c -34429ad7 -0511000c -00000000 -1000000d -00000000 -3c081033 -35081dba -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a58fe0 -10000004 -00000000 -03e02821 -3c0367ac -346349e0 -0017f821 -3c15172c -36b59ad7 -3c1667ac -36d649e0 -145513e6 -00000000 -147613e4 -00000000 -3c15bfc2 -26b58fe0 -3c16bfc2 -26d68ff8 -149613de -00000000 -14b513dc -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02c918 -34422114 -0511000c -00000000 -1000000d -00000000 -3c089af6 -35085ad8 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a59084 -10000004 -00000000 -03e02821 -3c033db8 -34635058 -0017f821 -24150000 -24160000 -145513bf -00000000 -147613bd -00000000 -3c15bfc2 -26b59084 -3c16bfc2 -26d6909c -149613b7 -00000000 -14b513b5 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02d179 -34426a5e -0511000c -00000000 -1000000d -00000000 -3c088613 -3508d8e4 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a59120 -10000004 -00000000 -03e02821 -3c033a49 -34637608 -0017f821 -24150000 -24160000 -14551398 -00000000 -14761396 -00000000 -3c15bfc2 -26b59120 -3c16bfc2 -26d69138 -14961390 -00000000 -14b5138e -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02463c -34422acc -0511000c -00000000 -1000000d -00000000 -3c08774d -35082398 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a591bc -10000004 -00000000 -03e02821 -3c03a046 -3463b6ca -0017f821 -3c15463c -36b52acc -3c16a046 -36d6b6ca -1455136f -00000000 -1476136d -00000000 -3c15bfc2 -26b591bc -3c16bfc2 -26d691d4 -14961367 -00000000 -14b51365 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02e309 -34426291 -0511000c -00000000 -1000000d -00000000 -3c08aaa4 -350890d0 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a59260 -10000004 -00000000 -03e02821 -3c0392d1 -346367d4 -0017f821 -24150000 -24160000 -14551348 -00000000 -14761346 -00000000 -3c15bfc2 -26b59260 -3c16bfc2 -26d69278 -14961340 -00000000 -14b5133e -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02e286 -34425f30 -0511000c -00000000 -1000000d -00000000 -3c08530c -3508ee60 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a592fc -10000004 -00000000 -03e02821 -3c0310c8 -3463cf40 -0017f821 -3c15e286 -36b55f30 -3c1610c8 -36d6cf40 -1455131f -00000000 -1476131d -00000000 -3c15bfc2 -26b592fc -3c16bfc2 -26d69314 -14961317 -00000000 -14b51315 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02801c -3442ed08 -0511000c -00000000 -1000000d -00000000 -3c08103d -35084d72 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a593a0 -10000004 -00000000 -03e02821 -3c0312db -34637c88 -0017f821 -3c15801c -36b5ed08 -3c1612db -36d67c88 -145512f6 -00000000 -147612f4 -00000000 -3c15bfc2 -26b593a0 -3c16bfc2 -26d693b8 -149612ee -00000000 -14b512ec -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02b5f0 -3442b262 -0511000c -00000000 -1000000d -00000000 -3c0875b3 -35085bb0 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a59444 -10000004 -00000000 -03e02821 -3c0361e0 -34632650 -0017f821 -3c15b5f0 -36b5b262 -3c1661e0 -36d62650 -145512cd -00000000 -147612cb -00000000 -3c15bfc2 -26b59444 -3c16bfc2 -26d6945c -149612c5 -00000000 -14b512c3 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c029b87 -34424393 -0511000c -00000000 -1000000d -00000000 -3c08558a -3508c57d -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a594e8 -10000004 -00000000 -03e02821 -3c039548 -34632680 -0017f821 -3c159b87 -36b54393 -3c169548 -36d62680 -145512a4 -00000000 -147612a2 -00000000 -3c15bfc2 -26b594e8 -3c16bfc2 -26d69500 -1496129c -00000000 -14b5129a -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02ddbb -34423172 -0511000c -00000000 -1000000d -00000000 -3c08df4f -35080f00 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5958c -10000004 -00000000 -03e02821 -3c03573c -346355da -0017f821 -24150000 -24160000 -1455127d -00000000 -1476127b -00000000 -3c15bfc2 -26b5958c -3c16bfc2 -26d695a4 -14961275 -00000000 -14b51273 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c029adf -3442c9b8 -0511000c -00000000 -1000000d -00000000 -3c08d059 -350851cb -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a59628 -10000004 -00000000 -03e02821 -3c038aa5 -34634cc9 -0017f821 -24150000 -24160000 -14551256 -00000000 -14761254 -00000000 -3c15bfc2 -26b59628 -3c16bfc2 -26d69640 -1496124e -00000000 -14b5124c -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c021bfa -34421c20 -0511000c -00000000 -1000000d -00000000 -3c08b512 -35088d6f -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a596c4 -10000004 -00000000 -03e02821 -3c0347ff -3463c5a0 -0017f821 -24150000 -24160000 -1455122f -00000000 -1476122d -00000000 -3c15bfc2 -26b596c4 -3c16bfc2 -26d696dc -14961227 -00000000 -14b51225 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c026310 -34420e90 -0511000c -00000000 -1000000d -00000000 -3c08dfd5 -35083a06 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a59760 -10000004 -00000000 -03e02821 -3c03d0f1 -3463231c -0017f821 -24150000 -24160000 -14551208 -00000000 -14761206 -00000000 -3c15bfc2 -26b59760 -3c16bfc2 -26d69778 -14961200 -00000000 -14b511fe -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02209b -344293c8 -0511000c -00000000 -1000000d -00000000 -3c0874ba -35080840 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a597fc -10000004 -00000000 -03e02821 -3c037452 -34631540 -0017f821 -3c15209b -36b593c8 -3c167452 -36d61540 -145511df -00000000 -147611dd -00000000 -3c15bfc2 -26b597fc -3c16bfc2 -26d69814 -149611d7 -00000000 -14b511d5 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c024098 -3442744a -0511000c -00000000 -1000000d -00000000 -3c08e265 -3508cd50 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a598a0 -10000004 -00000000 -03e02821 -3c0331b3 -34634048 -0017f821 -24150000 -24160000 -145511b8 -00000000 -147611b6 -00000000 -3c15bfc2 -26b598a0 -3c16bfc2 -26d698b8 -149611b0 -00000000 -14b511ae -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02c1dc -3442fe80 -0511000c -00000000 -1000000d -00000000 -3c086885 -3508271e -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5993c -10000004 -00000000 -03e02821 -3c0388a4 -3463cd80 -0017f821 -3c15c1dc -36b5fe80 -3c1688a4 -36d6cd80 -1455118f -00000000 -1476118d -00000000 -3c15bfc2 -26b5993c -3c16bfc2 -26d69954 -14961187 -00000000 -14b51185 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0254d1 -34422648 -0511000c -00000000 -1000000d -00000000 -3c08efc3 -35086830 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a599e0 -10000004 -00000000 -03e02821 -3c03e41a -3463f3f0 -0017f821 -24150000 -24160000 -14551168 -00000000 -14761166 -00000000 -3c15bfc2 -26b599e0 -3c16bfc2 -26d699f8 -14961160 -00000000 -14b5115e -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02e86f -3442fef3 -0511000c -00000000 -1000000d -00000000 -3c08ad25 -3508a725 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a59a7c -10000004 -00000000 -03e02821 -3c036920 -3463e15c -0017f821 -24150000 -24160000 -14551141 -00000000 -1476113f -00000000 -3c15bfc2 -26b59a7c -3c16bfc2 -26d69a94 -14961139 -00000000 -14b51137 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c025221 -34423f70 -0511000c -00000000 -1000000d -00000000 -3c087717 -350829a0 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a59b18 -10000004 -00000000 -03e02821 -3c031bbc -34634d28 -0017f821 -3c155221 -36b53f70 -3c161bbc -36d64d28 -14551118 -00000000 -14761116 -00000000 -3c15bfc2 -26b59b18 -3c16bfc2 -26d69b30 -14961110 -00000000 -14b5110e -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02c53e -34420410 -0511000c -00000000 -1000000d -00000000 -3c08051c -35080bc2 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a59bbc -10000004 -00000000 -03e02821 -3c037c0d -346379e3 -0017f821 -3c15c53e -36b50410 -3c167c0d -36d679e3 -145510ef -00000000 -147610ed -00000000 -3c15bfc2 -26b59bbc -3c16bfc2 -26d69bd4 -149610e7 -00000000 -14b510e5 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c024309 -3442ff12 -0511000c -00000000 -1000000d -00000000 -3c08ad4f -3508f0d4 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a59c60 -10000004 -00000000 -03e02821 -3c033abf -34631fbc -0017f821 -24150000 -24160000 -145510c8 -00000000 -147610c6 -00000000 -3c15bfc2 -26b59c60 -3c16bfc2 -26d69c78 -149610c0 -00000000 -14b510be -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c021503 -3442ba59 -0511000c -00000000 -1000000d -00000000 -3c08e4db -3508f4b8 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a59cfc -10000004 -00000000 -03e02821 -3c039628 -3463c7e0 -0017f821 -24150000 -24160000 -145510a1 -00000000 -1476109f -00000000 -3c15bfc2 -26b59cfc -3c16bfc2 -26d69d14 -14961099 -00000000 -14b51097 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0240ba -34429d66 -0511000c -00000000 -1000000d -00000000 -3c08e65e -3508affc -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a59d98 -10000004 -00000000 -03e02821 -3c035fdb -3463aae0 -0017f821 -24150000 -24160000 -1455107a -00000000 -14761078 -00000000 -3c15bfc2 -26b59d98 -3c16bfc2 -26d69db0 -14961072 -00000000 -14b51070 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c025291 -34427aa4 -0511000c -00000000 -1000000d -00000000 -3c08beb0 -3508f688 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a59e34 -10000004 -00000000 -03e02821 -3c03ee0a -346326b0 -0017f821 -24150000 -24160000 -14551053 -00000000 -14761051 -00000000 -3c15bfc2 -26b59e34 -3c16bfc2 -26d69e4c -1496104b -00000000 -14b51049 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c027880 -3442b230 -0511000c -00000000 -1000000d -00000000 -3c08efdf -3508d000 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a59ed0 -10000004 -00000000 -03e02821 -3c031f93 -3463e14a -0017f821 -24150000 -24160000 -1455102c -00000000 -1476102a -00000000 -3c15bfc2 -26b59ed0 -3c16bfc2 -26d69ee8 -14961024 -00000000 -14b51022 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0245c9 -34423fa8 -0511000c -00000000 -1000000d -00000000 -3c08e0a7 -350836fb -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a59f6c -10000004 -00000000 -03e02821 -3c03f646 -3463a898 -0017f821 -24150000 -24160000 -14551005 -00000000 -14761003 -00000000 -3c15bfc2 -26b59f6c -3c16bfc2 -26d69f84 -14960ffd -00000000 -14b50ffb -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02f368 -3442cb16 -0511000c -00000000 -1000000d -00000000 -3c086360 -3508c99b -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5a008 -10000004 -00000000 -03e02821 -3c038c03 -3463a3f8 -0017f821 -3c15f368 -36b5cb16 -3c168c03 -36d6a3f8 -14550fdc -00000000 -14760fda -00000000 -3c15bfc2 -26b5a008 -3c16bfc2 -26d6a020 -14960fd4 -00000000 -14b50fd2 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0252d6 -34423224 -0511000c -00000000 -1000000d -00000000 -3c08930c -3508f074 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5a0ac -10000004 -00000000 -03e02821 -3c03c7aa -3463bdc1 -0017f821 -24150000 -24160000 -14550fb5 -00000000 -14760fb3 -00000000 -3c15bfc2 -26b5a0ac -3c16bfc2 -26d6a0c4 -14960fad -00000000 -14b50fab -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02096d -344296a0 -0511000c -00000000 -1000000d -00000000 -3c08b034 -350818d0 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5a148 -10000004 -00000000 -03e02821 -3c03aec6 -34632677 -0017f821 -24150000 -24160000 -14550f8e -00000000 -14760f8c -00000000 -3c15bfc2 -26b5a148 -3c16bfc2 -26d6a160 -14960f86 -00000000 -14b50f84 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0220bf -3442711c -0511000c -00000000 -1000000d -00000000 -3c0879d1 -3508e580 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5a1e4 -10000004 -00000000 -03e02821 -3c031a2e -34632914 -0017f821 -3c1520bf -36b5711c -3c161a2e -36d62914 -14550f65 -00000000 -14760f63 -00000000 -3c15bfc2 -26b5a1e4 -3c16bfc2 -26d6a1fc -14960f5d -00000000 -14b50f5b -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02212e -34420cec -0511000c -00000000 -1000000d -00000000 -3c0881e0 -35086df9 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5a288 -10000004 -00000000 -03e02821 -3c039ea0 -34637a8c -0017f821 -24150000 -24160000 -14550f3e -00000000 -14760f3c -00000000 -3c15bfc2 -26b5a288 -3c16bfc2 -26d6a2a0 -14960f36 -00000000 -14b50f34 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c021895 -34425140 -0511000c -00000000 -1000000d -00000000 -3c086a06 -35084cef -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5a324 -10000004 -00000000 -03e02821 -3c0386b2 -3463e1f0 -0017f821 -3c151895 -36b55140 -3c1686b2 -36d6e1f0 -14550f15 -00000000 -14760f13 -00000000 -3c15bfc2 -26b5a324 -3c16bfc2 -26d6a33c -14960f0d -00000000 -14b50f0b -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02ffc3 -3442f740 -0511000c -00000000 -1000000d -00000000 -3c08204d -35088af0 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5a3c8 -10000004 -00000000 -03e02821 -3c03be11 -3463f92f -0017f821 -3c15ffc3 -36b5f740 -3c16be11 -36d6f92f -14550eec -00000000 -14760eea -00000000 -3c15bfc2 -26b5a3c8 -3c16bfc2 -26d6a3e0 -14960ee4 -00000000 -14b50ee2 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c027602 -344258c8 -0511000c -00000000 -1000000d -00000000 -3c082d24 -3508d026 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5a46c -10000004 -00000000 -03e02821 -3c03771f -34639bc2 -0017f821 -3c157602 -36b558c8 -3c16771f -36d69bc2 -14550ec3 -00000000 -14760ec1 -00000000 -3c15bfc2 -26b5a46c -3c16bfc2 -26d6a484 -14960ebb -00000000 -14b50eb9 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c028519 -34427cce -0511000c -00000000 -1000000d -00000000 -3c08dd6a -35084690 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5a510 -10000004 -00000000 -03e02821 -3c03f8c6 -3463da8e -0017f821 -24150000 -24160000 -14550e9c -00000000 -14760e9a -00000000 -3c15bfc2 -26b5a510 -3c16bfc2 -26d6a528 -14960e94 -00000000 -14b50e92 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0229fd -3442c410 -0511000c -00000000 -1000000d -00000000 -3c08e3a7 -3508803c -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5a5ac -10000004 -00000000 -03e02821 -3c032c37 -34637344 -0017f821 -24150000 -24160000 -14550e75 -00000000 -14760e73 -00000000 -3c15bfc2 -26b5a5ac -3c16bfc2 -26d6a5c4 -14960e6d -00000000 -14b50e6b -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02ff28 -344289a0 -0511000c -00000000 -1000000d -00000000 -3c08b1d5 -35089e1c -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5a648 -10000004 -00000000 -03e02821 -3c034731 -34631a00 -0017f821 -24150000 -24160000 -14550e4e -00000000 -14760e4c -00000000 -3c15bfc2 -26b5a648 -3c16bfc2 -26d6a660 -14960e46 -00000000 -14b50e44 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0270ba -344229d0 -0511000c -00000000 -1000000d -00000000 -3c08ba40 -35085044 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5a6e4 -10000004 -00000000 -03e02821 -3c03665a -34630285 -0017f821 -24150000 -24160000 -14550e27 -00000000 -14760e25 -00000000 -3c15bfc2 -26b5a6e4 -3c16bfc2 -26d6a6fc -14960e1f -00000000 -14b50e1d -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c029532 -34420960 -0511000c -00000000 -1000000d -00000000 -3c08966c -350821d0 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5a780 -10000004 -00000000 -03e02821 -3c03472b -346306c6 -0017f821 -24150000 -24160000 -14550e00 -00000000 -14760dfe -00000000 -3c15bfc2 -26b5a780 -3c16bfc2 -26d6a798 -14960df8 -00000000 -14b50df6 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02d2c9 -3442245e -0511000c -00000000 -1000000d -00000000 -3c082640 -3508fab0 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5a81c -10000004 -00000000 -03e02821 -3c032618 -346388e8 -0017f821 -3c15d2c9 -36b5245e -3c162618 -36d688e8 -14550dd7 -00000000 -14760dd5 -00000000 -3c15bfc2 -26b5a81c -3c16bfc2 -26d6a834 -14960dcf -00000000 -14b50dcd -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c028a0b -34424f16 -0511000c -00000000 -1000000d -00000000 -3c088919 -3508d5ac -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5a8c0 -10000004 -00000000 -03e02821 -3c03981f -34631b40 -0017f821 -24150000 -24160000 -14550db0 -00000000 -14760dae -00000000 -3c15bfc2 -26b5a8c0 -3c16bfc2 -26d6a8d8 -14960da8 -00000000 -14b50da6 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02ea8b -3442953c -0511000c -00000000 -1000000d -00000000 -3c08b4f0 -35085260 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5a95c -10000004 -00000000 -03e02821 -3c03c780 -34634f58 -0017f821 -24150000 -24160000 -14550d89 -00000000 -14760d87 -00000000 -3c15bfc2 -26b5a95c -3c16bfc2 -26d6a974 -14960d81 -00000000 -14b50d7f -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0210e2 -34422c70 -0511000c -00000000 -1000000d -00000000 -3c0805cb -3508b32d -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5a9f8 -10000004 -00000000 -03e02821 -3c03e777 -34632208 -0017f821 -3c1510e2 -36b52c70 -3c16e777 -36d62208 -14550d60 -00000000 -14760d5e -00000000 -3c15bfc2 -26b5a9f8 -3c16bfc2 -26d6aa10 -14960d58 -00000000 -14b50d56 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02e0d5 -344233d6 -0511000c -00000000 -1000000d -00000000 -3c08da6d -3508e980 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5aa9c -10000004 -00000000 -03e02821 -3c03d48d -34631074 -0017f821 -24150000 -24160000 -14550d39 -00000000 -14760d37 -00000000 -3c15bfc2 -26b5aa9c -3c16bfc2 -26d6aab4 -14960d31 -00000000 -14b50d2f -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c026415 -3442db60 -0511000c -00000000 -1000000d -00000000 -3c083004 -35083918 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5ab38 -10000004 -00000000 -03e02821 -3c0373aa -3463eff8 -0017f821 -3c156415 -36b5db60 -3c1673aa -36d6eff8 -14550d10 -00000000 -14760d0e -00000000 -3c15bfc2 -26b5ab38 -3c16bfc2 -26d6ab50 -14960d08 -00000000 -14b50d06 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02b5ad -3442c358 -0511000c -00000000 -1000000d -00000000 -3c083f59 -35088570 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5abdc -10000004 -00000000 -03e02821 -3c0322f1 -34632300 -0017f821 -3c15b5ad -36b5c358 -3c1622f1 -36d62300 -14550ce7 -00000000 -14760ce5 -00000000 -3c15bfc2 -26b5abdc -3c16bfc2 -26d6abf4 -14960cdf -00000000 -14b50cdd -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02ff41 -3442f972 -0511000c -00000000 -1000000d -00000000 -3c08d94a -35081fc4 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5ac80 -10000004 -00000000 -03e02821 -3c03ad18 -34635750 -0017f821 -24150000 -24160000 -14550cc0 -00000000 -14760cbe -00000000 -3c15bfc2 -26b5ac80 -3c16bfc2 -26d6ac98 -14960cb8 -00000000 -14b50cb6 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c026034 -34422c78 -0511000c -00000000 -1000000d -00000000 -3c080307 -35080850 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5ad1c -10000004 -00000000 -03e02821 -3c038ae7 -34635d1c -0017f821 -3c156034 -36b52c78 -3c168ae7 -36d65d1c -14550c97 -00000000 -14760c95 -00000000 -3c15bfc2 -26b5ad1c -3c16bfc2 -26d6ad34 -14960c8f -00000000 -14b50c8d -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0262d5 -34420b2c -0511000c -00000000 -1000000d -00000000 -3c089d6c -35085b50 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5adc0 -10000004 -00000000 -03e02821 -3c03bf7b -3463bbe0 -0017f821 -24150000 -24160000 -14550c70 -00000000 -14760c6e -00000000 -3c15bfc2 -26b5adc0 -3c16bfc2 -26d6add8 -14960c68 -00000000 -14b50c66 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0241ad -3442c580 -0511000c -00000000 -1000000d -00000000 -3c08efc3 -3508fb6d -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5ae5c -10000004 -00000000 -03e02821 -3c034481 -34631cea -0017f821 -24150000 -24160000 -14550c49 -00000000 -14760c47 -00000000 -3c15bfc2 -26b5ae5c -3c16bfc2 -26d6ae74 -14960c41 -00000000 -14b50c3f -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c028d1e -3442bf10 -0511000c -00000000 -1000000d -00000000 -3c084461 -3508ad06 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5aef8 -10000004 -00000000 -03e02821 -3c036cbe -34633a80 -0017f821 -3c158d1e -36b5bf10 -3c166cbe -36d63a80 -14550c20 -00000000 -14760c1e -00000000 -3c15bfc2 -26b5aef8 -3c16bfc2 -26d6af10 -14960c18 -00000000 -14b50c16 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0216af -34422f88 -0511000c -00000000 -1000000d -00000000 -3c083eea -35080f88 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5af9c -10000004 -00000000 -03e02821 -3c0370e0 -3463f0c8 -0017f821 -3c1516af -36b52f88 -3c1670e0 -36d6f0c8 -14550bf7 -00000000 -14760bf5 -00000000 -3c15bfc2 -26b5af9c -3c16bfc2 -26d6afb4 -14960bef -00000000 -14b50bed -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c027419 -3442e600 -0511000c -00000000 -1000000d -00000000 -3c080053 -35089980 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5b040 -10000004 -00000000 -03e02821 -3c03857e -3463de78 -0017f821 -3c157419 -36b5e600 -3c16857e -36d6de78 -14550bce -00000000 -14760bcc -00000000 -3c15bfc2 -26b5b040 -3c16bfc2 -26d6b058 -14960bc6 -00000000 -14b50bc4 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c027f8d -34424c60 -0511000c -00000000 -1000000d -00000000 -3c081275 -35085708 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5b0e4 -10000004 -00000000 -03e02821 -3c0335ba -3463f096 -0017f821 -3c157f8d -36b54c60 -3c1635ba -36d6f096 -14550ba5 -00000000 -14760ba3 -00000000 -3c15bfc2 -26b5b0e4 -3c16bfc2 -26d6b0fc -14960b9d -00000000 -14b50b9b -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02a0dc -34420850 -0511000c -00000000 -1000000d -00000000 -3c08a856 -35086262 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5b188 -10000004 -00000000 -03e02821 -3c03935b -346376fc -0017f821 -24150000 -24160000 -14550b7e -00000000 -14760b7c -00000000 -3c15bfc2 -26b5b188 -3c16bfc2 -26d6b1a0 -14960b76 -00000000 -14b50b74 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c023bab -3442fa88 -0511000c -00000000 -1000000d -00000000 -3c084312 -3508482c -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5b224 -10000004 -00000000 -03e02821 -3c038c74 -34634b40 -0017f821 -3c153bab -36b5fa88 -3c168c74 -36d64b40 -14550b55 -00000000 -14760b53 -00000000 -3c15bfc2 -26b5b224 -3c16bfc2 -26d6b23c -14960b4d -00000000 -14b50b4b -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c023702 -34425294 -0511000c -00000000 -1000000d -00000000 -3c087258 -3508b698 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5b2c8 -10000004 -00000000 -03e02821 -3c032442 -3463dc78 -0017f821 -3c153702 -36b55294 -3c162442 -36d6dc78 -14550b2c -00000000 -14760b2a -00000000 -3c15bfc2 -26b5b2c8 -3c16bfc2 -26d6b2e0 -14960b24 -00000000 -14b50b22 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02a7ed -3442f5bc -0511000c -00000000 -1000000d -00000000 -3c08c811 -35082dce -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5b36c -10000004 -00000000 -03e02821 -3c03f05e -3463bc8a -0017f821 -24150000 -24160000 -14550b05 -00000000 -14760b03 -00000000 -3c15bfc2 -26b5b36c -3c16bfc2 -26d6b384 -14960afd -00000000 -14b50afb -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c021a5e -34428a78 -0511000c -00000000 -1000000d -00000000 -3c087682 -35085d9a -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5b408 -10000004 -00000000 -03e02821 -3c038b96 -3463ed40 -0017f821 -3c151a5e -36b58a78 -3c168b96 -36d6ed40 -14550adc -00000000 -14760ada -00000000 -3c15bfc2 -26b5b408 -3c16bfc2 -26d6b420 -14960ad4 -00000000 -14b50ad2 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c023786 -3442e87b -0511000c -00000000 -1000000d -00000000 -3c08d5ac -3508f404 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5b4ac -10000004 -00000000 -03e02821 -3c0333e1 -3463ad01 -0017f821 -24150000 -24160000 -14550ab5 -00000000 -14760ab3 -00000000 -3c15bfc2 -26b5b4ac -3c16bfc2 -26d6b4c4 -14960aad -00000000 -14b50aab -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02353a -3442658f -0511000c -00000000 -1000000d -00000000 -3c082d68 -35084380 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5b548 -10000004 -00000000 -03e02821 -3c033a78 -3463a716 -0017f821 -3c15353a -36b5658f -3c163a78 -36d6a716 -14550a8c -00000000 -14760a8a -00000000 -3c15bfc2 -26b5b548 -3c16bfc2 -26d6b560 -14960a84 -00000000 -14b50a82 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c024c07 -3442aa70 -0511000c -00000000 -1000000d -00000000 -3c086d24 -3508026c -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5b5ec -10000004 -00000000 -03e02821 -3c03262d -34637a68 -0017f821 -3c154c07 -36b5aa70 -3c16262d -36d67a68 -14550a63 -00000000 -14760a61 -00000000 -3c15bfc2 -26b5b5ec -3c16bfc2 -26d6b604 -14960a5b -00000000 -14b50a59 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02bb17 -34422b3f -0511000c -00000000 -1000000d -00000000 -3c08e781 -3508e987 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5b690 -10000004 -00000000 -03e02821 -3c039506 -3463bf76 -0017f821 -24150000 -24160000 -14550a3c -00000000 -14760a3a -00000000 -3c15bfc2 -26b5b690 -3c16bfc2 -26d6b6a8 -14960a34 -00000000 -14b50a32 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0295ea -3442e311 -0511000c -00000000 -1000000d -00000000 -3c08849e -350887e0 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5b72c -10000004 -00000000 -03e02821 -3c032a43 -34631460 -0017f821 -24150000 -24160000 -14550a15 -00000000 -14760a13 -00000000 -3c15bfc2 -26b5b72c -3c16bfc2 -26d6b744 -14960a0d -00000000 -14b50a0b -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02b6cd -34428f00 -0511000c -00000000 -1000000d -00000000 -3c08b77b -35088830 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5b7c8 -10000004 -00000000 -03e02821 -3c03599c -346333ac -0017f821 -24150000 -24160000 -145509ee -00000000 -147609ec -00000000 -3c15bfc2 -26b5b7c8 -3c16bfc2 -26d6b7e0 -149609e6 -00000000 -14b509e4 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02cb06 -3442ea2a -0511000c -00000000 -1000000d -00000000 -3c0838b3 -35082afe -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5b864 -10000004 -00000000 -03e02821 -3c0312b1 -3463bd66 -0017f821 -3c15cb06 -36b5ea2a -3c1612b1 -36d6bd66 -145509c5 -00000000 -147609c3 -00000000 -3c15bfc2 -26b5b864 -3c16bfc2 -26d6b87c -149609bd -00000000 -14b509bb -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c029d0b -34422668 -0511000c -00000000 -1000000d -00000000 -3c083645 -350847e8 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5b908 -10000004 -00000000 -03e02821 -3c03e1c5 -34639c78 -0017f821 -3c159d0b -36b52668 -3c16e1c5 -36d69c78 -1455099c -00000000 -1476099a -00000000 -3c15bfc2 -26b5b908 -3c16bfc2 -26d6b920 -14960994 -00000000 -14b50992 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0210cb -3442e1b8 -0511000c -00000000 -1000000d -00000000 -3c089488 -3508b99c -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5b9ac -10000004 -00000000 -03e02821 -3c03407d -3463a648 -0017f821 -24150000 -24160000 -14550975 -00000000 -14760973 -00000000 -3c15bfc2 -26b5b9ac -3c16bfc2 -26d6b9c4 -1496096d -00000000 -14b5096b -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c022c5f -3442fe58 -0511000c -00000000 -1000000d -00000000 -3c084555 -35087d80 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5ba48 -10000004 -00000000 -03e02821 -3c0341c2 -34633300 -0017f821 -3c152c5f -36b5fe58 -3c1641c2 -36d63300 -1455094c -00000000 -1476094a -00000000 -3c15bfc2 -26b5ba48 -3c16bfc2 -26d6ba60 -14960944 -00000000 -14b50942 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c024859 -3442ca40 -0511000c -00000000 -1000000d -00000000 -3c084162 -3508a47e -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5baec -10000004 -00000000 -03e02821 -3c036251 -34631bd0 -0017f821 -3c154859 -36b5ca40 -3c166251 -36d61bd0 -14550923 -00000000 -14760921 -00000000 -3c15bfc2 -26b5baec -3c16bfc2 -26d6bb04 -1496091b -00000000 -14b50919 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02bdc2 -34420ca8 -0511000c -00000000 -1000000d -00000000 -3c08d40f -35089260 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5bb90 -10000004 -00000000 -03e02821 -3c036ad8 -3463501b -0017f821 -24150000 -24160000 -145508fc -00000000 -147608fa -00000000 -3c15bfc2 -26b5bb90 -3c16bfc2 -26d6bba8 -149608f4 -00000000 -14b508f2 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c022f68 -344240b0 -0511000c -00000000 -1000000d -00000000 -3c0821e0 -350807b0 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5bc2c -10000004 -00000000 -03e02821 -3c03d69e -3463be4f -0017f821 -3c152f68 -36b540b0 -3c16d69e -36d6be4f -145508d3 -00000000 -147608d1 -00000000 -3c15bfc2 -26b5bc2c -3c16bfc2 -26d6bc44 -149608cb -00000000 -14b508c9 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c027c80 -3442bd20 -0511000c -00000000 -1000000d -00000000 -3c08e3f7 -3508d594 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5bcd0 -10000004 -00000000 -03e02821 -3c03ea95 -34630588 -0017f821 -24150000 -24160000 -145508ac -00000000 -147608aa -00000000 -3c15bfc2 -26b5bcd0 -3c16bfc2 -26d6bce8 -149608a4 -00000000 -14b508a2 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c020f79 -34424fbe -0511000c -00000000 -1000000d -00000000 -3c08626f -35089ad8 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5bd6c -10000004 -00000000 -03e02821 -3c03a51e -346332c5 -0017f821 -3c150f79 -36b54fbe -3c16a51e -36d632c5 -14550883 -00000000 -14760881 -00000000 -3c15bfc2 -26b5bd6c -3c16bfc2 -26d6bd84 -1496087b -00000000 -14b50879 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c028470 -34427f22 -0511000c -00000000 -1000000d -00000000 -3c084f57 -35089ee1 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5be10 -10000004 -00000000 -03e02821 -3c032986 -3463d290 -0017f821 -3c158470 -36b57f22 -3c162986 -36d6d290 -1455085a -00000000 -14760858 -00000000 -3c15bfc2 -26b5be10 -3c16bfc2 -26d6be28 -14960852 -00000000 -14b50850 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c027ef6 -3442f91e -0511000c -00000000 -1000000d -00000000 -3c0876bf -35083bd0 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5beb4 -10000004 -00000000 -03e02821 -3c03459f -34637678 -0017f821 -3c157ef6 -36b5f91e -3c16459f -36d67678 -14550831 -00000000 -1476082f -00000000 -3c15bfc2 -26b5beb4 -3c16bfc2 -26d6becc -14960829 -00000000 -14b50827 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02fbba -34428330 -0511000c -00000000 -1000000d -00000000 -3c087fef -3508cdfc -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5bf58 -10000004 -00000000 -03e02821 -3c0367cc -34631de8 -0017f821 -3c15fbba -36b58330 -3c1667cc -36d61de8 -14550808 -00000000 -14760806 -00000000 -3c15bfc2 -26b5bf58 -3c16bfc2 -26d6bf70 -14960800 -00000000 -14b507fe -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02122c -34429730 -0511000c -00000000 -1000000d -00000000 -3c08c7f9 -35087c10 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5bffc -10000004 -00000000 -03e02821 -3c039d2d -346392cb -0017f821 -24150000 -24160000 -145507e1 -00000000 -147607df -00000000 -3c15bfc2 -26b5bffc -3c16bfc2 -26d6c014 -149607d9 -00000000 -14b507d7 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0284d7 -34421d28 -0511000c -00000000 -1000000d -00000000 -3c089806 -35087158 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5c098 -10000004 -00000000 -03e02821 -3c034fe8 -3463de78 -0017f821 -24150000 -24160000 -145507ba -00000000 -147607b8 -00000000 -3c15bfc2 -26b5c098 -3c16bfc2 -26d6c0b0 -149607b2 -00000000 -14b507b0 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02522c -3442ff60 -0511000c -00000000 -1000000d -00000000 -3c08ccfe -3508e4dc -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5c134 -10000004 -00000000 -03e02821 -3c03acbe -346358f0 -0017f821 -24150000 -24160000 -14550793 -00000000 -14760791 -00000000 -3c15bfc2 -26b5c134 -3c16bfc2 -26d6c14c -1496078b -00000000 -14b50789 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02387f -34425a58 -0511000c -00000000 -1000000d -00000000 -3c088d4b -3508877a -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5c1d0 -10000004 -00000000 -03e02821 -3c038ed6 -34632e39 -0017f821 -24150000 -24160000 -1455076c -00000000 -1476076a -00000000 -3c15bfc2 -26b5c1d0 -3c16bfc2 -26d6c1e8 -14960764 -00000000 -14b50762 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0272a1 -3442d604 -0511000c -00000000 -1000000d -00000000 -3c08f347 -3508705c -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5c26c -10000004 -00000000 -03e02821 -3c03eea7 -3463aa9e -0017f821 -24150000 -24160000 -14550745 -00000000 -14760743 -00000000 -3c15bfc2 -26b5c26c -3c16bfc2 -26d6c284 -1496073d -00000000 -14b5073b -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c029bde -3442fb1c -0511000c -00000000 -1000000d -00000000 -3c083be3 -3508db68 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5c308 -10000004 -00000000 -03e02821 -3c035996 -3463b860 -0017f821 -3c159bde -36b5fb1c -3c165996 -36d6b860 -1455071c -00000000 -1476071a -00000000 -3c15bfc2 -26b5c308 -3c16bfc2 -26d6c320 -14960714 -00000000 -14b50712 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c027e16 -34426bf8 -0511000c -00000000 -1000000d -00000000 -3c086e80 -350823a0 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5c3ac -10000004 -00000000 -03e02821 -3c032691 -34631a30 -0017f821 -3c157e16 -36b56bf8 -3c162691 -36d61a30 -145506f3 -00000000 -147606f1 -00000000 -3c15bfc2 -26b5c3ac -3c16bfc2 -26d6c3c4 -149606eb -00000000 -14b506e9 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c028120 -34424f2e -0511000c -00000000 -1000000d -00000000 -3c083d50 -350884b0 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5c450 -10000004 -00000000 -03e02821 -3c0318c7 -3463f0aa -0017f821 -3c158120 -36b54f2e -3c1618c7 -36d6f0aa -145506ca -00000000 -147606c8 -00000000 -3c15bfc2 -26b5c450 -3c16bfc2 -26d6c468 -149606c2 -00000000 -14b506c0 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0262bf -344292bd -0511000c -00000000 -1000000d -00000000 -3c088617 -350839d0 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5c4f4 -10000004 -00000000 -03e02821 -3c03b90f -34635834 -0017f821 -24150000 -24160000 -145506a3 -00000000 -147606a1 -00000000 -3c15bfc2 -26b5c4f4 -3c16bfc2 -26d6c50c -1496069b -00000000 -14b50699 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02767d -3442afc8 -0511000c -00000000 -1000000d -00000000 -3c0826df -350839ca -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5c590 -10000004 -00000000 -03e02821 -3c03cf00 -34631cc0 -0017f821 -3c15767d -36b5afc8 -3c16cf00 -36d61cc0 -1455067a -00000000 -14760678 -00000000 -3c15bfc2 -26b5c590 -3c16bfc2 -26d6c5a8 -14960672 -00000000 -14b50670 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02bed0 -34428880 -0511000c -00000000 -1000000d -00000000 -3c08a06b -35084e88 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5c634 -10000004 -00000000 -03e02821 -3c030677 -3463a59c -0017f821 -24150000 -24160000 -14550653 -00000000 -14760651 -00000000 -3c15bfc2 -26b5c634 -3c16bfc2 -26d6c64c -1496064b -00000000 -14b50649 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0222a6 -34424fd2 -0511000c -00000000 -1000000d -00000000 -3c082328 -350859ce -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5c6d0 -10000004 -00000000 -03e02821 -3c03133f -346325e0 -0017f821 -3c1522a6 -36b54fd2 -3c16133f -36d625e0 -1455062a -00000000 -14760628 -00000000 -3c15bfc2 -26b5c6d0 -3c16bfc2 -26d6c6e8 -14960622 -00000000 -14b50620 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02173b -3442f5dc -0511000c -00000000 -1000000d -00000000 -3c082b1b -3508825c -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5c774 -10000004 -00000000 -03e02821 -3c0390d3 -34636ca0 -0017f821 -3c15173b -36b5f5dc -3c1690d3 -36d66ca0 -14550601 -00000000 -147605ff -00000000 -3c15bfc2 -26b5c774 -3c16bfc2 -26d6c78c -149605f9 -00000000 -14b505f7 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02c1da -3442a4c0 -0511000c -00000000 -1000000d -00000000 -3c080b6a -35089780 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5c818 -10000004 -00000000 -03e02821 -3c0343d2 -34633580 -0017f821 -3c15c1da -36b5a4c0 -3c1643d2 -36d63580 -145505d8 -00000000 -147605d6 -00000000 -3c15bfc2 -26b5c818 -3c16bfc2 -26d6c830 -149605d0 -00000000 -14b505ce -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c023426 -3442946d -0511000c -00000000 -1000000d -00000000 -3c088f7e -35088f8c -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5c8bc -10000004 -00000000 -03e02821 -3c039913 -3463f9c6 -0017f821 -24150000 -24160000 -145505b1 -00000000 -147605af -00000000 -3c15bfc2 -26b5c8bc -3c16bfc2 -26d6c8d4 -149605a9 -00000000 -14b505a7 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02aa55 -344210c0 -0511000c -00000000 -1000000d -00000000 -3c081b2f -350892a4 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5c958 -10000004 -00000000 -03e02821 -3c034770 -346326b8 -0017f821 -3c15aa55 -36b510c0 -3c164770 -36d626b8 -14550588 -00000000 -14760586 -00000000 -3c15bfc2 -26b5c958 -3c16bfc2 -26d6c970 -14960580 -00000000 -14b5057e -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c027df2 -344268b0 -0511000c -00000000 -1000000d -00000000 -3c08406f -350892c2 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5c9fc -10000004 -00000000 -03e02821 -3c03c8f7 -3463a25d -0017f821 -3c157df2 -36b568b0 -3c16c8f7 -36d6a25d -1455055f -00000000 -1476055d -00000000 -3c15bfc2 -26b5c9fc -3c16bfc2 -26d6ca14 -14960557 -00000000 -14b50555 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c024559 -344236a0 -0511000c -00000000 -1000000d -00000000 -3c085c22 -35081ab6 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5caa0 -10000004 -00000000 -03e02821 -3c03d113 -34633fb0 -0017f821 -3c154559 -36b536a0 -3c16d113 -36d63fb0 -14550536 -00000000 -14760534 -00000000 -3c15bfc2 -26b5caa0 -3c16bfc2 -26d6cab8 -1496052e -00000000 -14b5052c -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0219a6 -34420c80 -0511000c -00000000 -1000000d -00000000 -3c082527 -3508510a -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5cb44 -10000004 -00000000 -03e02821 -3c039659 -3463b2f4 -0017f821 -3c1519a6 -36b50c80 -3c169659 -36d6b2f4 -1455050d -00000000 -1476050b -00000000 -3c15bfc2 -26b5cb44 -3c16bfc2 -26d6cb5c -14960505 -00000000 -14b50503 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02bc5f -344215c0 -0511000c -00000000 -1000000d -00000000 -3c08a55c -3508a800 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5cbe8 -10000004 -00000000 -03e02821 -3c0336c6 -34633a7a -0017f821 -24150000 -24160000 -145504e6 -00000000 -147604e4 -00000000 -3c15bfc2 -26b5cbe8 -3c16bfc2 -26d6cc00 -149604de -00000000 -14b504dc -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02e682 -34424b52 -0511000c -00000000 -1000000d -00000000 -3c08abe3 -35088b6a -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5cc84 -10000004 -00000000 -03e02821 -3c03d28b -34638008 -0017f821 -24150000 -24160000 -145504bf -00000000 -147604bd -00000000 -3c15bfc2 -26b5cc84 -3c16bfc2 -26d6cc9c -149604b7 -00000000 -14b504b5 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c022765 -344296c8 -0511000c -00000000 -1000000d -00000000 -3c080bfe -350849f4 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5cd20 -10000004 -00000000 -03e02821 -3c033cc6 -34631e70 -0017f821 -3c152765 -36b596c8 -3c163cc6 -36d61e70 -14550496 -00000000 -14760494 -00000000 -3c15bfc2 -26b5cd20 -3c16bfc2 -26d6cd38 -1496048e -00000000 -14b5048c -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0283a7 -344274f8 -0511000c -00000000 -1000000d -00000000 -3c08a46f -3508df48 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5cdc4 -10000004 -00000000 -03e02821 -3c035fab -3463a638 -0017f821 -24150000 -24160000 -1455046f -00000000 -1476046d -00000000 -3c15bfc2 -26b5cdc4 -3c16bfc2 -26d6cddc -14960467 -00000000 -14b50465 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02c70f -3442fa10 -0511000c -00000000 -1000000d -00000000 -3c08457d -3508808b -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5ce60 -10000004 -00000000 -03e02821 -3c03cbbc -3463e566 -0017f821 -3c15c70f -36b5fa10 -3c16cbbc -36d6e566 -14550446 -00000000 -14760444 -00000000 -3c15bfc2 -26b5ce60 -3c16bfc2 -26d6ce78 -1496043e -00000000 -14b5043c -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c026d04 -3442c2e4 -0511000c -00000000 -1000000d -00000000 -3c087d1e -350889e8 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5cf04 -10000004 -00000000 -03e02821 -3c03904d -3463b13e -0017f821 -3c156d04 -36b5c2e4 -3c16904d -36d6b13e -1455041d -00000000 -1476041b -00000000 -3c15bfc2 -26b5cf04 -3c16bfc2 -26d6cf1c -14960415 -00000000 -14b50413 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c024e4e -34427f30 -0511000c -00000000 -1000000d -00000000 -3c082354 -3508ab07 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5cfa8 -10000004 -00000000 -03e02821 -3c033867 -3463d3c3 -0017f821 -3c154e4e -36b57f30 -3c163867 -36d6d3c3 -145503f4 -00000000 -147603f2 -00000000 -3c15bfc2 -26b5cfa8 -3c16bfc2 -26d6cfc0 -149603ec -00000000 -14b503ea -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02c62f -34429716 -0511000c -00000000 -1000000d -00000000 -3c082afa -3508bf2c -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5d04c -10000004 -00000000 -03e02821 -3c038a69 -3463e0bc -0017f821 -3c15c62f -36b59716 -3c168a69 -36d6e0bc -145503cb -00000000 -147603c9 -00000000 -3c15bfc2 -26b5d04c -3c16bfc2 -26d6d064 -149603c3 -00000000 -14b503c1 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02623a -34425c87 -0511000c -00000000 -1000000d -00000000 -3c08a278 -350823c4 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5d0f0 -10000004 -00000000 -03e02821 -3c0377ff -34630050 -0017f821 -24150000 -24160000 -145503a4 -00000000 -147603a2 -00000000 -3c15bfc2 -26b5d0f0 -3c16bfc2 -26d6d108 -1496039c -00000000 -14b5039a -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0227c8 -3442b198 -0511000c -00000000 -1000000d -00000000 -3c08bbbb -3508d5d8 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5d18c -10000004 -00000000 -03e02821 -3c03ab3c -3463c6d1 -0017f821 -24150000 -24160000 -1455037d -00000000 -1476037b -00000000 -3c15bfc2 -26b5d18c -3c16bfc2 -26d6d1a4 -14960375 -00000000 -14b50373 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02f1f2 -3442eceb -0511000c -00000000 -1000000d -00000000 -3c087214 -35084dee -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5d228 -10000004 -00000000 -03e02821 -3c0384cd -3463c5c0 -0017f821 -3c15f1f2 -36b5eceb -3c1684cd -36d6c5c0 -14550354 -00000000 -14760352 -00000000 -3c15bfc2 -26b5d228 -3c16bfc2 -26d6d240 -1496034c -00000000 -14b5034a -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0264ff -34423a3c -0511000c -00000000 -1000000d -00000000 -3c08bdc5 -35081fde -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5d2cc -10000004 -00000000 -03e02821 -3c03cf80 -346314a7 -0017f821 -24150000 -24160000 -1455032d -00000000 -1476032b -00000000 -3c15bfc2 -26b5d2cc -3c16bfc2 -26d6d2e4 -14960325 -00000000 -14b50323 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02238a -3442b968 -0511000c -00000000 -1000000d -00000000 -3c085ba6 -35084bf2 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5d368 -10000004 -00000000 -03e02821 -3c03e323 -34635e00 -0017f821 -3c15238a -36b5b968 -3c16e323 -36d65e00 -14550304 -00000000 -14760302 -00000000 -3c15bfc2 -26b5d368 -3c16bfc2 -26d6d380 -149602fc -00000000 -14b502fa -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02d2de -34423c44 -0511000c -00000000 -1000000d -00000000 -3c08d7e5 -3508a6ce -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5d40c -10000004 -00000000 -03e02821 -3c034775 -346339a5 -0017f821 -24150000 -24160000 -145502dd -00000000 -147602db -00000000 -3c15bfc2 -26b5d40c -3c16bfc2 -26d6d424 -149602d5 -00000000 -14b502d3 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c024e66 -34421200 -0511000c -00000000 -1000000d -00000000 -3c084faa -35085480 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5d4a8 -10000004 -00000000 -03e02821 -3c037488 -34633efc -0017f821 -3c154e66 -36b51200 -3c167488 -36d63efc -145502b4 -00000000 -147602b2 -00000000 -3c15bfc2 -26b5d4a8 -3c16bfc2 -26d6d4c0 -149602ac -00000000 -14b502aa -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02c34a -344299a0 -0511000c -00000000 -1000000d -00000000 -3c0844ba -3508e210 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5d54c -10000004 -00000000 -03e02821 -3c031e08 -346330ef -0017f821 -3c15c34a -36b599a0 -3c161e08 -36d630ef -1455028b -00000000 -14760289 -00000000 -3c15bfc2 -26b5d54c -3c16bfc2 -26d6d564 -14960283 -00000000 -14b50281 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02b802 -34426130 -0511000c -00000000 -1000000d -00000000 -3c0861e7 -3508c0fd -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5d5f0 -10000004 -00000000 -03e02821 -3c03d3fb -3463617c -0017f821 -3c15b802 -36b56130 -3c16d3fb -36d6617c -14550262 -00000000 -14760260 -00000000 -3c15bfc2 -26b5d5f0 -3c16bfc2 -26d6d608 -1496025a -00000000 -14b50258 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c029021 -34426418 -0511000c -00000000 -1000000d -00000000 -3c08180e -35083fdc -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5d694 -10000004 -00000000 -03e02821 -3c035b65 -3463ccfc -0017f821 -3c159021 -36b56418 -3c165b65 -36d6ccfc -14550239 -00000000 -14760237 -00000000 -3c15bfc2 -26b5d694 -3c16bfc2 -26d6d6ac -14960231 -00000000 -14b5022f -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02c221 -3442096a -0511000c -00000000 -1000000d -00000000 -3c08f51d -35084eae -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5d738 -10000004 -00000000 -03e02821 -3c03ec0f -3463ec6c -0017f821 -24150000 -24160000 -14550212 -00000000 -14760210 -00000000 -3c15bfc2 -26b5d738 -3c16bfc2 -26d6d750 -1496020a -00000000 -14b50208 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0276e7 -34426d08 -0511000c -00000000 -1000000d -00000000 -3c08debf -3508a252 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5d7d4 -10000004 -00000000 -03e02821 -3c034216 -3463c340 -0017f821 -24150000 -24160000 -145501eb -00000000 -147601e9 -00000000 -3c15bfc2 -26b5d7d4 -3c16bfc2 -26d6d7ec -149601e3 -00000000 -14b501e1 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0296de -34424250 -0511000c -00000000 -1000000d -00000000 -3c08c80f -350806a0 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5d870 -10000004 -00000000 -03e02821 -3c037dd7 -3463b2d0 -0017f821 -24150000 -24160000 -145501c4 -00000000 -147601c2 -00000000 -3c15bfc2 -26b5d870 -3c16bfc2 -26d6d888 -149601bc -00000000 -14b501ba -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02869e -344274b0 -0511000c -00000000 -1000000d -00000000 -3c08da25 -3508c957 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5d90c -10000004 -00000000 -03e02821 -3c039f65 -34637c90 -0017f821 -24150000 -24160000 -1455019d -00000000 -1476019b -00000000 -3c15bfc2 -26b5d90c -3c16bfc2 -26d6d924 -14960195 -00000000 -14b50193 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c027535 -344218e8 -0511000c -00000000 -1000000d -00000000 -3c08e2c1 -35086e00 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5d9a8 -10000004 -00000000 -03e02821 -3c03c36e -34637a80 -0017f821 -24150000 -24160000 -14550176 -00000000 -14760174 -00000000 -3c15bfc2 -26b5d9a8 -3c16bfc2 -26d6d9c0 -1496016e -00000000 -14b5016c -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02eda6 -3442f700 -0511000c -00000000 -1000000d -00000000 -3c088493 -3508ac53 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5da44 -10000004 -00000000 -03e02821 -3c03023b -3463b300 -0017f821 -24150000 -24160000 -1455014f -00000000 -1476014d -00000000 -3c15bfc2 -26b5da44 -3c16bfc2 -26d6da5c -14960147 -00000000 -14b50145 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0273e8 -3442ac0c -0511000c -00000000 -1000000d -00000000 -3c08ce17 -3508d056 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5dae0 -10000004 -00000000 -03e02821 -3c035213 -34636032 -0017f821 -24150000 -24160000 -14550128 -00000000 -14760126 -00000000 -3c15bfc2 -26b5dae0 -3c16bfc2 -26d6daf8 -14960120 -00000000 -14b5011e -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02d513 -3442fa00 -0511000c -00000000 -1000000d -00000000 -3c081732 -3508bc45 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5db7c -10000004 -00000000 -03e02821 -3c03ed74 -346348b8 -0017f821 -3c15d513 -36b5fa00 -3c16ed74 -36d648b8 -145500ff -00000000 -147600fd -00000000 -3c15bfc2 -26b5db7c -3c16bfc2 -26d6db94 -149600f7 -00000000 -14b500f5 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02066a -3442a5c6 -0511000c -00000000 -1000000d -00000000 -3c081798 -350839ac -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5dc20 -10000004 -00000000 -03e02821 -3c030296 -3463d70d -0017f821 -3c15066a -36b5a5c6 -3c160296 -36d6d70d -145500d6 -00000000 -147600d4 -00000000 -3c15bfc2 -26b5dc20 -3c16bfc2 -26d6dc38 -149600ce -00000000 -14b500cc -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02cb26 -3442ec57 -0511000c -00000000 -1000000d -00000000 -3c08221b -350814f9 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5dcc4 -10000004 -00000000 -03e02821 -3c031633 -3463f6be -0017f821 -3c15cb26 -36b5ec57 -3c161633 -36d6f6be -145500ad -00000000 -147600ab -00000000 -3c15bfc2 -26b5dcc4 -3c16bfc2 -26d6dcdc -149600a5 -00000000 -14b500a3 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c026299 -344267a0 -0511000c -00000000 -1000000d -00000000 -3c0868f6 -3508e51f -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5dd68 -10000004 -00000000 -03e02821 -3c03a593 -34636df4 -0017f821 -3c156299 -36b567a0 -3c16a593 -36d66df4 -14550084 -00000000 -14760082 -00000000 -3c15bfc2 -26b5dd68 -3c16bfc2 -26d6dd80 -1496007c -00000000 -14b5007a -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02aaa3 -3442de30 -0511000c -00000000 -1000000d -00000000 -3c08f624 -3508bdb0 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5de0c -10000004 -00000000 -03e02821 -3c037e6d -3463dd50 -0017f821 -24150000 -24160000 -1455005d -00000000 -1476005b -00000000 -3c15bfc2 -26b5de0c -3c16bfc2 -26d6de24 -14960055 -00000000 -14b50053 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02b188 -3442d600 -0511000c -00000000 -1000000d -00000000 -3c0882f5 -3508a6f0 -0511fff6 -00000000 -03e02021 -3c05bfc2 -24a5dea8 -10000004 -00000000 -03e02821 -3c03206f -3463a380 -0017f821 -24150000 -24160000 -14550036 -00000000 -14760034 -00000000 -3c15bfc2 -26b5dea8 -3c16bfc2 -26d6dec0 -1496002e -00000000 -14b5002c -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0236a3 -34426650 -0511000b -00000000 -1000000c -00000000 -24080000 -0511fff7 -00000000 -03e02021 -3c05bfc2 -24a5df44 -10000004 -00000000 -03e02821 -3c0344fa -34637d50 -0017f821 -3c1536a3 -36b56650 -3c1644fa -36d67d50 -1455000e -00000000 -1476000c -00000000 -3c15bfc2 -26b5df44 -3c16bfc2 -26d6df58 -14960006 -00000000 -14b50004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -26100001 -24120000 -24020000 -24030000 -10000008 -00000000 -3c0240b4 -34420d40 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08cc73 -35088190 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0345eb -34639450 -24150000 -24160000 -1455150b -00000000 -14761509 -00000000 -24020000 -24030000 -10000008 -00000000 -3c023e30 -344226e7 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c088b97 -35080e60 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03485f -34632d18 -24150000 -24160000 -145514f1 -00000000 -147614ef -00000000 -24020000 -24030000 -10000008 -00000000 -3c02983f -3442ea90 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c087b48 -350858f8 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c039bf0 -3463c7cc -3c15983f -36b5ea90 -3c169bf0 -36d6c7cc -145514d5 -00000000 -147614d3 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0276d2 -3442102e -1d00000b -00000000 -1000000b -00000000 -00000000 -3c0865fb -3508d242 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03a5de -3463d158 -3c1576d2 -36b5102e -3c16a5de -36d6d158 -145514b9 -00000000 -147614b7 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02d3a9 -3442ed2a -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08033a -350861c6 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03db0f -3463f880 -3c15d3a9 -36b5ed2a -3c16db0f -36d6f880 -1455149d -00000000 -1476149b -00000000 -24020000 -24030000 -10000008 -00000000 -3c0243df -34429d30 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08c737 -350819a0 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03d325 -3463d5c0 -24150000 -24160000 -14551483 -00000000 -14761481 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02487a -3442a5f8 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c0829fe -35085c70 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c030cac -34635c42 -3c15487a -36b5a5f8 -3c160cac -36d65c42 -14551467 -00000000 -14761465 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02c9a2 -3442683f -1d00000b -00000000 -1000000b -00000000 -00000000 -3c081433 -3508f468 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03eabb -3463f460 -3c15c9a2 -36b5683f -3c16eabb -36d6f460 -1455144b -00000000 -14761449 -00000000 -24020000 -24030000 -10000008 -00000000 -3c027c4d -34422cf9 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c0824de -35085ef2 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c037899 -3463d420 -3c157c4d -36b52cf9 -3c167899 -36d6d420 -1455142f -00000000 -1476142d -00000000 -24020000 -24030000 -10000008 -00000000 -3c02b671 -344205f0 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c0860a7 -35089438 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03265c -34635984 -3c15b671 -36b505f0 -3c16265c -36d65984 -14551413 -00000000 -14761411 -00000000 -24020000 -24030000 -10000008 -00000000 -3c020474 -3442d400 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c088618 -35087dac -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0333c2 -3463383c -24150000 -24160000 -145513f9 -00000000 -147613f7 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02ed85 -3442a554 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08a558 -35087200 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c038285 -3463f2a0 -24150000 -24160000 -145513df -00000000 -147613dd -00000000 -24020000 -24030000 -10000008 -00000000 -3c02c0b3 -34427148 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c0842c0 -35085c68 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c033ea0 -34636fbf -3c15c0b3 -36b57148 -3c163ea0 -36d66fbf -145513c3 -00000000 -147613c1 -00000000 -24020000 -24030000 -10000008 -00000000 -3c029aa6 -3442c78e -1d00000b -00000000 -1000000b -00000000 -00000000 -3c082334 -35080320 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03ab29 -34635f0c -3c159aa6 -36b5c78e -3c16ab29 -36d65f0c -145513a7 -00000000 -147613a5 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02d977 -3442d03c -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08b892 -3508e3a2 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0340de -34633026 -24150000 -24160000 -1455138d -00000000 -1476138b -00000000 -24020000 -24030000 -10000008 -00000000 -3c0240cb -3442ac60 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c0851af -3508e044 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03ec87 -3463d399 -3c1540cb -36b5ac60 -3c16ec87 -36d6d399 -14551371 -00000000 -1476136f -00000000 -24020000 -24030000 -10000008 -00000000 -3c0204cf -3442009c -1d00000b -00000000 -1000000b -00000000 -00000000 -3c089123 -35085cf0 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0329fc -3463f850 -24150000 -24160000 -14551357 -00000000 -14761355 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02019b -34428fb1 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c081dab -3508852d -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c036804 -346374d1 -3c15019b -36b58fb1 -3c166804 -36d674d1 -1455133b -00000000 -14761339 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02e73c -3442a9c0 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08d565 -350887e1 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c038a57 -34634ef0 -24150000 -24160000 -14551321 -00000000 -1476131f -00000000 -24020000 -24030000 -10000008 -00000000 -3c027e51 -3442854f -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08afc1 -35087ba2 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03bc02 -346395c0 -24150000 -24160000 -14551307 -00000000 -14761305 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0238fc -3442c6c0 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c088b42 -35082e64 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0358f2 -3463fb68 -24150000 -24160000 -145512ed -00000000 -147612eb -00000000 -24020000 -24030000 -10000008 -00000000 -3c0296e1 -3442c737 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c082ce3 -35084fa4 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c035258 -3463e894 -3c1596e1 -36b5c737 -3c165258 -36d6e894 -145512d1 -00000000 -147612cf -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f32a -3442a000 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08ff12 -35089164 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03e416 -34638ba0 -24150000 -24160000 -145512b7 -00000000 -147612b5 -00000000 -24020000 -24030000 -10000008 -00000000 -3c028b7f -3442374a -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08668b -3508cf90 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c032e91 -346399db -3c158b7f -36b5374a -3c162e91 -36d699db -1455129b -00000000 -14761299 -00000000 -24020000 -24030000 -10000008 -00000000 -3c028cd6 -344236af -1d00000b -00000000 -1000000b -00000000 -00000000 -3c085508 -3508e680 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c038c1b -346369fc -3c158cd6 -36b536af -3c168c1b -36d669fc -1455127f -00000000 -1476127d -00000000 -24020000 -24030000 -10000008 -00000000 -3c020a6b -34424964 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c0879e4 -3508938c -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0327bd -346335e2 -3c150a6b -36b54964 -3c1627bd -36d635e2 -14551263 -00000000 -14761261 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f876 -3442f27c -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08ed2b -3508de39 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03debe -34633030 -24150000 -24160000 -14551249 -00000000 -14761247 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0275ea -34424b84 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c0894c9 -35085e80 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0333a1 -34638880 -24150000 -24160000 -1455122f -00000000 -1476122d -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f753 -3442984a -1d00000b -00000000 -1000000b -00000000 -00000000 -3c087dfd -35089ab0 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03af05 -346332c8 -3c15f753 -36b5984a -3c16af05 -36d632c8 -14551213 -00000000 -14761211 -00000000 -24020000 -24030000 -10000008 -00000000 -3c026a4c -3442ed20 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08185f -3508dee0 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c031460 -3463740b -3c156a4c -36b5ed20 -3c161460 -36d6740b -145511f7 -00000000 -147611f5 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02b124 -344240c8 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08ca89 -350866ac -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03f22a -3463c2c0 -24150000 -24160000 -145511dd -00000000 -147611db -00000000 -24020000 -24030000 -10000008 -00000000 -3c02ccbc -34429630 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08f353 -3508df1c -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0308e0 -3463f060 -24150000 -24160000 -145511c3 -00000000 -147611c1 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f70e -34421920 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08d397 -350883ec -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c036c0c -3463ebbf -24150000 -24160000 -145511a9 -00000000 -147611a7 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02c06d -344242e0 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08d221 -3508b0b6 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03f7e6 -34635ae0 -24150000 -24160000 -1455118f -00000000 -1476118d -00000000 -24020000 -24030000 -10000008 -00000000 -3c021ca0 -3442e834 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c0896c0 -3508e2e6 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c036452 -3463a3d0 -24150000 -24160000 -14551175 -00000000 -14761173 -00000000 -24020000 -24030000 -10000008 -00000000 -3c025173 -344228e8 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c080df3 -35082d52 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0314eb -34632a70 -3c155173 -36b528e8 -3c1614eb -36d62a70 -14551159 -00000000 -14761157 -00000000 -24020000 -24030000 -10000008 -00000000 -3c021e74 -3442d980 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c084e20 -350818d5 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c038f0b -34632328 -3c151e74 -36b5d980 -3c168f0b -36d62328 -1455113d -00000000 -1476113b -00000000 -24020000 -24030000 -10000008 -00000000 -3c0250bd -3442b2bc -1d00000b -00000000 -1000000b -00000000 -00000000 -3c0836fe -35089020 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c039d55 -3463de4b -3c1550bd -36b5b2bc -3c169d55 -36d6de4b -14551121 -00000000 -1476111f -00000000 -24020000 -24030000 -10000008 -00000000 -3c02dccd -3442986a -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08d5ca -35087000 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03e0dd -346329a8 -24150000 -24160000 -14551107 -00000000 -14761105 -00000000 -24020000 -24030000 -10000008 -00000000 -3c027db0 -3442b3fe -1d00000b -00000000 -1000000b -00000000 -00000000 -3c0840a2 -35089d20 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0362d5 -34633342 -3c157db0 -36b5b3fe -3c1662d5 -36d63342 -145510eb -00000000 -147610e9 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0239c7 -344244c8 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c081b7a -350835f1 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c037ea3 -3463e155 -3c1539c7 -36b544c8 -3c167ea3 -36d6e155 -145510cf -00000000 -147610cd -00000000 -24020000 -24030000 -10000008 -00000000 -3c0211a6 -3442cbdf -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08df9b -3508794d -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03c84b -3463874c -24150000 -24160000 -145510b5 -00000000 -147610b3 -00000000 -24020000 -24030000 -10000008 -00000000 -3c021a1c -34429040 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08b46f -35087300 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03c08e -3463dc80 -24150000 -24160000 -1455109b -00000000 -14761099 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02a9a4 -3442791c -1d00000b -00000000 -1000000b -00000000 -00000000 -3c083dba -35086948 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03f55e -34638b40 -3c15a9a4 -36b5791c -3c16f55e -36d68b40 -1455107f -00000000 -1476107d -00000000 -24020000 -24030000 -10000008 -00000000 -3c026b15 -34424e98 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08f2a0 -35086610 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03cb5a -34630248 -24150000 -24160000 -14551065 -00000000 -14761063 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02d07e -34422886 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08d2d2 -35089ff0 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03e1a5 -346397d8 -24150000 -24160000 -1455104b -00000000 -14761049 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02779f -344228d4 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08a737 -35082748 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03f829 -3463327e -24150000 -24160000 -14551031 -00000000 -1476102f -00000000 -24020000 -24030000 -10000008 -00000000 -3c02af5b -344201d8 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08d13a -3508d050 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c036280 -34636d80 -24150000 -24160000 -14551017 -00000000 -14761015 -00000000 -24020000 -24030000 -10000008 -00000000 -3c022651 -34422e00 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08942c -3508b34c -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c031f2b -34639abc -24150000 -24160000 -14550ffd -00000000 -14760ffb -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f93c -3442ddd0 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c086664 -3508a816 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03d87e -3463e5e8 -3c15f93c -36b5ddd0 -3c16d87e -36d6e5e8 -14550fe1 -00000000 -14760fdf -00000000 -24020000 -24030000 -10000008 -00000000 -3c02ddaa -3442bf0c -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08c18e -3508f206 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0326c6 -3463077c -24150000 -24160000 -14550fc7 -00000000 -14760fc5 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02656a -344211e8 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08f4e2 -3508acf6 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03dde3 -346351c7 -24150000 -24160000 -14550fad -00000000 -14760fab -00000000 -24020000 -24030000 -10000008 -00000000 -3c02a579 -344266d2 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08cfba -35081c40 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03c4ca -34633f4c -24150000 -24160000 -14550f93 -00000000 -14760f91 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02398f -3442f448 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c082881 -35084420 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03acc6 -34635800 -3c15398f -36b5f448 -3c16acc6 -36d65800 -14550f77 -00000000 -14760f75 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02e228 -3442ddb6 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c0868d8 -35089f80 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03dd97 -3463df05 -3c15e228 -36b5ddb6 -3c16dd97 -36d6df05 -14550f5b -00000000 -14760f59 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02e32f -34424cf4 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08e3d8 -35086394 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c036439 -346343a0 -24150000 -24160000 -14550f41 -00000000 -14760f3f -00000000 -24020000 -24030000 -10000008 -00000000 -3c02572a -3442bb70 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08daea -35084ae0 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c030175 -346310ae -24150000 -24160000 -14550f27 -00000000 -14760f25 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02a747 -3442bbb0 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c087afd -350834e0 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03ddf0 -34635900 -3c15a747 -36b5bbb0 -3c16ddf0 -36d65900 -14550f0b -00000000 -14760f09 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02ce5a -3442fb08 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c085278 -3508e3d0 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0397e2 -34634bac -3c15ce5a -36b5fb08 -3c1697e2 -36d64bac -14550eef -00000000 -14760eed -00000000 -24020000 -24030000 -10000008 -00000000 -3c02ceb1 -3442b900 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c087d05 -3508f388 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03487e -34639c3c -3c15ceb1 -36b5b900 -3c16487e -36d69c3c -14550ed3 -00000000 -14760ed1 -00000000 -24020000 -24030000 -10000008 -00000000 -3c025489 -3442e40a -1d00000b -00000000 -1000000b -00000000 -00000000 -3c0888be -350824c8 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03dbec -346376e4 -24150000 -24160000 -14550eb9 -00000000 -14760eb7 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02e570 -3442b32c -1d00000b -00000000 -1000000b -00000000 -00000000 -3c084ffc -35088b80 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c035290 -34636034 -3c15e570 -36b5b32c -3c165290 -36d66034 -14550e9d -00000000 -14760e9b -00000000 -24020000 -24030000 -10000008 -00000000 -3c0260a0 -34420828 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08db38 -35081e30 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03eea9 -346374f0 -24150000 -24160000 -14550e83 -00000000 -14760e81 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02264e -3442e3be -1d00000b -00000000 -1000000b -00000000 -00000000 -3c0838f3 -35082dce -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c037b21 -34638b6c -3c15264e -36b5e3be -3c167b21 -36d68b6c -14550e67 -00000000 -14760e65 -00000000 -24020000 -24030000 -10000008 -00000000 -3c026fc2 -344210a0 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08de07 -350843d8 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03dd3e -3463dfd0 -24150000 -24160000 -14550e4d -00000000 -14760e4b -00000000 -24020000 -24030000 -10000008 -00000000 -3c0230d9 -34428512 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08aad6 -350861d8 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03b849 -3463ed6c -24150000 -24160000 -14550e33 -00000000 -14760e31 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02044e -34423aeb -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08db14 -35089a64 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03eeea -346349d0 -24150000 -24160000 -14550e19 -00000000 -14760e17 -00000000 -24020000 -24030000 -10000008 -00000000 -3c021e24 -3442a00c -1d00000b -00000000 -1000000b -00000000 -00000000 -3c086318 -3508abe8 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c039f89 -3463c3cf -3c151e24 -36b5a00c -3c169f89 -36d6c3cf -14550dfd -00000000 -14760dfb -00000000 -24020000 -24030000 -10000008 -00000000 -3c0296f8 -3442c39d -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08d8c4 -3508ace3 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03cff9 -34636799 -24150000 -24160000 -14550de3 -00000000 -14760de1 -00000000 -24020000 -24030000 -10000008 -00000000 -3c026430 -34420f10 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c083d5c -350843ac -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03b152 -346350e5 -3c156430 -36b50f10 -3c16b152 -36d650e5 -14550dc7 -00000000 -14760dc5 -00000000 -24020000 -24030000 -10000008 -00000000 -3c026339 -34422fb8 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08376d -35086900 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03c785 -34631378 -3c156339 -36b52fb8 -3c16c785 -36d61378 -14550dab -00000000 -14760da9 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02630b -3442c8f2 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08a150 -3508437e -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c039464 -346306d4 -24150000 -24160000 -14550d91 -00000000 -14760d8f -00000000 -24020000 -24030000 -10000008 -00000000 -3c026588 -34429a8c -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08dbe6 -3508f779 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03f83c -3463e74e -24150000 -24160000 -14550d77 -00000000 -14760d75 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02cc86 -34425e48 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c082d56 -35082b40 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c037d22 -3463d970 -3c15cc86 -36b55e48 -3c167d22 -36d6d970 -14550d5b -00000000 -14760d59 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0226c8 -3442811c -1d00000b -00000000 -1000000b -00000000 -00000000 -3c0898ff -35088f1c -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03512d -3463a934 -24150000 -24160000 -14550d41 -00000000 -14760d3f -00000000 -24020000 -24030000 -10000008 -00000000 -3c022e0b -34428ce0 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c087747 -35081b9c -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03433e -34634cd7 -3c152e0b -36b58ce0 -3c16433e -36d64cd7 -14550d25 -00000000 -14760d23 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02d185 -34424e7c -1d00000b -00000000 -1000000b -00000000 -00000000 -3c080737 -3508bf48 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03ce91 -34637c1c -3c15d185 -36b54e7c -3c16ce91 -36d67c1c -14550d09 -00000000 -14760d07 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02ef11 -344223f7 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c086326 -35080240 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0343d1 -34639608 -3c15ef11 -36b523f7 -3c1643d1 -36d69608 -14550ced -00000000 -14760ceb -00000000 -24020000 -24030000 -10000008 -00000000 -3c024943 -34422ca8 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c0837ee -35087320 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03299d -34637670 -3c154943 -36b52ca8 -3c16299d -36d67670 -14550cd1 -00000000 -14760ccf -00000000 -24020000 -24030000 -10000008 -00000000 -3c0245a8 -34425e00 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c088609 -3508edb0 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c034a3f -34632644 -24150000 -24160000 -14550cb7 -00000000 -14760cb5 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02abd8 -3442ade8 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08ed4c -3508cd00 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c036dd1 -3463abe4 -24150000 -24160000 -14550c9d -00000000 -14760c9b -00000000 -24020000 -24030000 -10000008 -00000000 -3c02cb76 -3442a116 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c089541 -3508754c -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c032f02 -34632af8 -24150000 -24160000 -14550c83 -00000000 -14760c81 -00000000 -24020000 -24030000 -10000008 -00000000 -3c027343 -344265ba -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08c2c0 -350819d0 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0330dc -34633dc0 -24150000 -24160000 -14550c69 -00000000 -14760c67 -00000000 -24020000 -24030000 -10000008 -00000000 -3c022892 -3442c01f -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08bac7 -35082ec2 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03cf87 -3463ddfc -24150000 -24160000 -14550c4f -00000000 -14760c4d -00000000 -24020000 -24030000 -10000008 -00000000 -3c02c43f -3442d5fc -1d00000b -00000000 -1000000b -00000000 -00000000 -3c085f8b -3508db24 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03bdb5 -3463e3a5 -3c15c43f -36b5d5fc -3c16bdb5 -36d6e3a5 -14550c33 -00000000 -14760c31 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02a00a -3442bad5 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c082349 -350803fe -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0310ea -3463a1ac -3c15a00a -36b5bad5 -3c1610ea -36d6a1ac -14550c17 -00000000 -14760c15 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02c415 -34424232 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08641f -35081aa8 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03bf06 -3463cf13 -3c15c415 -36b54232 -3c16bf06 -36d6cf13 -14550bfb -00000000 -14760bf9 -00000000 -24020000 -24030000 -10000008 -00000000 -3c022475 -3442e71e -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08bc19 -35086de8 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03138f -3463991a -24150000 -24160000 -14550be1 -00000000 -14760bdf -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f048 -34424b7a -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08bd6b -350808f2 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c036c36 -34636cf1 -24150000 -24160000 -14550bc7 -00000000 -14760bc5 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02e794 -34422457 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08c96e -35088ec0 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0308a4 -3463fbd8 -24150000 -24160000 -14550bad -00000000 -14760bab -00000000 -24020000 -24030000 -10000008 -00000000 -3c029b7e -3442f83e -1d00000b -00000000 -1000000b -00000000 -00000000 -3c083fa8 -3508a554 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03eae7 -34636b1c -3c159b7e -36b5f83e -3c16eae7 -36d66b1c -14550b91 -00000000 -14760b8f -00000000 -24020000 -24030000 -10000008 -00000000 -3c024e25 -34421780 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08d14f -35084d82 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c031902 -3463f458 -24150000 -24160000 -14550b77 -00000000 -14760b75 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0239e8 -344204e8 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c0887bd -35084f22 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c032a76 -34634a40 -24150000 -24160000 -14550b5d -00000000 -14760b5b -00000000 -24020000 -24030000 -10000008 -00000000 -3c02de3b -3442e87a -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08799f -3508117e -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0336c0 -34639318 -3c15de3b -36b5e87a -3c1636c0 -36d69318 -14550b41 -00000000 -14760b3f -00000000 -24020000 -24030000 -10000008 -00000000 -3c02efa4 -344254dc -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08128a -35086080 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c033177 -34639bbc -3c15efa4 -36b554dc -3c163177 -36d69bbc -14550b25 -00000000 -14760b23 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f8a7 -3442ca38 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08eb65 -3508913f -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c039a99 -34635300 -24150000 -24160000 -14550b0b -00000000 -14760b09 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0208d0 -34428d1e -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08855b -35084ff0 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c030ac5 -34635a20 -24150000 -24160000 -14550af1 -00000000 -14760aef -00000000 -24020000 -24030000 -10000008 -00000000 -3c0279b2 -34424244 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c089ae2 -35084448 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0373de -3463be17 -24150000 -24160000 -14550ad7 -00000000 -14760ad5 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02b86e -34428f40 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c086159 -3508b180 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0359a9 -34634d38 -3c15b86e -36b58f40 -3c1659a9 -36d64d38 -14550abb -00000000 -14760ab9 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02fdc4 -3442855e -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08209e -350805c0 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03286b -34638c7c -3c15fdc4 -36b5855e -3c16286b -36d68c7c -14550a9f -00000000 -14760a9d -00000000 -24020000 -24030000 -10000008 -00000000 -3c0207b0 -3442125c -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08ab3e -35081fc0 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0312b1 -3463adf8 -24150000 -24160000 -14550a85 -00000000 -14760a83 -00000000 -24020000 -24030000 -10000008 -00000000 -3c020b57 -3442a528 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c086a12 -35081cc8 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c033dfb -346388bc -3c150b57 -36b5a528 -3c163dfb -36d688bc -14550a69 -00000000 -14760a67 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02b146 -34422638 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08c14c -3508cbc4 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03c2c3 -3463d768 -24150000 -24160000 -14550a4f -00000000 -14760a4d -00000000 -24020000 -24030000 -10000008 -00000000 -3c02237e -34427128 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c085f78 -350848b2 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03d8b9 -34636790 -3c15237e -36b57128 -3c16d8b9 -36d66790 -14550a33 -00000000 -14760a31 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02605f -3442e450 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c080c5f -35083890 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0387cb -3463c48a -3c15605f -36b5e450 -3c1687cb -36d6c48a -14550a17 -00000000 -14760a15 -00000000 -24020000 -24030000 -10000008 -00000000 -3c028878 -3442ecf1 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c082a7b -3508ae80 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c031f40 -3463734c -3c158878 -36b5ecf1 -3c161f40 -36d6734c -145509fb -00000000 -147609f9 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02c9d6 -344240ba -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08799d -3508f247 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c031a53 -34639010 -3c15c9d6 -36b540ba -3c161a53 -36d69010 -145509df -00000000 -147609dd -00000000 -24020000 -24030000 -10000008 -00000000 -3c022e48 -3442d4b0 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c082df6 -350861dc -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03ff05 -34637d44 -3c152e48 -36b5d4b0 -3c16ff05 -36d67d44 -145509c3 -00000000 -147609c1 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0287d7 -344295c0 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08914a -3508b9d4 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c035b18 -3463b8f6 -24150000 -24160000 -145509a9 -00000000 -147609a7 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0271ba -344203fc -1d00000b -00000000 -1000000b -00000000 -00000000 -3c085654 -3508cff2 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c037869 -34639699 -3c1571ba -36b503fc -3c167869 -36d69699 -1455098d -00000000 -1476098b -00000000 -24020000 -24030000 -10000008 -00000000 -3c02dcd9 -34421100 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c0884b4 -35081c9c -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c035181 -34636f11 -24150000 -24160000 -14550973 -00000000 -14760971 -00000000 -24020000 -24030000 -10000008 -00000000 -3c027cb0 -34424970 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08d231 -3508ae34 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c033af3 -3463d86c -24150000 -24160000 -14550959 -00000000 -14760957 -00000000 -24020000 -24030000 -10000008 -00000000 -3c021d09 -34422948 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c085a83 -3508f8e0 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03a21d -3463b6b2 -3c151d09 -36b52948 -3c16a21d -36d6b6b2 -1455093d -00000000 -1476093b -00000000 -24020000 -24030000 -10000008 -00000000 -3c02e041 -344247a0 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08054c -3508f3a8 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0320dd -3463dda4 -3c15e041 -36b547a0 -3c1620dd -36d6dda4 -14550921 -00000000 -1476091f -00000000 -24020000 -24030000 -10000008 -00000000 -3c02acc0 -3442b5c0 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08041f -35083e20 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c033b68 -34634b32 -3c15acc0 -36b5b5c0 -3c163b68 -36d64b32 -14550905 -00000000 -14760903 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02989b -34425a0e -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08fea3 -35087fac -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03f5c4 -346367c0 -24150000 -24160000 -145508eb -00000000 -147608e9 -00000000 -24020000 -24030000 -10000008 -00000000 -3c024a1e -344290dd -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08f925 -3508c490 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03f74c -34635221 -24150000 -24160000 -145508d1 -00000000 -147608cf -00000000 -24020000 -24030000 -10000008 -00000000 -3c020dcb -3442f674 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08c9bb -35084e70 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03d081 -34635e7c -24150000 -24160000 -145508b7 -00000000 -147608b5 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02370a -34421bc8 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08dfbe -3508eef0 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03b7ba -346375b6 -24150000 -24160000 -1455089d -00000000 -1476089b -00000000 -24020000 -24030000 -10000008 -00000000 -3c023a9d -34427a3e -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08425d -3508f030 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0338eb -3463cae0 -3c153a9d -36b57a3e -3c1638eb -36d6cae0 -14550881 -00000000 -1476087f -00000000 -24020000 -24030000 -10000008 -00000000 -3c0225bf -34425494 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08c10f -35085858 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c037a65 -346307a4 -24150000 -24160000 -14550867 -00000000 -14760865 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02b1d2 -3442c299 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c087029 -35082a83 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03b42f -34638e16 -3c15b1d2 -36b5c299 -3c16b42f -36d68e16 -1455084b -00000000 -14760849 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02b433 -3442e137 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08a8fd -3508ea40 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03ced0 -34630be0 -24150000 -24160000 -14550831 -00000000 -1476082f -00000000 -24020000 -24030000 -10000008 -00000000 -3c028255 -34426134 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c0803e4 -3508c675 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0355f0 -34639ef0 -3c158255 -36b56134 -3c1655f0 -36d69ef0 -14550815 -00000000 -14760813 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02bb8b -344296d0 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08f43e -3508b720 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03caac -34639dfe -24150000 -24160000 -145507fb -00000000 -147607f9 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02226b -3442a480 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c085ddd -3508da80 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03d0e3 -34633de0 -3c15226b -36b5a480 -3c16d0e3 -36d63de0 -145507df -00000000 -147607dd -00000000 -24020000 -24030000 -10000008 -00000000 -3c02dc03 -3442c5bc -1d00000b -00000000 -1000000b -00000000 -00000000 -3c081f3b -3508dfe4 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c032ef0 -3463ca10 -3c15dc03 -36b5c5bc -3c162ef0 -36d6ca10 -145507c3 -00000000 -147607c1 -00000000 -24020000 -24030000 -10000008 -00000000 -3c022f02 -34424ea2 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08d6d4 -35081815 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c032f1c -346377e2 -24150000 -24160000 -145507a9 -00000000 -147607a7 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0229a5 -344288a0 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c082f43 -3508ec00 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c033094 -34639d58 -3c1529a5 -36b588a0 -3c163094 -36d69d58 -1455078d -00000000 -1476078b -00000000 -24020000 -24030000 -10000008 -00000000 -3c02b936 -3442d8d4 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08d273 -3508451c -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03b35e -3463a090 -24150000 -24160000 -14550773 -00000000 -14760771 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02a865 -34427f46 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08f084 -35085fa9 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c036b43 -346395b8 -24150000 -24160000 -14550759 -00000000 -14760757 -00000000 -24020000 -24030000 -10000008 -00000000 -3c026519 -3442e328 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08eb3c -3508bab4 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03b37c -34632bc0 -24150000 -24160000 -1455073f -00000000 -1476073d -00000000 -24020000 -24030000 -10000008 -00000000 -3c021f9a -3442381a -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08c7db -35080e1c -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c038332 -3463b955 -24150000 -24160000 -14550725 -00000000 -14760723 -00000000 -24020000 -24030000 -10000008 -00000000 -3c024be5 -3442046a -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08221d -35080568 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c034024 -3463468c -3c154be5 -36b5046a -3c164024 -36d6468c -14550709 -00000000 -14760707 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02b24b -3442821b -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08738e -35083590 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c030370 -34639c84 -3c15b24b -36b5821b -3c160370 -36d69c84 -145506ed -00000000 -147606eb -00000000 -24020000 -24030000 -10000008 -00000000 -3c02b5c1 -34424700 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08dc19 -35089208 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03310d -34631c35 -24150000 -24160000 -145506d3 -00000000 -147606d1 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02c75c -3442b7f8 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c084a28 -350842dc -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03004b -3463cd80 -3c15c75c -36b5b7f8 -3c16004b -36d6cd80 -145506b7 -00000000 -147606b5 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02c35d -3442f970 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c085b81 -35089f5a -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03c5bb -3463d1b2 -3c15c35d -36b5f970 -3c16c5bb -36d6d1b2 -1455069b -00000000 -14760699 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02e08c -34423bec -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08dc22 -35087520 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0355d0 -34635bfc -24150000 -24160000 -14550681 -00000000 -1476067f -00000000 -24020000 -24030000 -10000008 -00000000 -3c0248c6 -34424017 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c086013 -35080516 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03c758 -34638396 -3c1548c6 -36b54017 -3c16c758 -36d68396 -14550665 -00000000 -14760663 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02affd -3442f854 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08d3c9 -3508dbcc -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0389ec -3463c30a -24150000 -24160000 -1455064b -00000000 -14760649 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02c0e0 -34425ee4 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08aebb -35084e66 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c032024 -3463bcb8 -24150000 -24160000 -14550631 -00000000 -1476062f -00000000 -24020000 -24030000 -10000008 -00000000 -3c026adc -344213a2 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c082977 -35082504 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c034491 -3463b3c8 -3c156adc -36b513a2 -3c164491 -36d6b3c8 -14550615 -00000000 -14760613 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02e5a4 -34429233 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08d1c8 -3508d5f0 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c038718 -3463b53c -24150000 -24160000 -145505fb -00000000 -147605f9 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02ceb5 -344208c0 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08b46f -3508ac90 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03fb04 -34637a66 -24150000 -24160000 -145505e1 -00000000 -147605df -00000000 -24020000 -24030000 -10000008 -00000000 -3c02d09f -3442bcee -1d00000b -00000000 -1000000b -00000000 -00000000 -3c081aa5 -350810b0 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03e862 -3463d678 -3c15d09f -36b5bcee -3c16e862 -36d6d678 -145505c5 -00000000 -147605c3 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02cae5 -3442c1fe -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08dae9 -350889e0 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0390ee -3463ae2c -24150000 -24160000 -145505ab -00000000 -147605a9 -00000000 -24020000 -24030000 -10000008 -00000000 -3c023809 -344270f9 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c085922 -3508f146 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0398a7 -34635af8 -3c153809 -36b570f9 -3c1698a7 -36d65af8 -1455058f -00000000 -1476058d -00000000 -24020000 -24030000 -10000008 -00000000 -3c026397 -3442f58c -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08cf09 -35084d06 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c032ea6 -3463d300 -24150000 -24160000 -14550575 -00000000 -14760573 -00000000 -24020000 -24030000 -10000008 -00000000 -3c026d89 -3442e5e0 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08a850 -350870c5 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03c363 -34634260 -24150000 -24160000 -1455055b -00000000 -14760559 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02cd1c -34425e1e -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08a276 -35085a20 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c038160 -34631059 -24150000 -24160000 -14550541 -00000000 -1476053f -00000000 -24020000 -24030000 -10000008 -00000000 -3c028ea1 -34425299 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08842f -3508c806 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03e75e -3463f208 -24150000 -24160000 -14550527 -00000000 -14760525 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02595f -3442cc38 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08bfca -3508b798 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03bc8f -3463e3e0 -24150000 -24160000 -1455050d -00000000 -1476050b -00000000 -24020000 -24030000 -10000008 -00000000 -3c02bd76 -34422764 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c086a24 -3508a774 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03bb3a -3463ae00 -3c15bd76 -36b52764 -3c16bb3a -36d6ae00 -145504f1 -00000000 -147604ef -00000000 -24020000 -24030000 -10000008 -00000000 -3c02792b -3442005c -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08eaf8 -35082624 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c035faf -3463efa0 -24150000 -24160000 -145504d7 -00000000 -147604d5 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02e4f0 -3442214a -1d00000b -00000000 -1000000b -00000000 -00000000 -3c083ff1 -3508e0f4 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0304e0 -3463f6a8 -3c15e4f0 -36b5214a -3c1604e0 -36d6f6a8 -145504bb -00000000 -147604b9 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0242fd -3442ba86 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c081f22 -35084d19 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03d6b2 -346379b8 -3c1542fd -36b5ba86 -3c16d6b2 -36d679b8 -1455049f -00000000 -1476049d -00000000 -24020000 -24030000 -10000008 -00000000 -3c0275ee -3442c590 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c0899d2 -3508a174 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03b94a -346360f8 -24150000 -24160000 -14550485 -00000000 -14760483 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02120e -3442cf58 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08d7cf -35080da0 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c039733 -34633f40 -24150000 -24160000 -1455046b -00000000 -14760469 -00000000 -24020000 -24030000 -10000008 -00000000 -3c025b46 -3442fe3c -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08adeb -3508a8ae -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c030b06 -346304e0 -24150000 -24160000 -14550451 -00000000 -1476044f -00000000 -24020000 -24030000 -10000008 -00000000 -3c0255b8 -344297bc -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08e699 -35084510 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03648c -346365aa -24150000 -24160000 -14550437 -00000000 -14760435 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02cacb -3442c700 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c085e60 -35084b62 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0313e5 -3463b154 -3c15cacb -36b5c700 -3c1613e5 -36d6b154 -1455041b -00000000 -14760419 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0236c8 -34423c00 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c081426 -3508e60c -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03aa6e -34631e28 -3c1536c8 -36b53c00 -3c16aa6e -36d61e28 -145503ff -00000000 -147603fd -00000000 -24020000 -24030000 -10000008 -00000000 -3c02d42f -34424088 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08e954 -35084e1c -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c038628 -3463b4ed -24150000 -24160000 -145503e5 -00000000 -147603e3 -00000000 -24020000 -24030000 -10000008 -00000000 -3c026225 -344293c8 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c089865 -3508b63c -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03de25 -34638640 -24150000 -24160000 -145503cb -00000000 -147603c9 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02cd36 -3442ba20 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c086b5b -3508ebb4 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0318d8 -3463b0d0 -3c15cd36 -36b5ba20 -3c1618d8 -36d6b0d0 -145503af -00000000 -147603ad -00000000 -24020000 -24030000 -10000008 -00000000 -3c02697e -344204c8 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08e9b1 -3508b5f0 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03883c -346394b6 -24150000 -24160000 -14550395 -00000000 -14760393 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02ca37 -34427894 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c089d48 -350823f0 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03ab5f -34639b60 -24150000 -24160000 -1455037b -00000000 -14760379 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02d01d -34426f48 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c0841ac -35083ac4 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c033980 -34635640 -3c15d01d -36b56f48 -3c163980 -36d65640 -1455035f -00000000 -1476035d -00000000 -24020000 -24030000 -10000008 -00000000 -3c02cac0 -3442e7b4 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08dbe1 -35081848 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03d163 -34632699 -24150000 -24160000 -14550345 -00000000 -14760343 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02b4be -3442be2c -1d00000b -00000000 -1000000b -00000000 -00000000 -3c083b66 -3508064e -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03288e -346391ce -3c15b4be -36b5be2c -3c16288e -36d691ce -14550329 -00000000 -14760327 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f4f4 -3442ff50 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08b8de -3508fab4 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c032067 -34630814 -24150000 -24160000 -1455030f -00000000 -1476030d -00000000 -24020000 -24030000 -10000008 -00000000 -3c02eb1d -3442b9b1 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08877d -35085628 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03e059 -3463f36e -24150000 -24160000 -145502f5 -00000000 -147602f3 -00000000 -24020000 -24030000 -10000008 -00000000 -3c024e20 -344218d5 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08fcfa -3508b3cc -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03393a -34639f64 -24150000 -24160000 -145502db -00000000 -147602d9 -00000000 -24020000 -24030000 -10000008 -00000000 -3c021b9a -34425080 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c083473 -3508c7d8 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03aefe -34630d50 -3c151b9a -36b55080 -3c16aefe -36d60d50 -145502bf -00000000 -147602bd -00000000 -24020000 -24030000 -10000008 -00000000 -3c025030 -3442cf1a -1d00000b -00000000 -1000000b -00000000 -00000000 -3c082a28 -3508b868 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03d003 -3463c6d0 -3c155030 -36b5cf1a -3c16d003 -36d6c6d0 -145502a3 -00000000 -147602a1 -00000000 -24020000 -24030000 -10000008 -00000000 -3c027ae9 -3442e85c -1d00000b -00000000 -1000000b -00000000 -00000000 -3c086a18 -35089190 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0320ca -346310cc -3c157ae9 -36b5e85c -3c1620ca -36d610cc -14550287 -00000000 -14760285 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0273b0 -3442b7a0 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08a861 -35083940 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0311d8 -34633ebe -24150000 -24160000 -1455026d -00000000 -1476026b -00000000 -24020000 -24030000 -10000008 -00000000 -3c021e38 -3442ec8b -1d00000b -00000000 -1000000b -00000000 -00000000 -3c080c29 -3508c4c4 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c035bfc -34638a00 -3c151e38 -36b5ec8b -3c165bfc -36d68a00 -14550251 -00000000 -1476024f -00000000 -24020000 -24030000 -10000008 -00000000 -3c024263 -3442ffc0 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08b752 -35080811 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c031226 -3463a178 -24150000 -24160000 -14550237 -00000000 -14760235 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0200e7 -3442c8a0 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08d479 -35089c00 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c032763 -34635fe4 -24150000 -24160000 -1455021d -00000000 -1476021b -00000000 -24020000 -24030000 -10000008 -00000000 -3c02edca -34429e57 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08bf22 -3508f13a -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c032d35 -34636d72 -24150000 -24160000 -14550203 -00000000 -14760201 -00000000 -24020000 -24030000 -10000008 -00000000 -3c021ded -34427d10 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08366c -35080280 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0374b1 -346369cc -3c151ded -36b57d10 -3c1674b1 -36d669cc -145501e7 -00000000 -147601e5 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0216e3 -3442633c -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08cbe9 -350894f0 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03a128 -3463a86d -24150000 -24160000 -145501cd -00000000 -147601cb -00000000 -24020000 -24030000 -10000008 -00000000 -3c02826d -3442e24c -1d00000b -00000000 -1000000b -00000000 -00000000 -3c081e75 -350864f8 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03eb6f -3463d1c7 -3c15826d -36b5e24c -3c16eb6f -36d6d1c7 -145501b1 -00000000 -147601af -00000000 -24020000 -24030000 -10000008 -00000000 -3c02ee9c -34424cd8 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08e1ea -35086984 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c033ba7 -3463fe98 -24150000 -24160000 -14550197 -00000000 -14760195 -00000000 -24020000 -24030000 -10000008 -00000000 -3c023554 -34421bfa -1d00000b -00000000 -1000000b -00000000 -00000000 -3c088fd0 -3508bebc -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c030f61 -3463eb89 -24150000 -24160000 -1455017d -00000000 -1476017b -00000000 -24020000 -24030000 -10000008 -00000000 -3c02e421 -3442cfd0 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c089030 -3508a652 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0351ef -3463d96c -24150000 -24160000 -14550163 -00000000 -14760161 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0241a4 -3442d038 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c080bd8 -35080d3c -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03b33c -34632678 -3c1541a4 -36b5d038 -3c16b33c -36d62678 -14550147 -00000000 -14760145 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0243a7 -3442492c -1d00000b -00000000 -1000000b -00000000 -00000000 -3c082085 -350849ab -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c031e08 -3463841a -3c1543a7 -36b5492c -3c161e08 -36d6841a -1455012b -00000000 -14760129 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02426a -34421941 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c085b2c -350808f2 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c0371ed -34633d00 -3c15426a -36b51941 -3c1671ed -36d63d00 -1455010f -00000000 -1476010d -00000000 -24020000 -24030000 -10000008 -00000000 -3c025d68 -3442c9b4 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08c045 -3508ae0c -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c038fb5 -3463d247 -24150000 -24160000 -145500f5 -00000000 -147600f3 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02c9e7 -34427750 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c082d2e -35087baf -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03d088 -34637180 -3c15c9e7 -36b57750 -3c16d088 -36d67180 -145500d9 -00000000 -147600d7 -00000000 -24020000 -24030000 -10000008 -00000000 -3c029435 -34420db0 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08c111 -35083fb8 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03e7e8 -3463549e -24150000 -24160000 -145500bf -00000000 -147600bd -00000000 -24020000 -24030000 -10000008 -00000000 -3c02e9ef -34429674 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c0862ce -3508a9a8 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03819f -34639a20 -3c15e9ef -36b59674 -3c16819f -36d69a20 -145500a3 -00000000 -147600a1 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f5cc -3442c744 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08eb57 -35086fc0 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03305f -34637fcc -24150000 -24160000 -14550089 -00000000 -14760087 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0262c9 -3442bc58 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08e7f0 -35088e8c -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03a652 -34630be5 -24150000 -24160000 -1455006f -00000000 -1476006d -00000000 -24020000 -24030000 -10000008 -00000000 -3c029937 -34429094 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c089885 -35086a7c -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c035f8f -3463a7f8 -24150000 -24160000 -14550055 -00000000 -14760053 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0248cd -34420960 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c084e67 -3508090e -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c035ece -34637ef0 -3c1548cd -36b50960 -3c165ece -36d67ef0 -14550039 -00000000 -14760037 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02a85a -34422508 -1d00000b -00000000 -1000000b -00000000 -00000000 -3c08f8aa -350844a0 -1d00fff6 -00000000 -10000004 -00000000 -00000000 -3c03c82d -3463fdb0 -24150000 -24160000 -1455001f -00000000 -1476001d -00000000 -24020000 -24030000 -10000008 -00000000 -3c0279bb -34428050 -1d00000a -00000000 -1000000a -00000000 -00000000 -24080000 -1d00fff7 -00000000 -10000004 -00000000 -00000000 -3c03a758 -34633a00 -24150000 -24160000 -14550006 -00000000 -14760004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -00000000 -26100001 -3c08800d -24120004 -ad120000 -40805800 -3c170040 -40976000 -00000000 -3c170004 -3c029325 -34422910 -3c039325 -34632910 -3c04800d -34841348 -3c050233 -34a5e52c -24879a19 -3c010001 -00240821 -ac259a18 -3c14bfc2 -269434ec -84829a19 -165700a1 -00000000 -1443009f -00000000 -40164000 -14f6009c -00000000 -24120004 -3c02854a -3442a680 -3c03854a -3463a680 -3c04800d -34842ca8 -3c052ba9 -34a50e90 -24872577 -ac852574 -3c14bfc2 -26943548 -ad080004 -ad140004 -84822577 -ad140000 -8d090004 -15340088 -00000000 -16570086 -00000000 -14430084 -00000000 -40164000 -14f60081 -00000000 -24120004 -ad120000 -24120004 -3c02541f -34426c5c -3c03541f -34636c5c -3c04800d -34841570 -3c059554 -34a5e8d4 -248785e3 -3c010001 -00240821 -ac2585e0 -3c14bfc2 -269435c4 -01000011 -0110001b -848285e3 -00004810 -1128006a -00000000 -16570068 -00000000 -14430066 -00000000 -40164000 -14f60063 -00000000 -24120004 -3c02224c -3442f16c -3c03224c -3463f16c -3c04800d -348469cc -3c058ef7 -34a55a20 -24878341 -3c010001 -00240821 -ac258340 -3c14bfc2 -2694362c -84828341 -0208001b -16570050 -00000000 -1443004e -00000000 -40164000 -14f6004b -00000000 -24120004 -3c02516f -34425fa2 -3c03516f -34635fa2 -3c04800d -34840438 -3c05cb7e -34a5f7d5 -2487db3b -3c010001 -00240821 -ac25db38 -3c14bfc2 -26943694 -01000013 -01100019 -8482db3b -00004810 -11280036 -00000000 -16570034 -00000000 -14430032 -00000000 -40164000 -14f6002f -00000000 -24120004 -3c023537 -3442cc30 -3c033537 -3463cc30 -3c04800d -34842c20 -3c055118 -34a5e811 -24871915 -ac851914 -3c14bfc2 -269436f4 -84821915 -01120019 -1657001e -00000000 -1443001c -00000000 -40164000 -14f60019 -00000000 -24120004 -3c0263c6 -3442e7af -3c0363c6 -3463e7af -3c04800d -34843d5c -3c05d802 -34a541b4 -248732e9 -ac8532e8 -3c14bfc2 -26943750 -40927000 -848232e9 -40887000 -16570007 -00000000 -14430005 -00000000 -40164000 -14f60002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -26100001 -24120000 -3c020000 -3c030000 -10000008 -00000000 -3c02235f -3442de00 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08bcaa -3508bd27 -3c0982a7 -35297a9d -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03dd59 -34637dde -3c15235f -36b5de00 -3c16dd59 -36d67dde -1455114c -00000000 -1476114a -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c029466 -34428000 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08db38 -35086042 -3c094f6d -3529035f -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03e393 -34639568 -3c159466 -36b58000 -3c16e393 -36d69568 -1455112e -00000000 -1476112c -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c029d7e -34425298 -1528000d -00000000 -1000000d -00000000 -00000000 -3c084d86 -3508020c -3c09a71f -35297d80 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03ddab -34632338 -3c159d7e -36b55298 -3c16ddab -36d62338 -14551110 -00000000 -1476110e -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c028a16 -34422fc0 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08d522 -350805c8 -3c0960eb -35292f03 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03dee6 -3463c348 -3c158a16 -36b52fc0 -3c16dee6 -36d6c348 -145510f2 -00000000 -147610f0 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c026019 -34429ae4 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08e95a -350809a5 -3c0917b9 -3529e080 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c033307 -34637154 -3c156019 -36b59ae4 -3c163307 -36d67154 -145510d4 -00000000 -147610d2 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c020840 -344280f8 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08d0d5 -35086812 -3c098f52 -35297ce0 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03644d -34633e28 -3c150840 -36b580f8 -3c16644d -36d63e28 -145510b6 -00000000 -147610b4 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02ffc9 -34423be4 -1528000d -00000000 -1000000d -00000000 -00000000 -3c083ab2 -35082930 -3c09a008 -35291900 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03db7c -34636be4 -3c15ffc9 -36b53be4 -3c16db7c -36d66be4 -14551098 -00000000 -14761096 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c025343 -34420740 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08289a -35084638 -3c09301b -3529f423 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c033d72 -34634733 -3c155343 -36b50740 -3c163d72 -36d64733 -1455107a -00000000 -14761078 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02c877 -344256db -1528000d -00000000 -1000000d -00000000 -00000000 -3c08b7c9 -35087f09 -3c09ca21 -35290b70 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03704f -3463c138 -3c15c877 -36b556db -3c16704f -36d6c138 -1455105c -00000000 -1476105a -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02e76b -34429dfe -1528000d -00000000 -1000000d -00000000 -00000000 -3c0806f5 -350861f8 -3c09b7b9 -35291d7a -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03dbaf -3463a780 -3c15e76b -36b59dfe -3c16dbaf -36d6a780 -1455103e -00000000 -1476103c -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c029d91 -3442d900 -1528000d -00000000 -1000000d -00000000 -00000000 -3c086a4e -35083a0e -3c0937cf -352911c0 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c036eb1 -34634fc8 -3c159d91 -36b5d900 -3c166eb1 -36d64fc8 -14551020 -00000000 -1476101e -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02f799 -34425cb0 -1528000d -00000000 -1000000d -00000000 -00000000 -3c082e15 -35088d90 -3c09bedb -3529266f -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c0396c1 -346387b8 -3c15f799 -36b55cb0 -3c1696c1 -36d687b8 -14551002 -00000000 -14761000 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c029cd6 -34426080 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08eda0 -35083d68 -3c098b59 -352913ac -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03e283 -34631414 -3c159cd6 -36b56080 -3c16e283 -36d61414 -14550fe4 -00000000 -14760fe2 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c026b03 -3442dffe -1528000d -00000000 -1000000d -00000000 -00000000 -3c085c94 -350895a4 -3c098b3d -3529cd68 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03d22b -34638118 -3c156b03 -36b5dffe -3c16d22b -36d68118 -14550fc6 -00000000 -14760fc4 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02b95f -34429100 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08ba0e -3508a6fe -3c09861b -352965a8 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c036522 -346386ba -3c15b95f -36b59100 -3c166522 -36d686ba -14550fa8 -00000000 -14760fa6 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c023437 -34423160 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08cd8e -3508e226 -3c096e69 -35292b22 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c0337d5 -34636f90 -3c153437 -36b53160 -3c1637d5 -36d66f90 -14550f8a -00000000 -14760f88 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c028266 -3442f858 -1528000d -00000000 -1000000d -00000000 -00000000 -3c083b52 -350821a0 -3c09eced -3529d8e8 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03117a -34632724 -3c158266 -36b5f858 -3c16117a -36d62724 -14550f6c -00000000 -14760f6a -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02bbc6 -3442c61c -1528000d -00000000 -1000000d -00000000 -00000000 -3c080d47 -35089ce0 -3c092a73 -35292152 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c035916 -34634300 -3c15bbc6 -36b5c61c -3c165916 -36d64300 -14550f4e -00000000 -14760f4c -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c028048 -34422a04 -1528000d -00000000 -1000000d -00000000 -00000000 -3c083e36 -3508c5d0 -3c092885 -3529b024 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c032af1 -3463aba0 -3c158048 -36b52a04 -3c162af1 -36d6aba0 -14550f30 -00000000 -14760f2e -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02c559 -3442f440 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08fadc -35081000 -3c09b582 -35290d38 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03473a -3463e964 -3c15c559 -36b5f440 -3c16473a -36d6e964 -14550f12 -00000000 -14760f10 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02a852 -3442715d -1528000d -00000000 -1000000d -00000000 -00000000 -3c08ca71 -350898ec -3c0972d8 -352990f4 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03fb48 -34634c16 -3c15a852 -36b5715d -3c16fb48 -36d64c16 -14550ef4 -00000000 -14760ef2 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c022367 -34427418 -1528000d -00000000 -1000000d -00000000 -00000000 -3c084a1a -35082d02 -3c09bfc9 -352959c2 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c0314a4 -34631e50 -3c152367 -36b57418 -3c1614a4 -36d61e50 -14550ed6 -00000000 -14760ed4 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c028e9b -3442a77c -1528000d -00000000 -1000000d -00000000 -00000000 -3c0844c7 -3508ec00 -3c0981ed -3529ef8c -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03fb95 -346302d0 -3c158e9b -36b5a77c -3c16fb95 -36d602d0 -14550eb8 -00000000 -14760eb6 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0297e3 -34426390 -1528000d -00000000 -1000000d -00000000 -00000000 -3c0896cf -35080050 -3c0948a2 -35296648 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c035ea5 -346357fc -3c1597e3 -36b56390 -3c165ea5 -36d657fc -14550e9a -00000000 -14760e98 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c027262 -344295bd -1528000d -00000000 -1000000d -00000000 -00000000 -3c0841d5 -35080de8 -3c09095b -3529ab30 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c030cb5 -34635a66 -3c157262 -36b595bd -3c160cb5 -36d65a66 -14550e7c -00000000 -14760e7a -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02e0c0 -34426b84 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08b32e -3508f190 -3c09820a -3529f638 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c0329d1 -34630a00 -3c15e0c0 -36b56b84 -3c1629d1 -36d60a00 -14550e5e -00000000 -14760e5c -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02e7e1 -34423f77 -1528000d -00000000 -1000000d -00000000 -00000000 -3c088c21 -3508bb84 -3c092be7 -3529749e -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c030d4a -34639678 -3c15e7e1 -36b53f77 -3c160d4a -36d69678 -14550e40 -00000000 -14760e3e -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c023581 -34423018 -1528000d -00000000 -1000000d -00000000 -00000000 -3c084661 -35089e38 -3c0916bd -352940cc -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03fff2 -3463e1bf -3c153581 -36b53018 -3c16fff2 -36d6e1bf -14550e22 -00000000 -14760e20 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c022bc7 -3442f410 -1528000d -00000000 -1000000d -00000000 -00000000 -3c082295 -35081764 -3c09404d -3529cb49 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c0383b0 -3463fbff -3c152bc7 -36b5f410 -3c1683b0 -36d6fbff -14550e04 -00000000 -14760e02 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02c8e3 -34421dd8 -1528000d -00000000 -1000000d -00000000 -00000000 -3c0846d8 -3508b720 -3c093432 -3529fb00 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03e871 -3463ca88 -3c15c8e3 -36b51dd8 -3c16e871 -36d6ca88 -14550de6 -00000000 -14760de4 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c021982 -34429600 -1528000d -00000000 -1000000d -00000000 -00000000 -3c084174 -35085330 -3c092fed -3529f25d -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c038624 -34636bde -3c151982 -36b59600 -3c168624 -36d66bde -14550dc8 -00000000 -14760dc6 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02c96f -3442916c -1528000d -00000000 -1000000d -00000000 -00000000 -3c082640 -3508e748 -3c0948f3 -35299d40 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03bc42 -3463e558 -3c15c96f -36b5916c -3c16bc42 -36d6e558 -14550daa -00000000 -14760da8 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c025bb9 -3442ca00 -1528000d -00000000 -1000000d -00000000 -00000000 -3c0838d0 -3508acf0 -3c09e5fc -35294c68 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c033170 -3463b92d -3c155bb9 -36b5ca00 -3c163170 -36d6b92d -14550d8c -00000000 -14760d8a -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02c110 -3442edc0 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08e06e -35085adc -3c093dae -3529d318 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c0302dc -34631040 -3c15c110 -36b5edc0 -3c1602dc -36d61040 -14550d6e -00000000 -14760d6c -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02f7e6 -34421590 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08fa52 -350883e2 -3c09f3ed -352999b4 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03b912 -346311e0 -3c15f7e6 -36b51590 -3c16b912 -36d611e0 -14550d50 -00000000 -14760d4e -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02a2a5 -344298f8 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08ec2f -350861d2 -3c09988b -35299bee -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03d039 -3463a9d8 -3c15a2a5 -36b598f8 -3c16d039 -36d6a9d8 -14550d32 -00000000 -14760d30 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c023e0a -3442d5a0 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08cfe8 -3508786c -3c099b7a -35295560 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03b487 -34638950 -3c153e0a -36b5d5a0 -3c16b487 -36d68950 -14550d14 -00000000 -14760d12 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02fc93 -3442fbc0 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08bb97 -35087f6a -3c098c30 -3529c880 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03ef74 -3463eeca -3c15fc93 -36b5fbc0 -3c16ef74 -36d6eeca -14550cf6 -00000000 -14760cf4 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c024cf6 -3442e712 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08137e -3508b568 -3c099c8a -35292100 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c039480 -34630248 -3c154cf6 -36b5e712 -3c169480 -36d60248 -14550cd8 -00000000 -14760cd6 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c028af1 -344281c0 -1528000d -00000000 -1000000d -00000000 -00000000 -3c089080 -3508e118 -3c09cb05 -3529fbe7 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c031617 -34634159 -3c158af1 -36b581c0 -3c161617 -36d64159 -14550cba -00000000 -14760cb8 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c024754 -3442eb14 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08fe37 -3508e93a -3c097c98 -3529d980 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c0364db -3463baac -3c154754 -36b5eb14 -3c1664db -36d6baac -14550c9c -00000000 -14760c9a -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c020df0 -344276d2 -1528000d -00000000 -1000000d -00000000 -00000000 -3c080677 -3508bcb9 -3c09a761 -3529310e -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03f4e7 -34637328 -3c150df0 -36b576d2 -3c16f4e7 -36d67328 -14550c7e -00000000 -14760c7c -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0282b7 -3442c5a8 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08b740 -3508b108 -3c098e0d -35294d28 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03e9d4 -3463db30 -3c1582b7 -36b5c5a8 -3c16e9d4 -36d6db30 -14550c60 -00000000 -14760c5e -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0285d5 -34420384 -1528000d -00000000 -1000000d -00000000 -00000000 -3c0837fb -3508d760 -3c0923ba -3529d9d8 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03d56a -34630350 -3c1585d5 -36b50384 -3c16d56a -36d60350 -14550c42 -00000000 -14760c40 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0284ee -3442bcfc -1528000d -00000000 -1000000d -00000000 -00000000 -3c0812ce -35084958 -3c091078 -35296eb4 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03dccd -34638a48 -3c1584ee -36b5bcfc -3c16dccd -36d68a48 -14550c24 -00000000 -14760c22 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02ab31 -34429e80 -1528000d -00000000 -1000000d -00000000 -00000000 -3c080b65 -35084a30 -3c09f345 -35291ce0 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03f742 -3463b258 -3c15ab31 -36b59e80 -3c16f742 -36d6b258 -14550c06 -00000000 -14760c04 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c020313 -344217b8 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08d04f -3508fdc0 -3c097503 -3529f772 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c033d61 -3463f6b8 -3c150313 -36b517b8 -3c163d61 -36d6f6b8 -14550be8 -00000000 -14760be6 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0242d4 -34423bf0 -1528000d -00000000 -1000000d -00000000 -00000000 -3c087f1c -3508510a -3c09836d -3529c39a -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03fe45 -346334f0 -3c1542d4 -36b53bf0 -3c16fe45 -36d634f0 -14550bca -00000000 -14760bc8 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c026d73 -344234d0 -1528000d -00000000 -1000000d -00000000 -00000000 -3c080cd5 -35086940 -3c091815 -35295a16 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03aec2 -34634144 -3c156d73 -36b534d0 -3c16aec2 -36d64144 -14550bac -00000000 -14760baa -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c027372 -34426a64 -1528000d -00000000 -1000000d -00000000 -00000000 -3c084b8c -350859f8 -3c092e53 -35299b1c -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03890c -34638224 -3c157372 -36b56a64 -3c16890c -36d68224 -14550b8e -00000000 -14760b8c -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0214b0 -34421cc5 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08fa6a -35085040 -3c0991e5 -35299182 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03a920 -34633830 -3c1514b0 -36b51cc5 -3c16a920 -36d63830 -14550b70 -00000000 -14760b6e -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02e6a9 -344200fe -1528000d -00000000 -1000000d -00000000 -00000000 -3c08a82c -35085100 -3c0992a8 -35297240 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c036c59 -3463ba20 -3c15e6a9 -36b500fe -3c166c59 -36d6ba20 -14550b52 -00000000 -14760b50 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02dd23 -3442e526 -1528000d -00000000 -1000000d -00000000 -00000000 -3c080b0c -350881e4 -3c09ab18 -35294898 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c0391c2 -34636bd0 -3c15dd23 -36b5e526 -3c1691c2 -36d66bd0 -14550b34 -00000000 -14760b32 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02dac7 -34422590 -1528000d -00000000 -1000000d -00000000 -00000000 -3c0897d5 -35081023 -3c092023 -35297fe8 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03a2c6 -3463a1a4 -3c15dac7 -36b52590 -3c16a2c6 -36d6a1a4 -14550b16 -00000000 -14760b14 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c028e49 -34429699 -1528000d -00000000 -1000000d -00000000 -00000000 -3c0896db -350890b0 -3c091d1d -3529f7e0 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03e236 -3463e148 -3c158e49 -36b59699 -3c16e236 -36d6e148 -14550af8 -00000000 -14760af6 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02887f -34420b60 -1528000d -00000000 -1000000d -00000000 -00000000 -3c085a54 -3508c45a -3c099ba2 -3529015c -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03f6fd -34634de8 -3c15887f -36b50b60 -3c16f6fd -36d64de8 -14550ada -00000000 -14760ad8 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02e353 -34420574 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08264d -3508e37a -3c099fa3 -352989ab -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c036556 -3463a3c0 -3c15e353 -36b50574 -3c166556 -36d6a3c0 -14550abc -00000000 -14760aba -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c029509 -34422f84 -1528000d -00000000 -1000000d -00000000 -00000000 -3c0854b4 -35085b56 -3c09f8a4 -3529a4c0 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03ccc1 -3463cfd0 -3c159509 -36b52f84 -3c16ccc1 -36d6cfd0 -14550a9e -00000000 -14760a9c -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0210d5 -3442f260 -1528000d -00000000 -1000000d -00000000 -00000000 -3c0870e6 -3508db20 -3c09df40 -35294a88 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03298e -3463cdf0 -3c1510d5 -36b5f260 -3c16298e -36d6cdf0 -14550a80 -00000000 -14760a7e -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02f5dc -34426940 -1528000d -00000000 -1000000d -00000000 -00000000 -3c082e27 -35089cac -3c094978 -3529e47a -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03be6b -3463fb60 -3c15f5dc -36b56940 -3c16be6b -36d6fb60 -14550a62 -00000000 -14760a60 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02eb11 -3442ab90 -1528000d -00000000 -1000000d -00000000 -00000000 -3c0889fd -35086e58 -3c09f88d -3529daf9 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03eba0 -34635310 -3c15eb11 -36b5ab90 -3c16eba0 -36d65310 -14550a44 -00000000 -14760a42 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0241ae -34423dc0 -1528000d -00000000 -1000000d -00000000 -00000000 -3c085ea7 -35084080 -3c09ef2b -35296a40 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c034fe5 -34639830 -3c1541ae -36b53dc0 -3c164fe5 -36d69830 -14550a26 -00000000 -14760a24 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c026909 -34420b48 -1528000d -00000000 -1000000d -00000000 -00000000 -3c0886d8 -35087cd1 -3c09aed3 -3529caec -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03d8ad -3463e460 -3c156909 -36b50b48 -3c16d8ad -36d6e460 -14550a08 -00000000 -14760a06 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c021f19 -3442c3e0 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08be0e -35086070 -3c09d0d2 -35292e80 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c0322b4 -34630ba8 -3c151f19 -36b5c3e0 -3c1622b4 -36d60ba8 -145509ea -00000000 -147609e8 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c029a22 -34420ced -1528000d -00000000 -1000000d -00000000 -00000000 -3c08f97a -350802c8 -3c094c95 -35293240 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c039dd4 -346357af -3c159a22 -36b50ced -3c169dd4 -36d657af -145509cc -00000000 -147609ca -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02d674 -3442daa0 -1528000d -00000000 -1000000d -00000000 -00000000 -3c084022 -3508e4dc -3c0917b7 -3529eec0 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03d4a0 -3463eda9 -3c15d674 -36b5daa0 -3c16d4a0 -36d6eda9 -145509ae -00000000 -147609ac -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02846d -34428928 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08dbd8 -3508b1e0 -3c09dbd8 -3529b1e0 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03a920 -3463a654 -24150000 -24160000 -14550992 -00000000 -14760990 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02be9e -34422d88 -1528000d -00000000 -1000000d -00000000 -00000000 -3c0855d0 -3508c9a0 -3c0955d0 -3529c9a0 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c0346cf -34633c58 -24150000 -24160000 -14550976 -00000000 -14760974 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c021d26 -34427b08 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08c1f1 -3508857c -3c09c1f1 -3529857c -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c036302 -34638f40 -24150000 -24160000 -1455095a -00000000 -14760958 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02cc8e -34420db8 -1528000d -00000000 -1000000d -00000000 -00000000 -3c083ea0 -35086ca0 -3c093ea0 -35296ca0 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03e45d -346315fe -24150000 -24160000 -1455093e -00000000 -1476093c -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0213a1 -34426f06 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08d020 -35081a70 -3c09d020 -35291a70 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03e367 -3463bc2c -24150000 -24160000 -14550922 -00000000 -14760920 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02b6b2 -34422fbb -1528000d -00000000 -1000000d -00000000 -00000000 -3c08cd66 -3508d7d9 -3c09cd66 -3529d7d9 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c033744 -34636a48 -24150000 -24160000 -14550906 -00000000 -14760904 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02bcc8 -34426ba8 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08e4e9 -3508b0ec -3c09e4e9 -3529b0ec -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03596a -3463bb80 -24150000 -24160000 -145508ea -00000000 -147608e8 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02aa4a -3442ee40 -1528000d -00000000 -1000000d -00000000 -00000000 -3c082478 -350815c0 -3c092478 -352915c0 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03a1fe -3463c8b8 -24150000 -24160000 -145508ce -00000000 -147608cc -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c028b0d -34424ef8 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08d7f4 -3508fae0 -3c09d7f4 -3529fae0 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c0358cd -346380d8 -24150000 -24160000 -145508b2 -00000000 -147608b0 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c022f4e -34429f7e -1528000d -00000000 -1000000d -00000000 -00000000 -3c08aef5 -3508cb00 -3c09aef5 -3529cb00 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c037bd9 -3463b7e6 -24150000 -24160000 -14550896 -00000000 -14760894 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02bbf7 -34425228 -1528000d -00000000 -1000000d -00000000 -00000000 -3c081c9e -350845ab -3c091c9e -352945ab -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c037d68 -3463d3c7 -24150000 -24160000 -1455087a -00000000 -14760878 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0235f4 -344289d4 -1528000d -00000000 -1000000d -00000000 -00000000 -3c084646 -3508bd73 -3c094646 -3529bd73 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c034622 -34633883 -24150000 -24160000 -1455085e -00000000 -1476085c -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02ca85 -3442b4c0 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08b501 -35087ebb -3c09b501 -35297ebb -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c030e04 -34630ee8 -24150000 -24160000 -14550842 -00000000 -14760840 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c024e29 -3442b20c -1528000d -00000000 -1000000d -00000000 -00000000 -3c08e297 -3508d40f -3c09e297 -3529d40f -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c038015 -34634d9c -24150000 -24160000 -14550826 -00000000 -14760824 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0249a2 -34425280 -1528000d -00000000 -1000000d -00000000 -00000000 -3c088b78 -3508f900 -3c098b78 -3529f900 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03c812 -3463b400 -24150000 -24160000 -1455080a -00000000 -14760808 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02db29 -3442cfb0 -1528000d -00000000 -1000000d -00000000 -00000000 -3c0831aa -35082e48 -3c0931aa -35292e48 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c0315f2 -3463c27c -24150000 -24160000 -145507ee -00000000 -147607ec -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0253f8 -34422f94 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08552c -3508a6aa -3c09552c -3529a6aa -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c034c94 -34632030 -24150000 -24160000 -145507d2 -00000000 -147607d0 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c026cef -34428800 -1528000d -00000000 -1000000d -00000000 -00000000 -3c088095 -3508cf14 -3c098095 -3529cf14 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03d717 -3463c5ec -24150000 -24160000 -145507b6 -00000000 -147607b4 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0201bc -344239dc -1528000d -00000000 -1000000d -00000000 -00000000 -3c08a7e1 -3508bbb2 -3c09a7e1 -3529bbb2 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03839a -34639e28 -24150000 -24160000 -1455079a -00000000 -14760798 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02d74b -3442ed4a -1528000d -00000000 -1000000d -00000000 -00000000 -3c088d4c -35087b7a -3c098d4c -35297b7a -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c031ead -3463de00 -24150000 -24160000 -1455077e -00000000 -1476077c -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02578e -344241e6 -1528000d -00000000 -1000000d -00000000 -00000000 -3c087791 -35089958 -3c097791 -35299958 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c031f53 -3463bc86 -24150000 -24160000 -14550762 -00000000 -14760760 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c023b4c -3442a5f8 -1528000d -00000000 -1000000d -00000000 -00000000 -3c085c97 -35089db6 -3c095c97 -35299db6 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03f4e5 -3463cea0 -24150000 -24160000 -14550746 -00000000 -14760744 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c024cf3 -344242c0 -1528000d -00000000 -1000000d -00000000 -00000000 -3c083ca2 -35084c26 -3c093ca2 -35294c26 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03108d -34631140 -24150000 -24160000 -1455072a -00000000 -14760728 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c028e87 -34427120 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08f752 -35086ede -3c09f752 -35296ede -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03a8d9 -346395c0 -24150000 -24160000 -1455070e -00000000 -1476070c -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c027cc2 -344209cc -1528000d -00000000 -1000000d -00000000 -00000000 -3c08c2d7 -3508c380 -3c09c2d7 -3529c380 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c035b33 -3463af05 -24150000 -24160000 -145506f2 -00000000 -147606f0 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c022f31 -3442fb40 -1528000d -00000000 -1000000d -00000000 -00000000 -3c084f88 -35088d40 -3c094f88 -35298d40 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03a23c -3463ad23 -24150000 -24160000 -145506d6 -00000000 -147606d4 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02075c -34425a20 -1528000d -00000000 -1000000d -00000000 -00000000 -3c087aff -35083880 -3c097aff -35293880 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c037dfe -34632100 -24150000 -24160000 -145506ba -00000000 -147606b8 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c027942 -34428800 -1528000d -00000000 -1000000d -00000000 -00000000 -3c081cca -3508de40 -3c091cca -3529de40 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c0395ac -34639da4 -24150000 -24160000 -1455069e -00000000 -1476069c -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c022acf -34428dc0 -1528000d -00000000 -1000000d -00000000 -00000000 -3c081ae1 -35089e48 -3c091ae1 -35299e48 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03a2dd -3463393b -24150000 -24160000 -14550682 -00000000 -14760680 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02d0f5 -3442f880 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08b011 -3508c65a -3c09b011 -3529c65a -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03d28d -34632030 -24150000 -24160000 -14550666 -00000000 -14760664 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c022908 -344216b0 -1528000d -00000000 -1000000d -00000000 -00000000 -3c089d82 -35081b80 -3c099d82 -35291b80 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c030f95 -34638490 -24150000 -24160000 -1455064a -00000000 -14760648 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0248d4 -34424a40 -1528000d -00000000 -1000000d -00000000 -00000000 -3c0856a2 -3508a476 -3c0956a2 -3529a476 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c0347bc -3463856c -24150000 -24160000 -1455062e -00000000 -1476062c -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c023a3b -34424ca0 -1528000d -00000000 -1000000d -00000000 -00000000 -3c0860d4 -3508c3f8 -3c0960d4 -3529c3f8 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03078c -34634c63 -24150000 -24160000 -14550612 -00000000 -14760610 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02e7f1 -34426407 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08cea5 -35087950 -3c09cea5 -35297950 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c039394 -34631160 -24150000 -24160000 -145505f6 -00000000 -147605f4 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02fb77 -34421004 -1528000d -00000000 -1000000d -00000000 -00000000 -3c084bea -35087c0c -3c094bea -35297c0c -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c035141 -34635156 -24150000 -24160000 -145505da -00000000 -147605d8 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02d27c -34421000 -1528000d -00000000 -1000000d -00000000 -00000000 -3c088d01 -35086c01 -3c098d01 -35296c01 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03eb29 -346372e0 -24150000 -24160000 -145505be -00000000 -147605bc -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02892b -34427a57 -1528000d -00000000 -1000000d -00000000 -00000000 -3c0861b9 -350870a6 -3c0961b9 -352970a6 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c037a38 -3463c5a0 -24150000 -24160000 -145505a2 -00000000 -147605a0 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c022f76 -34429205 -1528000d -00000000 -1000000d -00000000 -00000000 -3c083519 -35083060 -3c093519 -35293060 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03bc57 -3463b538 -24150000 -24160000 -14550586 -00000000 -14760584 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02c1fe -3442d10a -1528000d -00000000 -1000000d -00000000 -00000000 -3c084f47 -350842b2 -3c094f47 -352942b2 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03a6df -34637480 -24150000 -24160000 -1455056a -00000000 -14760568 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02a349 -3442c9d0 -1528000d -00000000 -1000000d -00000000 -00000000 -3c0834ff -35086015 -3c0934ff -35296015 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03ee92 -3463b690 -24150000 -24160000 -1455054e -00000000 -1476054c -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c022362 -34426e88 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08e30d -3508c982 -3c09e30d -3529c982 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03bc5d -34638560 -24150000 -24160000 -14550532 -00000000 -14760530 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c028c06 -3442e6e0 -1528000d -00000000 -1000000d -00000000 -00000000 -3c0802c3 -3508561e -3c0902c3 -3529561e -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c032b87 -34632fc0 -24150000 -24160000 -14550516 -00000000 -14760514 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02fecd -3442af9e -1528000d -00000000 -1000000d -00000000 -00000000 -3c08ed55 -350810e4 -3c09ed55 -352910e4 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03b8cf -3463fea3 -24150000 -24160000 -145504fa -00000000 -147604f8 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0291ad -3442998b -1528000d -00000000 -1000000d -00000000 -00000000 -3c0866b9 -3508f9a3 -3c0966b9 -3529f9a3 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c037325 -34637eb8 -24150000 -24160000 -145504de -00000000 -147604dc -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c020cf1 -3442b018 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08228a -35081f40 -3c09228a -35291f40 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c030cf0 -346325a4 -24150000 -24160000 -145504c2 -00000000 -147604c0 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02fe38 -3442ac95 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08bc2c -3508c696 -3c09bc2c -3529c696 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03507d -34632ca0 -24150000 -24160000 -145504a6 -00000000 -147604a4 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0289bd -34421878 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08e04d -3508f6d0 -3c09e04d -3529f6d0 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c03039f -3463d030 -24150000 -24160000 -1455048a -00000000 -14760488 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02b124 -34429e00 -1528000d -00000000 -1000000d -00000000 -00000000 -3c08a642 -3508eba0 -3c09a642 -3529eba0 -1509fff4 -00000000 -10000004 -00000000 -00000000 -3c039eaa -346376f4 -24150000 -24160000 -1455046e -00000000 -1476046c -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c028de2 -3442a8f8 -1528000c -00000000 -1000000c -00000000 -00000000 -3c089169 -3508d4e6 -24090000 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c034666 -3463ff30 -3c158de2 -36b5a8f8 -3c164666 -36d6ff30 -14550451 -00000000 -1476044f -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02f914 -3442e5f0 -1528000c -00000000 -1000000c -00000000 -00000000 -3c088c72 -35087392 -24090000 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c03bfc0 -34632728 -3c15f914 -36b5e5f0 -3c16bfc0 -36d62728 -14550434 -00000000 -14760432 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02f0b7 -3442fb80 -1528000c -00000000 -1000000c -00000000 -00000000 -3c08b4e2 -3508d6c0 -24090000 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c0334d4 -346339e0 -3c15f0b7 -36b5fb80 -3c1634d4 -36d639e0 -14550417 -00000000 -14760415 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c023aa0 -34422880 -1528000c -00000000 -1000000c -00000000 -00000000 -3c08c0d9 -35082060 -24090000 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c039516 -34631fc6 -3c153aa0 -36b52880 -3c169516 -36d61fc6 -145503fa -00000000 -147603f8 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02f7f4 -344249fb -1528000c -00000000 -1000000c -00000000 -00000000 -3c08e583 -35084417 -24090000 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c03bd54 -3463fd00 -3c15f7f4 -36b549fb -3c16bd54 -36d6fd00 -145503dd -00000000 -147603db -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c027dbc -34428068 -1528000c -00000000 -1000000c -00000000 -00000000 -3c08d557 -3508e6e4 -24090000 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c034efa -3463da60 -3c157dbc -36b58068 -3c164efa -36d6da60 -145503c0 -00000000 -147603be -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02ac9f -3442a100 -1528000c -00000000 -1000000c -00000000 -00000000 -3c08b437 -3508f388 -24090000 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c031901 -346387e8 -3c15ac9f -36b5a100 -3c161901 -36d687e8 -145503a3 -00000000 -147603a1 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02e0cb -3442cfc0 -1528000c -00000000 -1000000c -00000000 -00000000 -3c08e822 -3508ca21 -24090000 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c039635 -346382be -3c15e0cb -36b5cfc0 -3c169635 -36d682be -14550386 -00000000 -14760384 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0232a9 -34426121 -1528000c -00000000 -1000000c -00000000 -00000000 -3c083374 -3508510c -24090000 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c03780c -3463fcb0 -3c1532a9 -36b56121 -3c16780c -36d6fcb0 -14550369 -00000000 -14760367 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02ff9f -3442d4d2 -1528000c -00000000 -1000000c -00000000 -00000000 -3c08a10f -350823f0 -24090000 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c0336f3 -3463e0ee -3c15ff9f -36b5d4d2 -3c1636f3 -36d6e0ee -1455034c -00000000 -1476034a -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02429f -34428e70 -1528000c -00000000 -1000000c -00000000 -00000000 -3c08df18 -3508c280 -24090000 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c036cf8 -3463f7a0 -3c15429f -36b58e70 -3c166cf8 -36d6f7a0 -1455032f -00000000 -1476032d -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02bce5 -34421b0b -1528000c -00000000 -1000000c -00000000 -00000000 -3c08ea92 -3508c588 -24090000 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c038fcb -34632950 -3c15bce5 -36b51b0b -3c168fcb -36d62950 -14550312 -00000000 -14760310 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0212e5 -3442b630 -1528000c -00000000 -1000000c -00000000 -00000000 -3c086348 -35088fb8 -24090000 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c0330e6 -34637b92 -3c1512e5 -36b5b630 -3c1630e6 -36d67b92 -145502f5 -00000000 -147602f3 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0256e0 -3442aa24 -1528000c -00000000 -1000000c -00000000 -00000000 -3c08f555 -35084068 -24090000 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c03cb85 -34630982 -3c1556e0 -36b5aa24 -3c16cb85 -36d60982 -145502d8 -00000000 -147602d6 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0252bc -3442cf3c -1528000c -00000000 -1000000c -00000000 -00000000 -3c08a72f -35087240 -24090000 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c03e51f -346383fc -3c1552bc -36b5cf3c -3c16e51f -36d683fc -145502bb -00000000 -147602b9 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02cdbf -34425374 -1528000c -00000000 -1000000c -00000000 -00000000 -3c08f952 -35085442 -24090000 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c031a14 -34636330 -3c15cdbf -36b55374 -3c161a14 -36d66330 -1455029e -00000000 -1476029c -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02ec47 -34420e0a -1528000c -00000000 -1000000c -00000000 -00000000 -3c082aee -350870cc -24090000 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c031533 -34639bc0 -3c15ec47 -36b50e0a -3c161533 -36d69bc0 -14550281 -00000000 -1476027f -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c025f44 -3442aca5 -1528000c -00000000 -1000000c -00000000 -00000000 -3c08e7cf -350823cd -24090000 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c03935c -3463d3f4 -3c155f44 -36b5aca5 -3c16935c -36d6d3f4 -14550264 -00000000 -14760262 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c022851 -3442d82c -1528000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c094235 -35295cf4 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c0353c3 -3463a1e0 -3c152851 -36b5d82c -3c1653c3 -36d6a1e0 -14550247 -00000000 -14760245 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c022a5b -34421ca0 -1528000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c09ab66 -352936d5 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c030c79 -34638620 -3c152a5b -36b51ca0 -3c160c79 -36d68620 -1455022a -00000000 -14760228 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02fd63 -3442b29c -1528000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c092526 -3529c610 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c03d3a2 -34632562 -3c15fd63 -36b5b29c -3c16d3a2 -36d62562 -1455020d -00000000 -1476020b -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02c689 -34429028 -1528000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c09f64a -35291200 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c03edce -34633230 -3c15c689 -36b59028 -3c16edce -36d63230 -145501f0 -00000000 -147601ee -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02549a -3442b500 -1528000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c09d84b -35295b98 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c0316da -3463a7f0 -3c15549a -36b5b500 -3c1616da -36d6a7f0 -145501d3 -00000000 -147601d1 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02154a -34420340 -1528000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c09aaeb -3529992c -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c03339b -346344d6 -3c15154a -36b50340 -3c16339b -36d644d6 -145501b6 -00000000 -147601b4 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02740b -34423cb4 -1528000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c09a352 -35293878 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c03d634 -34632340 -3c15740b -36b53cb4 -3c16d634 -36d62340 -14550199 -00000000 -14760197 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02638e -344201f7 -1528000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c09f701 -35295a40 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c0330b6 -3463c750 -3c15638e -36b501f7 -3c1630b6 -36d6c750 -1455017c -00000000 -1476017a -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c020e54 -34423812 -1528000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c090eb0 -35290ec0 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c03a87b -34634680 -3c150e54 -36b53812 -3c16a87b -36d64680 -1455015f -00000000 -1476015d -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c025623 -34427fe8 -1528000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c09f683 -35298110 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c034765 -346313e2 -3c155623 -36b57fe8 -3c164765 -36d613e2 -14550142 -00000000 -14760140 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02f451 -34420894 -1528000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c091fb5 -35294c54 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c0390a8 -34631418 -3c15f451 -36b50894 -3c1690a8 -36d61418 -14550125 -00000000 -14760123 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02a55e -34423a99 -1528000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c095ae1 -3529c10a -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c03a457 -3463dfb0 -3c15a55e -36b53a99 -3c16a457 -36d6dfb0 -14550108 -00000000 -14760106 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02445b -34428590 -1528000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c09e39c -352965e3 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c03252b -3463f044 -3c15445b -36b58590 -3c16252b -36d6f044 -145500eb -00000000 -147600e9 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c023cf2 -3442a6f6 -1528000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c0971cf -35292d6a -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c03e505 -34630db0 -3c153cf2 -36b5a6f6 -3c16e505 -36d60db0 -145500ce -00000000 -147600cc -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02db56 -3442b7a8 -1528000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c091530 -3529a956 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c0349b2 -346311f0 -3c15db56 -36b5b7a8 -3c1649b2 -36d611f0 -145500b1 -00000000 -147600af -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0238ab -3442c364 -1528000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c09e343 -352917f6 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c03a774 -3463a135 -3c1538ab -36b5c364 -3c16a774 -36d6a135 -14550094 -00000000 -14760092 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02b27b -3442d70c -1528000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c0915c9 -35291782 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c03b672 -3463ede0 -3c15b27b -36b5d70c -3c16b672 -36d6ede0 -14550077 -00000000 -14760075 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02ace0 -34426e98 -1528000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c09774a -3529b6a0 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c03f6c1 -34633268 -3c15ace0 -36b56e98 -3c16f6c1 -36d63268 -1455005a -00000000 -14760058 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c026ea3 -34426e38 -1528000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c095dfc -35296230 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c036d81 -3463b001 -3c156ea3 -36b56e38 -3c166d81 -36d6b001 -1455003d -00000000 -1476003b -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02931c -344223ac -1528000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c090edc -3529b298 -1509fff5 -00000000 -10000004 -00000000 -00000000 -3c03f917 -3463267c -3c15931c -36b523ac -3c16f917 -36d6267c -14550020 -00000000 -1476001e -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c021744 -3442192c -1528000b -00000000 -1000000b -00000000 -00000000 -24080000 -24090000 -1509fff6 -00000000 -10000004 -00000000 -00000000 -3c030b48 -3463f1f0 -24150000 -24160000 -14550006 -00000000 -14760004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -26100001 -3c08800d -40805800 -3c170040 -40976000 -00000000 -24120001 -3c170001 -ad120000 -3c14bfc2 -26947d7c -02400008 -0000000c -165700ad -00000000 -24120001 -3c14bfc2 -26947d98 -01000008 -0000000c -165700a6 -00000000 -24120002 -3c170002 -ad120000 -3c14bfc2 -26947dbc -02400008 -0000000d -1657009d -00000000 -24120002 -3c14bfc2 -26947dd8 -01000008 -0000000d -16570096 -00000000 -24120003 -3c170003 -ad120000 -3c14bfc2 -26947e0c -3c04ba03 -34844f60 -3c05b615 -34a5fd67 -02400008 -0085b820 -16570089 -00000000 -24120003 -3c14bfc2 -26947e28 -01000008 -0085b820 -ad170000 -16570081 -00000000 -24120003 -ad120000 -3c14bfc2 -26947e54 -3c047fff -3484c19e -02400008 -20976512 -16570077 -00000000 -24120003 -3c14bfc2 -26947e70 -01000008 -20976512 -16570070 -00000000 -24120003 -3c14bfc2 -26947e9c -3c04a85e -34847d00 -3c056b7e -34a58e36 -02400008 -0085b822 -16570065 -00000000 -24120003 -3c14bfc2 -26947eb8 -01000008 -0085b822 -1657005e -00000000 -24120004 -3c170004 -ad120000 -3c14bfc2 -26947edc -02400008 -8d170002 -16570055 -00000000 -24120004 -3c14bfc2 -26947ef8 -01000008 -8d170002 -1657004e -00000000 -24120004 -3c14bfc2 -26947f14 -02400008 -85170001 -02f2001b -16570046 -00000000 -24120004 -3c14bfc2 -26947f34 -01000008 -85170001 -1657003f -00000000 -3c14bfc2 -26947f4c -02400008 -95170003 -16570039 -00000000 -24120004 -3c14bfc2 -26947f68 -01000008 -95170003 -16570032 -00000000 -24120005 -3c170005 -ad120000 -3c14bfc2 -26947f8c -02400008 -ad170002 -16570029 -00000000 -24120005 -3c14bfc2 -26947fa8 -01000008 -ad170002 -16570022 -00000000 -24120005 -3c14bfc2 -26947fc4 -02400008 -a5170001 -1657001b -00000000 -24120005 -3c14bfc2 -26947fe0 -01000008 -a5170001 -16570014 -00000000 -24120007 -3c170007 -ad120000 -3c14bfc3 -26948004 -02400008 -9e3c56aa -02f20018 -1657000a -00000000 -24120007 -3c14bfc3 -26948028 -02f20018 -01000008 -ec1ba960 -16570002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -24120000 -3c08c10d -350876f1 -01000013 -00001012 -3c15c10d -36b576f1 -145501da -00000000 -3c086a7f -350852c1 -01000013 -00001012 -3c156a7f -36b552c1 -145501d2 -00000000 -3c08b96c -350812c0 -01000013 -00001012 -3c15b96c -36b512c0 -145501ca -00000000 -3c08922c -3508b737 -01000013 -00001012 -3c15922c -36b5b737 -145501c2 -00000000 -3c08d8f8 -350877fc -01000013 -00001012 -3c15d8f8 -36b577fc -145501ba -00000000 -3c086fdf -35081878 -01000013 -00001012 -3c156fdf -36b51878 -145501b2 -00000000 -3c08dceb -35086950 -01000013 -00001012 -3c15dceb -36b56950 -145501aa -00000000 -3c084511 -3508b208 -01000013 -00001012 -3c154511 -36b5b208 -145501a2 -00000000 -3c08f34d -3508c984 -01000013 -00001012 -3c15f34d -36b5c984 -1455019a -00000000 -3c08e215 -35082930 -01000013 -00001012 -3c15e215 -36b52930 -14550192 -00000000 -3c082ca6 -35083aa0 -01000013 -00001012 -3c152ca6 -36b53aa0 -1455018a -00000000 -3c08aa58 -3508aaf8 -01000013 -00001012 -3c15aa58 -36b5aaf8 -14550182 -00000000 -3c0859f0 -3508d4c0 -01000013 -00001012 -3c1559f0 -36b5d4c0 -1455017a -00000000 -3c081f8a -3508d31a -01000013 -00001012 -3c151f8a -36b5d31a -14550172 -00000000 -3c08cc81 -3508d4b7 -01000013 -00001012 -3c15cc81 -36b5d4b7 -1455016a -00000000 -3c08329d -3508cb30 -01000013 -00001012 -3c15329d -36b5cb30 -14550162 -00000000 -3c087ca6 -35082fd0 -01000013 -00001012 -3c157ca6 -36b52fd0 -1455015a -00000000 -3c0893fa -3508ad78 -01000013 -00001012 -3c1593fa -36b5ad78 -14550152 -00000000 -3c088271 -35083960 -01000013 -00001012 -3c158271 -36b53960 -1455014a -00000000 -3c0813be -350836f0 -01000013 -00001012 -3c1513be -36b536f0 -14550142 -00000000 -3c08578d -350890c0 -01000013 -00001012 -3c15578d -36b590c0 -1455013a -00000000 -3c085084 -3508f9c8 -01000013 -00001012 -3c155084 -36b5f9c8 -14550132 -00000000 -3c089b35 -35084320 -01000013 -00001012 -3c159b35 -36b54320 -1455012a -00000000 -3c082703 -35084740 -01000013 -00001012 -3c152703 -36b54740 -14550122 -00000000 -3c08716f -350802dc -01000013 -00001012 -3c15716f -36b502dc -1455011a -00000000 -3c081fc9 -35082e60 -01000013 -00001012 -3c151fc9 -36b52e60 -14550112 -00000000 -3c08b2fa -3508d4e0 -01000013 -00001012 -3c15b2fa -36b5d4e0 -1455010a -00000000 -3c088647 -3508273f -01000013 -00001012 -3c158647 -36b5273f -14550102 -00000000 -3c083ee2 -3508e33c -01000013 -00001012 -3c153ee2 -36b5e33c -145500fa -00000000 -3c08eae9 -35087850 -01000013 -00001012 -3c15eae9 -36b57850 -145500f2 -00000000 -3c0868f0 -35080140 -01000013 -00001012 -3c1568f0 -36b50140 -145500ea -00000000 -3c0830f5 -350885e0 -01000013 -00001012 -3c1530f5 -36b585e0 -145500e2 -00000000 -3c0864d4 -35083ee8 -01000013 -00001012 -3c1564d4 -36b53ee8 -145500da -00000000 -3c081700 -3508565c -01000013 -00001012 -3c151700 -36b5565c -145500d2 -00000000 -3c08efd2 -35080ca0 -01000013 -00001012 -3c15efd2 -36b50ca0 -145500ca -00000000 -3c08a42e -35084ca4 -01000013 -00001012 -3c15a42e -36b54ca4 -145500c2 -00000000 -3c081cc1 -35086ab8 -01000013 -00001012 -3c151cc1 -36b56ab8 -145500ba -00000000 -3c081271 -35086a00 -01000013 -00001012 -3c151271 -36b56a00 -145500b2 -00000000 -3c08516e -35089dd0 -01000013 -00001012 -3c15516e -36b59dd0 -145500aa -00000000 -3c0840b9 -3508e420 -01000013 -00001012 -3c1540b9 -36b5e420 -145500a2 -00000000 -3c08663e -350853c4 -01000013 -00001012 -3c15663e -36b553c4 -1455009a -00000000 -3c081e52 -3508da16 -01000013 -00001012 -3c151e52 -36b5da16 -14550092 -00000000 -3c083332 -3508b636 -01000013 -00001012 -3c153332 -36b5b636 -1455008a -00000000 -3c08733d -3508dc00 -01000013 -00001012 -3c15733d -36b5dc00 -14550082 -00000000 -3c086e0a -35087e0f -01000013 -00001012 -3c156e0a -36b57e0f -1455007a -00000000 -3c08843d -35088d6e -01000013 -00001012 -3c15843d -36b58d6e -14550072 -00000000 -3c08baf0 -3508e236 -01000013 -00001012 -3c15baf0 -36b5e236 -1455006a -00000000 -3c088416 -3508a092 -01000013 -00001012 -3c158416 -36b5a092 -14550062 -00000000 -3c0811fa -35082c80 -01000013 -00001012 -3c1511fa -36b52c80 -1455005a -00000000 -3c085330 -3508fcd8 -01000013 -00001012 -3c155330 -36b5fcd8 -14550052 -00000000 -3c08123e -35083dbd -01000013 -00001012 -3c15123e -36b53dbd -1455004a -00000000 -3c08df39 -3508f580 -01000013 -00001012 -3c15df39 -36b5f580 -14550042 -00000000 -3c08bc2c -35087318 -01000013 -00001012 -3c15bc2c -36b57318 -1455003a -00000000 -3c08c468 -35089c4d -01000013 -00001012 -3c15c468 -36b59c4d -14550032 -00000000 -3c0856ef -3508e74c -01000013 -00001012 -3c1556ef -36b5e74c -1455002a -00000000 -3c08fac2 -3508f060 -01000013 -00001012 -3c15fac2 -36b5f060 -14550022 -00000000 -3c081c7e -3508e058 -01000013 -00001012 -3c151c7e -36b5e058 -1455001a -00000000 -3c08a0be -350859c0 -01000013 -00001012 -3c15a0be -36b559c0 -14550012 -00000000 -3c08ee70 -35087bd0 -01000013 -00001012 -3c15ee70 -36b57bd0 -1455000a -00000000 -24080000 -01000013 -00001012 -24150000 -14550004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -3c08800d -40805800 -3c170040 -40976000 -00000000 -24120001 -3c170001 -ad120000 -3c14bfc3 -2694881c -0bf0a2b7 -0000000c -165700ad -00000000 -24120001 -3c14bfc3 -26948838 -0bf0a2b7 -0000000c -165700a6 -00000000 -24120002 -3c170002 -ad120000 -3c14bfc3 -2694885c -0bf0a2b7 -0000000d -1657009d -00000000 -24120002 -3c14bfc3 -26948878 -0bf0a2b7 -0000000d -16570096 -00000000 -24120003 -3c170003 -ad120000 -3c14bfc3 -269488ac -3c04ba03 -34844f60 -3c05b615 -34a5fd67 -0bf0a2b7 -0085b820 -16570089 -00000000 -24120003 -3c14bfc3 -269488c8 -0bf0a2b7 -0085b820 -ad170000 -16570081 -00000000 -24120003 -ad120000 -3c14bfc3 -269488f4 -3c047fff -3484c19e -0bf0a2b7 -20976512 -16570077 -00000000 -24120003 -3c14bfc3 -26948910 -0bf0a2b7 -20976512 -16570070 -00000000 -24120003 -3c14bfc3 -2694893c -3c04a85e -34847d00 -3c056b7e -34a58e36 -0bf0a2b7 -0085b822 -16570065 -00000000 -24120003 -3c14bfc3 -26948958 -0bf0a2b7 -0085b822 -1657005e -00000000 -24120004 -3c170004 -ad120000 -3c14bfc3 -2694897c -0bf0a2b7 -8d170002 -16570055 -00000000 -24120004 -3c14bfc3 -26948998 -0bf0a2b7 -8d170002 -1657004e -00000000 -24120004 -3c14bfc3 -269489b4 -0bf0a2b7 -85170001 -02f2001b -16570046 -00000000 -24120004 -3c14bfc3 -269489d4 -0bf0a2b7 -85170001 -1657003f -00000000 -3c14bfc3 -269489ec -0bf0a2b7 -95170003 -16570039 -00000000 -24120004 -3c14bfc3 -26948a08 -0bf0a2b7 -95170003 -16570032 -00000000 -24120005 -3c170005 -ad120000 -3c14bfc3 -26948a2c -0bf0a2b7 -ad170002 -16570029 -00000000 -24120005 -3c14bfc3 -26948a48 -0bf0a2b7 -ad170002 -16570022 -00000000 -24120005 -3c14bfc3 -26948a64 -0bf0a2b7 -a5170001 -1657001b -00000000 -24120005 -3c14bfc3 -26948a80 -0bf0a2b7 -a5170001 -16570014 -00000000 -24120007 -3c170007 -ad120000 -3c14bfc3 -26948aa4 -0bf0a2b7 -9e3c56aa -02f20018 -1657000a -00000000 -24120007 -3c14bfc3 -26948ac8 -02f20018 -0bf0a2b7 -ec1ba960 -16570002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -24120000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02f102 -34426890 -0510000c -00000000 -1000000d -00000000 -3c08c564 -3508aaee -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a58b20 -10000004 -00000000 -03e02821 -3c0339dd -34635800 -0017f821 -3c15f102 -36b56890 -3c1639dd -36d65800 -145515a1 -00000000 -1476159f -00000000 -3c15bfc3 -26b58b20 -3c16bfc3 -26d68b38 -14961599 -00000000 -14b51597 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c026c41 -3442162c -0510000c -00000000 -1000000d -00000000 -3c08655e -3508408b -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a58bc4 -10000004 -00000000 -03e02821 -3c038d5c -3463d86f -0017f821 -24150000 -24160000 -1455157a -00000000 -14761578 -00000000 -3c15bfc3 -26b58bc4 -3c16bfc3 -26d68bdc -14961572 -00000000 -14b51570 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02e6b2 -3442af00 -0510000c -00000000 -1000000d -00000000 -3c08d941 -3508dbc8 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a58c60 -10000004 -00000000 -03e02821 -3c034c80 -3463b4b6 -0017f821 -3c15e6b2 -36b5af00 -3c164c80 -36d6b4b6 -14551551 -00000000 -1476154f -00000000 -3c15bfc3 -26b58c60 -3c16bfc3 -26d68c78 -14961549 -00000000 -14b51547 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c023516 -34423822 -0510000c -00000000 -1000000d -00000000 -3c0818c1 -3508552a -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a58d04 -10000004 -00000000 -03e02821 -3c0334ff -3463ade0 -0017f821 -24150000 -24160000 -1455152a -00000000 -14761528 -00000000 -3c15bfc3 -26b58d04 -3c16bfc3 -26d68d1c -14961522 -00000000 -14b51520 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02e079 -3442deb3 -0510000c -00000000 -1000000d -00000000 -3c08a800 -350825a1 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a58da0 -10000004 -00000000 -03e02821 -3c03774b -3463ba9e -0017f821 -3c15e079 -36b5deb3 -3c16774b -36d6ba9e -14551501 -00000000 -147614ff -00000000 -3c15bfc3 -26b58da0 -3c16bfc3 -26d68db8 -149614f9 -00000000 -14b514f7 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02978a -3442f84a -0510000c -00000000 -1000000d -00000000 -3c088ff9 -3508842b -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a58e44 -10000004 -00000000 -03e02821 -3c03d770 -3463ef60 -0017f821 -3c15978a -36b5f84a -3c16d770 -36d6ef60 -145514d8 -00000000 -147614d6 -00000000 -3c15bfc3 -26b58e44 -3c16bfc3 -26d68e5c -149614d0 -00000000 -14b514ce -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02f95f -34422930 -0510000c -00000000 -1000000d -00000000 -3c08663d -3508a924 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a58ee8 -10000004 -00000000 -03e02821 -3c034654 -3463a65c -0017f821 -24150000 -24160000 -145514b1 -00000000 -147614af -00000000 -3c15bfc3 -26b58ee8 -3c16bfc3 -26d68f00 -149614a9 -00000000 -14b514a7 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02b95f -3442fbe8 -0510000c -00000000 -1000000d -00000000 -3c08d970 -350864ee -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a58f84 -10000004 -00000000 -03e02821 -3c03619a -346380f4 -0017f821 -3c15b95f -36b5fbe8 -3c16619a -36d680f4 -14551488 -00000000 -14761486 -00000000 -3c15bfc3 -26b58f84 -3c16bfc3 -26d68f9c -14961480 -00000000 -14b5147e -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02f674 -34429e10 -0510000c -00000000 -1000000d -00000000 -3c085447 -35084420 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a59028 -10000004 -00000000 -03e02821 -3c030f55 -34638b00 -0017f821 -24150000 -24160000 -14551461 -00000000 -1476145f -00000000 -3c15bfc3 -26b59028 -3c16bfc3 -26d69040 -14961459 -00000000 -14b51457 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c023610 -3442309b -0510000c -00000000 -1000000d -00000000 -3c08f359 -35085c58 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a590c4 -10000004 -00000000 -03e02821 -3c03b61e -346333d0 -0017f821 -3c153610 -36b5309b -3c16b61e -36d633d0 -14551438 -00000000 -14761436 -00000000 -3c15bfc3 -26b590c4 -3c16bfc3 -26d690dc -14961430 -00000000 -14b5142e -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c025576 -344237b4 -0510000c -00000000 -1000000d -00000000 -3c08d8dc -35084820 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a59168 -10000004 -00000000 -03e02821 -3c03910e -34633aa0 -0017f821 -3c155576 -36b537b4 -3c16910e -36d63aa0 -1455140f -00000000 -1476140d -00000000 -3c15bfc3 -26b59168 -3c16bfc3 -26d69180 -14961407 -00000000 -14b51405 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0227e9 -3442c330 -0510000c -00000000 -1000000d -00000000 -3c08aa8a -35084c98 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5920c -10000004 -00000000 -03e02821 -3c03ae08 -34631f3e -0017f821 -3c1527e9 -36b5c330 -3c16ae08 -36d61f3e -145513e6 -00000000 -147613e4 -00000000 -3c15bfc3 -26b5920c -3c16bfc3 -26d69224 -149613de -00000000 -14b513dc -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02635e -3442d0a2 -0510000c -00000000 -1000000d -00000000 -3c08d9c4 -3508ed40 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a592b0 -10000004 -00000000 -03e02821 -3c03dec2 -3463e92c -0017f821 -3c15635e -36b5d0a2 -3c16dec2 -36d6e92c -145513bd -00000000 -147613bb -00000000 -3c15bfc3 -26b592b0 -3c16bfc3 -26d692c8 -149613b5 -00000000 -14b513b3 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02e165 -3442e880 -0510000c -00000000 -1000000d -00000000 -3c086839 -35087fdc -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a59354 -10000004 -00000000 -03e02821 -3c0345d1 -3463fd2c -0017f821 -24150000 -24160000 -14551396 -00000000 -14761394 -00000000 -3c15bfc3 -26b59354 -3c16bfc3 -26d6936c -1496138e -00000000 -14b5138c -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c027417 -344263bc -0510000c -00000000 -1000000d -00000000 -3c080517 -35082a80 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a593f0 -10000004 -00000000 -03e02821 -3c033ec4 -34636470 -0017f821 -24150000 -24160000 -1455136f -00000000 -1476136d -00000000 -3c15bfc3 -26b593f0 -3c16bfc3 -26d69408 -14961367 -00000000 -14b51365 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02f3da -3442cee9 -0510000c -00000000 -1000000d -00000000 -3c08ae59 -35083468 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5948c -10000004 -00000000 -03e02821 -3c037606 -3463d4f0 -0017f821 -3c15f3da -36b5cee9 -3c167606 -36d6d4f0 -14551346 -00000000 -14761344 -00000000 -3c15bfc3 -26b5948c -3c16bfc3 -26d694a4 -1496133e -00000000 -14b5133c -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c020551 -3442f160 -0510000c -00000000 -1000000d -00000000 -3c0891d6 -3508b8c2 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a59530 -10000004 -00000000 -03e02821 -3c034f00 -34636da0 -0017f821 -3c150551 -36b5f160 -3c164f00 -36d66da0 -1455131d -00000000 -1476131b -00000000 -3c15bfc3 -26b59530 -3c16bfc3 -26d69548 -14961315 -00000000 -14b51313 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0297ee -34428758 -0510000c -00000000 -1000000d -00000000 -3c08a06b -35086b90 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a595d4 -10000004 -00000000 -03e02821 -3c0317d5 -346354a0 -0017f821 -3c1597ee -36b58758 -3c1617d5 -36d654a0 -145512f4 -00000000 -147612f2 -00000000 -3c15bfc3 -26b595d4 -3c16bfc3 -26d695ec -149612ec -00000000 -14b512ea -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c025ec9 -344246e0 -0510000c -00000000 -1000000d -00000000 -3c087ba5 -35089500 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a59678 -10000004 -00000000 -03e02821 -3c03077f -3463958c -0017f821 -24150000 -24160000 -145512cd -00000000 -147612cb -00000000 -3c15bfc3 -26b59678 -3c16bfc3 -26d69690 -149612c5 -00000000 -14b512c3 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c023de2 -3442fb80 -0510000c -00000000 -1000000d -00000000 -3c08f952 -3508c748 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a59714 -10000004 -00000000 -03e02821 -3c03b3da -34638ec0 -0017f821 -3c153de2 -36b5fb80 -3c16b3da -36d68ec0 -145512a4 -00000000 -147612a2 -00000000 -3c15bfc3 -26b59714 -3c16bfc3 -26d6972c -1496129c -00000000 -14b5129a -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c027e35 -3442d110 -0510000c -00000000 -1000000d -00000000 -3c08d77c -35083bd3 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a597b8 -10000004 -00000000 -03e02821 -3c03c636 -3463c3b0 -0017f821 -3c157e35 -36b5d110 -3c16c636 -36d6c3b0 -1455127b -00000000 -14761279 -00000000 -3c15bfc3 -26b597b8 -3c16bfc3 -26d697d0 -14961273 -00000000 -14b51271 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c022371 -344260b4 -0510000c -00000000 -1000000d -00000000 -3c0826dd -3508a6d0 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5985c -10000004 -00000000 -03e02821 -3c034daf -346387f0 -0017f821 -24150000 -24160000 -14551254 -00000000 -14761252 -00000000 -3c15bfc3 -26b5985c -3c16bfc3 -26d69874 -1496124c -00000000 -14b5124a -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c022918 -3442933c -0510000c -00000000 -1000000d -00000000 -3c08502b -3508adc0 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a598f8 -10000004 -00000000 -03e02821 -3c03370f -346369c0 -0017f821 -24150000 -24160000 -1455122d -00000000 -1476122b -00000000 -3c15bfc3 -26b598f8 -3c16bfc3 -26d69910 -14961225 -00000000 -14b51223 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02bff1 -34421c9d -0510000c -00000000 -1000000d -00000000 -3c08e6da -35084e94 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a59994 -10000004 -00000000 -03e02821 -3c0340ec -3463feb1 -0017f821 -3c15bff1 -36b51c9d -3c1640ec -36d6feb1 -14551204 -00000000 -14761202 -00000000 -3c15bfc3 -26b59994 -3c16bfc3 -26d699ac -149611fc -00000000 -14b511fa -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c027829 -3442cec0 -0510000c -00000000 -1000000d -00000000 -3c085c91 -3508b880 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a59a38 -10000004 -00000000 -03e02821 -3c03a299 -34639300 -0017f821 -24150000 -24160000 -145511dd -00000000 -147611db -00000000 -3c15bfc3 -26b59a38 -3c16bfc3 -26d69a50 -149611d5 -00000000 -14b511d3 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c027a76 -34427238 -0510000c -00000000 -1000000d -00000000 -3c0882ea -35082849 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a59ad4 -10000004 -00000000 -03e02821 -3c034e96 -346360c0 -0017f821 -3c157a76 -36b57238 -3c164e96 -36d660c0 -145511b4 -00000000 -147611b2 -00000000 -3c15bfc3 -26b59ad4 -3c16bfc3 -26d69aec -149611ac -00000000 -14b511aa -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c025de2 -34424514 -0510000c -00000000 -1000000d -00000000 -3c089487 -35080718 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a59b78 -10000004 -00000000 -03e02821 -3c035d04 -346321b6 -0017f821 -3c155de2 -36b54514 -3c165d04 -36d621b6 -1455118b -00000000 -14761189 -00000000 -3c15bfc3 -26b59b78 -3c16bfc3 -26d69b90 -14961183 -00000000 -14b51181 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0218f1 -3442fa80 -0510000c -00000000 -1000000d -00000000 -3c08e224 -3508cb20 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a59c1c -10000004 -00000000 -03e02821 -3c03150e -34635c3a -0017f821 -3c1518f1 -36b5fa80 -3c16150e -36d65c3a -14551162 -00000000 -14761160 -00000000 -3c15bfc3 -26b59c1c -3c16bfc3 -26d69c34 -1496115a -00000000 -14b51158 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c024ea5 -3442a8bc -0510000c -00000000 -1000000d -00000000 -3c083a14 -3508e59e -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a59cc0 -10000004 -00000000 -03e02821 -3c03b5ed -34637980 -0017f821 -24150000 -24160000 -1455113b -00000000 -14761139 -00000000 -3c15bfc3 -26b59cc0 -3c16bfc3 -26d69cd8 -14961133 -00000000 -14b51131 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c028673 -3442350c -0510000c -00000000 -1000000d -00000000 -3c08dcbd -350866d6 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a59d5c -10000004 -00000000 -03e02821 -3c03fb5f -346383b1 -0017f821 -3c158673 -36b5350c -3c16fb5f -36d683b1 -14551112 -00000000 -14761110 -00000000 -3c15bfc3 -26b59d5c -3c16bfc3 -26d69d74 -1496110a -00000000 -14b51108 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02960a -344274d8 -0510000c -00000000 -1000000d -00000000 -3c085c84 -3508b110 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a59e00 -10000004 -00000000 -03e02821 -3c03e239 -3463d950 -0017f821 -24150000 -24160000 -145510eb -00000000 -147610e9 -00000000 -3c15bfc3 -26b59e00 -3c16bfc3 -26d69e18 -149610e3 -00000000 -14b510e1 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0225f6 -3442aa30 -0510000c -00000000 -1000000d -00000000 -3c08fc08 -3508307a -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a59e9c -10000004 -00000000 -03e02821 -3c0343d5 -3463c894 -0017f821 -3c1525f6 -36b5aa30 -3c1643d5 -36d6c894 -145510c2 -00000000 -147610c0 -00000000 -3c15bfc3 -26b59e9c -3c16bfc3 -26d69eb4 -149610ba -00000000 -14b510b8 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c028338 -3442ae38 -0510000c -00000000 -1000000d -00000000 -3c0830ae -3508e220 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a59f40 -10000004 -00000000 -03e02821 -3c03f28d -3463d8d0 -0017f821 -24150000 -24160000 -1455109b -00000000 -14761099 -00000000 -3c15bfc3 -26b59f40 -3c16bfc3 -26d69f58 -14961093 -00000000 -14b51091 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02a4f7 -3442aacf -0510000c -00000000 -1000000d -00000000 -3c0885bd -35085b3a -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a59fdc -10000004 -00000000 -03e02821 -3c03a39c -346366c0 -0017f821 -3c15a4f7 -36b5aacf -3c16a39c -36d666c0 -14551072 -00000000 -14761070 -00000000 -3c15bfc3 -26b59fdc -3c16bfc3 -26d69ff4 -1496106a -00000000 -14b51068 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c023fed -3442a210 -0510000c -00000000 -1000000d -00000000 -3c08a171 -3508fee0 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5a080 -10000004 -00000000 -03e02821 -3c037711 -34637a8c -0017f821 -3c153fed -36b5a210 -3c167711 -36d67a8c -14551049 -00000000 -14761047 -00000000 -3c15bfc3 -26b5a080 -3c16bfc3 -26d6a098 -14961041 -00000000 -14b5103f -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02ee52 -3442c578 -0510000c -00000000 -1000000d -00000000 -3c087963 -35087610 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5a124 -10000004 -00000000 -03e02821 -3c032489 -34630ec0 -0017f821 -24150000 -24160000 -14551022 -00000000 -14761020 -00000000 -3c15bfc3 -26b5a124 -3c16bfc3 -26d6a13c -1496101a -00000000 -14b51018 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02846b -34428bea -0510000c -00000000 -1000000d -00000000 -3c08bfea -350829c4 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5a1c0 -10000004 -00000000 -03e02821 -3c030727 -3463fb08 -0017f821 -3c15846b -36b58bea -3c160727 -36d6fb08 -14550ff9 -00000000 -14760ff7 -00000000 -3c15bfc3 -26b5a1c0 -3c16bfc3 -26d6a1d8 -14960ff1 -00000000 -14b50fef -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02b19f -34429e78 -0510000c -00000000 -1000000d -00000000 -3c086c10 -35083040 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5a264 -10000004 -00000000 -03e02821 -3c03d53b -346362e4 -0017f821 -24150000 -24160000 -14550fd2 -00000000 -14760fd0 -00000000 -3c15bfc3 -26b5a264 -3c16bfc3 -26d6a27c -14960fca -00000000 -14b50fc8 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02c18b -344261f1 -0510000c -00000000 -1000000d -00000000 -3c084fa2 -35086e80 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5a300 -10000004 -00000000 -03e02821 -3c03b8d2 -34632ab0 -0017f821 -24150000 -24160000 -14550fab -00000000 -14760fa9 -00000000 -3c15bfc3 -26b5a300 -3c16bfc3 -26d6a318 -14960fa3 -00000000 -14b50fa1 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02f327 -3442c65e -0510000c -00000000 -1000000d -00000000 -3c0808e1 -35084a7e -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5a39c -10000004 -00000000 -03e02821 -3c03d36c -3463fac0 -0017f821 -24150000 -24160000 -14550f84 -00000000 -14760f82 -00000000 -3c15bfc3 -26b5a39c -3c16bfc3 -26d6a3b4 -14960f7c -00000000 -14b50f7a -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0208d5 -3442b74a -0510000c -00000000 -1000000d -00000000 -3c089564 -35084160 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5a438 -10000004 -00000000 -03e02821 -3c03ff5d -346310e4 -0017f821 -3c1508d5 -36b5b74a -3c16ff5d -36d610e4 -14550f5b -00000000 -14760f59 -00000000 -3c15bfc3 -26b5a438 -3c16bfc3 -26d6a450 -14960f53 -00000000 -14b50f51 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0238d5 -34421fd0 -0510000c -00000000 -1000000d -00000000 -3c08e113 -350849c8 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5a4dc -10000004 -00000000 -03e02821 -3c0347bc -3463d2f0 -0017f821 -3c1538d5 -36b51fd0 -3c1647bc -36d6d2f0 -14550f32 -00000000 -14760f30 -00000000 -3c15bfc3 -26b5a4dc -3c16bfc3 -26d6a4f4 -14960f2a -00000000 -14b50f28 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02170d -34420e20 -0510000c -00000000 -1000000d -00000000 -3c08ab05 -3508d540 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5a580 -10000004 -00000000 -03e02821 -3c0353a1 -3463d234 -0017f821 -3c15170d -36b50e20 -3c1653a1 -36d6d234 -14550f09 -00000000 -14760f07 -00000000 -3c15bfc3 -26b5a580 -3c16bfc3 -26d6a598 -14960f01 -00000000 -14b50eff -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c027703 -34420fa0 -0510000c -00000000 -1000000d -00000000 -3c080082 -35087dc8 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5a624 -10000004 -00000000 -03e02821 -3c03e076 -34636080 -0017f821 -24150000 -24160000 -14550ee2 -00000000 -14760ee0 -00000000 -3c15bfc3 -26b5a624 -3c16bfc3 -26d6a63c -14960eda -00000000 -14b50ed8 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02ff1f -3442696e -0510000c -00000000 -1000000d -00000000 -3c084fb7 -350895e8 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5a6c0 -10000004 -00000000 -03e02821 -3c03c65c -3463117e -0017f821 -24150000 -24160000 -14550ebb -00000000 -14760eb9 -00000000 -3c15bfc3 -26b5a6c0 -3c16bfc3 -26d6a6d8 -14960eb3 -00000000 -14b50eb1 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0204c5 -3442ea92 -0510000c -00000000 -1000000d -00000000 -3c08e26c -35083dc8 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5a75c -10000004 -00000000 -03e02821 -3c03d4a9 -3463b540 -0017f821 -3c1504c5 -36b5ea92 -3c16d4a9 -36d6b540 -14550e92 -00000000 -14760e90 -00000000 -3c15bfc3 -26b5a75c -3c16bfc3 -26d6a774 -14960e8a -00000000 -14b50e88 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c026567 -344288a8 -0510000c -00000000 -1000000d -00000000 -3c088ffd -35082b44 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5a800 -10000004 -00000000 -03e02821 -3c039f96 -3463adc8 -0017f821 -3c156567 -36b588a8 -3c169f96 -36d6adc8 -14550e69 -00000000 -14760e67 -00000000 -3c15bfc3 -26b5a800 -3c16bfc3 -26d6a818 -14960e61 -00000000 -14b50e5f -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c029f2a -344210ee -0510000c -00000000 -1000000d -00000000 -3c08e348 -35081772 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5a8a4 -10000004 -00000000 -03e02821 -3c03dd0e -34636718 -0017f821 -3c159f2a -36b510ee -3c16dd0e -36d66718 -14550e40 -00000000 -14760e3e -00000000 -3c15bfc3 -26b5a8a4 -3c16bfc3 -26d6a8bc -14960e38 -00000000 -14b50e36 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02d1f8 -3442e093 -0510000c -00000000 -1000000d -00000000 -3c087f7d -3508b200 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5a948 -10000004 -00000000 -03e02821 -3c037db9 -3463f89c -0017f821 -24150000 -24160000 -14550e19 -00000000 -14760e17 -00000000 -3c15bfc3 -26b5a948 -3c16bfc3 -26d6a960 -14960e11 -00000000 -14b50e0f -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02114b -34421cf8 -0510000c -00000000 -1000000d -00000000 -3c088e33 -3508fd2a -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5a9e4 -10000004 -00000000 -03e02821 -3c03f136 -34639ae4 -0017f821 -3c15114b -36b51cf8 -3c16f136 -36d69ae4 -14550df0 -00000000 -14760dee -00000000 -3c15bfc3 -26b5a9e4 -3c16bfc3 -26d6a9fc -14960de8 -00000000 -14b50de6 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02e036 -3442d934 -0510000c -00000000 -1000000d -00000000 -3c08083b -3508a18a -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5aa88 -10000004 -00000000 -03e02821 -3c0357d8 -34630e38 -0017f821 -24150000 -24160000 -14550dc9 -00000000 -14760dc7 -00000000 -3c15bfc3 -26b5aa88 -3c16bfc3 -26d6aaa0 -14960dc1 -00000000 -14b50dbf -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02b3b0 -3442b3c9 -0510000c -00000000 -1000000d -00000000 -3c08138e -350807f8 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5ab24 -10000004 -00000000 -03e02821 -3c035a21 -3463b780 -0017f821 -24150000 -24160000 -14550da2 -00000000 -14760da0 -00000000 -3c15bfc3 -26b5ab24 -3c16bfc3 -26d6ab3c -14960d9a -00000000 -14b50d98 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c029b43 -34429a00 -0510000c -00000000 -1000000d -00000000 -3c082446 -350884db -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5abc0 -10000004 -00000000 -03e02821 -3c039a8b -3463f098 -0017f821 -24150000 -24160000 -14550d7b -00000000 -14760d79 -00000000 -3c15bfc3 -26b5abc0 -3c16bfc3 -26d6abd8 -14960d73 -00000000 -14b50d71 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02364d -344245c0 -0510000c -00000000 -1000000d -00000000 -3c08a4f9 -3508cfdd -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5ac5c -10000004 -00000000 -03e02821 -3c0341bb -3463e00c -0017f821 -3c15364d -36b545c0 -3c1641bb -36d6e00c -14550d52 -00000000 -14760d50 -00000000 -3c15bfc3 -26b5ac5c -3c16bfc3 -26d6ac74 -14960d4a -00000000 -14b50d48 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0280df -3442fe44 -0510000c -00000000 -1000000d -00000000 -3c08a31a -35088b88 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5ad00 -10000004 -00000000 -03e02821 -3c032bfa -34631dd8 -0017f821 -3c1580df -36b5fe44 -3c162bfa -36d61dd8 -14550d29 -00000000 -14760d27 -00000000 -3c15bfc3 -26b5ad00 -3c16bfc3 -26d6ad18 -14960d21 -00000000 -14b50d1f -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02ca72 -34427700 -0510000c -00000000 -1000000d -00000000 -3c08028a -35085cdc -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5ada4 -10000004 -00000000 -03e02821 -3c03d1ac -3463b3d8 -0017f821 -24150000 -24160000 -14550d02 -00000000 -14760d00 -00000000 -3c15bfc3 -26b5ada4 -3c16bfc3 -26d6adbc -14960cfa -00000000 -14b50cf8 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c025b36 -3442fb58 -0510000c -00000000 -1000000d -00000000 -3c08f415 -35088168 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5ae40 -10000004 -00000000 -03e02821 -3c03dac1 -3463338c -0017f821 -3c155b36 -36b5fb58 -3c16dac1 -36d6338c -14550cd9 -00000000 -14760cd7 -00000000 -3c15bfc3 -26b5ae40 -3c16bfc3 -26d6ae58 -14960cd1 -00000000 -14b50ccf -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c029aef -3442d3e0 -0510000c -00000000 -1000000d -00000000 -3c08aede -35089100 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5aee4 -10000004 -00000000 -03e02821 -3c03eb17 -34632cbe -0017f821 -3c159aef -36b5d3e0 -3c16eb17 -36d62cbe -14550cb0 -00000000 -14760cae -00000000 -3c15bfc3 -26b5aee4 -3c16bfc3 -26d6aefc -14960ca8 -00000000 -14b50ca6 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02a743 -34426d60 -0510000c -00000000 -1000000d -00000000 -3c087d93 -35083080 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5af88 -10000004 -00000000 -03e02821 -3c032f18 -346314c4 -0017f821 -24150000 -24160000 -14550c89 -00000000 -14760c87 -00000000 -3c15bfc3 -26b5af88 -3c16bfc3 -26d6afa0 -14960c81 -00000000 -14b50c7f -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c028dce -3442c176 -0510000c -00000000 -1000000d -00000000 -3c085b78 -3508e940 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5b024 -10000004 -00000000 -03e02821 -3c03b872 -34636e32 -0017f821 -24150000 -24160000 -14550c62 -00000000 -14760c60 -00000000 -3c15bfc3 -26b5b024 -3c16bfc3 -26d6b03c -14960c5a -00000000 -14b50c58 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c025820 -34425fc0 -0510000c -00000000 -1000000d -00000000 -3c082f5f -35088070 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5b0c0 -10000004 -00000000 -03e02821 -3c03e57e -346323ad -0017f821 -24150000 -24160000 -14550c3b -00000000 -14760c39 -00000000 -3c15bfc3 -26b5b0c0 -3c16bfc3 -26d6b0d8 -14960c33 -00000000 -14b50c31 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c029b86 -3442c9b8 -0510000c -00000000 -1000000d -00000000 -3c08da73 -350808f4 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5b15c -10000004 -00000000 -03e02821 -3c039137 -346375a0 -0017f821 -3c159b86 -36b5c9b8 -3c169137 -36d675a0 -14550c12 -00000000 -14760c10 -00000000 -3c15bfc3 -26b5b15c -3c16bfc3 -26d6b174 -14960c0a -00000000 -14b50c08 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02c233 -34429e20 -0510000c -00000000 -1000000d -00000000 -3c08e9c9 -3508da6a -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5b200 -10000004 -00000000 -03e02821 -3c03a426 -34638ba0 -0017f821 -3c15c233 -36b59e20 -3c16a426 -36d68ba0 -14550be9 -00000000 -14760be7 -00000000 -3c15bfc3 -26b5b200 -3c16bfc3 -26d6b218 -14960be1 -00000000 -14b50bdf -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02a3d5 -3442a878 -0510000c -00000000 -1000000d -00000000 -3c08ab39 -3508c2d2 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5b2a4 -10000004 -00000000 -03e02821 -3c031727 -3463c53b -0017f821 -3c15a3d5 -36b5a878 -3c161727 -36d6c53b -14550bc0 -00000000 -14760bbe -00000000 -3c15bfc3 -26b5b2a4 -3c16bfc3 -26d6b2bc -14960bb8 -00000000 -14b50bb6 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02d183 -34424712 -0510000c -00000000 -1000000d -00000000 -3c08be97 -3508cbea -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5b348 -10000004 -00000000 -03e02821 -3c0381b9 -3463b444 -0017f821 -3c15d183 -36b54712 -3c1681b9 -36d6b444 -14550b97 -00000000 -14760b95 -00000000 -3c15bfc3 -26b5b348 -3c16bfc3 -26d6b360 -14960b8f -00000000 -14b50b8d -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0258ed -3442ca80 -0510000c -00000000 -1000000d -00000000 -3c08ccbb -35086fe8 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5b3ec -10000004 -00000000 -03e02821 -3c03e32f -34631c00 -0017f821 -3c1558ed -36b5ca80 -3c16e32f -36d61c00 -14550b6e -00000000 -14760b6c -00000000 -3c15bfc3 -26b5b3ec -3c16bfc3 -26d6b404 -14960b66 -00000000 -14b50b64 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0205b8 -34421cc8 -0510000c -00000000 -1000000d -00000000 -3c08ca82 -350892c0 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5b490 -10000004 -00000000 -03e02821 -3c035dc2 -3463535b -0017f821 -3c1505b8 -36b51cc8 -3c165dc2 -36d6535b -14550b45 -00000000 -14760b43 -00000000 -3c15bfc3 -26b5b490 -3c16bfc3 -26d6b4a8 -14960b3d -00000000 -14b50b3b -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c025745 -3442c9ac -0510000c -00000000 -1000000d -00000000 -3c088721 -35086bb1 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5b534 -10000004 -00000000 -03e02821 -3c03559f -346339ac -0017f821 -3c155745 -36b5c9ac -3c16559f -36d639ac -14550b1c -00000000 -14760b1a -00000000 -3c15bfc3 -26b5b534 -3c16bfc3 -26d6b54c -14960b14 -00000000 -14b50b12 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02bd2e -34423330 -0510000c -00000000 -1000000d -00000000 -3c08c466 -35080448 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5b5d8 -10000004 -00000000 -03e02821 -3c0348ee -3463aa30 -0017f821 -3c15bd2e -36b53330 -3c1648ee -36d6aa30 -14550af3 -00000000 -14760af1 -00000000 -3c15bfc3 -26b5b5d8 -3c16bfc3 -26d6b5f0 -14960aeb -00000000 -14b50ae9 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c026c6e -3442fe6f -0510000c -00000000 -1000000d -00000000 -3c08443f -3508f57c -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5b67c -10000004 -00000000 -03e02821 -3c038789 -346308f7 -0017f821 -24150000 -24160000 -14550acc -00000000 -14760aca -00000000 -3c15bfc3 -26b5b67c -3c16bfc3 -26d6b694 -14960ac4 -00000000 -14b50ac2 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02e061 -34421dfc -0510000c -00000000 -1000000d -00000000 -3c087d6e -3508e738 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5b718 -10000004 -00000000 -03e02821 -3c039f03 -34631122 -0017f821 -24150000 -24160000 -14550aa5 -00000000 -14760aa3 -00000000 -3c15bfc3 -26b5b718 -3c16bfc3 -26d6b730 -14960a9d -00000000 -14b50a9b -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c027d24 -34427ed0 -0510000c -00000000 -1000000d -00000000 -3c08d3d1 -35080d4d -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5b7b4 -10000004 -00000000 -03e02821 -3c03f572 -34632c22 -0017f821 -3c157d24 -36b57ed0 -3c16f572 -36d62c22 -14550a7c -00000000 -14760a7a -00000000 -3c15bfc3 -26b5b7b4 -3c16bfc3 -26d6b7cc -14960a74 -00000000 -14b50a72 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02820b -344211fe -0510000c -00000000 -1000000d -00000000 -3c081f94 -35089120 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5b858 -10000004 -00000000 -03e02821 -3c03dc05 -3463404a -0017f821 -24150000 -24160000 -14550a55 -00000000 -14760a53 -00000000 -3c15bfc3 -26b5b858 -3c16bfc3 -26d6b870 -14960a4d -00000000 -14b50a4b -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0277c6 -3442a186 -0510000c -00000000 -1000000d -00000000 -3c08c68f -35080040 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5b8f4 -10000004 -00000000 -03e02821 -3c039f2c -34639ee6 -0017f821 -3c1577c6 -36b5a186 -3c169f2c -36d69ee6 -14550a2c -00000000 -14760a2a -00000000 -3c15bfc3 -26b5b8f4 -3c16bfc3 -26d6b90c -14960a24 -00000000 -14b50a22 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c023be0 -34423aec -0510000c -00000000 -1000000d -00000000 -3c08c731 -35082578 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5b998 -10000004 -00000000 -03e02821 -3c03c0fe -3463e200 -0017f821 -3c153be0 -36b53aec -3c16c0fe -36d6e200 -14550a03 -00000000 -14760a01 -00000000 -3c15bfc3 -26b5b998 -3c16bfc3 -26d6b9b0 -149609fb -00000000 -14b509f9 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02aadf -34423100 -0510000c -00000000 -1000000d -00000000 -3c08309a -3508c032 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5ba3c -10000004 -00000000 -03e02821 -3c03497e -3463c7b0 -0017f821 -24150000 -24160000 -145509dc -00000000 -147609da -00000000 -3c15bfc3 -26b5ba3c -3c16bfc3 -26d6ba54 -149609d4 -00000000 -14b509d2 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02ea8c -34421a16 -0510000c -00000000 -1000000d -00000000 -3c082092 -3508e460 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5bad8 -10000004 -00000000 -03e02821 -3c037fb0 -3463dc44 -0017f821 -24150000 -24160000 -145509b5 -00000000 -147609b3 -00000000 -3c15bfc3 -26b5bad8 -3c16bfc3 -26d6baf0 -149609ad -00000000 -14b509ab -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0224cd -34426a00 -0510000c -00000000 -1000000d -00000000 -3c08f724 -3508628b -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5bb74 -10000004 -00000000 -03e02821 -3c0306d5 -3463bbd0 -0017f821 -3c1524cd -36b56a00 -3c1606d5 -36d6bbd0 -1455098c -00000000 -1476098a -00000000 -3c15bfc3 -26b5bb74 -3c16bfc3 -26d6bb8c -14960984 -00000000 -14b50982 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02b8ac -3442f8f9 -0510000c -00000000 -1000000d -00000000 -3c0833bf -35084222 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5bc18 -10000004 -00000000 -03e02821 -3c03dafc -34638a00 -0017f821 -24150000 -24160000 -14550965 -00000000 -14760963 -00000000 -3c15bfc3 -26b5bc18 -3c16bfc3 -26d6bc30 -1496095d -00000000 -14b5095b -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c027172 -3442c748 -0510000c -00000000 -1000000d -00000000 -3c089e23 -35084e33 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5bcb4 -10000004 -00000000 -03e02821 -3c0361ac -34638e1e -0017f821 -3c157172 -36b5c748 -3c1661ac -36d68e1e -1455093c -00000000 -1476093a -00000000 -3c15bfc3 -26b5bcb4 -3c16bfc3 -26d6bccc -14960934 -00000000 -14b50932 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c020218 -344222c8 -0510000c -00000000 -1000000d -00000000 -3c08f975 -35086dbc -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5bd58 -10000004 -00000000 -03e02821 -3c03a5ed -34634b94 -0017f821 -3c150218 -36b522c8 -3c16a5ed -36d64b94 -14550913 -00000000 -14760911 -00000000 -3c15bfc3 -26b5bd58 -3c16bfc3 -26d6bd70 -1496090b -00000000 -14b50909 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02d844 -34422aaf -0510000c -00000000 -1000000d -00000000 -3c086088 -35080d60 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5bdfc -10000004 -00000000 -03e02821 -3c03aac6 -3463de74 -0017f821 -24150000 -24160000 -145508ec -00000000 -147608ea -00000000 -3c15bfc3 -26b5bdfc -3c16bfc3 -26d6be14 -149608e4 -00000000 -14b508e2 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02eb2f -34427fcc -0510000c -00000000 -1000000d -00000000 -3c083369 -35089318 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5be98 -10000004 -00000000 -03e02821 -3c03dcfb -3463d7b6 -0017f821 -24150000 -24160000 -145508c5 -00000000 -147608c3 -00000000 -3c15bfc3 -26b5be98 -3c16bfc3 -26d6beb0 -149608bd -00000000 -14b508bb -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02e333 -3442f8e8 -0510000c -00000000 -1000000d -00000000 -3c081bea -3508cb00 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5bf34 -10000004 -00000000 -03e02821 -3c03d492 -3463d830 -0017f821 -24150000 -24160000 -1455089e -00000000 -1476089c -00000000 -3c15bfc3 -26b5bf34 -3c16bfc3 -26d6bf4c -14960896 -00000000 -14b50894 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02c25e -344231c0 -0510000c -00000000 -1000000d -00000000 -3c08f3ab -3508d08a -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5bfd0 -10000004 -00000000 -03e02821 -3c03f178 -3463fcc7 -0017f821 -3c15c25e -36b531c0 -3c16f178 -36d6fcc7 -14550875 -00000000 -14760873 -00000000 -3c15bfc3 -26b5bfd0 -3c16bfc3 -26d6bfe8 -1496086d -00000000 -14b5086b -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c027470 -344214c0 -0510000c -00000000 -1000000d -00000000 -3c08bbb8 -35085c80 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5c074 -10000004 -00000000 -03e02821 -3c03a2f6 -3463fdf0 -0017f821 -3c157470 -36b514c0 -3c16a2f6 -36d6fdf0 -1455084c -00000000 -1476084a -00000000 -3c15bfc3 -26b5c074 -3c16bfc3 -26d6c08c -14960844 -00000000 -14b50842 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02eeed -3442819a -0510000c -00000000 -1000000d -00000000 -3c083a43 -3508003a -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5c118 -10000004 -00000000 -03e02821 -3c03b2fa -3463d2e0 -0017f821 -24150000 -24160000 -14550825 -00000000 -14760823 -00000000 -3c15bfc3 -26b5c118 -3c16bfc3 -26d6c130 -1496081d -00000000 -14b5081b -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02dc5b -344245a0 -0510000c -00000000 -1000000d -00000000 -3c085037 -3508f2c4 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5c1b4 -10000004 -00000000 -03e02821 -3c032ec3 -3463ec30 -0017f821 -24150000 -24160000 -145507fe -00000000 -147607fc -00000000 -3c15bfc3 -26b5c1b4 -3c16bfc3 -26d6c1cc -149607f6 -00000000 -14b507f4 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02aff2 -34424380 -0510000c -00000000 -1000000d -00000000 -3c08a845 -35086f6e -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5c250 -10000004 -00000000 -03e02821 -3c03319e -34633974 -0017f821 -3c15aff2 -36b54380 -3c16319e -36d63974 -145507d5 -00000000 -147607d3 -00000000 -3c15bfc3 -26b5c250 -3c16bfc3 -26d6c268 -149607cd -00000000 -14b507cb -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c026374 -344239d2 -0510000c -00000000 -1000000d -00000000 -3c084148 -350853a0 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5c2f4 -10000004 -00000000 -03e02821 -3c036693 -3463d9c0 -0017f821 -24150000 -24160000 -145507ae -00000000 -147607ac -00000000 -3c15bfc3 -26b5c2f4 -3c16bfc3 -26d6c30c -149607a6 -00000000 -14b507a4 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0251b4 -3442161c -0510000c -00000000 -1000000d -00000000 -3c08e745 -35086b0a -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5c390 -10000004 -00000000 -03e02821 -3c03feaa -346318a0 -0017f821 -3c1551b4 -36b5161c -3c16feaa -36d618a0 -14550785 -00000000 -14760783 -00000000 -3c15bfc3 -26b5c390 -3c16bfc3 -26d6c3a8 -1496077d -00000000 -14b5077b -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c026ed7 -34424130 -0510000c -00000000 -1000000d -00000000 -3c08bb74 -3508e538 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5c434 -10000004 -00000000 -03e02821 -3c03984f -34636072 -0017f821 -3c156ed7 -36b54130 -3c16984f -36d66072 -1455075c -00000000 -1476075a -00000000 -3c15bfc3 -26b5c434 -3c16bfc3 -26d6c44c -14960754 -00000000 -14b50752 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02a425 -344243e0 -0510000c -00000000 -1000000d -00000000 -3c0822d3 -350813b0 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5c4d8 -10000004 -00000000 -03e02821 -3c034e7c -3463f014 -0017f821 -24150000 -24160000 -14550735 -00000000 -14760733 -00000000 -3c15bfc3 -26b5c4d8 -3c16bfc3 -26d6c4f0 -1496072d -00000000 -14b5072b -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0280ef -34428300 -0510000c -00000000 -1000000d -00000000 -3c085879 -3508a989 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5c574 -10000004 -00000000 -03e02821 -3c033576 -3463293c -0017f821 -24150000 -24160000 -1455070e -00000000 -1476070c -00000000 -3c15bfc3 -26b5c574 -3c16bfc3 -26d6c58c -14960706 -00000000 -14b50704 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0267f8 -34422b20 -0510000c -00000000 -1000000d -00000000 -3c086dd7 -3508a283 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5c610 -10000004 -00000000 -03e02821 -3c033eed -3463df3c -0017f821 -24150000 -24160000 -145506e7 -00000000 -147606e5 -00000000 -3c15bfc3 -26b5c610 -3c16bfc3 -26d6c628 -149606df -00000000 -14b506dd -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c026b6c -3442d290 -0510000c -00000000 -1000000d -00000000 -3c088c3e -35086232 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5c6ac -10000004 -00000000 -03e02821 -3c033607 -346383ea -0017f821 -3c156b6c -36b5d290 -3c163607 -36d683ea -145506be -00000000 -147606bc -00000000 -3c15bfc3 -26b5c6ac -3c16bfc3 -26d6c6c4 -149606b6 -00000000 -14b506b4 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02caaa -34423fe0 -0510000c -00000000 -1000000d -00000000 -3c089935 -3508c478 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5c750 -10000004 -00000000 -03e02821 -3c03bfbf -346376f0 -0017f821 -3c15caaa -36b53fe0 -3c16bfbf -36d676f0 -14550695 -00000000 -14760693 -00000000 -3c15bfc3 -26b5c750 -3c16bfc3 -26d6c768 -1496068d -00000000 -14b5068b -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02d065 -34428f18 -0510000c -00000000 -1000000d -00000000 -3c08aa40 -3508e800 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5c7f4 -10000004 -00000000 -03e02821 -3c032794 -34637ea4 -0017f821 -3c15d065 -36b58f18 -3c162794 -36d67ea4 -1455066c -00000000 -1476066a -00000000 -3c15bfc3 -26b5c7f4 -3c16bfc3 -26d6c80c -14960664 -00000000 -14b50662 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c022c0a -344279d8 -0510000c -00000000 -1000000d -00000000 -3c0895c5 -35084b0e -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5c898 -10000004 -00000000 -03e02821 -3c03ba26 -34639468 -0017f821 -3c152c0a -36b579d8 -3c16ba26 -36d69468 -14550643 -00000000 -14760641 -00000000 -3c15bfc3 -26b5c898 -3c16bfc3 -26d6c8b0 -1496063b -00000000 -14b50639 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02b70c -34429fb0 -0510000c -00000000 -1000000d -00000000 -3c080c64 -35083508 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5c93c -10000004 -00000000 -03e02821 -3c03fc67 -346398bc -0017f821 -24150000 -24160000 -1455061c -00000000 -1476061a -00000000 -3c15bfc3 -26b5c93c -3c16bfc3 -26d6c954 -14960614 -00000000 -14b50612 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c021bde -34425440 -0510000c -00000000 -1000000d -00000000 -3c087c26 -3508fe64 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5c9d8 -10000004 -00000000 -03e02821 -3c030a02 -3463d616 -0017f821 -24150000 -24160000 -145505f5 -00000000 -147605f3 -00000000 -3c15bfc3 -26b5c9d8 -3c16bfc3 -26d6c9f0 -149605ed -00000000 -14b505eb -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02375d -34423388 -0510000c -00000000 -1000000d -00000000 -3c08fd4d -350812cc -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5ca74 -10000004 -00000000 -03e02821 -3c039317 -346332c2 -0017f821 -3c15375d -36b53388 -3c169317 -36d632c2 -145505cc -00000000 -147605ca -00000000 -3c15bfc3 -26b5ca74 -3c16bfc3 -26d6ca8c -149605c4 -00000000 -14b505c2 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c029a02 -3442b930 -0510000c -00000000 -1000000d -00000000 -3c083bb5 -350816cb -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5cb18 -10000004 -00000000 -03e02821 -3c03bca4 -3463f17c -0017f821 -24150000 -24160000 -145505a5 -00000000 -147605a3 -00000000 -3c15bfc3 -26b5cb18 -3c16bfc3 -26d6cb30 -1496059d -00000000 -14b5059b -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02dc25 -344267e4 -0510000c -00000000 -1000000d -00000000 -3c0872a5 -35083c58 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5cbb4 -10000004 -00000000 -03e02821 -3c037028 -34630859 -0017f821 -24150000 -24160000 -1455057e -00000000 -1476057c -00000000 -3c15bfc3 -26b5cbb4 -3c16bfc3 -26d6cbcc -14960576 -00000000 -14b50574 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02184a -3442c668 -0510000c -00000000 -1000000d -00000000 -3c089911 -35089a2e -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5cc50 -10000004 -00000000 -03e02821 -3c032127 -3463b7d2 -0017f821 -3c15184a -36b5c668 -3c162127 -36d6b7d2 -14550555 -00000000 -14760553 -00000000 -3c15bfc3 -26b5cc50 -3c16bfc3 -26d6cc68 -1496054d -00000000 -14b5054b -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c027d1f -3442992e -0510000c -00000000 -1000000d -00000000 -3c08b446 -3508190a -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5ccf4 -10000004 -00000000 -03e02821 -3c033cde -34632960 -0017f821 -3c157d1f -36b5992e -3c163cde -36d62960 -1455052c -00000000 -1476052a -00000000 -3c15bfc3 -26b5ccf4 -3c16bfc3 -26d6cd0c -14960524 -00000000 -14b50522 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02f3cd -3442f593 -0510000c -00000000 -1000000d -00000000 -3c081b8f -350896bc -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5cd98 -10000004 -00000000 -03e02821 -3c0397e1 -3463fbbc -0017f821 -24150000 -24160000 -14550505 -00000000 -14760503 -00000000 -3c15bfc3 -26b5cd98 -3c16bfc3 -26d6cdb0 -149604fd -00000000 -14b504fb -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02dcdb -3442ab7f -0510000c -00000000 -1000000d -00000000 -3c087891 -350894bf -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5ce34 -10000004 -00000000 -03e02821 -3c031e34 -34631cf8 -0017f821 -24150000 -24160000 -145504de -00000000 -147604dc -00000000 -3c15bfc3 -26b5ce34 -3c16bfc3 -26d6ce4c -149604d6 -00000000 -14b504d4 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02061e -34426658 -0510000c -00000000 -1000000d -00000000 -3c0863c5 -35080b28 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5ced0 -10000004 -00000000 -03e02821 -3c03322f -3463f830 -0017f821 -24150000 -24160000 -145504b7 -00000000 -147604b5 -00000000 -3c15bfc3 -26b5ced0 -3c16bfc3 -26d6cee8 -149604af -00000000 -14b504ad -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02563a -34420440 -0510000c -00000000 -1000000d -00000000 -3c083bc5 -3508a0e0 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5cf6c -10000004 -00000000 -03e02821 -3c030817 -3463b7a8 -0017f821 -24150000 -24160000 -14550490 -00000000 -1476048e -00000000 -3c15bfc3 -26b5cf6c -3c16bfc3 -26d6cf84 -14960488 -00000000 -14b50486 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02e27e -34426888 -0510000c -00000000 -1000000d -00000000 -3c0892c1 -350867f8 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5d008 -10000004 -00000000 -03e02821 -3c034e28 -3463c838 -0017f821 -3c15e27e -36b56888 -3c164e28 -36d6c838 -14550467 -00000000 -14760465 -00000000 -3c15bfc3 -26b5d008 -3c16bfc3 -26d6d020 -1496045f -00000000 -14b5045d -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c023e09 -3442bb40 -0510000c -00000000 -1000000d -00000000 -3c083ee4 -350883a8 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5d0ac -10000004 -00000000 -03e02821 -3c0365b1 -34637d20 -0017f821 -24150000 -24160000 -14550440 -00000000 -1476043e -00000000 -3c15bfc3 -26b5d0ac -3c16bfc3 -26d6d0c4 -14960438 -00000000 -14b50436 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c026edf -344266a4 -0510000c -00000000 -1000000d -00000000 -3c084eaa -35085a80 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5d148 -10000004 -00000000 -03e02821 -3c032726 -34634b04 -0017f821 -24150000 -24160000 -14550419 -00000000 -14760417 -00000000 -3c15bfc3 -26b5d148 -3c16bfc3 -26d6d160 -14960411 -00000000 -14b5040f -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c021664 -34428180 -0510000c -00000000 -1000000d -00000000 -3c08c25a -350894c0 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5d1e4 -10000004 -00000000 -03e02821 -3c03ceff -346349a0 -0017f821 -3c151664 -36b58180 -3c16ceff -36d649a0 -145503f0 -00000000 -147603ee -00000000 -3c15bfc3 -26b5d1e4 -3c16bfc3 -26d6d1fc -149603e8 -00000000 -14b503e6 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02a5b5 -3442a538 -0510000c -00000000 -1000000d -00000000 -3c08178e -350829a0 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5d288 -10000004 -00000000 -03e02821 -3c03c444 -34630224 -0017f821 -24150000 -24160000 -145503c9 -00000000 -147603c7 -00000000 -3c15bfc3 -26b5d288 -3c16bfc3 -26d6d2a0 -149603c1 -00000000 -14b503bf -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02aa83 -3442b7aa -0510000c -00000000 -1000000d -00000000 -3c081946 -3508faac -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5d324 -10000004 -00000000 -03e02821 -3c03c924 -34634bf5 -0017f821 -24150000 -24160000 -145503a2 -00000000 -147603a0 -00000000 -3c15bfc3 -26b5d324 -3c16bfc3 -26d6d33c -1496039a -00000000 -14b50398 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c025479 -3442233d -0510000c -00000000 -1000000d -00000000 -3c088a6e -350827ba -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5d3c0 -10000004 -00000000 -03e02821 -3c030fe5 -34631340 -0017f821 -3c155479 -36b5233d -3c160fe5 -36d61340 -14550379 -00000000 -14760377 -00000000 -3c15bfc3 -26b5d3c0 -3c16bfc3 -26d6d3d8 -14960371 -00000000 -14b5036f -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c024081 -3442010d -0510000c -00000000 -1000000d -00000000 -3c08c1a1 -35087acc -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5d464 -10000004 -00000000 -03e02821 -3c03ff79 -34631604 -0017f821 -3c154081 -36b5010d -3c16ff79 -36d61604 -14550350 -00000000 -1476034e -00000000 -3c15bfc3 -26b5d464 -3c16bfc3 -26d6d47c -14960348 -00000000 -14b50346 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02d701 -3442b72c -0510000c -00000000 -1000000d -00000000 -3c0845e5 -3508dec0 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5d508 -10000004 -00000000 -03e02821 -3c035888 -3463fdd8 -0017f821 -24150000 -24160000 -14550329 -00000000 -14760327 -00000000 -3c15bfc3 -26b5d508 -3c16bfc3 -26d6d520 -14960321 -00000000 -14b5031f -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02f1f9 -344255c0 -0510000c -00000000 -1000000d -00000000 -3c089332 -35086582 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5d5a4 -10000004 -00000000 -03e02821 -3c03cf5e -346355ca -0017f821 -3c15f1f9 -36b555c0 -3c16cf5e -36d655ca -14550300 -00000000 -147602fe -00000000 -3c15bfc3 -26b5d5a4 -3c16bfc3 -26d6d5bc -149602f8 -00000000 -14b502f6 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c020904 -344255b2 -0510000c -00000000 -1000000d -00000000 -3c080092 -35088868 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5d648 -10000004 -00000000 -03e02821 -3c03f5c1 -3463b600 -0017f821 -24150000 -24160000 -145502d9 -00000000 -147602d7 -00000000 -3c15bfc3 -26b5d648 -3c16bfc3 -26d6d660 -149602d1 -00000000 -14b502cf -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c021633 -34422a88 -0510000c -00000000 -1000000d -00000000 -3c08f7cc -3508d1e8 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5d6e4 -10000004 -00000000 -03e02821 -3c035496 -34638884 -0017f821 -3c151633 -36b52a88 -3c165496 -36d68884 -145502b0 -00000000 -147602ae -00000000 -3c15bfc3 -26b5d6e4 -3c16bfc3 -26d6d6fc -149602a8 -00000000 -14b502a6 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02fb8f -344216d5 -0510000c -00000000 -1000000d -00000000 -3c086ec4 -35083ef0 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5d788 -10000004 -00000000 -03e02821 -3c0309b6 -34639d60 -0017f821 -24150000 -24160000 -14550289 -00000000 -14760287 -00000000 -3c15bfc3 -26b5d788 -3c16bfc3 -26d6d7a0 -14960281 -00000000 -14b5027f -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0237da -3442acd7 -0510000c -00000000 -1000000d -00000000 -3c0816c9 -3508ba2e -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5d824 -10000004 -00000000 -03e02821 -3c037986 -3463d400 -0017f821 -24150000 -24160000 -14550262 -00000000 -14760260 -00000000 -3c15bfc3 -26b5d824 -3c16bfc3 -26d6d83c -1496025a -00000000 -14b50258 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02e096 -3442eec2 -0510000c -00000000 -1000000d -00000000 -3c08bae4 -350801b8 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5d8c0 -10000004 -00000000 -03e02821 -3c0315e2 -3463e1e0 -0017f821 -3c15e096 -36b5eec2 -3c1615e2 -36d6e1e0 -14550239 -00000000 -14760237 -00000000 -3c15bfc3 -26b5d8c0 -3c16bfc3 -26d6d8d8 -14960231 -00000000 -14b5022f -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c021fd9 -3442b7a8 -0510000c -00000000 -1000000d -00000000 -3c087a4a -35085eb6 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5d964 -10000004 -00000000 -03e02821 -3c037f6b -34637a00 -0017f821 -24150000 -24160000 -14550212 -00000000 -14760210 -00000000 -3c15bfc3 -26b5d964 -3c16bfc3 -26d6d97c -1496020a -00000000 -14b50208 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c025b45 -34428d34 -0510000c -00000000 -1000000d -00000000 -3c0850d8 -35083460 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5da00 -10000004 -00000000 -03e02821 -3c03b3e5 -3463b6c0 -0017f821 -24150000 -24160000 -145501eb -00000000 -147601e9 -00000000 -3c15bfc3 -26b5da00 -3c16bfc3 -26d6da18 -149601e3 -00000000 -14b501e1 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02e3ef -3442dfde -0510000c -00000000 -1000000d -00000000 -3c0842e7 -3508c900 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5da9c -10000004 -00000000 -03e02821 -3c030d3d -34639b80 -0017f821 -24150000 -24160000 -145501c4 -00000000 -147601c2 -00000000 -3c15bfc3 -26b5da9c -3c16bfc3 -26d6dab4 -149601bc -00000000 -14b501ba -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c027299 -344268e0 -0510000c -00000000 -1000000d -00000000 -3c08f884 -35081282 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5db38 -10000004 -00000000 -03e02821 -3c0316e1 -34633cca -0017f821 -3c157299 -36b568e0 -3c1616e1 -36d63cca -1455019b -00000000 -14760199 -00000000 -3c15bfc3 -26b5db38 -3c16bfc3 -26d6db50 -14960193 -00000000 -14b50191 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02bc44 -34423ce7 -0510000c -00000000 -1000000d -00000000 -3c08a984 -350825f8 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5dbdc -10000004 -00000000 -03e02821 -3c03ae75 -34636fac -0017f821 -3c15bc44 -36b53ce7 -3c16ae75 -36d66fac -14550172 -00000000 -14760170 -00000000 -3c15bfc3 -26b5dbdc -3c16bfc3 -26d6dbf4 -1496016a -00000000 -14b50168 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c021afd -3442cbfa -0510000c -00000000 -1000000d -00000000 -3c086c1f -35080d47 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5dc80 -10000004 -00000000 -03e02821 -3c039ccd -3463e33e -0017f821 -24150000 -24160000 -1455014b -00000000 -14760149 -00000000 -3c15bfc3 -26b5dc80 -3c16bfc3 -26d6dc98 -14960143 -00000000 -14b50141 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c028954 -3442be60 -0510000c -00000000 -1000000d -00000000 -3c08fcf9 -350850ca -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5dd1c -10000004 -00000000 -03e02821 -3c0382ec -34632818 -0017f821 -3c158954 -36b5be60 -3c1682ec -36d62818 -14550122 -00000000 -14760120 -00000000 -3c15bfc3 -26b5dd1c -3c16bfc3 -26d6dd34 -1496011a -00000000 -14b50118 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02b115 -34421634 -0510000c -00000000 -1000000d -00000000 -3c0874f5 -350824b2 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5ddc0 -10000004 -00000000 -03e02821 -3c03a1cb -34630328 -0017f821 -24150000 -24160000 -145500fb -00000000 -147600f9 -00000000 -3c15bfc3 -26b5ddc0 -3c16bfc3 -26d6ddd8 -149600f3 -00000000 -14b500f1 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c022a1a -34423688 -0510000c -00000000 -1000000d -00000000 -3c08c9bc -3508a1a8 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5de5c -10000004 -00000000 -03e02821 -3c03ea2b -3463b980 -0017f821 -3c152a1a -36b53688 -3c16ea2b -36d6b980 -145500d2 -00000000 -147600d0 -00000000 -3c15bfc3 -26b5de5c -3c16bfc3 -26d6de74 -149600ca -00000000 -14b500c8 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c025604 -344209a8 -0510000c -00000000 -1000000d -00000000 -3c084f8b -35081162 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5df00 -10000004 -00000000 -03e02821 -3c035df8 -34633060 -0017f821 -24150000 -24160000 -145500ab -00000000 -147600a9 -00000000 -3c15bfc3 -26b5df00 -3c16bfc3 -26d6df18 -149600a3 -00000000 -14b500a1 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02ff65 -34425f88 -0510000c -00000000 -1000000d -00000000 -3c0800db -3508a000 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5df9c -10000004 -00000000 -03e02821 -3c03e7eb -34631ef4 -0017f821 -24150000 -24160000 -14550084 -00000000 -14760082 -00000000 -3c15bfc3 -26b5df9c -3c16bfc3 -26d6dfb4 -1496007c -00000000 -14b5007a -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c0292b6 -34424a0c -0510000c -00000000 -1000000d -00000000 -3c08a199 -3508561e -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5e038 -10000004 -00000000 -03e02821 -3c03e866 -34639a08 -0017f821 -3c1592b6 -36b54a0c -3c16e866 -36d69a08 -1455005b -00000000 -14760059 -00000000 -3c15bfc3 -26b5e038 -3c16bfc3 -26d6e050 -14960053 -00000000 -14b50051 -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02d7a5 -34426490 -0510000c -00000000 -1000000d -00000000 -3c0873ee -35088202 -0510fff6 -00000000 -03e02021 -3c05bfc3 -24a5e0dc -10000004 -00000000 -03e02821 -3c037951 -34638f38 -0017f821 -24150000 -24160000 -14550034 -00000000 -14760032 -00000000 -3c15bfc3 -26b5e0dc -3c16bfc3 -26d6e0f4 -1496002c -00000000 -14b5002a -00000000 -001fb821 -24020000 -24030000 -10000008 -00000000 -03e02021 -3c02afba -3442c4d4 -0510000b -00000000 -1000000c -00000000 -24080000 -0510fff7 -00000000 -03e02021 -3c05bfc3 -24a5e178 -10000004 -00000000 -03e02821 -3c03f06f -3463b6ae -0017f821 -24150000 -24160000 -1455000e -00000000 -1476000c -00000000 -3c15bfc3 -26b5e178 -3c16bfc3 -26d6e18c -14960006 -00000000 -14b50004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -26100001 -24120000 -3c095184 -35292560 -3c08800d -35082bc4 -24032560 -ad09127c -25040004 -2505fff8 -ac84127c -aca5127c -8502127c -8c85127c -8ca4127c -8ca6127c -144306fe -00000000 -3c092516 -3529116e -3c08800d -35082220 -2403116e -3c010001 -00280821 -ac29a890 -25040004 -2505fff8 -3c010001 -00240821 -ac24a890 -3c010001 -00250821 -ac25a890 -3c020001 -00481021 -8442a890 -3c050001 -00a42821 -8ca5a890 -3c040001 -00852021 -8c84a890 -3c060001 -00c53021 -8cc6a890 -144306e0 -00000000 -3c094932 -3529330c -3c08800d -35083810 -24034932 -3c010001 -00280821 -ac298524 -25040004 -2505fff8 -3c010001 -00240821 -ac248524 -3c010001 -00250821 -ac258524 -3c020001 -00481021 -84428526 -3c050001 -00a42821 -8ca58524 -3c040001 -00852021 -8c848524 -3c060001 -00c53021 -8cc68524 -144306c2 -00000000 -3c09be4d -35299ac8 -3c08800d -3508ac60 -2403be4d -ad090090 -25040004 -2505fff8 -ac840090 -aca50090 -85020092 -8c850090 -8ca40090 -8ca60090 -144306b2 -00000000 -3c095f0c -35290856 -3c08800d -35081800 -24030856 -3c010001 -00280821 -ac298964 -25040004 -2505fff8 -3c010001 -00240821 -ac248964 -3c010001 -00250821 -ac258964 -3c020001 -00481021 -84428964 -3c050001 -00a42821 -8ca58964 -3c040001 -00852021 -8c848964 -3c060001 -00c53021 -8cc68964 -14430694 -00000000 -3c09bfa5 -3529bc80 -3c08800d -35089ca0 -2403bc80 -ad092950 -25040004 -2505fff8 -ac842950 -aca52950 -85022950 -8c852950 -8ca42950 -8ca62950 -14430684 -00000000 -3c0967b0 -3529ca80 -3c08800d -3508b258 -2403ca80 -ad092f74 -25040004 -2505fff8 -ac842f74 -aca52f74 -85022f74 -8c852f74 -8ca42f74 -8ca62f74 -14430674 -00000000 -3c09b0c4 -3529ee88 -3c08800d -35080a08 -2403ee88 -ad0929d4 -25040004 -2505fff8 -ac8429d4 -aca529d4 -850229d4 -8c8529d4 -8ca429d4 -8ca629d4 -14430664 -00000000 -3c09a28f -3529bedc -3c08800d -3508130c -2403bedc -3c010001 -00280821 -ac29cf28 -25040004 -2505fff8 -3c010001 -00240821 -ac24cf28 -3c010001 -00250821 -ac25cf28 -3c020001 -00481021 -8442cf28 -3c050001 -00a42821 -8ca5cf28 -3c040001 -00852021 -8c84cf28 -3c060001 -00c53021 -8cc6cf28 -14430646 -00000000 -3c090158 -35299400 -3c08800d -35083568 -24030158 -3c010001 -00280821 -ac299f34 -25040004 -2505fff8 -3c010001 -00240821 -ac249f34 -3c010001 -00250821 -ac259f34 -3c020001 -00481021 -84429f36 -3c050001 -00a42821 -8ca59f34 -3c040001 -00852021 -8c849f34 -3c060001 -00c53021 -8cc69f34 -14430628 -00000000 -3c092048 -35293e02 -3c08800d -3508d600 -24033e02 -ad091e7c -25040004 -2505fff8 -ac841e7c -aca51e7c -85021e7c -8c851e7c -8ca41e7c -8ca61e7c -14430618 -00000000 -3c096171 -35298b00 -3c08800d -35088550 -24038b00 -ad0924e0 -25040004 -2505fff8 -ac8424e0 -aca524e0 -850224e0 -8c8524e0 -8ca424e0 -8ca624e0 -14430608 -00000000 -3c09b204 -35294740 -3c08800d -35081a30 -24034740 -ad096d88 -25040004 -2505fff8 -ac846d88 -aca56d88 -85026d88 -8c856d88 -8ca46d88 -8ca66d88 -144305f8 -00000000 -3c096dbe -352993b6 -3c08800d -35082a08 -240393b6 -ad0913e0 -25040004 -2505fff8 -ac8413e0 -aca513e0 -850213e0 -8c8513e0 -8ca413e0 -8ca613e0 -144305e8 -00000000 -3c09e96e -35297db0 -3c08800d -350825e8 -2403e96e -3c010001 -00280821 -ac29b508 -25040004 -2505fff8 -3c010001 -00240821 -ac24b508 -3c010001 -00250821 -ac25b508 -3c020001 -00481021 -8442b50a -3c050001 -00a42821 -8ca5b508 -3c040001 -00852021 -8c84b508 -3c060001 -00c53021 -8cc6b508 -144305ca -00000000 -3c096737 -3529a118 -3c08800d -35084f78 -24036737 -ad094fac -25040004 -2505fff8 -ac844fac -aca54fac -85024fae -8c854fac -8ca44fac -8ca64fac -144305ba -00000000 -3c092fec -35297a40 -3c08800d -35085228 -24032fec -3c010001 -00280821 -ac29a464 -25040004 -2505fff8 -3c010001 -00240821 -ac24a464 -3c010001 -00250821 -ac25a464 -3c020001 -00481021 -8442a466 -3c050001 -00a42821 -8ca5a464 -3c040001 -00852021 -8c84a464 -3c060001 -00c53021 -8cc6a464 -1443059c -00000000 -3c095805 -3529df3d -3c08800d -3508e870 -2403df3d -ad090454 -25040004 -2505fff8 -ac840454 -aca50454 -85020454 -8c850454 -8ca40454 -8ca60454 -1443058c -00000000 -3c094ea0 -3529d20c -3c08800d -35082194 -2403d20c -3c010001 -00280821 -ac29d7c8 -25040004 -2505fff8 -3c010001 -00240821 -ac24d7c8 -3c010001 -00250821 -ac25d7c8 -3c020001 -00481021 -8442d7c8 -3c050001 -00a42821 -8ca5d7c8 -3c040001 -00852021 -8c84d7c8 -3c060001 -00c53021 -8cc6d7c8 -1443056e -00000000 -3c097bf8 -3529d942 -3c08800d -35085d50 -2403d942 -3c010001 -00280821 -ac29a000 -25040004 -2505fff8 -3c010001 -00240821 -ac24a000 -3c010001 -00250821 -ac25a000 -3c020001 -00481021 -8442a000 -3c050001 -00a42821 -8ca5a000 -3c040001 -00852021 -8c84a000 -3c060001 -00c53021 -8cc6a000 -14430550 -00000000 -3c0937ee -3529910e -3c08800d -350897f0 -2403910e -ad090174 -25040004 -2505fff8 -ac840174 -aca50174 -85020174 -8c850174 -8ca40174 -8ca60174 -14430540 -00000000 -3c090259 -35293920 -3c08800d -350823b8 -24033920 -3c010001 -00280821 -ac29b00c -25040004 -2505fff8 -3c010001 -00240821 -ac24b00c -3c010001 -00250821 -ac25b00c -3c020001 -00481021 -8442b00c -3c050001 -00a42821 -8ca5b00c -3c040001 -00852021 -8c84b00c -3c060001 -00c53021 -8cc6b00c -14430522 -00000000 -3c09b7e2 -35291268 -3c08800d -3508cba8 -24031268 -ad09221c -25040004 -2505fff8 -ac84221c -aca5221c -8502221c -8c85221c -8ca4221c -8ca6221c -14430512 -00000000 -3c090074 -3529b9d0 -3c08800d -350817a8 -2403b9d0 -3c010001 -00280821 -ac29c28c -25040004 -2505fff8 -3c010001 -00240821 -ac24c28c -3c010001 -00250821 -ac25c28c -3c020001 -00481021 -8442c28c -3c050001 -00a42821 -8ca5c28c -3c040001 -00852021 -8c84c28c -3c060001 -00c53021 -8cc6c28c -144304f4 -00000000 -3c091326 -3529e800 -3c08800d -35080848 -24031326 -3c010001 -00280821 -ac29816c -25040004 -2505fff8 -3c010001 -00240821 -ac24816c -3c010001 -00250821 -ac25816c -3c020001 -00481021 -8442816e -3c050001 -00a42821 -8ca5816c -3c040001 -00852021 -8c84816c -3c060001 -00c53021 -8cc6816c -144304d6 -00000000 -3c09b42e -35295a40 -3c08800d -35083b34 -24035a40 -ad0914d8 -25040004 -2505fff8 -ac8414d8 -aca514d8 -850214d8 -8c8514d8 -8ca414d8 -8ca614d8 -144304c6 -00000000 -3c09783e -35290a00 -3c08800d -35087838 -24030a00 -ad092c3c -25040004 -2505fff8 -ac842c3c -aca52c3c -85022c3c -8c852c3c -8ca42c3c -8ca62c3c -144304b6 -00000000 -3c09d694 -35292958 -3c08800d -350853a8 -2403d694 -ad095648 -25040004 -2505fff8 -ac845648 -aca55648 -8502564a -8c855648 -8ca45648 -8ca65648 -144304a6 -00000000 -3c099d23 -35297d60 -3c08800d -35080600 -24037d60 -ad09590c -25040004 -2505fff8 -ac84590c -aca5590c -8502590c -8c85590c -8ca4590c -8ca6590c -14430496 -00000000 -3c09098f -35292730 -3c08800d -35081b58 -24032730 -3c010001 -00280821 -ac2988a8 -25040004 -2505fff8 -3c010001 -00240821 -ac2488a8 -3c010001 -00250821 -ac2588a8 -3c020001 -00481021 -844288a8 -3c050001 -00a42821 -8ca588a8 -3c040001 -00852021 -8c8488a8 -3c060001 -00c53021 -8cc688a8 -14430478 -00000000 -3c092ab8 -3529ce90 -3c08800d -350831ec -2403ce90 -ad0938d0 -25040004 -2505fff8 -ac8438d0 -aca538d0 -850238d0 -8c8538d0 -8ca438d0 -8ca638d0 -14430468 -00000000 -3c0937fd -3529bec8 -3c08800d -35084890 -240337fd -ad095bd0 -25040004 -2505fff8 -ac845bd0 -aca55bd0 -85025bd2 -8c855bd0 -8ca45bd0 -8ca65bd0 -14430458 -00000000 -3c0934fc -352933ac -3c08800d -35085448 -240334fc -ad0916d0 -25040004 -2505fff8 -ac8416d0 -aca516d0 -850216d2 -8c8516d0 -8ca416d0 -8ca616d0 -14430448 -00000000 -3c09dcc1 -352944c8 -3c08800d -35086940 -240344c8 -ad09673c -25040004 -2505fff8 -ac84673c -aca5673c -8502673c -8c85673c -8ca4673c -8ca6673c -14430438 -00000000 -3c093354 -3529e5b4 -3c08800d -35085834 -24033354 -ad093924 -25040004 -2505fff8 -ac843924 -aca53924 -85023926 -8c853924 -8ca43924 -8ca63924 -14430428 -00000000 -3c09b5e7 -3529da8e -3c08800d -3508cc78 -2403da8e -ad090800 -25040004 -2505fff8 -ac840800 -aca50800 -85020800 -8c850800 -8ca40800 -8ca60800 -14430418 -00000000 -3c098c87 -3529a650 -3c08800d -35082d9c -2403a650 -ad096440 -25040004 -2505fff8 -ac846440 -aca56440 -85026440 -8c856440 -8ca46440 -8ca66440 -14430408 -00000000 -3c093df2 -35299bc0 -3c08800d -24033df2 -3c010001 -00280821 -ac29834c -25040004 -2505fff8 -3c010001 -00240821 -ac24834c -3c010001 -00250821 -ac25834c -3c020001 -00481021 -8442834e -3c050001 -00a42821 -8ca5834c -3c040001 -00852021 -8c84834c -3c060001 -00c53021 -8cc6834c -144303eb -00000000 -3c09975c -35293a5c -3c08800d -24033a5c -3c010001 -00280821 -ac29e8cc -25040004 -2505fff8 -3c010001 -00240821 -ac24e8cc -3c010001 -00250821 -ac25e8cc -3c020001 -00481021 -8442e8cc -3c050001 -00a42821 -8ca5e8cc -3c040001 -00852021 -8c84e8cc -3c060001 -00c53021 -8cc6e8cc -144303ce -00000000 -3c0929ab -352953d6 -3c08800d -240353d6 -3c010001 -00280821 -ac2989e8 -25040004 -2505fff8 -3c010001 -00240821 -ac2489e8 -3c010001 -00250821 -ac2589e8 -3c020001 -00481021 -844289e8 -3c050001 -00a42821 -8ca589e8 -3c040001 -00852021 -8c8489e8 -3c060001 -00c53021 -8cc689e8 -144303b1 -00000000 -3c09763b -35292600 -3c08800d -24032600 -ad093e7c -25040004 -2505fff8 -ac843e7c -aca53e7c -85023e7c -8c853e7c -8ca43e7c -8ca63e7c -144303a2 -00000000 -3c09774e -3529d370 -3c08800d -2403d370 -3c010001 -00280821 -ac29a760 -25040004 -2505fff8 -3c010001 -00240821 -ac24a760 -3c010001 -00250821 -ac25a760 -3c020001 -00481021 -8442a760 -3c050001 -00a42821 -8ca5a760 -3c040001 -00852021 -8c84a760 -3c060001 -00c53021 -8cc6a760 -14430385 -00000000 -3c098e24 -3529d680 -3c08800d -2403d680 -3c010001 -00280821 -ac29ffe0 -25040004 -2505fff8 -3c010001 -00240821 -ac24ffe0 -3c010001 -00250821 -ac25ffe0 -3c020001 -00481021 -8442ffe0 -3c050001 -00a42821 -8ca5ffe0 -3c040001 -00852021 -8c84ffe0 -3c060001 -00c53021 -8cc6ffe0 -14430368 -00000000 -3c09fe39 -352936cb -3c08800d -240336cb -ad0917b0 -25040004 -2505fff8 -ac8417b0 -aca517b0 -850217b0 -8c8517b0 -8ca417b0 -8ca617b0 -14430359 -00000000 -3c090b89 -35292a40 -3c08800d -24030b89 -3c010001 -00280821 -ac29b038 -25040004 -2505fff8 -3c010001 -00240821 -ac24b038 -3c010001 -00250821 -ac25b038 -3c020001 -00481021 -8442b03a -3c050001 -00a42821 -8ca5b038 -3c040001 -00852021 -8c84b038 -3c060001 -00c53021 -8cc6b038 -1443033c -00000000 -3c09d92f -3529e108 -3c08800d -2403e108 -ad095d48 -25040004 -2505fff8 -ac845d48 -aca55d48 -85025d48 -8c855d48 -8ca45d48 -8ca65d48 -1443032d -00000000 -3c094c4b -3529c954 -3c08800d -2403c954 -ad092258 -25040004 -2505fff8 -ac842258 -aca52258 -85022258 -8c852258 -8ca42258 -8ca62258 -1443031e -00000000 -3c09b7ba -3529ba40 -3c08800d -2403b7ba -3c010001 -00280821 -ac29a104 -25040004 -2505fff8 -3c010001 -00240821 -ac24a104 -3c010001 -00250821 -ac25a104 -3c020001 -00481021 -8442a106 -3c050001 -00a42821 -8ca5a104 -3c040001 -00852021 -8c84a104 -3c060001 -00c53021 -8cc6a104 -14430301 -00000000 -3c098a75 -35294a34 -3c08800d -24034a34 -ad0953a8 -25040004 -2505fff8 -ac8453a8 -aca553a8 -850253a8 -8c8553a8 -8ca453a8 -8ca653a8 -144302f2 -00000000 -3c09062c -35290990 -3c08800d -24030990 -3c010001 -00280821 -ac29b7c0 -25040004 -2505fff8 -3c010001 -00240821 -ac24b7c0 -3c010001 -00250821 -ac25b7c0 -3c020001 -00481021 -8442b7c0 -3c050001 -00a42821 -8ca5b7c0 -3c040001 -00852021 -8c84b7c0 -3c060001 -00c53021 -8cc6b7c0 -144302d5 -00000000 -3c09f3c0 -3529fc50 -3c08800d -2403f3c0 -3c010001 -00280821 -ac29e690 -25040004 -2505fff8 -3c010001 -00240821 -ac24e690 -3c010001 -00250821 -ac25e690 -3c020001 -00481021 -8442e692 -3c050001 -00a42821 -8ca5e690 -3c040001 -00852021 -8c84e690 -3c060001 -00c53021 -8cc6e690 -144302b8 -00000000 -3c09941e -35291b70 -3c08800d -24031b70 -3c010001 -00280821 -ac299544 -25040004 -2505fff8 -3c010001 -00240821 -ac249544 -3c010001 -00250821 -ac259544 -3c020001 -00481021 -84429544 -3c050001 -00a42821 -8ca59544 -3c040001 -00852021 -8c849544 -3c060001 -00c53021 -8cc69544 -1443029b -00000000 -3c0906a8 -3529f600 -3c08800d -240306a8 -3c010001 -00280821 -ac29c14c -25040004 -2505fff8 -3c010001 -00240821 -ac24c14c -3c010001 -00250821 -ac25c14c -3c020001 -00481021 -8442c14e -3c050001 -00a42821 -8ca5c14c -3c040001 -00852021 -8c84c14c -3c060001 -00c53021 -8cc6c14c -1443027e -00000000 -3c09f0c9 -3529f8c0 -3c08800d -2403f0c9 -ad094154 -25040004 -2505fff8 -ac844154 -aca54154 -85024156 -8c854154 -8ca44154 -8ca64154 -1443026f -00000000 -3c096d67 -3529df7c -3c08800d -24036d67 -ad091ce4 -25040004 -2505fff8 -ac841ce4 -aca51ce4 -85021ce6 -8c851ce4 -8ca41ce4 -8ca61ce4 -14430260 -00000000 -3c097b5c -35298c40 -3c08800d -24038c40 -3c010001 -00280821 -ac29a170 -25040004 -2505fff8 -3c010001 -00240821 -ac24a170 -3c010001 -00250821 -ac25a170 -3c020001 -00481021 -8442a170 -3c050001 -00a42821 -8ca5a170 -3c040001 -00852021 -8c84a170 -3c060001 -00c53021 -8cc6a170 -14430243 -00000000 -3c09a01d -352988d6 -3c08800d -2403a01d -3c010001 -00280821 -ac29f234 -25040004 -2505fff8 -3c010001 -00240821 -ac24f234 -3c010001 -00250821 -ac25f234 -3c020001 -00481021 -8442f236 -3c050001 -00a42821 -8ca5f234 -3c040001 -00852021 -8c84f234 -3c060001 -00c53021 -8cc6f234 -14430226 -00000000 -3c09bb91 -3529715e -3c08800d -2403bb91 -3c010001 -00280821 -ac29ea5c -25040004 -2505fff8 -3c010001 -00240821 -ac24ea5c -3c010001 -00250821 -ac25ea5c -3c020001 -00481021 -8442ea5e -3c050001 -00a42821 -8ca5ea5c -3c040001 -00852021 -8c84ea5c -3c060001 -00c53021 -8cc6ea5c -14430209 -00000000 -3c09a208 -35296268 -3c08800d -24036268 -3c010001 -00280821 -ac29ae6c -25040004 -2505fff8 -3c010001 -00240821 -ac24ae6c -3c010001 -00250821 -ac25ae6c -3c020001 -00481021 -8442ae6c -3c050001 -00a42821 -8ca5ae6c -3c040001 -00852021 -8c84ae6c -3c060001 -00c53021 -8cc6ae6c -144301ec -00000000 -3c09c16e -35297fd2 -3c08800d -24037fd2 -ad0910e4 -25040004 -2505fff8 -ac8410e4 -aca510e4 -850210e4 -8c8510e4 -8ca410e4 -8ca610e4 -144301dd -00000000 -3c09f26f -35290540 -3c08800d -24030540 -ad097fb8 -25040004 -2505fff8 -ac847fb8 -aca57fb8 -85027fb8 -8c857fb8 -8ca47fb8 -8ca67fb8 -144301ce -00000000 -3c095df5 -3529b227 -3c08800d -24035df5 -ad092b54 -25040004 -2505fff8 -ac842b54 -aca52b54 -85022b56 -8c852b54 -8ca42b54 -8ca62b54 -144301bf -00000000 -3c0917cb -35292286 -3c08800d -24032286 -3c010001 -00280821 -ac29a610 -25040004 -2505fff8 -3c010001 -00240821 -ac24a610 -3c010001 -00250821 -ac25a610 -3c020001 -00481021 -8442a610 -3c050001 -00a42821 -8ca5a610 -3c040001 -00852021 -8c84a610 -3c060001 -00c53021 -8cc6a610 -144301a2 -00000000 -3c09cc5b -35292bee -3c08800d -2403cc5b -3c010001 -00280821 -ac29ba30 -25040004 -2505fff8 -3c010001 -00240821 -ac24ba30 -3c010001 -00250821 -ac25ba30 -3c020001 -00481021 -8442ba32 -3c050001 -00a42821 -8ca5ba30 -3c040001 -00852021 -8c84ba30 -3c060001 -00c53021 -8cc6ba30 -14430185 -00000000 -3c09f148 -3529bba0 -3c08800d -2403f148 -3c010001 -00280821 -ac29a0d0 -25040004 -2505fff8 -3c010001 -00240821 -ac24a0d0 -3c010001 -00250821 -ac25a0d0 -3c020001 -00481021 -8442a0d2 -3c050001 -00a42821 -8ca5a0d0 -3c040001 -00852021 -8c84a0d0 -3c060001 -00c53021 -8cc6a0d0 -14430168 -00000000 -3c093377 -352925a6 -3c08800d -24033377 -ad09762c -25040004 -2505fff8 -ac84762c -aca5762c -8502762e -8c85762c -8ca4762c -8ca6762c -14430159 -00000000 -3c092982 -3529116c -3c08800d -2403116c -3c010001 -00280821 -ac29b980 -25040004 -2505fff8 -3c010001 -00240821 -ac24b980 -3c010001 -00250821 -ac25b980 -3c020001 -00481021 -8442b980 -3c050001 -00a42821 -8ca5b980 -3c040001 -00852021 -8c84b980 -3c060001 -00c53021 -8cc6b980 -1443013c -00000000 -3c09f335 -3529ae26 -3c08800d -2403ae26 -3c010001 -00280821 -ac29de14 -25040004 -2505fff8 -3c010001 -00240821 -ac24de14 -3c010001 -00250821 -ac25de14 -3c020001 -00481021 -8442de14 -3c050001 -00a42821 -8ca5de14 -3c040001 -00852021 -8c84de14 -3c060001 -00c53021 -8cc6de14 -1443011f -00000000 -3c091cea -35293011 -3c08800d -24033011 -ad094610 -25040004 -2505fff8 -ac844610 -aca54610 -85024610 -8c854610 -8ca44610 -8ca64610 -14430110 -00000000 -3c095288 -3529a4be -3c08800d -2403a4be -ad0920e0 -25040004 -2505fff8 -ac8420e0 -aca520e0 -850220e0 -8c8520e0 -8ca420e0 -8ca620e0 -14430101 -00000000 -3c09aba5 -35298c80 -3c08800d -24038c80 -3c010001 -00280821 -ac29cecc -25040004 -2505fff8 -3c010001 -00240821 -ac24cecc -3c010001 -00250821 -ac25cecc -3c020001 -00481021 -8442cecc -3c050001 -00a42821 -8ca5cecc -3c040001 -00852021 -8c84cecc -3c060001 -00c53021 -8cc6cecc -144300e4 -00000000 -3c098780 -352918c0 -3c08800d -240318c0 -ad091a08 -25040004 -2505fff8 -ac841a08 -aca51a08 -85021a08 -8c851a08 -8ca41a08 -8ca61a08 -144300d5 -00000000 -3c09dcfe -35297908 -3c08800d -2403dcfe -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -85020002 -8c850000 -8ca40000 -8ca60000 -144300c6 -00000000 -3c09ca7e -35292534 -3c08800d -24032534 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -85020000 -8c850000 -8ca40000 -8ca60000 -144300b7 -00000000 -3c093a5f -35295000 -3c08800d -24035000 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -85020000 -8c850000 -8ca40000 -8ca60000 -144300a8 -00000000 -3c09c087 -3529931c -3c08800d -2403931c -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -85020000 -8c850000 -8ca40000 -8ca60000 -14430099 -00000000 -3c090352 -3529c2b4 -3c08800d -24030352 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -85020002 -8c850000 -8ca40000 -8ca60000 -1443008a -00000000 -3c096742 -352936b0 -3c08800d -240336b0 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -85020000 -8c850000 -8ca40000 -8ca60000 -1443007b -00000000 -3c09b800 -35298adc -3c08800d -2403b800 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -85020002 -8c850000 -8ca40000 -8ca60000 -1443006c -00000000 -3c099368 -3529c576 -3c08800d -2403c576 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -85020000 -8c850000 -8ca40000 -8ca60000 -1443005d -00000000 -3c09fba1 -3529ce40 -3c08800d -2403ce40 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -85020000 -8c850000 -8ca40000 -8ca60000 -1443004e -00000000 -3c09585c -35295e30 -3c08800d -24035e30 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -85020000 -8c850000 -8ca40000 -8ca60000 -1443003f -00000000 -3c099915 -3529f89c -3c08800d -2403f89c -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -85020000 -8c850000 -8ca40000 -8ca60000 -14430030 -00000000 -3c098aef -3529a220 -3c08800d -24038aef -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -85020002 -8c850000 -8ca40000 -8ca60000 -14430021 -00000000 -3c0942cc -3529ca62 -3c08800d -2403ca62 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -85020000 -8c850000 -8ca40000 -8ca60000 -14430012 -00000000 -24090000 -3c08800d -24030000 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -85020000 -8c850000 -8ca40000 -8ca60000 -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -24120000 -3c0ae15f -354a8848 -3c090e1a -35293600 -3c08800d -350852a4 -3c033600 -34638848 -ad0a3adc -a5093ade -25040004 -2505fffc -ac843adc -aca53adc -8d023adc -8ca43adc -8c853adc -8ca63adc -14430999 -00000000 -3c0a0410 -354a5cf0 -3c09b64d -35295300 -3c08800d -35083f6c -3c035300 -34635cf0 -ad0a1568 -a509156a -25040004 -2505fffc -ac841568 -aca51568 -8d021568 -8ca41568 -8c851568 -8ca61568 -14430985 -00000000 -3c0ad187 -354abd18 -3c09a1cf -3529708e -3c08800d -3508b7a0 -3c03d187 -3463708e -ad0a0bf4 -a5090bf4 -25040004 -2505fffc -ac840bf4 -aca50bf4 -8d020bf4 -8ca40bf4 -8c850bf4 -8ca60bf4 -14430971 -00000000 -3c0ab5ab -354acbf4 -3c09ee02 -3529bbc2 -3c08800d -35086188 -3c03b5ab -3463bbc2 -ad0a2e44 -a5092e44 -25040004 -2505fffc -ac842e44 -aca52e44 -8d022e44 -8ca42e44 -8c852e44 -8ca62e44 -1443095d -00000000 -3c0a6b04 -354abf60 -3c093069 -352960f0 -3c08800d -35088d40 -3c036b04 -346360f0 -ad0a6580 -a5096580 -25040004 -2505fffc -ac846580 -aca56580 -8d026580 -8ca46580 -8c856580 -8ca66580 -14430949 -00000000 -3c0a2532 -354ad240 -3c09fe00 -3529ebf6 -3c08800d -35087090 -3c03ebf6 -3463d240 -ad0a2084 -a5092086 -25040004 -2505fffc -ac842084 -aca52084 -8d022084 -8ca42084 -8c852084 -8ca62084 -14430935 -00000000 -3c0a2b61 -354aec90 -3c0928bd -3529e000 -3c08800d -350824e0 -3c03e000 -3463ec90 -ad0a24d4 -a50924d6 -25040004 -2505fffc -ac8424d4 -aca524d4 -8d0224d4 -8ca424d4 -8c8524d4 -8ca624d4 -14430921 -00000000 -3c0aa52d -354ae360 -3c09f569 -35299820 -3c08800d -35083b4c -3c03a52d -34639820 -ad0a5e50 -a5095e50 -25040004 -2505fffc -ac845e50 -aca55e50 -8d025e50 -8ca45e50 -8c855e50 -8ca65e50 -1443090d -00000000 -3c0a7978 -354aaff8 -3c09a69f -35293ca0 -3c08800d -35082968 -3c037978 -34633ca0 -ad0a5364 -a5095364 -25040004 -2505fffc -ac845364 -aca55364 -8d025364 -8ca45364 -8c855364 -8ca65364 -144308f9 -00000000 -3c0ac4dd -354ac7df -3c090a66 -3529bf0c -3c08800d -3508ad70 -3c03c4dd -3463bf0c -ad0a02bc -a50902bc -25040004 -2505fffc -ac8402bc -aca502bc -8d0202bc -8ca402bc -8c8502bc -8ca602bc -144308e5 -00000000 -3c0ad6ef -354a145e -3c0927d4 -3529869c -3c08800d -35081500 -3c03869c -3463145e -ad0a48b4 -a50948b6 -25040004 -2505fffc -ac8448b4 -aca548b4 -8d0248b4 -8ca448b4 -8c8548b4 -8ca648b4 -144308d1 -00000000 -3c0ae57c -354a6800 -3c09a1fc -35296927 -3c08800d -35082f30 -3c03e57c -34636927 -ad0a693c -a509693c -25040004 -2505fffc -ac84693c -aca5693c -8d02693c -8ca4693c -8c85693c -8ca6693c -144308bd -00000000 -3c0aa645 -354a0915 -3c094c8f -3529b6e6 -3c08800d -35082728 -3c03a645 -3463b6e6 -ad0a22b8 -a50922b8 -25040004 -2505fffc -ac8422b8 -aca522b8 -8d0222b8 -8ca422b8 -8c8522b8 -8ca622b8 -144308a9 -00000000 -3c0a3937 -354a8cfc -3c09ec7b -35292b18 -3c08800d -3508e270 -3c033937 -34632b18 -ad0a05f4 -a50905f4 -25040004 -2505fffc -ac8405f4 -aca505f4 -8d0205f4 -8ca405f4 -8c8505f4 -8ca605f4 -14430895 -00000000 -3c0a4171 -354ab083 -3c0958c1 -3529d2c8 -3c08800d -35083098 -3c034171 -3463d2c8 -ad0a004c -a509004c -25040004 -2505fffc -ac84004c -aca5004c -8d02004c -8ca4004c -8c85004c -8ca6004c -14430881 -00000000 -3c0a7616 -354a56b0 -3c0902f5 -35293f68 -3c08800d -35083c40 -3c037616 -34633f68 -3c010001 -00280821 -ac2a85dc -3c010001 -00280821 -a42985dc -25040004 -2505fffc -3c010001 -00240821 -ac2485dc -3c010001 -00250821 -ac2585dc -3c020001 -00481021 -8c4285dc -3c040001 -00852021 -8c8485dc -3c050001 -00a42821 -8ca585dc -3c060001 -00c53021 -8cc685dc -1443085d -00000000 -3c0ae249 -354aae52 -3c098d75 -3529b188 -3c08800d -35080a20 -3c03b188 -3463ae52 -3c010001 -00280821 -ac2ad0d8 -3c010001 -00280821 -a429d0da -25040004 -2505fffc -3c010001 -00240821 -ac24d0d8 -3c010001 -00250821 -ac25d0d8 -3c020001 -00481021 -8c42d0d8 -3c040001 -00852021 -8c84d0d8 -3c050001 -00a42821 -8ca5d0d8 -3c060001 -00c53021 -8cc6d0d8 -14430839 -00000000 -3c0aaa82 -354a73e0 -3c094ad4 -35294d00 -3c08800d -35089cf0 -3c03aa82 -34634d00 -ad0a3ecc -a5093ecc -25040004 -2505fffc -ac843ecc -aca53ecc -8d023ecc -8ca43ecc -8c853ecc -8ca63ecc -14430825 -00000000 -3c0a98dd -354a412e -3c09c3e1 -3529f538 -3c08800d -350833d4 -3c0398dd -3463f538 -ad0a6888 -a5096888 -25040004 -2505fffc -ac846888 -aca56888 -8d026888 -8ca46888 -8c856888 -8ca66888 -14430811 -00000000 -3c0af705 -354a1708 -3c092612 -3529cae7 -3c08800d -3508910c -3c03cae7 -34631708 -ad0a6588 -a509658a -25040004 -2505fffc -ac846588 -aca56588 -8d026588 -8ca46588 -8c856588 -8ca66588 -144307fd -00000000 -3c0af649 -354ab700 -3c09d674 -3529f530 -3c08800d -350843f4 -3c03f649 -3463f530 -ad0a7ae0 -a5097ae0 -25040004 -2505fffc -ac847ae0 -aca57ae0 -8d027ae0 -8ca47ae0 -8c857ae0 -8ca67ae0 -144307e9 -00000000 -3c0a0080 -354a4f26 -3c0923b1 -3529f91c -3c08800d -35082b58 -3c03f91c -34634f26 -3c010001 -00280821 -ac2ac824 -3c010001 -00280821 -a429c826 -25040004 -2505fffc -3c010001 -00240821 -ac24c824 -3c010001 -00250821 -ac25c824 -3c020001 -00481021 -8c42c824 -3c040001 -00852021 -8c84c824 -3c050001 -00a42821 -8ca5c824 -3c060001 -00c53021 -8cc6c824 -144307c5 -00000000 -3c0a82ca -354a8844 -3c09b7b6 -3529d134 -3c08800d -3508065c -3c0382ca -3463d134 -ad0a1508 -a5091508 -25040004 -2505fffc -ac841508 -aca51508 -8d021508 -8ca41508 -8c851508 -8ca61508 -144307b1 -00000000 -3c0a74b5 -354a6c00 -3c09c125 -35290920 -3c08800d -35084370 -3c030920 -34636c00 -3c010001 -00280821 -ac2a8a90 -3c010001 -00280821 -a4298a92 -25040004 -2505fffc -3c010001 -00240821 -ac248a90 -3c010001 -00250821 -ac258a90 -3c020001 -00481021 -8c428a90 -3c040001 -00852021 -8c848a90 -3c050001 -00a42821 -8ca58a90 -3c060001 -00c53021 -8cc68a90 -1443078d -00000000 -3c0ab99f -354aef40 -3c09d537 -35297a44 -3c08800d -35080144 -3c03b99f -34637a44 -3c010001 -00280821 -ac2ac640 -3c010001 -00280821 -a429c640 -25040004 -2505fffc -3c010001 -00240821 -ac24c640 -3c010001 -00250821 -ac25c640 -3c020001 -00481021 -8c42c640 -3c040001 -00852021 -8c84c640 -3c050001 -00a42821 -8ca5c640 -3c060001 -00c53021 -8cc6c640 -14430769 -00000000 -3c0abf9b -354a8ef0 -3c09868b -35291930 -3c08800d -35085920 -3c031930 -34638ef0 -ad0a3fd4 -a5093fd6 -25040004 -2505fffc -ac843fd4 -aca53fd4 -8d023fd4 -8ca43fd4 -8c853fd4 -8ca63fd4 -14430755 -00000000 -3c0a7da1 -354aadef -3c097d70 -352908a0 -3c08800d -35082020 -3c037da1 -346308a0 -ad0a4cc0 -a5094cc0 -25040004 -2505fffc -ac844cc0 -aca54cc0 -8d024cc0 -8ca44cc0 -8c854cc0 -8ca64cc0 -14430741 -00000000 -3c0af233 -354a47d4 -3c092140 -352970c6 -3c08800d -35080b58 -3c03f233 -346370c6 -3c010001 -00280821 -ac2ac83c -3c010001 -00280821 -a429c83c -25040004 -2505fffc -3c010001 -00240821 -ac24c83c -3c010001 -00250821 -ac25c83c -3c020001 -00481021 -8c42c83c -3c040001 -00852021 -8c84c83c -3c050001 -00a42821 -8ca5c83c -3c060001 -00c53021 -8cc6c83c -1443071d -00000000 -3c0ab54f -354a5ca2 -3c098937 -352935c8 -3c08800d -350823a4 -3c03b54f -346335c8 -ad0a5048 -a5095048 -25040004 -2505fffc -ac845048 -aca55048 -8d025048 -8ca45048 -8c855048 -8ca65048 -14430709 -00000000 -3c0af829 -354a69ad -3c090121 -3529c94c -3c08800d -350824b8 -3c03f829 -3463c94c -ad0a2ad0 -a5092ad0 -25040004 -2505fffc -ac842ad0 -aca52ad0 -8d022ad0 -8ca42ad0 -8c852ad0 -8ca62ad0 -144306f5 -00000000 -3c0aeca9 -354a6c00 -3c0950bc -35299348 -3c08800d -35081584 -3c03eca9 -34639348 -ad0a4ca8 -a5094ca8 -25040004 -2505fffc -ac844ca8 -aca54ca8 -8d024ca8 -8ca44ca8 -8c854ca8 -8ca64ca8 -144306e1 -00000000 -3c0ab731 -354ae211 -3c09097e -352993b8 -3c08800d -35081a8c -3c03b731 -346393b8 -ad0a514c -a509514c -25040004 -2505fffc -ac84514c -aca5514c -8d02514c -8ca4514c -8c85514c -8ca6514c -144306cd -00000000 -3c0ae4e4 -354a2ad0 -3c095f45 -3529347c -3c08800d -350854d8 -3c03e4e4 -3463347c -ad0a4284 -a5094284 -25040004 -2505fffc -ac844284 -aca54284 -8d024284 -8ca44284 -8c854284 -8ca64284 -144306b9 -00000000 -3c0a4aa5 -354ac058 -3c095e83 -3529e8d0 -3c08800d -350828c0 -3c03e8d0 -3463c058 -3c010001 -00280821 -ac2ab0c8 -3c010001 -00280821 -a429b0ca -25040004 -2505fffc -3c010001 -00240821 -ac24b0c8 -3c010001 -00250821 -ac25b0c8 -3c020001 -00481021 -8c42b0c8 -3c040001 -00852021 -8c84b0c8 -3c050001 -00a42821 -8ca5b0c8 -3c060001 -00c53021 -8cc6b0c8 -14430695 -00000000 -3c0a1054 -354a6b60 -3c099492 -352920de -3c08800d -3508eb88 -3c031054 -346320de -ad0a1084 -a5091084 -25040004 -2505fffc -ac841084 -aca51084 -8d021084 -8ca41084 -8c851084 -8ca61084 -14430681 -00000000 -3c0a54c8 -354a7bb0 -3c09ac9f -35291540 -3c08800d -35088964 -3c031540 -34637bb0 -ad0a3c7c -a5093c7e -25040004 -2505fffc -ac843c7c -aca53c7c -8d023c7c -8ca43c7c -8c853c7c -8ca63c7c -1443066d -00000000 -3c0a2061 -354a2be0 -3c097623 -35291aa0 -3c08800d -3508a4a4 -3c031aa0 -34632be0 -ad0a3118 -a509311a -25040004 -2505fffc -ac843118 -aca53118 -8d023118 -8ca43118 -8c853118 -8ca63118 -14430659 -00000000 -3c0a2393 -354a8928 -3c095976 -3529c160 -3c08800d -3508c7c8 -3c03c160 -34638928 -ad0a00d0 -a50900d2 -25040004 -2505fffc -ac8400d0 -aca500d0 -8d0200d0 -8ca400d0 -8c8500d0 -8ca600d0 -14430645 -00000000 -3c0a042a -354a28c0 -3c09f84b -3529893f -3c08800d -350812f8 -3c03893f -346328c0 -ad0a31ec -a50931ee -25040004 -2505fffc -ac8431ec -aca531ec -8d0231ec -8ca431ec -8c8531ec -8ca631ec -14430631 -00000000 -3c0a4b50 -354a9c68 -3c090630 -3529b104 -3c08800d -35084f80 -3c034b50 -3463b104 -3c010001 -00280821 -ac2aadbc -3c010001 -00280821 -a429adbc -25040004 -2505fffc -3c010001 -00240821 -ac24adbc -3c010001 -00250821 -ac25adbc -3c020001 -00481021 -8c42adbc -3c040001 -00852021 -8c84adbc -3c050001 -00a42821 -8ca5adbc -3c060001 -00c53021 -8cc6adbc -1443060d -00000000 -3c0a7ea7 -354a4858 -3c098943 -3529216c -3c08800d -3c037ea7 -3463216c -3c010001 -00280821 -ac2a84f0 -3c010001 -00280821 -a42984f0 -25040004 -2505fffc -3c010001 -00240821 -ac2484f0 -3c010001 -00250821 -ac2584f0 -3c020001 -00481021 -8c4284f0 -3c040001 -00852021 -8c8484f0 -3c050001 -00a42821 -8ca584f0 -3c060001 -00c53021 -8cc684f0 -144305ea -00000000 -3c0afd4d -354afbaa -3c09fc37 -35290cd0 -3c08800d -3c030cd0 -3463fbaa -ad0a5b60 -a5095b62 -25040004 -2505fffc -ac845b60 -aca55b60 -8d025b60 -8ca45b60 -8c855b60 -8ca65b60 -144305d7 -00000000 -3c0aef7b -354a46c8 -3c09ba1d -352906fc -3c08800d -3c03ef7b -346306fc -ad0a5848 -a5095848 -25040004 -2505fffc -ac845848 -aca55848 -8d025848 -8ca45848 -8c855848 -8ca65848 -144305c4 -00000000 -3c0a151b -354a86df -3c0995fa -3529ec5f -3c08800d -3c03151b -3463ec5f -ad0a02c0 -a50902c0 -25040004 -2505fffc -ac8402c0 -aca502c0 -8d0202c0 -8ca402c0 -8c8502c0 -8ca602c0 -144305b1 -00000000 -3c0a1266 -354a4cbb -3c0968ff -35297500 -3c08800d -3c031266 -34637500 -ad0a51ec -a50951ec -25040004 -2505fffc -ac8451ec -aca551ec -8d0251ec -8ca451ec -8c8551ec -8ca651ec -1443059e -00000000 -3c0a7383 -354a76f0 -3c097abd -3529fe92 -3c08800d -3c037383 -3463fe92 -ad0a010c -a509010c -25040004 -2505fffc -ac84010c -aca5010c -8d02010c -8ca4010c -8c85010c -8ca6010c -1443058b -00000000 -3c0aa818 -354a59c0 -3c09eedf -35291820 -3c08800d -3c03a818 -34631820 -3c010001 -00280821 -ac2abedc -3c010001 -00280821 -a429bedc -25040004 -2505fffc -3c010001 -00240821 -ac24bedc -3c010001 -00250821 -ac25bedc -3c020001 -00481021 -8c42bedc -3c040001 -00852021 -8c84bedc -3c050001 -00a42821 -8ca5bedc -3c060001 -00c53021 -8cc6bedc -14430568 -00000000 -3c0abf96 -354a25c0 -3c09b775 -35291ea0 -3c08800d -3c03bf96 -34631ea0 -3c010001 -00280821 -ac2ac894 -3c010001 -00280821 -a429c894 -25040004 -2505fffc -3c010001 -00240821 -ac24c894 -3c010001 -00250821 -ac25c894 -3c020001 -00481021 -8c42c894 -3c040001 -00852021 -8c84c894 -3c050001 -00a42821 -8ca5c894 -3c060001 -00c53021 -8cc6c894 -14430545 -00000000 -3c0a8a0b -354a0e78 -3c09aea1 -35290357 -3c08800d -3c038a0b -34630357 -3c010001 -00280821 -ac2ae5e8 -3c010001 -00280821 -a429e5e8 -25040004 -2505fffc -3c010001 -00240821 -ac24e5e8 -3c010001 -00250821 -ac25e5e8 -3c020001 -00481021 -8c42e5e8 -3c040001 -00852021 -8c84e5e8 -3c050001 -00a42821 -8ca5e5e8 -3c060001 -00c53021 -8cc6e5e8 -14430522 -00000000 -3c0a38c0 -354afeb0 -3c092552 -3529c584 -3c08800d -3c0338c0 -3463c584 -3c010001 -00280821 -ac2a9968 -3c010001 -00280821 -a4299968 -25040004 -2505fffc -3c010001 -00240821 -ac249968 -3c010001 -00250821 -ac259968 -3c020001 -00481021 -8c429968 -3c040001 -00852021 -8c849968 -3c050001 -00a42821 -8ca59968 -3c060001 -00c53021 -8cc69968 -144304ff -00000000 -3c0a09de -354a6ee8 -3c09e427 -35299110 -3c08800d -3c0309de -34639110 -3c010001 -00280821 -ac2aa6a0 -3c010001 -00280821 -a429a6a0 -25040004 -2505fffc -3c010001 -00240821 -ac24a6a0 -3c010001 -00250821 -ac25a6a0 -3c020001 -00481021 -8c42a6a0 -3c040001 -00852021 -8c84a6a0 -3c050001 -00a42821 -8ca5a6a0 -3c060001 -00c53021 -8cc6a6a0 -144304dc -00000000 -3c0affeb -354a3340 -3c098950 -3529f9f6 -3c08800d -3c03ffeb -3463f9f6 -ad0a3408 -a5093408 -25040004 -2505fffc -ac843408 -aca53408 -8d023408 -8ca43408 -8c853408 -8ca63408 -144304c9 -00000000 -3c0a8f70 -354a24be -3c095c89 -3529cd7a -3c08800d -3c038f70 -3463cd7a -3c010001 -00280821 -ac2a8c00 -3c010001 -00280821 -a4298c00 -25040004 -2505fffc -3c010001 -00240821 -ac248c00 -3c010001 -00250821 -ac258c00 -3c020001 -00481021 -8c428c00 -3c040001 -00852021 -8c848c00 -3c050001 -00a42821 -8ca58c00 -3c060001 -00c53021 -8cc68c00 -144304a6 -00000000 -3c0aeb29 -354a2500 -3c09ac47 -35296c50 -3c08800d -3c036c50 -34632500 -3c010001 -00280821 -ac2aad48 -3c010001 -00280821 -a429ad4a -25040004 -2505fffc -3c010001 -00240821 -ac24ad48 -3c010001 -00250821 -ac25ad48 -3c020001 -00481021 -8c42ad48 -3c040001 -00852021 -8c84ad48 -3c050001 -00a42821 -8ca5ad48 -3c060001 -00c53021 -8cc6ad48 -14430483 -00000000 -3c0af85d -354a3b84 -3c09d58d -35297eb8 -3c08800d -3c03f85d -34637eb8 -ad0a3c38 -a5093c38 -25040004 -2505fffc -ac843c38 -aca53c38 -8d023c38 -8ca43c38 -8c853c38 -8ca63c38 -14430470 -00000000 -3c0a2b14 -354a20e8 -3c09b061 -35298d2c -3c08800d -3c032b14 -34638d2c -ad0a4b18 -a5094b18 -25040004 -2505fffc -ac844b18 -aca54b18 -8d024b18 -8ca44b18 -8c854b18 -8ca64b18 -1443045d -00000000 -3c0a9e68 -354a7728 -3c091e59 -3529b179 -3c08800d -3c039e68 -3463b179 -ad0a3880 -a5093880 -25040004 -2505fffc -ac843880 -aca53880 -8d023880 -8ca43880 -8c853880 -8ca63880 -1443044a -00000000 -3c0a2611 -354aa63a -3c091b8e -3529eb80 -3c08800d -3c03eb80 -3463a63a -3c010001 -00280821 -ac2a8d70 -3c010001 -00280821 -a4298d72 -25040004 -2505fffc -3c010001 -00240821 -ac248d70 -3c010001 -00250821 -ac258d70 -3c020001 -00481021 -8c428d70 -3c040001 -00852021 -8c848d70 -3c050001 -00a42821 -8ca58d70 -3c060001 -00c53021 -8cc68d70 -14430427 -00000000 -3c0a1ccb -354a4da8 -3c09e897 -35292ef0 -3c08800d -3c031ccb -34632ef0 -3c010001 -00280821 -ac2aed84 -3c010001 -00280821 -a429ed84 -25040004 -2505fffc -3c010001 -00240821 -ac24ed84 -3c010001 -00250821 -ac25ed84 -3c020001 -00481021 -8c42ed84 -3c040001 -00852021 -8c84ed84 -3c050001 -00a42821 -8ca5ed84 -3c060001 -00c53021 -8cc6ed84 -14430404 -00000000 -3c0a720c -354a51f4 -3c091c42 -3529a1e0 -3c08800d -3c03a1e0 -346351f4 -3c010001 -00280821 -ac2aed84 -3c010001 -00280821 -a429ed86 -25040004 -2505fffc -3c010001 -00240821 -ac24ed84 -3c010001 -00250821 -ac25ed84 -3c020001 -00481021 -8c42ed84 -3c040001 -00852021 -8c84ed84 -3c050001 -00a42821 -8ca5ed84 -3c060001 -00c53021 -8cc6ed84 -144303e1 -00000000 -3c0add72 -354ad0b0 -3c09a115 -35294920 -3c08800d -3c03dd72 -34634920 -3c010001 -00280821 -ac2ae740 -3c010001 -00280821 -a429e740 -25040004 -2505fffc -3c010001 -00240821 -ac24e740 -3c010001 -00250821 -ac25e740 -3c020001 -00481021 -8c42e740 -3c040001 -00852021 -8c84e740 -3c050001 -00a42821 -8ca5e740 -3c060001 -00c53021 -8cc6e740 -144303be -00000000 -3c0a8882 -354a040c -3c09f8e0 -35297e80 -3c08800d -3c038882 -34637e80 -ad0a13d8 -a50913d8 -25040004 -2505fffc -ac8413d8 -aca513d8 -8d0213d8 -8ca413d8 -8c8513d8 -8ca613d8 -144303ab -00000000 -3c0af854 -354a84f0 -3c092056 -3529abbc -3c08800d -3c03abbc -346384f0 -3c010001 -00280821 -ac2ac038 -3c010001 -00280821 -a429c03a -25040004 -2505fffc -3c010001 -00240821 -ac24c038 -3c010001 -00250821 -ac25c038 -3c020001 -00481021 -8c42c038 -3c040001 -00852021 -8c84c038 -3c050001 -00a42821 -8ca5c038 -3c060001 -00c53021 -8cc6c038 -14430388 -00000000 -3c0a5eb1 -354a9438 -3c093ec8 -35298830 -3c08800d -3c038830 -34639438 -3c010001 -00280821 -ac2af610 -3c010001 -00280821 -a429f612 -25040004 -2505fffc -3c010001 -00240821 -ac24f610 -3c010001 -00250821 -ac25f610 -3c020001 -00481021 -8c42f610 -3c040001 -00852021 -8c84f610 -3c050001 -00a42821 -8ca5f610 -3c060001 -00c53021 -8cc6f610 -14430365 -00000000 -3c0a4c34 -354aa5a0 -3c0941f8 -3529c4b0 -3c08800d -3c03c4b0 -3463a5a0 -3c010001 -00280821 -ac2af1e4 -3c010001 -00280821 -a429f1e6 -25040004 -2505fffc -3c010001 -00240821 -ac24f1e4 -3c010001 -00250821 -ac25f1e4 -3c020001 -00481021 -8c42f1e4 -3c040001 -00852021 -8c84f1e4 -3c050001 -00a42821 -8ca5f1e4 -3c060001 -00c53021 -8cc6f1e4 -14430342 -00000000 -3c0a9bc0 -354a0fe8 -3c0919fb -3529b8d6 -3c08800d -3c03b8d6 -34630fe8 -ad0a0acc -a5090ace -25040004 -2505fffc -ac840acc -aca50acc -8d020acc -8ca40acc -8c850acc -8ca60acc -1443032f -00000000 -3c0ae293 -354aa67e -3c09cc73 -35290080 -3c08800d -3c03e293 -34630080 -ad0a51b0 -a50951b0 -25040004 -2505fffc -ac8451b0 -aca551b0 -8d0251b0 -8ca451b0 -8c8551b0 -8ca651b0 -1443031c -00000000 -3c0a93c7 -354ad5b0 -3c09c0c9 -35299855 -3c08800d -3c0393c7 -34639855 -3c010001 -00280821 -ac2ab540 -3c010001 -00280821 -a429b540 -25040004 -2505fffc -3c010001 -00240821 -ac24b540 -3c010001 -00250821 -ac25b540 -3c020001 -00481021 -8c42b540 -3c040001 -00852021 -8c84b540 -3c050001 -00a42821 -8ca5b540 -3c060001 -00c53021 -8cc6b540 -144302f9 -00000000 -3c0a5a4a -354a07f6 -3c090421 -35299ef4 -3c08800d -3c039ef4 -346307f6 -ad0a48b0 -a50948b2 -25040004 -2505fffc -ac8448b0 -aca548b0 -8d0248b0 -8ca448b0 -8c8548b0 -8ca648b0 -144302e6 -00000000 -3c0a0cb8 -354a09e4 -3c098cfc -3529f2c0 -3c08800d -3c030cb8 -3463f2c0 -ad0a5e60 -a5095e60 -25040004 -2505fffc -ac845e60 -aca55e60 -8d025e60 -8ca45e60 -8c855e60 -8ca65e60 -144302d3 -00000000 -3c0ab596 -354aca6a -3c098df9 -3529423c -3c08800d -3c03423c -3463ca6a -3c010001 -00280821 -ac2abe9c -3c010001 -00280821 -a429be9e -25040004 -2505fffc -3c010001 -00240821 -ac24be9c -3c010001 -00250821 -ac25be9c -3c020001 -00481021 -8c42be9c -3c040001 -00852021 -8c84be9c -3c050001 -00a42821 -8ca5be9c -3c060001 -00c53021 -8cc6be9c -144302b0 -00000000 -3c0aa84a -354a74a8 -3c094cc9 -3529d636 -3c08800d -3c03a84a -3463d636 -3c010001 -00280821 -ac2aaecc -3c010001 -00280821 -a429aecc -25040004 -2505fffc -3c010001 -00240821 -ac24aecc -3c010001 -00250821 -ac25aecc -3c020001 -00481021 -8c42aecc -3c040001 -00852021 -8c84aecc -3c050001 -00a42821 -8ca5aecc -3c060001 -00c53021 -8cc6aecc -1443028d -00000000 -3c0aaa5e -354a6ea0 -3c09a81b -35299980 -3c08800d -3c03aa5e -34639980 -ad0a2cc8 -a5092cc8 -25040004 -2505fffc -ac842cc8 -aca52cc8 -8d022cc8 -8ca42cc8 -8c852cc8 -8ca62cc8 -1443027a -00000000 -3c0ab266 -354aaf70 -3c09ad2f -35298b20 -3c08800d -3c038b20 -3463af70 -3c010001 -00280821 -ac2aad08 -3c010001 -00280821 -a429ad0a -25040004 -2505fffc -3c010001 -00240821 -ac24ad08 -3c010001 -00250821 -ac25ad08 -3c020001 -00481021 -8c42ad08 -3c040001 -00852021 -8c84ad08 -3c050001 -00a42821 -8ca5ad08 -3c060001 -00c53021 -8cc6ad08 -14430257 -00000000 -3c0a40d3 -354ab176 -3c09e431 -35291540 -3c08800d -3c0340d3 -34631540 -ad0a4ff0 -a5094ff0 -25040004 -2505fffc -ac844ff0 -aca54ff0 -8d024ff0 -8ca44ff0 -8c854ff0 -8ca64ff0 -14430244 -00000000 -3c0a80b3 -354a7e6c -3c0955d5 -3529b870 -3c08800d -3c0380b3 -3463b870 -3c010001 -00280821 -ac2a9400 -3c010001 -00280821 -a4299400 -25040004 -2505fffc -3c010001 -00240821 -ac249400 -3c010001 -00250821 -ac259400 -3c020001 -00481021 -8c429400 -3c040001 -00852021 -8c849400 -3c050001 -00a42821 -8ca59400 -3c060001 -00c53021 -8cc69400 -14430221 -00000000 -3c0aed52 -354a58d8 -3c099fdd -352923a8 -3c08800d -3c03ed52 -346323a8 -3c010001 -00280821 -ac2afbe0 -3c010001 -00280821 -a429fbe0 -25040004 -2505fffc -3c010001 -00240821 -ac24fbe0 -3c010001 -00250821 -ac25fbe0 -3c020001 -00481021 -8c42fbe0 -3c040001 -00852021 -8c84fbe0 -3c050001 -00a42821 -8ca5fbe0 -3c060001 -00c53021 -8cc6fbe0 -144301fe -00000000 -3c0a3974 -354ab6f0 -3c0948a0 -35291f4e -3c08800d -3c033974 -34631f4e -3c010001 -00280821 -ac2aae00 -3c010001 -00280821 -a429ae00 -25040004 -2505fffc -3c010001 -00240821 -ac24ae00 -3c010001 -00250821 -ac25ae00 -3c020001 -00481021 -8c42ae00 -3c040001 -00852021 -8c84ae00 -3c050001 -00a42821 -8ca5ae00 -3c060001 -00c53021 -8cc6ae00 -144301db -00000000 -3c0a77dd -354af4e0 -3c09e28a -3529eb00 -3c08800d -3c0377dd -3463eb00 -ad0a1700 -a5091700 -25040004 -2505fffc -ac841700 -aca51700 -8d021700 -8ca41700 -8c851700 -8ca61700 -144301c8 -00000000 -3c0a1865 -354add7c -3c09a83f -35298680 -3c08800d -3c031865 -34638680 -ad0a0000 -a5090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -144301b5 -00000000 -3c0a3dc1 -354a31bc -3c09051e -352907d1 -3c08800d -3c0307d1 -346331bc -ad0a0000 -a5090002 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -144301a2 -00000000 -3c0a58e1 -354a32b2 -3c093baa -35293c68 -3c08800d -3c0358e1 -34633c68 -ad0a0000 -a5090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -1443018f -00000000 -3c0a498c -354ac104 -3c090c55 -352952e2 -3c08800d -3c03498c -346352e2 -ad0a0000 -a5090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -1443017c -00000000 -3c0a906f -354ac250 -3c09d942 -3529b23c -3c08800d -3c03906f -3463b23c -ad0a0000 -a5090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -14430169 -00000000 -3c0a110e -354ad930 -3c09c287 -35296832 -3c08800d -3c036832 -3463d930 -ad0a0000 -a5090002 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -14430156 -00000000 -3c0ac390 -354a96a4 -3c09a568 -3529a9e0 -3c08800d -3c03c390 -3463a9e0 -ad0a0000 -a5090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -14430143 -00000000 -3c0afe04 -354a34c1 -3c09e286 -3529dc78 -3c08800d -3c03fe04 -3463dc78 -ad0a0000 -a5090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -14430130 -00000000 -3c0a4345 -354a056c -3c096e34 -3529bc70 -3c08800d -3c034345 -3463bc70 -ad0a0000 -a5090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -1443011d -00000000 -3c0a3d48 -354a9f5f -3c09fe2d -3529c400 -3c08800d -3c03c400 -34639f5f -ad0a0000 -a5090002 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -1443010a -00000000 -3c0a46e6 -354a0202 -3c09d456 -3529f5e0 -3c08800d -3c03f5e0 -34630202 -ad0a0000 -a5090002 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -144300f7 -00000000 -3c0a3d44 -354a363a -3c091013 -3529b676 -3c08800d -3c033d44 -3463b676 -ad0a0000 -a5090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -144300e4 -00000000 -3c0a8108 -3c0930c0 -35296a40 -3c08800d -3c038108 -34636a40 -ad0a0000 -a5090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -144300d2 -00000000 -3c0a7e38 -354a6f48 -3c096dfd -3529dc50 -3c08800d -3c03dc50 -34636f48 -ad0a0000 -a5090002 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -144300bf -00000000 -3c0add5f -354acc66 -3c098f70 -3529aaa6 -3c08800d -3c03aaa6 -3463cc66 -ad0a0000 -a5090002 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -144300ac -00000000 -3c0af5d0 -354acd30 -3c098fb8 -35291998 -3c08800d -3c031998 -3463cd30 -ad0a0000 -a5090002 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -14430099 -00000000 -3c0a19d5 -354ae812 -3c0925ed -35295b7f -3c08800d -3c035b7f -3463e812 -ad0a0000 -a5090002 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -14430086 -00000000 -3c0a4b17 -354a9300 -3c09a5a0 -3529ecb4 -3c08800d -3c034b17 -3463ecb4 -ad0a0000 -a5090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -14430073 -00000000 -3c0ae00d -354afa00 -3c0978d7 -3529370c -3c08800d -3c03370c -3463fa00 -ad0a0000 -a5090002 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -14430060 -00000000 -3c0ab704 -354afce8 -3c0952ec -3529d998 -3c08800d -3c03d998 -3463fce8 -ad0a0000 -a5090002 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -1443004d -00000000 -3c0a0207 -354a5c00 -3c093cab -3529c304 -3c08800d -3c030207 -3463c304 -ad0a0000 -a5090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -1443003a -00000000 -3c0a896c -354a92c0 -3c09f81c -35294fea -3c08800d -3c03896c -34634fea -ad0a0000 -a5090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -14430027 -00000000 -3c0aabc0 -354a3313 -3c096840 -35293610 -3c08800d -3c033610 -34633313 -ad0a0000 -a5090002 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -14430014 -00000000 -240a0000 -24090000 -3c08800d -24030000 -ad0a0000 -a5090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -26100001 -3c08800d -40805800 -3c170040 -40976000 -00000000 -24120001 -3c170001 -ad120000 -3c14bfc3 -2694255c -100000af -0000000c -165700ad -00000000 -24120001 -3c14bfc3 -26942578 -110000a8 -0000000c -165700a6 -00000000 -24120002 -3c170002 -ad120000 -3c14bfc3 -2694259c -1000009f -0000000d -1657009d -00000000 -24120002 -3c14bfc3 -269425b8 -11000098 -0000000d -16570096 -00000000 -24120003 -3c170003 -ad120000 -3c14bfc3 -269425ec -3c04ba03 -34844f60 -3c05b615 -34a5fd67 -1000008b -0085b820 -16570089 -00000000 -24120003 -3c14bfc3 -26942608 -11000084 -0085b820 -ad170000 -16570081 -00000000 -24120003 -ad120000 -3c14bfc3 -26942634 -3c047fff -3484c19e -10000079 -20976512 -16570077 -00000000 -24120003 -3c14bfc3 -26942650 -11000072 -20976512 -16570070 -00000000 -24120003 -3c14bfc3 -2694267c -3c04a85e -34847d00 -3c056b7e -34a58e36 -10000067 -0085b822 -16570065 -00000000 -24120003 -3c14bfc3 -26942698 -11000060 -0085b822 -1657005e -00000000 -24120004 -3c170004 -ad120000 -3c14bfc3 -269426bc -10000057 -8d170002 -16570055 -00000000 -24120004 -3c14bfc3 -269426d8 -11000050 -8d170002 -1657004e -00000000 -24120004 -3c14bfc3 -269426f4 -10000049 -85170001 -02f2001b -16570046 -00000000 -24120004 -3c14bfc3 -26942714 -11000041 -85170001 -1657003f -00000000 -3c14bfc3 -2694272c -1000003b -95170003 -16570039 -00000000 -24120004 -3c14bfc3 -26942748 -11000034 -95170003 -16570032 -00000000 -24120005 -3c170005 -ad120000 -3c14bfc3 -2694276c -1000002b -ad170002 -16570029 -00000000 -24120005 -3c14bfc3 -26942788 -11000024 -ad170002 -16570022 -00000000 -24120005 -3c14bfc3 -269427a4 -1000001d -a5170001 -1657001b -00000000 -24120005 -3c14bfc3 -269427c0 -11000016 -a5170001 -16570014 -00000000 -24120007 -3c170007 -ad120000 -3c14bfc3 -269427e4 -1000000d -9e3c56aa -02f20018 -1657000a -00000000 -24120007 -3c14bfc3 -26942808 -02f20018 -11000004 -ec1ba960 -16570002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -24120000 -3c0814ff -3508b0e6 -3c09088c -3529b248 -3c030c72 -3463fe9e -01091022 -14430830 -00000000 -3c085c68 -35085e22 -3c095deb -35291abc -3c03fe7d -34634366 -01091022 -14430827 -00000000 -3c08b2a2 -350889a4 -3c09fa69 -352908da -3c03b839 -346380ca -01091022 -1443081e -00000000 -3c08b112 -3508c8b8 -3c090767 -3529b30a -3c03a9ab -346315ae -01091022 -14430815 -00000000 -3c087d61 -3508bd38 -3c092364 -3529d999 -3c0359fc -3463e39f -01091022 -1443080c -00000000 -3c08cc3f -35084d97 -3c098317 -3529ee82 -3c034927 -34635f15 -01091022 -14430803 -00000000 -3c08a893 -350820a4 -3c09ba84 -3529a2c6 -3c03ee0e -34637dde -01091022 -144307fa -00000000 -3c08d1c7 -35081a78 -3c09d96a -35296a56 -3c03f85c -3463b022 -01091022 -144307f1 -00000000 -3c08f225 -350850f8 -3c096730 -3529126c -3c038af5 -34633e8c -01091022 -144307e8 -00000000 -3c08d684 -35089d52 -3c094a9d -35294148 -3c038be7 -34635c0a -01091022 -144307df -00000000 -3c081ce4 -3508299c -3c09fa01 -352914c1 -3c0322e3 -346314db -01091022 -144307d6 -00000000 -3c089c4d -35087f7c -3c09ae0b -35297726 -3c03ee42 -34630856 -01091022 -144307cd -00000000 -3c08265b -3508b77d -3c091ef5 -352948d8 -3c030766 -34636ea5 -01091022 -144307c4 -00000000 -3c089b35 -3508ea00 -3c09da0a -35290390 -3c03c12b -3463e670 -01091022 -144307bb -00000000 -3c08dea5 -3508d6d0 -3c09ee3f -35297a70 -3c03f066 -34635c60 -01091022 -144307b2 -00000000 -3c086f1f -35086d14 -3c09f3df -35292852 -3c037b40 -346344c2 -01091022 -144307a9 -00000000 -3c08ce42 -35088540 -3c090fba -3529078c -3c03be88 -34637db4 -01091022 -144307a0 -00000000 -3c083eee -35086b56 -3c094629 -35292c08 -3c03f8c5 -34633f4e -01091022 -14430797 -00000000 -3c08fb10 -350891f6 -3c093252 -3529822a -3c03c8be -34630fcc -01091022 -1443078e -00000000 -3c08086e -35083912 -3c09aa88 -35299078 -3c035de5 -3463a89a -01091022 -14430785 -00000000 -3c089467 -3508ad6c -3c09f9d7 -3529c0a2 -3c039a8f -3463ecca -01091022 -1443077c -00000000 -3c084c95 -3508d5cb -3c093f7f -35293aa0 -3c030d16 -34639b2b -01091022 -14430773 -00000000 -3c08e98e -3508e64a -3c09a6d2 -352930b4 -3c0342bc -3463b596 -01091022 -1443076a -00000000 -3c08ce4c -35088bfc -3c09297f -35297040 -3c03a4cd -34631bbc -01091022 -14430761 -00000000 -3c08d23d -3508a584 -3c09fbf3 -3529fee4 -3c03d649 -3463a6a0 -01091022 -14430758 -00000000 -3c08f4b1 -35087358 -3c09b7b8 -35293c70 -3c033cf9 -346336e8 -01091022 -1443074f -00000000 -3c08f79a -35080800 -3c09dfa2 -3529eb3a -3c0317f7 -34631cc6 -01091022 -14430746 -00000000 -3c088c06 -3508c0c0 -3c0902e0 -35290620 -3c038926 -3463baa0 -01091022 -1443073d -00000000 -3c08192a -350837f0 -3c0926cb -3529d070 -3c03f25e -34636780 -01091022 -14430734 -00000000 -3c08cd8e -35083b18 -3c09bbd1 -35299b00 -3c0311bc -3463a018 -01091022 -1443072b -00000000 -3c089adc -35088e40 -3c09c34b -3529ac8f -3c03d790 -3463e1b1 -01091022 -14430722 -00000000 -3c08139e -350892ac -3c094421 -3529a048 -3c03cf7c -3463f264 -01091022 -14430719 -00000000 -3c08c2ce -35085d15 -3c09ef02 -3529ae74 -3c03d3cb -3463aea1 -01091022 -14430710 -00000000 -3c0891ae -35087fda -3c09073d -35293aee -3c038a71 -346344ec -01091022 -14430707 -00000000 -3c081569 -350894ec -3c09a6db -35290c74 -3c036e8e -34638878 -01091022 -144306fe -00000000 -3c086d4d -3508f080 -3c095d35 -35290d88 -3c031018 -3463e2f8 -01091022 -144306f5 -00000000 -3c08bf82 -35083742 -3c09f9f3 -352992ac -3c03c58e -3463a496 -01091022 -144306ec -00000000 -3c08b079 -35083740 -3c098848 -3529e387 -3c032830 -346353b9 -01091022 -144306e3 -00000000 -3c081c83 -35087c78 -3c09299e -3529ebfd -3c03f2e4 -3463907b -01091022 -144306da -00000000 -3c0853da -3508e7c0 -3c09302e -3529b040 -3c0323ac -34633780 -01091022 -144306d1 -00000000 -3c080451 -3508ec80 -3c099452 -3529405e -3c036fff -3463ac22 -01091022 -144306c8 -00000000 -3c08a8c3 -35081350 -3c09f991 -352944f8 -3c03af31 -3463ce58 -01091022 -144306bf -00000000 -3c087b3a -35083ea0 -3c094f27 -3529e322 -3c032c12 -34635b7e -01091022 -144306b6 -00000000 -3c08daba -35086358 -3c0942a2 -3529579c -3c039818 -34630bbc -01091022 -144306ad -00000000 -3c08ec4c -350893f8 -3c09177c -35297300 -3c03d4d0 -346320f8 -01091022 -144306a4 -00000000 -3c08ae73 -35089690 -3c09962b -3529182e -3c031848 -34637e62 -01091022 -1443069b -00000000 -3c082b18 -35089eb0 -3c093998 -35298fda -3c03f180 -34630ed6 -01091022 -14430692 -00000000 -3c082a23 -3508576a -3c0941b1 -3529fe77 -3c03e871 -346358f3 -01091022 -14430689 -00000000 -3c087ddb -3508f6e4 -3c090a3b -3529d500 -3c0373a0 -346321e4 -01091022 -14430680 -00000000 -3c08c52e -35087f40 -3c09eec0 -3529ff9f -3c03d66d -34637fa1 -01091022 -14430677 -00000000 -3c084a63 -3508a120 -3c09f096 -35292f88 -3c0359cd -34637198 -01091022 -1443066e -00000000 -3c086b39 -3508b7b0 -3c0923c7 -35293c0e -3c034772 -34637ba2 -01091022 -14430665 -00000000 -3c08f564 -3508e0c0 -3c09dbe5 -3529c130 -3c03197f -34631f90 -01091022 -1443065c -00000000 -3c08db1c -3508480c -3c09ea97 -35292d7c -3c03f085 -34631a90 -01091022 -14430653 -00000000 -3c0877c3 -35083e50 -3c097721 -3529dd70 -3c0300a1 -346360e0 -01091022 -1443064a -00000000 -3c08ea5b -3508669c -3c09eab7 -35291aac -3c03ffa4 -34634bf0 -01091022 -14430641 -00000000 -3c08f741 -3508b012 -3c09c525 -35292284 -3c03321c -34638d8e -01091022 -14430638 -00000000 -3c082ffd -3508e768 -3c0928b4 -3529de9f -3c030749 -346308c9 -01091022 -1443062f -00000000 -3c08e087 -35080418 -3c09a539 -352962e7 -3c033b4d -3463a131 -01091022 -14430626 -00000000 -3c0862e4 -3508b240 -3c096851 -35295c20 -3c03fa93 -34635620 -01091022 -1443061d -00000000 -3c08697a -350839f8 -3c095eaf -35293472 -3c030acb -34630586 -01091022 -14430614 -00000000 -3c084514 -3508a140 -3c091c24 -3529b4af -3c0328ef -3463ec91 -01091022 -1443060b -00000000 -3c0826fb -3508c722 -3c09f2da -35295c30 -3c033421 -34636af2 -01091022 -14430602 -00000000 -3c0865a0 -3508281a -3c093858 -35297414 -3c032d47 -3463b406 -01091022 -144305f9 -00000000 -3c087e02 -35085ea7 -3c095753 -3529cbf8 -3c0326ae -346392af -01091022 -144305f0 -00000000 -3c08b583 -35089d20 -3c09e2ee -35294bd0 -3c03d295 -34635150 -01091022 -144305e7 -00000000 -3c081a1d -3508d482 -3c09f9eb -3529bbe2 -3c032032 -346318a0 -01091022 -144305de -00000000 -3c080893 -3508e090 -3c09ddb5 -35292bd7 -3c032ade -3463b4b9 -01091022 -144305d5 -00000000 -3c080944 -35081bc8 -3c093e82 -352990ac -3c03cac1 -34638b1c -01091022 -144305cc -00000000 -3c0865c8 -3508342a -3c093e33 -3529a069 -3c032794 -346393c1 -01091022 -144305c3 -00000000 -3c08f496 -35080ee7 -3c09a542 -352947c0 -3c034f53 -3463c727 -01091022 -144305ba -00000000 -3c0805d9 -3508b2cc -3c09ede5 -3529af0d -3c0317f4 -346303bf -01091022 -144305b1 -00000000 -3c08345b -35083d64 -3c09dacb -35297a70 -3c03598f -3463c2f4 -01091022 -144305a8 -00000000 -3c0813da -35088024 -3c092c67 -352975e0 -3c03e773 -34630a44 -01091022 -1443059f -00000000 -3c0857b8 -35084a9c -3c091d1d -35299ec6 -3c033a9a -3463abd6 -01091022 -14430596 -00000000 -3c08c77c -3508a378 -3c098b34 -3529f8a8 -3c033c47 -3463aad0 -01091022 -1443058d -00000000 -3c08fb6a -35083fa0 -3c09f3ff -35292f00 -3c03076b -346310a0 -01091022 -14430584 -00000000 -3c08bdd5 -35083e84 -3c09f838 -352977c2 -3c03c59c -3463c6c2 -01091022 -1443057b -00000000 -3c08c447 -350828ed -3c09c0fc -3529345c -3c03034a -3463f491 -01091022 -14430572 -00000000 -3c08f45c -3508c328 -3c0972b1 -35299280 -3c0381ab -346330a8 -01091022 -14430569 -00000000 -3c080ec4 -3508dc78 -3c09358a -35291790 -3c03d93a -3463c4e8 -01091022 -14430560 -00000000 -3c080956 -350835e0 -3c097888 -3529c2ef -3c0390cd -346372f1 -01091022 -14430557 -00000000 -3c0879c2 -35087f00 -3c0936bf -35290f88 -3c034303 -34636f78 -01091022 -1443054e -00000000 -3c0828b3 -35083400 -3c09bed7 -3529e82c -3c0369db -34634bd4 -01091022 -14430545 -00000000 -3c08b401 -3508a8a0 -3c091f8b -35294e4a -3c039476 -34635a56 -01091022 -1443053c -00000000 -3c087f6e -350836c0 -3c094446 -35291588 -3c033b28 -34632138 -01091022 -14430533 -00000000 -3c086cd8 -35083b74 -3c0916dc -35292e36 -3c0355fc -34630d3e -01091022 -1443052a -00000000 -3c08ead3 -35086260 -3c09d883 -35299b00 -3c03124f -3463c760 -01091022 -14430521 -00000000 -3c0887dd -350815b8 -3c09bc7d -3529a080 -3c03cb5f -34637538 -01091022 -14430518 -00000000 -3c08442d -35080b7f -3c09432a -3529bd68 -3c030102 -34634e17 -01091022 -1443050f -00000000 -3c08e4b5 -35084f89 -3c09e375 -3529931c -3c03013f -3463bc6d -01091022 -14430506 -00000000 -3c086625 -35082ad0 -3c09f37d -35291900 -3c0372a8 -346311d0 -01091022 -144304fd -00000000 -3c084218 -3508eac4 -3c092c61 -352988e8 -3c0315b7 -346361dc -01091022 -144304f4 -00000000 -3c081fa0 -350808bc -3c09bd3c -3529998c -3c036263 -34636f30 -01091022 -144304eb -00000000 -3c080083 -350825d0 -3c09918d -35291201 -3c036ef6 -346313cf -01091022 -144304e2 -00000000 -3c08cb08 -350867fa -3c09df7a -35295380 -3c03eb8e -3463147a -01091022 -144304d9 -00000000 -3c08250b -35086808 -3c09de26 -352946e8 -3c0346e5 -34632120 -01091022 -144304d0 -00000000 -3c08154d -3508b430 -3c097602 -35294fa0 -3c039f4b -34636490 -01091022 -144304c7 -00000000 -3c08a652 -3508c040 -3c09af88 -352970e4 -3c03f6ca -34634f5c -01091022 -144304be -00000000 -3c08d513 -3508678d -3c09d8d3 -35295810 -3c03fc40 -34630f7d -01091022 -144304b5 -00000000 -3c081e6d -350891da -3c09c7d8 -35294438 -3c035695 -34634da2 -01091022 -144304ac -00000000 -3c087476 -35080990 -3c093fa5 -3529e248 -3c0334d0 -34632748 -01091022 -144304a3 -00000000 -3c08651f -3508587c -3c091a66 -3529b360 -3c034ab8 -3463a51c -01091022 -1443049a -00000000 -3c084317 -35080548 -3c096c0b -3529f134 -3c03d70b -34631414 -01091022 -14430491 -00000000 -3c080e82 -3508bfd8 -3c09bd36 -352990f0 -3c03514c -34632ee8 -01091022 -14430488 -00000000 -3c0851b2 -3508a7a0 -3c092e6f -35298c10 -3c032343 -34631b90 -01091022 -1443047f -00000000 -3c081e99 -35083bf0 -3c096a93 -35294e28 -3c03b405 -3463edc8 -01091022 -14430476 -00000000 -3c08e72e -3508b946 -3c09c686 -35299c05 -3c0320a8 -34631d41 -01091022 -1443046d -00000000 -3c080c86 -35088772 -3c091e06 -3529ed58 -3c03ee7f -34639a1a -01091022 -14430464 -00000000 -3c08b350 -3508d720 -3c0932ca -35291a2b -3c038086 -3463bcf5 -01091022 -1443045b -00000000 -3c088459 -35086270 -3c09eff9 -35292398 -3c039460 -34633ed8 -01091022 -14430452 -00000000 -3c08f2fe -35085bbc -3c094627 -35297938 -3c03acd6 -3463e284 -01091022 -14430449 -00000000 -3c086ab1 -35087b4b -3c091a7a -3529dbf8 -3c035036 -34639f53 -01091022 -14430440 -00000000 -3c08a00e -35088920 -3c09c793 -352947f8 -3c03d87b -34634128 -01091022 -14430437 -00000000 -3c086011 -35082d88 -3c09e552 -3529db80 -3c037abe -34635208 -01091022 -1443042e -00000000 -3c088ee6 -3508c6fe -3c09a31f -352927c0 -3c03ebc7 -34639f3e -01091022 -14430425 -00000000 -3c0814be -350892f3 -3c094166 -3529fe8e -3c03d357 -34639465 -01091022 -1443041c -00000000 -3c08a001 -35088fea -3c098363 -3529a5fc -3c031c9d -3463e9ee -01091022 -14430413 -00000000 -3c08c8ff -3508400e -3c09fbf1 -35293484 -3c03cd0e -34630b8a -01091022 -1443040a -00000000 -3c081a30 -3508b5fc -3c093a08 -35299c00 -3c03e028 -346319fc -01091022 -14430401 -00000000 -3c08e7b3 -35087b34 -3c0922a2 -3529e120 -3c03c510 -34639a14 -01091022 -144303f8 -00000000 -3c084fa4 -3508f12e -3c09246a -35292710 -3c032b3a -3463ca1e -01091022 -144303ef -00000000 -3c085048 -35081468 -3c095a99 -3529899c -3c03f5ae -34638acc -01091022 -144303e6 -00000000 -3c082ba0 -3508ace0 -3c09c286 -35295268 -3c03691a -34635a78 -01091022 -144303dd -00000000 -3c082446 -350854c0 -3c0969d6 -35290f10 -3c03ba70 -346345b0 -01091022 -144303d4 -00000000 -3c088052 -35089680 -3c099764 -352928b0 -3c03e8ee -34636dd0 -01091022 -144303cb -00000000 -3c0848d5 -3508be88 -3c093c4c -3529a021 -3c030c89 -34631e67 -01091022 -144303c2 -00000000 -3c088ca3 -3508f47e -3c09053c -35296081 -3c038767 -346393fd -01091022 -144303b9 -00000000 -3c086bb1 -350889d6 -3c09f760 -35294056 -3c037451 -34634980 -01091022 -144303b0 -00000000 -3c08f4a9 -3508fafd -3c0936f1 -3529bd34 -3c03bdb8 -34633dc9 -01091022 -144303a7 -00000000 -3c080069 -35085c56 -3c09d549 -35296c94 -3c032b1f -3463efc2 -01091022 -1443039e -00000000 -3c089537 -350833c0 -3c09c1c8 -3c03d36f -346333c0 -01091022 -14430396 -00000000 -3c083341 -3508ba2e -3c092506 -35294420 -3c030e3b -3463760e -01091022 -1443038d -00000000 -3c080685 -3508b0d0 -3c098bcd -35297344 -3c037ab8 -34633d8c -01091022 -14430384 -00000000 -3c0838e0 -3508a16e -3c095f30 -3529205e -3c03d9b0 -34638110 -01091022 -1443037b -00000000 -3c0824d7 -3508fdb0 -3c09758e -3529d284 -3c03af49 -34632b2c -01091022 -14430372 -00000000 -3c081e18 -350802d8 -3c09e85e -35290d20 -3c0335b9 -3463f5b8 -01091022 -14430369 -00000000 -3c08ca68 -35086154 -3c09b964 -3529256e -3c031104 -34633be6 -01091022 -14430360 -00000000 -3c08f12b -35086964 -3c09c022 -35295cd0 -3c033109 -34630c94 -01091022 -14430357 -00000000 -3c0804d9 -350810d8 -3c09e23a -35291600 -3c03229e -3463fad8 -01091022 -1443034e -00000000 -3c0847a9 -3508c798 -3c096f1e -35298232 -3c03d88b -34634566 -01091022 -14430345 -00000000 -3c080eec -35085774 -3c094609 -352925d0 -3c03c8e3 -346331a4 -01091022 -1443033c -00000000 -3c08cf4b -35087509 -3c09c416 -35296e70 -3c030b35 -34630699 -01091022 -14430333 -00000000 -3c080863 -35085494 -3c099eb5 -35291e6c -3c0369ae -34633628 -01091022 -1443032a -00000000 -3c0893bd -350845a8 -24090000 -3c0393bd -346345a8 -01091022 -14430322 -00000000 -3c08f93e -35082930 -24090000 -3c03f93e -34632930 -01091022 -1443031a -00000000 -3c088dcb -35089988 -24090000 -3c038dcb -34639988 -01091022 -14430312 -00000000 -3c08635e -35082008 -24090000 -3c03635e -34632008 -01091022 -1443030a -00000000 -3c084db4 -35083545 -24090000 -3c034db4 -34633545 -01091022 -14430302 -00000000 -3c0824dc -3508fe10 -24090000 -3c0324dc -3463fe10 -01091022 -144302fa -00000000 -3c083983 -350801c8 -24090000 -3c033983 -346301c8 -01091022 -144302f2 -00000000 -3c080a65 -35088c08 -24090000 -3c030a65 -34638c08 -01091022 -144302ea -00000000 -3c08d4b7 -35082b57 -24090000 -3c03d4b7 -34632b57 -01091022 -144302e2 -00000000 -3c08e555 -35086334 -24090000 -3c03e555 -34636334 -01091022 -144302da -00000000 -3c0807ec -35085b77 -24090000 -3c0307ec -34635b77 -01091022 -144302d2 -00000000 -3c081f94 -350811c0 -24090000 -3c031f94 -346311c0 -01091022 -144302ca -00000000 -3c08b5ce -35087e58 -24090000 -3c03b5ce -34637e58 -01091022 -144302c2 -00000000 -3c089802 -35085ac5 -24090000 -3c039802 -34635ac5 -01091022 -144302ba -00000000 -3c0843c4 -3508ccc9 -24090000 -3c0343c4 -3463ccc9 -01091022 -144302b2 -00000000 -3c080ec8 -350806e0 -24090000 -3c030ec8 -346306e0 -01091022 -144302aa -00000000 -3c08b1c8 -35083aea -24090000 -3c03b1c8 -34633aea -01091022 -144302a2 -00000000 -3c081b1a -35080ba8 -24090000 -3c031b1a -34630ba8 -01091022 -1443029a -00000000 -3c084647 -350840be -24090000 -3c034647 -346340be -01091022 -14430292 -00000000 -3c080631 -350866d8 -24090000 -3c030631 -346366d8 -01091022 -1443028a -00000000 -3c084452 -35087d44 -24090000 -3c034452 -34637d44 -01091022 -14430282 -00000000 -3c08382d -35082a00 -24090000 -3c03382d -34632a00 -01091022 -1443027a -00000000 -3c083dc8 -35082658 -24090000 -3c033dc8 -34632658 -01091022 -14430272 -00000000 -3c082c81 -35082068 -24090000 -3c032c81 -34632068 -01091022 -1443026a -00000000 -3c08bc37 -35084264 -24090000 -3c03bc37 -34634264 -01091022 -14430262 -00000000 -3c08df16 -35084160 -24090000 -3c03df16 -34634160 -01091022 -1443025a -00000000 -3c085d2b -35087594 -24090000 -3c035d2b -34637594 -01091022 -14430252 -00000000 -3c08edf0 -3508dbb6 -24090000 -3c03edf0 -3463dbb6 -01091022 -1443024a -00000000 -3c082869 -3508a00d -24090000 -3c032869 -3463a00d -01091022 -14430242 -00000000 -3c08c520 -3508868a -24090000 -3c03c520 -3463868a -01091022 -1443023a -00000000 -3c08242c -3508fdc0 -24090000 -3c03242c -3463fdc0 -01091022 -14430232 -00000000 -3c08e9bc -350801c8 -24090000 -3c03e9bc -346301c8 -01091022 -1443022a -00000000 -3c08f4fa -35084100 -24090000 -3c03f4fa -34634100 -01091022 -14430222 -00000000 -3c081f0d -3508c9a8 -24090000 -3c031f0d -3463c9a8 -01091022 -1443021a -00000000 -3c08c71c -35086593 -24090000 -3c03c71c -34636593 -01091022 -14430212 -00000000 -3c0828e0 -35082ac0 -24090000 -3c0328e0 -34632ac0 -01091022 -1443020a -00000000 -3c08e52d -3508fa00 -24090000 -3c03e52d -3463fa00 -01091022 -14430202 -00000000 -3c08d1c9 -3508f7c0 -24090000 -3c03d1c9 -3463f7c0 -01091022 -144301fa -00000000 -3c081510 -3508723c -24090000 -3c031510 -3463723c -01091022 -144301f2 -00000000 -3c08e83a -35081690 -24090000 -3c03e83a -34631690 -01091022 -144301ea -00000000 -3c08601d -3508f740 -24090000 -3c03601d -3463f740 -01091022 -144301e2 -00000000 -3c0851ca -35087684 -24090000 -3c0351ca -34637684 -01091022 -144301da -00000000 -3c0871e9 -3508756e -24090000 -3c0371e9 -3463756e -01091022 -144301d2 -00000000 -3c08dfbc -350857e4 -24090000 -3c03dfbc -346357e4 -01091022 -144301ca -00000000 -3c08ee4b -3508d60a -24090000 -3c03ee4b -3463d60a -01091022 -144301c2 -00000000 -3c08a3e1 -35080114 -24090000 -3c03a3e1 -34630114 -01091022 -144301ba -00000000 -3c08f793 -350814fc -24090000 -3c03f793 -346314fc -01091022 -144301b2 -00000000 -3c0886bb -3508afc0 -24090000 -3c0386bb -3463afc0 -01091022 -144301aa -00000000 -3c0814e7 -35081664 -24090000 -3c0314e7 -34631664 -01091022 -144301a2 -00000000 -3c0870c2 -35083140 -24090000 -3c0370c2 -34633140 -01091022 -1443019a -00000000 -24080000 -3c0932d5 -35293500 -3c03cd2a -3463cb00 -01091022 -14430192 -00000000 -24080000 -3c0958dc -35298670 -3c03a723 -34637990 -01091022 -1443018a -00000000 -24080000 -3c09051a -35298419 -3c03fae5 -34637be7 -01091022 -14430182 -00000000 -24080000 -3c0907b3 -3529cfa0 -3c03f84c -34633060 -01091022 -1443017a -00000000 -24080000 -3c093d17 -3529c31e -3c03c2e8 -34633ce2 -01091022 -14430172 -00000000 -24080000 -3c09ccc5 -3529d481 -3c03333a -34632b7f -01091022 -1443016a -00000000 -24080000 -3c09baec -3529c0fa -3c034513 -34633f06 -01091022 -14430162 -00000000 -24080000 -3c0973dd -35292ed4 -3c038c22 -3463d12c -01091022 -1443015a -00000000 -24080000 -3c098b2a -3529f340 -3c0374d5 -34630cc0 -01091022 -14430152 -00000000 -24080000 -3c09dba0 -35291ab4 -3c03245f -3463e54c -01091022 -1443014a -00000000 -24080000 -3c09ac29 -35291070 -3c0353d6 -3463ef90 -01091022 -14430142 -00000000 -24080000 -3c092480 -352967f3 -3c03db7f -3463980d -01091022 -1443013a -00000000 -24080000 -3c0901f8 -3529687f -3c03fe07 -34639781 -01091022 -14430132 -00000000 -24080000 -3c09598b -3529b488 -3c03a674 -34634b78 -01091022 -1443012a -00000000 -24080000 -3c097c49 -3529282e -3c0383b6 -3463d7d2 -01091022 -14430122 -00000000 -24080000 -3c09dc7f -35292000 -3c032380 -3463e000 -01091022 -1443011a -00000000 -24080000 -3c0954b1 -35292b50 -3c03ab4e -3463d4b0 -01091022 -14430112 -00000000 -24080000 -3c09b4b7 -3529830c -3c034b48 -34637cf4 -01091022 -1443010a -00000000 -24080000 -3c09bc37 -352929f6 -3c0343c8 -3463d60a -01091022 -14430102 -00000000 -24080000 -3c0953dc -3529245b -3c03ac23 -3463dba5 -01091022 -144300fa -00000000 -24080000 -3c096298 -3529aa20 -3c039d67 -346355e0 -01091022 -144300f2 -00000000 -24080000 -3c091c83 -3529f738 -3c03e37c -346308c8 -01091022 -144300ea -00000000 -24080000 -3c095149 -3529bd56 -3c03aeb6 -346342aa -01091022 -144300e2 -00000000 -24080000 -3c09de89 -35293c10 -3c032176 -3463c3f0 -01091022 -144300da -00000000 -24080000 -3c097987 -35297dea -3c038678 -34638216 -01091022 -144300d2 -00000000 -24080000 -3c096049 -3529b93c -3c039fb6 -346346c4 -01091022 -144300ca -00000000 -24080000 -3c09ebc2 -3529b9e0 -3c03143d -34634620 -01091022 -144300c2 -00000000 -24080000 -3c09e2c3 -35299000 -3c031d3c -34637000 -01091022 -144300ba -00000000 -24080000 -3c09523c -3529fdd1 -3c03adc3 -3463022f -01091022 -144300b2 -00000000 -24080000 -3c092f7e -3529d3da -3c03d081 -34632c26 -01091022 -144300aa -00000000 -24080000 -3c09245c -3529ce00 -3c03dba3 -34633200 -01091022 -144300a2 -00000000 -24080000 -3c09213e -35291710 -3c03dec1 -3463e8f0 -01091022 -1443009a -00000000 -24080000 -3c092a8a -352928be -3c03d575 -3463d742 -01091022 -14430092 -00000000 -24080000 -3c096bf2 -352974e0 -3c03940d -34638b20 -01091022 -1443008a -00000000 -24080000 -3c099fc2 -3529cc00 -3c03603d -34633400 -01091022 -14430082 -00000000 -24080000 -3c095c0e -35290fe0 -3c03a3f1 -3463f020 -01091022 -1443007a -00000000 -24080000 -3c094598 -35298d2a -3c03ba67 -346372d6 -01091022 -14430072 -00000000 -24080000 -3c096801 -35291cc0 -3c0397fe -3463e340 -01091022 -1443006a -00000000 -24080000 -3c09aaed -3529ef26 -3c035512 -346310da -01091022 -14430062 -00000000 -24080000 -3c09cccf -35299830 -3c033330 -346367d0 -01091022 -1443005a -00000000 -24080000 -3c0982ff -35298b40 -3c037d00 -346374c0 -01091022 -14430052 -00000000 -24080000 -3c095176 -352999b4 -3c03ae89 -3463664c -01091022 -1443004a -00000000 -24080000 -3c09bfed -352963da -3c034012 -34639c26 -01091022 -14430042 -00000000 -24080000 -3c099c75 -35290ec8 -3c03638a -3463f138 -01091022 -1443003a -00000000 -24080000 -3c092e3f -35293544 -3c03d1c0 -3463cabc -01091022 -14430032 -00000000 -24080000 -3c090e49 -3529ed5f -3c03f1b6 -346312a1 -01091022 -1443002a -00000000 -24080000 -3c09827b -3529d480 -3c037d84 -34632b80 -01091022 -14430022 -00000000 -24080000 -3c09cea7 -352926f0 -3c033158 -3463d910 -01091022 -1443001a -00000000 -24080000 -3c09ca0f -3529d400 -3c0335f0 -34632c00 -01091022 -14430012 -00000000 -24080000 -3c09d2e5 -35294c39 -3c032d1a -3463b3c7 -01091022 -1443000a -00000000 -24080000 -24090000 -24030000 -01091022 -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -26100001 -24120000 -3c0845b9 -35080738 -3c09d70d -352964f0 -01090018 -0000a812 -0000b010 -3c020a20 -3442a480 -3c03f4d9 -346303bb -14550906 -00000000 -14760904 -00000000 -3c0899a4 -350851b0 -3c09be3d -35299998 -01090018 -0000a812 -0000b010 -3c028552 -3442b080 -3c031a4b -346301ae -145508f7 -00000000 -147608f5 -00000000 -3c088593 -35081c58 -3c09fb71 -35290fb5 -01090018 -0000a812 -0000b010 -3c02da84 -34423238 -3c03022e -34630ede -145508e8 -00000000 -147608e6 -00000000 -3c08650e -35084043 -3c0964c1 -35297218 -01090018 -0000a812 -0000b010 -3c027076 -3442dc48 -3c0327c5 -3463ede2 -145508d9 -00000000 -147608d7 -00000000 -3c08a00c -35086c50 -3c098e9d -3529f080 -01090018 -0000a812 -0000b010 -3c0278d1 -34422800 -3c032a7f -3463453e -145508ca -00000000 -147608c8 -00000000 -3c0899c8 -350874b6 -3c09d7ce -352983e0 -01090018 -0000a812 -0000b010 -3c02e793 -34424140 -3c03100c -34636ff4 -145508bb -00000000 -147608b9 -00000000 -3c081c62 -3508f360 -3c093458 -35290400 -01090018 -0000a812 -0000b010 -3c02b4cd -34428000 -3c0305cd -3463dbe4 -145508ac -00000000 -147608aa -00000000 -3c0899b8 -35080b00 -3c096c46 -35293000 -01090018 -0000a812 -0000b010 -3c028410 -3c03d4bd -346399c9 -1455089e -00000000 -1476089c -00000000 -3c08dc82 -35083390 -3c095208 -3529f838 -01090018 -0000a812 -0000b010 -3c021aee -3442c780 -3c03f4a0 -3463762c -1455088f -00000000 -1476088d -00000000 -3c08e530 -350880d8 -3c09848a -35299c5a -01090018 -0000a812 -0000b010 -3c02f600 -3442ebf0 -3c030ced -3463fd5c -14550880 -00000000 -1476087e -00000000 -3c087f21 -350863d8 -3c09ab5b -3529ba80 -01090018 -0000a812 -0000b010 -3c029904 -3442dc00 -3c03d5f7 -34637755 -14550871 -00000000 -1476086f -00000000 -3c08ea7b -350888c0 -3c0923ee -3529d510 -01090018 -0000a812 -0000b010 -3c02d300 -34424c00 -3c03fcfa -3463d0a2 -14550862 -00000000 -14760860 -00000000 -3c087389 -3508b4fd -3c09ea06 -35293940 -01090018 -0000a812 -0000b010 -3c020ba7 -34429440 -3c03f614 -3463f983 -14550853 -00000000 -14760851 -00000000 -3c08bcdf -35089b20 -3c09c145 -35291978 -01090018 -0000a812 -0000b010 -3c024e96 -3442d700 -3c031072 -3463da6a -14550844 -00000000 -14760842 -00000000 -3c08dcac -3508fd50 -3c09809d -35290a80 -01090018 -0000a812 -0000b010 -3c027273 -3442c800 -3c031193 -3463d5fc -14550835 -00000000 -14760833 -00000000 -3c0855ed -35083100 -3c09be5b -3529a9f2 -01090018 -0000a812 -0000b010 -3c023a91 -34425200 -3c03e9f7 -34639db9 -14550826 -00000000 -14760824 -00000000 -3c08cedb -35085fd8 -3c09e179 -35293b60 -01090018 -0000a812 -0000b010 -3c024672 -3442b900 -3c0305dc -346329af -14550817 -00000000 -14760815 -00000000 -3c089d32 -3508f1b0 -3c09bb20 -352916b8 -01090018 -0000a812 -0000b010 -3c022362 -3442d680 -3c031a94 -3463e275 -14550808 -00000000 -14760806 -00000000 -3c087091 -3508ae43 -3c09db39 -35290460 -01090018 -0000a812 -0000b010 -3c029b45 -34426520 -3c03efd4 -3463042c -145507f9 -00000000 -147607f7 -00000000 -3c08549b -3508f440 -3c09d1dc -35299f40 -01090018 -0000a812 -0000b010 -3c022ab0 -3442d000 -3c03f0c0 -346348d0 -145507ea -00000000 -147607e8 -00000000 -3c0863b2 -350841cc -3c0948ae -3529fe14 -01090018 -0000a812 -0000b010 -3c02bfdd -34428bf0 -3c031c4e -3463489c -145507db -00000000 -147607d9 -00000000 -3c084c92 -35085040 -3c090855 -3529d2c8 -01090018 -0000a812 -0000b010 -3c027d63 -34423200 -3c03027e -34633e22 -145507cc -00000000 -147607ca -00000000 -3c08db2d -3508fd2c -3c096c0e -35299f09 -01090018 -0000a812 -0000b010 -3c02ad44 -34423a8c -3c03f075 -34634c72 -145507bd -00000000 -147607bb -00000000 -3c08dfdc -35089250 -3c09bf1f -352915c3 -01090018 -0000a812 -0000b010 -3c0204b4 -344202f0 -3c030825 -346317d4 -145507ae -00000000 -147607ac -00000000 -3c081b33 -35089b35 -3c0998c1 -35294bc0 -01090018 -0000a812 -0000b010 -3c020021 -3442eec0 -3c03f507 -346392e7 -1455079f -00000000 -1476079d -00000000 -3c08c861 -35088b98 -3c096945 -35292a40 -01090018 -0000a812 -0000b010 -3c021141 -3442d600 -3c03e920 -3463fb5e -14550790 -00000000 -1476078e -00000000 -3c082aea -35080580 -3c097f50 -3529d684 -01090018 -0000a812 -0000b010 -3c02f943 -3442d600 -3c031557 -3463a5d1 -14550781 -00000000 -1476077f -00000000 -3c085c69 -3508f5ec -3c099ee2 -35293bd2 -01090018 -0000a812 -0000b010 -3c02fcf1 -34421f98 -3c03dcf1 -34631afe -14550772 -00000000 -14760770 -00000000 -3c08b7b6 -35086b40 -3c098b50 -3529c179 -01090018 -0000a812 -0000b010 -3c02a013 -3442f140 -3c0320f2 -3463d35b -14550763 -00000000 -14760761 -00000000 -3c08514e -350833b6 -3c097dc3 -35299988 -01090018 -0000a812 -0000b010 -3c023015 -34423eb0 -3c0327f1 -34634e94 -14550754 -00000000 -14760752 -00000000 -3c0827c2 -35084e12 -3c09bc0e -35296874 -01090018 -0000a812 -0000b010 -3c0270be -3442b028 -3c03f572 -3463a01c -14550745 -00000000 -14760743 -00000000 -3c08e7e6 -3508eddc -3c0913a7 -3529cad0 -01090018 -0000a812 -0000b010 -3c0221d4 -3442dac0 -3c03fe26 -34635835 -14550736 -00000000 -14760734 -00000000 -3c08a851 -350811c0 -3c09a29d -352950f0 -01090018 -0000a812 -0000b010 -3c02844c -3442a400 -3c031ffc -3463597a -14550727 -00000000 -14760725 -00000000 -3c0873d5 -35082eb8 -3c09142b -3529a310 -01090018 -0000a812 -0000b010 -3c0232fa -34421380 -3c030920 -3463663d -14550718 -00000000 -14760716 -00000000 -3c084115 -35086884 -3c09794c -35295fb2 -01090018 -0000a812 -0000b010 -3c029ddb -3442a7c8 -3c031ed6 -34638915 -14550709 -00000000 -14760707 -00000000 -3c08a877 -35084820 -3c09b2cf -35290480 -01090018 -0000a812 -0000b010 -3c02aaa4 -34429000 -3c031a64 -3463deef -145506fa -00000000 -147606f8 -00000000 -3c08b69b -3508cb80 -3c0988d5 -35295520 -01090018 -0000a812 -0000b010 -3c02df8a -3442f000 -3c032229 -3463cfd4 -145506eb -00000000 -147606e9 -00000000 -3c08e841 -350875d8 -3c099404 -35298f1c -01090018 -0000a812 -0000b010 -3c02af5c -34428ba0 -3c030a03 -3463f608 -145506dc -00000000 -147606da -00000000 -3c086fde -3508dbd8 -3c0967dd -35297f60 -01090018 -0000a812 -0000b010 -3c02341a -34429900 -3c032d63 -34637581 -145506cd -00000000 -147606cb -00000000 -3c08a231 -35089526 -3c09d5f8 -35298700 -01090018 -0000a812 -0000b010 -3c024077 -34420a00 -3c030f66 -34639a83 -145506be -00000000 -147606bc -00000000 -3c0861f8 -3508b9bc -3c09146e -35296d38 -01090018 -0000a812 -0000b010 -3c02d445 -3442ad20 -3c0307d1 -3463b12e -145506af -00000000 -147606ad -00000000 -3c08b900 -35082828 -3c090310 -3529a1b9 -01090018 -0000a812 -0000b010 -3c02c4de -34422ce8 -3c03ff26 -346363a0 -145506a0 -00000000 -1476069e -00000000 -3c08b441 -35088f47 -3c09943f -3529129c -01090018 -0000a812 -0000b010 -3c02c27f -34424d44 -3c031fe1 -3463ae2e -14550691 -00000000 -1476068f -00000000 -3c08d701 -35081f8c -3c0970d8 -3529ea80 -01090018 -0000a812 -0000b010 -3c026585 -3442be00 -3c03eded -3463c132 -14550682 -00000000 -14760680 -00000000 -3c08058b -35089998 -3c095539 -35295538 -01090018 -0000a812 -0000b010 -3c023b61 -34421140 -3c0301d8 -346397ed -14550673 -00000000 -14760671 -00000000 -3c08c13b -35087fc0 -3c09da19 -35292fbb -01090018 -0000a812 -0000b010 -3c020caa -34429140 -3c03094a -3463fe25 -14550664 -00000000 -14760662 -00000000 -3c08776d -350824b0 -3c0966f0 -3529a9a4 -01090018 -0000a812 -0000b010 -3c021423 -3442b0c0 -3c033005 -3463c214 -14550655 -00000000 -14760653 -00000000 -3c086c6a -3508e338 -3c095c4a -3529bc80 -01090018 -0000a812 -0000b010 -3c02827e -3442bc00 -3c032716 -34631062 -14550646 -00000000 -14760644 -00000000 -3c089dc0 -350890e0 -3c09b632 -35294980 -01090018 -0000a812 -0000b010 -3c025558 -34425000 -3c031c53 -34630986 -14550637 -00000000 -14760635 -00000000 -3c0886d6 -350809de -3c09cd4b -3529cb2e -01090018 -0000a812 -0000b010 -3c029e52 -3442cfe4 -3c0317ff -34637c93 -14550628 -00000000 -14760626 -00000000 -3c081400 -3508c7dc -3c09466a -35296d5e -01090018 -0000a812 -0000b010 -3c02967a -34420ec8 -3c030580 -34638784 -14550619 -00000000 -14760617 -00000000 -3c08a2d8 -35088860 -3c092642 -35293686 -01090018 -0000a812 -0000b010 -3c0252db -3442a240 -3c03f214 -34630c3a -1455060a -00000000 -14760608 -00000000 -3c086770 -3508770a -3c09812c -3529be10 -01090018 -0000a812 -0000b010 -3c026f18 -3442dca0 -3c03ccc1 -34634912 -145505fb -00000000 -147605f9 -00000000 -3c089562 -35087048 -3c09c1ba -3529e8ca -01090018 -0000a812 -0000b010 -3c02f1bd -3442d8d0 -3c0319ee -3463eef0 -145505ec -00000000 -147605ea -00000000 -3c081dba -3508dda0 -3c095d2b -35290f50 -01090018 -0000a812 -0000b010 -3c029741 -3442a200 -3c030ad1 -3463e2ad -145505dd -00000000 -147605db -00000000 -3c08c7cf -35084f96 -3c097dd3 -35293820 -01090018 -0000a812 -0000b010 -3c0229f4 -3442c2c0 -3c03e461 -3463dd69 -145505ce -00000000 -147605cc -00000000 -3c08a1d8 -3508f960 -3c09b83e -35293183 -01090018 -0000a812 -0000b010 -3c02bf02 -3442fc20 -3c031a64 -34631a33 -145505bf -00000000 -147605bd -00000000 -3c08cc2c -3508955e -3c0963c2 -3529877e -01090018 -0000a812 -0000b010 -3c028bf2 -34421644 -3c03ebcd -3463dc1e -145505b0 -00000000 -147605ae -00000000 -3c08d2d4 -35084530 -3c09602b -352939e6 -01090018 -0000a812 -0000b010 -3c024d2d -3442d920 -3c03ef07 -3463f962 -145505a1 -00000000 -1476059f -00000000 -3c08886c -35083ad7 -3c09e011 -3529a4c0 -01090018 -0000a812 -0000b010 -3c02af24 -3442dd40 -3c030eea -34633ae0 -14550592 -00000000 -14760590 -00000000 -3c080c45 -3508d0c8 -3c09830e -352902fb -01090018 -0000a812 -0000b010 -3c025705 -34424418 -3c03fa02 -34639504 -14550583 -00000000 -14760581 -00000000 -3c084997 -35089c44 -3c092987 -352942f0 -01090018 -0000a812 -0000b010 -3c026048 -344207c0 -3c030bf0 -34632a38 -14550574 -00000000 -14760572 -00000000 -3c082037 -3508c800 -3c09fb35 -35295f34 -01090018 -0000a812 -0000b010 -3c02a68c -3442a000 -3c03ff65 -3463a09f -14550565 -00000000 -14760563 -00000000 -3c0821e6 -35088aeb -3c09c1cc -35294ec0 -01090018 -0000a812 -0000b010 -3c02897f -3442ca40 -3c03f7c3 -346351f4 -14550556 -00000000 -14760554 -00000000 -3c08e2c4 -350888b8 -3c098ed6 -3529a9d8 -01090018 -0000a812 -0000b010 -3c026de4 -3442d340 -3c030ceb -3463f803 -14550547 -00000000 -14760545 -00000000 -3c080622 -3508c000 -3c09849e -3529669e -01090018 -0000a812 -0000b010 -3c0221f2 -34428000 -3c03fd0a -3463f6e8 -14550538 -00000000 -14760536 -00000000 -3c08fe11 -3508325e -3c095a98 -35290480 -01090018 -0000a812 -0000b010 -3c024132 -3442a700 -3c03ff50 -3463e5e2 -14550529 -00000000 -14760527 -00000000 -3c08b582 -3508a660 -3c092716 -35291c30 -01090018 -0000a812 -0000b010 -3c023ef1 -3442b200 -3c03f4a0 -3463785f -1455051a -00000000 -14760518 -00000000 -3c08de43 -35086ee0 -3c090b8f -3529d2ea -01090018 -0000a812 -0000b010 -3c0209b7 -344218c0 -3c03fe79 -3463f1a3 -1455050b -00000000 -14760509 -00000000 -3c083ca5 -3508ebcc -3c097fca -352989b0 -01090018 -0000a812 -0000b010 -3c02c03a -34424840 -3c031e46 -34634b84 -145504fc -00000000 -147604fa -00000000 -3c08ed8a -3508c2a2 -3c098e11 -3529d628 -01090018 -0000a812 -0000b010 -3c02e523 -3442d550 -3c030836 -3463ec19 -145504ed -00000000 -147604eb -00000000 -3c08ee62 -3508ac9c -3c09446a -3529ed90 -01090018 -0000a812 -0000b010 -3c0259e5 -344283c0 -3c03fb4a -3463da5c -145504de -00000000 -147604dc -00000000 -3c08a5a4 -35081fa0 -3c09901e -3529cf7a -01090018 -0000a812 -0000b010 -3c025a89 -34427240 -3c03277d -3463522a -145504cf -00000000 -147604cd -00000000 -3c081665 -3508a95c -3c0901fa -35290f1c -01090018 -0000a812 -0000b010 -3c0227e2 -3442ea10 -3c03002c -34634643 -145504c0 -00000000 -147604be -00000000 -3c08f760 -3508c288 -3c09024d -35299a70 -01090018 -0000a812 -0000b010 -3c020242 -3442eb80 -3c03ffec -3463246c -145504b1 -00000000 -147604af -00000000 -3c08b91b -35081700 -3c09ff6a -35297770 -01090018 -0000a812 -0000b010 -3c02198b -34421000 -3c030029 -3463690d -145504a2 -00000000 -147604a0 -00000000 -3c0838a1 -35085d4c -3c094d37 -35298f48 -01090018 -0000a812 -0000b010 -3c02f7d3 -3442b160 -3c031114 -3463d36c -14550493 -00000000 -14760491 -00000000 -3c08e1d0 -3508a988 -3c092906 -35292820 -01090018 -0000a812 -0000b010 -3c0295c2 -34427100 -3c03fb29 -3463b14f -14550484 -00000000 -14760482 -00000000 -3c08b657 -3508c3ec -3c094237 -35293c21 -01090018 -0000a812 -0000b010 -3c0202ef -3442916c -3c03ecf2 -3463bc11 -14550475 -00000000 -14760473 -00000000 -3c088cd7 -35082e00 -3c090657 -3529e392 -01090018 -0000a812 -0000b010 -3c02c282 -34423c00 -3c03fd25 -346381d5 -14550466 -00000000 -14760464 -00000000 -3c08cffc -3508a4a4 -3c09f52a -3529ba30 -01090018 -0000a812 -0000b010 -3c0285e6 -344206c0 -3c030208 -34632174 -14550457 -00000000 -14760455 -00000000 -3c08d823 -3508b826 -3c09ed60 -35291012 -01090018 -0000a812 -0000b010 -3c02aa45 -344252ac -3c0302e6 -34636439 -14550448 -00000000 -14760446 -00000000 -3c08306f -35087f24 -3c096384 -3529a554 -01090018 -0000a812 -0000b010 -3c023c17 -3442ebd0 -3c0312d4 -346336f0 -14550439 -00000000 -14760437 -00000000 -3c080c59 -3508e770 -3c093e38 -35297808 -01090018 -0000a812 -0000b010 -3c0247cb -3442bb80 -3c030300 -34637f82 -1455042a -00000000 -14760428 -00000000 -3c08c1dd -3508451c -3c09e125 -3529f520 -01090018 -0000a812 -0000b010 -3c0297d8 -34426f80 -3c03077c -3463fe1d -1455041b -00000000 -14760419 -00000000 -3c08ef4e -350868d4 -3c099ff2 -3529ad9b -01090018 -0000a812 -0000b010 -3c02a5b8 -3442bc5c -3c030643 -34637714 -1455040c -00000000 -1476040a -00000000 -3c087ef6 -3508ec24 -3c09b177 -3529da10 -01090018 -0000a812 -0000b010 -3c02dd41 -34426a40 -3c03d90d -34633e0e -145503fd -00000000 -147603fb -00000000 -3c086fb2 -35085f72 -3c09791e -3529bb10 -01090018 -0000a812 -0000b010 -3c02583a -34423d20 -3c0334d8 -3463b7a2 -145503ee -00000000 -147603ec -00000000 -3c085810 -35081600 -3c09d384 -35290640 -01090018 -0000a812 -0000b010 -3c02bc89 -34428000 -3c03f0b2 -34639693 -145503df -00000000 -147603dd -00000000 -3c0807af -3508fc60 -3c095ea8 -3529d5b0 -01090018 -0000a812 -0000b010 -3c0294f9 -34426200 -3c0302d7 -3463b093 -145503d0 -00000000 -147603ce -00000000 -3c08f952 -3508c740 -3c097397 -35298b1c -01090018 -0000a812 -0000b010 -3c027dfd -34428b00 -3c03fcfc -34633bb4 -145503c1 -00000000 -147603bf -00000000 -3c088f68 -35089828 -3c099156 -35295574 -01090018 -0000a812 -0000b010 -3c027b5a -34423a20 -3c0330ab -3463ad94 -145503b2 -00000000 -147603b0 -00000000 -3c08914d -35088000 -3c09ba3b -352944b8 -01090018 -0000a812 -0000b010 -3c0285b4 -3c031e2b -34632e25 -145503a4 -00000000 -147603a2 -00000000 -3c084d2e -35083cf5 -3c0970e9 -3529d5e8 -01090018 -0000a812 -0000b010 -3c02159c -34421708 -3c03220a -3463ba3e -14550395 -00000000 -14760393 -00000000 -3c08b037 -3508ad58 -3c091195 -35292040 -01090018 -0000a812 -0000b010 -3c02bfce -34425600 -3c03fa85 -346338dd -14550386 -00000000 -14760384 -00000000 -3c08a424 -35086038 -3c09111a -3529d568 -01090018 -0000a812 -0000b010 -3c027085 -3442aec0 -3c03f9dc -3463c982 -14550377 -00000000 -14760375 -00000000 -3c08ef96 -35084a3a -3c09d18d -35295d08 -01090018 -0000a812 -0000b010 -3c02519b -344263d0 -3c0302fa -3463582f -14550368 -00000000 -14760366 -00000000 -3c08a4a7 -3508728e -3c099784 -35293fdc -01090018 -0000a812 -0000b010 -3c02884f -34426408 -3c032548 -34632191 -14550359 -00000000 -14760357 -00000000 -3c08df30 -3508b100 -3c092509 -352933f8 -01090018 -0000a812 -0000b010 -3c02236e -34427800 -3c03fb40 -3463dba2 -1455034a -00000000 -14760348 -00000000 -3c081d58 -350818a4 -3c09e509 -35293304 -01090018 -0000a812 -0000b010 -3c02940d -34420e90 -3c03fce8 -3463c358 -1455033b -00000000 -14760339 -00000000 -3c081512 -35082298 -3c09cbbb -35299870 -01090018 -0000a812 -0000b010 -3c02c981 -34426280 -3c03fbb2 -3463afa1 -1455032c -00000000 -1476032a -00000000 -3c0888ca -3508117e -3c090e12 -35295f90 -01090018 -0000a812 -0000b010 -3c020d03 -344298e0 -3c03f972 -34637eaa -1455031d -00000000 -1476031b -00000000 -3c08df4e -3508f397 -3c09da63 -3529b6b6 -01090018 -0000a812 -0000b010 -3c02acb3 -3442875a -3c0304cd -34638c0a -1455030e -00000000 -1476030c -00000000 -3c086683 -3508ae60 -3c0963fc -35291988 -01090018 -0000a812 -0000b010 -3c02187c -34420300 -3c032809 -3463e048 -145502ff -00000000 -147602fd -00000000 -3c08e6a5 -35086cae -3c09d000 -35293efb -01090018 -0000a812 -0000b010 -3c029483 -3442b29a -3c0304c0 -3463f562 -145502f0 -00000000 -147602ee -00000000 -3c087d58 -3508aade -3c095b21 -352967ac -01090018 -0000a812 -0000b010 -3c02d4f0 -34421f28 -3c032c9e -3463dfed -145502e1 -00000000 -147602df -00000000 -3c086111 -35088bd0 -3c099e01 -35296e14 -01090018 -0000a812 -0000b010 -3c020b42 -34424c40 -3c03dad7 -3463d349 -145502d2 -00000000 -147602d0 -00000000 -3c087fdd -350822be -3c09fdcc -35299fee -01090018 -0000a812 -0000b010 -3c02ad92 -34424ea4 -3c03fee6 -34639cb0 -145502c3 -00000000 -147602c1 -00000000 -3c0870e2 -350873a0 -3c09d87f -3529c19c -01090018 -0000a812 -0000b010 -3c02df8a -34421580 -3c03ee94 -3463f3a5 -145502b4 -00000000 -147602b2 -00000000 -3c083940 -3508dad6 -3c09a37c -3529292b -01090018 -0000a812 -0000b010 -3c024299 -344207f2 -3c03eb4f -3463351f -145502a5 -00000000 -147602a3 -00000000 -3c08ba7a -3508b435 -3c092322 -3529d7d0 -01090018 -0000a812 -0000b010 -3c02bf14 -3442ee10 -3c03f675 -34635053 -14550296 -00000000 -14760294 -00000000 -3c080b23 -35088760 -3c092bff -35292a02 -01090018 -0000a812 -0000b010 -3c02e31c -3442cec0 -3c0301ea -346311f4 -14550287 -00000000 -14760285 -00000000 -3c08aa6a -35089390 -3c098d3a -3529b108 -01090018 -0000a812 -0000b010 -3c02c1fb -34422c80 -3c03265e -346380ac -14550278 -00000000 -14760276 -00000000 -3c08e366 -35087224 -3c09bf51 -35294d80 -01090018 -0000a812 -0000b010 -3c027cf1 -3442e600 -3c030739 -3463e7c6 -14550269 -00000000 -14760267 -00000000 -3c0853b1 -3508b42e -3c097c60 -35298578 -01090018 -0000a812 -0000b010 -3c026728 -34425b90 -3c0328a9 -3463a18c -1455025a -00000000 -14760258 -00000000 -3c088241 -3508ddf4 -3c094a8d -35290e90 -01090018 -0000a812 -0000b010 -3c02a694 -34423140 -3c03db61 -3463c148 -1455024b -00000000 -14760249 -00000000 -3c087cdc -3508d5cf -3c09e584 -3529065f -01090018 -0000a812 -0000b010 -3c02ecb2 -344231d1 -3c03f315 -34631a6c -1455023c -00000000 -1476023a -00000000 -3c085044 -35085224 -3c09b34e -35298c5c -01090018 -0000a812 -0000b010 -3c026871 -344234f0 -3c03e7f4 -3463141e -1455022d -00000000 -1476022b -00000000 -3c08436d -350875a7 -3c092cb9 -3529b728 -01090018 -0000a812 -0000b010 -3c0281e3 -3442c318 -3c030bc7 -3463ba90 -1455021e -00000000 -1476021c -00000000 -3c08db90 -35086f30 -3c090eaf -3529a7d0 -01090018 -0000a812 -0000b010 -3c023fb2 -3442a700 -3c03fde8 -3463e5ee -1455020f -00000000 -1476020d -00000000 -3c085aa5 -3508b57e -3c09eb13 -35298c80 -01090018 -0000a812 -0000b010 -3c021475 -3442a700 -3c03f897 -34635429 -14550200 -00000000 -147601fe -00000000 -3c08bc61 -3508fc9c -3c092c0b -35290f78 -01090018 -0000a812 -0000b010 -3c02b66f -34428d20 -3c03f45d -3463eb8a -145501f1 -00000000 -147601ef -00000000 -3c088b35 -350866b7 -3c092b02 -35291ecc -01090018 -0000a812 -0000b010 -3c02bb05 -34424bd4 -3c03ec61 -3463009e -145501e2 -00000000 -147601e0 -00000000 -3c08666e -350854e8 -3c09ed91 -3529452c -01090018 -0000a812 -0000b010 -3c023741 -34421fe0 -3c03f89f -3463efde -145501d3 -00000000 -147601d1 -00000000 -3c08c6e5 -35089380 -3c09fa93 -35295180 -01090018 -0000a812 -0000b010 -3c02c8f5 -34424000 -3c030135 -3463c230 -145501c4 -00000000 -147601c2 -00000000 -3c08d921 -3508e0b0 -3c091f7d -352965c0 -01090018 -0000a812 -0000b010 -3c023cfd -3442f400 -3c03fb38 -3463104d -145501b5 -00000000 -147601b3 -00000000 -3c087b8d -3508b2e2 -3c0984d3 -35297b50 -01090018 -0000a812 -0000b010 -3c02a980 -34427ca0 -3c03c48d -34636ea8 -145501a6 -00000000 -147601a4 -00000000 -3c08f89e -35081b58 -3c0926be -352932a0 -01090018 -0000a812 -0000b010 -3c029f78 -34424700 -3c03fee1 -3463fbf1 -14550197 -00000000 -14760195 -00000000 -3c08524a -3508a0a6 -3c090b33 -35294594 -01090018 -0000a812 -0000b010 -3c02d383 -34429df8 -3c030399 -3463b022 -14550188 -00000000 -14760186 -00000000 -3c08a3be -350810e8 -3c0918db -3529c860 -01090018 -0000a812 -0000b010 -3c021af3 -34429700 -3c03f70a -34639cf8 -14550179 -00000000 -14760177 -00000000 -3c08073c -3508f5be -3c094fbf -35294882 -01090018 -0000a812 -0000b010 -3c02ccd4 -34423a7c -3c030241 -3463385d -1455016a -00000000 -14760168 -00000000 -3c0891db -35087100 -3c091f78 -3529ebb0 -01090018 -0000a812 -0000b010 -3c02af98 -3442b000 -3c03f275 -34638c24 -1455015b -00000000 -14760159 -00000000 -3c08c49e -350836d8 -3c092044 -3529fa90 -01090018 -0000a812 -0000b010 -3c02abed -3442c980 -3c03f883 -3463c6c2 -1455014c -00000000 -1476014a -00000000 -3c08af4a -3508b2b8 -3c09f008 -35296f40 -01090018 -0000a812 -0000b010 -3c024bea -34427600 -3c030508 -3463ac17 -1455013d -00000000 -1476013b -00000000 -3c08c72f -35080de2 -3c09407a -352926e0 -01090018 -0000a812 -0000b010 -3c0262ef -3442b1c0 -3c03f1b0 -3463a744 -1455012e -00000000 -1476012c -00000000 -3c0895d2 -35086876 -3c099aae -3529ce1c -01090018 -0000a812 -0000b010 -3c02af46 -344260e8 -3c032a05 -3463a9e7 -1455011f -00000000 -1476011d -00000000 -3c0872e2 -3508ec10 -3c09b909 -35298e00 -01090018 -0000a812 -0000b010 -3c02bb80 -3442e000 -3c03e027 -34635a3b -14550110 -00000000 -1476010e -00000000 -3c08deb2 -35087a9c -3c09506c -35290849 -01090018 -0000a812 -0000b010 -3c028e89 -3442d67c -3c03f589 -3463b888 -14550101 -00000000 -147600ff -00000000 -3c085301 -350894f0 -24090000 -01090018 -0000a812 -0000b010 -24020000 -24030000 -145500f5 -00000000 -147600f3 -00000000 -3c085a1a -35084f60 -24090000 -01090018 -0000a812 -0000b010 -24020000 -24030000 -145500e9 -00000000 -147600e7 -00000000 -3c085cc4 -3508e136 -24090000 -01090018 -0000a812 -0000b010 -24020000 -24030000 -145500dd -00000000 -147600db -00000000 -3c08ab7a -350814c0 -24090000 -01090018 -0000a812 -0000b010 -24020000 -24030000 -145500d1 -00000000 -147600cf -00000000 -3c0844d1 -350826d0 -24090000 -01090018 -0000a812 -0000b010 -24020000 -24030000 -145500c5 -00000000 -147600c3 -00000000 -3c080f11 -35084ff0 -24090000 -01090018 -0000a812 -0000b010 -24020000 -24030000 -145500b9 -00000000 -147600b7 -00000000 -3c0860bf -3508e48e -24090000 -01090018 -0000a812 -0000b010 -24020000 -24030000 -145500ad -00000000 -147600ab -00000000 -3c08102c -3508eba0 -24090000 -01090018 -0000a812 -0000b010 -24020000 -24030000 -145500a1 -00000000 -1476009f -00000000 -3c087b21 -3508e54d -24090000 -01090018 -0000a812 -0000b010 -24020000 -24030000 -14550095 -00000000 -14760093 -00000000 -3c085d72 -3508f954 -24090000 -01090018 -0000a812 -0000b010 -24020000 -24030000 -14550089 -00000000 -14760087 -00000000 -3c082699 -3508b2d4 -24090000 -01090018 -0000a812 -0000b010 -24020000 -24030000 -1455007d -00000000 -1476007b -00000000 -3c0866b6 -3508dc30 -24090000 -01090018 -0000a812 -0000b010 -24020000 -24030000 -14550071 -00000000 -1476006f -00000000 -24080000 -3c094ae5 -352969a0 -01090018 -0000a812 -0000b010 -24020000 -24030000 -14550065 -00000000 -14760063 -00000000 -24080000 -3c092582 -3529c9c0 -01090018 -0000a812 -0000b010 -24020000 -24030000 -14550059 -00000000 -14760057 -00000000 -24080000 -3c09a2f0 -35291d2e -01090018 -0000a812 -0000b010 -24020000 -24030000 -1455004d -00000000 -1476004b -00000000 -24080000 -3c092c53 -352900d7 -01090018 -0000a812 -0000b010 -24020000 -24030000 -14550041 -00000000 -1476003f -00000000 -24080000 -3c097a95 -3529fab0 -01090018 -0000a812 -0000b010 -24020000 -24030000 -14550035 -00000000 -14760033 -00000000 -24080000 -3c09f415 -3529d1b4 -01090018 -0000a812 -0000b010 -24020000 -24030000 -14550029 -00000000 -14760027 -00000000 -24080000 -3c090caf -35297d5c -01090018 -0000a812 -0000b010 -24020000 -24030000 -1455001d -00000000 -1476001b -00000000 -24080000 -3c09ae15 -3529e524 -01090018 -0000a812 -0000b010 -24020000 -24030000 -14550011 -00000000 -1476000f -00000000 -24080000 -24090000 -01090018 -0000a812 -0000b010 -24020000 -24030000 -14550006 -00000000 -14760004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -00000000 -26100001 -24120000 -164000ec -001fb821 -3c16800d -0ff0db71 -3c07800d -100000e7 -00000000 -0017f821 -14f600e4 -00000000 -001fb821 -24f68123 -0ff0db7a -24e68123 -100000de -00000000 -0017f821 -14d600db -00000000 -001fb821 -acf69ee0 -0ff0db83 -ace69ee0 -100000d5 -00000000 -0017f821 -14d600d2 -00000000 -001fb821 -8cf69ee0 -0ff0db8c -8ce59ee0 -100000cc -00000000 -0017f821 -14b600c9 -00000000 -001fb821 -00c5b021 -0ff0db95 -00c52021 -100000c3 -00000000 -0017f821 -149600c0 -00000000 -001fb821 -0232b025 -0ff0db9e -02326025 -100000ba -00000000 -0017f821 -159600b7 -00000000 -001fb821 -0253b02a -0ff0dba7 -0253682a -100000b1 -00000000 -0017f821 -15b600ae -00000000 -001fb821 -2a568011 -0ff0dbb0 -2a4e8011 -100000a8 -00000000 -0017f821 -15d600a5 -00000000 -001fb821 -2e568011 -0ff0dbb9 -2e4f8011 -1000009f -00000000 -0017f821 -15f6009c -00000000 -001fb821 -0253b02b -0ff0dbc2 -0253c02b -10000096 -00000000 -0017f821 -17160093 -00000000 -001fb821 -0012b440 -0ff0dbcb -00124c40 -1000008d -00000000 -0017f821 -1536008a -00000000 -001fb821 -0110b020 -0ff0dbd4 -01105020 -10000084 -00000000 -0017f821 -15560081 -00000000 -001fb821 -22168002 -0ff0dbdd -220b8002 -1000007b -00000000 -0017f821 -15760078 -00000000 -001fb821 -0110b022 -0ff0dbe6 -01106022 -10000072 -00000000 -0017f821 -1596006f -00000000 -001fb821 -0110b023 -0ff0dbef -01106823 -10000069 -00000000 -0017f821 -15b60066 -00000000 -001fb821 -0110b024 -0ff0dbf8 -01107024 -10000060 -00000000 -0017f821 -15d6005d -00000000 -001fb821 -32168ff2 -0ff0dc01 -320f8ff2 -10000057 -00000000 -0017f821 -15f60054 -00000000 -001fb821 -0110b027 -0ff0dc0a -0110c027 -1000004e -00000000 -0017f821 -1716004b -00000000 -001fb821 -36168ff2 -0ff0dc13 -36098ff2 -10000045 -00000000 -0017f821 -15360042 -00000000 -001fb821 -0110b026 -0ff0dc1c -01105026 -1000003c -00000000 -0017f821 -15560039 -00000000 -001fb821 -3a168ff2 -0ff0dc25 -3a0b8ff2 -10000033 -00000000 -0017f821 -15760030 -00000000 -001fb821 -0208b004 -0ff0dc2e -02086004 -1000002a -00000000 -0017f821 -15960027 -00000000 -001fb821 -0010b203 -0ff0dc37 -00106a03 -10000021 -00000000 -0017f821 -15b6001e -00000000 -001fb821 -0208b007 -0ff0dc40 -02087007 -10000018 -00000000 -0017f821 -15d60015 -00000000 -001fb821 -0010b202 -0ff0dc49 -00107a02 -1000000f -00000000 -0017f821 -15f6000c -00000000 -001fb821 -0208b006 -0ff0dc52 -0208c006 -10000006 -00000000 -0017f821 -17160003 -00000000 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -24120000 -3c09c83b -35290be0 -3c08800d -35086760 -2403000b -ad0937a0 -25040004 -2505fff8 -ac8437a0 -aca537a0 -810237a1 -8c8537a0 -8ca437a0 -8ca637a0 -144308d5 -00000000 -3c091eec -3529280c -3c08800d -35084598 -2403000c -3c010001 -00280821 -ac29980c -25040004 -2505fff8 -3c010001 -00240821 -ac24980c -3c010001 -00250821 -ac25980c -3c020001 -00481021 -8042980c -3c050001 -00a42821 -8ca5980c -3c040001 -00852021 -8c84980c -3c060001 -00c53021 -8cc6980c -144308b7 -00000000 -3c09a0af -3529ed52 -3c08800d -35084590 -2403ffaf -3c010001 -00280821 -ac298a80 -25040004 -2505fff8 -3c010001 -00240821 -ac248a80 -3c010001 -00250821 -ac258a80 -3c020001 -00481021 -80428a82 -3c050001 -00a42821 -8ca58a80 -3c040001 -00852021 -8c848a80 -3c060001 -00c53021 -8cc68a80 -14430899 -00000000 -3c091eb6 -352937c7 -3c08800d -3508165c -2403ffb6 -ad096a98 -25040004 -2505fff8 -ac846a98 -aca56a98 -81026a9a -8c856a98 -8ca46a98 -8ca66a98 -14430889 -00000000 -3c098541 -35295fbc -3c08800d -35081430 -2403ffbc -ad095e48 -25040004 -2505fff8 -ac845e48 -aca55e48 -81025e48 -8c855e48 -8ca45e48 -8ca65e48 -14430879 -00000000 -3c09499d -35297dd4 -3c08800d -35084974 -2403ffd4 -ad090edc -25040004 -2505fff8 -ac840edc -aca50edc -81020edc -8c850edc -8ca40edc -8ca60edc -14430869 -00000000 -3c09c6e3 -35291856 -3c08800d -3508d704 -24030056 -ad091e9c -25040004 -2505fff8 -ac841e9c -aca51e9c -81021e9c -8c851e9c -8ca41e9c -8ca61e9c -14430859 -00000000 -3c095ad9 -35299018 -3c08800d -350868f0 -24030018 -ad097ba4 -25040004 -2505fff8 -ac847ba4 -aca57ba4 -81027ba4 -8c857ba4 -8ca47ba4 -8ca67ba4 -14430849 -00000000 -3c094404 -352911ac -3c08800d -350874e8 -2403ffac -ad092240 -25040004 -2505fff8 -ac842240 -aca52240 -81022240 -8c852240 -8ca42240 -8ca62240 -14430839 -00000000 -3c09e556 -35297fd6 -3c08800d -35085f60 -2403ffd6 -3c010001 -00280821 -ac299418 -25040004 -2505fff8 -3c010001 -00240821 -ac249418 -3c010001 -00250821 -ac259418 -3c020001 -00481021 -80429418 -3c050001 -00a42821 -8ca59418 -3c040001 -00852021 -8c849418 -3c060001 -00c53021 -8cc69418 -1443081b -00000000 -3c092ede -35298ae6 -3c08800d -35083bdc -2403ff8a -ad097c2c -25040004 -2505fff8 -ac847c2c -aca57c2c -81027c2d -8c857c2c -8ca47c2c -8ca67c2c -1443080b -00000000 -3c096488 -35291a10 -3c08800d -3508cd7c -2403ff88 -ad090484 -25040004 -2505fff8 -ac840484 -aca50484 -81020486 -8c850484 -8ca40484 -8ca60484 -144307fb -00000000 -3c0948fc -35293566 -3c08800d -350859f4 -2403fffc -ad095c50 -25040004 -2505fff8 -ac845c50 -aca55c50 -81025c52 -8c855c50 -8ca45c50 -8ca65c50 -144307eb -00000000 -3c09d933 -35294400 -3c08800d -35086648 -24030000 -ad097054 -25040004 -2505fff8 -ac847054 -aca57054 -81027054 -8c857054 -8ca47054 -8ca67054 -144307db -00000000 -3c09751c -35296a16 -3c08800d -3508278c -2403006a -ad097124 -25040004 -2505fff8 -ac847124 -aca57124 -81027125 -8c857124 -8ca47124 -8ca67124 -144307cb -00000000 -3c0959ea -35296680 -3c08800d -35089b48 -2403ffea -ad090f40 -25040004 -2505fff8 -ac840f40 -aca50f40 -81020f42 -8c850f40 -8ca40f40 -8ca60f40 -144307bb -00000000 -3c09fb87 -3529edd4 -3c08800d -35083f18 -2403ffd4 -ad092f00 -25040004 -2505fff8 -ac842f00 -aca52f00 -81022f00 -8c852f00 -8ca42f00 -8ca62f00 -144307ab -00000000 -3c09dca5 -35292840 -3c08800d -35083960 -24030040 -ad092efc -25040004 -2505fff8 -ac842efc -aca52efc -81022efc -8c852efc -8ca42efc -8ca62efc -1443079b -00000000 -3c094cdd -352943c8 -3c08800d -3508a6e0 -2403ffc8 -ad09213c -25040004 -2505fff8 -ac84213c -aca5213c -8102213c -8c85213c -8ca4213c -8ca6213c -1443078b -00000000 -3c096d3d -3529ceb8 -3c08800d -35080c90 -2403ffb8 -ad090338 -25040004 -2505fff8 -ac840338 -aca50338 -81020338 -8c850338 -8ca40338 -8ca60338 -1443077b -00000000 -3c09e838 -352914f0 -3c08800d -350844e8 -2403fff0 -ad092174 -25040004 -2505fff8 -ac842174 -aca52174 -81022174 -8c852174 -8ca42174 -8ca62174 -1443076b -00000000 -3c09bb62 -3529f9ba -3c08800d -35081408 -2403ffba -ad093c40 -25040004 -2505fff8 -ac843c40 -aca53c40 -81023c40 -8c853c40 -8ca43c40 -8ca63c40 -1443075b -00000000 -3c099eb5 -35292b80 -3c08800d -3508d46c -2403ffb5 -ad0902ac -25040004 -2505fff8 -ac8402ac -aca502ac -810202ae -8c8502ac -8ca402ac -8ca602ac -1443074b -00000000 -3c093fe8 -35296b54 -3c08800d -35082424 -2403003f -3c010001 -00280821 -ac29a6f4 -25040004 -2505fff8 -3c010001 -00240821 -ac24a6f4 -3c010001 -00250821 -ac25a6f4 -3c020001 -00481021 -8042a6f7 -3c050001 -00a42821 -8ca5a6f4 -3c040001 -00852021 -8c84a6f4 -3c060001 -00c53021 -8cc6a6f4 -1443072d -00000000 -3c09bbd2 -3529dc3c -3c08800d -35084040 -2403003c -ad097528 -25040004 -2505fff8 -ac847528 -aca57528 -81027528 -8c857528 -8ca47528 -8ca67528 -1443071d -00000000 -3c09dc0d -35299270 -3c08800d -35084e40 -24030070 -ad096c98 -25040004 -2505fff8 -ac846c98 -aca56c98 -81026c98 -8c856c98 -8ca46c98 -8ca66c98 -1443070d -00000000 -3c09946b -35299d00 -3c08800d -35082ba8 -24030000 -3c010001 -00280821 -ac298d40 -25040004 -2505fff8 -3c010001 -00240821 -ac248d40 -3c010001 -00250821 -ac258d40 -3c020001 -00481021 -80428d40 -3c050001 -00a42821 -8ca58d40 -3c040001 -00852021 -8c848d40 -3c060001 -00c53021 -8cc68d40 -144306ef -00000000 -3c09be6d -35299734 -3c08800d -3508a6d4 -24030034 -ad0918f0 -25040004 -2505fff8 -ac8418f0 -aca518f0 -810218f0 -8c8518f0 -8ca418f0 -8ca618f0 -144306df -00000000 -3c0916e0 -3529b3c0 -3c08800d -350880ac -24030016 -ad096fe8 -25040004 -2505fff8 -ac846fe8 -aca56fe8 -81026feb -8c856fe8 -8ca46fe8 -8ca66fe8 -144306cf -00000000 -3c096bc4 -35299d90 -3c08800d -3508b9dc -2403ffc4 -ad0925b8 -25040004 -2505fff8 -ac8425b8 -aca525b8 -810225ba -8c8525b8 -8ca425b8 -8ca625b8 -144306bf -00000000 -3c096346 -3529f980 -3c08800d -35087f2c -2403ff80 -ad094c38 -25040004 -2505fff8 -ac844c38 -aca54c38 -81024c38 -8c854c38 -8ca44c38 -8ca64c38 -144306af -00000000 -3c09c1a4 -35296720 -3c08800d -350858f4 -2403ffa4 -3c010001 -00280821 -ac2997a4 -25040004 -2505fff8 -3c010001 -00240821 -ac2497a4 -3c010001 -00250821 -ac2597a4 -3c020001 -00481021 -804297a6 -3c050001 -00a42821 -8ca597a4 -3c040001 -00852021 -8c8497a4 -3c060001 -00c53021 -8cc697a4 -14430691 -00000000 -3c0964ce -3529f3ac -3c08800d -35081498 -2403ffac -ad09729c -25040004 -2505fff8 -ac84729c -aca5729c -8102729c -8c85729c -8ca4729c -8ca6729c -14430681 -00000000 -3c09a730 -3529cfc0 -3c08800d -35081b80 -2403ffa7 -ad09254c -25040004 -2505fff8 -ac84254c -aca5254c -8102254f -8c85254c -8ca4254c -8ca6254c -14430671 -00000000 -3c093824 -35290a20 -3c08800d -35083280 -24030038 -3c010001 -00280821 -ac2999d0 -25040004 -2505fff8 -3c010001 -00240821 -ac2499d0 -3c010001 -00250821 -ac2599d0 -3c020001 -00481021 -804299d3 -3c050001 -00a42821 -8ca599d0 -3c040001 -00852021 -8c8499d0 -3c060001 -00c53021 -8cc699d0 -14430653 -00000000 -3c09a6f3 -3529c710 -3c08800d -35080344 -24030010 -3c010001 -00280821 -ac29e3b0 -25040004 -2505fff8 -3c010001 -00240821 -ac24e3b0 -3c010001 -00250821 -ac25e3b0 -3c020001 -00481021 -8042e3b0 -3c050001 -00a42821 -8ca5e3b0 -3c040001 -00852021 -8c84e3b0 -3c060001 -00c53021 -8cc6e3b0 -14430635 -00000000 -3c0969cd -35296980 -3c08800d -350873a8 -2403ffcd -ad09559c -25040004 -2505fff8 -ac84559c -aca5559c -8102559e -8c85559c -8ca4559c -8ca6559c -14430625 -00000000 -3c097aec -3529b546 -3c08800d -35088730 -24030046 -ad096b60 -25040004 -2505fff8 -ac846b60 -aca56b60 -81026b60 -8c856b60 -8ca46b60 -8ca66b60 -14430615 -00000000 -3c099c24 -35294870 -3c08800d -35082bd0 -24030070 -ad094344 -25040004 -2505fff8 -ac844344 -aca54344 -81024344 -8c854344 -8ca44344 -8ca64344 -14430605 -00000000 -3c091dd2 -3529d522 -3c08800d -350806d8 -2403ffd2 -ad092374 -25040004 -2505fff8 -ac842374 -aca52374 -81022376 -8c852374 -8ca42374 -8ca62374 -144305f5 -00000000 -3c09fca7 -35291dcc -3c08800d -350823a8 -2403001d -3c010001 -00280821 -ac29b4dc -25040004 -2505fff8 -3c010001 -00240821 -ac24b4dc -3c010001 -00250821 -ac25b4dc -3c020001 -00481021 -8042b4dd -3c050001 -00a42821 -8ca5b4dc -3c040001 -00852021 -8c84b4dc -3c060001 -00c53021 -8cc6b4dc -144305d7 -00000000 -3c098b31 -35297ee0 -3c08800d -35080ca4 -2403ffe0 -3c010001 -00280821 -ac29d47c -25040004 -2505fff8 -3c010001 -00240821 -ac24d47c -3c010001 -00250821 -ac25d47c -3c020001 -00481021 -8042d47c -3c050001 -00a42821 -8ca5d47c -3c040001 -00852021 -8c84d47c -3c060001 -00c53021 -8cc6d47c -144305b9 -00000000 -3c0930b7 -35293214 -3c08800d -3508076c -2403ffb7 -ad095b48 -25040004 -2505fff8 -ac845b48 -aca55b48 -81025b4a -8c855b48 -8ca45b48 -8ca65b48 -144305a9 -00000000 -3c09ef77 -35298c1c -3c08800d -3508a97c -2403001c -ad092df8 -25040004 -2505fff8 -ac842df8 -aca52df8 -81022df8 -8c852df8 -8ca42df8 -8ca62df8 -14430599 -00000000 -3c09c4aa -352918c0 -3c08800d -35083af8 -2403ffc0 -3c010001 -00280821 -ac29c2ac -25040004 -2505fff8 -3c010001 -00240821 -ac24c2ac -3c010001 -00250821 -ac25c2ac -3c020001 -00481021 -8042c2ac -3c050001 -00a42821 -8ca5c2ac -3c040001 -00852021 -8c84c2ac -3c060001 -00c53021 -8cc6c2ac -1443057b -00000000 -3c09fe4b -35297514 -3c08800d -3508e080 -24030014 -ad0907c8 -25040004 -2505fff8 -ac8407c8 -aca507c8 -810207c8 -8c8507c8 -8ca407c8 -8ca607c8 -1443056b -00000000 -3c0943fc -352933e8 -3c08800d -35086478 -2403fffc -3c010001 -00280821 -ac29827c -25040004 -2505fff8 -3c010001 -00240821 -ac24827c -3c010001 -00250821 -ac25827c -3c020001 -00481021 -8042827e -3c050001 -00a42821 -8ca5827c -3c040001 -00852021 -8c84827c -3c060001 -00c53021 -8cc6827c -1443054d -00000000 -3c09a1e3 -35290564 -3c08800d -35085e8c -24030005 -ad091f44 -25040004 -2505fff8 -ac841f44 -aca51f44 -81021f45 -8c851f44 -8ca41f44 -8ca61f44 -1443053d -00000000 -3c099abb -35293880 -3c08800d -35081de0 -2403ffbb -3c010001 -00280821 -ac29de68 -25040004 -2505fff8 -3c010001 -00240821 -ac24de68 -3c010001 -00250821 -ac25de68 -3c020001 -00481021 -8042de6a -3c050001 -00a42821 -8ca5de68 -3c040001 -00852021 -8c84de68 -3c060001 -00c53021 -8cc6de68 -1443051f -00000000 -3c094653 -3529e630 -3c08800d -3508244c -24030030 -ad095878 -25040004 -2505fff8 -ac845878 -aca55878 -81025878 -8c855878 -8ca45878 -8ca65878 -1443050f -00000000 -3c09dfd3 -35292410 -3c08800d -3508833c -24030010 -ad09403c -25040004 -2505fff8 -ac84403c -aca5403c -8102403c -8c85403c -8ca4403c -8ca6403c -144304ff -00000000 -3c09eb7c -35295500 -3c08800d -35085aac -24030000 -ad095df0 -25040004 -2505fff8 -ac845df0 -aca55df0 -81025df0 -8c855df0 -8ca45df0 -8ca65df0 -144304ef -00000000 -3c09e410 -35296bd0 -3c08800d -35083dc4 -2403ffd0 -ad09712c -25040004 -2505fff8 -ac84712c -aca5712c -8102712c -8c85712c -8ca4712c -8ca6712c -144304df -00000000 -3c09ead2 -352986f4 -3c08800d -350850c4 -2403ffd2 -ad092220 -25040004 -2505fff8 -ac842220 -aca52220 -81022222 -8c852220 -8ca42220 -8ca62220 -144304cf -00000000 -3c09e9f4 -35299570 -3c08800d -35081d40 -24030070 -ad095724 -25040004 -2505fff8 -ac845724 -aca55724 -81025724 -8c855724 -8ca45724 -8ca65724 -144304bf -00000000 -3c09e395 -3529f2c0 -3c08800d -3508bbb8 -2403ff95 -ad093960 -25040004 -2505fff8 -ac843960 -aca53960 -81023962 -8c853960 -8ca43960 -8ca63960 -144304af -00000000 -3c096c9c -3529aac0 -3c08800d -35084dc4 -2403ffaa -ad092648 -25040004 -2505fff8 -ac842648 -aca52648 -81022649 -8c852648 -8ca42648 -8ca62648 -1443049f -00000000 -3c0911e6 -3529af20 -3c08800d -24030020 -3c010001 -00280821 -ac29bb0c -25040004 -2505fff8 -3c010001 -00240821 -ac24bb0c -3c010001 -00250821 -ac25bb0c -3c020001 -00481021 -8042bb0c -3c050001 -00a42821 -8ca5bb0c -3c040001 -00852021 -8c84bb0c -3c060001 -00c53021 -8cc6bb0c -14430482 -00000000 -3c098799 -35297498 -3c08800d -2403ff98 -ad090b00 -25040004 -2505fff8 -ac840b00 -aca50b00 -81020b00 -8c850b00 -8ca40b00 -8ca60b00 -14430473 -00000000 -3c0915ab -3529b120 -3c08800d -24030020 -3c010001 -00280821 -ac29b278 -25040004 -2505fff8 -3c010001 -00240821 -ac24b278 -3c010001 -00250821 -ac25b278 -3c020001 -00481021 -8042b278 -3c050001 -00a42821 -8ca5b278 -3c040001 -00852021 -8c84b278 -3c060001 -00c53021 -8cc6b278 -14430456 -00000000 -3c09833d -3529d7d0 -3c08800d -2403ffd0 -3c010001 -00280821 -ac29c380 -25040004 -2505fff8 -3c010001 -00240821 -ac24c380 -3c010001 -00250821 -ac25c380 -3c020001 -00481021 -8042c380 -3c050001 -00a42821 -8ca5c380 -3c040001 -00852021 -8c84c380 -3c060001 -00c53021 -8cc6c380 -14430439 -00000000 -3c097f44 -3529e290 -3c08800d -2403ff90 -ad0911d0 -25040004 -2505fff8 -ac8411d0 -aca511d0 -810211d0 -8c8511d0 -8ca411d0 -8ca611d0 -1443042a -00000000 -3c09992d -3529268f -3c08800d -2403ff99 -ad097b2c -25040004 -2505fff8 -ac847b2c -aca57b2c -81027b2f -8c857b2c -8ca47b2c -8ca67b2c -1443041b -00000000 -3c091599 -35296bf7 -3c08800d -2403ff99 -ad093488 -25040004 -2505fff8 -ac843488 -aca53488 -8102348a -8c853488 -8ca43488 -8ca63488 -1443040c -00000000 -3c092da0 -35292d90 -3c08800d -2403ff90 -ad095c10 -25040004 -2505fff8 -ac845c10 -aca55c10 -81025c10 -8c855c10 -8ca45c10 -8ca65c10 -144303fd -00000000 -3c0924da -3529c600 -3c08800d -2403ffda -ad0970d8 -25040004 -2505fff8 -ac8470d8 -aca570d8 -810270da -8c8570d8 -8ca470d8 -8ca670d8 -144303ee -00000000 -3c09c59c -3529d73c -3c08800d -2403003c -ad095fd8 -25040004 -2505fff8 -ac845fd8 -aca55fd8 -81025fd8 -8c855fd8 -8ca45fd8 -8ca65fd8 -144303df -00000000 -3c09994a -35297300 -3c08800d -2403004a -ad0972c8 -25040004 -2505fff8 -ac8472c8 -aca572c8 -810272ca -8c8572c8 -8ca472c8 -8ca672c8 -144303d0 -00000000 -3c097e40 -352951cd -3c08800d -24030040 -3c010001 -00280821 -ac29acd8 -25040004 -2505fff8 -3c010001 -00240821 -ac24acd8 -3c010001 -00250821 -ac25acd8 -3c020001 -00481021 -8042acda -3c050001 -00a42821 -8ca5acd8 -3c040001 -00852021 -8c84acd8 -3c060001 -00c53021 -8cc6acd8 -144303b3 -00000000 -3c09ba9f -3529b840 -3c08800d -24030040 -ad096b8c -25040004 -2505fff8 -ac846b8c -aca56b8c -81026b8c -8c856b8c -8ca46b8c -8ca66b8c -144303a4 -00000000 -3c097d10 -35299500 -3c08800d -2403007d -3c010001 -00280821 -ac29d8f4 -25040004 -2505fff8 -3c010001 -00240821 -ac24d8f4 -3c010001 -00250821 -ac25d8f4 -3c020001 -00481021 -8042d8f7 -3c050001 -00a42821 -8ca5d8f4 -3c040001 -00852021 -8c84d8f4 -3c060001 -00c53021 -8cc6d8f4 -14430387 -00000000 -3c09da70 -35299060 -3c08800d -24030060 -3c010001 -00280821 -ac298780 -25040004 -2505fff8 -3c010001 -00240821 -ac248780 -3c010001 -00250821 -ac258780 -3c020001 -00481021 -80428780 -3c050001 -00a42821 -8ca58780 -3c040001 -00852021 -8c848780 -3c060001 -00c53021 -8cc68780 -1443036a -00000000 -3c09a59f -35299eb8 -3c08800d -2403ffb8 -ad095590 -25040004 -2505fff8 -ac845590 -aca55590 -81025590 -8c855590 -8ca45590 -8ca65590 -1443035b -00000000 -3c091b9b -35299d20 -3c08800d -24030020 -3c010001 -00280821 -ac29b958 -25040004 -2505fff8 -3c010001 -00240821 -ac24b958 -3c010001 -00250821 -ac25b958 -3c020001 -00481021 -8042b958 -3c050001 -00a42821 -8ca5b958 -3c040001 -00852021 -8c84b958 -3c060001 -00c53021 -8cc6b958 -1443033e -00000000 -3c09e945 -3529cba3 -3c08800d -2403ffa3 -3c010001 -00280821 -ac29ebbc -25040004 -2505fff8 -3c010001 -00240821 -ac24ebbc -3c010001 -00250821 -ac25ebbc -3c020001 -00481021 -8042ebbc -3c050001 -00a42821 -8ca5ebbc -3c040001 -00852021 -8c84ebbc -3c060001 -00c53021 -8cc6ebbc -14430321 -00000000 -3c096122 -3529f40e -3c08800d -24030022 -3c010001 -00280821 -ac29e378 -25040004 -2505fff8 -3c010001 -00240821 -ac24e378 -3c010001 -00250821 -ac25e378 -3c020001 -00481021 -8042e37a -3c050001 -00a42821 -8ca5e378 -3c040001 -00852021 -8c84e378 -3c060001 -00c53021 -8cc6e378 -14430304 -00000000 -3c09066c -3529dae8 -3c08800d -2403006c -ad095d14 -25040004 -2505fff8 -ac845d14 -aca55d14 -81025d16 -8c855d14 -8ca45d14 -8ca65d14 -144302f5 -00000000 -3c0931ce -35294d3c -3c08800d -2403003c -3c010001 -00280821 -ac29df28 -25040004 -2505fff8 -3c010001 -00240821 -ac24df28 -3c010001 -00250821 -ac25df28 -3c020001 -00481021 -8042df28 -3c050001 -00a42821 -8ca5df28 -3c040001 -00852021 -8c84df28 -3c060001 -00c53021 -8cc6df28 -144302d8 -00000000 -3c09e95b -3529473a -3c08800d -2403003a -3c010001 -00280821 -ac299c80 -25040004 -2505fff8 -3c010001 -00240821 -ac249c80 -3c010001 -00250821 -ac259c80 -3c020001 -00481021 -80429c80 -3c050001 -00a42821 -8ca59c80 -3c040001 -00852021 -8c849c80 -3c060001 -00c53021 -8cc69c80 -144302bb -00000000 -3c0927a2 -3529d01c -3c08800d -24030027 -ad094d24 -25040004 -2505fff8 -ac844d24 -aca54d24 -81024d27 -8c854d24 -8ca44d24 -8ca64d24 -144302ac -00000000 -3c09d3db -3529cfc8 -3c08800d -2403ffdb -3c010001 -00280821 -ac29f20c -25040004 -2505fff8 -3c010001 -00240821 -ac24f20c -3c010001 -00250821 -ac25f20c -3c020001 -00481021 -8042f20e -3c050001 -00a42821 -8ca5f20c -3c040001 -00852021 -8c84f20c -3c060001 -00c53021 -8cc6f20c -1443028f -00000000 -3c09604f -3529bdca -3c08800d -2403ffca -3c010001 -00280821 -ac29c604 -25040004 -2505fff8 -3c010001 -00240821 -ac24c604 -3c010001 -00250821 -ac25c604 -3c020001 -00481021 -8042c604 -3c050001 -00a42821 -8ca5c604 -3c040001 -00852021 -8c84c604 -3c060001 -00c53021 -8cc6c604 -14430272 -00000000 -3c09d319 -3529d84e -3c08800d -2403004e -ad094a74 -25040004 -2505fff8 -ac844a74 -aca54a74 -81024a74 -8c854a74 -8ca44a74 -8ca64a74 -14430263 -00000000 -3c096506 -35292d8d -3c08800d -2403ff8d -ad0910bc -25040004 -2505fff8 -ac8410bc -aca510bc -810210bc -8c8510bc -8ca410bc -8ca610bc -14430254 -00000000 -3c096b30 -3529c710 -3c08800d -24030030 -3c010001 -00280821 -ac29eee0 -25040004 -2505fff8 -3c010001 -00240821 -ac24eee0 -3c010001 -00250821 -ac25eee0 -3c020001 -00481021 -8042eee2 -3c050001 -00a42821 -8ca5eee0 -3c040001 -00852021 -8c84eee0 -3c060001 -00c53021 -8cc6eee0 -14430237 -00000000 -3c090fa4 -35295c2f -3c08800d -2403ffa4 -3c010001 -00280821 -ac29dd24 -25040004 -2505fff8 -3c010001 -00240821 -ac24dd24 -3c010001 -00250821 -ac25dd24 -3c020001 -00481021 -8042dd26 -3c050001 -00a42821 -8ca5dd24 -3c040001 -00852021 -8c84dd24 -3c060001 -00c53021 -8cc6dd24 -1443021a -00000000 -3c097904 -3529ca38 -3c08800d -24030079 -ad093fd8 -25040004 -2505fff8 -ac843fd8 -aca53fd8 -81023fdb -8c853fd8 -8ca43fd8 -8ca63fd8 -1443020b -00000000 -3c094811 -35291e40 -3c08800d -24030040 -3c010001 -00280821 -ac29bd34 -25040004 -2505fff8 -3c010001 -00240821 -ac24bd34 -3c010001 -00250821 -ac25bd34 -3c020001 -00481021 -8042bd34 -3c050001 -00a42821 -8ca5bd34 -3c040001 -00852021 -8c84bd34 -3c060001 -00c53021 -8cc6bd34 -144301ee -00000000 -3c098b11 -35290828 -3c08800d -24030011 -3c010001 -00280821 -ac29b4bc -25040004 -2505fff8 -3c010001 -00240821 -ac24b4bc -3c010001 -00250821 -ac25b4bc -3c020001 -00481021 -8042b4be -3c050001 -00a42821 -8ca5b4bc -3c040001 -00852021 -8c84b4bc -3c060001 -00c53021 -8cc6b4bc -144301d1 -00000000 -3c09366c -35293980 -3c08800d -2403ff80 -3c010001 -00280821 -ac298eb8 -25040004 -2505fff8 -3c010001 -00240821 -ac248eb8 -3c010001 -00250821 -ac258eb8 -3c020001 -00481021 -80428eb8 -3c050001 -00a42821 -8ca58eb8 -3c040001 -00852021 -8c848eb8 -3c060001 -00c53021 -8cc68eb8 -144301b4 -00000000 -3c09afa6 -35293c10 -3c08800d -24030010 -ad0913e8 -25040004 -2505fff8 -ac8413e8 -aca513e8 -810213e8 -8c8513e8 -8ca413e8 -8ca613e8 -144301a5 -00000000 -3c09305d -352945e5 -3c08800d -2403005d -3c010001 -00280821 -ac29bc3c -25040004 -2505fff8 -3c010001 -00240821 -ac24bc3c -3c010001 -00250821 -ac25bc3c -3c020001 -00481021 -8042bc3e -3c050001 -00a42821 -8ca5bc3c -3c040001 -00852021 -8c84bc3c -3c060001 -00c53021 -8cc6bc3c -14430188 -00000000 -3c09e165 -3529f7e0 -3c08800d -24030065 -3c010001 -00280821 -ac298f3c -25040004 -2505fff8 -3c010001 -00240821 -ac248f3c -3c010001 -00250821 -ac258f3c -3c020001 -00481021 -80428f3e -3c050001 -00a42821 -8ca58f3c -3c040001 -00852021 -8c848f3c -3c060001 -00c53021 -8cc68f3c -1443016b -00000000 -3c09f282 -352995e8 -3c08800d -2403ff95 -ad0925fc -25040004 -2505fff8 -ac8425fc -aca525fc -810225fd -8c8525fc -8ca425fc -8ca625fc -1443015c -00000000 -3c097bcc -35290898 -3c08800d -24030008 -ad094c74 -25040004 -2505fff8 -ac844c74 -aca54c74 -81024c75 -8c854c74 -8ca44c74 -8ca64c74 -1443014d -00000000 -3c09eaa1 -352965b4 -3c08800d -2403ffea -ad096378 -25040004 -2505fff8 -ac846378 -aca56378 -8102637b -8c856378 -8ca46378 -8ca66378 -1443013e -00000000 -3c093ff5 -35297a80 -3c08800d -2403003f -ad090f00 -25040004 -2505fff8 -ac840f00 -aca50f00 -81020f03 -8c850f00 -8ca40f00 -8ca60f00 -1443012f -00000000 -3c09300e -35298840 -3c08800d -24030040 -ad091b04 -25040004 -2505fff8 -ac841b04 -aca51b04 -81021b04 -8c851b04 -8ca41b04 -8ca61b04 -14430120 -00000000 -3c09fb63 -3529b448 -3c08800d -24030048 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -81020000 -8c850000 -8ca40000 -8ca60000 -14430111 -00000000 -3c09358c -35298a40 -3c08800d -2403ff8c -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -81020002 -8c850000 -8ca40000 -8ca60000 -14430102 -00000000 -3c095e90 -35293520 -3c08800d -24030020 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -81020000 -8c850000 -8ca40000 -8ca60000 -144300f3 -00000000 -3c098383 -35292cc2 -3c08800d -2403002c -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -81020001 -8c850000 -8ca40000 -8ca60000 -144300e4 -00000000 -3c094554 -3529da80 -3c08800d -24030054 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -81020002 -8c850000 -8ca40000 -8ca60000 -144300d5 -00000000 -3c098e31 -35290700 -3c08800d -24030007 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -81020001 -8c850000 -8ca40000 -8ca60000 -144300c6 -00000000 -3c09f152 -3529d038 -3c08800d -2403ffd0 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -81020001 -8c850000 -8ca40000 -8ca60000 -144300b7 -00000000 -3c09a100 -3529c498 -3c08800d -24030000 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -81020002 -8c850000 -8ca40000 -8ca60000 -144300a8 -00000000 -3c09ea4a -35299128 -3c08800d -2403ffea -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -81020003 -8c850000 -8ca40000 -8ca60000 -14430099 -00000000 -3c098941 -3529eeb0 -3c08800d -2403ffb0 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -81020000 -8c850000 -8ca40000 -8ca60000 -1443008a -00000000 -3c091b28 -35299e0c -3c08800d -24030028 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -81020002 -8c850000 -8ca40000 -8ca60000 -1443007b -00000000 -3c09333c -35297a70 -3c08800d -2403003c -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -81020002 -8c850000 -8ca40000 -8ca60000 -1443006c -00000000 -3c09865e -3529faf0 -3c08800d -2403005e -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -81020002 -8c850000 -8ca40000 -8ca60000 -1443005d -00000000 -3c09ac40 -3529eea4 -3c08800d -24030040 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -81020002 -8c850000 -8ca40000 -8ca60000 -1443004e -00000000 -3c0924b5 -3529e96a -3c08800d -2403ffb5 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -81020002 -8c850000 -8ca40000 -8ca60000 -1443003f -00000000 -3c0931aa -3529938c -3c08800d -2403ffaa -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -81020002 -8c850000 -8ca40000 -8ca60000 -14430030 -00000000 -3c090661 -3529cc00 -3c08800d -24030006 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -81020003 -8c850000 -8ca40000 -8ca60000 -14430021 -00000000 -3c097eb8 -352995a4 -3c08800d -2403ff95 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -81020001 -8c850000 -8ca40000 -8ca60000 -14430012 -00000000 -24090000 -3c08800d -24030000 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -81020000 -8c850000 -8ca40000 -8ca60000 -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -26100001 -3c08800d -24120003 -ad120000 -40805800 -3c170040 -40976000 -00000000 -3c170003 -3c023f06 -344237b6 -3c033f06 -346337b6 -3c0463d3 -3484fd1e -3c05d037 -34a58bea -3c14bfc4 -2694956c -00851022 -1657007a -00000000 -14430078 -00000000 -24120003 -3c028754 -3442eb0d -3c038754 -3463eb0d -3c046f8c -34841169 -3c059edd -34a5bba4 -3c14bfc4 -269495b4 -ad080004 -ad140004 -00851022 -ad140000 -8d090004 -15340066 -00000000 -16570064 -00000000 -14430062 -00000000 -24120003 -ad120000 -24120003 -3c02f4e0 -34421aa8 -3c03f4e0 -34631aa8 -3c04734a -3484367f -3c05e173 -34a554f8 -3c14bfc4 -26949614 -01000011 -0110001b -00851022 -00004810 -1128004f -00000000 -1657004d -00000000 -1443004b -00000000 -24120003 -3c02dc37 -34423c00 -3c03dc37 -34633c00 -3c0421cc -3484bee8 -3c059a01 -34a5fac4 -3c14bfc4 -26949660 -00851022 -0208001b -1657003c -00000000 -1443003a -00000000 -24120003 -3c02b226 -3442ec94 -3c03b226 -3463ec94 -3c04b196 -3484dd00 -3c057dfd -34a59ab0 -3c14bfc4 -269496ac -01000013 -01100019 -00851022 -00004810 -11280029 -00000000 -16570027 -00000000 -14430025 -00000000 -24120003 -3c021625 -3442bcc8 -3c031625 -3463bcc8 -3c04b53c -3484d464 -3c05421d -34a5020a -3c14bfc4 -269496f8 -00851022 -01120019 -16570016 -00000000 -14430014 -00000000 -24120003 -3c029f76 -34427750 -3c039f76 -34637750 -3c047041 -34840c7a -3c058ddc -34a520c0 -3c14bfc4 -26949740 -40927000 -00851022 -40887000 -16570004 -00000000 -14430002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -3c08800d -40805800 -3c170040 -40976000 -00000000 -24120001 -3c170001 -ad120000 -3c14bfc4 -2694979c -180000af -0000000c -165700ad -00000000 -24120001 -3c14bfc4 -269497b8 -1a4000a8 -0000000c -165700a6 -00000000 -24120002 -3c170002 -ad120000 -3c14bfc4 -269497dc -1800009f -0000000d -1657009d -00000000 -24120002 -3c14bfc4 -269497f8 -1a400098 -0000000d -16570096 -00000000 -24120003 -3c170003 -ad120000 -3c14bfc4 -2694982c -3c04ba03 -34844f60 -3c05b615 -34a5fd67 -1800008b -0085b820 -16570089 -00000000 -24120003 -3c14bfc4 -26949848 -1a400084 -0085b820 -ad170000 -16570081 -00000000 -24120003 -ad120000 -3c14bfc4 -26949874 -3c047fff -3484c19e -18000079 -20976512 -16570077 -00000000 -24120003 -3c14bfc4 -26949890 -1a400072 -20976512 -16570070 -00000000 -24120003 -3c14bfc4 -269498bc -3c04a85e -34847d00 -3c056b7e -34a58e36 -18000067 -0085b822 -16570065 -00000000 -24120003 -3c14bfc4 -269498d8 -1a400060 -0085b822 -1657005e -00000000 -24120004 -3c170004 -ad120000 -3c14bfc4 -269498fc -18000057 -8d170002 -16570055 -00000000 -24120004 -3c14bfc4 -26949918 -1a400050 -8d170002 -1657004e -00000000 -24120004 -3c14bfc4 -26949934 -18000049 -85170001 -02f2001b -16570046 -00000000 -24120004 -3c14bfc4 -26949954 -1a400041 -85170001 -1657003f -00000000 -3c14bfc4 -2694996c -1800003b -95170003 -16570039 -00000000 -24120004 -3c14bfc4 -26949988 -1a400034 -95170003 -16570032 -00000000 -24120005 -3c170005 -ad120000 -3c14bfc4 -269499ac -1800002b -ad170002 -16570029 -00000000 -24120005 -3c14bfc4 -269499c8 -1a400024 -ad170002 -16570022 -00000000 -24120005 -3c14bfc4 -269499e4 -1800001d -a5170001 -1657001b -00000000 -24120005 -3c14bfc4 -26949a00 -1a400016 -a5170001 -16570014 -00000000 -24120007 -3c170007 -ad120000 -3c14bfc4 -26949a24 -1800000d -9e3c56aa -02f20018 -1657000a -00000000 -24120007 -3c14bfc4 -26949a48 -02f20018 -1a400004 -ec1ba960 -16570002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -24120000 -3c16800d -0bf0e6a3 -3c08800d -100000b5 -00000000 -151600b3 -00000000 -25168123 -0bf0e6aa -25098123 -100000ae -00000000 -153600ac -00000000 -ad167120 -0bf0e6b1 -ad097120 -100000a7 -00000000 -153600a5 -00000000 -8d167120 -0bf0e6b8 -8d0a7120 -100000a0 -00000000 -1556009e -00000000 -012ab021 -0bf0e6bf -012a5821 -10000099 -00000000 -15760097 -00000000 -0232b025 -0bf0e6c6 -0232c825 -10000092 -00000000 -17360090 -00000000 -0253b02a -0bf0e6cd -0253c02a -1000008b -00000000 -17160089 -00000000 -2a568011 -0bf0e6d4 -2a4f8011 -10000084 -00000000 -15f60082 -00000000 -2e568011 -0bf0e6db -2e4f8011 -1000007d -00000000 -15f6007b -00000000 -0253b02b -0bf0e6e2 -0253c02b -10000076 -00000000 -17160074 -00000000 -0012b440 -0bf0e6e9 -00124c40 -1000006f -00000000 -1536006d -00000000 -0110b020 -0bf0e6f0 -01105020 -10000068 -00000000 -15560066 -00000000 -22168002 -0bf0e6f7 -220b8002 -10000061 -00000000 -1576005f -00000000 -0110b022 -0bf0e6fe -01106022 -1000005a -00000000 -15960058 -00000000 -0110b023 -0bf0e705 -01106823 -10000053 -00000000 -15b60051 -00000000 -0110b024 -0bf0e70c -01107024 -1000004c -00000000 -15d6004a -00000000 -32168ff2 -0bf0e713 -320f8ff2 -10000045 -00000000 -15f60043 -00000000 -0110b027 -0bf0e71a -0110c027 -1000003e -00000000 -1716003c -00000000 -36168ff2 -0bf0e721 -36098ff2 -10000037 -00000000 -15360035 -00000000 -0110b026 -0bf0e728 -01105026 -10000030 -00000000 -1556002e -00000000 -3a168ff2 -0bf0e72f -3a0b8ff2 -10000029 -00000000 -15760027 -00000000 -0208b004 -0bf0e736 -02086004 -10000022 -00000000 -15960020 -00000000 -0010b203 -0bf0e73d -00106a03 -1000001b -00000000 -15b60019 -00000000 -0208b007 -0bf0e744 -02087007 -10000014 -00000000 -15d60012 -00000000 -0010b202 -0bf0e74b -00107a02 -1000000d -00000000 -15f6000b -00000000 -0208b006 -0bf0e752 -0208c006 -10000006 -00000000 -17160004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -3c08800d -24120002 -ad120000 -40805800 -3c170040 -40976000 -00000000 -3c170002 -3c14bfc4 -26949d9c -0000000d -1657003c -00000000 -24120002 -3c14bfc4 -26949dbc -ad080004 -ad140004 -0000000d -ad140000 -8d090004 -15340032 -00000000 -16570030 -00000000 -24120002 -ad120000 -24120002 -3c14bfc4 -26949df4 -01000011 -0110001b -0000000d -00004810 -11280025 -00000000 -16570023 -00000000 -24120002 -3c14bfc4 -26949e18 -0000000d -0208001b -1657001c -00000000 -24120002 -3c14bfc4 -26949e3c -01000013 -01100019 -0000000d -00004810 -11280013 -00000000 -16570011 -00000000 -24120002 -3c14bfc4 -26949e60 -0000000d -01120019 -1657000a -00000000 -24120002 -3c14bfc4 -26949e80 -40927000 -0000000d -40887000 -16570002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -26100001 -3c08800d -24120007 -ad120000 -40805800 -3c170040 -40976000 -00000000 -3c170007 -3c14bfc4 -26949edc -45df00e0 -16570040 -00000000 -24120007 -3c14bfc4 -26949efc -ad080004 -ad140004 -7a22db9c -ad140000 -8d090004 -15340036 -00000000 -16570034 -00000000 -24120007 -ad120000 -24120007 -3c14bfc4 -26949f34 -01000011 -0110001b -6f76e210 -00004810 -11280029 -00000000 -16570027 -00000000 -24120007 -3c14bfc4 -26949f58 -5a8d78ce -0208001b -16570020 -00000000 -24120007 -3c14bfc4 -26949f7c -01000013 -01100019 -7bd1ac60 -00004810 -11280017 -00000000 -16570015 -00000000 -24120007 -3c14bfc4 -26949fa0 -7e6265cc -01120019 -1657000e -00000000 -1443000c -00000000 -24120007 -3c14bfc4 -26949fc8 -40927000 -9fc55510 -40887000 -16570004 -00000000 -14430002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -26100001 -24120000 -001fb821 -3c048000 -04910006 -3c08800d -3c16800d -151601db -00000000 -04110003 -3c15800d -100001d7 -00000000 -0017f821 -16b601d4 -00000000 -001fb821 -3c048000 -04910006 -25098123 -25168123 -153601cd -00000000 -04110003 -25158123 -100001c9 -00000000 -0017f821 -16b601c6 -00000000 -001fb821 -3c048000 -04910006 -ad098ee0 -ad168ee0 -153601bf -00000000 -04110003 -ad158ee0 -100001bb -00000000 -0017f821 -16b601b8 -00000000 -001fb821 -3c048000 -04910006 -8d0a8ee0 -8d168ee0 -155601b1 -00000000 -04110003 -8d158ee0 -100001ad -00000000 -0017f821 -16b601aa -00000000 -001fb821 -3c048000 -04910006 -012a5821 -012ab021 -157601a3 -00000000 -04110003 -012aa821 -1000019f -00000000 -0017f821 -16b6019c -00000000 -001fb821 -3c048000 -04910006 -02326025 -0232b025 -15960195 -00000000 -04110003 -0232a825 -10000191 -00000000 -0017f821 -16b6018e -00000000 -001fb821 -3c048000 -04910006 -0253682a -0253b02a -15b60187 -00000000 -04110003 -0253a82a -10000183 -00000000 -0017f821 -16b60180 -00000000 -001fb821 -3c048000 -04910006 -2a4e8011 -2a568011 -15d60179 -00000000 -04110003 -2a558011 -10000175 -00000000 -0017f821 -16b60172 -00000000 -001fb821 -3c048000 -04910006 -2e4f8011 -2e568011 -15f6016b -00000000 -04110003 -2e558011 -10000167 -00000000 -0017f821 -16b60164 -00000000 -001fb821 -3c048000 -04910006 -0253c02b -0253b02b -1716015d -00000000 -04110003 -0253a82b -10000159 -00000000 -0017f821 -16b60156 -00000000 -001fb821 -3c048000 -04910006 -00124c40 -0012b440 -1536014f -00000000 -04110003 -0012ac40 -1000014b -00000000 -0017f821 -16b60148 -00000000 -001fb821 -3c048000 -04910006 -01105020 -0110b020 -15560141 -00000000 -04110003 -0110a820 -1000013d -00000000 -0017f821 -16b6013a -00000000 -001fb821 -3c048000 -04910006 -220b8002 -22168002 -15760133 -00000000 -04110003 -22158002 -1000012f -00000000 -0017f821 -16b6012c -00000000 -001fb821 -3c048000 -04910006 -01106022 -0110b022 -15960125 -00000000 -04110003 -0110a822 -10000121 -00000000 -0017f821 -16b6011e -00000000 -001fb821 -3c048000 -04910006 -01106823 -0110b023 -15b60117 -00000000 -04110003 -0110a823 -10000113 -00000000 -0017f821 -16b60110 -00000000 -001fb821 -3c048000 -04910006 -01107024 -0110b024 -15d60109 -00000000 -04110003 -0110a824 -10000105 -00000000 -0017f821 -16b60102 -00000000 -001fb821 -3c048000 -04910006 -320f8ff2 -32168ff2 -15f600fb -00000000 -04110003 -32158ff2 -100000f7 -00000000 -0017f821 -16b600f4 -00000000 -001fb821 -3c048000 -04910006 -0110c027 -0110b027 -171600ed -00000000 -04110003 -0110a827 -100000e9 -00000000 -0017f821 -16b600e6 -00000000 -001fb821 -3c048000 -04910006 -36098ff2 -36168ff2 -153600df -00000000 -04110003 -36158ff2 -100000db -00000000 -0017f821 -16b600d8 -00000000 -001fb821 -3c048000 -04910006 -01105026 -0110b026 -155600d1 -00000000 -04110003 -0110a826 -100000cd -00000000 -0017f821 -16b600ca -00000000 -001fb821 -3c048000 -04910006 -3a0b8ff2 -3a168ff2 -157600c3 -00000000 -04110003 -3a158ff2 -100000bf -00000000 -0017f821 -16b600bc -00000000 -001fb821 -3c048000 -04910006 -02086004 -0208b004 -159600b5 -00000000 -04110003 -0208a804 -100000b1 -00000000 -0017f821 -16b600ae -00000000 -001fb821 -3c048000 -04910006 -00106a03 -0010b203 -15b600a7 -00000000 -04110003 -0010aa03 -100000a3 -00000000 -0017f821 -16b600a0 -00000000 -001fb821 -3c048000 -04910006 -02087007 -0208b007 -15d60099 -00000000 -04110003 -0208a807 -10000095 -00000000 -0017f821 -16b60092 -00000000 -001fb821 -3c048000 -04910006 -00107a02 -0010b202 -15f6008b -00000000 -04110003 -0010aa02 -10000087 -00000000 -0017f821 -16b60084 -00000000 -001fb821 -3c048000 -04910006 -0208c006 -0208b006 -1716007d -00000000 -04110003 -0208a806 -10000079 -00000000 -0017f821 -16b60076 -00000000 -3c088000 -34098000 -001fb821 -3c048000 -24020000 -24030000 -0491000a -0109001a -00001012 -00800013 -0109001a -0000b012 -14560068 -00000000 -00800013 -04110003 -0109001a -10000063 -00000000 -0017f821 -00001812 -1476005f -00000000 -001fb821 -3c048000 -24020000 -24030000 -0491000a -0109001b -00001012 -00800013 -0109001b -0000b012 -14560053 -00000000 -00800013 -04110003 -0109001b -1000004e -00000000 -0017f821 -00001812 -1476004a -00000000 -001fb821 -3c048000 -24020000 -24030000 -0491000a -01090018 -00001012 -00800013 -01090018 -0000b012 -1456003e -00000000 -00800013 -04110003 -01090018 -10000039 -00000000 -0017f821 -00001812 -14760035 -00000000 -001fb821 -3c048000 -24020000 -24030000 -0491000a -01090019 -00001012 -00800013 -01090019 -0000b012 -14560029 -00000000 -00800013 -04110003 -01090019 -10000024 -00000000 -0017f821 -00001812 -14760020 -00000000 -001fb821 -3c048000 -04910006 -00007810 -0000b010 -15f60019 -00000000 -04110003 -0000a810 -10000015 -00000000 -0017f821 -16b60012 -00000000 -001fb821 -3c048000 -04910006 -00007012 -0000b012 -15d6000b -00000000 -04110003 -0000a812 -10000007 -00000000 -0017f821 -16b60004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -24120000 -3c020000 -3c030000 -10000008 -00000000 -3c020fb1 -34426a80 -1128000d -00000000 -1000000d -00000000 -00000000 -3c085291 -35089078 -3c098146 -35298400 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03df22 -34635ddc -24150000 -24160000 -14550b93 -00000000 -14760b91 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c022fda -3442c790 -1128000d -00000000 -1000000d -00000000 -00000000 -3c0890db -350814d8 -3c09a81a -35297400 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03e4a2 -346302d3 -24150000 -24160000 -14550b77 -00000000 -14760b75 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02c64a -3442c344 -1128000d -00000000 -1000000d -00000000 -00000000 -3c08bca1 -3508eea8 -3c09a4ac -352924ae -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03c38e -3463d9a0 -24150000 -24160000 -14550b5b -00000000 -14760b59 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02523b -344285b0 -1128000d -00000000 -1000000d -00000000 -00000000 -3c08c782 -35080fa8 -3c0971f9 -3529dbb0 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03cb7d -3463bd40 -24150000 -24160000 -14550b3f -00000000 -14760b3d -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c022308 -3442a218 -1128000d -00000000 -1000000d -00000000 -00000000 -3c0865a8 -3508a904 -3c09042a -35297ac0 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03602b -3463df60 -24150000 -24160000 -14550b23 -00000000 -14760b21 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0255a9 -3442ccbe -1128000d -00000000 -1000000d -00000000 -00000000 -3c087d5d -35089210 -3c0944f6 -35293240 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c038021 -34632b6f -24150000 -24160000 -14550b07 -00000000 -14760b05 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02c8b2 -34425370 -1128000d -00000000 -1000000d -00000000 -00000000 -3c080c81 -3508c340 -3c096ef5 -35294770 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03e76e -3463e2aa -24150000 -24160000 -14550aeb -00000000 -14760ae9 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c021511 -34420ec0 -1128000d -00000000 -1000000d -00000000 -00000000 -3c08f145 -350888c0 -3c094339 -352941dc -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03f560 -34636dc1 -24150000 -24160000 -14550acf -00000000 -14760acd -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0256c2 -3442e54e -1128000d -00000000 -1000000d -00000000 -00000000 -3c0812c4 -35083800 -3c09f82f -35294330 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03e0bc -346364db -24150000 -24160000 -14550ab3 -00000000 -14760ab1 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02dd2d -34425c00 -1128000d -00000000 -1000000d -00000000 -00000000 -3c08d8e1 -3508092e -3c09d2b6 -3529e680 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c039b71 -3463fc28 -24150000 -24160000 -14550a97 -00000000 -14760a95 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02ed03 -34425fd4 -1128000d -00000000 -1000000d -00000000 -00000000 -3c08944c -35088160 -3c09648e -3529b888 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c030bb4 -3463d92c -24150000 -24160000 -14550a7b -00000000 -14760a79 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02ad3a -34420385 -1128000d -00000000 -1000000d -00000000 -00000000 -3c089408 -3508741c -3c091da1 -3529d060 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03c6b5 -34639c6e -24150000 -24160000 -14550a5f -00000000 -14760a5d -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02b8f0 -34420578 -1128000d -00000000 -1000000d -00000000 -00000000 -3c08b21e -350814d1 -3c09c8b4 -3529db80 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c037c9c -3463be18 -24150000 -24160000 -14550a43 -00000000 -14760a41 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02928e -344258b7 -1128000d -00000000 -1000000d -00000000 -00000000 -3c081c0d -3508ff06 -3c096e62 -352952c0 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c036672 -34638f80 -24150000 -24160000 -14550a27 -00000000 -14760a25 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c029336 -34428d10 -1128000d -00000000 -1000000d -00000000 -00000000 -3c081d25 -3508b274 -3c09fc4f -352966c6 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03d01e -3463595a -24150000 -24160000 -14550a0b -00000000 -14760a09 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02cc03 -344237a4 -1128000d -00000000 -1000000d -00000000 -00000000 -3c087a69 -35080218 -3c09240b -3529c551 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03af62 -3463686c -24150000 -24160000 -145509ef -00000000 -147609ed -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c025fcf -34425436 -1128000d -00000000 -1000000d -00000000 -00000000 -3c08b350 -35088411 -3c0914e2 -3529fd6a -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c039d50 -3463ad00 -24150000 -24160000 -145509d3 -00000000 -147609d1 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02a172 -3442ac8b -1128000d -00000000 -1000000d -00000000 -00000000 -3c08a7d4 -3508c00c -3c0918b3 -352957e0 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03f4d6 -3463b000 -24150000 -24160000 -145509b7 -00000000 -147609b5 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02b0de -3442edc2 -1128000d -00000000 -1000000d -00000000 -00000000 -3c08e128 -3508d164 -3c0947f1 -35293f80 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c039fed -34631d0a -24150000 -24160000 -1455099b -00000000 -14760999 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02cbea -34428298 -1128000d -00000000 -1000000d -00000000 -00000000 -3c089aa1 -3508ef5e -3c09edeb -3529a6a0 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c037b61 -34632216 -24150000 -24160000 -1455097f -00000000 -1476097d -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02b189 -344226d8 -1128000d -00000000 -1000000d -00000000 -00000000 -3c08ff0c -3508ed4c -3c0936cd -3529a884 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c032e21 -34631740 -24150000 -24160000 -14550963 -00000000 -14760961 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02a945 -3442afee -1128000d -00000000 -1000000d -00000000 -00000000 -3c08a681 -3508b780 -3c0945fd -3529b2b0 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03caaf -34635ac0 -24150000 -24160000 -14550947 -00000000 -14760945 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02584e -3442a574 -1128000d -00000000 -1000000d -00000000 -00000000 -3c083b49 -3508dd76 -3c099ce7 -352950b8 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03d97f -3463af96 -24150000 -24160000 -1455092b -00000000 -14760929 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c020815 -3442ea80 -1128000d -00000000 -1000000d -00000000 -00000000 -3c08723d -3508c480 -3c09ff47 -3529ef40 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03b319 -3463c180 -24150000 -24160000 -1455090f -00000000 -1476090d -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c022fcb -344260b8 -1128000d -00000000 -1000000d -00000000 -00000000 -3c0886b3 -3508805d -3c0971da -3529ab98 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c0359bb -3463a0e8 -24150000 -24160000 -145508f3 -00000000 -147608f1 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c028ab8 -3442dd00 -1128000d -00000000 -1000000d -00000000 -00000000 -3c08d063 -350893ca -3c09f600 -3529b324 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03dfde -34631214 -24150000 -24160000 -145508d7 -00000000 -147608d5 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02c4db -3442bbdc -1128000d -00000000 -1000000d -00000000 -00000000 -3c086ba0 -35081b98 -3c096adf -3529234a -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c035185 -3463b2ba -24150000 -24160000 -145508bb -00000000 -147608b9 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c021110 -34426d3c -1128000d -00000000 -1000000d -00000000 -00000000 -3c0815f4 -35085b20 -3c0967e2 -35297312 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03cbab -34638356 -24150000 -24160000 -1455089f -00000000 -1476089d -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02acfc -344255ad -1128000d -00000000 -1000000d -00000000 -00000000 -3c0843d2 -35082865 -3c0916c4 -352934c6 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c035acd -3463e500 -24150000 -24160000 -14550883 -00000000 -14760881 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02faa1 -3442a9e0 -1128000d -00000000 -1000000d -00000000 -00000000 -3c088f92 -35081587 -3c091ad2 -35292f9b -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03c8f9 -3463b560 -24150000 -24160000 -14550867 -00000000 -14760865 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02b499 -344213a0 -1128000d -00000000 -1000000d -00000000 -00000000 -3c082ec0 -35087214 -3c0975be -352964ec -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c0308c3 -3463fcf6 -24150000 -24160000 -1455084b -00000000 -14760849 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c026656 -3442905c -1128000d -00000000 -1000000d -00000000 -00000000 -3c08620a -350822c4 -3c09f75c -352926a8 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03a6e7 -34634848 -24150000 -24160000 -1455082f -00000000 -1476082d -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02166a -34421ae0 -1128000d -00000000 -1000000d -00000000 -00000000 -3c0862fb -35084a80 -3c0962fb -35294a80 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03107a -3463f4b4 -3c15166a -36b51ae0 -3c16107a -36d6f4b4 -14550811 -00000000 -1476080f -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02b13d -34426c84 -1128000d -00000000 -1000000d -00000000 -00000000 -3c0856a0 -35084234 -3c0956a0 -35294234 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03464b -34632238 -3c15b13d -36b56c84 -3c16464b -36d62238 -145507f3 -00000000 -147607f1 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02e370 -34420592 -1128000d -00000000 -1000000d -00000000 -00000000 -3c08d1c9 -35081084 -3c09d1c9 -35291084 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03a4ef -3463050e -3c15e370 -36b50592 -3c16a4ef -36d6050e -145507d5 -00000000 -147607d3 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02e77f -34423df0 -1128000d -00000000 -1000000d -00000000 -00000000 -3c089422 -35083f24 -3c099422 -35293f24 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c039285 -3463f1b4 -3c15e77f -36b53df0 -3c169285 -36d6f1b4 -145507b7 -00000000 -147607b5 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c020c08 -34429630 -1128000d -00000000 -1000000d -00000000 -00000000 -3c0813b8 -35085cc0 -3c0913b8 -35295cc0 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03721a -34633810 -3c150c08 -36b59630 -3c16721a -36d63810 -14550799 -00000000 -14760797 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02a537 -3442e80b -1128000d -00000000 -1000000d -00000000 -00000000 -3c08c41d -3508bf64 -3c09c41d -3529bf64 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c0353d5 -3463947e -3c15a537 -36b5e80b -3c1653d5 -36d6947e -1455077b -00000000 -14760779 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c025b33 -34420ae5 -1128000d -00000000 -1000000d -00000000 -00000000 -3c0860af -35086080 -3c0960af -35296080 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c032d25 -346376be -3c155b33 -36b50ae5 -3c162d25 -36d676be -1455075d -00000000 -1476075b -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c023c52 -3442c34c -1128000d -00000000 -1000000d -00000000 -00000000 -3c088541 -3508cd00 -3c098541 -3529cd00 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c036216 -346395c7 -3c153c52 -36b5c34c -3c166216 -36d695c7 -1455073f -00000000 -1476073d -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c021fce -34429240 -1128000d -00000000 -1000000d -00000000 -00000000 -3c08097f -35082a98 -3c09097f -35292a98 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c038a95 -34638480 -3c151fce -36b59240 -3c168a95 -36d68480 -14550721 -00000000 -1476071f -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c028bce -3442fd8a -1128000d -00000000 -1000000d -00000000 -00000000 -3c089832 -35085f68 -3c099832 -35295f68 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c0385c3 -3463e632 -3c158bce -36b5fd8a -3c1685c3 -36d6e632 -14550703 -00000000 -14760701 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c028294 -3442e540 -1128000d -00000000 -1000000d -00000000 -00000000 -3c089a99 -35086134 -3c099a99 -35296134 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c0378b0 -346341e0 -3c158294 -36b5e540 -3c1678b0 -36d641e0 -145506e5 -00000000 -147606e3 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02a3c9 -34426acc -1128000d -00000000 -1000000d -00000000 -00000000 -3c08efb0 -3508dd7c -3c09efb0 -3529dd7c -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c030791 -34636ea6 -3c15a3c9 -36b56acc -3c160791 -36d66ea6 -145506c7 -00000000 -147606c5 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c020192 -3442dd01 -1128000d -00000000 -1000000d -00000000 -00000000 -3c08a877 -3508ea18 -3c09a877 -3529ea18 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c034aaa -3463ada0 -3c150192 -36b5dd01 -3c164aaa -36d6ada0 -145506a9 -00000000 -147606a7 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c026d52 -34429950 -1128000d -00000000 -1000000d -00000000 -00000000 -3c08235b -35084c11 -3c09235b -35294c11 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c032237 -34630e98 -3c156d52 -36b59950 -3c162237 -36d60e98 -1455068b -00000000 -14760689 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c021ae4 -34425760 -1128000d -00000000 -1000000d -00000000 -00000000 -3c08fb17 -35087658 -3c09fb17 -35297658 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c034a9e -34635ace -3c151ae4 -36b55760 -3c164a9e -36d65ace -1455066d -00000000 -1476066b -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0215f0 -3442a7a0 -1128000d -00000000 -1000000d -00000000 -00000000 -3c088fd7 -35080840 -3c098fd7 -35290840 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03aeae -3463ccec -3c1515f0 -36b5a7a0 -3c16aeae -36d6ccec -1455064f -00000000 -1476064d -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02f176 -3442807e -1128000d -00000000 -1000000d -00000000 -00000000 -3c08df9a -35088a5a -3c09df9a -35298a5a -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c035ae9 -34631f7c -3c15f176 -36b5807e -3c165ae9 -36d61f7c -14550631 -00000000 -1476062f -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02cc16 -34429869 -1128000d -00000000 -1000000d -00000000 -00000000 -3c08cdc6 -3508657c -3c09cdc6 -3529657c -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c039c72 -3463bd96 -3c15cc16 -36b59869 -3c169c72 -36d6bd96 -14550613 -00000000 -14760611 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c027d00 -34425284 -1128000d -00000000 -1000000d -00000000 -00000000 -3c08f16f -35088ac4 -3c09f16f -35298ac4 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03d1e9 -3463500c -3c157d00 -36b55284 -3c16d1e9 -36d6500c -145505f5 -00000000 -147605f3 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c024cfa -34420eda -1128000d -00000000 -1000000d -00000000 -00000000 -3c0824c3 -35087e78 -3c0924c3 -35297e78 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c0334c2 -34637390 -3c154cfa -36b50eda -3c1634c2 -36d67390 -145505d7 -00000000 -147605d5 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02450e -34427c0c -1128000d -00000000 -1000000d -00000000 -00000000 -3c08ab37 -3508fdec -3c09ab37 -3529fdec -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03639d -34630ef8 -3c15450e -36b57c0c -3c16639d -36d60ef8 -145505b9 -00000000 -147605b7 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c025b26 -34429f78 -1128000d -00000000 -1000000d -00000000 -00000000 -3c082358 -350843c0 -3c092358 -352943c0 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03c095 -34632a80 -3c155b26 -36b59f78 -3c16c095 -36d62a80 -1455059b -00000000 -14760599 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c024740 -3442bb7e -1128000d -00000000 -1000000d -00000000 -00000000 -3c081ff5 -3508d45e -3c091ff5 -3529d45e -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c039ea8 -34630c50 -3c154740 -36b5bb7e -3c169ea8 -36d60c50 -1455057d -00000000 -1476057b -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c029d60 -344266bc -1128000d -00000000 -1000000d -00000000 -00000000 -3c08efe1 -350803c0 -3c09efe1 -352903c0 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03b590 -346355d0 -3c159d60 -36b566bc -3c16b590 -36d655d0 -1455055f -00000000 -1476055d -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c028e0d -34420eaa -1128000d -00000000 -1000000d -00000000 -00000000 -3c083e7f -35084ab4 -3c093e7f -35294ab4 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03a926 -3463fe80 -3c158e0d -36b50eaa -3c16a926 -36d6fe80 -14550541 -00000000 -1476053f -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02eaf5 -34421224 -1128000d -00000000 -1000000d -00000000 -00000000 -3c0809c6 -3508dada -3c0909c6 -3529dada -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c039879 -346334bc -3c15eaf5 -36b51224 -3c169879 -36d634bc -14550523 -00000000 -14760521 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02c4d7 -3442fd40 -1128000d -00000000 -1000000d -00000000 -00000000 -3c084579 -3508a63c -3c094579 -3529a63c -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03ceab -34635484 -3c15c4d7 -36b5fd40 -3c16ceab -36d65484 -14550505 -00000000 -14760503 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02dea6 -34423aa0 -1128000d -00000000 -1000000d -00000000 -00000000 -3c08ebdf -35083bec -3c09ebdf -35293bec -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03effc -3463c28e -3c15dea6 -36b53aa0 -3c16effc -36d6c28e -145504e7 -00000000 -147604e5 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c028de3 -34422077 -1128000d -00000000 -1000000d -00000000 -00000000 -3c08df35 -3508158c -3c09df35 -3529158c -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03d496 -34634a7c -3c158de3 -36b52077 -3c16d496 -36d64a7c -145504c9 -00000000 -147604c7 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0220be -34421150 -1128000d -00000000 -1000000d -00000000 -00000000 -3c08b6f0 -3508e000 -3c09b6f0 -3529e000 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03c81d -3463159a -3c1520be -36b51150 -3c16c81d -36d6159a -145504ab -00000000 -147604a9 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02482d -34423718 -1128000d -00000000 -1000000d -00000000 -00000000 -3c080722 -35084e40 -3c090722 -35294e40 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c033d9f -346376b6 -3c15482d -36b53718 -3c163d9f -36d676b6 -1455048d -00000000 -1476048b -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c026aa5 -34422133 -1128000d -00000000 -1000000d -00000000 -00000000 -3c0825b1 -35083638 -3c0925b1 -35293638 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03293b -34635e00 -3c156aa5 -36b52133 -3c16293b -36d65e00 -1455046f -00000000 -1476046d -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02d050 -3442e9a8 -1128000d -00000000 -1000000d -00000000 -00000000 -3c08ee91 -35081ecc -3c09ee91 -35291ecc -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c035fb2 -3463f72c -3c15d050 -36b5e9a8 -3c165fb2 -36d6f72c -14550451 -00000000 -1476044f -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c022f63 -34421c8d -1128000d -00000000 -1000000d -00000000 -00000000 -3c086e70 -35086f04 -3c096e70 -35296f04 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c039001 -34632e06 -3c152f63 -36b51c8d -3c169001 -36d62e06 -14550433 -00000000 -14760431 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02904e -34429db5 -1128000d -00000000 -1000000d -00000000 -00000000 -3c087160 -3508c398 -3c097160 -3529c398 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c030cb3 -34634796 -3c15904e -36b59db5 -3c160cb3 -36d64796 -14550415 -00000000 -14760413 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c024521 -3442213e -1128000d -00000000 -1000000d -00000000 -00000000 -3c0838f4 -3508a350 -3c0938f4 -3529a350 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c033f02 -34632f08 -3c154521 -36b5213e -3c163f02 -36d62f08 -145503f7 -00000000 -147603f5 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0254aa -344210c8 -1128000d -00000000 -1000000d -00000000 -00000000 -3c08a354 -35088fd4 -3c09a354 -35298fd4 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c039c18 -3463f200 -3c1554aa -36b510c8 -3c169c18 -36d6f200 -145503d9 -00000000 -147603d7 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c023b0e -34427d7e -1128000d -00000000 -1000000d -00000000 -00000000 -3c081b51 -350816e0 -3c091b51 -352916e0 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c030bec -34636118 -3c153b0e -36b57d7e -3c160bec -36d66118 -145503bb -00000000 -147603b9 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c023ef4 -344227d0 -1128000d -00000000 -1000000d -00000000 -00000000 -3c081f74 -3508adfa -3c091f74 -3529adfa -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03edf0 -34632a14 -3c153ef4 -36b527d0 -3c16edf0 -36d62a14 -1455039d -00000000 -1476039b -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c028a95 -34425513 -1128000d -00000000 -1000000d -00000000 -00000000 -3c0800c8 -350882e4 -3c0900c8 -352982e4 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03cbda -34632e00 -3c158a95 -36b55513 -3c16cbda -36d62e00 -1455037f -00000000 -1476037d -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02ced1 -34428270 -1128000d -00000000 -1000000d -00000000 -00000000 -3c08bf92 -35086b10 -3c09bf92 -35296b10 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c038359 -34635811 -3c15ced1 -36b58270 -3c168359 -36d65811 -14550361 -00000000 -1476035f -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02ace0 -34422efb -1128000d -00000000 -1000000d -00000000 -00000000 -3c08a8ea -350867cc -3c09a8ea -352967cc -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c036bab -3463fe90 -3c15ace0 -36b52efb -3c166bab -36d6fe90 -14550343 -00000000 -14760341 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c023b52 -3442d521 -1128000d -00000000 -1000000d -00000000 -00000000 -3c089a25 -3508b4c6 -3c099a25 -3529b4c6 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03cbcb -3463e300 -3c153b52 -36b5d521 -3c16cbcb -36d6e300 -14550325 -00000000 -14760323 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c027dcc -34426298 -1128000d -00000000 -1000000d -00000000 -00000000 -3c08fef3 -35084fc4 -3c09fef3 -35294fc4 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c0309ac -3463f4fc -3c157dcc -36b56298 -3c1609ac -36d6f4fc -14550307 -00000000 -14760305 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c029235 -34421c70 -1128000d -00000000 -1000000d -00000000 -00000000 -3c083e99 -3508f9c8 -3c093e99 -3529f9c8 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c034917 -3463958a -3c159235 -36b51c70 -3c164917 -36d6958a -145502e9 -00000000 -147602e7 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c027bcd -3442c380 -1128000d -00000000 -1000000d -00000000 -00000000 -3c081e0f -350861e0 -3c091e0f -352961e0 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c039156 -3463d8d7 -3c157bcd -36b5c380 -3c169156 -36d6d8d7 -145502cb -00000000 -147602c9 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c022c70 -34421eae -1128000d -00000000 -1000000d -00000000 -00000000 -3c080012 -35087980 -3c090012 -35297980 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c03cdbc -34636e70 -3c152c70 -36b51eae -3c16cdbc -36d66e70 -145502ad -00000000 -147602ab -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0214b1 -34424ed4 -1128000d -00000000 -1000000d -00000000 -00000000 -3c08b473 -35089f26 -3c09b473 -35299f26 -1109fff4 -00000000 -10000004 -00000000 -00000000 -3c0335b6 -34638b96 -3c1514b1 -36b54ed4 -3c1635b6 -36d68b96 -1455028f -00000000 -1476028d -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02a03a -34428bd0 -1128000c -00000000 -1000000c -00000000 -00000000 -3c0837a0 -35080820 -24090000 -1109fff5 -00000000 -10000004 -00000000 -00000000 -3c0369dc -3463cece -24150000 -24160000 -14550274 -00000000 -14760272 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c020f30 -34420740 -1128000c -00000000 -1000000c -00000000 -00000000 -3c083f49 -3508796f -24090000 -1109fff5 -00000000 -10000004 -00000000 -00000000 -3c031227 -34635e6a -24150000 -24160000 -14550259 -00000000 -14760257 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c027a0a -34425b00 -1128000c -00000000 -1000000c -00000000 -00000000 -3c081050 -3508538b -24090000 -1109fff5 -00000000 -10000004 -00000000 -00000000 -3c033dce -34639b53 -24150000 -24160000 -1455023e -00000000 -1476023c -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02757d -34423370 -1128000c -00000000 -1000000c -00000000 -00000000 -3c08320c -3508f6dc -24090000 -1109fff5 -00000000 -10000004 -00000000 -00000000 -3c034983 -3463b1b8 -24150000 -24160000 -14550223 -00000000 -14760221 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02dc91 -3442c1f0 -1128000c -00000000 -1000000c -00000000 -00000000 -3c0840a1 -3508777d -24090000 -1109fff5 -00000000 -10000004 -00000000 -00000000 -3c03e8c2 -34639c44 -24150000 -24160000 -14550208 -00000000 -14760206 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02ebe4 -34421d10 -1128000c -00000000 -1000000c -00000000 -00000000 -3c08277a -3508c544 -24090000 -1109fff5 -00000000 -10000004 -00000000 -00000000 -3c03e7e5 -346305f4 -24150000 -24160000 -145501ed -00000000 -147601eb -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02dd5f -3442100e -1128000c -00000000 -1000000c -00000000 -00000000 -3c088a2e -3508d35f -24090000 -1109fff5 -00000000 -10000004 -00000000 -00000000 -3c03e7ee -34635fac -24150000 -24160000 -145501d2 -00000000 -147601d0 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02e471 -3442c800 -1128000c -00000000 -1000000c -00000000 -00000000 -3c08eab0 -35080131 -24090000 -1109fff5 -00000000 -10000004 -00000000 -00000000 -3c03ffa6 -346394b0 -24150000 -24160000 -145501b7 -00000000 -147601b5 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0205cc -34429c60 -1128000c -00000000 -1000000c -00000000 -00000000 -3c08e9c6 -35084428 -24090000 -1109fff5 -00000000 -10000004 -00000000 -00000000 -3c030431 -34635e3f -24150000 -24160000 -1455019c -00000000 -1476019a -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02e118 -34422ccd -1128000c -00000000 -1000000c -00000000 -00000000 -3c08deeb -3508ed02 -24090000 -1109fff5 -00000000 -10000004 -00000000 -00000000 -3c03e061 -34632000 -24150000 -24160000 -14550181 -00000000 -1476017f -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c022ba5 -34427cc0 -1128000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c099dc7 -352983d0 -1109fff5 -00000000 -10000004 -00000000 -00000000 -3c03561f -34637a9e -24150000 -24160000 -14550166 -00000000 -14760164 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02800e -34423eb3 -1128000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c094ea9 -3529b8f0 -1109fff5 -00000000 -10000004 -00000000 -00000000 -3c03ce52 -34636bca -24150000 -24160000 -1455014b -00000000 -14760149 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c024417 -34428c58 -1128000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c09eb3d -3529913c -1109fff5 -00000000 -10000004 -00000000 -00000000 -3c033d32 -3463f566 -24150000 -24160000 -14550130 -00000000 -1476012e -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02d080 -3442caec -1128000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c09475d -35298174 -1109fff5 -00000000 -10000004 -00000000 -00000000 -3c03e403 -3463cd80 -24150000 -24160000 -14550115 -00000000 -14760113 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02ae02 -3442467e -1128000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c09a99f -352965c8 -1109fff5 -00000000 -10000004 -00000000 -00000000 -3c032cf0 -346343ad -24150000 -24160000 -145500fa -00000000 -147600f8 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02106f -3442f218 -1128000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c094e50 -352975e0 -1109fff5 -00000000 -10000004 -00000000 -00000000 -3c032f2b -34634420 -24150000 -24160000 -145500df -00000000 -147600dd -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0220b8 -3442c990 -1128000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c09b9dd -35297362 -1109fff5 -00000000 -10000004 -00000000 -00000000 -3c03be2d -3463484c -24150000 -24160000 -145500c4 -00000000 -147600c2 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c023cc0 -3442f346 -1128000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c09a148 -3529d73e -1109fff5 -00000000 -10000004 -00000000 -00000000 -3c03ac6c -34631dc0 -24150000 -24160000 -145500a9 -00000000 -147600a7 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c029478 -3442c240 -1128000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c099185 -3529cdc0 -1109fff5 -00000000 -10000004 -00000000 -00000000 -3c03c72b -34639d10 -24150000 -24160000 -1455008e -00000000 -1476008c -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02a172 -3442f0f0 -1128000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c091064 -35290e9a -1109fff5 -00000000 -10000004 -00000000 -00000000 -3c034b83 -346349b8 -24150000 -24160000 -14550073 -00000000 -14760071 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02df7c -344277fa -1128000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c0977c7 -35297558 -1109fff5 -00000000 -10000004 -00000000 -00000000 -3c036452 -34637238 -24150000 -24160000 -14550058 -00000000 -14760056 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02d289 -34424566 -1128000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c092492 -35292d7c -1109fff5 -00000000 -10000004 -00000000 -00000000 -3c030783 -34630114 -24150000 -24160000 -1455003d -00000000 -1476003b -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02dbc3 -3442f268 -1128000c -00000000 -1000000c -00000000 -00000000 -24080000 -3c096b92 -35296783 -1109fff5 -00000000 -10000004 -00000000 -00000000 -3c030a44 -3463caf8 -24150000 -24160000 -14550022 -00000000 -14760020 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02fc98 -3442d552 -1128000b -00000000 -1000000b -00000000 -00000000 -24080000 -24090000 -1109fff6 -00000000 -10000004 -00000000 -00000000 -3c03ca90 -346387ec -3c15fc98 -36b5d552 -3c16ca90 -36d687ec -14550006 -00000000 -14760004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -26100001 -24120000 -3c08c254 -3508e3d8 -24030001 -2d02f469 -144306d9 -00000000 -3c087a56 -3508334c -24030000 -2d0202f5 -144306d3 -00000000 -3c08abcd -35082c00 -24030001 -2d02f7c7 -144306cd -00000000 -3c0825c8 -350835b7 -24030000 -2d026dba -144306c7 -00000000 -3c0810ea -35083bf2 -24030000 -2d020ff4 -144306c1 -00000000 -3c08494c -35082712 -24030000 -2d02407a -144306bb -00000000 -3c08977b -35080d34 -24030000 -2d021280 -144306b5 -00000000 -3c08868f -35087bf9 -24030000 -2d0215e7 -144306af -00000000 -3c0885a7 -35088bab -24030000 -2d020898 -144306a9 -00000000 -3c0867b1 -35083d20 -24030000 -2d0275a5 -144306a3 -00000000 -3c08d982 -350863b6 -24030000 -2d025642 -1443069d -00000000 -3c083389 -35089815 -24030001 -2d02b202 -14430697 -00000000 -3c083a88 -35080fb8 -24030000 -2d0218cc -14430691 -00000000 -3c08197b -35087590 -24030001 -2d02c754 -1443068b -00000000 -3c0865a1 -3508b8c4 -24030000 -2d027c77 -14430685 -00000000 -3c0806fc -35081f2e -24030001 -2d0291fb -1443067f -00000000 -3c08ba93 -350867b9 -24030001 -2d02d36c -14430679 -00000000 -3c08a0cb -3508f154 -24030000 -2d020d0c -14430673 -00000000 -3c084abf -3508a210 -24030000 -2d02425c -1443066d -00000000 -3c08fd04 -3508e6b9 -24030001 -2d02cd24 -14430667 -00000000 -3c084a84 -3508dd80 -24030000 -2d0216a8 -14430661 -00000000 -3c085ea3 -350873b0 -24030001 -2d02aca6 -1443065b -00000000 -3c08b1c6 -35081e84 -24030000 -2d0272be -14430655 -00000000 -3c088d8c -350856c6 -24030000 -2d0219e0 -1443064f -00000000 -3c08d497 -35082598 -24030001 -2d02f950 -14430649 -00000000 -3c08bd26 -3508734a -24030001 -2d02aac0 -14430643 -00000000 -3c083432 -350880c0 -24030000 -2d026c96 -1443063d -00000000 -3c081ae3 -3508ad00 -24030001 -2d028df9 -14430637 -00000000 -3c08d589 -3508aae0 -24030000 -2d026d30 -14430631 -00000000 -3c0815b8 -3508c524 -24030000 -2d020758 -1443062b -00000000 -3c082986 -35081ff7 -24030000 -2d0252cc -14430625 -00000000 -3c081460 -35083517 -24030001 -2d02d892 -1443061f -00000000 -3c082afe -3508b200 -24030001 -2d028cf8 -14430619 -00000000 -3c085ee4 -35083660 -24030001 -2d02f0f2 -14430613 -00000000 -3c0809bc -35088a70 -24030001 -2d02bd3d -1443060d -00000000 -3c08ecf2 -35084c80 -24030000 -2d022bf5 -14430607 -00000000 -3c086098 -35087cbb -24030001 -2d02fefc -14430601 -00000000 -3c08e3b9 -35081bfc -24030001 -2d02a768 -144305fb -00000000 -3c087def -3508e89a -24030000 -2d02539c -144305f5 -00000000 -3c084150 -35084f88 -24030001 -2d02c36a -144305ef -00000000 -3c0882eb -35086ff4 -24030000 -2d027c20 -144305e9 -00000000 -3c085e6e -3508d880 -24030000 -2d021ce9 -144305e3 -00000000 -3c08a028 -35089d40 -24030001 -2d02e7cb -144305dd -00000000 -3c083832 -35081117 -24030001 -2d02ed76 -144305d7 -00000000 -3c0812a8 -35088941 -24030000 -2d020a3c -144305d1 -00000000 -3c08ed5d -35087100 -24030000 -2d022eb0 -144305cb -00000000 -3c08d38b -35089f88 -24030000 -2d02108c -144305c5 -00000000 -3c08ea5f -35080780 -24030001 -2d029fdf -144305bf -00000000 -3c08ea28 -3508e0c8 -24030000 -2d025fa2 -144305b9 -00000000 -3c080ec1 -3508dee5 -24030000 -2d0272d2 -144305b3 -00000000 -3c0826b8 -3508c998 -24030000 -2d0273de -144305ad -00000000 -3c08bd07 -35085074 -24030000 -2d02449e -144305a7 -00000000 -3c089d53 -3508bafc -24030001 -2d02ec24 -144305a1 -00000000 -3c087d85 -3508cdb0 -24030000 -2d026d7c -1443059b -00000000 -3c085d26 -35087400 -24030000 -2d0236ac -14430595 -00000000 -3c08f3b6 -35083bc0 -24030001 -2d02bd1e -1443058f -00000000 -3c0840ed -350891e0 -24030000 -2d02099c -14430589 -00000000 -3c085396 -3508f740 -24030001 -2d02cbfd -14430583 -00000000 -3c08a86c -35087df0 -24030001 -2d02cf01 -1443057d -00000000 -3c080041 -35082d74 -24030000 -2d023178 -14430577 -00000000 -3c0886a5 -3508e264 -24030000 -2d0252da -14430571 -00000000 -3c08ca63 -3508a907 -24030000 -2d023185 -1443056b -00000000 -3c08fa97 -3508665a -24030000 -2d0258d7 -14430565 -00000000 -3c08cf4d -350821aa -24030000 -2d020edc -1443055f -00000000 -3c0869c4 -35085edc -24030000 -2d026530 -14430559 -00000000 -3c08cd55 -350812cb -24030000 -2d023395 -14430553 -00000000 -3c080899 -3508ac00 -24030001 -2d02d626 -1443054d -00000000 -3c086d46 -35088800 -24030000 -2d022410 -14430547 -00000000 -3c08ec85 -350814c0 -24030000 -2d024f4e -14430541 -00000000 -3c0812a7 -3508789a -24030001 -2d02d763 -1443053b -00000000 -3c08e523 -35083112 -24030001 -2d028af6 -14430535 -00000000 -3c08dc81 -35080bbb -24030001 -2d028b90 -1443052f -00000000 -3c08f14e -35089ca8 -24030001 -2d02c618 -14430529 -00000000 -3c08a967 -35083020 -24030001 -2d02c36e -14430523 -00000000 -3c0894bd -3508cb7b -24030001 -2d028724 -1443051d -00000000 -3c08c074 -3508e8b0 -24030001 -2d0295f4 -14430517 -00000000 -3c08e3da -35086090 -24030000 -2d0207c8 -14430511 -00000000 -3c08ae7c -35085a80 -24030001 -2d02c114 -1443050b -00000000 -3c086729 -350881fd -24030001 -2d02c129 -14430505 -00000000 -3c08122f -350894e0 -24030001 -2d02e180 -144304ff -00000000 -3c08afab -350869cc -24030000 -2d020a4d -144304f9 -00000000 -3c08ef8a -35089a2c -24030001 -2d028d94 -144304f3 -00000000 -3c08749d -3508c4c4 -24030001 -2d02aeb8 -144304ed -00000000 -3c08e256 -3508fe48 -24030001 -2d0284fd -144304e7 -00000000 -3c08970c -35086730 -24030000 -2d02714a -144304e1 -00000000 -3c08b75c -3508c575 -24030000 -2d02080e -144304db -00000000 -3c089cfe -3508b59a -24030000 -2d02374d -144304d5 -00000000 -3c08c0db -35086a60 -24030000 -2d02300a -144304cf -00000000 -3c08aa73 -350891d8 -24030001 -2d02e5a3 -144304c9 -00000000 -3c082875 -3508f9fa -24030001 -2d02b3c8 -144304c3 -00000000 -3c0883d6 -35087990 -24030000 -2d026a62 -144304bd -00000000 -3c083bd6 -35087330 -24030001 -2d02859e -144304b7 -00000000 -3c08cbe8 -35086d55 -24030001 -2d02e6bb -144304b1 -00000000 -3c08277a -350862c6 -24030000 -2d025c96 -144304ab -00000000 -3c08ef53 -3508abd8 -24030001 -2d029a7a -144304a5 -00000000 -3c086505 -3508daa5 -24030000 -2d020c60 -1443049f -00000000 -3c08bd42 -35086d20 -24030000 -2d021326 -14430499 -00000000 -3c08d5c1 -350810da -24030000 -2d021f8c -14430493 -00000000 -3c08d5e4 -35088c59 -24030000 -2d02740f -1443048d -00000000 -3c08cce8 -35087935 -24030001 -2d02c5ea -14430487 -00000000 -3c08d96a -3508f938 -24030000 -2d026e84 -14430481 -00000000 -3c08470c -35087090 -24030000 -2d023f94 -1443047b -00000000 -3c08419b -3508a854 -24030000 -2d0262cd -14430475 -00000000 -3c089171 -35088eb8 -24030001 -2d02aa36 -1443046f -00000000 -3c0877d8 -35086579 -24030001 -2d028a68 -14430469 -00000000 -3c08c7d7 -3508a240 -24030000 -2d020cdc -14430463 -00000000 -3c08fcef -3508c780 -24030000 -2d021066 -1443045d -00000000 -3c08e6b0 -35086500 -24030000 -2d0259b9 -14430457 -00000000 -3c08faa0 -35087474 -24030000 -2d027db4 -14430451 -00000000 -3c08a064 -3508bb00 -24030000 -2d0227b4 -1443044b -00000000 -3c086b99 -35087b2c -24030001 -2d029345 -14430445 -00000000 -3c088311 -3508c8ee -24030000 -2d025818 -1443043f -00000000 -3c085ea6 -3508acac -24030001 -2d02915f -14430439 -00000000 -3c084dea -35088f80 -24030001 -2d02e233 -14430433 -00000000 -3c080e02 -3508f997 -24030000 -2d021c1f -1443042d -00000000 -3c083149 -35087cc4 -24030000 -2d0241e2 -14430427 -00000000 -3c0822de -350823b6 -24030000 -2d024f20 -14430421 -00000000 -3c081934 -35081260 -24030000 -2d020352 -1443041b -00000000 -3c08bae3 -35085040 -24030000 -2d022407 -14430415 -00000000 -3c08736e -3508af44 -24030001 -2d02fb36 -1443040f -00000000 -3c080e86 -35083bab -24030001 -2d02b779 -14430409 -00000000 -3c083efa -3508a7a6 -24030001 -2d02d92d -14430403 -00000000 -3c08aa07 -35086f00 -24030001 -2d02ea1a -144303fd -00000000 -3c08c5d0 -3508dd88 -24030001 -2d02c7ec -144303f7 -00000000 -3c08edd0 -3508687b -24030000 -2d023f54 -144303f1 -00000000 -3c087b0e -3508659c -24030000 -2d025e34 -144303eb -00000000 -3c089194 -35083cee -24030001 -2d02c600 -144303e5 -00000000 -3c082947 -350813b8 -24030001 -2d02b802 -144303df -00000000 -3c08a3d9 -35085ee0 -24030001 -2d02ef7c -144303d9 -00000000 -3c0869d2 -3508bd20 -24030001 -2d029188 -144303d3 -00000000 -3c086f48 -35082088 -24030001 -2d02c9ce -144303cd -00000000 -3c089dcf -3508c840 -24030000 -2d027978 -144303c7 -00000000 -3c085a77 -3508cae0 -24030000 -2d023af8 -144303c1 -00000000 -3c088dbf -3508a5c0 -24030001 -2d02d029 -144303bb -00000000 -3c08b38a -3508cbe0 -24030000 -2d026530 -144303b5 -00000000 -3c08de66 -350873f0 -24030000 -2d0241de -144303af -00000000 -3c08a352 -35080110 -24030001 -2d02bb9c -144303a9 -00000000 -3c0839a3 -3508ed60 -24030001 -2d02b1f0 -144303a3 -00000000 -3c088438 -35085a48 -24030000 -2d0276f2 -1443039d -00000000 -3c0867b1 -3508b642 -24030000 -2d022168 -14430397 -00000000 -3c083f18 -350896ae -24030001 -2d02c9ce -14430391 -00000000 -3c08c720 -35086c26 -24030000 -2d020e88 -1443038b -00000000 -3c081d42 -3508f6c4 -24030001 -2d02bab6 -14430385 -00000000 -3c0860d2 -3508b080 -24030000 -2d0228c7 -1443037f -00000000 -3c080f66 -350872d4 -24030001 -2d02ecd4 -14430379 -00000000 -3c083992 -35084098 -24030001 -2d02c018 -14430373 -00000000 -3c08bafc -350822ea -24030001 -2d02d300 -1443036d -00000000 -3c081f6f -3508d4e4 -24030000 -2d022168 -14430367 -00000000 -3c08ff27 -35085c54 -24030000 -2d027680 -14430361 -00000000 -3c08beec -3508d49a -24030000 -2d027c1e -1443035b -00000000 -3c081fdc -350848da -24030001 -2d0282d8 -14430355 -00000000 -3c08d9bf -3508b444 -24030000 -2d024cfa -1443034f -00000000 -3c08bfcf -350886d4 -24030001 -2d02f1ac -14430349 -00000000 -3c088a88 -35080440 -24030000 -2d0218ca -14430343 -00000000 -3c085171 -350832d0 -24030000 -2d02205f -1443033d -00000000 -3c082555 -35084980 -24030001 -2d028565 -14430337 -00000000 -3c085c76 -35088b80 -24030001 -2d029c24 -14430331 -00000000 -3c08a5e0 -3508ee9c -24030001 -2d02d6c8 -1443032b -00000000 -3c0899a7 -35089a82 -24030000 -2d025378 -14430325 -00000000 -3c08e0f1 -35084238 -24030001 -2d0280b5 -1443031f -00000000 -3c0848cb -35088610 -24030000 -2d0213d8 -14430319 -00000000 -3c08caf0 -3508c374 -24030000 -2d022c75 -14430313 -00000000 -3c089b94 -3508e694 -24030001 -2d029b36 -1443030d -00000000 -3c08aad1 -3508ada4 -24030000 -2d02752a -14430307 -00000000 -3c08b5ab -3508cbf4 -24030000 -2d026693 -14430301 -00000000 -3c08ae3d -3508f620 -24030001 -2d02aa36 -144302fb -00000000 -3c0876ac -3508762c -24030001 -2d02e100 -144302f5 -00000000 -3c08c2c2 -35083308 -24030000 -2d0236a0 -144302ef -00000000 -3c088c04 -3508ec50 -24030000 -2d027e44 -144302e9 -00000000 -3c085922 -35080200 -24030001 -2d02bab0 -144302e3 -00000000 -3c08b954 -3508b083 -24030000 -2d022760 -144302dd -00000000 -3c08945f -3508fd60 -24030000 -2d026f87 -144302d7 -00000000 -3c084bb5 -3508630c -24030000 -2d0219a8 -144302d1 -00000000 -3c084594 -350825f4 -24030001 -2d02b028 -144302cb -00000000 -3c084a58 -35084c00 -24030000 -2d020dcc -144302c5 -00000000 -3c0894b5 -35084308 -24030001 -2d02ee2a -144302bf -00000000 -3c084687 -3508236c -24030000 -2d023fa4 -144302b9 -00000000 -3c081ee5 -3508c220 -24030000 -2d021945 -144302b3 -00000000 -3c084df1 -3508c530 -24030000 -2d025c00 -144302ad -00000000 -3c08ec98 -35082c3e -24030001 -2d02a4a0 -144302a7 -00000000 -3c08a49e -35083620 -24030001 -2d02de96 -144302a1 -00000000 -3c08a8d7 -35086ac0 -24030001 -2d02c736 -1443029b -00000000 -3c08a36d -350833dc -24030000 -2d0265dc -14430295 -00000000 -3c089cea -35088ff4 -24030001 -2d02f8d4 -1443028f -00000000 -3c0822c1 -3508d98a -24030000 -2d027210 -14430289 -00000000 -3c0841b0 -3508979c -24030001 -2d02a8d7 -14430283 -00000000 -3c089dc9 -35083b4f -24030001 -2d02a4a0 -1443027d -00000000 -3c0878de -350888d2 -24030000 -2d022880 -14430277 -00000000 -3c0813f6 -3508e998 -24030000 -2d02008b -14430271 -00000000 -3c08b7c0 -35087400 -24030000 -2d022644 -1443026b -00000000 -3c0842f1 -350888fe -24030001 -2d029314 -14430265 -00000000 -3c0893ac -35083400 -24030000 -2d025d13 -1443025f -00000000 -3c083a97 -35080198 -24030001 -2d02e401 -14430259 -00000000 -3c082a1b -35080bb4 -24030001 -2d0298d0 -14430253 -00000000 -3c08d0b4 -3508acf0 -24030001 -2d02d491 -1443024d -00000000 -3c08e0d2 -3508b5fa -24030001 -2d02b1b6 -14430247 -00000000 -3c08533c -35087880 -24030001 -2d028e63 -14430241 -00000000 -3c080251 -3508adc0 -24030001 -2d02d3d8 -1443023b -00000000 -3c082d20 -350885dc -24030001 -2d028640 -14430235 -00000000 -3c083f67 -350830a0 -24030000 -2d02008f -1443022f -00000000 -3c085a88 -35087b40 -24030000 -2d020000 -14430229 -00000000 -3c0877f6 -3508f704 -24030000 -2d020000 -14430223 -00000000 -3c081706 -35085b00 -24030000 -2d020000 -1443021d -00000000 -3c0840e6 -350844f8 -24030000 -2d020000 -14430217 -00000000 -3c08051f -35080300 -24030000 -2d020000 -14430211 -00000000 -3c082182 -35082ca0 -24030000 -2d020000 -1443020b -00000000 -3c0810be -35085096 -24030000 -2d020000 -14430205 -00000000 -3c08e044 -3508c598 -24030000 -2d020000 -144301ff -00000000 -3c08502f -35083ef8 -24030000 -2d020000 -144301f9 -00000000 -3c08ff47 -3508ef40 -24030000 -2d020000 -144301f3 -00000000 -3c0866ce -35087cbe -24030000 -2d020000 -144301ed -00000000 -3c082937 -35082a28 -24030000 -2d020000 -144301e7 -00000000 -3c08845c -3508e200 -24030000 -2d020000 -144301e1 -00000000 -3c081632 -35081ee0 -24030000 -2d020000 -144301db -00000000 -3c084565 -350840c0 -24030000 -2d020000 -144301d5 -00000000 -3c089b07 -350805f0 -24030000 -2d020000 -144301cf -00000000 -3c0895e2 -35080950 -24030000 -2d020000 -144301c9 -00000000 -3c080831 -35082224 -24030000 -2d020000 -144301c3 -00000000 -3c080313 -35088460 -24030000 -2d020000 -144301bd -00000000 -3c083978 -3508fdde -24030000 -2d020000 -144301b7 -00000000 -3c08fad1 -3508e400 -24030000 -2d020000 -144301b1 -00000000 -3c08514e -3508de20 -24030000 -2d020000 -144301ab -00000000 -3c088889 -3508e66f -24030000 -2d020000 -144301a5 -00000000 -3c083ac1 -3508a4fc -24030000 -2d020000 -1443019f -00000000 -3c083ed2 -3508ea5f -24030000 -2d020000 -14430199 -00000000 -3c088063 -35083134 -24030000 -2d020000 -14430193 -00000000 -3c086ba5 -3508c2bb -24030000 -2d020000 -1443018d -00000000 -3c086fa0 -3508b5c0 -24030000 -2d020000 -14430187 -00000000 -3c08d2aa -3508a7be -24030000 -2d020000 -14430181 -00000000 -3c08e48a -35084b08 -24030000 -2d020000 -1443017b -00000000 -3c086fb2 -35082958 -24030000 -2d020000 -14430175 -00000000 -3c08154e -35086134 -24030000 -2d020000 -1443016f -00000000 -3c089cf2 -35083035 -24030000 -2d020000 -14430169 -00000000 -3c085fe5 -3508308c -24030000 -2d020000 -14430163 -00000000 -3c08afc0 -3508d82c -24030000 -2d020000 -1443015d -00000000 -3c082472 -3508d528 -24030000 -2d020000 -14430157 -00000000 -3c082819 -35086e0f -24030000 -2d020000 -14430151 -00000000 -3c088c5a -3508d5f4 -24030000 -2d020000 -1443014b -00000000 -3c08579e -3508b980 -24030000 -2d020000 -14430145 -00000000 -3c08f521 -35080f00 -24030000 -2d020000 -1443013f -00000000 -3c0893aa -35087fc5 -24030000 -2d020000 -14430139 -00000000 -3c081bab -35084b60 -24030000 -2d020000 -14430133 -00000000 -3c08e581 -35087240 -24030000 -2d020000 -1443012d -00000000 -3c08cc59 -3508904c -24030000 -2d020000 -14430127 -00000000 -3c08398b -3508d619 -24030000 -2d020000 -14430121 -00000000 -3c0867b8 -35089b28 -24030000 -2d020000 -1443011b -00000000 -3c08efd8 -35080fc4 -24030000 -2d020000 -14430115 -00000000 -3c0855d2 -3508d016 -24030000 -2d020000 -1443010f -00000000 -3c089609 -35089350 -24030000 -2d020000 -14430109 -00000000 -3c08719d -350844a8 -24030000 -2d020000 -14430103 -00000000 -24080000 -24030001 -2d02b625 -144300fe -00000000 -24080000 -24030001 -2d02d72e -144300f9 -00000000 -24080000 -24030001 -2d025e36 -144300f4 -00000000 -24080000 -24030001 -2d029e40 -144300ef -00000000 -24080000 -24030001 -2d026d08 -144300ea -00000000 -24080000 -24030001 -2d02c6c4 -144300e5 -00000000 -24080000 -24030001 -2d022f0d -144300e0 -00000000 -24080000 -24030001 -2d02e460 -144300db -00000000 -24080000 -24030001 -2d0299de -144300d6 -00000000 -24080000 -24030001 -2d02a798 -144300d1 -00000000 -24080000 -24030001 -2d02da38 -144300cc -00000000 -24080000 -24030001 -2d02e6b4 -144300c7 -00000000 -24080000 -24030001 -2d021bdf -144300c2 -00000000 -24080000 -24030001 -2d023cc8 -144300bd -00000000 -24080000 -24030001 -2d02771c -144300b8 -00000000 -24080000 -24030001 -2d02e4d6 -144300b3 -00000000 -24080000 -24030001 -2d022100 -144300ae -00000000 -24080000 -24030001 -2d02d725 -144300a9 -00000000 -24080000 -24030001 -2d025d3a -144300a4 -00000000 -24080000 -24030001 -2d02cc47 -1443009f -00000000 -24080000 -24030001 -2d023eb8 -1443009a -00000000 -24080000 -24030001 -2d0244ec -14430095 -00000000 -24080000 -24030001 -2d02bde0 -14430090 -00000000 -24080000 -24030001 -2d02a4b1 -1443008b -00000000 -24080000 -24030001 -2d02cbae -14430086 -00000000 -24080000 -24030001 -2d021c44 -14430081 -00000000 -24080000 -24030001 -2d02ae1d -1443007c -00000000 -24080000 -24030001 -2d02f028 -14430077 -00000000 -24080000 -24030001 -2d02f520 -14430072 -00000000 -24080000 -24030001 -2d02ab2f -1443006d -00000000 -24080000 -24030001 -2d02e612 -14430068 -00000000 -24080000 -24030001 -2d023665 -14430063 -00000000 -24080000 -24030001 -2d0218ec -1443005e -00000000 -24080000 -24030001 -2d02c23a -14430059 -00000000 -24080000 -24030001 -2d022345 -14430054 -00000000 -24080000 -24030001 -2d02031d -1443004f -00000000 -24080000 -24030001 -2d02a3d0 -1443004a -00000000 -24080000 -24030001 -2d022c47 -14430045 -00000000 -24080000 -24030001 -2d022d66 -14430040 -00000000 -24080000 -24030001 -2d028ca7 -1443003b -00000000 -24080000 -24030001 -2d025d13 -14430036 -00000000 -24080000 -24030001 -2d02b8b8 -14430031 -00000000 -24080000 -24030001 -2d02ba66 -1443002c -00000000 -24080000 -24030001 -2d027960 -14430027 -00000000 -24080000 -24030001 -2d0212f0 -14430022 -00000000 -24080000 -24030001 -2d02859f -1443001d -00000000 -24080000 -24030001 -2d02ed76 -14430018 -00000000 -24080000 -24030001 -2d022594 -14430013 -00000000 -24080000 -24030001 -2d0270df -1443000e -00000000 -24080000 -24030001 -2d02c3b8 -14430009 -00000000 -24080000 -24030000 -2d020000 -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -00000000 -26100001 -24120000 -3c020000 -3c030000 -10000008 -00000000 -3c0242ea -34426edf -0bf0fc96 -00000000 -10000009 -00000000 -00000000 -0bf0fc8a -00000000 -10000004 -00000000 -00000000 -3c032407 -34631ba8 -3c1542ea -36b56edf -3c162407 -36d61ba8 -14550c36 -00000000 -14760c34 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02ac27 -34425df0 -0bf0fcb0 -00000000 -10000009 -00000000 -00000000 -0bf0fca4 -00000000 -10000004 -00000000 -00000000 -3c0383f0 -3463722c -3c15ac27 -36b55df0 -3c1683f0 -36d6722c -14550c1c -00000000 -14760c1a -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0258b9 -34421ef0 -0bf0fcca -00000000 -10000009 -00000000 -00000000 -0bf0fcbe -00000000 -10000004 -00000000 -00000000 -3c032268 -346361f5 -3c1558b9 -36b51ef0 -3c162268 -36d661f5 -14550c02 -00000000 -14760c00 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02fc34 -3442d5d0 -0bf0fce4 -00000000 -10000009 -00000000 -00000000 -0bf0fcd8 -00000000 -10000004 -00000000 -00000000 -3c034710 -34637652 -3c15fc34 -36b5d5d0 -3c164710 -36d67652 -14550be8 -00000000 -14760be6 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c029978 -344288c0 -0bf0fcfe -00000000 -10000009 -00000000 -00000000 -0bf0fcf2 -00000000 -10000004 -00000000 -00000000 -3c034980 -3463d790 -3c159978 -36b588c0 -3c164980 -36d6d790 -14550bce -00000000 -14760bcc -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0260af -34429fa4 -0bf0fd18 -00000000 -10000009 -00000000 -00000000 -0bf0fd0c -00000000 -10000004 -00000000 -00000000 -3c0335dd -34632200 -3c1560af -36b59fa4 -3c1635dd -36d62200 -14550bb4 -00000000 -14760bb2 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0247a3 -34425d90 -0bf0fd32 -00000000 -10000009 -00000000 -00000000 -0bf0fd26 -00000000 -10000004 -00000000 -00000000 -3c03cf59 -34639ca0 -3c1547a3 -36b55d90 -3c16cf59 -36d69ca0 -14550b9a -00000000 -14760b98 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0291f7 -3442d314 -0bf0fd4c -00000000 -10000009 -00000000 -00000000 -0bf0fd40 -00000000 -10000004 -00000000 -00000000 -3c03568e -3463d358 -3c1591f7 -36b5d314 -3c16568e -36d6d358 -14550b80 -00000000 -14760b7e -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0235d7 -34426d80 -0bf0fd66 -00000000 -10000009 -00000000 -00000000 -0bf0fd5a -00000000 -10000004 -00000000 -00000000 -3c03b40d -3463f682 -3c1535d7 -36b56d80 -3c16b40d -36d6f682 -14550b66 -00000000 -14760b64 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c022bfd -3442af46 -0bf0fd80 -00000000 -10000009 -00000000 -00000000 -0bf0fd74 -00000000 -10000004 -00000000 -00000000 -3c0371b5 -34632e90 -3c152bfd -36b5af46 -3c1671b5 -36d62e90 -14550b4c -00000000 -14760b4a -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c023edc -3442e843 -0bf0fd9a -00000000 -10000009 -00000000 -00000000 -0bf0fd8e -00000000 -10000004 -00000000 -00000000 -3c039244 -3463bb18 -3c153edc -36b5e843 -3c169244 -36d6bb18 -14550b32 -00000000 -14760b30 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c025273 -3442fd08 -0bf0fdb4 -00000000 -10000009 -00000000 -00000000 -0bf0fda8 -00000000 -10000004 -00000000 -00000000 -3c031735 -34638743 -3c155273 -36b5fd08 -3c161735 -36d68743 -14550b18 -00000000 -14760b16 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02fb4a -34424134 -0bf0fdce -00000000 -10000009 -00000000 -00000000 -0bf0fdc2 -00000000 -10000004 -00000000 -00000000 -3c03f1c2 -34636750 -3c15fb4a -36b54134 -3c16f1c2 -36d66750 -14550afe -00000000 -14760afc -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02a359 -3442f930 -0bf0fde8 -00000000 -10000009 -00000000 -00000000 -0bf0fddc -00000000 -10000004 -00000000 -00000000 -3c0384e5 -3463dfc4 -3c15a359 -36b5f930 -3c1684e5 -36d6dfc4 -14550ae4 -00000000 -14760ae2 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c028be3 -3442e4cf -0bf0fe02 -00000000 -10000009 -00000000 -00000000 -0bf0fdf6 -00000000 -10000004 -00000000 -00000000 -3c03b44d -346332db -3c158be3 -36b5e4cf -3c16b44d -36d632db -14550aca -00000000 -14760ac8 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0220a6 -34423240 -0bf0fe1c -00000000 -10000009 -00000000 -00000000 -0bf0fe10 -00000000 -10000004 -00000000 -00000000 -3c034c3f -3463ee78 -3c1520a6 -36b53240 -3c164c3f -36d6ee78 -14550ab0 -00000000 -14760aae -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02479b -34423d54 -0bf0fe36 -00000000 -10000009 -00000000 -00000000 -0bf0fe2a -00000000 -10000004 -00000000 -00000000 -3c0346df -34631dfb -3c15479b -36b53d54 -3c1646df -36d61dfb -14550a96 -00000000 -14760a94 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02518a -34424940 -0bf0fe50 -00000000 -10000009 -00000000 -00000000 -0bf0fe44 -00000000 -10000004 -00000000 -00000000 -3c035e1d -34630288 -3c15518a -36b54940 -3c165e1d -36d60288 -14550a7c -00000000 -14760a7a -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c023623 -34427e64 -0bf0fe6a -00000000 -10000009 -00000000 -00000000 -0bf0fe5e -00000000 -10000004 -00000000 -00000000 -3c031330 -3463ac2a -3c153623 -36b57e64 -3c161330 -36d6ac2a -14550a62 -00000000 -14760a60 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02ad06 -34426b28 -0bf0fe84 -00000000 -10000009 -00000000 -00000000 -0bf0fe78 -00000000 -10000004 -00000000 -00000000 -3c03ffea -3463d346 -3c15ad06 -36b56b28 -3c16ffea -36d6d346 -14550a48 -00000000 -14760a46 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c024ee3 -3442ba5a -0bf0fe9e -00000000 -10000009 -00000000 -00000000 -0bf0fe92 -00000000 -10000004 -00000000 -00000000 -3c03b042 -34633218 -3c154ee3 -36b5ba5a -3c16b042 -36d63218 -14550a2e -00000000 -14760a2c -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c020347 -3442dbc4 -0bf0feb8 -00000000 -10000009 -00000000 -00000000 -0bf0feac -00000000 -10000004 -00000000 -00000000 -3c03bb5e -3463cfa8 -3c150347 -36b5dbc4 -3c16bb5e -36d6cfa8 -14550a14 -00000000 -14760a12 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0267ae -34421e29 -0bf0fed2 -00000000 -10000009 -00000000 -00000000 -0bf0fec6 -00000000 -10000004 -00000000 -00000000 -3c03ed14 -34631958 -3c1567ae -36b51e29 -3c16ed14 -36d61958 -145509fa -00000000 -147609f8 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c028a38 -344207b8 -0bf0feec -00000000 -10000009 -00000000 -00000000 -0bf0fee0 -00000000 -10000004 -00000000 -00000000 -3c03b277 -3463f404 -3c158a38 -36b507b8 -3c16b277 -36d6f404 -145509e0 -00000000 -147609de -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c028f41 -344279d4 -0bf0ff06 -00000000 -10000009 -00000000 -00000000 -0bf0fefa -00000000 -10000004 -00000000 -00000000 -3c03e0bd -34637f4c -3c158f41 -36b579d4 -3c16e0bd -36d67f4c -145509c6 -00000000 -147609c4 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02278a -34428400 -0bf0ff20 -00000000 -10000009 -00000000 -00000000 -0bf0ff14 -00000000 -10000004 -00000000 -00000000 -3c033396 -34639970 -3c15278a -36b58400 -3c163396 -36d69970 -145509ac -00000000 -147609aa -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c029919 -34427cc8 -0bf0ff3a -00000000 -10000009 -00000000 -00000000 -0bf0ff2e -00000000 -10000004 -00000000 -00000000 -3c031e7b -3463be50 -3c159919 -36b57cc8 -3c161e7b -36d6be50 -14550992 -00000000 -14760990 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02744f -3442e304 -0bf0ff54 -00000000 -10000009 -00000000 -00000000 -0bf0ff48 -00000000 -10000004 -00000000 -00000000 -3c03117d -3463cc70 -3c15744f -36b5e304 -3c16117d -36d6cc70 -14550978 -00000000 -14760976 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02d014 -3442a370 -0bf0ff6e -00000000 -10000009 -00000000 -00000000 -0bf0ff62 -00000000 -10000004 -00000000 -00000000 -3c035df6 -34632270 -3c15d014 -36b5a370 -3c165df6 -36d62270 -1455095e -00000000 -1476095c -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02cf8c -34427a04 -0bf0ff88 -00000000 -10000009 -00000000 -00000000 -0bf0ff7c -00000000 -10000004 -00000000 -00000000 -3c034aaf -346334b6 -3c15cf8c -36b57a04 -3c164aaf -36d634b6 -14550944 -00000000 -14760942 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c028e28 -34428160 -0bf0ffa2 -00000000 -10000009 -00000000 -00000000 -0bf0ff96 -00000000 -10000004 -00000000 -00000000 -3c037b40 -34630fc6 -3c158e28 -36b58160 -3c167b40 -36d60fc6 -1455092a -00000000 -14760928 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02aa29 -34421a98 -0bf0ffbc -00000000 -10000009 -00000000 -00000000 -0bf0ffb0 -00000000 -10000004 -00000000 -00000000 -3c031baf -34633e24 -3c15aa29 -36b51a98 -3c161baf -36d63e24 -14550910 -00000000 -1476090e -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c023ee4 -344254a0 -0bf0ffd6 -00000000 -10000009 -00000000 -00000000 -0bf0ffca -00000000 -10000004 -00000000 -00000000 -3c035114 -3463e086 -3c153ee4 -36b554a0 -3c165114 -36d6e086 -145508f6 -00000000 -147608f4 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02fedc -3442b9f2 -0bf0fff0 -00000000 -10000009 -00000000 -00000000 -0bf0ffe4 -00000000 -10000004 -00000000 -00000000 -3c033ce0 -3463752c -3c15fedc -36b5b9f2 -3c163ce0 -36d6752c -145508dc -00000000 -147608da -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c028eeb -34424886 -0bf1000a -00000000 -10000009 -00000000 -00000000 -0bf0fffe -00000000 -10000004 -00000000 -00000000 -3c031f69 -34630472 -3c158eeb -36b54886 -3c161f69 -36d60472 -145508c2 -00000000 -147608c0 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02df3c -3442de26 -0bf10024 -00000000 -10000009 -00000000 -00000000 -0bf10018 -00000000 -10000004 -00000000 -00000000 -3c035fa6 -34636dd0 -3c15df3c -36b5de26 -3c165fa6 -36d66dd0 -145508a8 -00000000 -147608a6 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02b340 -344217a8 -0bf1003e -00000000 -10000009 -00000000 -00000000 -0bf10032 -00000000 -10000004 -00000000 -00000000 -3c0304ab -3463056a -3c15b340 -36b517a8 -3c1604ab -36d6056a -1455088e -00000000 -1476088c -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02b83c -34425dc0 -0bf10058 -00000000 -10000009 -00000000 -00000000 -0bf1004c -00000000 -10000004 -00000000 -00000000 -3c033ec8 -3463df21 -3c15b83c -36b55dc0 -3c163ec8 -36d6df21 -14550874 -00000000 -14760872 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02f2d3 -34428780 -0bf10072 -00000000 -10000009 -00000000 -00000000 -0bf10066 -00000000 -10000004 -00000000 -00000000 -3c0338da -3463cda4 -3c15f2d3 -36b58780 -3c1638da -36d6cda4 -1455085a -00000000 -14760858 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0278c3 -3442b84c -0bf1008c -00000000 -10000009 -00000000 -00000000 -0bf10080 -00000000 -10000004 -00000000 -00000000 -3c03f01d -346303e0 -3c1578c3 -36b5b84c -3c16f01d -36d603e0 -14550840 -00000000 -1476083e -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02df1c -3442051e -0bf100a6 -00000000 -10000009 -00000000 -00000000 -0bf1009a -00000000 -10000004 -00000000 -00000000 -3c034806 -346357c0 -3c15df1c -36b5051e -3c164806 -36d657c0 -14550826 -00000000 -14760824 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02019c -3442d5bc -0bf100c0 -00000000 -10000009 -00000000 -00000000 -0bf100b4 -00000000 -10000004 -00000000 -00000000 -3c0381b2 -346319e2 -3c15019c -36b5d5bc -3c1681b2 -36d619e2 -1455080c -00000000 -1476080a -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c024607 -34423400 -0bf100da -00000000 -10000009 -00000000 -00000000 -0bf100ce -00000000 -10000004 -00000000 -00000000 -3c031411 -34636cee -3c154607 -36b53400 -3c161411 -36d66cee -145507f2 -00000000 -147607f0 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02f90a -3442bd90 -0bf100f4 -00000000 -10000009 -00000000 -00000000 -0bf100e8 -00000000 -10000004 -00000000 -00000000 -3c03e3ae -34639e38 -3c15f90a -36b5bd90 -3c16e3ae -36d69e38 -145507d8 -00000000 -147607d6 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c022f59 -34425748 -0bf1010e -00000000 -10000009 -00000000 -00000000 -0bf10102 -00000000 -10000004 -00000000 -00000000 -3c03322f -34633db0 -3c152f59 -36b55748 -3c16322f -36d63db0 -145507be -00000000 -147607bc -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c024f70 -344264d0 -0bf10128 -00000000 -10000009 -00000000 -00000000 -0bf1011c -00000000 -10000004 -00000000 -00000000 -3c03d19d -346340bb -3c154f70 -36b564d0 -3c16d19d -36d640bb -145507a4 -00000000 -147607a2 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02b0a6 -34421578 -0bf10142 -00000000 -10000009 -00000000 -00000000 -0bf10136 -00000000 -10000004 -00000000 -00000000 -3c039b7c -3463ab12 -3c15b0a6 -36b51578 -3c169b7c -36d6ab12 -1455078a -00000000 -14760788 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0237d9 -3442cf70 -0bf1015c -00000000 -10000009 -00000000 -00000000 -0bf10150 -00000000 -10000004 -00000000 -00000000 -3c0314fb -3463ed08 -3c1537d9 -36b5cf70 -3c1614fb -36d6ed08 -14550770 -00000000 -1476076e -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02aefb -3442fe00 -0bf10176 -00000000 -10000009 -00000000 -00000000 -0bf1016a -00000000 -10000004 -00000000 -00000000 -3c032ce8 -34631d90 -3c15aefb -36b5fe00 -3c162ce8 -36d61d90 -14550756 -00000000 -14760754 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0233bb -34428cf0 -0bf10190 -00000000 -10000009 -00000000 -00000000 -0bf10184 -00000000 -10000004 -00000000 -00000000 -3c038181 -34638a0c -3c1533bb -36b58cf0 -3c168181 -36d68a0c -1455073c -00000000 -1476073a -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02e2d0 -3442fb60 -0bf101aa -00000000 -10000009 -00000000 -00000000 -0bf1019e -00000000 -10000004 -00000000 -00000000 -3c03c656 -34634330 -3c15e2d0 -36b5fb60 -3c16c656 -36d64330 -14550722 -00000000 -14760720 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0275f3 -3442e4f8 -0bf101c4 -00000000 -10000009 -00000000 -00000000 -0bf101b8 -00000000 -10000004 -00000000 -00000000 -3c03e296 -3463a2e0 -3c1575f3 -36b5e4f8 -3c16e296 -36d6a2e0 -14550708 -00000000 -14760706 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02cec9 -34428738 -0bf101de -00000000 -10000009 -00000000 -00000000 -0bf101d2 -00000000 -10000004 -00000000 -00000000 -3c03abf2 -3463004c -3c15cec9 -36b58738 -3c16abf2 -36d6004c -145506ee -00000000 -147606ec -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c022a8d -34427670 -0bf101f8 -00000000 -10000009 -00000000 -00000000 -0bf101ec -00000000 -10000004 -00000000 -00000000 -3c03342c -34637e80 -3c152a8d -36b57670 -3c16342c -36d67e80 -145506d4 -00000000 -147606d2 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c021718 -3442b9de -0bf10212 -00000000 -10000009 -00000000 -00000000 -0bf10206 -00000000 -10000004 -00000000 -00000000 -3c0362a3 -3463cb74 -3c151718 -36b5b9de -3c1662a3 -36d6cb74 -145506ba -00000000 -147606b8 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c028bc8 -3442b000 -0bf1022c -00000000 -10000009 -00000000 -00000000 -0bf10220 -00000000 -10000004 -00000000 -00000000 -3c03f503 -34637c60 -3c158bc8 -36b5b000 -3c16f503 -36d67c60 -145506a0 -00000000 -1476069e -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c021d34 -34429520 -0bf10246 -00000000 -10000009 -00000000 -00000000 -0bf1023a -00000000 -10000004 -00000000 -00000000 -3c0342aa -3463f6d0 -3c151d34 -36b59520 -3c1642aa -36d6f6d0 -14550686 -00000000 -14760684 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c029f7c -3442eda0 -0bf10260 -00000000 -10000009 -00000000 -00000000 -0bf10254 -00000000 -10000004 -00000000 -00000000 -3c03097e -3463d578 -3c159f7c -36b5eda0 -3c16097e -36d6d578 -1455066c -00000000 -1476066a -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02aa06 -34424de0 -0bf1027a -00000000 -10000009 -00000000 -00000000 -0bf1026e -00000000 -10000004 -00000000 -00000000 -3c03b2b8 -34632ebc -3c15aa06 -36b54de0 -3c16b2b8 -36d62ebc -14550652 -00000000 -14760650 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02a267 -34429b76 -0bf10294 -00000000 -10000009 -00000000 -00000000 -0bf10288 -00000000 -10000004 -00000000 -00000000 -3c03ab83 -34633f68 -3c15a267 -36b59b76 -3c16ab83 -36d63f68 -14550638 -00000000 -14760636 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0218b2 -3442564a -0bf102ae -00000000 -10000009 -00000000 -00000000 -0bf102a2 -00000000 -10000004 -00000000 -00000000 -3c03e9ca -34638b40 -3c1518b2 -36b5564a -3c16e9ca -36d68b40 -1455061e -00000000 -1476061c -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c027d87 -3442fdbc -0bf102c8 -00000000 -10000009 -00000000 -00000000 -0bf102bc -00000000 -10000004 -00000000 -00000000 -3c035068 -3463c898 -3c157d87 -36b5fdbc -3c165068 -36d6c898 -14550604 -00000000 -14760602 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02a64d -344268a9 -0bf102e2 -00000000 -10000009 -00000000 -00000000 -0bf102d6 -00000000 -10000004 -00000000 -00000000 -3c03b991 -346302ac -3c15a64d -36b568a9 -3c16b991 -36d602ac -145505ea -00000000 -147605e8 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c024c13 -3442501c -0bf102fc -00000000 -10000009 -00000000 -00000000 -0bf102f0 -00000000 -10000004 -00000000 -00000000 -3c039789 -3463f15c -3c154c13 -36b5501c -3c169789 -36d6f15c -145505d0 -00000000 -147605ce -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c020b9f -3442fea0 -0bf10316 -00000000 -10000009 -00000000 -00000000 -0bf1030a -00000000 -10000004 -00000000 -00000000 -3c039b37 -34637696 -3c150b9f -36b5fea0 -3c169b37 -36d67696 -145505b6 -00000000 -147605b4 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c026498 -34427db5 -0bf10330 -00000000 -10000009 -00000000 -00000000 -0bf10324 -00000000 -10000004 -00000000 -00000000 -3c03abc9 -3463fd50 -3c156498 -36b57db5 -3c16abc9 -36d6fd50 -1455059c -00000000 -1476059a -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02fcc1 -34422490 -0bf1034a -00000000 -10000009 -00000000 -00000000 -0bf1033e -00000000 -10000004 -00000000 -00000000 -3c03164d -3463033e -3c15fcc1 -36b52490 -3c16164d -36d6033e -14550582 -00000000 -14760580 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c027be1 -34424bd0 -0bf10364 -00000000 -10000009 -00000000 -00000000 -0bf10358 -00000000 -10000004 -00000000 -00000000 -3c03b0d0 -34637790 -3c157be1 -36b54bd0 -3c16b0d0 -36d67790 -14550568 -00000000 -14760566 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0205f4 -34422d30 -0bf1037e -00000000 -10000009 -00000000 -00000000 -0bf10372 -00000000 -10000004 -00000000 -00000000 -3c03a001 -34632600 -3c1505f4 -36b52d30 -3c16a001 -36d62600 -1455054e -00000000 -1476054c -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c025bd8 -344225c0 -0bf10398 -00000000 -10000009 -00000000 -00000000 -0bf1038c -00000000 -10000004 -00000000 -00000000 -3c03c036 -3463f1ce -3c155bd8 -36b525c0 -3c16c036 -36d6f1ce -14550534 -00000000 -14760532 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0271cc -34429e50 -0bf103b2 -00000000 -10000009 -00000000 -00000000 -0bf103a6 -00000000 -10000004 -00000000 -00000000 -3c03f9de -34636878 -3c1571cc -36b59e50 -3c16f9de -36d66878 -1455051a -00000000 -14760518 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02cef2 -34420400 -0bf103cc -00000000 -10000009 -00000000 -00000000 -0bf103c0 -00000000 -10000004 -00000000 -00000000 -3c0374a2 -3463f96f -3c15cef2 -36b50400 -3c1674a2 -36d6f96f -14550500 -00000000 -147604fe -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c023035 -34426457 -0bf103e6 -00000000 -10000009 -00000000 -00000000 -0bf103da -00000000 -10000004 -00000000 -00000000 -3c03018a -3463f932 -3c153035 -36b56457 -3c16018a -36d6f932 -145504e6 -00000000 -147604e4 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02d445 -3442509d -0bf10400 -00000000 -10000009 -00000000 -00000000 -0bf103f4 -00000000 -10000004 -00000000 -00000000 -3c0386fa -3463df44 -3c15d445 -36b5509d -3c1686fa -36d6df44 -145504cc -00000000 -147604ca -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02d37d -34429980 -0bf1041a -00000000 -10000009 -00000000 -00000000 -0bf1040e -00000000 -10000004 -00000000 -00000000 -3c0375bd -3463d728 -3c15d37d -36b59980 -3c1675bd -36d6d728 -145504b2 -00000000 -147604b0 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c020a83 -34420f74 -0bf10434 -00000000 -10000009 -00000000 -00000000 -0bf10428 -00000000 -10000004 -00000000 -00000000 -3c03721b -34632040 -3c150a83 -36b50f74 -3c16721b -36d62040 -14550498 -00000000 -14760496 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c025a78 -3442ba00 -0bf1044e -00000000 -10000009 -00000000 -00000000 -0bf10442 -00000000 -10000004 -00000000 -00000000 -3c03f0e7 -346351e6 -3c155a78 -36b5ba00 -3c16f0e7 -36d651e6 -1455047e -00000000 -1476047c -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c028b5a -34427614 -0bf10468 -00000000 -10000009 -00000000 -00000000 -0bf1045c -00000000 -10000004 -00000000 -00000000 -3c035334 -34639d74 -3c158b5a -36b57614 -3c165334 -36d69d74 -14550464 -00000000 -14760462 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c029a10 -3442a8ec -0bf10482 -00000000 -10000009 -00000000 -00000000 -0bf10476 -00000000 -10000004 -00000000 -00000000 -3c03a8f8 -34631690 -3c159a10 -36b5a8ec -3c16a8f8 -36d61690 -1455044a -00000000 -14760448 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02af1b -34421580 -0bf1049c -00000000 -10000009 -00000000 -00000000 -0bf10490 -00000000 -10000004 -00000000 -00000000 -3c03666a -3463108a -3c15af1b -36b51580 -3c16666a -36d6108a -14550430 -00000000 -1476042e -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c022f92 -34422960 -0bf104b6 -00000000 -10000009 -00000000 -00000000 -0bf104aa -00000000 -10000004 -00000000 -00000000 -3c0379bc -3463a7e0 -3c152f92 -36b52960 -3c1679bc -36d6a7e0 -14550416 -00000000 -14760414 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c026222 -3442b470 -0bf104d0 -00000000 -10000009 -00000000 -00000000 -0bf104c4 -00000000 -10000004 -00000000 -00000000 -3c03473d -3463f7a0 -3c156222 -36b5b470 -3c16473d -36d6f7a0 -145503fc -00000000 -147603fa -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02cfeb -344211f8 -0bf104ea -00000000 -10000009 -00000000 -00000000 -0bf104de -00000000 -10000004 -00000000 -00000000 -3c03e809 -346300f0 -3c15cfeb -36b511f8 -3c16e809 -36d600f0 -145503e2 -00000000 -147603e0 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0285d4 -3442b680 -0bf10504 -00000000 -10000009 -00000000 -00000000 -0bf104f8 -00000000 -10000004 -00000000 -00000000 -3c032b49 -34630cfe -3c1585d4 -36b5b680 -3c162b49 -36d60cfe -145503c8 -00000000 -147603c6 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02a333 -3442bf20 -0bf1051e -00000000 -10000009 -00000000 -00000000 -0bf10512 -00000000 -10000004 -00000000 -00000000 -3c035f1c -34636698 -3c15a333 -36b5bf20 -3c165f1c -36d66698 -145503ae -00000000 -147603ac -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0269ef -3442cf00 -0bf10538 -00000000 -10000009 -00000000 -00000000 -0bf1052c -00000000 -10000004 -00000000 -00000000 -3c032fa1 -3463d3dc -3c1569ef -36b5cf00 -3c162fa1 -36d6d3dc -14550394 -00000000 -14760392 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c028959 -3442486f -0bf10552 -00000000 -10000009 -00000000 -00000000 -0bf10546 -00000000 -10000004 -00000000 -00000000 -3c038590 -3463fce0 -3c158959 -36b5486f -3c168590 -36d6fce0 -1455037a -00000000 -14760378 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02a24e -344276a0 -0bf1056c -00000000 -10000009 -00000000 -00000000 -0bf10560 -00000000 -10000004 -00000000 -00000000 -3c038b1d -34639dea -3c15a24e -36b576a0 -3c168b1d -36d69dea -14550360 -00000000 -1476035e -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02def2 -344254e6 -0bf10586 -00000000 -10000009 -00000000 -00000000 -0bf1057a -00000000 -10000004 -00000000 -00000000 -3c03e963 -34637dea -3c15def2 -36b554e6 -3c16e963 -36d67dea -14550346 -00000000 -14760344 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0209d2 -3442dbc2 -0bf105a0 -00000000 -10000009 -00000000 -00000000 -0bf10594 -00000000 -10000004 -00000000 -00000000 -3c03d72f -3463c808 -3c1509d2 -36b5dbc2 -3c16d72f -36d6c808 -1455032c -00000000 -1476032a -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02b3ae -3442c756 -0bf105ba -00000000 -10000009 -00000000 -00000000 -0bf105ae -00000000 -10000004 -00000000 -00000000 -3c0352d4 -3463a080 -3c15b3ae -36b5c756 -3c1652d4 -36d6a080 -14550312 -00000000 -14760310 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c022507 -34428274 -0bf105d4 -00000000 -10000009 -00000000 -00000000 -0bf105c8 -00000000 -10000004 -00000000 -00000000 -3c03ac5e -3463e0c0 -3c152507 -36b58274 -3c16ac5e -36d6e0c0 -145502f8 -00000000 -147602f6 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c024e13 -34422415 -0bf105ee -00000000 -10000009 -00000000 -00000000 -0bf105e2 -00000000 -10000004 -00000000 -00000000 -3c037db7 -3463b048 -3c154e13 -36b52415 -3c167db7 -36d6b048 -145502de -00000000 -147602dc -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02b4bf -3442ffe0 -0bf10608 -00000000 -10000009 -00000000 -00000000 -0bf105fc -00000000 -10000004 -00000000 -00000000 -3c03584a -3463f448 -3c15b4bf -36b5ffe0 -3c16584a -36d6f448 -145502c4 -00000000 -147602c2 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c029555 -34420edf -0bf10622 -00000000 -10000009 -00000000 -00000000 -0bf10616 -00000000 -10000004 -00000000 -00000000 -3c0370bf -34633aff -3c159555 -36b50edf -3c1670bf -36d63aff -145502aa -00000000 -147602a8 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0237c9 -3442b418 -0bf1063c -00000000 -10000009 -00000000 -00000000 -0bf10630 -00000000 -10000004 -00000000 -00000000 -3c031ede -3463a5ab -3c1537c9 -36b5b418 -3c161ede -36d6a5ab -14550290 -00000000 -1476028e -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02feb6 -3442f680 -0bf10656 -00000000 -10000009 -00000000 -00000000 -0bf1064a -00000000 -10000004 -00000000 -00000000 -3c038799 -34637a49 -3c15feb6 -36b5f680 -3c168799 -36d67a49 -14550276 -00000000 -14760274 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02d062 -3442c193 -0bf10670 -00000000 -10000009 -00000000 -00000000 -0bf10664 -00000000 -10000004 -00000000 -00000000 -3c03c5a1 -3463ccf0 -3c15d062 -36b5c193 -3c16c5a1 -36d6ccf0 -1455025c -00000000 -1476025a -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c021648 -34426a7c -0bf1068a -00000000 -10000009 -00000000 -00000000 -0bf1067e -00000000 -10000004 -00000000 -00000000 -3c03512e -34637094 -3c151648 -36b56a7c -3c16512e -36d67094 -14550242 -00000000 -14760240 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c023dca -3442db74 -0bf106a4 -00000000 -10000009 -00000000 -00000000 -0bf10698 -00000000 -10000004 -00000000 -00000000 -3c031893 -34632800 -3c153dca -36b5db74 -3c161893 -36d62800 -14550228 -00000000 -14760226 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c021d42 -3442afc0 -0bf106be -00000000 -10000009 -00000000 -00000000 -0bf106b2 -00000000 -10000004 -00000000 -00000000 -3c03fd7e -34630f80 -3c151d42 -36b5afc0 -3c16fd7e -36d60f80 -1455020e -00000000 -1476020c -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c023f87 -3442c62c -0bf106d8 -00000000 -10000009 -00000000 -00000000 -0bf106cc -00000000 -10000004 -00000000 -00000000 -3c03317d -3463beb0 -3c153f87 -36b5c62c -3c16317d -36d6beb0 -145501f4 -00000000 -147601f2 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c025774 -34422340 -0bf106f2 -00000000 -10000009 -00000000 -00000000 -0bf106e6 -00000000 -10000004 -00000000 -00000000 -3c03ff7f -346331e8 -3c155774 -36b52340 -3c16ff7f -36d631e8 -145501da -00000000 -147601d8 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c025347 -34420066 -0bf1070c -00000000 -10000009 -00000000 -00000000 -0bf10700 -00000000 -10000004 -00000000 -00000000 -3c038918 -3463c70c -3c155347 -36b50066 -3c168918 -36d6c70c -145501c0 -00000000 -147601be -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c022b88 -3442e2d8 -0bf10726 -00000000 -10000009 -00000000 -00000000 -0bf1071a -00000000 -10000004 -00000000 -00000000 -3c031956 -3463758a -3c152b88 -36b5e2d8 -3c161956 -36d6758a -145501a6 -00000000 -147601a4 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c022615 -34425744 -0bf10740 -00000000 -10000009 -00000000 -00000000 -0bf10734 -00000000 -10000004 -00000000 -00000000 -3c034641 -3463aed8 -3c152615 -36b55744 -3c164641 -36d6aed8 -1455018c -00000000 -1476018a -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02a426 -344220c5 -0bf1075a -00000000 -10000009 -00000000 -00000000 -0bf1074e -00000000 -10000004 -00000000 -00000000 -3c038d9c -3463cc00 -3c15a426 -36b520c5 -3c168d9c -36d6cc00 -14550172 -00000000 -14760170 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0256ad -344276b4 -0bf10774 -00000000 -10000009 -00000000 -00000000 -0bf10768 -00000000 -10000004 -00000000 -00000000 -3c0341db -3463bf00 -3c1556ad -36b576b4 -3c1641db -36d6bf00 -14550158 -00000000 -14760156 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02d772 -344256b8 -0bf1078e -00000000 -10000009 -00000000 -00000000 -0bf10782 -00000000 -10000004 -00000000 -00000000 -3c0375df -3463f4ee -3c15d772 -36b556b8 -3c1675df -36d6f4ee -1455013e -00000000 -1476013c -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02e85f -3442be40 -0bf107a8 -00000000 -10000009 -00000000 -00000000 -0bf1079c -00000000 -10000004 -00000000 -00000000 -3c03d008 -34639c1c -3c15e85f -36b5be40 -3c16d008 -36d69c1c -14550124 -00000000 -14760122 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c025cc6 -34423d8f -0bf107c2 -00000000 -10000009 -00000000 -00000000 -0bf107b6 -00000000 -10000004 -00000000 -00000000 -3c0359dd -3463ec46 -3c155cc6 -36b53d8f -3c1659dd -36d6ec46 -1455010a -00000000 -14760108 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c024247 -34429810 -0bf107dc -00000000 -10000009 -00000000 -00000000 -0bf107d0 -00000000 -10000004 -00000000 -00000000 -3c03335c -34631280 -3c154247 -36b59810 -3c16335c -36d61280 -145500f0 -00000000 -147600ee -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02d819 -344249c0 -0bf107f6 -00000000 -10000009 -00000000 -00000000 -0bf107ea -00000000 -10000004 -00000000 -00000000 -3c03e6b6 -3463c9a0 -3c15d819 -36b549c0 -3c16e6b6 -36d6c9a0 -145500d6 -00000000 -147600d4 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02c49c -344214c8 -0bf10810 -00000000 -10000009 -00000000 -00000000 -0bf10804 -00000000 -10000004 -00000000 -00000000 -3c03b602 -346350e0 -3c15c49c -36b514c8 -3c16b602 -36d650e0 -145500bc -00000000 -147600ba -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c0202b2 -344295e0 -0bf1082a -00000000 -10000009 -00000000 -00000000 -0bf1081e -00000000 -10000004 -00000000 -00000000 -3c034424 -346330f0 -3c1502b2 -36b595e0 -3c164424 -36d630f0 -145500a2 -00000000 -147600a0 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c023ee9 -3442f35c -0bf10844 -00000000 -10000009 -00000000 -00000000 -0bf10838 -00000000 -10000004 -00000000 -00000000 -3c032ac4 -3463d9cc -3c153ee9 -36b5f35c -3c162ac4 -36d6d9cc -14550088 -00000000 -14760086 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02a53d -34425f40 -0bf1085e -00000000 -10000009 -00000000 -00000000 -0bf10852 -00000000 -10000004 -00000000 -00000000 -3c035e99 -34637488 -3c15a53d -36b55f40 -3c165e99 -36d67488 -1455006e -00000000 -1476006c -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02442a -3442b5dd -0bf10878 -00000000 -10000009 -00000000 -00000000 -0bf1086c -00000000 -10000004 -00000000 -00000000 -3c03c36f -3463026b -3c15442a -36b5b5dd -3c16c36f -36d6026b -14550054 -00000000 -14760052 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c023322 -3442fda8 -0bf10892 -00000000 -10000009 -00000000 -00000000 -0bf10886 -00000000 -10000004 -00000000 -00000000 -3c039400 -3463f0a0 -3c153322 -36b5fda8 -3c169400 -36d6f0a0 -1455003a -00000000 -14760038 -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c02d0e2 -34425fc8 -0bf108ac -00000000 -10000009 -00000000 -00000000 -0bf108a0 -00000000 -10000004 -00000000 -00000000 -3c0334a6 -3463c1ec -3c15d0e2 -36b55fc8 -3c1634a6 -36d6c1ec -14550020 -00000000 -1476001e -00000000 -3c020000 -3c030000 -10000008 -00000000 -3c027b07 -3442c5ea -0bf108c6 -00000000 -10000009 -00000000 -00000000 -0bf108ba -00000000 -10000004 -00000000 -00000000 -3c0322f0 -3463cf9c -3c157b07 -36b5c5ea -3c1622f0 -36d6cf9c -14550006 -00000000 -14760004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -24120000 -3c087e00 -350883f0 -3c03003f -34630041 -00081243 -1443075a -00000000 -3c0813e6 -350880c0 -24030013 -00081603 -14430754 -00000000 -3c086d73 -350888ec -24036d73 -00081403 -1443074e -00000000 -3c08c04e -3508fccc -2403c04e -00081403 -14430748 -00000000 -3c08d6c6 -35087200 -2403fd6c -00081503 -14430742 -00000000 -3c08366e -3508a0fe -24030000 -00081783 -1443073c -00000000 -3c084a34 -350837c0 -3c030094 -3463686f -000811c3 -14430735 -00000000 -3c08355d -350825a0 -240306ab -000814c3 -1443072f -00000000 -3c0839ad -3508f6d1 -3c030039 -3463adf6 -00081203 -14430728 -00000000 -3c08c094 -35089780 -2403f812 -000814c3 -14430722 -00000000 -3c08f09e -3508a1a0 -2403ffff -00081743 -1443071c -00000000 -3c08fa6d -35082b80 -2403ffff -000816c3 -14430716 -00000000 -3c0815bf -3508aa14 -24030000 -00081743 -14430710 -00000000 -3c08f832 -350842c0 -2403ffff -00081703 -1443070a -00000000 -3c082eb7 -3508de00 -24030000 -000817c3 -14430704 -00000000 -3c082009 -350832e0 -3c030001 -34630049 -00081343 -144306fd -00000000 -3c086b5f -3508efd3 -3c030035 -3463aff7 -00081243 -144306f6 -00000000 -3c088c58 -35083f58 -3c03fff8 -3463c583 -00081303 -144306ef -00000000 -3c08f7bf -35086ad0 -2403ffff -00081743 -144306e9 -00000000 -3c083fca -35081f9e -3c030ff2 -346387e7 -00081083 -144306e2 -00000000 -3c086734 -3508f624 -24036734 -00081403 -144306dc -00000000 -3c08c948 -3508d0f5 -2403c948 -00081403 -144306d6 -00000000 -3c08281c -35088725 -2403140e -00081443 -144306d0 -00000000 -3c08c99f -3508ac26 -2403ff93 -000815c3 -144306ca -00000000 -3c083a4b -35083d1e -3c033a4b -34633d1e -00081003 -144306c3 -00000000 -3c0884da -35086ec0 -3c03f84d -3463a6ec -00081103 -144306bc -00000000 -3c0824c0 -35084ab8 -24030093 -00081583 -144306b6 -00000000 -3c0806e7 -35085c47 -240300dc -000814c3 -144306b0 -00000000 -3c089815 -3508a4b4 -2403e605 -00081483 -144306aa -00000000 -3c08d5fa -35081c22 -2403abf4 -000813c3 -144306a4 -00000000 -3c081f8b -35082568 -240303f1 -000814c3 -1443069e -00000000 -3c08ee56 -35083feb -3c03fff7 -34632b1f -00081243 -14430697 -00000000 -3c08c801 -3508a880 -3c03ff20 -346306a2 -00081183 -14430690 -00000000 -3c081c3c -35083198 -3c030003 -34638786 -000812c3 -14430689 -00000000 -3c08e278 -3508af58 -3c03fffe -3463278a -00081303 -14430682 -00000000 -3c082e3d -3508827c -2403000b -00081683 -1443067c -00000000 -3c087209 -3508a862 -3c030720 -34639a86 -00081103 -14430675 -00000000 -3c0810c3 -35086533 -3c0310c3 -34636533 -00081003 -1443066e -00000000 -3c08c9cb -3508745e -2403ffff -000817c3 -14430668 -00000000 -3c0822c6 -35084374 -3c030011 -34636321 -00081243 -14430661 -00000000 -3c08d051 -3508e8fc -2403ffe8 -00081643 -1443065b -00000000 -3c080382 -3508ebe0 -24030000 -00081783 -14430655 -00000000 -3c08390b -35085258 -3c030e42 -3463d496 -00081083 -1443064e -00000000 -3c087330 -350864c0 -3c037330 -346364c0 -00081003 -14430647 -00000000 -3c080674 -35084d47 -24030006 -00081603 -14430641 -00000000 -3c085b1a -35086a5c -24030005 -00081703 -1443063b -00000000 -3c08e5d1 -3508ea6a -2403f2e8 -00081443 -14430635 -00000000 -3c086539 -3508dbe2 -24030194 -00081583 -1443062f -00000000 -3c08ef69 -35083934 -2403ffff -00081743 -14430629 -00000000 -3c080fbe -3508e4fa -24030fbe -00081403 -14430623 -00000000 -3c08a930 -3508dc54 -3c03fffa -3463930d -00081303 -1443061c -00000000 -3c0880a7 -35083726 -2403fff8 -00081703 -14430616 -00000000 -3c08c5af -3508631a -3c03ffe2 -3463d7b1 -00081243 -1443060f -00000000 -3c08fce7 -3508e4a0 -2403f39f -00081383 -14430609 -00000000 -3c085a56 -3508e180 -24030016 -00081683 -14430603 -00000000 -3c082547 -35084b80 -24030025 -00081603 -144305fd -00000000 -3c086ace -3508e13c -240300d5 -000815c3 -144305f7 -00000000 -3c08ca24 -3508dec8 -2403f944 -000814c3 -144305f1 -00000000 -3c081441 -3508f330 -24030000 -000817c3 -144305eb -00000000 -3c083d2d -350805c0 -2403007a -000815c3 -144305e5 -00000000 -3c087863 -3508a294 -3c0303c3 -34631d14 -00081143 -144305de -00000000 -3c080531 -3508fa20 -24030001 -00081683 -144305d8 -00000000 -3c08d49f -3508fd00 -3c03ffff -3463527f -00081383 -144305d1 -00000000 -3c08dab9 -3508a7a0 -2403fffb -000816c3 -144305cb -00000000 -3c088939 -3508e0cc -3c03ffc4 -34639cf0 -00081243 -144305c4 -00000000 -3c0823ab -3508857e -24030002 -00081703 -144305be -00000000 -3c08c5ab -35084f94 -3c03c5ab -34634f94 -00081003 -144305b7 -00000000 -3c086d01 -35080c88 -3c036d01 -34630c88 -00081003 -144305b0 -00000000 -3c08d068 -3508f062 -2403a0d1 -000813c3 -144305aa -00000000 -3c08effb -3508be00 -3c03fffd -3463ff77 -000812c3 -144305a3 -00000000 -3c082c8e -350876d0 -24030591 -000814c3 -1443059d -00000000 -3c08dfb2 -35082182 -2403fffe -00081743 -14430597 -00000000 -3c0897cd -3508c52e -3c03ffcb -3463e6e2 -00081243 -14430590 -00000000 -3c081f58 -35086fc0 -240307d6 -00081483 -1443058a -00000000 -3c08fd66 -3508c7c8 -2403acd8 -000812c3 -14430584 -00000000 -3c084224 -350826f6 -3c030002 -34631121 -00081343 -1443057d -00000000 -3c081429 -35082ac0 -24030285 -000814c3 -14430577 -00000000 -3c0863c2 -3508ffce -24030000 -000817c3 -14430571 -00000000 -3c08ffe1 -3508ebb8 -3c03fffc -34633d77 -000810c3 -1443056a -00000000 -3c08036b -35084a60 -24030000 -00081783 -14430564 -00000000 -3c08b33d -35084790 -3c03d99e -3463a3c8 -00081043 -1443055d -00000000 -3c0871b0 -35081020 -3c0371b0 -34631020 -00081003 -14430556 -00000000 -3c08b413 -3508127c -3c03ff68 -34632624 -000811c3 -1443054f -00000000 -3c083faf -35084b6c -3c033faf -34634b6c -00081003 -14430548 -00000000 -3c08ebcc -350828c0 -2403af30 -00081383 -14430542 -00000000 -3c089381 -35081ad8 -2403fffe -00081783 -1443053c -00000000 -3c0887f9 -35089a85 -2403fe1f -00081583 -14430536 -00000000 -3c080fca -3508cc20 -24030000 -00081703 -14430530 -00000000 -3c0815eb -3508957c -2403057a -00081483 -1443052a -00000000 -3c082c08 -3508d9d4 -24031604 -00081443 -14430524 -00000000 -3c08c0f9 -35089191 -2403f03e -00081483 -1443051e -00000000 -3c08b873 -350834be -2403ffee -00081683 -14430518 -00000000 -3c0804fd -3508bd49 -2403009f -000814c3 -14430512 -00000000 -3c08fd73 -35085780 -2403fffe -00081643 -1443050c -00000000 -3c088578 -350856b0 -2403e15e -00081483 -14430506 -00000000 -3c089da2 -3508db20 -2403ff9d -00081603 -14430500 -00000000 -3c0802e6 -3508d93d -3c030002 -3463e6d9 -00081203 -144304f9 -00000000 -3c080f53 -3508e81e -3c0300f5 -34633e81 -00081103 -144304f2 -00000000 -3c0801a5 -35089436 -3c03000d -34632ca1 -00081143 -144304eb -00000000 -3c085408 -35081744 -3c030054 -34630817 -00081203 -144304e4 -00000000 -3c082964 -35080370 -24030000 -00081783 -144304de -00000000 -3c084e27 -35080890 -240309c4 -000814c3 -144304d8 -00000000 -3c084ead -35084240 -24030000 -000817c3 -144304d2 -00000000 -3c08dca9 -35081de8 -2403fb95 -000814c3 -144304cc -00000000 -3c087c09 -3508aac0 -3c0301f0 -346326ab -00081183 -144304c5 -00000000 -3c084890 -35080c05 -24030489 -00081503 -144304bf -00000000 -3c082cbe -3508bf40 -24030597 -000814c3 -144304b9 -00000000 -3c08f42d -3508a13f -2403ffff -00081783 -144304b3 -00000000 -3c08d99c -35084f6f -2403ffd9 -00081603 -144304ad -00000000 -3c080afa -3508ed86 -2403002b -00081583 -144304a7 -00000000 -3c08091c -35083d00 -340391c3 -00081303 -144304a1 -00000000 -3c0866d8 -3508faa6 -240366d8 -00081403 -1443049b -00000000 -3c0831f3 -35081054 -3c030001 -34638f98 -00081343 -14430494 -00000000 -3c0813a3 -35080cee -2403009d -00081543 -1443048e -00000000 -3c08eede -3508b7f0 -3c03fffe -3463edeb -00081303 -14430487 -00000000 -3c08d51e -35088860 -2403ffff -00081783 -14430481 -00000000 -3c08e8e3 -35080aa8 -3c03ffd1 -3463c615 -000811c3 -1443047a -00000000 -3c08c36c -3508ae78 -2403ff0d -00081583 -14430474 -00000000 -3c08a866 -35087186 -2403f50c -000814c3 -1443046e -00000000 -3c087c24 -3508aab0 -3c0307c2 -34634aab -00081103 -14430467 -00000000 -3c08eaa7 -3508dfa3 -2403fd54 -000814c3 -14430461 -00000000 -3c088c97 -3508c385 -3c03e325 -3463f0e1 -00081083 -1443045a -00000000 -3c08744e -3508be18 -24030007 -00081703 -14430454 -00000000 -3c08bc9f -35082d58 -2403ffbc -00081603 -1443044e -00000000 -3c087d25 -3508b068 -3c03003e -346392d8 -00081243 -14430447 -00000000 -3c08aa4a -35081e58 -2403fffd -00081743 -14430441 -00000000 -3c082c99 -35082d2c -3c0302c9 -346392d2 -00081103 -1443043a -00000000 -3c083093 -3508c6fc -3c03000c -346324f1 -00081283 -14430433 -00000000 -3c088020 -3508a899 -3c03fc01 -34630544 -00081143 -1443042c -00000000 -3c084e84 -3508e3f8 -24030027 -00081643 -14430426 -00000000 -3c084137 -3508c9dc -24030104 -00081583 -14430420 -00000000 -3c089671 -3508cf7d -2403ffcb -00081643 -1443041a -00000000 -3c08df2c -3508ed02 -3c03ff7c -3463b3b4 -00081183 -14430413 -00000000 -3c0814bc -3508f49a -3c030297 -34639e93 -000810c3 -1443040c -00000000 -3c08fd22 -35081ecb -3c03ffd2 -346321ec -00081103 -14430405 -00000000 -3c08a3e4 -35085cfc -3c03d1f2 -34632e7e -00081043 -144303fe -00000000 -3c088e0f -35081880 -2403fe38 -00081583 -144303f8 -00000000 -3c08587d -350838e8 -24030587 -00081503 -144303f2 -00000000 -3c08d7b1 -3508ed92 -3c03fd7b -34631ed9 -00081103 -144303eb -00000000 -3c08ab4b -35085c70 -2403ffff -000817c3 -144303e5 -00000000 -3c0804d6 -3508db90 -3c030135 -3463b6e4 -00081083 -144303de -00000000 -3c086833 -350861dc -24036833 -00081403 -144303d8 -00000000 -3c088c65 -3508a380 -3c03c632 -3463d1c0 -00081043 -144303d1 -00000000 -3c084e8d -3508bfa8 -240313a3 -00081483 -144303cb -00000000 -3c085509 -35080962 -3c030aa1 -3463212c -000810c3 -144303c4 -00000000 -3c089bf8 -3508d806 -2403f9bf -00081503 -144303be -00000000 -3c08d93c -35085146 -2403ffd9 -00081603 -144303b8 -00000000 -3c08468d -35081289 -3c03468d -34631289 -00081003 -144303b1 -00000000 -3c08b999 -35085520 -3c03ee66 -34635548 -00081083 -144303aa -00000000 -3c082437 -3508c860 -24030002 -00081703 -144303a4 -00000000 -3c089413 -3508ab40 -2403e504 -00081483 -1443039e -00000000 -3c083790 -350839b2 -3c0306f2 -34630736 -000810c3 -14430397 -00000000 -3c08eac3 -35084a48 -3c03fab0 -3463d292 -00081083 -14430390 -00000000 -3c08c7c4 -350848cb -2403f8f8 -000814c3 -1443038a -00000000 -3c087eaa -35083b78 -240307ea -00081503 -14430384 -00000000 -3c0872e2 -35081540 -240300e5 -000815c3 -1443037e -00000000 -3c08d10c -350810e8 -3c03ffff -34634430 -00081383 -14430377 -00000000 -3c081040 -3508d67e -34038206 -00081343 -14430371 -00000000 -3c089b41 -35082802 -2403fe6d -00081583 -1443036b -00000000 -3c08c927 -35082049 -3c03fe49 -34633902 -00081143 -14430364 -00000000 -3c0838af -350837fe -24030001 -00081743 -1443035e -00000000 -3c0877ed -3508f5c0 -3c0377ed -3463f5c0 -00081003 -14430357 -00000000 -3c08fe0d -3508bb31 -2403ffff -00081703 -14430351 -00000000 -3c089416 -35086944 -3c03e505 -34639a51 -00081083 -1443034a -00000000 -3c084950 -35088bfc -24030495 -00081503 -14430344 -00000000 -3c08f42d -35086ea6 -2403a16b -00081343 -1443033e -00000000 -3c081510 -3508d958 -3c030001 -3463510d -00081303 -14430337 -00000000 -3c087375 -3508c5e2 -240301cd -00081583 -14430331 -00000000 -3c08301c -35089560 -24030603 -000814c3 -1443032b -00000000 -3c08c014 -35081235 -2403ff00 -00081583 -14430325 -00000000 -3c0872b9 -35084fa0 -3c0300e5 -3463729f -000811c3 -1443031e -00000000 -3c08948c -3508b9d0 -3c03948c -3463b9d0 -00081003 -14430317 -00000000 -3c082f11 -3508074b -3c03000b -3463c441 -00081283 -14430310 -00000000 -3c08f5df -35083680 -3c03ff5d -3463f368 -00081103 -14430309 -00000000 -3c0822b8 -350811c0 -34038ae0 -00081383 -14430303 -00000000 -3c085147 -35083348 -3c030514 -34637334 -00081103 -144302fc -00000000 -3c08d4e9 -35085968 -2403fffa -000816c3 -144302f6 -00000000 -3c08873e -35087a20 -3c03fff8 -346373e7 -00081303 -144302ef -00000000 -3c08ea39 -35089857 -2403fffd -000816c3 -144302e9 -00000000 -3c08d9a4 -35085830 -3c03fffe -3463cd22 -00081343 -144302e2 -00000000 -3c085888 -35082860 -3c030001 -34636220 -00081383 -144302db -00000000 -3c08b528 -350828fc -3c03b528 -346328fc -00081003 -144302d4 -00000000 -3c0834a1 -3508f968 -3c030006 -3463943f -000812c3 -144302cd -00000000 -3c0863c5 -35086270 -3c030063 -3463c562 -00081203 -144302c6 -00000000 -3c08d2f1 -3508c210 -2403fe97 -00081543 -144302c0 -00000000 -3c0811cc -3508723e -24030023 -000815c3 -144302ba -00000000 -3c088b41 -3508e080 -24038b41 -00081403 -144302b4 -00000000 -3c08ebcc -35084aac -2403f5e6 -00081443 -144302ae -00000000 -3c08bb1a -350819e4 -2403fbb1 -00081503 -144302a8 -00000000 -3c089844 -350861f4 -2403ff30 -000815c3 -144302a2 -00000000 -3c087357 -35088e4a -3c030001 -3463cd5e -00081383 -1443029b -00000000 -3c084cf5 -3508e100 -24030267 -00081543 -14430295 -00000000 -3c086174 -3508641c -3403c2e8 -000813c3 -1443028f -00000000 -3c0848fc -35083f43 -24030000 -000817c3 -14430289 -00000000 -3c0833d9 -3508efd5 -3c0300cf -346367bf -00081183 -14430282 -00000000 -3c08a5e5 -350817b0 -3c03ffa5 -3463e517 -00081203 -1443027b -00000000 -3c08f685 -3508afc2 -3c03f685 -3463afc2 -00081003 -14430274 -00000000 -3c086bee -35082237 -24036bee -00081403 -1443026e -00000000 -3c0888b3 -3508bac8 -3c03c459 -3463dd64 -00081043 -14430267 -00000000 -3c08b3bf -35087ef8 -2403fffb -00081703 -14430261 -00000000 -3c087f79 -35087f19 -3c037f79 -34637f19 -00081003 -1443025a -00000000 -3c088f7b -3508a555 -3c038f7b -3463a555 -00081003 -14430253 -00000000 -3c080dcd -35088d14 -3c030dcd -34638d14 -00081003 -1443024c -00000000 -3c083509 -350845f2 -3c033509 -346345f2 -00081003 -14430245 -00000000 -3c0877a2 -3508fba0 -3c0377a2 -3463fba0 -00081003 -1443023e -00000000 -3c08beea -3508c5b0 -3c03beea -3463c5b0 -00081003 -14430237 -00000000 -3c088915 -35087300 -3c038915 -34637300 -00081003 -14430230 -00000000 -3c08ab98 -35080008 -3c03ab98 -34630008 -00081003 -14430229 -00000000 -3c08b096 -35088cc0 -3c03b096 -34638cc0 -00081003 -14430222 -00000000 -3c082ba7 -350883e0 -3c032ba7 -346383e0 -00081003 -1443021b -00000000 -3c089547 -35082840 -3c039547 -34632840 -00081003 -14430214 -00000000 -3c0854a4 -35082cc4 -3c0354a4 -34632cc4 -00081003 -1443020d -00000000 -3c08e1b0 -3508264c -3c03e1b0 -3463264c -00081003 -14430206 -00000000 -3c08efa5 -35082996 -3c03efa5 -34632996 -00081003 -144301ff -00000000 -3c081405 -35082d21 -3c031405 -34632d21 -00081003 -144301f8 -00000000 -3c086258 -35089080 -3c036258 -34639080 -00081003 -144301f1 -00000000 -3c089079 -35086b7a -3c039079 -34636b7a -00081003 -144301ea -00000000 -3c083ef6 -3508da6a -3c033ef6 -3463da6a -00081003 -144301e3 -00000000 -3c08f341 -35080560 -3c03f341 -34630560 -00081003 -144301dc -00000000 -3c0803e7 -35084280 -3c0303e7 -34634280 -00081003 -144301d5 -00000000 -3c081aab -35085a5c -3c031aab -34635a5c -00081003 -144301ce -00000000 -3c08a6a1 -35080fe4 -3c03a6a1 -34630fe4 -00081003 -144301c7 -00000000 -3c08cac0 -3508c1b9 -3c03cac0 -3463c1b9 -00081003 -144301c0 -00000000 -3c082335 -35082364 -3c032335 -34632364 -00081003 -144301b9 -00000000 -3c088d88 -350829da -3c038d88 -346329da -00081003 -144301b2 -00000000 -3c08db2c -3508ad42 -3c03db2c -3463ad42 -00081003 -144301ab -00000000 -3c080701 -3508f144 -3c030701 -3463f144 -00081003 -144301a4 -00000000 -3c081805 -350825ad -3c031805 -346325ad -00081003 -1443019d -00000000 -3c08e3c4 -35084b80 -3c03e3c4 -34634b80 -00081003 -14430196 -00000000 -3c08724d -3508b8ee -3c03724d -3463b8ee -00081003 -1443018f -00000000 -3c08ba2e -35085d40 -3c03ba2e -34635d40 -00081003 -14430188 -00000000 -3c083da9 -3508eb4f -3c033da9 -3463eb4f -00081003 -14430181 -00000000 -3c08b764 -3508ab20 -3c03b764 -3463ab20 -00081003 -1443017a -00000000 -3c08ee4d -35088700 -3c03ee4d -34638700 -00081003 -14430173 -00000000 -3c080643 -35081180 -3c030643 -34631180 -00081003 -1443016c -00000000 -3c080edd -35087200 -3c030edd -34637200 -00081003 -14430165 -00000000 -3c088ecf -350853b8 -3c038ecf -346353b8 -00081003 -1443015e -00000000 -3c08b39f -35085d08 -3c03b39f -34635d08 -00081003 -14430157 -00000000 -3c084268 -35083c3c -3c034268 -34633c3c -00081003 -14430150 -00000000 -3c0828f4 -3508fc04 -3c0328f4 -3463fc04 -00081003 -14430149 -00000000 -3c080366 -350830dc -3c030366 -346330dc -00081003 -14430142 -00000000 -3c08d542 -3508e318 -3c03d542 -3463e318 -00081003 -1443013b -00000000 -3c085b85 -35086f12 -3c035b85 -34636f12 -00081003 -14430134 -00000000 -3c083bac -35087080 -3c033bac -34637080 -00081003 -1443012d -00000000 -3c08bf82 -35083f9e -3c03bf82 -34633f9e -00081003 -14430126 -00000000 -3c08a242 -3508b070 -3c03a242 -3463b070 -00081003 -1443011f -00000000 -3c08dbe2 -3508e930 -3c03dbe2 -3463e930 -00081003 -14430118 -00000000 -3c0812d3 -3508cfcc -3c0312d3 -3463cfcc -00081003 -14430111 -00000000 -3c080ea3 -3508ee6a -3c030ea3 -3463ee6a -00081003 -1443010a -00000000 -3c087666 -35088ec8 -3c037666 -34638ec8 -00081003 -14430103 -00000000 -24080000 -24030000 -000817c3 -144300fe -00000000 -24080000 -24030000 -00081143 -144300f9 -00000000 -24080000 -24030000 -00081143 -144300f4 -00000000 -24080000 -24030000 -000813c3 -144300ef -00000000 -24080000 -24030000 -000810c3 -144300ea -00000000 -24080000 -24030000 -00081783 -144300e5 -00000000 -24080000 -24030000 -00081483 -144300e0 -00000000 -24080000 -24030000 -00081603 -144300db -00000000 -24080000 -24030000 -000812c3 -144300d6 -00000000 -24080000 -24030000 -00081383 -144300d1 -00000000 -24080000 -24030000 -00081383 -144300cc -00000000 -24080000 -24030000 -000812c3 -144300c7 -00000000 -24080000 -24030000 -00081203 -144300c2 -00000000 -24080000 -24030000 -00081743 -144300bd -00000000 -24080000 -24030000 -000815c3 -144300b8 -00000000 -24080000 -24030000 -00081583 -144300b3 -00000000 -24080000 -24030000 -00081503 -144300ae -00000000 -24080000 -24030000 -00081303 -144300a9 -00000000 -24080000 -24030000 -00081383 -144300a4 -00000000 -24080000 -24030000 -00081383 -1443009f -00000000 -24080000 -24030000 -000810c3 -1443009a -00000000 -24080000 -24030000 -000811c3 -14430095 -00000000 -24080000 -24030000 -00081683 -14430090 -00000000 -24080000 -24030000 -000817c3 -1443008b -00000000 -24080000 -24030000 -000814c3 -14430086 -00000000 -24080000 -24030000 -00081583 -14430081 -00000000 -24080000 -24030000 -000813c3 -1443007c -00000000 -24080000 -24030000 -00081583 -14430077 -00000000 -24080000 -24030000 -000811c3 -14430072 -00000000 -24080000 -24030000 -00081683 -1443006d -00000000 -24080000 -24030000 -00081283 -14430068 -00000000 -24080000 -24030000 -00081783 -14430063 -00000000 -24080000 -24030000 -000817c3 -1443005e -00000000 -24080000 -24030000 -00081583 -14430059 -00000000 -24080000 -24030000 -00081143 -14430054 -00000000 -24080000 -24030000 -00081743 -1443004f -00000000 -24080000 -24030000 -00081043 -1443004a -00000000 -24080000 -24030000 -00081603 -14430045 -00000000 -24080000 -24030000 -00081183 -14430040 -00000000 -24080000 -24030000 -00081383 -1443003b -00000000 -24080000 -24030000 -00081783 -14430036 -00000000 -24080000 -24030000 -000815c3 -14430031 -00000000 -24080000 -24030000 -00081443 -1443002c -00000000 -24080000 -24030000 -00081083 -14430027 -00000000 -24080000 -24030000 -000813c3 -14430022 -00000000 -24080000 -24030000 -00081543 -1443001d -00000000 -24080000 -24030000 -00081683 -14430018 -00000000 -24080000 -24030000 -00081043 -14430013 -00000000 -24080000 -24030000 -00081243 -1443000e -00000000 -24080000 -24030000 -00081583 -14430009 -00000000 -24080000 -24030000 -00081003 -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -26100001 -24120000 -3c0ab4f0 -354a0930 -3c097955 -3529c40a -3c08800d -350816ec -3c03b4f0 -3463090a -ad0a61ec -a10961ec -25040004 -2505fffc -ac8461ec -aca561ec -8d0261ec -8ca461ec -8c8561ec -8ca661ec -14430a24 -00000000 -3c0a1943 -354a31ca -3c094765 -35297e06 -3c08800d -35085068 -3c031943 -34633106 -ad0a6868 -a1096868 -25040004 -2505fffc -ac846868 -aca56868 -8d026868 -8ca46868 -8c856868 -8ca66868 -14430a10 -00000000 -3c0a9efa -354afca8 -3c092547 -35294bf0 -3c08800d -35089f20 -3c039ef0 -3463fca8 -ad0a3660 -a1093662 -25040004 -2505fffc -ac843660 -aca53660 -8d023660 -8ca43660 -8c853660 -8ca63660 -144309fc -00000000 -3c0a9648 -354aec44 -3c092516 -35295c46 -3c08800d -350894a4 -3c039648 -3463ec46 -ad0a01fc -a10901fc -25040004 -2505fffc -ac8401fc -aca501fc -8d0201fc -8ca401fc -8c8501fc -8ca601fc -144309e8 -00000000 -3c0ac93c -354a8d07 -3c096070 -352947b4 -3c08800d -3508f8f0 -3c03b43c -34638d07 -ad0a00f8 -a10900fb -25040004 -2505fffc -ac8400f8 -aca500f8 -8d0200f8 -8ca400f8 -8c8500f8 -8ca600f8 -144309d4 -00000000 -3c0a2a18 -354abf86 -3c0933e9 -35294a7c -3c08800d -350854b4 -3c032a18 -3463bf7c -ad0a5210 -a1095210 -25040004 -2505fffc -ac845210 -aca55210 -8d025210 -8ca45210 -8c855210 -8ca65210 -144309c0 -00000000 -3c0a4283 -354abdfc -3c094852 -35294d98 -3c08800d -35084c20 -3c034298 -3463bdfc -ad0a5c54 -a1095c56 -25040004 -2505fffc -ac845c54 -aca55c54 -8d025c54 -8ca45c54 -8c855c54 -8ca65c54 -144309ac -00000000 -3c0af950 -354abe60 -3c09132a -35299383 -3c08800d -35085b10 -3c03f950 -3463be83 -ad0a2ca8 -a1092ca8 -25040004 -2505fffc -ac842ca8 -aca52ca8 -8d022ca8 -8ca42ca8 -8c852ca8 -8ca62ca8 -14430998 -00000000 -3c0a7123 -354a68e3 -3c09a6a8 -35298b20 -3c08800d -35089db0 -3c037123 -34636820 -ad0a3970 -a1093970 -25040004 -2505fffc -ac843970 -aca53970 -8d023970 -8ca43970 -8c853970 -8ca63970 -14430984 -00000000 -3c0ad1b0 -354aab60 -3c093384 -3529462f -3c08800d -3508a420 -3c03d1b0 -3463ab2f -ad0a1560 -a1091560 -25040004 -2505fffc -ac841560 -aca51560 -8d021560 -8ca41560 -8c851560 -8ca61560 -14430970 -00000000 -3c0a06d2 -354ab531 -3c09093c -35292180 -3c08800d -35086f20 -3c030680 -3463b531 -ad0a67dc -a10967de -25040004 -2505fffc -ac8467dc -aca567dc -8d0267dc -8ca467dc -8c8567dc -8ca667dc -1443095c -00000000 -3c0abc5e -354a8270 -3c09c97f -35294716 -3c08800d -35081c3c -3c03bc16 -34638270 -ad0a52e4 -a10952e6 -25040004 -2505fffc -ac8452e4 -aca552e4 -8d0252e4 -8ca452e4 -8c8552e4 -8ca652e4 -14430948 -00000000 -3c0a6754 -354a4f88 -3c094de1 -35296970 -3c08800d -35080770 -3c036754 -34637088 -ad0a4570 -a1094571 -25040004 -2505fffc -ac844570 -aca54570 -8d024570 -8ca44570 -8c854570 -8ca64570 -14430934 -00000000 -3c0a9a91 -354a63f0 -3c091204 -35293778 -3c08800d -35089718 -3c039a91 -346378f0 -ad0a0120 -a1090121 -25040004 -2505fffc -ac840120 -aca50120 -8d020120 -8ca40120 -8c850120 -8ca60120 -14430920 -00000000 -3c0ae9a7 -354a36d0 -3c090264 -35290360 -3c08800d -35081e24 -3c03e9a7 -34633660 -ad0a0f28 -a1090f28 -25040004 -2505fffc -ac840f28 -aca50f28 -8d020f28 -8ca40f28 -8c850f28 -8ca60f28 -1443090c -00000000 -3c0aebf1 -354ac120 -3c0923cf -3529ed10 -3c08800d -3508d340 -3c03ebf1 -3463c110 -ad0a1de4 -a1091de4 -25040004 -2505fffc -ac841de4 -aca51de4 -8d021de4 -8ca41de4 -8c851de4 -8ca61de4 -144308f8 -00000000 -3c0a5854 -354a9334 -3c091b55 -35297440 -3c08800d -350856f0 -3c035840 -34639334 -ad0a4308 -a109430a -25040004 -2505fffc -ac844308 -aca54308 -8d024308 -8ca44308 -8c854308 -8ca64308 -144308e4 -00000000 -3c0a0a1f -354a3a0d -3c099705 -3529c818 -3c08800d -3508869c -3c030a18 -34633a0d -ad0a197c -a109197e -25040004 -2505fffc -ac84197c -aca5197c -8d02197c -8ca4197c -8c85197c -8ca6197c -144308d0 -00000000 -3c0ac545 -354aeb10 -3c09e26f -3529d0dc -3c08800d -3508d4a0 -3c03c545 -3463ebdc -ad0a01f4 -a10901f4 -25040004 -2505fffc -ac8401f4 -aca501f4 -8d0201f4 -8ca401f4 -8c8501f4 -8ca601f4 -144308bc -00000000 -3c0a2495 -354aa82c -3c092b6d -35299dcc -3c08800d -35085654 -3c03cc95 -3463a82c -ad0a46ac -a10946af -25040004 -2505fffc -ac8446ac -aca546ac -8d0246ac -8ca446ac -8c8546ac -8ca646ac -144308a8 -00000000 -3c0ad155 -354a26cc -3c097285 -352925c0 -3c08800d -35082538 -3c03d155 -346326c0 -ad0a0d04 -a1090d04 -25040004 -2505fffc -ac840d04 -aca50d04 -8d020d04 -8ca40d04 -8c850d04 -8ca60d04 -14430894 -00000000 -3c0a4995 -354a521e -3c0909c0 -3529dd47 -3c08800d -35082400 -3c034995 -3463471e -3c010001 -00280821 -ac2abd3c -3c010001 -00280821 -a029bd3d -25040004 -2505fffc -3c010001 -00240821 -ac24bd3c -3c010001 -00250821 -ac25bd3c -3c020001 -00481021 -8c42bd3c -3c040001 -00852021 -8c84bd3c -3c050001 -00a42821 -8ca5bd3c -3c060001 -00c53021 -8cc6bd3c -14430870 -00000000 -3c0ae68f -354aa3cb -3c09b7dc -3529b7de -3c08800d -35085324 -3c03e68f -3463a3de -ad0a15a8 -a10915a8 -25040004 -2505fffc -ac8415a8 -aca515a8 -8d0215a8 -8ca415a8 -8c8515a8 -8ca615a8 -1443085c -00000000 -3c0aa1d5 -354a08e8 -3c09fd28 -352982a4 -3c08800d -3508bb68 -3c03a1d5 -346308a4 -ad0a3d18 -a1093d18 -25040004 -2505fffc -ac843d18 -aca53d18 -8d023d18 -8ca43d18 -8c853d18 -8ca63d18 -14430848 -00000000 -3c0a1951 -354a5bd9 -3c09d5fc -35298620 -3c08800d -35082b20 -3c032051 -34635bd9 -3c010001 -00280821 -ac2ab794 -3c010001 -00280821 -a029b797 -25040004 -2505fffc -3c010001 -00240821 -ac24b794 -3c010001 -00250821 -ac25b794 -3c020001 -00481021 -8c42b794 -3c040001 -00852021 -8c84b794 -3c050001 -00a42821 -8ca5b794 -3c060001 -00c53021 -8cc6b794 -14430824 -00000000 -3c0a431f -354a36bc -3c098de3 -3529033d -3c08800d -350883d4 -3c03431f -3463363d -ad0a4d0c -a1094d0c -25040004 -2505fffc -ac844d0c -aca54d0c -8d024d0c -8ca44d0c -8c854d0c -8ca64d0c -14430810 -00000000 -3c0a3232 -354a9da6 -3c093eb8 -3529314c -3c08800d -3508e3a8 -3c033232 -34634ca6 -ad0a0ae4 -a1090ae5 -25040004 -2505fffc -ac840ae4 -aca50ae4 -8d020ae4 -8ca40ae4 -8c850ae4 -8ca60ae4 -144307fc -00000000 -3c0ac12c -354ac3cc -3c09cb6e -3529a900 -3c08800d -35084550 -3c03c100 -3463c3cc -ad0a66a4 -a10966a6 -25040004 -2505fffc -ac8466a4 -aca566a4 -8d0266a4 -8ca466a4 -8c8566a4 -8ca666a4 -144307e8 -00000000 -3c0a4c48 -354aff70 -3c09e9ff -3529efab -3c08800d -350882b4 -3c034c48 -3463ffab -ad0a41f4 -a10941f4 -25040004 -2505fffc -ac8441f4 -aca541f4 -8d0241f4 -8ca441f4 -8c8541f4 -8ca641f4 -144307d4 -00000000 -3c0a9100 -354a6168 -3c090bcb -35297118 -3c08800d -35084fdc -3c039100 -34636118 -ad0a2f0c -a1092f0c -25040004 -2505fffc -ac842f0c -aca52f0c -8d022f0c -8ca42f0c -8c852f0c -8ca62f0c -144307c0 -00000000 -3c0a8fe7 -354a39a2 -3c097d4a -35296bb6 -3c08800d -3508635c -3c038fb6 -346339a2 -ad0a1b7c -a1091b7e -25040004 -2505fffc -ac841b7c -aca51b7c -8d021b7c -8ca41b7c -8c851b7c -8ca61b7c -144307ac -00000000 -3c0a4be1 -354a5cd4 -3c09ff48 -35291820 -3c08800d -3508d9e8 -3c034be1 -34635c20 -ad0a06e8 -a10906e8 -25040004 -2505fffc -ac8406e8 -aca506e8 -8d0206e8 -8ca406e8 -8c8506e8 -8ca606e8 -14430798 -00000000 -3c0aab84 -354aef36 -3c09229f -3529a36c -3c08800d -35080f70 -3c03ab84 -3463ef6c -ad0a4c50 -a1094c50 -25040004 -2505fffc -ac844c50 -aca54c50 -8d024c50 -8ca44c50 -8c854c50 -8ca64c50 -14430784 -00000000 -3c0a0ab4 -354a30f0 -3c099c60 -35295140 -3c08800d -35081bb4 -3c030ab4 -34633040 -3c010001 -00280821 -ac2abc54 -3c010001 -00280821 -a029bc54 -25040004 -2505fffc -3c010001 -00240821 -ac24bc54 -3c010001 -00250821 -ac25bc54 -3c020001 -00481021 -8c42bc54 -3c040001 -00852021 -8c84bc54 -3c050001 -00a42821 -8ca5bc54 -3c060001 -00c53021 -8cc6bc54 -14430760 -00000000 -3c0ac9df -354a3d10 -3c092943 -352937c4 -3c08800d -35083a28 -3c03c9c4 -34633d10 -3c010001 -00280821 -ac2aa530 -3c010001 -00280821 -a029a532 -25040004 -2505fffc -3c010001 -00240821 -ac24a530 -3c010001 -00250821 -ac25a530 -3c020001 -00481021 -8c42a530 -3c040001 -00852021 -8c84a530 -3c050001 -00a42821 -8ca5a530 -3c060001 -00c53021 -8cc6a530 -1443073c -00000000 -3c0a8e71 -354ab1bc -3c095471 -3529d562 -3c08800d -3508383c -3c038e62 -3463b1bc -ad0a2270 -a1092272 -25040004 -2505fffc -ac842270 -aca52270 -8d022270 -8ca42270 -8c852270 -8ca62270 -14430728 -00000000 -3c0a03aa -354ae560 -3c0919ea -35296d90 -3c08800d -3c0390aa -3463e560 -3c010001 -00280821 -ac2af7a8 -3c010001 -00280821 -a029f7ab -25040004 -2505fffc -3c010001 -00240821 -ac24f7a8 -3c010001 -00250821 -ac25f7a8 -3c020001 -00481021 -8c42f7a8 -3c040001 -00852021 -8c84f7a8 -3c050001 -00a42821 -8ca5f7a8 -3c060001 -00c53021 -8cc6f7a8 -14430705 -00000000 -3c0a4983 -354a7840 -3c092a0a -3529711c -3c08800d -3c034983 -3463781c -ad0a3a40 -a1093a40 -25040004 -2505fffc -ac843a40 -aca53a40 -8d023a40 -8ca43a40 -8c853a40 -8ca63a40 -144306f2 -00000000 -3c0a8508 -354a13af -3c096e98 -3529ee40 -3c08800d -3c038540 -346313af -ad0a2968 -a109296a -25040004 -2505fffc -ac842968 -aca52968 -8d022968 -8ca42968 -8c852968 -8ca62968 -144306df -00000000 -3c0a8b01 -354af0c8 -3c09490a -35290f90 -3c08800d -3c039001 -3463f0c8 -ad0a15a4 -a10915a7 -25040004 -2505fffc -ac8415a4 -aca515a4 -8d0215a4 -8ca415a4 -8c8515a4 -8ca615a4 -144306cc -00000000 -3c0a553f -354a5c64 -3c092012 -35299920 -3c08800d -3c03553f -34635c20 -ad0a730c -a109730c -25040004 -2505fffc -ac84730c -aca5730c -8d02730c -8ca4730c -8c85730c -8ca6730c -144306b9 -00000000 -3c0acf71 -354ab130 -3c099b0a -35294e5c -3c08800d -3c03cf5c -3463b130 -ad0a1b00 -a1091b02 -25040004 -2505fffc -ac841b00 -aca51b00 -8d021b00 -8ca41b00 -8c851b00 -8ca61b00 -144306a6 -00000000 -3c0adfc9 -354a8d18 -3c09f64d -3529eefc -3c08800d -3c03dfc9 -34638dfc -3c010001 -00280821 -ac2a9150 -3c010001 -00280821 -a0299150 -25040004 -2505fffc -3c010001 -00240821 -ac249150 -3c010001 -00250821 -ac259150 -3c020001 -00481021 -8c429150 -3c040001 -00852021 -8c849150 -3c050001 -00a42821 -8ca59150 -3c060001 -00c53021 -8cc69150 -14430683 -00000000 -3c0a5f92 -354aa4bd -3c0953ab -3529798c -3c08800d -3c035f8c -3463a4bd -3c010001 -00280821 -ac2abe78 -3c010001 -00280821 -a029be7a -25040004 -2505fffc -3c010001 -00240821 -ac24be78 -3c010001 -00250821 -ac25be78 -3c020001 -00481021 -8c42be78 -3c040001 -00852021 -8c84be78 -3c050001 -00a42821 -8ca5be78 -3c060001 -00c53021 -8cc6be78 -14430660 -00000000 -3c0a8bb6 -354aa77b -3c09f7b8 -35296140 -3c08800d -3c038b40 -3463a77b -ad0a1374 -a1091376 -25040004 -2505fffc -ac841374 -aca51374 -8d021374 -8ca41374 -8c851374 -8ca61374 -1443064d -00000000 -3c0ab10c -354a9e34 -3c09b3ce -35296a64 -3c08800d -3c03b10c -34639e64 -3c010001 -00280821 -ac2a9b60 -3c010001 -00280821 -a0299b60 -25040004 -2505fffc -3c010001 -00240821 -ac249b60 -3c010001 -00250821 -ac259b60 -3c020001 -00481021 -8c429b60 -3c040001 -00852021 -8c849b60 -3c050001 -00a42821 -8ca59b60 -3c060001 -00c53021 -8cc69b60 -1443062a -00000000 -3c0a6c79 -354addc8 -3c09d8f2 -3529d0f0 -3c08800d -3c036cf0 -3463ddc8 -3c010001 -00280821 -ac2ac340 -3c010001 -00280821 -a029c342 -25040004 -2505fffc -3c010001 -00240821 -ac24c340 -3c010001 -00250821 -ac25c340 -3c020001 -00481021 -8c42c340 -3c040001 -00852021 -8c84c340 -3c050001 -00a42821 -8ca5c340 -3c060001 -00c53021 -8cc6c340 -14430607 -00000000 -3c0a9ff6 -354a2c5a -3c09da5c -35299528 -3c08800d -3c039ff6 -34632c28 -3c010001 -00280821 -ac2ad92c -3c010001 -00280821 -a029d92c -25040004 -2505fffc -3c010001 -00240821 -ac24d92c -3c010001 -00250821 -ac25d92c -3c020001 -00481021 -8c42d92c -3c040001 -00852021 -8c84d92c -3c050001 -00a42821 -8ca5d92c -3c060001 -00c53021 -8cc6d92c -144305e4 -00000000 -3c0a8d23 -354aef7b -3c09e20e -3529e422 -3c08800d -3c038d22 -3463ef7b -ad0a3f1c -a1093f1e -25040004 -2505fffc -ac843f1c -aca53f1c -8d023f1c -8ca43f1c -8c853f1c -8ca63f1c -144305d1 -00000000 -3c0a021a -354a8000 -3c09ab92 -35292c0e -3c08800d -3c030e1a -34638000 -ad0a669c -a109669f -25040004 -2505fffc -ac84669c -aca5669c -8d02669c -8ca4669c -8c85669c -8ca6669c -144305be -00000000 -3c0a2b32 -354a3168 -3c09b481 -35290280 -3c08800d -3c032b80 -34633168 -3c010001 -00280821 -ac2a94b0 -3c010001 -00280821 -a02994b2 -25040004 -2505fffc -3c010001 -00240821 -ac2494b0 -3c010001 -00250821 -ac2594b0 -3c020001 -00481021 -8c4294b0 -3c040001 -00852021 -8c8494b0 -3c050001 -00a42821 -8ca594b0 -3c060001 -00c53021 -8cc694b0 -1443059b -00000000 -3c0afa0a -354a8cc8 -3c091ab8 -35293286 -3c08800d -3c03fa86 -34638cc8 -3c010001 -00280821 -ac2a9a0c -3c010001 -00280821 -a0299a0e -25040004 -2505fffc -3c010001 -00240821 -ac249a0c -3c010001 -00250821 -ac259a0c -3c020001 -00481021 -8c429a0c -3c040001 -00852021 -8c849a0c -3c050001 -00a42821 -8ca59a0c -3c060001 -00c53021 -8cc69a0c -14430578 -00000000 -3c0afba3 -354a5550 -3c095f6c -3529f2b0 -3c08800d -3c03fba3 -346355b0 -3c010001 -00280821 -ac2a8c40 -3c010001 -00280821 -a0298c40 -25040004 -2505fffc -3c010001 -00240821 -ac248c40 -3c010001 -00250821 -ac258c40 -3c020001 -00481021 -8c428c40 -3c040001 -00852021 -8c848c40 -3c050001 -00a42821 -8ca58c40 -3c060001 -00c53021 -8cc68c40 -14430555 -00000000 -3c0accdc -354a0930 -3c0920dc -3529cff4 -3c08800d -3c03ccdc -346309f4 -3c010001 -00280821 -ac2aaae8 -3c010001 -00280821 -a029aae8 -25040004 -2505fffc -3c010001 -00240821 -ac24aae8 -3c010001 -00250821 -ac25aae8 -3c020001 -00481021 -8c42aae8 -3c040001 -00852021 -8c84aae8 -3c050001 -00a42821 -8ca5aae8 -3c060001 -00c53021 -8cc6aae8 -14430532 -00000000 -3c0a50ef -354ae178 -3c0900f8 -3529ce7a -3c08800d -3c0350ef -3463e17a -ad0a1e5c -a1091e5c -25040004 -2505fffc -ac841e5c -aca51e5c -8d021e5c -8ca41e5c -8c851e5c -8ca61e5c -1443051f -00000000 -3c0ac894 -354a6b68 -3c091e1f -3529cf80 -3c08800d -3c03c894 -34636b80 -ad0a5cac -a1095cac -25040004 -2505fffc -ac845cac -aca55cac -8d025cac -8ca45cac -8c855cac -8ca65cac -1443050c -00000000 -3c0a9e0e -354afce6 -3c096b0a -3529b578 -3c08800d -3c039e0e -3463fc78 -ad0a5c18 -a1095c18 -25040004 -2505fffc -ac845c18 -aca55c18 -8d025c18 -8ca45c18 -8c855c18 -8ca65c18 -144304f9 -00000000 -3c0a55b3 -354a2c78 -3c094395 -35295964 -3c08800d -3c035564 -34632c78 -3c010001 -00280821 -ac2ae5d0 -3c010001 -00280821 -a029e5d2 -25040004 -2505fffc -3c010001 -00240821 -ac24e5d0 -3c010001 -00250821 -ac25e5d0 -3c020001 -00481021 -8c42e5d0 -3c040001 -00852021 -8c84e5d0 -3c050001 -00a42821 -8ca5e5d0 -3c060001 -00c53021 -8cc6e5d0 -144304d6 -00000000 -3c0af2e0 -354a2444 -3c09385c -35290602 -3c08800d -3c03f202 -34632444 -3c010001 -00280821 -ac2aa2e4 -3c010001 -00280821 -a029a2e6 -25040004 -2505fffc -3c010001 -00240821 -ac24a2e4 -3c010001 -00250821 -ac25a2e4 -3c020001 -00481021 -8c42a2e4 -3c040001 -00852021 -8c84a2e4 -3c050001 -00a42821 -8ca5a2e4 -3c060001 -00c53021 -8cc6a2e4 -144304b3 -00000000 -3c0aa34c -354af9ae -3c09befc -35299708 -3c08800d -3c03a308 -3463f9ae -ad0a1474 -a1091476 -25040004 -2505fffc -ac841474 -aca51474 -8d021474 -8ca41474 -8c851474 -8ca61474 -144304a0 -00000000 -3c0adea4 -354afad0 -3c097313 -3529e200 -3c08800d -3c03dea4 -3463fa00 -3c010001 -00280821 -ac2a9b0c -3c010001 -00280821 -a0299b0c -25040004 -2505fffc -3c010001 -00240821 -ac249b0c -3c010001 -00250821 -ac259b0c -3c020001 -00481021 -8c429b0c -3c040001 -00852021 -8c849b0c -3c050001 -00a42821 -8ca59b0c -3c060001 -00c53021 -8cc69b0c -1443047d -00000000 -3c0abcdf -354a3620 -3c099a6d -3529a064 -3c08800d -3c03bcdf -34633664 -3c010001 -00280821 -ac2a8a00 -3c010001 -00280821 -a0298a00 -25040004 -2505fffc -3c010001 -00240821 -ac248a00 -3c010001 -00250821 -ac258a00 -3c020001 -00481021 -8c428a00 -3c040001 -00852021 -8c848a00 -3c050001 -00a42821 -8ca58a00 -3c060001 -00c53021 -8cc68a00 -1443045a -00000000 -3c0aa3ed -354aa870 -3c0980f6 -3529ff70 -3c08800d -3c03a3ed -3463a870 -ad0a6410 -a1096410 -25040004 -2505fffc -ac846410 -aca56410 -8d026410 -8ca46410 -8c856410 -8ca66410 -14430447 -00000000 -3c0a2779 -354ad654 -3c09b41c -35297810 -3c08800d -3c032779 -3463d610 -3c010001 -00280821 -ac2ace98 -3c010001 -00280821 -a029ce98 -25040004 -2505fffc -3c010001 -00240821 -ac24ce98 -3c010001 -00250821 -ac25ce98 -3c020001 -00481021 -8c42ce98 -3c040001 -00852021 -8c84ce98 -3c050001 -00a42821 -8ca5ce98 -3c060001 -00c53021 -8cc6ce98 -14430424 -00000000 -3c0ade63 -354aec11 -3c09c22d -35298e54 -3c08800d -3c03de63 -34635411 -ad0a4788 -a1094789 -25040004 -2505fffc -ac844788 -aca54788 -8d024788 -8ca44788 -8c854788 -8ca64788 -14430411 -00000000 -3c0a98bf -354ac55c -3c0912d8 -3529a1d8 -3c08800d -3c0398d8 -3463c55c -ad0a5374 -a1095376 -25040004 -2505fffc -ac845374 -aca55374 -8d025374 -8ca45374 -8c855374 -8ca65374 -144303fe -00000000 -3c0a95b2 -354ab736 -3c0930a7 -3529f300 -3c08800d -3c0395b2 -3463b700 -ad0a1e7c -a1091e7c -25040004 -2505fffc -ac841e7c -aca51e7c -8d021e7c -8ca41e7c -8c851e7c -8ca61e7c -144303eb -00000000 -3c0a408e -354a7440 -3c09a0b5 -35293160 -3c08800d -3c03608e -34637440 -ad0a3a84 -a1093a87 -25040004 -2505fffc -ac843a84 -aca53a84 -8d023a84 -8ca43a84 -8c853a84 -8ca63a84 -144303d8 -00000000 -3c0a2d9b -354a8c36 -3c09077d -35296f24 -3c08800d -3c032d9b -34638c24 -3c010001 -00280821 -ac2afccc -3c010001 -00280821 -a029fccc -25040004 -2505fffc -3c010001 -00240821 -ac24fccc -3c010001 -00250821 -ac25fccc -3c020001 -00481021 -8c42fccc -3c040001 -00852021 -8c84fccc -3c050001 -00a42821 -8ca5fccc -3c060001 -00c53021 -8cc6fccc -144303b5 -00000000 -3c0ac31b -354ac4fa -3c098026 -35294e9e -3c08800d -3c039e1b -3463c4fa -3c010001 -00280821 -ac2ae9cc -3c010001 -00280821 -a029e9cf -25040004 -2505fffc -3c010001 -00240821 -ac24e9cc -3c010001 -00250821 -ac25e9cc -3c020001 -00481021 -8c42e9cc -3c040001 -00852021 -8c84e9cc -3c050001 -00a42821 -8ca5e9cc -3c060001 -00c53021 -8cc6e9cc -14430392 -00000000 -3c0a0ae2 -354ab41c -3c09f394 -35290600 -3c08800d -3c030a00 -3463b41c -3c010001 -00280821 -ac2ab6bc -3c010001 -00280821 -a029b6be -25040004 -2505fffc -3c010001 -00240821 -ac24b6bc -3c010001 -00250821 -ac25b6bc -3c020001 -00481021 -8c42b6bc -3c040001 -00852021 -8c84b6bc -3c050001 -00a42821 -8ca5b6bc -3c060001 -00c53021 -8cc6b6bc -1443036f -00000000 -3c0ad672 -354a125e -3c09f54f -35296e10 -3c08800d -3c03d610 -3463125e -ad0a33e4 -a10933e6 -25040004 -2505fffc -ac8433e4 -aca533e4 -8d0233e4 -8ca433e4 -8c8533e4 -8ca633e4 -1443035c -00000000 -3c0a16df -354a9976 -3c09b0be -35294800 -3c08800d -3c031600 -34639976 -3c010001 -00280821 -ac2afc04 -3c010001 -00280821 -a029fc06 -25040004 -2505fffc -3c010001 -00240821 -ac24fc04 -3c010001 -00250821 -ac25fc04 -3c020001 -00481021 -8c42fc04 -3c040001 -00852021 -8c84fc04 -3c050001 -00a42821 -8ca5fc04 -3c060001 -00c53021 -8cc6fc04 -14430339 -00000000 -3c0a9d36 -354a01ce -3c097964 -35295dd6 -3c08800d -3c039d36 -346301d6 -3c010001 -00280821 -ac2ab998 -3c010001 -00280821 -a029b998 -25040004 -2505fffc -3c010001 -00240821 -ac24b998 -3c010001 -00250821 -ac25b998 -3c020001 -00481021 -8c42b998 -3c040001 -00852021 -8c84b998 -3c050001 -00a42821 -8ca5b998 -3c060001 -00c53021 -8cc6b998 -14430316 -00000000 -3c0af085 -354a81f4 -3c092de5 -3529ab28 -3c08800d -3c03f085 -34638128 -ad0a15f4 -a10915f4 -25040004 -2505fffc -ac8415f4 -aca515f4 -8d0215f4 -8ca415f4 -8c8515f4 -8ca615f4 -14430303 -00000000 -3c0a52c8 -354a82b0 -3c090bbc -3529d41c -3c08800d -3c03521c -346382b0 -ad0a7eac -a1097eae -25040004 -2505fffc -ac847eac -aca57eac -8d027eac -8ca47eac -8c857eac -8ca67eac -144302f0 -00000000 -3c0a1817 -354a8fb0 -3c09b008 -3529d7c8 -3c08800d -3c031817 -34638fc8 -3c010001 -00280821 -ac2ac514 -3c010001 -00280821 -a029c514 -25040004 -2505fffc -3c010001 -00240821 -ac24c514 -3c010001 -00250821 -ac25c514 -3c020001 -00481021 -8c42c514 -3c040001 -00852021 -8c84c514 -3c050001 -00a42821 -8ca5c514 -3c060001 -00c53021 -8cc6c514 -144302cd -00000000 -3c0ac195 -354a8740 -3c0944c6 -35290618 -3c08800d -3c03c195 -34638718 -3c010001 -00280821 -ac2aae68 -3c010001 -00280821 -a029ae68 -25040004 -2505fffc -3c010001 -00240821 -ac24ae68 -3c010001 -00250821 -ac25ae68 -3c020001 -00481021 -8c42ae68 -3c040001 -00852021 -8c84ae68 -3c050001 -00a42821 -8ca5ae68 -3c060001 -00c53021 -8cc6ae68 -144302aa -00000000 -3c0a9ca3 -354ae13c -3c0953cc -3529f0e9 -3c08800d -3c039ca3 -3463e1e9 -3c010001 -00280821 -ac2ae150 -3c010001 -00280821 -a029e150 -25040004 -2505fffc -3c010001 -00240821 -ac24e150 -3c010001 -00250821 -ac25e150 -3c020001 -00481021 -8c42e150 -3c040001 -00852021 -8c84e150 -3c050001 -00a42821 -8ca5e150 -3c060001 -00c53021 -8cc6e150 -14430287 -00000000 -3c0a3a0d -354a9754 -3c09e204 -3529a4bd -3c08800d -3c033a0d -346397bd -ad0a5e50 -a1095e50 -25040004 -2505fffc -ac845e50 -aca55e50 -8d025e50 -8ca45e50 -8c855e50 -8ca65e50 -14430274 -00000000 -3c0ac17b -354aa750 -3c099d1b -3529a87b -3c08800d -3c037b7b -3463a750 -ad0a5c84 -a1095c87 -25040004 -2505fffc -ac845c84 -aca55c84 -8d025c84 -8ca45c84 -8c855c84 -8ca65c84 -14430261 -00000000 -3c0a3df6 -354ad256 -3c095e9b -35296298 -3c08800d -3c033df6 -34639856 -ad0a0000 -a1090001 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -1443024e -00000000 -3c0a5f50 -354ab378 -3c09d156 -35293c04 -3c08800d -3c035f04 -3463b378 -ad0a0000 -a1090002 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -1443023b -00000000 -3c0a036b -354ab8b0 -3c091093 -352956f8 -3c08800d -3c03036b -3463f8b0 -ad0a0000 -a1090001 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -14430228 -00000000 -3c0a8d12 -354a10b8 -3c09bd99 -352940a5 -3c08800d -3c038d12 -346310a5 -ad0a0000 -a1090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -14430215 -00000000 -3c0aae1f -354a4651 -3c09d53d -3529d416 -3c08800d -3c03ae1f -34631651 -ad0a0000 -a1090001 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -14430202 -00000000 -3c0a76f9 -354a942c -3c095eb1 -3529d1e8 -3c08800d -3c0376e8 -3463942c -ad0a0000 -a1090002 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -144301ef -00000000 -3c0afb19 -354a2df2 -3c094cdb -3529d878 -3c08800d -3c03fb19 -34632d78 -ad0a0000 -a1090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -144301dc -00000000 -3c0a7854 -354a532e -3c09895b -3529bb88 -3c08800d -3c037888 -3463532e -ad0a0000 -a1090002 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -144301c9 -00000000 -3c0ae918 -354aba4c -3c09d1c9 -35299748 -3c08800d -3c03e948 -3463ba4c -ad0a0000 -a1090002 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -144301b6 -00000000 -3c0a9cdf -354ab200 -3c0985af -35291f1e -3c08800d -3c039cdf -34631e00 -ad0a0000 -a1090001 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -144301a3 -00000000 -3c0a9a16 -354a3388 -3c097ba8 -3529c8a0 -3c08800d -3c03a016 -34633388 -ad0a0000 -a1090003 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -14430190 -00000000 -3c0a0676 -354ac233 -3c099daf -3529dbd4 -3c08800d -3c03d476 -3463c233 -ad0a0000 -a1090003 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -1443017d -00000000 -3c0ad52c -354a0b08 -3c0948d7 -35292a28 -3c08800d -3c03d52c -34630b28 -ad0a0000 -a1090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -1443016a -00000000 -3c0ac47f -354a87c8 -3c09b57c -3529c36c -3c08800d -3c03c47f -3463876c -ad0a0000 -a1090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -14430157 -00000000 -3c0a4416 -354adbe6 -3c09ea61 -352970e8 -3c08800d -3c034416 -3463dbe8 -ad0a0000 -a1090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -14430144 -00000000 -3c0aa6a8 -354a2196 -3c093fe8 -3529f8a2 -3c08800d -3c03a6a8 -346321a2 -ad0a0000 -a1090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -14430131 -00000000 -3c0a0971 -354af49e -3c09caed -3529fd56 -3c08800d -3c030956 -3463f49e -ad0a0000 -a1090002 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -1443011e -00000000 -3c0a06eb -354afb12 -3c09ee54 -3529a808 -3c08800d -3c0306eb -34630812 -ad0a0000 -a1090001 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -1443010b -00000000 -3c0acc67 -354a595e -3c09c374 -35296cb0 -3c08800d -3c03cc67 -346359b0 -ad0a0000 -a1090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -144300f8 -00000000 -3c0a3b4e -354a02ac -3c099486 -35292c00 -3c08800d -3c033b00 -346302ac -ad0a0000 -a1090002 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -144300e5 -00000000 -3c0ae21e -354a9e40 -3c0903ad -352975f4 -3c08800d -3c03e21e -34639ef4 -ad0a0000 -a1090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -144300d2 -00000000 -3c0a2a4f -354a1a28 -3c091a25 -35291802 -3c08800d -3c032a4f -34631a02 -ad0a0000 -a1090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -144300bf -00000000 -3c0a2de3 -354ab624 -3c09394a -35296480 -3c08800d -3c032d80 -3463b624 -ad0a0000 -a1090002 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -144300ac -00000000 -3c0a163a -354a9c0e -3c099829 -35295f3e -3c08800d -3c03163a -34639c3e -ad0a0000 -a1090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -14430099 -00000000 -3c0a4e95 -354ab5e6 -3c09ab39 -3529a0f1 -3c08800d -3c03f195 -3463b5e6 -ad0a0000 -a1090003 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -14430086 -00000000 -3c0a72a0 -354a13f3 -3c09920b -35296b7c -3c08800d -3c037ca0 -346313f3 -ad0a0000 -a1090003 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -14430073 -00000000 -3c0a5ff7 -354a8063 -3c09b3be -352948f8 -3c08800d -3c03f8f7 -34638063 -ad0a0000 -a1090003 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -14430060 -00000000 -3c0a857c -354a8744 -3c09bd04 -35296514 -3c08800d -3c03857c -34638714 -ad0a0000 -a1090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -1443004d -00000000 -3c0a387f -354adade -3c09542f -352967c0 -3c08800d -3c03387f -3463c0de -ad0a0000 -a1090001 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -1443003a -00000000 -3c0af96b -354a1db0 -3c09c78f -3529ac20 -3c08800d -3c03f96b -346320b0 -ad0a0000 -a1090001 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -14430027 -00000000 -3c0ada28 -354a716c -3c096e6d -352940e0 -3c08800d -3c03da28 -346371e0 -ad0a0000 -a1090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -14430014 -00000000 -240a0000 -24090000 -3c08800d -24030000 -ad0a0000 -a1090000 -25040004 -2505fffc -ac840000 -aca50000 -8d020000 -8ca40000 -8c850000 -8ca60000 -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -03e0b021 -26100001 -3c08800d -40805800 -3c170040 -40976000 -00000000 -24120001 -3c170001 -ad120000 -3c14bfc4 -26946a30 -0ff11b3c -0000000c -165700ad -00000000 -24120001 -3c14bfc4 -26946a4c -0ff11b3c -0000000c -165700a6 -00000000 -24120002 -3c170002 -ad120000 -3c14bfc4 -26946a70 -0ff11b3c -0000000d -1657009d -00000000 -24120002 -3c14bfc4 -26946a8c -0ff11b3c -0000000d -16570096 -00000000 -24120003 -3c170003 -ad120000 -3c14bfc4 -26946ac0 -3c04ba03 -34844f60 -3c05b615 -34a5fd67 -0ff11b3c -0085b820 -16570089 -00000000 -24120003 -3c14bfc4 -26946adc -0ff11b3c -0085b820 -ad170000 -16570081 -00000000 -24120003 -ad120000 -3c14bfc4 -26946b08 -3c047fff -3484c19e -0ff11b3c -20976512 -16570077 -00000000 -24120003 -3c14bfc4 -26946b24 -0ff11b3c -20976512 -16570070 -00000000 -24120003 -3c14bfc4 -26946b50 -3c04a85e -34847d00 -3c056b7e -34a58e36 -0ff11b3c -0085b822 -16570065 -00000000 -24120003 -3c14bfc4 -26946b6c -0ff11b3c -0085b822 -1657005e -00000000 -24120004 -3c170004 -ad120000 -3c14bfc4 -26946b90 -0ff11b3c -8d170002 -16570055 -00000000 -24120004 -3c14bfc4 -26946bac -0ff11b3c -8d170002 -1657004e -00000000 -24120004 -3c14bfc4 -26946bc8 -0ff11b3c -85170001 -02f2001b -16570046 -00000000 -24120004 -3c14bfc4 -26946be8 -0ff11b3c -85170001 -1657003f -00000000 -3c14bfc4 -26946c00 -0ff11b3c -95170003 -16570039 -00000000 -24120004 -3c14bfc4 -26946c1c -0ff11b3c -95170003 -16570032 -00000000 -24120005 -3c170005 -ad120000 -3c14bfc4 -26946c40 -0ff11b3c -ad170002 -16570029 -00000000 -24120005 -3c14bfc4 -26946c5c -0ff11b3c -ad170002 -16570022 -00000000 -24120005 -3c14bfc4 -26946c78 -0ff11b3c -a5170001 -1657001b -00000000 -24120005 -3c14bfc4 -26946c94 -0ff11b3c -a5170001 -16570014 -00000000 -24120007 -3c170007 -ad120000 -3c14bfc4 -26946cb8 -0ff11b3c -9e3c56aa -02f20018 -1657000a -00000000 -24120007 -3c14bfc4 -26946cdc -02f20018 -0ff11b3c -ec1ba960 -16570002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -02c0f821 -03e00008 -00000000 -00000000 -00000000 -26100001 -24120000 -3c081773 -3508df80 -3c09b5af -352951d2 -3c03a2dc -34638e52 -01091026 -14430a29 -00000000 -3c08e622 -35083550 -3c09909c -352998da -3c0376be -3463ad8a -01091026 -14430a20 -00000000 -3c08f5c8 -3508a598 -3c0925fd -35290240 -3c03d035 -3463a7d8 -01091026 -14430a17 -00000000 -3c0824b5 -35083f20 -3c0914d3 -3529aae8 -3c033066 -346395c8 -01091026 -14430a0e -00000000 -3c085945 -35081f38 -3c09e8aa -3529f42b -3c03b1ef -3463eb13 -01091026 -14430a05 -00000000 -3c08ca5b -350817a0 -3c09cec7 -35290d58 -3c03049c -34631af8 -01091026 -144309fc -00000000 -3c088b6a -35081e78 -3c09a89e -35295ed2 -3c0323f4 -346340aa -01091026 -144309f3 -00000000 -3c088a58 -35080190 -3c09ae39 -3529e660 -3c032461 -3463e7f0 -01091026 -144309ea -00000000 -3c08dd34 -350872f0 -3c09c148 -3529dd08 -3c031c7c -3463aff8 -01091026 -144309e1 -00000000 -3c085258 -350857e0 -3c0994d6 -35297860 -3c03c68e -34632f80 -01091026 -144309d8 -00000000 -3c08b61c -35082c40 -3c09c15a -35290baa -3c037746 -346327ea -01091026 -144309cf -00000000 -3c08034d -35081ee8 -3c092b92 -35297400 -3c0328df -34636ae8 -01091026 -144309c6 -00000000 -3c08c8cd -3508fb14 -3c09701d -3529d53e -3c03b8d0 -34632e2a -01091026 -144309bd -00000000 -3c084505 -35086499 -3c09da43 -352945b0 -3c039f46 -34632129 -01091026 -144309b4 -00000000 -3c080409 -35082050 -3c09503c -352959c8 -3c035435 -34637998 -01091026 -144309ab -00000000 -3c083d88 -3508d700 -3c09875d -3529c450 -3c03bad5 -34631350 -01091026 -144309a2 -00000000 -3c08bd81 -3508b180 -3c092460 -35298b97 -3c0399e1 -34633a17 -01091026 -14430999 -00000000 -3c08fa17 -3508e5c4 -3c09f1a1 -3529e280 -3c030bb6 -34630744 -01091026 -14430990 -00000000 -3c081f26 -35080170 -3c09e8d3 -35297370 -3c03f7f5 -34637200 -01091026 -14430987 -00000000 -3c08c3b5 -3508db06 -3c093283 -3529d4b8 -3c03f136 -34630fbe -01091026 -1443097e -00000000 -3c084d2e -35083cf5 -3c0930c8 -3529f34c -3c037de6 -3463cfb9 -01091026 -14430975 -00000000 -3c080150 -3508f52c -3c099200 -35296da0 -3c039350 -3463988c -01091026 -1443096c -00000000 -3c08a2f8 -3508049c -3c096450 -3529fe88 -3c03c6a8 -3463fa14 -01091026 -14430963 -00000000 -3c08ddce -35083250 -3c09e188 -35295c50 -3c033c46 -34636e00 -01091026 -1443095a -00000000 -3c080aae -350856ee -3c09293c -3529ef38 -3c032392 -3463b9d6 -01091026 -14430951 -00000000 -3c08d61f -3508d4fc -3c09dedf -352989c0 -3c0308c0 -34635d3c -01091026 -14430948 -00000000 -3c08bc5c -3508d3d4 -3c099689 -352937dc -3c032ad5 -3463e408 -01091026 -1443093f -00000000 -3c08209d -3508a902 -3c090d2e -35296670 -3c032db3 -3463cf72 -01091026 -14430936 -00000000 -3c08b035 -35085d94 -3c0980c3 -3529074e -3c0330f6 -34635ada -01091026 -1443092d -00000000 -3c0809d2 -35080400 -3c09a8d7 -35296bd4 -3c03a105 -34636fd4 -01091026 -14430924 -00000000 -3c084396 -35087908 -3c095426 -35291a60 -3c0317b0 -34636368 -01091026 -1443091b -00000000 -3c08e89f -35082de0 -3c09df13 -3529d0fe -3c03378c -3463fd1e -01091026 -14430912 -00000000 -3c087708 -35085d85 -3c09681d -3529a2d8 -3c031f15 -3463ff5d -01091026 -14430909 -00000000 -3c089db8 -3508e364 -3c09e63a -35291d6e -3c037b82 -3463fe0a -01091026 -14430900 -00000000 -3c08938c -350849b0 -3c09145c -35297ab4 -3c0387d0 -34633304 -01091026 -144308f7 -00000000 -3c08cd8d -3508a778 -3c09a25e -3529d184 -3c036fd3 -346376fc -01091026 -144308ee -00000000 -3c0837f7 -3508e234 -3c092c8d -3529d326 -3c031b7a -34633112 -01091026 -144308e5 -00000000 -3c089551 -35088bc8 -3c098128 -3529aec2 -3c031479 -3463250a -01091026 -144308dc -00000000 -3c0848de -3508e180 -3c091ab6 -35297800 -3c035268 -34639980 -01091026 -144308d3 -00000000 -3c0813a7 -35089878 -3c09b6e0 -352913ed -3c03a547 -34638b95 -01091026 -144308ca -00000000 -3c087e73 -35086580 -3c097ed7 -35292b38 -3c0300a4 -34634eb8 -01091026 -144308c1 -00000000 -3c088294 -3508b7f0 -3c09fe6e -352949c0 -3c037cfa -3463fe30 -01091026 -144308b8 -00000000 -3c08e286 -35089800 -3c096ebf -3529edc8 -3c038c39 -346375c8 -01091026 -144308af -00000000 -3c08f023 -35086538 -3c0935be -35293f64 -3c03c59d -34635a5c -01091026 -144308a6 -00000000 -3c08341c -3508aff8 -3c09f8b7 -35298280 -3c03ccab -34632d78 -01091026 -1443089d -00000000 -3c084c8e -350875a8 -3c09f12b -3529c790 -3c03bda5 -3463b238 -01091026 -14430894 -00000000 -3c088033 -35087e43 -3c093d6f -3529c838 -3c03bd5c -3463b67b -01091026 -1443088b -00000000 -3c08f318 -3508abd4 -3c09891c -35292de6 -3c037a04 -34638632 -01091026 -14430882 -00000000 -3c081301 -350853e0 -3c09cb18 -3529fd80 -3c03d819 -3463ae60 -01091026 -14430879 -00000000 -3c08d8f4 -35082882 -3c09a316 -35298c18 -3c037be2 -3463a49a -01091026 -14430870 -00000000 -3c087387 -35083200 -3c09a449 -352967de -3c03d7ce -346355de -01091026 -14430867 -00000000 -3c08dfb1 -35081efe -3c092c86 -3529fcd0 -3c03f337 -3463e22e -01091026 -1443085e -00000000 -3c086548 -35084ef0 -3c09ec9b -3529b729 -3c0389d3 -3463f9d9 -01091026 -14430855 -00000000 -3c08bf02 -35080438 -3c09eed1 -35292450 -3c0351d3 -34632068 -01091026 -1443084c -00000000 -3c089017 -35084d14 -3c09f9cb -35295a82 -3c0369dc -34631796 -01091026 -14430843 -00000000 -3c08e264 -3508b65e -3c091002 -35295feb -3c03f266 -3463e9b5 -01091026 -1443083a -00000000 -3c083ded -35080c60 -3c095805 -35297200 -3c0365e8 -34637e60 -01091026 -14430831 -00000000 -3c08a855 -3508073a -3c0987d2 -35290ebe -3c032f87 -34630984 -01091026 -14430828 -00000000 -3c081f1c -350821a8 -3c09c792 -35290290 -3c03d88e -34632338 -01091026 -1443081f -00000000 -3c08c9cd -350826e8 -3c0946c4 -35293af9 -3c038f09 -34631c11 -01091026 -14430816 -00000000 -3c08e593 -350827b0 -3c09a393 -35298e2e -3c034600 -3463a99e -01091026 -1443080d -00000000 -3c08f408 -350872b8 -3c099568 -3529b900 -3c036160 -3463cbb8 -01091026 -14430804 -00000000 -3c08d01d -35086af5 -3c092629 -3529e8cf -3c03f634 -3463823a -01091026 -144307fb -00000000 -3c0857ba -3508b6b8 -3c09f2d2 -3529f47a -3c03a568 -346342c2 -01091026 -144307f2 -00000000 -3c08cdaf -350813dc -3c09411e -3529e0b8 -3c038cb1 -3463f364 -01091026 -144307e9 -00000000 -3c087046 -3508d6ca -3c09c222 -3529ce00 -3c03b264 -346318ca -01091026 -144307e0 -00000000 -3c088e46 -3508ade8 -3c091d91 -3529c278 -3c0393d7 -34636f90 -01091026 -144307d7 -00000000 -3c08c094 -35088478 -3c0948de -35299c04 -3c03884a -3463187c -01091026 -144307ce -00000000 -3c081c56 -350830ed -3c09cbde -35290ad1 -3c03d788 -34633a3c -01091026 -144307c5 -00000000 -3c08a42f -35081877 -3c09999c -3529f000 -3c033db3 -3463e877 -01091026 -144307bc -00000000 -3c083881 -35085e76 -3c092e1f -35296db0 -3c03169e -346333c6 -01091026 -144307b3 -00000000 -3c0802ca -3508ce90 -3c099bf4 -35299850 -3c03993e -346356c0 -01091026 -144307aa -00000000 -3c08ceb0 -3508092e -3c094b08 -3529b7ec -3c0385b8 -3463bec2 -01091026 -144307a1 -00000000 -3c08774c -35087be0 -3c09d115 -3529bc00 -3c03a659 -3463c7e0 -01091026 -14430798 -00000000 -3c08ae28 -3508d030 -3c09fe34 -3529c70b -3c03501c -3463173b -01091026 -1443078f -00000000 -3c0848f1 -35084980 -3c09063e -3529d6f8 -3c034ecf -34639f78 -01091026 -14430786 -00000000 -3c08ceb2 -350839b8 -3c09ba26 -35297317 -3c037494 -34634aaf -01091026 -1443077d -00000000 -3c08ceba -3508f5a8 -3c095256 -3529433c -3c039cec -3463b694 -01091026 -14430774 -00000000 -3c08d3d6 -3508c800 -3c09f369 -35290660 -3c0320bf -3463ce60 -01091026 -1443076b -00000000 -3c087072 -3508fb50 -3c09275a -352913d4 -3c035728 -3463e884 -01091026 -14430762 -00000000 -3c080daf -35084e08 -3c098dc1 -35295e80 -3c03806e -34631088 -01091026 -14430759 -00000000 -3c088ee6 -3508ca1c -3c095967 -35291835 -3c03d781 -3463d229 -01091026 -14430750 -00000000 -3c08626e -35083d0c -3c09c61c -35297256 -3c03a472 -34634f5a -01091026 -14430747 -00000000 -3c08a2d9 -35082590 -3c09f6eb -3529a59c -3c035432 -3463800c -01091026 -1443073e -00000000 -3c088f4b -35084392 -3c090c46 -35293d48 -3c03830d -34637eda -01091026 -14430735 -00000000 -3c084a45 -3508a924 -3c095652 -3529b610 -3c031c17 -34631f34 -01091026 -1443072c -00000000 -3c085016 -3508ccc0 -3c09627d -3529a984 -3c03326b -34636544 -01091026 -14430723 -00000000 -3c0811e2 -35086bf2 -3c096b4f -35297f0c -3c037aad -346314fe -01091026 -1443071a -00000000 -3c080aa8 -350810f8 -3c09255a -3529409a -3c032ff2 -34635062 -01091026 -14430711 -00000000 -3c08e518 -3508e46a -3c09e34e -3529e318 -3c030656 -34630772 -01091026 -14430708 -00000000 -3c083acc -35088ac4 -3c0952e5 -352974a8 -3c036829 -3463fe6c -01091026 -144306ff -00000000 -3c0852e7 -35080cc0 -3c09dd8f -35293b08 -3c038f68 -346337c8 -01091026 -144306f6 -00000000 -3c08b70b -35084c48 -3c094644 -352935c0 -3c03f14f -34637988 -01091026 -144306ed -00000000 -3c08fee3 -35080fe0 -3c09a97a -35296250 -3c035799 -34636db0 -01091026 -144306e4 -00000000 -3c081fe1 -35082bd5 -3c09fefb -3529ecc5 -3c03e11a -3463c710 -01091026 -144306db -00000000 -3c08d515 -3508843c -3c097f6d -352924b4 -3c03aa78 -3463a088 -01091026 -144306d2 -00000000 -3c08cab0 -350815b0 -3c0963e0 -35290e40 -3c03a950 -34631bf0 -01091026 -144306c9 -00000000 -3c085201 -35088740 -3c09ef6e -352920cc -3c03bd6f -3463a78c -01091026 -144306c0 -00000000 -3c0892f6 -35085d38 -3c09a932 -35294a80 -3c033bc4 -346317b8 -01091026 -144306b7 -00000000 -3c080393 -350821a2 -3c09656a -35296929 -3c0366f9 -3463488b -01091026 -144306ae -00000000 -3c08979a -3508e176 -3c0908a7 -3529f9a4 -3c039f3d -346318d2 -01091026 -144306a5 -00000000 -3c08d8bd -3508ce58 -3c09a818 -3529a664 -3c0370a5 -3463683c -01091026 -1443069c -00000000 -3c08ece5 -350833f0 -3c099322 -3529f2a8 -3c037fc7 -3463c158 -01091026 -14430693 -00000000 -3c089a2a -35085b8b -3c09c403 -35298e8e -3c035e29 -3463d505 -01091026 -1443068a -00000000 -3c0844e4 -3508fc98 -3c09946f -35296cb2 -3c03d08b -3463902a -01091026 -14430681 -00000000 -3c083cec -350852fc -3c0986d0 -3529799f -3c03ba3c -34632b63 -01091026 -14430678 -00000000 -3c081ec7 -3508ae70 -3c0935c6 -3529e91a -3c032b01 -3463476a -01091026 -1443066f -00000000 -3c084da9 -35083b5e -3c09ece3 -35296e04 -3c03a14a -3463555a -01091026 -14430666 -00000000 -3c08c272 -35081c7b -3c093453 -3529b32e -3c03f621 -3463af55 -01091026 -1443065d -00000000 -3c08af7a -350812d8 -3c094021 -3529008c -3c03ef5b -34631254 -01091026 -14430654 -00000000 -3c081b59 -3508edf0 -3c09cafc -35291754 -3c03d1a5 -3463faa4 -01091026 -1443064b -00000000 -3c08e7bd -35087752 -3c09ff1d -352902b8 -3c0318a0 -346375ea -01091026 -14430642 -00000000 -3c087e12 -3508a3fc -3c0975bb -3529c9e7 -3c030ba9 -34636a1b -01091026 -14430639 -00000000 -3c089675 -35086580 -3c09d4cc -3529d960 -3c0342b9 -3463bce0 -01091026 -14430630 -00000000 -3c08d110 -350878c0 -3c09d2f4 -35295c20 -3c0303e4 -346324e0 -01091026 -14430627 -00000000 -3c08a337 -3508d9ae -3c09f702 -35293ce0 -3c035435 -3463e54e -01091026 -1443061e -00000000 -3c0898bd -3508dbc4 -3c09d7bb -35295a80 -3c034f06 -34638144 -01091026 -14430615 -00000000 -3c087b10 -3508de60 -3c096bbe -3529e859 -3c0310ae -34633639 -01091026 -1443060c -00000000 -3c08cea7 -35084b40 -3c09fdf6 -35293eb4 -3c033351 -346375f4 -01091026 -14430603 -00000000 -3c08ef34 -350850a3 -3c092351 -3529eb6c -3c03cc65 -3463bbcf -01091026 -144305fa -00000000 -3c083811 -3508aac0 -3c0908f1 -352905f0 -3c0330e0 -3463af30 -01091026 -144305f1 -00000000 -3c086a91 -350864a8 -3c09a1a1 -352951f0 -3c03cb30 -34633558 -01091026 -144305e8 -00000000 -3c081626 -3508629c -3c096016 -35293b2b -3c037630 -346359b7 -01091026 -144305df -00000000 -3c08ff1c -35086994 -3c098403 -3529e5f4 -3c037b1f -34638c60 -01091026 -144305d6 -00000000 -3c0867ef -3508e980 -3c09cbe2 -3529ddc8 -3c03ac0d -34633448 -01091026 -144305cd -00000000 -3c082d07 -3508a22c -3c09ec0a -35298100 -3c03c10d -3463232c -01091026 -144305c4 -00000000 -3c080ea2 -3508bd16 -3c09b78b -3529fb80 -3c03b929 -34634696 -01091026 -144305bb -00000000 -3c082492 -35084d30 -3c09f306 -3529ff74 -3c03d794 -3463b244 -01091026 -144305b2 -00000000 -3c08aacb -3508f870 -3c0917c5 -35292bc0 -3c03bd0e -3463d3b0 -01091026 -144305a9 -00000000 -3c0845b8 -35089ee0 -3c096d1e -3529298c -3c0328a6 -3463b76c -01091026 -144305a0 -00000000 -3c08e976 -35084bb6 -3c099601 -352967b0 -3c037f77 -34632c06 -01091026 -14430597 -00000000 -3c08baba -350814a5 -3c09b8d4 -352900e0 -3c03026e -34631445 -01091026 -1443058e -00000000 -3c088e0e -35083712 -3c09e4fb -3529483c -3c036af5 -34637f2e -01091026 -14430585 -00000000 -3c0833d1 -35083740 -3c0973bd -3529816e -3c03406c -3463b62e -01091026 -1443057c -00000000 -3c087e22 -3508aef4 -3c091801 -35296a00 -3c036623 -3463c4f4 -01091026 -14430573 -00000000 -3c08effd -3508d900 -3c092e8d -35294aa0 -3c03c170 -346393a0 -01091026 -1443056a -00000000 -3c0808e2 -35087919 -3c09643d -3529b550 -3c036cdf -3463cc49 -01091026 -14430561 -00000000 -3c086b22 -35084cc8 -3c0940c6 -35298c68 -3c032be4 -3463c0a0 -01091026 -14430558 -00000000 -3c08abfe -3508a0ac -3c093400 -3529763e -3c039ffe -3463d692 -01091026 -1443054f -00000000 -3c08a441 -3508cf33 -3c09c4e3 -35298fcc -3c0360a2 -346340ff -01091026 -14430546 -00000000 -3c083613 -3508d240 -3c09b5bb -35292088 -3c0383a8 -3463f2c8 -01091026 -1443053d -00000000 -3c08bf23 -3508c6d0 -3c093bdb -35293802 -3c0384f8 -3463fed2 -01091026 -14430534 -00000000 -3c083ead -35086d74 -3c09904b -35296f66 -3c03aee6 -34630212 -01091026 -1443052b -00000000 -3c08f4db -3508914c -3c09edaf -3529dd9e -3c031974 -34634cd2 -01091026 -14430522 -00000000 -3c089f71 -35089840 -3c09f713 -35297588 -3c036862 -3463edc8 -01091026 -14430519 -00000000 -3c0803a0 -3508d450 -3c091ec8 -35291ee8 -3c031d68 -3463cab8 -01091026 -14430510 -00000000 -3c0874b1 -35085e02 -3c0955eb -35298d05 -3c03215a -3463d307 -01091026 -14430507 -00000000 -3c08a96b -35081717 -3c09db41 -35299cb0 -3c03722a -34638ba7 -01091026 -144304fe -00000000 -3c089fe4 -3508c23e -3c09acf1 -35291c91 -3c033315 -3463deaf -01091026 -144304f5 -00000000 -3c08037b -35083588 -3c0993c6 -3529b62e -3c0390bd -346383a6 -01091026 -144304ec -00000000 -3c088350 -3508bd9e -3c095b28 -3529fc94 -3c03d878 -3463410a -01091026 -144304e3 -00000000 -3c08e9af -35082fa0 -3c09c778 -352971fa -3c032ed7 -34635e5a -01091026 -144304da -00000000 -3c08d49f -3508ade8 -3c099615 -35297a50 -3c03428a -3463d7b8 -01091026 -144304d1 -00000000 -3c08bd84 -3508e1ef -3c097409 -352939e0 -3c03c98d -3463d80f -01091026 -144304c8 -00000000 -3c085018 -3508b058 -3c09405b -3529e198 -3c031043 -346351c0 -01091026 -144304bf -00000000 -3c08a593 -35080935 -3c09fe35 -35290be8 -3c035ba6 -346302dd -01091026 -144304b6 -00000000 -3c0851af -3508b266 -3c09c976 -3529bae0 -3c0398d9 -34630886 -01091026 -144304ad -00000000 -3c0870d0 -3508dacc -3c099082 -35297cd4 -3c03e052 -3463a618 -01091026 -144304a4 -00000000 -3c08bdc9 -3508d980 -3c09d67b -3529349f -3c036bb2 -3463ed1f -01091026 -1443049b -00000000 -3c08db02 -35080fe0 -3c09bb7e -35293638 -3c03607c -346339d8 -01091026 -14430492 -00000000 -3c0885dc -35089c1b -3c09bac6 -3529aaf9 -3c033f1a -346336e2 -01091026 -14430489 -00000000 -3c080d86 -35083c28 -3c0983b6 -35291b6b -3c038e30 -34632743 -01091026 -14430480 -00000000 -3c0808a7 -35085543 -3c09ea10 -35298c48 -3c03e2b7 -3463d90b -01091026 -14430477 -00000000 -3c0861f3 -35085dd8 -3c0969d7 -35298dd6 -3c030824 -3463d00e -01091026 -1443046e -00000000 -3c0887a4 -350896d0 -3c094b71 -35292450 -3c03ccd5 -3463b280 -01091026 -14430465 -00000000 -3c088b04 -35082888 -3c0905c4 -35293200 -3c038ec0 -34631a88 -01091026 -1443045c -00000000 -3c082061 -35083670 -3c0982c0 -3529e238 -3c03a2a1 -3463d448 -01091026 -14430453 -00000000 -3c083578 -3508c9de -3c09d705 -35295780 -3c03e27d -34639e5e -01091026 -1443044a -00000000 -3c0839bc -35082a00 -3c091678 -35297e00 -3c032fc4 -34635400 -01091026 -14430441 -00000000 -3c08cc02 -35086df0 -3c0952cb -3529a760 -3c039ec9 -3463ca90 -01091026 -14430438 -00000000 -3c084863 -35080bd4 -3c09f586 -352941c8 -3c03bde5 -34634a1c -01091026 -1443042f -00000000 -3c0829cd -3508f640 -3c09ac85 -3529192e -3c038548 -3463ef6e -01091026 -14430426 -00000000 -3c0848ec -35088bb0 -3c09793b -3529f950 -3c0331d7 -346372e0 -01091026 -1443041d -00000000 -3c08f456 -350840de -3c09ecc3 -35294331 -3c031895 -346303ef -01091026 -14430414 -00000000 -3c08fe0d -3508b400 -3c09edc8 -3529e6a0 -3c0313c5 -346352a0 -01091026 -1443040b -00000000 -3c081a05 -35089fa8 -3c09fb49 -35294040 -3c03e14c -3463dfe8 -01091026 -14430402 -00000000 -3c083f4b -3508d678 -3c0926fe -35297cd0 -3c0319b5 -3463aaa8 -01091026 -144303f9 -00000000 -3c08720e -3508d744 -3c090d79 -35298bc8 -3c037f77 -34635c8c -01091026 -144303f0 -00000000 -3c0880ff -35086b98 -3c0933c8 -3529bca0 -3c03b337 -3463d738 -01091026 -144303e7 -00000000 -3c084357 -35087178 -3c099067 -3529e048 -3c03d330 -34639130 -01091026 -144303de -00000000 -3c0816a1 -35080890 -3c097e29 -35298410 -3c036888 -34638c80 -01091026 -144303d5 -00000000 -3c08d54a -3508fa9c -3c09f86f -352911c6 -3c032d25 -3463eb5a -01091026 -144303cc -00000000 -3c08db2c -3508b600 -3c094293 -3529f9ee -3c0399bf -34634fee -01091026 -144303c3 -00000000 -3c088ca5 -3508d672 -3c09dacb -3529d006 -3c03566e -34630674 -01091026 -144303ba -00000000 -3c08b7d7 -3508e885 -3c0953ea -352966e8 -3c03e43d -34638e6d -01091026 -144303b1 -00000000 -3c08977d -3508f75c -3c096ef9 -35298a00 -3c03f984 -34637d5c -01091026 -144303a8 -00000000 -3c087106 -350848b8 -3c09eac0 -3529b5ca -3c039bc6 -3463fd72 -01091026 -1443039f -00000000 -3c08fe14 -350843eb -3c0999a7 -3529cb17 -3c0367b3 -346388fc -01091026 -14430396 -00000000 -3c089ece -3508278d -3c09c0de -3529a702 -3c035e10 -3463808f -01091026 -1443038d -00000000 -3c088072 -3508b77c -3c09468b -352926f6 -3c03c6f9 -3463918a -01091026 -14430384 -00000000 -3c08a23c -3508e9f8 -3c09dfd5 -35298adc -3c037de9 -34636324 -01091026 -1443037b -00000000 -3c0855cd -3508d2f8 -3c09a007 -352945a2 -3c03f5ca -3463975a -01091026 -14430372 -00000000 -3c08cde9 -3508aa28 -3c09decf -3529c40d -3c031326 -34636e25 -01091026 -14430369 -00000000 -3c0896f8 -35080280 -3c0931a8 -3529b5c8 -3c03a750 -3463b748 -01091026 -14430360 -00000000 -3c085185 -35081e40 -3c099311 -35298808 -3c03c294 -34639648 -01091026 -14430357 -00000000 -3c08443c -35088692 -3c0926c6 -3529df34 -3c0362fa -346359a6 -01091026 -1443034e -00000000 -3c0812f0 -35087438 -3c09a573 -352929d0 -3c03b783 -34635de8 -01091026 -14430345 -00000000 -3c08f4cf -3508e0c4 -3c09e2d3 -35295c34 -3c03161c -3463bcf0 -01091026 -1443033c -00000000 -3c082f1f -35083be4 -3c09d1ac -35293e30 -3c03feb3 -346305d4 -01091026 -14430333 -00000000 -3c081baa -3508dbb0 -3c094ca6 -3529a168 -3c03570c -34637ad8 -01091026 -1443032a -00000000 -3c08fc13 -3508a670 -24090000 -3c03fc13 -3463a670 -01091026 -14430322 -00000000 -3c086970 -35081f84 -24090000 -3c036970 -34631f84 -01091026 -1443031a -00000000 -3c083bdc -35081a6e -24090000 -3c033bdc -34631a6e -01091026 -14430312 -00000000 -3c084a20 -350822a2 -24090000 -3c034a20 -346322a2 -01091026 -1443030a -00000000 -3c087c1b -35081d00 -24090000 -3c037c1b -34631d00 -01091026 -14430302 -00000000 -3c0815c5 -3508cc10 -24090000 -3c0315c5 -3463cc10 -01091026 -144302fa -00000000 -3c087f15 -35087c7a -24090000 -3c037f15 -34637c7a -01091026 -144302f2 -00000000 -3c080010 -3508e998 -24090000 -3c030010 -3463e998 -01091026 -144302ea -00000000 -3c080d05 -350888d0 -24090000 -3c030d05 -346388d0 -01091026 -144302e2 -00000000 -3c0821b3 -3508a3a8 -24090000 -3c0321b3 -3463a3a8 -01091026 -144302da -00000000 -3c082407 -350821c8 -24090000 -3c032407 -346321c8 -01091026 -144302d2 -00000000 -3c08f678 -35088a98 -24090000 -3c03f678 -34638a98 -01091026 -144302ca -00000000 -3c088484 -350812d0 -24090000 -3c038484 -346312d0 -01091026 -144302c2 -00000000 -3c08cef7 -3508fec0 -24090000 -3c03cef7 -3463fec0 -01091026 -144302ba -00000000 -3c089c43 -3508a170 -24090000 -3c039c43 -3463a170 -01091026 -144302b2 -00000000 -3c082dec -3508c712 -24090000 -3c032dec -3463c712 -01091026 -144302aa -00000000 -3c08cb53 -35082c80 -24090000 -3c03cb53 -34632c80 -01091026 -144302a2 -00000000 -3c089e80 -35087460 -24090000 -3c039e80 -34637460 -01091026 -1443029a -00000000 -3c080777 -3508059a -24090000 -3c030777 -3463059a -01091026 -14430292 -00000000 -3c088d3b -350810c9 -24090000 -3c038d3b -346310c9 -01091026 -1443028a -00000000 -3c08bf49 -3508f600 -24090000 -3c03bf49 -3463f600 -01091026 -14430282 -00000000 -3c08b751 -35083ec8 -24090000 -3c03b751 -34633ec8 -01091026 -1443027a -00000000 -3c0889db -350872c8 -24090000 -3c0389db -346372c8 -01091026 -14430272 -00000000 -3c08df0f -3508cdc8 -24090000 -3c03df0f -3463cdc8 -01091026 -1443026a -00000000 -3c08305b -3508a45c -24090000 -3c03305b -3463a45c -01091026 -14430262 -00000000 -3c085458 -3508de98 -24090000 -3c035458 -3463de98 -01091026 -1443025a -00000000 -3c086bec -3508c62a -24090000 -3c036bec -3463c62a -01091026 -14430252 -00000000 -3c08832b -35089c18 -24090000 -3c03832b -34639c18 -01091026 -1443024a -00000000 -3c08e8ac -35088e99 -24090000 -3c03e8ac -34638e99 -01091026 -14430242 -00000000 -3c08e8d3 -3508d334 -24090000 -3c03e8d3 -3463d334 -01091026 -1443023a -00000000 -3c08a960 -3508fc48 -24090000 -3c03a960 -3463fc48 -01091026 -14430232 -00000000 -3c08071d -35084c6a -24090000 -3c03071d -34634c6a -01091026 -1443022a -00000000 -3c0868d0 -35082448 -24090000 -3c0368d0 -34632448 -01091026 -14430222 -00000000 -3c08ef89 -35086e40 -24090000 -3c03ef89 -34636e40 -01091026 -1443021a -00000000 -3c08350d -35083c92 -24090000 -3c03350d -34633c92 -01091026 -14430212 -00000000 -3c0861f7 -35083e10 -24090000 -3c0361f7 -34633e10 -01091026 -1443020a -00000000 -3c085390 -35081b70 -24090000 -3c035390 -34631b70 -01091026 -14430202 -00000000 -3c083470 -350873a8 -24090000 -3c033470 -346373a8 -01091026 -144301fa -00000000 -3c08e3af -35080cf8 -24090000 -3c03e3af -34630cf8 -01091026 -144301f2 -00000000 -3c08f921 -350882dc -24090000 -3c03f921 -346382dc -01091026 -144301ea -00000000 -3c081145 -35085e30 -24090000 -3c031145 -34635e30 -01091026 -144301e2 -00000000 -3c08e6ce -35088fc8 -24090000 -3c03e6ce -34638fc8 -01091026 -144301da -00000000 -3c08b3c5 -35086041 -24090000 -3c03b3c5 -34636041 -01091026 -144301d2 -00000000 -3c089795 -3508c88c -24090000 -3c039795 -3463c88c -01091026 -144301ca -00000000 -3c0828d3 -3508aa6a -24090000 -3c0328d3 -3463aa6a -01091026 -144301c2 -00000000 -3c087fa7 -3508123c -24090000 -3c037fa7 -3463123c -01091026 -144301ba -00000000 -3c0828ae -3508ccb8 -24090000 -3c0328ae -3463ccb8 -01091026 -144301b2 -00000000 -3c084550 -350874a0 -24090000 -3c034550 -346374a0 -01091026 -144301aa -00000000 -3c0880e3 -3508eef6 -24090000 -3c0380e3 -3463eef6 -01091026 -144301a2 -00000000 -3c08d359 -350852a0 -24090000 -3c03d359 -346352a0 -01091026 -1443019a -00000000 -24080000 -3c09f3b4 -35292473 -3c03f3b4 -34632473 -01091026 -14430192 -00000000 -24080000 -3c09e779 -35293fc8 -3c03e779 -34633fc8 -01091026 -1443018a -00000000 -24080000 -3c09dc88 -35290500 -3c03dc88 -34630500 -01091026 -14430182 -00000000 -24080000 -3c09377b -35293360 -3c03377b -34633360 -01091026 -1443017a -00000000 -24080000 -3c0953a8 -35290660 -3c0353a8 -34630660 -01091026 -14430172 -00000000 -24080000 -3c091b3c -35294898 -3c031b3c -34634898 -01091026 -1443016a -00000000 -24080000 -3c09fcf7 -3529f6e0 -3c03fcf7 -3463f6e0 -01091026 -14430162 -00000000 -24080000 -3c090b7c -35296a3d -3c030b7c -34636a3d -01091026 -1443015a -00000000 -24080000 -3c0928ca -35298e70 -3c0328ca -34638e70 -01091026 -14430152 -00000000 -24080000 -3c0932c6 -35296b65 -3c0332c6 -34636b65 -01091026 -1443014a -00000000 -24080000 -3c09a5be -3529345e -3c03a5be -3463345e -01091026 -14430142 -00000000 -24080000 -3c099a0b -3529c290 -3c039a0b -3463c290 -01091026 -1443013a -00000000 -24080000 -3c090c0b -35291a60 -3c030c0b -34631a60 -01091026 -14430132 -00000000 -24080000 -3c090672 -3529fe64 -3c030672 -3463fe64 -01091026 -1443012a -00000000 -24080000 -3c097fe9 -35291230 -3c037fe9 -34631230 -01091026 -14430122 -00000000 -24080000 -3c09d53e -35290792 -3c03d53e -34630792 -01091026 -1443011a -00000000 -24080000 -3c096d58 -3529a790 -3c036d58 -3463a790 -01091026 -14430112 -00000000 -24080000 -3c092f2a -352954b8 -3c032f2a -346354b8 -01091026 -1443010a -00000000 -24080000 -3c09c743 -35290860 -3c03c743 -34630860 -01091026 -14430102 -00000000 -24080000 -3c092ced -35299e9b -3c032ced -34639e9b -01091026 -144300fa -00000000 -24080000 -3c09cdeb -35299c00 -3c03cdeb -34639c00 -01091026 -144300f2 -00000000 -24080000 -3c095fce -352941e4 -3c035fce -346341e4 -01091026 -144300ea -00000000 -24080000 -3c0900de -3529a100 -3c0300de -3463a100 -01091026 -144300e2 -00000000 -24080000 -3c099a43 -352924f9 -3c039a43 -346324f9 -01091026 -144300da -00000000 -24080000 -3c09fff9 -35299640 -3c03fff9 -34639640 -01091026 -144300d2 -00000000 -24080000 -3c091c7e -3529bc30 -3c031c7e -3463bc30 -01091026 -144300ca -00000000 -24080000 -3c09c3ea -3529e940 -3c03c3ea -3463e940 -01091026 -144300c2 -00000000 -24080000 -3c096694 -3529692c -3c036694 -3463692c -01091026 -144300ba -00000000 -24080000 -3c09ec23 -3529355a -3c03ec23 -3463355a -01091026 -144300b2 -00000000 -24080000 -3c09cfdb -35299258 -3c03cfdb -34639258 -01091026 -144300aa -00000000 -24080000 -3c09f461 -35299868 -3c03f461 -34639868 -01091026 -144300a2 -00000000 -24080000 -3c098c3a -35296498 -3c038c3a -34636498 -01091026 -1443009a -00000000 -24080000 -3c092180 -35298f90 -3c032180 -34638f90 -01091026 -14430092 -00000000 -24080000 -3c09cd47 -35291c30 -3c03cd47 -34631c30 -01091026 -1443008a -00000000 -24080000 -3c09980c -3529b63c -3c03980c -3463b63c -01091026 -14430082 -00000000 -24080000 -3c09f95c -35291c68 -3c03f95c -34631c68 -01091026 -1443007a -00000000 -24080000 -3c09b86c -3529acf0 -3c03b86c -3463acf0 -01091026 -14430072 -00000000 -24080000 -3c099f86 -3529dfbe -3c039f86 -3463dfbe -01091026 -1443006a -00000000 -24080000 -3c09e239 -35293cc6 -3c03e239 -34633cc6 -01091026 -14430062 -00000000 -24080000 -3c0928f3 -35298f80 -3c0328f3 -34638f80 -01091026 -1443005a -00000000 -24080000 -3c09e71a -35291600 -3c03e71a -34631600 -01091026 -14430052 -00000000 -24080000 -3c09b780 -352965c0 -3c03b780 -346365c0 -01091026 -1443004a -00000000 -24080000 -3c09ae57 -352901fc -3c03ae57 -346301fc -01091026 -14430042 -00000000 -24080000 -3c09cc79 -3529acfe -3c03cc79 -3463acfe -01091026 -1443003a -00000000 -24080000 -3c096cfc -3529614a -3c036cfc -3463614a -01091026 -14430032 -00000000 -24080000 -3c090c2a -3529cef6 -3c030c2a -3463cef6 -01091026 -1443002a -00000000 -24080000 -3c09fced -352935ce -3c03fced -346335ce -01091026 -14430022 -00000000 -24080000 -3c09a328 -35298960 -3c03a328 -34638960 -01091026 -1443001a -00000000 -24080000 -3c09c67e -3529946c -3c03c67e -3463946c -01091026 -14430012 -00000000 -24080000 -3c09b6a8 -3529c6f0 -3c03b6a8 -3463c6f0 -01091026 -1443000a -00000000 -24080000 -24090000 -24030000 -01091026 -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -24120000 -3c09c822 -3529c7e8 -3c08800d -350834c0 -3c03c822 -3463c7e8 -ad0966a8 -25040004 -2505fff8 -ac8466a8 -aca566a8 -8d0266a8 -8c8666a8 -8ca466a8 -8ca666a8 -144304e8 -00000000 -3c097173 -35297c10 -3c08800d -3508f660 -3c037173 -34637c10 -ad0902e4 -25040004 -2505fff8 -ac8402e4 -aca502e4 -8d0202e4 -8c8602e4 -8ca402e4 -8ca602e4 -144304d7 -00000000 -3c090368 -35292420 -3c08800d -350824e4 -3c030368 -34632420 -ad091680 -25040004 -2505fff8 -ac841680 -aca51680 -8d021680 -8c861680 -8ca41680 -8ca61680 -144304c6 -00000000 -3c096f59 -3529f5d3 -3c08800d -3508abdc -3c036f59 -3463f5d3 -ad0901b0 -25040004 -2505fff8 -ac8401b0 -aca501b0 -8d0201b0 -8c8601b0 -8ca401b0 -8ca601b0 -144304b5 -00000000 -3c0956d9 -35290696 -3c08800d -350828b4 -3c0356d9 -34630696 -ad091cf4 -25040004 -2505fff8 -ac841cf4 -aca51cf4 -8d021cf4 -8c861cf4 -8ca41cf4 -8ca61cf4 -144304a4 -00000000 -3c09eda5 -35292048 -3c08800d -35084ea8 -3c03eda5 -34632048 -ad092db0 -25040004 -2505fff8 -ac842db0 -aca52db0 -8d022db0 -8c862db0 -8ca42db0 -8ca62db0 -14430493 -00000000 -3c09383e -35298970 -3c08800d -35088ae4 -3c03383e -34638970 -ad096d88 -25040004 -2505fff8 -ac846d88 -aca56d88 -8d026d88 -8c866d88 -8ca46d88 -8ca66d88 -14430482 -00000000 -3c0928c9 -35290aca -3c08800d -35083840 -3c0328c9 -34630aca -3c010001 -00280821 -ac29b058 -25040004 -2505fff8 -3c010001 -00240821 -ac24b058 -3c010001 -00250821 -ac25b058 -3c020001 -00481021 -8c42b058 -3c060001 -00c43021 -8cc6b058 -3c040001 -00852021 -8c84b058 -3c060001 -00c53021 -8cc6b058 -14430463 -00000000 -3c0954ac -3529a118 -3c08800d -350806c0 -3c0354ac -3463a118 -3c010001 -00280821 -ac29a6e4 -25040004 -2505fff8 -3c010001 -00240821 -ac24a6e4 -3c010001 -00250821 -ac25a6e4 -3c020001 -00481021 -8c42a6e4 -3c060001 -00c43021 -8cc6a6e4 -3c040001 -00852021 -8c84a6e4 -3c060001 -00c53021 -8cc6a6e4 -14430444 -00000000 -3c09909e -352934d2 -3c08800d -350837c0 -3c03909e -346334d2 -3c010001 -00280821 -ac29a8cc -25040004 -2505fff8 -3c010001 -00240821 -ac24a8cc -3c010001 -00250821 -ac25a8cc -3c020001 -00481021 -8c42a8cc -3c060001 -00c43021 -8cc6a8cc -3c040001 -00852021 -8c84a8cc -3c060001 -00c53021 -8cc6a8cc -14430425 -00000000 -3c09c4b1 -3529feb0 -3c08800d -35080cf8 -3c03c4b1 -3463feb0 -ad091288 -25040004 -2505fff8 -ac841288 -aca51288 -8d021288 -8c861288 -8ca41288 -8ca61288 -14430414 -00000000 -3c09cb6c -3529d8c0 -3c08800d -35086db8 -3c03cb6c -3463d8c0 -ad092050 -25040004 -2505fff8 -ac842050 -aca52050 -8d022050 -8c862050 -8ca42050 -8ca62050 -14430403 -00000000 -3c096639 -35294aee -3c08800d -3508522c -3c036639 -34634aee -3c010001 -00280821 -ac2994e4 -25040004 -2505fff8 -3c010001 -00240821 -ac2494e4 -3c010001 -00250821 -ac2594e4 -3c020001 -00481021 -8c4294e4 -3c060001 -00c43021 -8cc694e4 -3c040001 -00852021 -8c8494e4 -3c060001 -00c53021 -8cc694e4 -144303e4 -00000000 -3c0948d3 -352955e4 -3c08800d -35086b90 -3c0348d3 -346355e4 -ad094af0 -25040004 -2505fff8 -ac844af0 -aca54af0 -8d024af0 -8c864af0 -8ca44af0 -8ca64af0 -144303d3 -00000000 -3c091bb4 -35290b48 -3c08800d -35082e6c -3c031bb4 -34630b48 -3c010001 -00280821 -ac299a68 -25040004 -2505fff8 -3c010001 -00240821 -ac249a68 -3c010001 -00250821 -ac259a68 -3c020001 -00481021 -8c429a68 -3c060001 -00c43021 -8cc69a68 -3c040001 -00852021 -8c849a68 -3c060001 -00c53021 -8cc69a68 -144303b4 -00000000 -3c092a74 -35298b22 -3c08800d -35087160 -3c032a74 -34638b22 -3c010001 -00280821 -ac2981f0 -25040004 -2505fff8 -3c010001 -00240821 -ac2481f0 -3c010001 -00250821 -ac2581f0 -3c020001 -00481021 -8c4281f0 -3c060001 -00c43021 -8cc681f0 -3c040001 -00852021 -8c8481f0 -3c060001 -00c53021 -8cc681f0 -14430395 -00000000 -3c09d5cf -3529b394 -3c08800d -35087f00 -3c03d5cf -3463b394 -ad090514 -25040004 -2505fff8 -ac840514 -aca50514 -8d020514 -8c860514 -8ca40514 -8ca60514 -14430384 -00000000 -3c097244 -35295ce0 -3c08800d -350859e4 -3c037244 -34635ce0 -3c010001 -00280821 -ac299f14 -25040004 -2505fff8 -3c010001 -00240821 -ac249f14 -3c010001 -00250821 -ac259f14 -3c020001 -00481021 -8c429f14 -3c060001 -00c43021 -8cc69f14 -3c040001 -00852021 -8c849f14 -3c060001 -00c53021 -8cc69f14 -14430365 -00000000 -3c09c017 -352902ce -3c08800d -350802d8 -3c03c017 -346302ce -ad097cd4 -25040004 -2505fff8 -ac847cd4 -aca57cd4 -8d027cd4 -8c867cd4 -8ca47cd4 -8ca67cd4 -14430354 -00000000 -3c09a616 -3529d1be -3c08800d -350807f0 -3c03a616 -3463d1be -ad090ac4 -25040004 -2505fff8 -ac840ac4 -aca50ac4 -8d020ac4 -8c860ac4 -8ca40ac4 -8ca60ac4 -14430343 -00000000 -3c09f145 -35296d95 -3c08800d -35087754 -3c03f145 -34636d95 -ad091358 -25040004 -2505fff8 -ac841358 -aca51358 -8d021358 -8c861358 -8ca41358 -8ca61358 -14430332 -00000000 -3c09b98a -35290778 -3c08800d -35081a74 -3c03b98a -34630778 -ad093408 -25040004 -2505fff8 -ac843408 -aca53408 -8d023408 -8c863408 -8ca43408 -8ca63408 -14430321 -00000000 -3c097685 -35292c0e -3c08800d -3508788c -3c037685 -34632c0e -ad090dfc -25040004 -2505fff8 -ac840dfc -aca50dfc -8d020dfc -8c860dfc -8ca40dfc -8ca60dfc -14430310 -00000000 -3c093a4e -35296338 -3c08800d -3c033a4e -34636338 -3c010001 -00280821 -ac29eba8 -25040004 -2505fff8 -3c010001 -00240821 -ac24eba8 -3c010001 -00250821 -ac25eba8 -3c020001 -00481021 -8c42eba8 -3c060001 -00c43021 -8cc6eba8 -3c040001 -00852021 -8c84eba8 -3c060001 -00c53021 -8cc6eba8 -144302f2 -00000000 -3c098625 -3529f42c -3c08800d -3c038625 -3463f42c -3c010001 -00280821 -ac29fac0 -25040004 -2505fff8 -3c010001 -00240821 -ac24fac0 -3c010001 -00250821 -ac25fac0 -3c020001 -00481021 -8c42fac0 -3c060001 -00c43021 -8cc6fac0 -3c040001 -00852021 -8c84fac0 -3c060001 -00c53021 -8cc6fac0 -144302d4 -00000000 -3c091624 -35290da0 -3c08800d -3c031624 -34630da0 -3c010001 -00280821 -ac29fec4 -25040004 -2505fff8 -3c010001 -00240821 -ac24fec4 -3c010001 -00250821 -ac25fec4 -3c020001 -00481021 -8c42fec4 -3c060001 -00c43021 -8cc6fec4 -3c040001 -00852021 -8c84fec4 -3c060001 -00c53021 -8cc6fec4 -144302b6 -00000000 -3c09325a -352952cc -3c08800d -3c03325a -346352cc -ad091310 -25040004 -2505fff8 -ac841310 -aca51310 -8d021310 -8c861310 -8ca41310 -8ca61310 -144302a6 -00000000 -3c09848c -3529badf -3c08800d -3c03848c -3463badf -ad090828 -25040004 -2505fff8 -ac840828 -aca50828 -8d020828 -8c860828 -8ca40828 -8ca60828 -14430296 -00000000 -3c099569 -35296380 -3c08800d -3c039569 -34636380 -3c010001 -00280821 -ac29e620 -25040004 -2505fff8 -3c010001 -00240821 -ac24e620 -3c010001 -00250821 -ac25e620 -3c020001 -00481021 -8c42e620 -3c060001 -00c43021 -8cc6e620 -3c040001 -00852021 -8c84e620 -3c060001 -00c53021 -8cc6e620 -14430278 -00000000 -3c09cf5f -35297ec0 -3c08800d -3c03cf5f -34637ec0 -3c010001 -00280821 -ac29d68c -25040004 -2505fff8 -3c010001 -00240821 -ac24d68c -3c010001 -00250821 -ac25d68c -3c020001 -00481021 -8c42d68c -3c060001 -00c43021 -8cc6d68c -3c040001 -00852021 -8c84d68c -3c060001 -00c53021 -8cc6d68c -1443025a -00000000 -3c0982ae -352970d0 -3c08800d -3c0382ae -346370d0 -ad092524 -25040004 -2505fff8 -ac842524 -aca52524 -8d022524 -8c862524 -8ca42524 -8ca62524 -1443024a -00000000 -3c09c354 -3529a660 -3c08800d -3c03c354 -3463a660 -ad096cf0 -25040004 -2505fff8 -ac846cf0 -aca56cf0 -8d026cf0 -8c866cf0 -8ca46cf0 -8ca66cf0 -1443023a -00000000 -3c0966a3 -35298db4 -3c08800d -3c0366a3 -34638db4 -ad092530 -25040004 -2505fff8 -ac842530 -aca52530 -8d022530 -8c862530 -8ca42530 -8ca62530 -1443022a -00000000 -3c091364 -35299030 -3c08800d -3c031364 -34639030 -ad095bc4 -25040004 -2505fff8 -ac845bc4 -aca55bc4 -8d025bc4 -8c865bc4 -8ca45bc4 -8ca65bc4 -1443021a -00000000 -3c09b7f6 -35296e24 -3c08800d -3c03b7f6 -34636e24 -ad0928b0 -25040004 -2505fff8 -ac8428b0 -aca528b0 -8d0228b0 -8c8628b0 -8ca428b0 -8ca628b0 -1443020a -00000000 -3c09c268 -3529a414 -3c08800d -3c03c268 -3463a414 -ad0959c0 -25040004 -2505fff8 -ac8459c0 -aca559c0 -8d0259c0 -8c8659c0 -8ca459c0 -8ca659c0 -144301fa -00000000 -3c091020 -352944e3 -3c08800d -3c031020 -346344e3 -ad093d0c -25040004 -2505fff8 -ac843d0c -aca53d0c -8d023d0c -8c863d0c -8ca43d0c -8ca63d0c -144301ea -00000000 -3c09ff0f -3529205f -3c08800d -3c03ff0f -3463205f -ad097be0 -25040004 -2505fff8 -ac847be0 -aca57be0 -8d027be0 -8c867be0 -8ca47be0 -8ca67be0 -144301da -00000000 -3c09e394 -3529e882 -3c08800d -3c03e394 -3463e882 -ad093f00 -25040004 -2505fff8 -ac843f00 -aca53f00 -8d023f00 -8c863f00 -8ca43f00 -8ca63f00 -144301ca -00000000 -3c096b53 -3529ef5a -3c08800d -3c036b53 -3463ef5a -ad0931d0 -25040004 -2505fff8 -ac8431d0 -aca531d0 -8d0231d0 -8c8631d0 -8ca431d0 -8ca631d0 -144301ba -00000000 -3c09d3ad -35295b32 -3c08800d -3c03d3ad -34635b32 -3c010001 -00280821 -ac29d870 -25040004 -2505fff8 -3c010001 -00240821 -ac24d870 -3c010001 -00250821 -ac25d870 -3c020001 -00481021 -8c42d870 -3c060001 -00c43021 -8cc6d870 -3c040001 -00852021 -8c84d870 -3c060001 -00c53021 -8cc6d870 -1443019c -00000000 -3c090e61 -3529fb40 -3c08800d -3c030e61 -3463fb40 -3c010001 -00280821 -ac2989e4 -25040004 -2505fff8 -3c010001 -00240821 -ac2489e4 -3c010001 -00250821 -ac2589e4 -3c020001 -00481021 -8c4289e4 -3c060001 -00c43021 -8cc689e4 -3c040001 -00852021 -8c8489e4 -3c060001 -00c53021 -8cc689e4 -1443017e -00000000 -3c09cb58 -3529118c -3c08800d -3c03cb58 -3463118c -3c010001 -00280821 -ac29a130 -25040004 -2505fff8 -3c010001 -00240821 -ac24a130 -3c010001 -00250821 -ac25a130 -3c020001 -00481021 -8c42a130 -3c060001 -00c43021 -8cc6a130 -3c040001 -00852021 -8c84a130 -3c060001 -00c53021 -8cc6a130 -14430160 -00000000 -3c09e56f -3529b3a8 -3c08800d -3c03e56f -3463b3a8 -ad0972ec -25040004 -2505fff8 -ac8472ec -aca572ec -8d0272ec -8c8672ec -8ca472ec -8ca672ec -14430150 -00000000 -3c096661 -3529617c -3c08800d -3c036661 -3463617c -ad094650 -25040004 -2505fff8 -ac844650 -aca54650 -8d024650 -8c864650 -8ca44650 -8ca64650 -14430140 -00000000 -3c095f7c -352908b0 -3c08800d -3c035f7c -346308b0 -3c010001 -00280821 -ac298524 -25040004 -2505fff8 -3c010001 -00240821 -ac248524 -3c010001 -00250821 -ac258524 -3c020001 -00481021 -8c428524 -3c060001 -00c43021 -8cc68524 -3c040001 -00852021 -8c848524 -3c060001 -00c53021 -8cc68524 -14430122 -00000000 -3c092b1e -3529a090 -3c08800d -3c032b1e -3463a090 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -14430112 -00000000 -3c09e4a9 -3529ee00 -3c08800d -3c03e4a9 -3463ee00 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -14430102 -00000000 -3c096472 -3529d096 -3c08800d -3c036472 -3463d096 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -144300f2 -00000000 -3c09c60d -3529fd1c -3c08800d -3c03c60d -3463fd1c -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -144300e2 -00000000 -3c09aaa5 -35294652 -3c08800d -3c03aaa5 -34634652 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -144300d2 -00000000 -3c09fd47 -3529929c -3c08800d -3c03fd47 -3463929c -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -144300c2 -00000000 -3c09e40e -35290b9e -3c08800d -3c03e40e -34630b9e -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -144300b2 -00000000 -3c096bcb -352955b4 -3c08800d -3c036bcb -346355b4 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -144300a2 -00000000 -3c09e6cb -35292590 -3c08800d -3c03e6cb -34632590 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -14430092 -00000000 -3c093d91 -35291cb8 -3c08800d -3c033d91 -34631cb8 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -14430082 -00000000 -3c09e658 -352974bd -3c08800d -3c03e658 -346374bd -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -14430072 -00000000 -3c093a3c -35299edc -3c08800d -3c033a3c -34639edc -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -14430062 -00000000 -3c09bddd -3529406e -3c08800d -3c03bddd -3463406e -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -14430052 -00000000 -3c09fe6f -3529b690 -3c08800d -3c03fe6f -3463b690 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -14430042 -00000000 -3c09941b -3529c8b2 -3c08800d -3c03941b -3463c8b2 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -14430032 -00000000 -3c099393 -3529289c -3c08800d -3c039393 -3463289c -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -14430022 -00000000 -3c0929b2 -3529c02d -3c08800d -3c0329b2 -3463c02d -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -14430012 -00000000 -24090000 -3c08800d -24030000 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -8d020000 -8c860000 -8ca40000 -8ca60000 -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -26100001 -24120000 -3c09c5e0 -3529fd00 -3c08800d -35081dfc -3403c5e0 -3c010001 -00280821 -ac29b55c -25040004 -2505fff8 -3c010001 -00240821 -ac24b55c -3c010001 -00250821 -ac25b55c -3c020001 -00481021 -9442b55e -3c050001 -00a42821 -8ca5b55c -3c040001 -00852021 -8c84b55c -3c060001 -00c53021 -8cc6b55c -144307ba -00000000 -3c092587 -352907b2 -3c08800d -3508bd8c -240307b2 -ad091c34 -25040004 -2505fff8 -ac841c34 -aca51c34 -95021c34 -8c851c34 -8ca41c34 -8ca61c34 -144307aa -00000000 -3c09263a -3529a087 -3c08800d -35086920 -2403263a -ad096418 -25040004 -2505fff8 -ac846418 -aca56418 -9502641a -8c856418 -8ca46418 -8ca66418 -1443079a -00000000 -3c09b5e1 -35291b1a -3c08800d -35083a6c -24031b1a -ad095164 -25040004 -2505fff8 -ac845164 -aca55164 -95025164 -8c855164 -8ca45164 -8ca65164 -1443078a -00000000 -3c09c972 -3529f764 -3c08800d -350814a0 -3403f764 -ad0902cc -25040004 -2505fff8 -ac8402cc -aca502cc -950202cc -8c8502cc -8ca402cc -8ca602cc -1443077a -00000000 -3c099cc8 -35294d98 -3c08800d -35080160 -24034d98 -ad091268 -25040004 -2505fff8 -ac841268 -aca51268 -95021268 -8c851268 -8ca41268 -8ca61268 -1443076a -00000000 -3c0975e3 -352913d0 -3c08800d -3508993c -240313d0 -ad09456c -25040004 -2505fff8 -ac84456c -aca5456c -9502456c -8c85456c -8ca4456c -8ca6456c -1443075a -00000000 -3c096d19 -3529e13e -3c08800d -3508b968 -24036d19 -ad0935dc -25040004 -2505fff8 -ac8435dc -aca535dc -950235de -8c8535dc -8ca435dc -8ca635dc -1443074a -00000000 -3c094a1e -3529fc6c -3c08800d -35085a08 -3403fc6c -3c010001 -00280821 -ac29a2f0 -25040004 -2505fff8 -3c010001 -00240821 -ac24a2f0 -3c010001 -00250821 -ac25a2f0 -3c020001 -00481021 -9442a2f0 -3c050001 -00a42821 -8ca5a2f0 -3c040001 -00852021 -8c84a2f0 -3c060001 -00c53021 -8cc6a2f0 -1443072c -00000000 -3c0932e3 -352921c0 -3c08800d -350841d4 -240321c0 -ad096844 -25040004 -2505fff8 -ac846844 -aca56844 -95026844 -8c856844 -8ca46844 -8ca66844 -1443071c -00000000 -3c097977 -3529fa5c -3c08800d -35084e38 -3403fa5c -ad093380 -25040004 -2505fff8 -ac843380 -aca53380 -95023380 -8c853380 -8ca43380 -8ca63380 -1443070c -00000000 -3c094310 -35296c00 -3c08800d -35087bf8 -24034310 -ad0978c8 -25040004 -2505fff8 -ac8478c8 -aca578c8 -950278ca -8c8578c8 -8ca478c8 -8ca678c8 -144306fc -00000000 -3c0943ab -3529d100 -3c08800d -35087718 -240343ab -ad096cd4 -25040004 -2505fff8 -ac846cd4 -aca56cd4 -95026cd6 -8c856cd4 -8ca46cd4 -8ca66cd4 -144306ec -00000000 -3c09dd8d -3529afc0 -3c08800d -350866c0 -3403afc0 -ad095b08 -25040004 -2505fff8 -ac845b08 -aca55b08 -95025b08 -8c855b08 -8ca45b08 -8ca65b08 -144306dc -00000000 -3c0946df -3529a15e -3c08800d -3508086c -3403a15e -ad095220 -25040004 -2505fff8 -ac845220 -aca55220 -95025220 -8c855220 -8ca45220 -8ca65220 -144306cc -00000000 -3c095928 -352910c0 -3c08800d -35081438 -240310c0 -3c010001 -00280821 -ac29e178 -25040004 -2505fff8 -3c010001 -00240821 -ac24e178 -3c010001 -00250821 -ac25e178 -3c020001 -00481021 -9442e178 -3c050001 -00a42821 -8ca5e178 -3c040001 -00852021 -8c84e178 -3c060001 -00c53021 -8cc6e178 -144306ae -00000000 -3c09b8f4 -3529f244 -3c08800d -350830d0 -3403f244 -ad091944 -25040004 -2505fff8 -ac841944 -aca51944 -95021944 -8c851944 -8ca41944 -8ca61944 -1443069e -00000000 -3c09a326 -352905e0 -3c08800d -35086c44 -240305e0 -ad090a88 -25040004 -2505fff8 -ac840a88 -aca50a88 -95020a88 -8c850a88 -8ca40a88 -8ca60a88 -1443068e -00000000 -3c09644a -3529b840 -3c08800d -35080200 -2403644a -3c010001 -00280821 -ac29fbec -25040004 -2505fff8 -3c010001 -00240821 -ac24fbec -3c010001 -00250821 -ac25fbec -3c020001 -00481021 -9442fbee -3c050001 -00a42821 -8ca5fbec -3c040001 -00852021 -8c84fbec -3c060001 -00c53021 -8cc6fbec -14430670 -00000000 -3c09c9b5 -3529aa10 -3c08800d -35086b08 -3403aa10 -ad092200 -25040004 -2505fff8 -ac842200 -aca52200 -95022200 -8c852200 -8ca42200 -8ca62200 -14430660 -00000000 -3c0997bd -3529e956 -3c08800d -35085160 -3403e956 -ad0919d0 -25040004 -2505fff8 -ac8419d0 -aca519d0 -950219d0 -8c8519d0 -8ca419d0 -8ca619d0 -14430650 -00000000 -3c098915 -3529acea -3c08800d -35080210 -34038915 -ad097a2c -25040004 -2505fff8 -ac847a2c -aca57a2c -95027a2e -8c857a2c -8ca47a2c -8ca67a2c -14430640 -00000000 -3c097952 -3529a818 -3c08800d -350835d4 -24037952 -3c010001 -00280821 -ac29b39c -25040004 -2505fff8 -3c010001 -00240821 -ac24b39c -3c010001 -00250821 -ac25b39c -3c020001 -00481021 -9442b39e -3c050001 -00a42821 -8ca5b39c -3c040001 -00852021 -8c84b39c -3c060001 -00c53021 -8cc6b39c -14430622 -00000000 -3c09457f -35290d3d -3c08800d -35086044 -24030d3d -ad0959e0 -25040004 -2505fff8 -ac8459e0 -aca559e0 -950259e0 -8c8559e0 -8ca459e0 -8ca659e0 -14430612 -00000000 -3c0981a3 -3529f580 -3c08800d -35087588 -3403f580 -ad090ab4 -25040004 -2505fff8 -ac840ab4 -aca50ab4 -95020ab4 -8c850ab4 -8ca40ab4 -8ca60ab4 -14430602 -00000000 -3c09e9fd -3529e394 -3c08800d -35081870 -3403e9fd -ad097950 -25040004 -2505fff8 -ac847950 -aca57950 -95027952 -8c857950 -8ca47950 -8ca67950 -144305f2 -00000000 -3c09bbf8 -3529bfa0 -3c08800d -35082c9c -3403bbf8 -ad0966d8 -25040004 -2505fff8 -ac8466d8 -aca566d8 -950266da -8c8566d8 -8ca466d8 -8ca666d8 -144305e2 -00000000 -3c091db2 -35298a00 -3c08800d -3508ae60 -24031db2 -ad0947e8 -25040004 -2505fff8 -ac8447e8 -aca547e8 -950247ea -8c8547e8 -8ca447e8 -8ca647e8 -144305d2 -00000000 -3c095d6b -35290e7c -3c08800d -35080c48 -24035d6b -ad0927bc -25040004 -2505fff8 -ac8427bc -aca527bc -950227be -8c8527bc -8ca427bc -8ca627bc -144305c2 -00000000 -3c0957fe -35298940 -3c08800d -35082030 -34038940 -ad091770 -25040004 -2505fff8 -ac841770 -aca51770 -95021770 -8c851770 -8ca41770 -8ca61770 -144305b2 -00000000 -3c098003 -35290460 -3c08800d -35082878 -34038003 -ad093b90 -25040004 -2505fff8 -ac843b90 -aca53b90 -95023b92 -8c853b90 -8ca43b90 -8ca63b90 -144305a2 -00000000 -3c099d11 -352955b8 -3c08800d -3508432c -240355b8 -ad095da8 -25040004 -2505fff8 -ac845da8 -aca55da8 -95025da8 -8c855da8 -8ca45da8 -8ca65da8 -14430592 -00000000 -3c0993af -35292e4a -3c08800d -3508444c -340393af -ad094b78 -25040004 -2505fff8 -ac844b78 -aca54b78 -95024b7a -8c854b78 -8ca44b78 -8ca64b78 -14430582 -00000000 -3c0964e9 -35293438 -3c08800d -240364e9 -3c010001 -00280821 -ac29cf1c -25040004 -2505fff8 -3c010001 -00240821 -ac24cf1c -3c010001 -00250821 -ac25cf1c -3c020001 -00481021 -9442cf1e -3c050001 -00a42821 -8ca5cf1c -3c040001 -00852021 -8c84cf1c -3c060001 -00c53021 -8cc6cf1c -14430565 -00000000 -3c09855e -35292566 -3c08800d -3403855e -ad095370 -25040004 -2505fff8 -ac845370 -aca55370 -95025372 -8c855370 -8ca45370 -8ca65370 -14430556 -00000000 -3c0968e8 -3529f220 -3c08800d -3403f220 -ad092060 -25040004 -2505fff8 -ac842060 -aca52060 -95022060 -8c852060 -8ca42060 -8ca62060 -14430547 -00000000 -3c09155b -35296e78 -3c08800d -24036e78 -ad094da8 -25040004 -2505fff8 -ac844da8 -aca54da8 -95024da8 -8c854da8 -8ca44da8 -8ca64da8 -14430538 -00000000 -3c09e171 -3529e238 -3c08800d -3403e171 -3c010001 -00280821 -ac29f290 -25040004 -2505fff8 -3c010001 -00240821 -ac24f290 -3c010001 -00250821 -ac25f290 -3c020001 -00481021 -9442f292 -3c050001 -00a42821 -8ca5f290 -3c040001 -00852021 -8c84f290 -3c060001 -00c53021 -8cc6f290 -1443051b -00000000 -3c092d81 -3529ef10 -3c08800d -3403ef10 -3c010001 -00280821 -ac29f260 -25040004 -2505fff8 -3c010001 -00240821 -ac24f260 -3c010001 -00250821 -ac25f260 -3c020001 -00481021 -9442f260 -3c050001 -00a42821 -8ca5f260 -3c040001 -00852021 -8c84f260 -3c060001 -00c53021 -8cc6f260 -144304fe -00000000 -3c091824 -35293d74 -3c08800d -24033d74 -3c010001 -00280821 -ac29b988 -25040004 -2505fff8 -3c010001 -00240821 -ac24b988 -3c010001 -00250821 -ac25b988 -3c020001 -00481021 -9442b988 -3c050001 -00a42821 -8ca5b988 -3c040001 -00852021 -8c84b988 -3c060001 -00c53021 -8cc6b988 -144304e1 -00000000 -3c09d9a5 -35293a80 -3c08800d -3403d9a5 -ad097864 -25040004 -2505fff8 -ac847864 -aca57864 -95027866 -8c857864 -8ca47864 -8ca67864 -144304d2 -00000000 -3c09560c -3529e2f8 -3c08800d -2403560c -3c010001 -00280821 -ac29cec0 -25040004 -2505fff8 -3c010001 -00240821 -ac24cec0 -3c010001 -00250821 -ac25cec0 -3c020001 -00481021 -9442cec2 -3c050001 -00a42821 -8ca5cec0 -3c040001 -00852021 -8c84cec0 -3c060001 -00c53021 -8cc6cec0 -144304b5 -00000000 -3c095f5c -35297885 -3c08800d -24037885 -ad096040 -25040004 -2505fff8 -ac846040 -aca56040 -95026040 -8c856040 -8ca46040 -8ca66040 -144304a6 -00000000 -3c094490 -3529a4d6 -3c08800d -3403a4d6 -3c010001 -00280821 -ac29b7dc -25040004 -2505fff8 -3c010001 -00240821 -ac24b7dc -3c010001 -00250821 -ac25b7dc -3c020001 -00481021 -9442b7dc -3c050001 -00a42821 -8ca5b7dc -3c040001 -00852021 -8c84b7dc -3c060001 -00c53021 -8cc6b7dc -14430489 -00000000 -3c093773 -3529e260 -3c08800d -24033773 -3c010001 -00280821 -ac29e7ac -25040004 -2505fff8 -3c010001 -00240821 -ac24e7ac -3c010001 -00250821 -ac25e7ac -3c020001 -00481021 -9442e7ae -3c050001 -00a42821 -8ca5e7ac -3c040001 -00852021 -8c84e7ac -3c060001 -00c53021 -8cc6e7ac -1443046c -00000000 -3c09c030 -3529663c -3c08800d -2403663c -3c010001 -00280821 -ac2987c0 -25040004 -2505fff8 -3c010001 -00240821 -ac2487c0 -3c010001 -00250821 -ac2587c0 -3c020001 -00481021 -944287c0 -3c050001 -00a42821 -8ca587c0 -3c040001 -00852021 -8c8487c0 -3c060001 -00c53021 -8cc687c0 -1443044f -00000000 -3c091ae3 -35293eb0 -3c08800d -24033eb0 -3c010001 -00280821 -ac29fad8 -25040004 -2505fff8 -3c010001 -00240821 -ac24fad8 -3c010001 -00250821 -ac25fad8 -3c020001 -00481021 -9442fad8 -3c050001 -00a42821 -8ca5fad8 -3c040001 -00852021 -8c84fad8 -3c060001 -00c53021 -8cc6fad8 -14430432 -00000000 -3c0998b6 -3529446a -3c08800d -2403446a -ad094a54 -25040004 -2505fff8 -ac844a54 -aca54a54 -95024a54 -8c854a54 -8ca44a54 -8ca64a54 -14430423 -00000000 -3c097140 -35298da5 -3c08800d -24037140 -ad091550 -25040004 -2505fff8 -ac841550 -aca51550 -95021552 -8c851550 -8ca41550 -8ca61550 -14430414 -00000000 -3c09f770 -3529e08c -3c08800d -3403e08c -ad094f5c -25040004 -2505fff8 -ac844f5c -aca54f5c -95024f5c -8c854f5c -8ca44f5c -8ca64f5c -14430405 -00000000 -3c0985d9 -3529af84 -3c08800d -340385d9 -3c010001 -00280821 -ac2998ec -25040004 -2505fff8 -3c010001 -00240821 -ac2498ec -3c010001 -00250821 -ac2598ec -3c020001 -00481021 -944298ee -3c050001 -00a42821 -8ca598ec -3c040001 -00852021 -8c8498ec -3c060001 -00c53021 -8cc698ec -144303e8 -00000000 -3c096c75 -35291620 -3c08800d -24031620 -ad094540 -25040004 -2505fff8 -ac844540 -aca54540 -95024540 -8c854540 -8ca44540 -8ca64540 -144303d9 -00000000 -3c093ee7 -3529efac -3c08800d -3403efac -ad092f20 -25040004 -2505fff8 -ac842f20 -aca52f20 -95022f20 -8c852f20 -8ca42f20 -8ca62f20 -144303ca -00000000 -3c094ff9 -352944b5 -3c08800d -24034ff9 -3c010001 -00280821 -ac29e73c -25040004 -2505fff8 -3c010001 -00240821 -ac24e73c -3c010001 -00250821 -ac25e73c -3c020001 -00481021 -9442e73e -3c050001 -00a42821 -8ca5e73c -3c040001 -00852021 -8c84e73c -3c060001 -00c53021 -8cc6e73c -144303ad -00000000 -3c0917f3 -3529a4e0 -3c08800d -3403a4e0 -ad096cfc -25040004 -2505fff8 -ac846cfc -aca56cfc -95026cfc -8c856cfc -8ca46cfc -8ca66cfc -1443039e -00000000 -3c09ff75 -352914e0 -3c08800d -3403ff75 -ad094460 -25040004 -2505fff8 -ac844460 -aca54460 -95024462 -8c854460 -8ca44460 -8ca64460 -1443038f -00000000 -3c09343a -35293fd0 -3c08800d -24033fd0 -ad094b00 -25040004 -2505fff8 -ac844b00 -aca54b00 -95024b00 -8c854b00 -8ca44b00 -8ca64b00 -14430380 -00000000 -3c09dde8 -35294990 -3c08800d -3403dde8 -3c010001 -00280821 -ac29dcd4 -25040004 -2505fff8 -3c010001 -00240821 -ac24dcd4 -3c010001 -00250821 -ac25dcd4 -3c020001 -00481021 -9442dcd6 -3c050001 -00a42821 -8ca5dcd4 -3c040001 -00852021 -8c84dcd4 -3c060001 -00c53021 -8cc6dcd4 -14430363 -00000000 -3c0963ea -3529e1b4 -3c08800d -3403e1b4 -3c010001 -00280821 -ac29fc1c -25040004 -2505fff8 -3c010001 -00240821 -ac24fc1c -3c010001 -00250821 -ac25fc1c -3c020001 -00481021 -9442fc1c -3c050001 -00a42821 -8ca5fc1c -3c040001 -00852021 -8c84fc1c -3c060001 -00c53021 -8cc6fc1c -14430346 -00000000 -3c09b899 -352937ac -3c08800d -240337ac -ad090f28 -25040004 -2505fff8 -ac840f28 -aca50f28 -95020f28 -8c850f28 -8ca40f28 -8ca60f28 -14430337 -00000000 -3c095b12 -3529d590 -3c08800d -24035b12 -ad0906cc -25040004 -2505fff8 -ac8406cc -aca506cc -950206ce -8c8506cc -8ca406cc -8ca606cc -14430328 -00000000 -3c099246 -35299cd8 -3c08800d -34039cd8 -3c010001 -00280821 -ac29cde0 -25040004 -2505fff8 -3c010001 -00240821 -ac24cde0 -3c010001 -00250821 -ac25cde0 -3c020001 -00481021 -9442cde0 -3c050001 -00a42821 -8ca5cde0 -3c040001 -00852021 -8c84cde0 -3c060001 -00c53021 -8cc6cde0 -1443030b -00000000 -3c09f9f1 -352957b4 -3c08800d -3403f9f1 -ad09026c -25040004 -2505fff8 -ac84026c -aca5026c -9502026e -8c85026c -8ca4026c -8ca6026c -144302fc -00000000 -3c098ef2 -35294670 -3c08800d -24034670 -ad0972c4 -25040004 -2505fff8 -ac8472c4 -aca572c4 -950272c4 -8c8572c4 -8ca472c4 -8ca672c4 -144302ed -00000000 -3c09d21d -3529d8d4 -3c08800d -3403d8d4 -ad090e6c -25040004 -2505fff8 -ac840e6c -aca50e6c -95020e6c -8c850e6c -8ca40e6c -8ca60e6c -144302de -00000000 -3c094a81 -35297048 -3c08800d -24037048 -3c010001 -00280821 -ac29ada0 -25040004 -2505fff8 -3c010001 -00240821 -ac24ada0 -3c010001 -00250821 -ac25ada0 -3c020001 -00481021 -9442ada0 -3c050001 -00a42821 -8ca5ada0 -3c040001 -00852021 -8c84ada0 -3c060001 -00c53021 -8cc6ada0 -144302c1 -00000000 -3c09c724 -352984d3 -3c08800d -340384d3 -3c010001 -00280821 -ac29e128 -25040004 -2505fff8 -3c010001 -00240821 -ac24e128 -3c010001 -00250821 -ac25e128 -3c020001 -00481021 -9442e128 -3c050001 -00a42821 -8ca5e128 -3c040001 -00852021 -8c84e128 -3c060001 -00c53021 -8cc6e128 -144302a4 -00000000 -3c093c69 -3529df38 -3c08800d -24033c69 -ad0961a8 -25040004 -2505fff8 -ac8461a8 -aca561a8 -950261aa -8c8561a8 -8ca461a8 -8ca661a8 -14430295 -00000000 -3c0940bb -35291d20 -3c08800d -24031d20 -3c010001 -00280821 -ac29cd88 -25040004 -2505fff8 -3c010001 -00240821 -ac24cd88 -3c010001 -00250821 -ac25cd88 -3c020001 -00481021 -9442cd88 -3c050001 -00a42821 -8ca5cd88 -3c040001 -00852021 -8c84cd88 -3c060001 -00c53021 -8cc6cd88 -14430278 -00000000 -3c096fd0 -352977e8 -3c08800d -24036fd0 -3c010001 -00280821 -ac29bef0 -25040004 -2505fff8 -3c010001 -00240821 -ac24bef0 -3c010001 -00250821 -ac25bef0 -3c020001 -00481021 -9442bef2 -3c050001 -00a42821 -8ca5bef0 -3c040001 -00852021 -8c84bef0 -3c060001 -00c53021 -8cc6bef0 -1443025b -00000000 -3c093065 -35295800 -3c08800d -24033065 -ad093cf4 -25040004 -2505fff8 -ac843cf4 -aca53cf4 -95023cf6 -8c853cf4 -8ca43cf4 -8ca63cf4 -1443024c -00000000 -3c09a6da -3529d5ca -3c08800d -3403d5ca -ad094bb8 -25040004 -2505fff8 -ac844bb8 -aca54bb8 -95024bb8 -8c854bb8 -8ca44bb8 -8ca64bb8 -1443023d -00000000 -3c090eaa -35290400 -3c08800d -24030400 -ad091250 -25040004 -2505fff8 -ac841250 -aca51250 -95021250 -8c851250 -8ca41250 -8ca61250 -1443022e -00000000 -3c09eaf4 -35297838 -3c08800d -24037838 -ad092d30 -25040004 -2505fff8 -ac842d30 -aca52d30 -95022d30 -8c852d30 -8ca42d30 -8ca62d30 -1443021f -00000000 -3c099f61 -35297ab8 -3c08800d -24037ab8 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020000 -8c850000 -8ca40000 -8ca60000 -14430210 -00000000 -3c094d02 -3529ec52 -3c08800d -24034d02 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020002 -8c850000 -8ca40000 -8ca60000 -14430201 -00000000 -3c09f9af -3529c020 -3c08800d -3403f9af -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020002 -8c850000 -8ca40000 -8ca60000 -144301f2 -00000000 -3c09dfc9 -3529f4d0 -3c08800d -3403dfc9 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020002 -8c850000 -8ca40000 -8ca60000 -144301e3 -00000000 -3c095d92 -3529570c -3c08800d -2403570c -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020000 -8c850000 -8ca40000 -8ca60000 -144301d4 -00000000 -3c09b450 -3529b400 -3c08800d -3403b450 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020002 -8c850000 -8ca40000 -8ca60000 -144301c5 -00000000 -3c0995fd -3529c700 -3c08800d -3403c700 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020000 -8c850000 -8ca40000 -8ca60000 -144301b6 -00000000 -3c091364 -3529eca0 -3c08800d -24031364 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020002 -8c850000 -8ca40000 -8ca60000 -144301a7 -00000000 -3c09a207 -352908ef -3c08800d -3403a207 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020002 -8c850000 -8ca40000 -8ca60000 -14430198 -00000000 -3c09029d -35297ff0 -3c08800d -2403029d -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020002 -8c850000 -8ca40000 -8ca60000 -14430189 -00000000 -3c09c513 -3529af92 -3c08800d -3403c513 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020002 -8c850000 -8ca40000 -8ca60000 -1443017a -00000000 -3c0917d8 -3529be62 -3c08800d -3403be62 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020000 -8c850000 -8ca40000 -8ca60000 -1443016b -00000000 -3c09bcc5 -3529cb24 -3c08800d -3403bcc5 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020002 -8c850000 -8ca40000 -8ca60000 -1443015c -00000000 -3c0944e5 -3529ce74 -3c08800d -3403ce74 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020000 -8c850000 -8ca40000 -8ca60000 -1443014d -00000000 -3c09870f -35295910 -3c08800d -24035910 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020000 -8c850000 -8ca40000 -8ca60000 -1443013e -00000000 -3c09a322 -3529c100 -3c08800d -3403a322 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020002 -8c850000 -8ca40000 -8ca60000 -1443012f -00000000 -3c09e648 -352919f0 -3c08800d -3403e648 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020002 -8c850000 -8ca40000 -8ca60000 -14430120 -00000000 -3c09bd84 -352927c0 -3c08800d -240327c0 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020000 -8c850000 -8ca40000 -8ca60000 -14430111 -00000000 -3c09c513 -35297e48 -3c08800d -3403c513 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020002 -8c850000 -8ca40000 -8ca60000 -14430102 -00000000 -3c095d98 -352904c0 -3c08800d -24035d98 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020002 -8c850000 -8ca40000 -8ca60000 -144300f3 -00000000 -3c09f04c -3529a5a8 -3c08800d -3403a5a8 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020000 -8c850000 -8ca40000 -8ca60000 -144300e4 -00000000 -3c09be9c -35290a40 -3c08800d -24030a40 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020000 -8c850000 -8ca40000 -8ca60000 -144300d5 -00000000 -3c091998 -35299770 -3c08800d -24031998 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020002 -8c850000 -8ca40000 -8ca60000 -144300c6 -00000000 -3c09a98e -35294e64 -3c08800d -3403a98e -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020002 -8c850000 -8ca40000 -8ca60000 -144300b7 -00000000 -3c09bde4 -35292a40 -3c08800d -24032a40 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020000 -8c850000 -8ca40000 -8ca60000 -144300a8 -00000000 -3c09b6a2 -35294340 -3c08800d -3403b6a2 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020002 -8c850000 -8ca40000 -8ca60000 -14430099 -00000000 -3c09adcf -352971e4 -3c08800d -240371e4 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020000 -8c850000 -8ca40000 -8ca60000 -1443008a -00000000 -3c094362 -3529a106 -3c08800d -24034362 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020002 -8c850000 -8ca40000 -8ca60000 -1443007b -00000000 -3c0942f7 -35297dee -3c08800d -240342f7 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020002 -8c850000 -8ca40000 -8ca60000 -1443006c -00000000 -3c098def -352996d0 -3c08800d -340396d0 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020000 -8c850000 -8ca40000 -8ca60000 -1443005d -00000000 -3c09cf08 -35293100 -3c08800d -3403cf08 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020002 -8c850000 -8ca40000 -8ca60000 -1443004e -00000000 -3c09ace8 -35294af0 -3c08800d -24034af0 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020000 -8c850000 -8ca40000 -8ca60000 -1443003f -00000000 -3c09c5d1 -3529d550 -3c08800d -3403c5d1 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020002 -8c850000 -8ca40000 -8ca60000 -14430030 -00000000 -3c09fade -35291c80 -3c08800d -24031c80 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020000 -8c850000 -8ca40000 -8ca60000 -14430021 -00000000 -3c092579 -3529310c -3c08800d -24032579 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020002 -8c850000 -8ca40000 -8ca60000 -14430012 -00000000 -24090000 -3c08800d -24030000 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -95020000 -8c850000 -8ca40000 -8ca60000 -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -26100001 -3c08800d -24120008 -ad120000 -40805800 -3c170040 -40976000 -00000000 -3c170008 -3c14bfc5 -2694c9c4 -3c070040 -34e7ff01 -2402ffff -3c03000f -3463f2ff -40804800 -40825800 -40876000 -00000000 -40836800 -1000ffff -00000000 -16570078 -00000000 -24120008 -3c14bfc5 -2694ca0c -ad080004 -ad140004 -3c070040 -34e7ff01 -2402ffff -3403f1ff -40804800 -40825800 -40876000 -00000000 -40836800 -1000ffff -00000000 -ad140000 -8d090004 -15340064 -00000000 -16570062 -00000000 -24120008 -ad120000 -24120008 -3c14bfc5 -2694ca6c -01000011 -0110001b -3c070040 -34e7ff01 -2402ffff -24030100 -40804800 -40825800 -40876000 -00000000 -40836800 -1000ffff -00000000 -00004810 -1128004d -00000000 -1657004b -00000000 -24120008 -3c14bfc5 -2694cab8 -3c070040 -34e7ff01 -2402ffff -24030200 -40804800 -40825800 -40876000 -00000000 -40836800 -1000ffff -00000000 -0208001b -1657003a -00000000 -24120008 -3c14bfc5 -2694cb04 -01000013 -01100019 -3c070040 -34e7ff01 -2402ffff -24030300 -40804800 -40825800 -40876000 -00000000 -40836800 -1000ffff -00000000 -00004810 -11280027 -00000000 -16570025 -00000000 -24120008 -3c14bfc5 -2694cb50 -3c070040 -34e7ff01 -2402ffff -24030500 -40804800 -40825800 -40876000 -00000000 -40836800 -1000ffff -00000000 -01120019 -16570014 -00000000 -24120008 -3c14bfc5 -2694cb98 -40927000 -3c070040 -34e7ff01 -2402ffff -24030f00 -40804800 -40825800 -40876000 -00000000 -40836800 -1000ffff -00000000 -40887000 -16570002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -00000000 -26100001 -24120000 -3c085c95 -3508951a -3c09ca00 -3529c414 -3c034800 -34638410 -01091024 -144309be -00000000 -3c089ba8 -3508ba70 -3c09e99f -3529ce38 -3c038988 -34638a30 -01091024 -144309b5 -00000000 -3c08d303 -350819e0 -3c090ba4 -3529cff6 -3c030300 -346309e0 -01091024 -144309ac -00000000 -3c08ce69 -350812e8 -3c096676 -3529b20e -3c034660 -34631208 -01091024 -144309a3 -00000000 -3c081d33 -35087960 -3c09744d -3529d280 -3c031401 -34635000 -01091024 -1443099a -00000000 -3c087956 -35085822 -3c09d58a -352973c7 -3c035102 -34635002 -01091024 -14430991 -00000000 -3c085493 -3508ce59 -3c09a7e9 -35295630 -3c030481 -34634610 -01091024 -14430988 -00000000 -3c084a90 -3508f478 -3c09dea1 -35296664 -3c034a80 -34636460 -01091024 -1443097f -00000000 -3c08912e -3508db93 -3c098f4b -35299870 -3c03810a -34639810 -01091024 -14430976 -00000000 -3c080804 -35080b84 -3c09fa97 -3529e908 -3c030804 -34630900 -01091024 -1443096d -00000000 -3c08187a -35081708 -3c09ff84 -3529714a -3c031800 -34631108 -01091024 -14430964 -00000000 -3c08b139 -3508ef3d -3c090008 -3529d970 -3c030008 -3463c930 -01091024 -1443095b -00000000 -3c08a572 -350871c0 -3c09a2ee -35299b84 -3c03a062 -34631180 -01091024 -14430952 -00000000 -3c08d62b -35082c40 -3c09126b -3529c8b0 -3c03122b -34630800 -01091024 -14430949 -00000000 -3c086a13 -3508dd76 -3c097d18 -3529d2c0 -3c036810 -3463d040 -01091024 -14430940 -00000000 -3c08c5a4 -35083778 -3c097c92 -3529bbcf -3c034480 -34633348 -01091024 -14430937 -00000000 -3c08d2d2 -35082752 -3c09a85f -3529cf0e -3c038052 -34630702 -01091024 -1443092e -00000000 -3c08a010 -350804f0 -3c096447 -3529566b -3c032000 -34630460 -01091024 -14430925 -00000000 -3c08ef20 -350875c0 -3c09494b -35291e41 -3c034900 -34631440 -01091024 -1443091c -00000000 -3c087156 -3508a5d8 -3c0965b5 -35295820 -3c036114 -01091024 -14430914 -00000000 -3c0831c7 -350896ae -3c09b49c -35294a52 -3c033084 -34630202 -01091024 -1443090b -00000000 -3c087623 -35082809 -3c0914ca -3529ecb0 -3c031402 -34632800 -01091024 -14430902 -00000000 -3c0829c6 -35087a68 -3c09977d -3529e748 -3c030144 -34636248 -01091024 -144308f9 -00000000 -3c08391a -3508132c -3c09db8c -35298240 -3c031908 -34630200 -01091024 -144308f0 -00000000 -3c086261 -350887d0 -3c097dee -35294ac8 -3c036060 -346302c0 -01091024 -144308e7 -00000000 -3c086704 -35081d46 -3c099cc9 -3529d008 -3c030400 -34631000 -01091024 -144308de -00000000 -3c08dc40 -3508afb0 -3c094635 -35298b58 -3c034400 -34638b10 -01091024 -144308d5 -00000000 -3c08a1d7 -3508e318 -3c0971e9 -35291fb8 -3c0321c1 -34630318 -01091024 -144308cc -00000000 -3c0858b0 -3508656c -3c09d2c9 -35299848 -3c035080 -34630048 -01091024 -144308c3 -00000000 -3c08d575 -35083bfd -3c09389d -3529ed57 -3c031015 -34632955 -01091024 -144308ba -00000000 -3c088973 -3508d568 -3c09394a -3529db92 -3c030942 -3463d100 -01091024 -144308b1 -00000000 -3c08d22a -35089760 -3c0986cd -35299020 -3c038208 -34639020 -01091024 -144308a8 -00000000 -3c084325 -35089f97 -3c0989d3 -35296232 -3c030101 -34630212 -01091024 -1443089f -00000000 -3c089e07 -3508993a -3c094368 -3529b090 -3c030200 -34639010 -01091024 -14430896 -00000000 -3c083f83 -35088050 -3c091686 -3529ce40 -3c031682 -34638040 -01091024 -1443088d -00000000 -3c08df67 -3508503c -3c090972 -35293ea0 -3c030962 -34631020 -01091024 -14430884 -00000000 -3c089450 -35088308 -3c0963b7 -35299ec0 -3c030010 -34638200 -01091024 -1443087b -00000000 -3c08b835 -35085a8c -3c090188 -35299dac -2403188c -01091024 -14430873 -00000000 -3c08963f -35088820 -3c097e5a -3529d680 -3c03161a -34638000 -01091024 -1443086a -00000000 -3c082abd -3508583c -3c09aaa6 -35297038 -3c032aa4 -34635038 -01091024 -14430861 -00000000 -3c089614 -3508d1c0 -3c09407f -3529c954 -3c030014 -3463c140 -01091024 -14430858 -00000000 -3c083a19 -35084614 -3c09df54 -3529fd98 -3c031a10 -34634410 -01091024 -1443084f -00000000 -3c08664c -35085f4c -3c0961dc -3529f9b6 -3c03604c -34635904 -01091024 -14430846 -00000000 -3c080a6d -3508fca6 -3c09b2a5 -352943b7 -3c030225 -346340a6 -01091024 -1443083d -00000000 -3c083fee -35083f38 -3c09ee41 -3529ccd5 -3c032e40 -34630c10 -01091024 -14430834 -00000000 -3c08fd1e -35080666 -3c099e5c -35297518 -3c039c1c -34630400 -01091024 -1443082b -00000000 -3c085d3e -3508b4a0 -3c09f9a6 -35293dc4 -3c035926 -34633480 -01091024 -14430822 -00000000 -3c0858a1 -35080760 -3c099e6f -3529d2cf -3c031821 -34630240 -01091024 -14430819 -00000000 -3c0819c9 -35082068 -3c097462 -35292ce0 -3c031040 -34632060 -01091024 -14430810 -00000000 -3c08230d -3508dea0 -3c09c480 -352954b4 -240354a0 -01091024 -14430808 -00000000 -3c0866c9 -35086ea6 -3c09f48a -3529d438 -3c036488 -34634420 -01091024 -144307ff -00000000 -3c08b7b6 -3508adee -3c09dac2 -35294448 -3c039282 -34630448 -01091024 -144307f6 -00000000 -3c085ce5 -35082f02 -3c09f5ba -3529d1b8 -3c0354a0 -34630100 -01091024 -144307ed -00000000 -3c08ddc0 -35083c20 -3c09e2d1 -3529e3c8 -3c03c0c0 -34632000 -01091024 -144307e4 -00000000 -3c082914 -350851e0 -3c09c57a -3529f0f6 -3c030110 -346350e0 -01091024 -144307db -00000000 -3c08ae67 -3508581c -3c09682f -352982c4 -3c032827 -34630004 -01091024 -144307d2 -00000000 -3c0858bd -35085420 -3c09b86e -3529c92d -3c03182c -34634020 -01091024 -144307c9 -00000000 -3c0871e2 -350800cc -3c091187 -3529e734 -3c031182 -34630004 -01091024 -144307c0 -00000000 -3c083dfa -350866e2 -3c09cc6c -3529689a -3c030c68 -34636082 -01091024 -144307b7 -00000000 -3c087a9f -35081a82 -3c09088c -3529f068 -3c03088c -34631000 -01091024 -144307ae -00000000 -3c08e4f5 -3508af34 -3c09c4fb -35299ff0 -3c03c4f1 -34638f30 -01091024 -144307a5 -00000000 -3c082e8a -3508fda6 -3c0901d5 -35297b80 -3c030080 -34637980 -01091024 -1443079c -00000000 -3c08375d -35085662 -3c0968ab -3529e84c -3c032009 -34634040 -01091024 -14430793 -00000000 -3c08eaa2 -3508d9e4 -3c09c0b3 -35293098 -3c03c0a2 -34631080 -01091024 -1443078a -00000000 -3c0816b5 -35083118 -3c090905 -3529f9d8 -3c030005 -34633118 -01091024 -14430781 -00000000 -3c08c5a0 -35085764 -3c09094b -352922be -3c030100 -34630224 -01091024 -14430778 -00000000 -3c08d543 -3508a900 -3c09c411 -3529b348 -3c03c401 -3463a100 -01091024 -1443076f -00000000 -3c08cb5c -3508743f -3c0941f2 -35297449 -3c034150 -34637409 -01091024 -14430766 -00000000 -3c0860f4 -3508e19c -3c0925fd -35292d68 -3c0320f4 -34632108 -01091024 -1443075d -00000000 -3c086abd -3508680b -3c09ca54 -35290db0 -3c034a14 -34630800 -01091024 -14430754 -00000000 -3c081fd7 -3508068c -3c09509a -352975c5 -3c031092 -34630484 -01091024 -1443074b -00000000 -3c08883d -35086f28 -3c090031 -35296ec0 -3c030031 -34636e00 -01091024 -14430742 -00000000 -3c086dce -35085980 -3c0960a2 -3529bfc4 -3c036082 -34631980 -01091024 -14430739 -00000000 -3c088f77 -35084a4c -3c09ade4 -35290fa9 -3c038d64 -34630a08 -01091024 -14430730 -00000000 -3c0851d8 -35081d44 -3c099660 -35291268 -3c031040 -34631040 -01091024 -14430727 -00000000 -3c08774c -350828d0 -3c09a307 -35291a42 -3c032304 -34630840 -01091024 -1443071e -00000000 -3c0808ce -35083455 -3c09416f -3529a198 -3c03004e -34632010 -01091024 -14430715 -00000000 -3c080500 -35087c06 -3c090b03 -352991b0 -3c030100 -34631000 -01091024 -1443070c -00000000 -3c081ee2 -3508dbb6 -3c0907a2 -3529999a -3c0306a2 -34639992 -01091024 -14430703 -00000000 -3c08e1f7 -35085750 -3c09997a -35299eb2 -3c038172 -34631610 -01091024 -144306fa -00000000 -3c082d91 -35088f40 -3c09d083 -35295f38 -3c030081 -34630f00 -01091024 -144306f1 -00000000 -3c08bd70 -35083e4c -3c095ded -3529f7a8 -3c031d60 -34633608 -01091024 -144306e8 -00000000 -3c083636 -35088f00 -3c090446 -3529f408 -3c030406 -34638400 -01091024 -144306df -00000000 -3c0802cb -3508c9f8 -3c09727f -35295d2c -3c03024b -34634928 -01091024 -144306d6 -00000000 -3c08effb -350832d0 -3c094c2e -3529e094 -3c034c2a -34632090 -01091024 -144306cd -00000000 -3c085b22 -35088e0c -3c09d01a -352952b8 -3c035002 -34630208 -01091024 -144306c4 -00000000 -3c0875a2 -3508aa1d -3c09518b -35297d38 -3c035182 -34632818 -01091024 -144306bb -00000000 -3c08d295 -35082800 -3c092e70 -3529c5ad -3c030210 -01091024 -144306b3 -00000000 -3c0875ad -350893f8 -3c099bd4 -3529e22a -3c031184 -34638228 -01091024 -144306aa -00000000 -3c08e6e6 -3508b078 -3c0964ee -3529e100 -3c0364e6 -3463a000 -01091024 -144306a1 -00000000 -3c08f9e9 -3508e608 -3c0911cf -35290d68 -3c0311c9 -34630408 -01091024 -14430698 -00000000 -3c081e8c -35087440 -3c09b523 -35291f34 -3c031400 -34631400 -01091024 -1443068f -00000000 -3c08be13 -3508d325 -3c098b33 -3529d5a8 -3c038a13 -3463d120 -01091024 -14430686 -00000000 -3c08e4ea -3508ac90 -3c097898 -3529f834 -3c036088 -3463a810 -01091024 -1443067d -00000000 -3c086e6f -350851e9 -3c095569 -3529e434 -3c034469 -34634020 -01091024 -14430674 -00000000 -3c082f1c -350841ac -3c09f9ab -35290400 -3c032908 -01091024 -1443066c -00000000 -3c08d181 -35084c80 -3c091772 -3529c9e0 -3c031100 -34634880 -01091024 -14430663 -00000000 -3c086fe2 -3508c2a8 -3c09a96f -35299682 -3c032962 -34638280 -01091024 -1443065a -00000000 -3c0898e9 -35089e80 -3c0902c3 -3529120e -3c0300c1 -34631200 -01091024 -14430651 -00000000 -3c08fb3a -3508d4a4 -3c093e60 -35294bc8 -3c033a20 -34634080 -01091024 -14430648 -00000000 -3c0809a2 -3508b564 -3c0915fc -35296a5c -3c0301a0 -34632044 -01091024 -1443063f -00000000 -3c089cb5 -35081c3c -3c099f8c -3529c7a7 -3c039c84 -34630424 -01091024 -14430636 -00000000 -3c081325 -35086570 -3c094b1c -35294d77 -3c030304 -34634570 -01091024 -1443062d -00000000 -3c081854 -3508110c -3c09cd22 -35299890 -3c030800 -34631000 -01091024 -14430624 -00000000 -3c08e17c -3508db10 -3c0942ef -3529f3b8 -3c03406c -3463d310 -01091024 -1443061b -00000000 -3c089dd4 -3508be60 -3c09b06e -35299f50 -3c039044 -34639e40 -01091024 -14430612 -00000000 -3c080a10 -3508b4c0 -3c09e94a -3529e0e0 -3c030800 -3463a0c0 -01091024 -14430609 -00000000 -3c08fa59 -35083c4f -3c099ae9 -35299c83 -3c039a49 -34631c03 -01091024 -14430600 -00000000 -3c083743 -350898c0 -3c09fcfd -3529ce70 -3c033441 -34638840 -01091024 -144305f7 -00000000 -3c080eaf -350804d3 -3c099644 -35296480 -3c030604 -34630480 -01091024 -144305ee -00000000 -3c08b326 -35082e98 -3c09d661 -3529455e -3c039220 -34630418 -01091024 -144305e5 -00000000 -3c084de0 -3508a5fe -3c09a247 -35297fdc -3c030040 -346325dc -01091024 -144305dc -00000000 -3c0879d7 -35083190 -3c09aeaf -35296288 -3c032887 -34632080 -01091024 -144305d3 -00000000 -3c087d91 -35088ced -3c094839 -352952b8 -3c034811 -346300a8 -01091024 -144305ca -00000000 -3c08ffaa -3508b2aa -3c09811d -35292bc5 -3c038108 -34632280 -01091024 -144305c1 -00000000 -3c08e1da -3508d258 -3c09b36d -35293b4a -3c03a148 -34631248 -01091024 -144305b8 -00000000 -3c08605b -350869d2 -3c0981df -35297d66 -3c03005b -34636942 -01091024 -144305af -00000000 -3c08e2a6 -3508fc4c -3c0903c5 -3529ef88 -3c030284 -3463ec08 -01091024 -144305a6 -00000000 -3c080ae2 -3508faf0 -3c097631 -3529f787 -3c030220 -3463f280 -01091024 -1443059d -00000000 -3c08429a -35089660 -3c09cb74 -35294c88 -3c034210 -34630400 -01091024 -14430594 -00000000 -3c08edd2 -3508cbdb -3c097157 -3529d1cf -3c036152 -3463c1cb -01091024 -1443058b -00000000 -3c08f52c -3508d4d8 -3c09f1e8 -3529e638 -3c03f128 -3463c418 -01091024 -14430582 -00000000 -3c08ead9 -35086490 -3c0914cb -3529f1ff -3c0300c9 -34636090 -01091024 -14430579 -00000000 -3c081714 -35080ee8 -3c09f2a8 -35299e0a -3c031200 -34630e08 -01091024 -14430570 -00000000 -3c0836ff -350856c8 -3c09b4b1 -35290f70 -3c0334b1 -34630640 -01091024 -14430567 -00000000 -3c08d898 -3508efff -3c09446a -3529f848 -3c034008 -3463e848 -01091024 -1443055e -00000000 -3c087a41 -3508e84b -3c092420 -352908fc -3c032000 -34630848 -01091024 -14430555 -00000000 -3c0878fd -35087d50 -3c09a94c -35290ec0 -3c03284c -34630c40 -01091024 -1443054c -00000000 -3c08d8ad -3508f880 -3c097cc9 -35293ebe -3c035889 -34633880 -01091024 -14430543 -00000000 -3c08387b -35088f44 -3c09a8c3 -35290a7c -3c032843 -34630a44 -01091024 -1443053a -00000000 -3c083ecb -35089950 -3c093b65 -35296b94 -3c033a41 -34630910 -01091024 -14430531 -00000000 -3c0832d6 -35084de0 -3c093cf0 -35299380 -3c0330d0 -34630180 -01091024 -14430528 -00000000 -3c08bc21 -3508a900 -3c09a8a8 -35299884 -3c03a820 -34638800 -01091024 -1443051f -00000000 -3c08dcc2 -3508f196 -3c098e55 -35292cd2 -3c038c40 -34632092 -01091024 -14430516 -00000000 -3c08dd99 -3508d4f8 -3c09b764 -35292ec7 -3c039500 -346304c0 -01091024 -1443050d -00000000 -3c084715 -3508c100 -3c09317d -35295cb6 -3c030115 -34634000 -01091024 -14430504 -00000000 -3c081de7 -3508fe00 -3c092aaf -3529b760 -3c0308a7 -3463b600 -01091024 -144304fb -00000000 -3c0841f6 -35085000 -3c09ea64 -3529e6e0 -3c034064 -34634000 -01091024 -144304f2 -00000000 -3c089f19 -35084d46 -3c09d665 -35294fb0 -3c039601 -34634d00 -01091024 -144304e9 -00000000 -3c086fcc -35083b81 -3c099463 -3529a0fa -3c030440 -34632080 -01091024 -144304e0 -00000000 -3c08388c -350801d8 -3c09f9ca -352964ce -3c033888 -346300c8 -01091024 -144304d7 -00000000 -3c087205 -35081d89 -3c09feda -352932e1 -3c037200 -34631081 -01091024 -144304ce -00000000 -3c088487 -3508a910 -3c0917c3 -35292ee7 -3c030483 -34632800 -01091024 -144304c5 -00000000 -3c08a229 -35080a1e -3c09cd7f -35297fb8 -3c038029 -34630a18 -01091024 -144304bc -00000000 -3c0889ee -35087d0e -3c09a6b6 -35297854 -3c0380a6 -34637804 -01091024 -144304b3 -00000000 -3c08e3af -3508c5e0 -3c094503 -3529d98c -3c034103 -3463c180 -01091024 -144304aa -00000000 -3c08d2d1 -35089826 -3c0925a6 -3529c4f0 -3c030080 -34638020 -01091024 -144304a1 -00000000 -3c083a82 -35086eac -3c099681 -3529ca40 -3c031280 -34634a00 -01091024 -14430498 -00000000 -3c08b88d -35088bc0 -3c097706 -3529d5bf -3c033004 -34638180 -01091024 -1443048f -00000000 -3c088823 -3508e582 -3c0970bf -35296ec2 -3c030023 -34636482 -01091024 -14430486 -00000000 -3c08b3ed -35080600 -3c09aaa2 -352924ba -3c03a2a0 -34630400 -01091024 -1443047d -00000000 -3c0802bb -350872c6 -3c095b2f -3529b7b3 -3c03022b -34633282 -01091024 -14430474 -00000000 -3c08be9e -35084a08 -3c09d96e -3529b400 -3c03980e -01091024 -1443046c -00000000 -3c08ba68 -3508b550 -3c09ce2a -3529784e -3c038a28 -34633040 -01091024 -14430463 -00000000 -3c0846f6 -350824c2 -3c09be46 -3529b80c -3c030646 -34632000 -01091024 -1443045a -00000000 -3c08fb3d -3508493a -3c0919ec -3529c5ac -3c03192c -34634128 -01091024 -14430451 -00000000 -3c084975 -35086b24 -3c090769 -3529e878 -3c030161 -34636820 -01091024 -14430448 -00000000 -3c08c7c8 -3508e6aa -3c093252 -35293178 -3c030240 -34632028 -01091024 -1443043f -00000000 -3c08a123 -3508eb6a -3c09a3ae -35296cd0 -3c03a122 -34636840 -01091024 -14430436 -00000000 -3c08aef9 -3508cbe2 -3c09a63f -35298980 -3c03a639 -34638980 -01091024 -1443042d -00000000 -3c081b60 -35083c7a -3c0922fb -35298118 -3c030260 -34630018 -01091024 -14430424 -00000000 -3c089cc1 -3508a068 -3c0948eb -35296673 -3c0308c1 -34632060 -01091024 -1443041b -00000000 -3c085d03 -3508a98c -3c09aa1e -35296c6c -3c030802 -3463280c -01091024 -14430412 -00000000 -3c089aff -35083d4c -3c09b4ad -352929c5 -3c0390ad -34632944 -01091024 -14430409 -00000000 -3c087793 -3508d300 -3c096f3f -3529a5f4 -3c036713 -34638100 -01091024 -14430400 -00000000 -3c084ed4 -350865a6 -3c095017 -35296028 -3c034014 -34636020 -01091024 -144303f7 -00000000 -3c0851a0 -35081a42 -3c091111 -35290ba8 -3c031100 -34630a00 -01091024 -144303ee -00000000 -3c08341e -35081200 -3c09a8ed -352984d0 -3c03200c -01091024 -144303e6 -00000000 -3c088383 -35085ef4 -3c0972cb -35291bf0 -3c030283 -34631af0 -01091024 -144303dd -00000000 -3c08d306 -3508f262 -3c0928cb -35294227 -3c030002 -34634222 -01091024 -144303d4 -00000000 -3c085bcb -35086730 -3c094141 -35290c58 -3c034141 -34630410 -01091024 -144303cb -00000000 -3c08bc8b -35086cd0 -3c0921e1 -352983f0 -3c032081 -346300d0 -01091024 -144303c2 -00000000 -3c089f7a -35083caa -3c09dd0b -35295f80 -3c039d0a -34631c80 -01091024 -144303b9 -00000000 -3c084ee7 -35082240 -3c09932c -3529ca40 -3c030224 -34630240 -01091024 -144303b0 -00000000 -3c08142c -3508a780 -3c09ab28 -3529ff08 -3c030028 -3463a700 -01091024 -144303a7 -00000000 -3c08d9e8 -350826dc -3c090be5 -35297a04 -3c0309e0 -34632204 -01091024 -1443039e -00000000 -3c085b7c -35087790 -3c09131b -3529ded0 -3c031318 -34635690 -01091024 -14430395 -00000000 -3c085bfd -3508dde8 -3c091f93 -3529b01d -3c031b91 -34639008 -01091024 -1443038c -00000000 -3c085d0a -350858d4 -3c094261 -35292acb -3c034000 -346308c0 -01091024 -14430383 -00000000 -3c08df48 -3508d4c4 -3c092f79 -3529e1bc -3c030f48 -3463c084 -01091024 -1443037a -00000000 -3c08e4b0 -35085dfa -3c09bf92 -35297e4c -3c03a490 -34635c48 -01091024 -14430371 -00000000 -3c081169 -35084224 -3c097424 -3529eac0 -3c031020 -34634200 -01091024 -14430368 -00000000 -3c083af8 -3508f490 -3c092ba2 -35294e98 -3c032aa0 -34634490 -01091024 -1443035f -00000000 -3c08bdde -35084f7c -3c094443 -35296ebb -3c030442 -34634e38 -01091024 -14430356 -00000000 -3c088042 -35085208 -3c0967c8 -3529181e -3c030040 -34631008 -01091024 -1443034d -00000000 -3c088eab -3508e257 -3c09dfbe -35296600 -3c038eaa -34636200 -01091024 -14430344 -00000000 -3c085261 -3508d838 -3c09b2c5 -35295d55 -3c031241 -34635810 -01091024 -1443033b -00000000 -3c080c8b -3508d07f -3c095076 -352968bf -3c030002 -3463403f -01091024 -14430332 -00000000 -3c087a1d -3508a4e0 -3c09b23d -3529d994 -3c03321d -34638080 -01091024 -14430329 -00000000 -3c083fcd -35088680 -3c09d445 -3529accf -3c031445 -34638480 -01091024 -14430320 -00000000 -3c08bd41 -35089df8 -3c092917 -352929a0 -3c032901 -346309a0 -01091024 -14430317 -00000000 -3c08ed7a -350882cc -3c09228f -352914e8 -3c03200a -346300c8 -01091024 -1443030e -00000000 -3c088e2d -3508147a -3c096ace -352913d6 -3c030a0c -34631052 -01091024 -14430305 -00000000 -3c08d8d6 -3508f600 -3c09f78e -35293339 -3c03d086 -34633200 -01091024 -144302fc -00000000 -3c086420 -35080240 -3c09b4a8 -3529f680 -3c032420 -34630200 -01091024 -144302f3 -00000000 -3c081425 -350800b0 -3c09099f -3529185d -3c030005 -34630010 -01091024 -144302ea -00000000 -3c08edf8 -3508af32 -3c09743f -3529ec88 -3c036438 -3463ac00 -01091024 -144302e1 -00000000 -3c085e27 -35087858 -3c09c97a -3529a830 -3c034822 -34632810 -01091024 -144302d8 -00000000 -3c08f653 -35089a14 -3c09f1e1 -35296bfc -3c03f041 -34630a14 -01091024 -144302cf -00000000 -3c088241 -35087634 -3c09981f -3529b13b -3c038001 -34633030 -01091024 -144302c6 -00000000 -3c084c9a -3508f998 -24090000 -24030000 -01091024 -144302bf -00000000 -3c08d726 -3508d47a -24090000 -24030000 -01091024 -144302b8 -00000000 -3c08b327 -3508a1df -24090000 -24030000 -01091024 -144302b1 -00000000 -3c088403 -3508fb40 -24090000 -24030000 -01091024 -144302aa -00000000 -3c08c069 -35089822 -24090000 -24030000 -01091024 -144302a3 -00000000 -3c08409c -3508796e -24090000 -24030000 -01091024 -1443029c -00000000 -3c08a7a3 -3508b95c -24090000 -24030000 -01091024 -14430295 -00000000 -3c08d9f9 -35082fee -24090000 -24030000 -01091024 -1443028e -00000000 -3c0808f6 -350863be -24090000 -24030000 -01091024 -14430287 -00000000 -3c081c74 -3508f398 -24090000 -24030000 -01091024 -14430280 -00000000 -3c08369d -3508dca8 -24090000 -24030000 -01091024 -14430279 -00000000 -3c08e4c7 -3508aa7c -24090000 -24030000 -01091024 -14430272 -00000000 -3c082403 -35080842 -24090000 -24030000 -01091024 -1443026b -00000000 -3c088622 -35081f00 -24090000 -24030000 -01091024 -14430264 -00000000 -3c080193 -3508dba6 -24090000 -24030000 -01091024 -1443025d -00000000 -3c08d9a2 -3508e4a0 -24090000 -24030000 -01091024 -14430256 -00000000 -3c08f73b -35086a88 -24090000 -24030000 -01091024 -1443024f -00000000 -3c08a629 -3508a850 -24090000 -24030000 -01091024 -14430248 -00000000 -3c08d975 -350804ee -24090000 -24030000 -01091024 -14430241 -00000000 -3c08d6b5 -350852f5 -24090000 -24030000 -01091024 -1443023a -00000000 -3c087e0c -35086d04 -24090000 -24030000 -01091024 -14430233 -00000000 -3c085765 -3508d22f -24090000 -24030000 -01091024 -1443022c -00000000 -3c086333 -3508244a -24090000 -24030000 -01091024 -14430225 -00000000 -3c08ec84 -3508245a -24090000 -24030000 -01091024 -1443021e -00000000 -3c08a2db -35081ed8 -24090000 -24030000 -01091024 -14430217 -00000000 -3c083a29 -3508d000 -24090000 -24030000 -01091024 -14430210 -00000000 -3c086b63 -3508a800 -24090000 -24030000 -01091024 -14430209 -00000000 -3c08f6a7 -3508d130 -24090000 -24030000 -01091024 -14430202 -00000000 -3c080035 -3508cf7f -24090000 -24030000 -01091024 -144301fb -00000000 -3c0801f8 -35086960 -24090000 -24030000 -01091024 -144301f4 -00000000 -3c0802a8 -3508c850 -24090000 -24030000 -01091024 -144301ed -00000000 -3c08ffb0 -35080bf0 -24090000 -24030000 -01091024 -144301e6 -00000000 -3c083689 -35080d6a -24090000 -24030000 -01091024 -144301df -00000000 -3c080d1f -35082cbe -24090000 -24030000 -01091024 -144301d8 -00000000 -3c084e20 -35082c78 -24090000 -24030000 -01091024 -144301d1 -00000000 -3c08efeb -3508522a -24090000 -24030000 -01091024 -144301ca -00000000 -3c088fde -3508116e -24090000 -24030000 -01091024 -144301c3 -00000000 -3c082eb4 -3508f758 -24090000 -24030000 -01091024 -144301bc -00000000 -3c08f86b -3508ac3e -24090000 -24030000 -01091024 -144301b5 -00000000 -3c081364 -35085b9d -24090000 -24030000 -01091024 -144301ae -00000000 -3c08218a -3508e799 -24090000 -24030000 -01091024 -144301a7 -00000000 -3c08a43e -35084e94 -24090000 -24030000 -01091024 -144301a0 -00000000 -3c0818aa -35081940 -24090000 -24030000 -01091024 -14430199 -00000000 -3c08eaa6 -3508b3d0 -24090000 -24030000 -01091024 -14430192 -00000000 -3c080859 -3508169c -24090000 -24030000 -01091024 -1443018b -00000000 -3c0805b7 -35087720 -24090000 -24030000 -01091024 -14430184 -00000000 -3c08cfee -35083094 -24090000 -24030000 -01091024 -1443017d -00000000 -3c08b2ee -350869a4 -24090000 -24030000 -01091024 -14430176 -00000000 -3c089f73 -3508ccec -24090000 -24030000 -01091024 -1443016f -00000000 -3c088709 -3508e13e -24090000 -24030000 -01091024 -14430168 -00000000 -24080000 -3c0978d0 -3529a5d8 -24030000 -01091024 -14430161 -00000000 -24080000 -3c09cb84 -35291e1e -24030000 -01091024 -1443015a -00000000 -24080000 -3c095c25 -35296710 -24030000 -01091024 -14430153 -00000000 -24080000 -3c09dc48 -3529ef02 -24030000 -01091024 -1443014c -00000000 -24080000 -3c094c56 -352925d9 -24030000 -01091024 -14430145 -00000000 -24080000 -3c097518 -3529257d -24030000 -01091024 -1443013e -00000000 -24080000 -3c0956d7 -352951f0 -24030000 -01091024 -14430137 -00000000 -24080000 -3c09cdfe -3529cd39 -24030000 -01091024 -14430130 -00000000 -24080000 -3c09f72b -35296c80 -24030000 -01091024 -14430129 -00000000 -24080000 -3c09a278 -35293000 -24030000 -01091024 -14430122 -00000000 -24080000 -3c09528f -3529a1d8 -24030000 -01091024 -1443011b -00000000 -24080000 -3c099d58 -35297c76 -24030000 -01091024 -14430114 -00000000 -24080000 -3c09d74d -3529d008 -24030000 -01091024 -1443010d -00000000 -24080000 -3c09b6b2 -3529f338 -24030000 -01091024 -14430106 -00000000 -24080000 -3c09aec6 -3529c5e4 -24030000 -01091024 -144300ff -00000000 -24080000 -3c094c91 -35290a20 -24030000 -01091024 -144300f8 -00000000 -24080000 -3c092b54 -3529adbc -24030000 -01091024 -144300f1 -00000000 -24080000 -3c0954a0 -35299c60 -24030000 -01091024 -144300ea -00000000 -24080000 -3c093a9f -35291a00 -24030000 -01091024 -144300e3 -00000000 -24080000 -3c091ed8 -352910c0 -24030000 -01091024 -144300dc -00000000 -24080000 -3c09d67e -3529f000 -24030000 -01091024 -144300d5 -00000000 -24080000 -3c09eade -352910d2 -24030000 -01091024 -144300ce -00000000 -24080000 -3c0967d8 -3529aac0 -24030000 -01091024 -144300c7 -00000000 -24080000 -3c098db0 -35292619 -24030000 -01091024 -144300c0 -00000000 -24080000 -3c0926d5 -352956ee -24030000 -01091024 -144300b9 -00000000 -24080000 -3c090e8e -3529db30 -24030000 -01091024 -144300b2 -00000000 -24080000 -3c099c2d -35292a0c -24030000 -01091024 -144300ab -00000000 -24080000 -3c099908 -352939c0 -24030000 -01091024 -144300a4 -00000000 -24080000 -3c09723c -352907f1 -24030000 -01091024 -1443009d -00000000 -24080000 -3c0912c8 -35299858 -24030000 -01091024 -14430096 -00000000 -24080000 -3c098e7a -352979a0 -24030000 -01091024 -1443008f -00000000 -24080000 -3c09025e -352935a8 -24030000 -01091024 -14430088 -00000000 -24080000 -3c093050 -35292894 -24030000 -01091024 -14430081 -00000000 -24080000 -3c09c083 -3529695b -24030000 -01091024 -1443007a -00000000 -24080000 -3c09708d -3529009d -24030000 -01091024 -14430073 -00000000 -24080000 -3c094b88 -3529db76 -24030000 -01091024 -1443006c -00000000 -24080000 -3c0905d6 -3529fcfc -24030000 -01091024 -14430065 -00000000 -24080000 -3c09b5a4 -3529f620 -24030000 -01091024 -1443005e -00000000 -24080000 -3c090ac9 -3529d65e -24030000 -01091024 -14430057 -00000000 -24080000 -3c0968f3 -3529fd68 -24030000 -01091024 -14430050 -00000000 -24080000 -3c091841 -35292472 -24030000 -01091024 -14430049 -00000000 -24080000 -3c09128c -3529d0e0 -24030000 -01091024 -14430042 -00000000 -24080000 -3c09777b -35298540 -24030000 -01091024 -1443003b -00000000 -24080000 -3c09fafe -35299838 -24030000 -01091024 -14430034 -00000000 -24080000 -3c09e2a4 -3529a6e4 -24030000 -01091024 -1443002d -00000000 -24080000 -3c093c8b -3529c134 -24030000 -01091024 -14430026 -00000000 -24080000 -3c09dc6f -35291d78 -24030000 -01091024 -1443001f -00000000 -24080000 -3c09b84c -35290500 -24030000 -01091024 -14430018 -00000000 -24080000 -3c0923b4 -35295e2c -24030000 -01091024 -14430011 -00000000 -24080000 -3c0914b9 -35292b6c -24030000 -01091024 -1443000a -00000000 -24080000 -24090000 -24030000 -01091024 -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -00000000 -26100001 -3c08800d -24120006 -ad120000 -40805800 -3c170040 -40976000 -00000000 -3c170006 -3c14b27f -36949789 -3c07b27f -34e79789 -3c15bfc5 -26b5f350 -02800008 -00000000 -16570072 -00000000 -40164000 -14f6006f -00000000 -24120006 -3c14a101 -3694bbed -3c07a101 -34e7bbed -40947000 -3c15bfc5 -26b5f390 -ad080004 -ad140004 -42000018 -ad140000 -8d090004 -15340060 -00000000 -1657005e -00000000 -40164000 -14f6005b -00000000 -24120006 -ad120000 -24120006 -3c148479 -36940977 -3c078479 -34e70977 -40947000 -3c15bfc5 -26b5f3e8 -01000011 -0110001b -42000018 -00004810 -1128004b -00000000 -16570049 -00000000 -40164000 -14f60046 -00000000 -24120006 -3c1492b0 -3694a2c3 -3c0792b0 -34e7a2c3 -3c15bfc5 -26b5f42c -02800008 -00000000 -0208001b -1657003a -00000000 -40164000 -14f60037 -00000000 -24120006 -3c14af9e -3694dafa -3c07af9e -34e7dafa -40947000 -3c15bfc5 -26b5f470 -01000013 -01100019 -42000018 -00004810 -11280029 -00000000 -16570027 -00000000 -40164000 -14f60024 -00000000 -24120006 -3c14b088 -3694f329 -3c07b088 -34e7f329 -3c15bfc5 -26b5f4b4 -02800008 -00000000 -01120019 -16570018 -00000000 -14430016 -00000000 -40164000 -14f60013 -00000000 -24120006 -3c14827f -369497ab -3c07827f -34e797ab -40947000 -3c15bfc5 -26b5f4f8 -42000018 -40887000 -16570007 -00000000 -14430005 -00000000 -40164000 -14f60002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -00000000 -26100001 -24120000 -001fb821 -3c04bfc5 -2484f568 -3c16800d -0080f809 -3c08800d -10000172 -00000000 -0017f821 -1516016f -00000000 -001fb821 -3c04bfc5 -2484f594 -25168123 -0080f809 -25098123 -10000167 -00000000 -0017f821 -15360164 -00000000 -001fb821 -3c04bfc5 -2484f5c0 -ad168ee0 -0080f809 -ad098ee0 -1000015c -00000000 -0017f821 -15360159 -00000000 -001fb821 -3c04bfc5 -2484f5ec -8d168ee0 -0080f809 -8d0a8ee0 -10000151 -00000000 -0017f821 -1556014e -00000000 -001fb821 -3c04bfc5 -2484f618 -012ab021 -0080f809 -012a5821 -10000146 -00000000 -0017f821 -15760143 -00000000 -001fb821 -3c04bfc5 -2484f644 -0232b025 -0080f809 -02326025 -1000013b -00000000 -0017f821 -15960138 -00000000 -001fb821 -3c04bfc5 -2484f670 -0253b02a -0080f809 -0253682a -10000130 -00000000 -0017f821 -15b6012d -00000000 -001fb821 -3c04bfc5 -2484f69c -2a568011 -0080f809 -2a4e8011 -10000125 -00000000 -0017f821 -15d60122 -00000000 -001fb821 -3c04bfc5 -2484f6c8 -2e568011 -0080f809 -2e4f8011 -1000011a -00000000 -0017f821 -15f60117 -00000000 -001fb821 -3c04bfc5 -2484f6f4 -0253b02b -0080f809 -0253c02b -1000010f -00000000 -0017f821 -1716010c -00000000 -001fb821 -3c04bfc5 -2484f720 -0012b440 -0080f809 -00124c40 -10000104 -00000000 -0017f821 -15360101 -00000000 -001fb821 -3c04bfc5 -2484f74c -0110b020 -0080f809 -01105020 -100000f9 -00000000 -0017f821 -155600f6 -00000000 -001fb821 -3c04bfc5 -2484f778 -22168002 -0080f809 -220b8002 -100000ee -00000000 -0017f821 -157600eb -00000000 -001fb821 -3c04bfc5 -2484f7a4 -0110b022 -0080f809 -01106022 -100000e3 -00000000 -0017f821 -159600e0 -00000000 -001fb821 -3c04bfc5 -2484f7d0 -0110b023 -0080f809 -01106823 -100000d8 -00000000 -0017f821 -15b600d5 -00000000 -001fb821 -3c04bfc5 -2484f7fc -0110b024 -0080f809 -01107024 -100000cd -00000000 -0017f821 -15d600ca -00000000 -001fb821 -3c04bfc5 -2484f828 -32168ff2 -0080f809 -320f8ff2 -100000c2 -00000000 -0017f821 -15f600bf -00000000 -001fb821 -3c04bfc5 -2484f854 -0110b027 -0080f809 -0110c027 -100000b7 -00000000 -0017f821 -171600b4 -00000000 -001fb821 -3c04bfc5 -2484f880 -36168ff2 -0080f809 -36098ff2 -100000ac -00000000 -0017f821 -153600a9 -00000000 -001fb821 -3c04bfc5 -2484f8ac -0110b026 -0080f809 -01105026 -100000a1 -00000000 -0017f821 -1556009e -00000000 -001fb821 -3c04bfc5 -2484f8d8 -3a168ff2 -0080f809 -3a0b8ff2 -10000096 -00000000 -0017f821 -15760093 -00000000 -001fb821 -3c04bfc5 -2484f904 -0208b004 -0080f809 -02086004 -1000008b -00000000 -0017f821 -15960088 -00000000 -001fb821 -3c04bfc5 -2484f930 -0010b203 -0080f809 -00106a03 -10000080 -00000000 -0017f821 -15b6007d -00000000 -001fb821 -3c04bfc5 -2484f95c -0208b007 -0080f809 -02087007 -10000075 -00000000 -0017f821 -15d60072 -00000000 -001fb821 -3c04bfc5 -2484f988 -0010b202 -0080f809 -00107a02 -1000006a -00000000 -0017f821 -15f60067 -00000000 -001fb821 -3c04bfc5 -2484f9b4 -0208b006 -0080f809 -0208c006 -1000005f -00000000 -0017f821 -1716005c -00000000 -3c088000 -34098000 -001fb821 -3c04bfc5 -2484f9f8 -24020000 -24030000 -0109001a -0000b012 -00800013 -0080f809 -0109001a -1000004e -00000000 -0017f821 -00001812 -1476004a -00000000 -001fb821 -3c04bfc5 -2484fa38 -24020000 -24030000 -0109001b -0000b012 -00800013 -0080f809 -0109001b -1000003e -00000000 -0017f821 -00001812 -1476003a -00000000 -001fb821 -3c04bfc5 -2484fa78 -24020000 -24030000 -01090018 -0000b012 -00800013 -0080f809 -01090018 -1000002e -00000000 -0017f821 -00001812 -1476002a -00000000 -001fb821 -3c04bfc5 -2484fab8 -24020000 -24030000 -01090019 -0000b012 -00800013 -0080f809 -01090019 -1000001e -00000000 -0017f821 -00001812 -1476001a -00000000 -001fb821 -3c04bfc5 -2484fae8 -0000b010 -0080f809 -00007810 -10000012 -00000000 -0017f821 -15f6000f -00000000 -001fb821 -3c04bfc5 -2484fb14 -0000b012 -0080f809 -00007012 -10000007 -00000000 -0017f821 -15d60004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -3c08800d -40805800 -3c170040 -40976000 -00000000 -24120001 -3c170001 -ad120000 -3c14bfc5 -2694fb6c -050000af -0000000c -165700ad -00000000 -24120001 -3c14bfc5 -2694fb88 -064000a8 -0000000c -165700a6 -00000000 -24120002 -3c170002 -ad120000 -3c14bfc5 -2694fbac -0500009f -0000000d -1657009d -00000000 -24120002 -3c14bfc5 -2694fbc8 -06400098 -0000000d -16570096 -00000000 -24120003 -3c170003 -ad120000 -3c14bfc5 -2694fbfc -3c04ba03 -34844f60 -3c05b615 -34a5fd67 -0500008b -0085b820 -16570089 -00000000 -24120003 -3c14bfc5 -2694fc18 -06400084 -0085b820 -ad170000 -16570081 -00000000 -24120003 -ad120000 -3c14bfc5 -2694fc44 -3c047fff -3484c19e -05000079 -20976512 -16570077 -00000000 -24120003 -3c14bfc5 -2694fc60 -06400072 -20976512 -16570070 -00000000 -24120003 -3c14bfc5 -2694fc8c -3c04a85e -34847d00 -3c056b7e -34a58e36 -05000067 -0085b822 -16570065 -00000000 -24120003 -3c14bfc5 -2694fca8 -06400060 -0085b822 -1657005e -00000000 -24120004 -3c170004 -ad120000 -3c14bfc5 -2694fccc -05000057 -8d170002 -16570055 -00000000 -24120004 -3c14bfc5 -2694fce8 -06400050 -8d170002 -1657004e -00000000 -24120004 -3c14bfc5 -2694fd04 -05000049 -85170001 -02f2001b -16570046 -00000000 -24120004 -3c14bfc5 -2694fd24 -06400041 -85170001 -1657003f -00000000 -3c14bfc5 -2694fd3c -0500003b -95170003 -16570039 -00000000 -24120004 -3c14bfc5 -2694fd58 -06400034 -95170003 -16570032 -00000000 -24120005 -3c170005 -ad120000 -3c14bfc5 -2694fd7c -0500002b -ad170002 -16570029 -00000000 -24120005 -3c14bfc5 -2694fd98 -06400024 -ad170002 -16570022 -00000000 -24120005 -3c14bfc5 -2694fdb4 -0500001d -a5170001 -1657001b -00000000 -24120005 -3c14bfc5 -2694fdd0 -06400016 -a5170001 -16570014 -00000000 -24120007 -3c170007 -ad120000 -3c14bfc5 -2694fdf4 -0500000d -9e3c56aa -02f20018 -1657000a -00000000 -24120007 -3c14bfc5 -2694fe18 -02f20018 -06400004 -ec1ba960 -16570002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -3c120000 -3c087245 -3508316a -3c097835 -352906f0 -24030001 -0109102a -144308fe -00000000 -3c08f93a -3508207e -3c09912e -3529d208 -24030000 -0109102a -144308f6 -00000000 -3c084797 -35084516 -3c09b8fd -35294d1c -24030000 -0109102a -144308ee -00000000 -3c083892 -3508fe20 -3c09c03d -352915f0 -24030000 -0109102a -144308e6 -00000000 -3c087e55 -35089eb0 -3c092628 -3529fc00 -24030000 -0109102a -144308de -00000000 -3c08f063 -35083384 -3c0938e4 -3529ca32 -24030001 -0109102a -144308d6 -00000000 -3c082a0a -350887d0 -3c0989a6 -3529ba40 -24030000 -0109102a -144308ce -00000000 -3c082577 -350842f8 -3c099073 -35290020 -24030000 -0109102a -144308c6 -00000000 -3c087647 -35087934 -3c09464f -3529a176 -24030000 -0109102a -144308be -00000000 -3c08004a -3508533a -3c09a9da -3529da60 -24030000 -0109102a -144308b6 -00000000 -3c08bd3f -35083520 -3c092365 -352918fa -24030001 -0109102a -144308ae -00000000 -3c0803f1 -35085cd8 -3c09a777 -3529f32c -24030000 -0109102a -144308a6 -00000000 -3c08f8e7 -35084f26 -3c091d9a -3529f9b4 -24030001 -0109102a -1443089e -00000000 -3c084ccf -350834d8 -3c0992de -35296700 -24030000 -0109102a -14430896 -00000000 -3c0852c3 -3508ebc9 -3c098082 -352918d2 -24030000 -0109102a -1443088e -00000000 -3c08aec3 -3508a9c8 -3c0973b0 -3529130e -24030001 -0109102a -14430886 -00000000 -3c0820e9 -3508b1cc -3c090a80 -3529cbc0 -24030000 -0109102a -1443087e -00000000 -3c080ec7 -3508d2d7 -3c094934 -3529b8c8 -24030001 -0109102a -14430876 -00000000 -3c086051 -350860c8 -3c096c17 -3529f663 -24030001 -0109102a -1443086e -00000000 -3c081acb -35089d3e -3c097728 -3529f204 -24030001 -0109102a -14430866 -00000000 -3c083d6b -35086a20 -3c0966f9 -35295638 -24030001 -0109102a -1443085e -00000000 -3c0883c2 -35081248 -3c09af6a -3529cac7 -24030001 -0109102a -14430856 -00000000 -3c08d981 -3508e54c -3c097c67 -3529ed24 -24030001 -0109102a -1443084e -00000000 -3c0865b7 -35083041 -3c092e2b -3529051c -24030000 -0109102a -14430846 -00000000 -3c08297e -3508c62d -3c09ceaf -3529021e -24030000 -0109102a -1443083e -00000000 -3c080c4d -35087130 -3c09d3ec -3529c104 -24030000 -0109102a -14430836 -00000000 -3c08d595 -3508d780 -3c096631 -3529a33c -24030001 -0109102a -1443082e -00000000 -3c087bd5 -3508de0e -3c095c07 -3529037c -24030000 -0109102a -14430826 -00000000 -3c0825cd -3508b6ac -3c09835c -3529bfa0 -24030000 -0109102a -1443081e -00000000 -3c08e43e -35080214 -3c097c05 -3529ac8c -24030001 -0109102a -14430816 -00000000 -3c089192 -350831b6 -3c09e724 -35297c80 -24030001 -0109102a -1443080e -00000000 -3c08fcad -350865b0 -3c09790f -35295170 -24030001 -0109102a -14430806 -00000000 -3c08fc96 -35084d68 -3c09818a -3529abc0 -24030000 -0109102a -144307fe -00000000 -3c08503f -3508013c -3c0988ba -3529ffe0 -24030000 -0109102a -144307f6 -00000000 -3c08d6b4 -35084670 -3c096c4b -3529d678 -24030001 -0109102a -144307ee -00000000 -3c089f67 -35088400 -3c094ed2 -3529db56 -24030001 -0109102a -144307e6 -00000000 -3c08d093 -3508578c -3c090a4d -3529646f -24030001 -0109102a -144307de -00000000 -3c08a394 -3508f786 -3c09e34f -35292554 -24030001 -0109102a -144307d6 -00000000 -3c08ff42 -35085d4a -3c092766 -3529b0af -24030001 -0109102a -144307ce -00000000 -3c08a68a -35084d90 -3c0960ee -352958ea -24030001 -0109102a -144307c6 -00000000 -3c08e36b -35087cfe -3c090360 -3529d628 -24030001 -0109102a -144307be -00000000 -3c08ba75 -35084d28 -3c09b8b7 -3529eb58 -24030000 -0109102a -144307b6 -00000000 -3c080ad0 -35088228 -3c096e42 -35298208 -24030001 -0109102a -144307ae -00000000 -3c080673 -35082ec2 -3c091b46 -35299bc8 -24030001 -0109102a -144307a6 -00000000 -3c081ed8 -35082b9a -3c090d8c -3529d600 -24030000 -0109102a -1443079e -00000000 -3c082924 -3508acbc -3c09de73 -3529a848 -24030000 -0109102a -14430796 -00000000 -3c08a125 -3508c320 -3c09947e -3529e6ac -24030000 -0109102a -1443078e -00000000 -3c082320 -3508dc93 -3c09c95f -3529e71a -24030000 -0109102a -14430786 -00000000 -3c080dca -35089952 -3c09df86 -3529cad8 -24030000 -0109102a -1443077e -00000000 -3c0806f7 -3508ae98 -3c09fe9b -35290978 -24030000 -0109102a -14430776 -00000000 -3c08f885 -3508d62c -3c097105 -3529be58 -24030001 -0109102a -1443076e -00000000 -3c08760b -3508f3d4 -3c09406f -352998c0 -24030000 -0109102a -14430766 -00000000 -3c08c829 -3508a214 -3c091193 -35295f60 -24030001 -0109102a -1443075e -00000000 -3c08a1e8 -3508edd6 -3c09cb2d -3529d076 -24030001 -0109102a -14430756 -00000000 -3c082c81 -3508e7a0 -3c093baf -35296040 -24030001 -0109102a -1443074e -00000000 -3c08a23a -35084884 -3c095373 -3529b790 -24030001 -0109102a -14430746 -00000000 -3c08a084 -350885b2 -3c091099 -35293f76 -24030001 -0109102a -1443073e -00000000 -3c085596 -35080928 -3c098c4e -35299484 -24030000 -0109102a -14430736 -00000000 -3c08a522 -35081a96 -3c09ed88 -3529238c -24030001 -0109102a -1443072e -00000000 -3c08b145 -35082240 -3c09c7ce -3529d2ba -24030001 -0109102a -14430726 -00000000 -3c08dc85 -3508d1ac -3c095953 -3529ac94 -24030001 -0109102a -1443071e -00000000 -3c0833b1 -350859ad -3c094cc5 -3529dcdb -24030001 -0109102a -14430716 -00000000 -3c08e158 -35085f34 -3c09c1ec -3529f670 -24030000 -0109102a -1443070e -00000000 -3c089e35 -35082cc8 -3c0902ab -35292610 -24030001 -0109102a -14430706 -00000000 -3c086486 -3508ed27 -3c09b2ff -3529a084 -24030000 -0109102a -144306fe -00000000 -3c08e678 -3508b8e2 -3c0906f5 -3529b6fa -24030001 -0109102a -144306f6 -00000000 -3c08c7d6 -3508d2c0 -3c09aeb8 -3529e646 -24030000 -0109102a -144306ee -00000000 -3c082587 -3508ee4a -3c09440d -35296700 -24030001 -0109102a -144306e6 -00000000 -3c08a6c6 -350863f0 -3c094733 -35295161 -24030001 -0109102a -144306de -00000000 -3c0896d8 -350820c2 -3c095cca -352954fc -24030001 -0109102a -144306d6 -00000000 -3c084574 -3508fc00 -3c09209b -3529e830 -24030000 -0109102a -144306ce -00000000 -3c0896ca -35080400 -3c09d224 -35292ebe -24030001 -0109102a -144306c6 -00000000 -3c08aba9 -35089300 -3c09c27d -3529e6e0 -24030001 -0109102a -144306be -00000000 -3c080df0 -35083786 -3c09c10c -352942c0 -24030000 -0109102a -144306b6 -00000000 -3c084c86 -35087110 -3c09915f -35299315 -24030000 -0109102a -144306ae -00000000 -3c083007 -35086990 -3c09aed9 -3529afdf -24030000 -0109102a -144306a6 -00000000 -3c08aeca -35086a78 -3c09299d -3529e554 -24030001 -0109102a -1443069e -00000000 -3c08a368 -35081d24 -3c09588a -3529b288 -24030001 -0109102a -14430696 -00000000 -3c085aa1 -35088828 -3c09d1a3 -352932e4 -24030000 -0109102a -1443068e -00000000 -3c081127 -35086b80 -3c09a20b -3529bc40 -24030000 -0109102a -14430686 -00000000 -3c08e8fb -3508cac0 -3c0950da -3529443b -24030001 -0109102a -1443067e -00000000 -3c08e2c9 -3508a0fb -3c090008 -3529e36a -24030001 -0109102a -14430676 -00000000 -3c08c1b5 -350869ca -3c093064 -352962de -24030001 -0109102a -1443066e -00000000 -3c081012 -35087040 -3c093cee -35298416 -24030001 -0109102a -14430666 -00000000 -3c08e53c -3508b480 -3c099441 -352962f0 -24030000 -0109102a -1443065e -00000000 -3c08cb1b -35088640 -3c09a98a -352966a0 -24030000 -0109102a -14430656 -00000000 -3c082ff3 -3508fea0 -3c091b74 -352971d0 -24030000 -0109102a -1443064e -00000000 -3c08ccf8 -3508c3a0 -3c0996bf -3529b940 -24030000 -0109102a -14430646 -00000000 -3c08765a -35082e8c -3c093793 -35291377 -24030000 -0109102a -1443063e -00000000 -3c08895d -3508db1e -3c099361 -35294958 -24030001 -0109102a -14430636 -00000000 -3c08ca9c -35089518 -3c098a17 -35296c10 -24030000 -0109102a -1443062e -00000000 -3c089e5c -35087d25 -3c093e41 -3529fbde -24030001 -0109102a -14430626 -00000000 -3c080f07 -35084fbd -3c09f26e -3529245c -24030000 -0109102a -1443061e -00000000 -3c084621 -3508dfce -3c0944fc -35293afd -24030000 -0109102a -14430616 -00000000 -3c08e701 -35082bc0 -3c09b8f9 -352962a4 -24030000 -0109102a -1443060e -00000000 -3c083e3b -350884a0 -3c0993e3 -3529b270 -24030000 -0109102a -14430606 -00000000 -3c089df9 -35081a88 -3c09729e -352937b1 -24030001 -0109102a -144305fe -00000000 -3c088eb5 -35082124 -3c094939 -35299740 -24030001 -0109102a -144305f6 -00000000 -3c08b647 -35089a56 -3c09df73 -35295dbc -24030001 -0109102a -144305ee -00000000 -3c086286 -3508487c -3c099ab3 -3529645c -24030000 -0109102a -144305e6 -00000000 -3c082406 -3508dc34 -3c09147e -352956ac -24030000 -0109102a -144305de -00000000 -3c08bdb9 -3508b39e -3c098e29 -3529c9e8 -24030000 -0109102a -144305d6 -00000000 -3c08f187 -35086f02 -3c09f488 -35290055 -24030001 -0109102a -144305ce -00000000 -3c08efcf -350896ae -3c09b81e -35296f00 -24030000 -0109102a -144305c6 -00000000 -3c08c529 -3508e670 -3c09caf0 -35294ee0 -24030001 -0109102a -144305be -00000000 -3c083517 -3508d030 -3c09e100 -35294739 -24030000 -0109102a -144305b6 -00000000 -3c084979 -3508e060 -3c09668b -3529872e -24030001 -0109102a -144305ae -00000000 -3c08ed37 -35081600 -3c0996e8 -35290d00 -24030000 -0109102a -144305a6 -00000000 -3c08b364 -35080b21 -3c096e21 -352975e2 -24030001 -0109102a -1443059e -00000000 -3c08b29e -35081110 -3c09368e -35291ab0 -24030001 -0109102a -14430596 -00000000 -3c08bbd7 -35084350 -3c09a40c -3529a0a4 -24030000 -0109102a -1443058e -00000000 -3c08d248 -35085274 -3c099ca5 -352933f8 -24030000 -0109102a -14430586 -00000000 -3c086653 -3508b8a4 -3c09e0c9 -35292940 -24030000 -0109102a -1443057e -00000000 -3c08bb69 -350804b8 -3c09322e -3529b6ec -24030001 -0109102a -14430576 -00000000 -3c086fdf -35086448 -3c0984e7 -35296bcc -24030000 -0109102a -1443056e -00000000 -3c089e29 -350827d8 -3c09ca6b -35293d60 -24030001 -0109102a -14430566 -00000000 -3c08e7fa -35081ee5 -3c096b6f -3529b480 -24030001 -0109102a -1443055e -00000000 -3c088f63 -35089960 -3c09b465 -3529b9e6 -24030001 -0109102a -14430556 -00000000 -3c08091a -3508a721 -3c09667a -35296700 -24030001 -0109102a -1443054e -00000000 -3c089d14 -35080b98 -3c09a794 -35290a60 -24030001 -0109102a -14430546 -00000000 -3c0814cb -35084150 -3c099bda -352914b0 -24030000 -0109102a -1443053e -00000000 -3c08e377 -3508e96a -3c09b4f6 -35294838 -24030000 -0109102a -14430536 -00000000 -3c08bf24 -35084bb4 -3c090834 -3529de96 -24030001 -0109102a -1443052e -00000000 -3c083bf4 -350856f4 -3c09c064 -35293a00 -24030000 -0109102a -14430526 -00000000 -3c0866b1 -3508ca0c -3c09a5ab -35290faf -24030000 -0109102a -1443051e -00000000 -3c08134b -35080b25 -3c09b1c5 -3529f9e4 -24030000 -0109102a -14430516 -00000000 -3c084479 -3508c340 -3c097530 -35291710 -24030001 -0109102a -1443050e -00000000 -3c08be62 -3508d866 -3c094737 -35299a7c -24030001 -0109102a -14430506 -00000000 -3c08e820 -3508c438 -3c09ccb4 -3529c338 -24030000 -0109102a -144304fe -00000000 -3c08db00 -3508195e -3c0951b5 -35297d4d -24030001 -0109102a -144304f6 -00000000 -3c0884ef -3508d570 -3c096af0 -3529dece -24030001 -0109102a -144304ee -00000000 -3c083a3f -350832d4 -3c0900dc -3529d8f0 -24030000 -0109102a -144304e6 -00000000 -3c0847cf -35088c4a -3c09b8f4 -3529edcc -24030000 -0109102a -144304de -00000000 -3c0821c8 -3508a180 -3c092361 -35297d20 -24030001 -0109102a -144304d6 -00000000 -3c085c4f -350878a0 -3c090554 -35293400 -24030000 -0109102a -144304ce -00000000 -3c0817ee -35085920 -3c097506 -352996d6 -24030001 -0109102a -144304c6 -00000000 -3c08c599 -3508ecd0 -3c092d21 -352969a0 -24030001 -0109102a -144304be -00000000 -3c0850c7 -350812b8 -3c09b893 -352900b8 -24030000 -0109102a -144304b6 -00000000 -3c08dd0c -35085ad8 -3c09d7f2 -35292e80 -24030000 -0109102a -144304ae -00000000 -3c08e5a6 -35083a00 -3c09b664 -3529f612 -24030000 -0109102a -144304a6 -00000000 -3c084f78 -35082f68 -3c0945be -35298540 -24030000 -0109102a -1443049e -00000000 -3c082de2 -35086ba0 -3c090bb8 -352991f4 -24030000 -0109102a -14430496 -00000000 -3c086ee6 -35084838 -3c092052 -3529ef70 -24030000 -0109102a -1443048e -00000000 -3c08abe8 -350859b4 -3c09c611 -3529cb9c -24030001 -0109102a -14430486 -00000000 -3c08b905 -3508ba8d -3c09bc9e -35298b1c -24030001 -0109102a -1443047e -00000000 -3c088a96 -35080b3d -3c09a82b -35293e44 -24030001 -0109102a -14430476 -00000000 -3c08e538 -3508d650 -3c09875f -3529553a -24030000 -0109102a -1443046e -00000000 -3c0860f5 -35089e14 -3c09d5c1 -3529b6d4 -24030000 -0109102a -14430466 -00000000 -3c08dee2 -3508c960 -3c09875e -3529f800 -24030000 -0109102a -1443045e -00000000 -3c08a486 -35086a04 -3c094ae3 -3529d50b -24030001 -0109102a -14430456 -00000000 -3c089ba2 -350895a0 -3c09bceb -35299306 -24030001 -0109102a -1443044e -00000000 -3c08aaf4 -35089150 -3c097783 -35293534 -24030001 -0109102a -14430446 -00000000 -3c08398f -35084578 -3c097985 -3529df63 -24030001 -0109102a -1443043e -00000000 -3c083813 -350872fc -3c09c2f9 -35292990 -24030000 -0109102a -14430436 -00000000 -3c0829ff -35081880 -3c091263 -35293f34 -24030000 -0109102a -1443042e -00000000 -3c08afad -3508a684 -3c0925ed -35290ff2 -24030001 -0109102a -14430426 -00000000 -3c0813f1 -3508f1e0 -3c09a093 -35291ebe -24030000 -0109102a -1443041e -00000000 -3c080f99 -35082c56 -3c09d949 -35297298 -24030000 -0109102a -14430416 -00000000 -3c08df8c -35083708 -3c095110 -352957e4 -24030001 -0109102a -1443040e -00000000 -3c08402c -35082c80 -3c09c62e -3529f3ee -24030000 -0109102a -14430406 -00000000 -3c085142 -350847b0 -3c090393 -352921a2 -24030000 -0109102a -144303fe -00000000 -3c084a84 -3508af1c -3c09bc7f -3529931c -24030000 -0109102a -144303f6 -00000000 -3c084e04 -3508e468 -3c0927f2 -3529c362 -24030000 -0109102a -144303ee -00000000 -3c08c060 -35087a2a -3c091007 -352977a6 -24030001 -0109102a -144303e6 -00000000 -3c086be8 -350887b8 -3c092a2a -35291b07 -24030000 -0109102a -144303de -00000000 -3c08ffc0 -3508648c -3c0903ae -35297d40 -24030001 -0109102a -144303d6 -00000000 -3c088059 -3508f584 -3c092a55 -352991c2 -24030001 -0109102a -144303ce -00000000 -3c08d678 -35080e50 -3c09dd90 -3529061e -24030001 -0109102a -144303c6 -00000000 -3c08c515 -35086998 -3c090664 -35296dc8 -24030001 -0109102a -144303be -00000000 -3c08d023 -35081c28 -3c090a3e -35294be8 -24030001 -0109102a -144303b6 -00000000 -3c085c9b -35089af5 -3c09879b -35295056 -24030000 -0109102a -144303ae -00000000 -3c08f7fd -3508960e -3c096576 -352915c0 -24030001 -0109102a -144303a6 -00000000 -3c086f4b -3508bfa2 -3c09a6ad -3529f7d0 -24030000 -0109102a -1443039e -00000000 -3c087582 -35080002 -3c091544 -35294e40 -24030000 -0109102a -14430396 -00000000 -3c08916d -35087568 -3c0924f6 -3529a834 -24030001 -0109102a -1443038e -00000000 -3c08a67c -35089d00 -3c09e46a -35290e6c -24030001 -0109102a -14430386 -00000000 -3c08093d -3508a360 -3c090c64 -35294f40 -24030001 -0109102a -1443037e -00000000 -3c08612e -35088bce -3c099321 -352936df -24030000 -0109102a -14430376 -00000000 -3c0840ab -3508109e -3c096e6f -35299e96 -24030001 -0109102a -1443036e -00000000 -3c08b75f -3508a2a8 -3c09bef9 -35295808 -24030001 -0109102a -14430366 -00000000 -3c081065 -350856b4 -3c097590 -35291e20 -24030001 -0109102a -1443035e -00000000 -3c08a424 -3508fbc0 -3c09907c -35298720 -24030000 -0109102a -14430356 -00000000 -3c089cc2 -35085fb4 -3c096e6c -35292a80 -24030001 -0109102a -1443034e -00000000 -3c08afaf -3508b70a -3c09828b -35299cf1 -24030000 -0109102a -14430346 -00000000 -3c08153a -35080cdc -3c093686 -3529a0f0 -24030001 -0109102a -1443033e -00000000 -3c08a1de -3508afea -3c0928ee -35296b2a -24030001 -0109102a -14430336 -00000000 -3c08e744 -35088c54 -3c09a2ea -3529b4b0 -24030000 -0109102a -1443032e -00000000 -3c08df72 -350828f0 -3c095da2 -3529c118 -24030001 -0109102a -14430326 -00000000 -3c080667 -350834aa -3c097f8c -352971f8 -24030001 -0109102a -1443031e -00000000 -3c08b31c -3508cc61 -3c099934 -35297be0 -24030000 -0109102a -14430316 -00000000 -3c085484 -3508dc5f -3c09b891 -3529211c -24030000 -0109102a -1443030e -00000000 -3c08281c -35082dc0 -3c0947b6 -35290b80 -24030001 -0109102a -14430306 -00000000 -3c088aec -3508940c -3c09f609 -3529008c -24030001 -0109102a -144302fe -00000000 -3c080a4f -35080f70 -3c0922c1 -3529d4e0 -24030001 -0109102a -144302f6 -00000000 -3c08b4db -35086de0 -3c09852f -3529e310 -24030000 -0109102a -144302ee -00000000 -3c08d271 -350840e4 -3c0934ec -3529bff0 -24030001 -0109102a -144302e6 -00000000 -3c08dd74 -3508e0b4 -3c09ab67 -3529cad0 -24030000 -0109102a -144302de -00000000 -3c0878b9 -35083da0 -3c097b51 -3529da44 -24030001 -0109102a -144302d6 -00000000 -3c0899ea -3508e868 -3c097e33 -3529768c -24030001 -0109102a -144302ce -00000000 -3c0877ea -350882d8 -3c09273d -3529a080 -24030000 -0109102a -144302c6 -00000000 -3c085d1e -3508b494 -24090000 -24030000 -0109102a -144302bf -00000000 -3c0896c2 -3508d0de -24090000 -24030001 -0109102a -144302b8 -00000000 -3c081d3b -35081774 -24090000 -24030000 -0109102a -144302b1 -00000000 -3c087a6a -35087630 -24090000 -24030000 -0109102a -144302aa -00000000 -3c08f56d -3508dcb1 -24090000 -24030001 -0109102a -144302a3 -00000000 -3c080583 -350860f8 -24090000 -24030000 -0109102a -1443029c -00000000 -3c088507 -350897d8 -24090000 -24030001 -0109102a -14430295 -00000000 -3c083c74 -350811bc -24090000 -24030000 -0109102a -1443028e -00000000 -3c08b632 -3508b7e6 -24090000 -24030001 -0109102a -14430287 -00000000 -3c084104 -35080328 -24090000 -24030000 -0109102a -14430280 -00000000 -3c08a15b -35088800 -24090000 -24030001 -0109102a -14430279 -00000000 -3c086394 -35086e22 -24090000 -24030000 -0109102a -14430272 -00000000 -3c083cf4 -35089300 -24090000 -24030000 -0109102a -1443026b -00000000 -3c08568a -3508b7c0 -24090000 -24030000 -0109102a -14430264 -00000000 -3c08d839 -350837ec -24090000 -24030001 -0109102a -1443025d -00000000 -3c08f29d -35086b00 -24090000 -24030001 -0109102a -14430256 -00000000 -3c08ce78 -350875a8 -24090000 -24030001 -0109102a -1443024f -00000000 -3c0846ef -35089c20 -24090000 -24030000 -0109102a -14430248 -00000000 -3c089fcb -35087b9c -24090000 -24030001 -0109102a -14430241 -00000000 -3c0876f8 -3508d480 -24090000 -24030000 -0109102a -1443023a -00000000 -3c08a2e3 -35089d48 -24090000 -24030001 -0109102a -14430233 -00000000 -3c08a07c -3508ed74 -24090000 -24030001 -0109102a -1443022c -00000000 -3c083546 -35085808 -24090000 -24030000 -0109102a -14430225 -00000000 -3c083a0e -3508eb32 -24090000 -24030000 -0109102a -1443021e -00000000 -3c086a9b -350850fc -24090000 -24030000 -0109102a -14430217 -00000000 -3c08267a -35081dbd -24090000 -24030000 -0109102a -14430210 -00000000 -3c08c9d7 -3508d05b -24090000 -24030001 -0109102a -14430209 -00000000 -3c085e8b -3508b6a0 -24090000 -24030000 -0109102a -14430202 -00000000 -3c08a40f -3508e388 -24090000 -24030001 -0109102a -144301fb -00000000 -3c085ac0 -3508c900 -24090000 -24030000 -0109102a -144301f4 -00000000 -3c08e3f4 -35088848 -24090000 -24030001 -0109102a -144301ed -00000000 -3c082ce5 -35088824 -24090000 -24030000 -0109102a -144301e6 -00000000 -3c08f7b9 -3508f678 -24090000 -24030001 -0109102a -144301df -00000000 -3c080750 -35086bdc -24090000 -24030000 -0109102a -144301d8 -00000000 -3c08c77b -350850d8 -24090000 -24030001 -0109102a -144301d1 -00000000 -3c08cb16 -35080968 -24090000 -24030001 -0109102a -144301ca -00000000 -3c0838bc -3508c2a0 -24090000 -24030000 -0109102a -144301c3 -00000000 -3c08129d -350890d0 -24090000 -24030000 -0109102a -144301bc -00000000 -3c08065e -350862f6 -24090000 -24030000 -0109102a -144301b5 -00000000 -3c085e78 -35088c89 -24090000 -24030000 -0109102a -144301ae -00000000 -3c08a352 -3508188e -24090000 -24030001 -0109102a -144301a7 -00000000 -3c08e65e -35088524 -24090000 -24030001 -0109102a -144301a0 -00000000 -3c08d0bc -350831b7 -24090000 -24030001 -0109102a -14430199 -00000000 -3c082f48 -35087740 -24090000 -24030000 -0109102a -14430192 -00000000 -3c088d5b -3508987c -24090000 -24030001 -0109102a -1443018b -00000000 -3c087554 -35089d23 -24090000 -24030000 -0109102a -14430184 -00000000 -3c08d8a4 -3508d670 -24090000 -24030001 -0109102a -1443017d -00000000 -3c08a83f -35086648 -24090000 -24030001 -0109102a -14430176 -00000000 -3c086cde -3508b568 -24090000 -24030000 -0109102a -1443016f -00000000 -3c08f630 -35081a6b -24090000 -24030001 -0109102a -14430168 -00000000 -24080000 -3c09f5be -35296ec0 -24030000 -0109102a -14430161 -00000000 -24080000 -3c0953d8 -3529f59e -24030001 -0109102a -1443015a -00000000 -24080000 -3c0952f3 -35292126 -24030001 -0109102a -14430153 -00000000 -24080000 -3c0941f2 -3529b97b -24030001 -0109102a -1443014c -00000000 -24080000 -3c09683f -35296c40 -24030001 -0109102a -14430145 -00000000 -24080000 -3c093606 -352945fc -24030001 -0109102a -1443013e -00000000 -24080000 -3c09f62d -352916b8 -24030000 -0109102a -14430137 -00000000 -24080000 -3c096716 -3529d95a -24030001 -0109102a -14430130 -00000000 -24080000 -3c091cbb -3529e8e0 -24030001 -0109102a -14430129 -00000000 -24080000 -3c0950af -35297c19 -24030001 -0109102a -14430122 -00000000 -24080000 -3c09ca5f -3529cc56 -24030000 -0109102a -1443011b -00000000 -24080000 -3c09cbc1 -35291c94 -24030000 -0109102a -14430114 -00000000 -24080000 -3c09ca1d -35293200 -24030000 -0109102a -1443010d -00000000 -24080000 -3c09d8f7 -352938f4 -24030000 -0109102a -14430106 -00000000 -24080000 -3c09e5cb -3529fc48 -24030000 -0109102a -144300ff -00000000 -24080000 -3c098648 -35298790 -24030000 -0109102a -144300f8 -00000000 -24080000 -3c098656 -3529b970 -24030000 -0109102a -144300f1 -00000000 -24080000 -3c095bfc -3529c9bc -24030001 -0109102a -144300ea -00000000 -24080000 -3c09b6db -352964ea -24030000 -0109102a -144300e3 -00000000 -24080000 -3c099220 -352988ec -24030000 -0109102a -144300dc -00000000 -24080000 -3c09c83b -35294d00 -24030000 -0109102a -144300d5 -00000000 -24080000 -3c095522 -35290662 -24030001 -0109102a -144300ce -00000000 -24080000 -3c099d4c -3529d880 -24030000 -0109102a -144300c7 -00000000 -24080000 -3c09fead -3529ede4 -24030000 -0109102a -144300c0 -00000000 -24080000 -3c095b06 -352955f0 -24030001 -0109102a -144300b9 -00000000 -24080000 -3c096f62 -3529a25a -24030001 -0109102a -144300b2 -00000000 -24080000 -3c09d670 -35298430 -24030000 -0109102a -144300ab -00000000 -24080000 -3c0980f3 -3529902f -24030000 -0109102a -144300a4 -00000000 -24080000 -3c097a73 -35296260 -24030001 -0109102a -1443009d -00000000 -24080000 -3c09b430 -35296670 -24030000 -0109102a -14430096 -00000000 -24080000 -3c097590 -35292d10 -24030001 -0109102a -1443008f -00000000 -24080000 -3c0957ce -35291300 -24030001 -0109102a -14430088 -00000000 -24080000 -3c098fb2 -35296858 -24030000 -0109102a -14430081 -00000000 -24080000 -3c094157 -35291b78 -24030001 -0109102a -1443007a -00000000 -24080000 -3c09cd4e -35297f83 -24030000 -0109102a -14430073 -00000000 -24080000 -3c09d0ad -3529fb3e -24030000 -0109102a -1443006c -00000000 -24080000 -3c094eea -3529ac70 -24030001 -0109102a -14430065 -00000000 -24080000 -3c09e73b -35299020 -24030000 -0109102a -1443005e -00000000 -24080000 -3c09a5e2 -35290048 -24030000 -0109102a -14430057 -00000000 -24080000 -3c094279 -35297cc0 -24030001 -0109102a -14430050 -00000000 -24080000 -3c09adbd -352977cc -24030000 -0109102a -14430049 -00000000 -24080000 -3c096d99 -35291ca0 -24030001 -0109102a -14430042 -00000000 -24080000 -3c095491 -3529c31e -24030001 -0109102a -1443003b -00000000 -24080000 -3c09b344 -35299120 -24030000 -0109102a -14430034 -00000000 -24080000 -3c09852c -3529514a -24030000 -0109102a -1443002d -00000000 -24080000 -3c090765 -352970f4 -24030001 -0109102a -14430026 -00000000 -24080000 -3c09ef17 -3529ce60 -24030000 -0109102a -1443001f -00000000 -24080000 -3c0936d4 -35293eb0 -24030001 -0109102a -14430018 -00000000 -24080000 -3c091eaa -3529c5e3 -24030001 -0109102a -14430011 -00000000 -24080000 -3c09b566 -3529662b -24030000 -0109102a -1443000a -00000000 -24080000 -24090000 -24030000 -0109102a -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -24120000 -24020000 -24030000 -10000007 -00000000 -3c02933a -34427610 -05000009 -00000000 -10000009 -00000000 -3c089e0d -35087d08 -0500fff7 -00000000 -10000003 -00000000 -3c03ee03 -34634360 -3c15933a -36b57610 -3c16ee03 -36d64360 -14550ee5 -00000000 -14760ee3 -00000000 -24020000 -24030000 -10000007 -00000000 -3c020f16 -3442b74f -05000009 -00000000 -10000009 -00000000 -3c089d45 -35089300 -0500fff7 -00000000 -10000003 -00000000 -3c03686b -34631250 -3c150f16 -36b5b74f -3c16686b -36d61250 -14550ecb -00000000 -14760ec9 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02f8a3 -34427ee5 -05000009 -00000000 -10000009 -00000000 -3c08f98d -35085680 -0500fff7 -00000000 -10000003 -00000000 -3c0361e9 -34636814 -3c15f8a3 -36b57ee5 -3c1661e9 -36d66814 -14550eb1 -00000000 -14760eaf -00000000 -24020000 -24030000 -10000007 -00000000 -3c0239f5 -34429b62 -05000009 -00000000 -10000009 -00000000 -3c08cf66 -350884e0 -0500fff7 -00000000 -10000003 -00000000 -3c0323c9 -34638d99 -3c1539f5 -36b59b62 -3c1623c9 -36d68d99 -14550e97 -00000000 -14760e95 -00000000 -24020000 -24030000 -10000007 -00000000 -3c026a2f -34427d7c -05000009 -00000000 -10000009 -00000000 -3c08fff9 -35080290 -0500fff7 -00000000 -10000003 -00000000 -3c03c275 -3463fd82 -3c156a2f -36b57d7c -3c16c275 -36d6fd82 -14550e7d -00000000 -14760e7b -00000000 -24020000 -24030000 -10000007 -00000000 -3c02291a -34423374 -05000009 -00000000 -10000009 -00000000 -3c0835ae -35088150 -0500fff7 -00000000 -10000003 -00000000 -3c0360d2 -34638110 -24150000 -24160000 -14550e65 -00000000 -14760e63 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02b861 -3442ba80 -05000009 -00000000 -10000009 -00000000 -3c08ad6e -3508c7b4 -0500fff7 -00000000 -10000003 -00000000 -3c03480d -3463ae66 -3c15b861 -36b5ba80 -3c16480d -36d6ae66 -14550e4b -00000000 -14760e49 -00000000 -24020000 -24030000 -10000007 -00000000 -3c0226c4 -3442c128 -05000009 -00000000 -10000009 -00000000 -3c080d86 -35082630 -0500fff7 -00000000 -10000003 -00000000 -3c03a2a6 -34634340 -24150000 -24160000 -14550e33 -00000000 -14760e31 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02c02c -34423d48 -05000009 -00000000 -10000009 -00000000 -3c0819d4 -3508b730 -0500fff7 -00000000 -10000003 -00000000 -3c0382d0 -34639792 -24150000 -24160000 -14550e1b -00000000 -14760e19 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02761f -344236aa -05000009 -00000000 -10000009 -00000000 -3c08735f -35087026 -0500fff7 -00000000 -10000003 -00000000 -3c035809 -34634d78 -24150000 -24160000 -14550e03 -00000000 -14760e01 -00000000 -24020000 -24030000 -10000007 -00000000 -3c020d77 -34424c5c -05000009 -00000000 -10000009 -00000000 -3c08a22e -35085194 -0500fff7 -00000000 -10000003 -00000000 -3c0302b2 -34633fb0 -3c150d77 -36b54c5c -3c1602b2 -36d63fb0 -14550de9 -00000000 -14760de7 -00000000 -24020000 -24030000 -10000007 -00000000 -3c020cd9 -34425b8c -05000009 -00000000 -10000009 -00000000 -3c08a810 -3508d7b5 -0500fff7 -00000000 -10000003 -00000000 -3c039aff -3463b004 -3c150cd9 -36b55b8c -3c169aff -36d6b004 -14550dcf -00000000 -14760dcd -00000000 -24020000 -24030000 -10000007 -00000000 -3c02f9a3 -34423110 -05000009 -00000000 -10000009 -00000000 -3c083f58 -3508d900 -0500fff7 -00000000 -10000003 -00000000 -3c0382cd -3463f204 -24150000 -24160000 -14550db7 -00000000 -14760db5 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02f2ba -3442053c -05000009 -00000000 -10000009 -00000000 -3c089e43 -35081baa -0500fff7 -00000000 -10000003 -00000000 -3c0320d4 -3463b030 -3c15f2ba -36b5053c -3c1620d4 -36d6b030 -14550d9d -00000000 -14760d9b -00000000 -24020000 -24030000 -10000007 -00000000 -3c02cf79 -3442696e -05000009 -00000000 -10000009 -00000000 -3c08b541 -3508b79a -0500fff7 -00000000 -10000003 -00000000 -3c03dcd5 -34630e00 -3c15cf79 -36b5696e -3c16dcd5 -36d60e00 -14550d83 -00000000 -14760d81 -00000000 -24020000 -24030000 -10000007 -00000000 -3c022c88 -34423e20 -05000009 -00000000 -10000009 -00000000 -3c08834c -35082020 -0500fff7 -00000000 -10000003 -00000000 -3c03e15b -3463ff7c -3c152c88 -36b53e20 -3c16e15b -36d6ff7c -14550d69 -00000000 -14760d67 -00000000 -24020000 -24030000 -10000007 -00000000 -3c027343 -3442996a -05000009 -00000000 -10000009 -00000000 -3c080b79 -35087cdc -0500fff7 -00000000 -10000003 -00000000 -3c03b90c -3463a064 -24150000 -24160000 -14550d51 -00000000 -14760d4f -00000000 -24020000 -24030000 -10000007 -00000000 -3c025444 -3442e1a0 -05000009 -00000000 -10000009 -00000000 -3c08962a -350845f8 -0500fff7 -00000000 -10000003 -00000000 -3c033e83 -34630400 -3c155444 -36b5e1a0 -3c163e83 -36d60400 -14550d37 -00000000 -14760d35 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02d1be -3442e2c0 -05000009 -00000000 -10000009 -00000000 -3c08f5a6 -35084820 -0500fff7 -00000000 -10000003 -00000000 -3c038900 -34638130 -3c15d1be -36b5e2c0 -3c168900 -36d68130 -14550d1d -00000000 -14760d1b -00000000 -24020000 -24030000 -10000007 -00000000 -3c02197e -344296a8 -05000009 -00000000 -10000009 -00000000 -3c08d0c5 -35087308 -0500fff7 -00000000 -10000003 -00000000 -3c03398e -346359dc -3c15197e -36b596a8 -3c16398e -36d659dc -14550d03 -00000000 -14760d01 -00000000 -24020000 -24030000 -10000007 -00000000 -3c029bf3 -344270aa -05000009 -00000000 -10000009 -00000000 -3c08802b -3508ce60 -0500fff7 -00000000 -10000003 -00000000 -3c03fc5d -346324b8 -3c159bf3 -36b570aa -3c16fc5d -36d624b8 -14550ce9 -00000000 -14760ce7 -00000000 -24020000 -24030000 -10000007 -00000000 -3c021c3d -344227ba -05000009 -00000000 -10000009 -00000000 -3c080ca6 -35084003 -0500fff7 -00000000 -10000003 -00000000 -3c0364d7 -3463f4c2 -24150000 -24160000 -14550cd1 -00000000 -14760ccf -00000000 -24020000 -24030000 -10000007 -00000000 -3c021370 -3442d877 -05000009 -00000000 -10000009 -00000000 -3c08b418 -3508df98 -0500fff7 -00000000 -10000003 -00000000 -3c0386f7 -34636c50 -3c151370 -36b5d877 -3c1686f7 -36d66c50 -14550cb7 -00000000 -14760cb5 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02187a -34427fa0 -05000009 -00000000 -10000009 -00000000 -3c0804b8 -3508fd80 -0500fff7 -00000000 -10000003 -00000000 -3c03a6a7 -34635f45 -24150000 -24160000 -14550c9f -00000000 -14760c9d -00000000 -24020000 -24030000 -10000007 -00000000 -3c02b6a4 -3442aa54 -05000009 -00000000 -10000009 -00000000 -3c088c7a -3508540a -0500fff7 -00000000 -10000003 -00000000 -3c03fd28 -34639d08 -3c15b6a4 -36b5aa54 -3c16fd28 -36d69d08 -14550c85 -00000000 -14760c83 -00000000 -24020000 -24030000 -10000007 -00000000 -3c022d31 -34423870 -05000009 -00000000 -10000009 -00000000 -3c0829d1 -35083168 -0500fff7 -00000000 -10000003 -00000000 -3c037e3b -34632a5c -24150000 -24160000 -14550c6d -00000000 -14760c6b -00000000 -24020000 -24030000 -10000007 -00000000 -3c02c7d9 -3442e5e0 -05000009 -00000000 -10000009 -00000000 -3c08847c -35081c31 -0500fff7 -00000000 -10000003 -00000000 -3c03e5df -3463cb74 -3c15c7d9 -36b5e5e0 -3c16e5df -36d6cb74 -14550c53 -00000000 -14760c51 -00000000 -24020000 -24030000 -10000007 -00000000 -3c021906 -34427280 -05000009 -00000000 -10000009 -00000000 -3c08bc68 -3508c0b3 -0500fff7 -00000000 -10000003 -00000000 -3c036622 -3463b824 -3c151906 -36b57280 -3c166622 -36d6b824 -14550c39 -00000000 -14760c37 -00000000 -24020000 -24030000 -10000007 -00000000 -3c029839 -34427888 -05000009 -00000000 -10000009 -00000000 -3c08c89a -3508fa42 -0500fff7 -00000000 -10000003 -00000000 -3c033bef -34634814 -3c159839 -36b57888 -3c163bef -36d64814 -14550c1f -00000000 -14760c1d -00000000 -24020000 -24030000 -10000007 -00000000 -3c023499 -3442da1a -05000009 -00000000 -10000009 -00000000 -3c08eb72 -35081458 -0500fff7 -00000000 -10000003 -00000000 -3c030db7 -34632217 -3c153499 -36b5da1a -3c160db7 -36d62217 -14550c05 -00000000 -14760c03 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02c86a -34428a68 -05000009 -00000000 -10000009 -00000000 -3c08370d -35088474 -0500fff7 -00000000 -10000003 -00000000 -3c03b2b4 -3463cbc0 -24150000 -24160000 -14550bed -00000000 -14760beb -00000000 -24020000 -24030000 -10000007 -00000000 -3c023522 -34428984 -05000009 -00000000 -10000009 -00000000 -3c08bac9 -35085a80 -0500fff7 -00000000 -10000003 -00000000 -3c038e18 -34637210 -3c153522 -36b58984 -3c168e18 -36d67210 -14550bd3 -00000000 -14760bd1 -00000000 -24020000 -24030000 -10000007 -00000000 -3c029c99 -34423ef6 -05000009 -00000000 -10000009 -00000000 -3c08fc60 -35086368 -0500fff7 -00000000 -10000003 -00000000 -3c03d1d9 -3463c170 -3c159c99 -36b53ef6 -3c16d1d9 -36d6c170 -14550bb9 -00000000 -14760bb7 -00000000 -24020000 -24030000 -10000007 -00000000 -3c022a34 -3442ebe0 -05000009 -00000000 -10000009 -00000000 -3c08d3aa -35089850 -0500fff7 -00000000 -10000003 -00000000 -3c032b45 -34634d30 -3c152a34 -36b5ebe0 -3c162b45 -36d64d30 -14550b9f -00000000 -14760b9d -00000000 -24020000 -24030000 -10000007 -00000000 -3c02dc8a -3442ca06 -05000009 -00000000 -10000009 -00000000 -3c085818 -35085fe8 -0500fff7 -00000000 -10000003 -00000000 -3c039b1f -3463c024 -24150000 -24160000 -14550b87 -00000000 -14760b85 -00000000 -24020000 -24030000 -10000007 -00000000 -3c029c95 -3442c54e -05000009 -00000000 -10000009 -00000000 -3c0876e4 -35084284 -0500fff7 -00000000 -10000003 -00000000 -3c034c8f -34634d10 -24150000 -24160000 -14550b6f -00000000 -14760b6d -00000000 -24020000 -24030000 -10000007 -00000000 -3c02f959 -3442a600 -05000009 -00000000 -10000009 -00000000 -3c08ed95 -35083f80 -0500fff7 -00000000 -10000003 -00000000 -3c033695 -3463bd49 -3c15f959 -36b5a600 -3c163695 -36d6bd49 -14550b55 -00000000 -14760b53 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02234d -3442a0c0 -05000009 -00000000 -10000009 -00000000 -3c086337 -3508ad50 -0500fff7 -00000000 -10000003 -00000000 -3c03bcd7 -3463f8dc -24150000 -24160000 -14550b3d -00000000 -14760b3b -00000000 -24020000 -24030000 -10000007 -00000000 -3c020fb6 -3442a53c -05000009 -00000000 -10000009 -00000000 -3c089c2d -35082880 -0500fff7 -00000000 -10000003 -00000000 -3c03be70 -34639a00 -3c150fb6 -36b5a53c -3c16be70 -36d69a00 -14550b23 -00000000 -14760b21 -00000000 -24020000 -24030000 -10000007 -00000000 -3c027655 -34422200 -05000009 -00000000 -10000009 -00000000 -3c089c28 -35085348 -0500fff7 -00000000 -10000003 -00000000 -3c0371de -3463f7ea -3c157655 -36b52200 -3c1671de -36d6f7ea -14550b09 -00000000 -14760b07 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02d8f3 -3442a680 -05000009 -00000000 -10000009 -00000000 -3c0885ed -35088d20 -0500fff7 -00000000 -10000003 -00000000 -3c0349c5 -3463fb92 -3c15d8f3 -36b5a680 -3c1649c5 -36d6fb92 -14550aef -00000000 -14760aed -00000000 -24020000 -24030000 -10000007 -00000000 -3c02751d -344223bc -05000009 -00000000 -10000009 -00000000 -3c08d5a7 -350819d8 -0500fff7 -00000000 -10000003 -00000000 -3c0318b9 -3463aa1c -3c15751d -36b523bc -3c1618b9 -36d6aa1c -14550ad5 -00000000 -14760ad3 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02442e -3442f2d8 -05000009 -00000000 -10000009 -00000000 -3c086af7 -35081036 -0500fff7 -00000000 -10000003 -00000000 -3c03c490 -346325b4 -24150000 -24160000 -14550abd -00000000 -14760abb -00000000 -24020000 -24030000 -10000007 -00000000 -3c020191 -3442e080 -05000009 -00000000 -10000009 -00000000 -3c08ea96 -35082a7c -0500fff7 -00000000 -10000003 -00000000 -3c03642e -34634740 -3c150191 -36b5e080 -3c16642e -36d64740 -14550aa3 -00000000 -14760aa1 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02e5ab -34426ce8 -05000009 -00000000 -10000009 -00000000 -3c0847ae -3508c030 -0500fff7 -00000000 -10000003 -00000000 -3c036acc -34636cd0 -24150000 -24160000 -14550a8b -00000000 -14760a89 -00000000 -24020000 -24030000 -10000007 -00000000 -3c021e23 -344278ee -05000009 -00000000 -10000009 -00000000 -3c08f3a9 -350848e6 -0500fff7 -00000000 -10000003 -00000000 -3c03127c -3463cd50 -3c151e23 -36b578ee -3c16127c -36d6cd50 -14550a71 -00000000 -14760a6f -00000000 -24020000 -24030000 -10000007 -00000000 -3c0241f8 -3442f4b8 -05000009 -00000000 -10000009 -00000000 -3c084e07 -35089da0 -0500fff7 -00000000 -10000003 -00000000 -3c03e980 -3463da38 -24150000 -24160000 -14550a59 -00000000 -14760a57 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02d021 -344208c0 -05000009 -00000000 -10000009 -00000000 -3c08e1fa -35086bc0 -0500fff7 -00000000 -10000003 -00000000 -3c03416f -34636238 -3c15d021 -36b508c0 -3c16416f -36d66238 -14550a3f -00000000 -14760a3d -00000000 -24020000 -24030000 -10000007 -00000000 -3c029c4c -3442c2dc -05000009 -00000000 -10000009 -00000000 -3c087ebc -3508f3bc -0500fff7 -00000000 -10000003 -00000000 -3c036cdf -34639664 -24150000 -24160000 -14550a27 -00000000 -14760a25 -00000000 -24020000 -24030000 -10000007 -00000000 -3c0227c6 -3442a7a0 -05000009 -00000000 -10000009 -00000000 -3c084752 -3508405d -0500fff7 -00000000 -10000003 -00000000 -3c03a780 -3463a0d0 -24150000 -24160000 -14550a0f -00000000 -14760a0d -00000000 -24020000 -24030000 -10000007 -00000000 -3c0275d6 -3442df00 -05000009 -00000000 -10000009 -00000000 -3c080cfd -35082a00 -0500fff7 -00000000 -10000003 -00000000 -3c039c8a -3463095e -24150000 -24160000 -145509f7 -00000000 -147609f5 -00000000 -24020000 -24030000 -10000007 -00000000 -3c028113 -34426168 -05000009 -00000000 -10000009 -00000000 -3c08eab5 -3508a598 -0500fff7 -00000000 -10000003 -00000000 -3c0373d8 -346350ad -3c158113 -36b56168 -3c1673d8 -36d650ad -145509dd -00000000 -147609db -00000000 -24020000 -24030000 -10000007 -00000000 -3c02e2fa -344274c4 -05000009 -00000000 -10000009 -00000000 -3c08327f -3508d3c0 -0500fff7 -00000000 -10000003 -00000000 -3c0345c4 -34639600 -24150000 -24160000 -145509c5 -00000000 -147609c3 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02cbd2 -34420698 -05000009 -00000000 -10000009 -00000000 -3c08afb6 -35082550 -0500fff7 -00000000 -10000003 -00000000 -3c0324e9 -34639b20 -3c15cbd2 -36b50698 -3c1624e9 -36d69b20 -145509ab -00000000 -147609a9 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02b3b5 -344225bd -05000009 -00000000 -10000009 -00000000 -3c080dc0 -35083c69 -0500fff7 -00000000 -10000003 -00000000 -3c03e917 -3463066a -24150000 -24160000 -14550993 -00000000 -14760991 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02a5f2 -3442a950 -05000009 -00000000 -10000009 -00000000 -3c0878e2 -350813c8 -0500fff7 -00000000 -10000003 -00000000 -3c03e511 -34632d82 -24150000 -24160000 -1455097b -00000000 -14760979 -00000000 -24020000 -24030000 -10000007 -00000000 -3c022dfd -3442e0f8 -05000009 -00000000 -10000009 -00000000 -3c08e981 -3508ebd4 -0500fff7 -00000000 -10000003 -00000000 -3c03e0ef -3463d180 -3c152dfd -36b5e0f8 -3c16e0ef -36d6d180 -14550961 -00000000 -1476095f -00000000 -24020000 -24030000 -10000007 -00000000 -3c02cbe8 -3442adea -05000009 -00000000 -10000009 -00000000 -3c088b1b -3508d002 -0500fff7 -00000000 -10000003 -00000000 -3c0319c1 -346329ac -3c15cbe8 -36b5adea -3c1619c1 -36d629ac -14550947 -00000000 -14760945 -00000000 -24020000 -24030000 -10000007 -00000000 -3c025167 -3442be58 -05000009 -00000000 -10000009 -00000000 -3c082a9f -35087c7a -0500fff7 -00000000 -10000003 -00000000 -3c036baa -3463804c -24150000 -24160000 -1455092f -00000000 -1476092d -00000000 -24020000 -24030000 -10000007 -00000000 -3c027038 -34422f80 -05000009 -00000000 -10000009 -00000000 -3c083742 -35080a60 -0500fff7 -00000000 -10000003 -00000000 -3c039078 -3463aa46 -24150000 -24160000 -14550917 -00000000 -14760915 -00000000 -24020000 -24030000 -10000007 -00000000 -3c021642 -3442c61c -05000009 -00000000 -10000009 -00000000 -3c08f242 -3508e600 -0500fff7 -00000000 -10000003 -00000000 -3c03a38d -34632e80 -3c151642 -36b5c61c -3c16a38d -36d62e80 -145508fd -00000000 -147608fb -00000000 -24020000 -24030000 -10000007 -00000000 -3c022e48 -3442da70 -05000009 -00000000 -10000009 -00000000 -3c084516 -3508dde0 -0500fff7 -00000000 -10000003 -00000000 -3c03f45c -3463d83c -24150000 -24160000 -145508e5 -00000000 -147608e3 -00000000 -24020000 -24030000 -10000007 -00000000 -3c026e9d -34425cda -05000009 -00000000 -10000009 -00000000 -3c0865b5 -3508bef8 -0500fff7 -00000000 -10000003 -00000000 -3c035a8d -34631dfe -24150000 -24160000 -145508cd -00000000 -147608cb -00000000 -24020000 -24030000 -10000007 -00000000 -3c022ef6 -3442ffb2 -05000009 -00000000 -10000009 -00000000 -3c08d6e6 -3508b0ce -0500fff7 -00000000 -10000003 -00000000 -3c03b22d -34635dd0 -3c152ef6 -36b5ffb2 -3c16b22d -36d65dd0 -145508b3 -00000000 -147608b1 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02e46f -34424670 -05000009 -00000000 -10000009 -00000000 -3c0862be -350896bc -0500fff7 -00000000 -10000003 -00000000 -3c03c9e5 -34634029 -24150000 -24160000 -1455089b -00000000 -14760899 -00000000 -24020000 -24030000 -10000007 -00000000 -3c023b77 -344278a8 -05000009 -00000000 -10000009 -00000000 -3c084aa8 -35084010 -0500fff7 -00000000 -10000003 -00000000 -3c03f2ba -3463e330 -24150000 -24160000 -14550883 -00000000 -14760881 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02d830 -34423018 -05000009 -00000000 -10000009 -00000000 -3c08a594 -35083217 -0500fff7 -00000000 -10000003 -00000000 -3c03b12c -3463d314 -3c15d830 -36b53018 -3c16b12c -36d6d314 -14550869 -00000000 -14760867 -00000000 -24020000 -24030000 -10000007 -00000000 -3c029799 -344230dc -05000009 -00000000 -10000009 -00000000 -3c08ff88 -35084480 -0500fff7 -00000000 -10000003 -00000000 -3c03fa05 -34638170 -3c159799 -36b530dc -3c16fa05 -36d68170 -1455084f -00000000 -1476084d -00000000 -24020000 -24030000 -10000007 -00000000 -3c02f7c6 -34421500 -05000009 -00000000 -10000009 -00000000 -3c08b770 -35081bc6 -0500fff7 -00000000 -10000003 -00000000 -3c030bbe -3463dddc -3c15f7c6 -36b51500 -3c160bbe -36d6dddc -14550835 -00000000 -14760833 -00000000 -24020000 -24030000 -10000007 -00000000 -3c024a9a -3442b34c -05000009 -00000000 -10000009 -00000000 -3c08cce1 -3508c6fc -0500fff7 -00000000 -10000003 -00000000 -3c037cb4 -34630e1c -3c154a9a -36b5b34c -3c167cb4 -36d60e1c -1455081b -00000000 -14760819 -00000000 -24020000 -24030000 -10000007 -00000000 -3c022af3 -3442319c -05000009 -00000000 -10000009 -00000000 -3c0843b2 -3508fbcc -0500fff7 -00000000 -10000003 -00000000 -3c035340 -34631ab0 -24150000 -24160000 -14550803 -00000000 -14760801 -00000000 -24020000 -24030000 -10000007 -00000000 -3c0241f8 -34427d74 -05000009 -00000000 -10000009 -00000000 -3c082b3d -3508a200 -0500fff7 -00000000 -10000003 -00000000 -3c03f104 -34631e93 -24150000 -24160000 -145507eb -00000000 -147607e9 -00000000 -24020000 -24030000 -10000007 -00000000 -3c025dc7 -3442e9d6 -05000009 -00000000 -10000009 -00000000 -3c08e89e -3508e957 -0500fff7 -00000000 -10000003 -00000000 -3c03c9af -3463f608 -3c155dc7 -36b5e9d6 -3c16c9af -36d6f608 -145507d1 -00000000 -147607cf -00000000 -24020000 -24030000 -10000007 -00000000 -3c02baa8 -3442e578 -05000009 -00000000 -10000009 -00000000 -3c086b55 -350849a0 -0500fff7 -00000000 -10000003 -00000000 -3c032bbc -3463ae47 -24150000 -24160000 -145507b9 -00000000 -147607b7 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02562b -34429778 -05000009 -00000000 -10000009 -00000000 -3c0809e7 -35080922 -0500fff7 -00000000 -10000003 -00000000 -3c03eb56 -34630a9c -24150000 -24160000 -145507a1 -00000000 -1476079f -00000000 -24020000 -24030000 -10000007 -00000000 -3c0257ff -34420cf8 -05000009 -00000000 -10000009 -00000000 -3c088d56 -3508e0f2 -0500fff7 -00000000 -10000003 -00000000 -3c0373af -34631b80 -3c1557ff -36b50cf8 -3c1673af -36d61b80 -14550787 -00000000 -14760785 -00000000 -24020000 -24030000 -10000007 -00000000 -3c0261fc -3442d0d4 -05000009 -00000000 -10000009 -00000000 -3c081034 -350851f7 -0500fff7 -00000000 -10000003 -00000000 -3c035606 -34631ea0 -24150000 -24160000 -1455076f -00000000 -1476076d -00000000 -24020000 -24030000 -10000007 -00000000 -3c023809 -3442112c -05000009 -00000000 -10000009 -00000000 -3c084a6f -3508a38c -0500fff7 -00000000 -10000003 -00000000 -3c032898 -346383b2 -24150000 -24160000 -14550757 -00000000 -14760755 -00000000 -24020000 -24030000 -10000007 -00000000 -3c029f2a -3442f260 -05000009 -00000000 -10000009 -00000000 -3c08ac33 -35085600 -0500fff7 -00000000 -10000003 -00000000 -3c034a0f -34630974 -3c159f2a -36b5f260 -3c164a0f -36d60974 -1455073d -00000000 -1476073b -00000000 -24020000 -24030000 -10000007 -00000000 -3c029e5e -34428d3c -05000009 -00000000 -10000009 -00000000 -3c0883ea -35083840 -0500fff7 -00000000 -10000003 -00000000 -3c0320d6 -3463918a -3c159e5e -36b58d3c -3c1620d6 -36d6918a -14550723 -00000000 -14760721 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02c104 -34427530 -05000009 -00000000 -10000009 -00000000 -3c08e192 -35082ddb -0500fff7 -00000000 -10000003 -00000000 -3c03b013 -34633970 -3c15c104 -36b57530 -3c16b013 -36d63970 -14550709 -00000000 -14760707 -00000000 -24020000 -24030000 -10000007 -00000000 -3c024ac7 -344239fe -05000009 -00000000 -10000009 -00000000 -3c0837bc -3508e9a0 -0500fff7 -00000000 -10000003 -00000000 -3c030b1a -3463c9d2 -24150000 -24160000 -145506f1 -00000000 -147606ef -00000000 -24020000 -24030000 -10000007 -00000000 -3c02ec7a -3442d2f0 -05000009 -00000000 -10000009 -00000000 -3c085178 -35087348 -0500fff7 -00000000 -10000003 -00000000 -3c037739 -346395f6 -24150000 -24160000 -145506d9 -00000000 -147606d7 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02fcec -3442add0 -05000009 -00000000 -10000009 -00000000 -3c08ff34 -35082a8a -0500fff7 -00000000 -10000003 -00000000 -3c034ed4 -34633c1a -3c15fcec -36b5add0 -3c164ed4 -36d63c1a -145506bf -00000000 -147606bd -00000000 -24020000 -24030000 -10000007 -00000000 -3c02e2b5 -3442fdd8 -05000009 -00000000 -10000009 -00000000 -3c084508 -3508a810 -0500fff7 -00000000 -10000003 -00000000 -3c039299 -34631dc6 -24150000 -24160000 -145506a7 -00000000 -147606a5 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02fc91 -34421f64 -05000009 -00000000 -10000009 -00000000 -3c08c2c1 -35085004 -0500fff7 -00000000 -10000003 -00000000 -3c032061 -3463c4d0 -3c15fc91 -36b51f64 -3c162061 -36d6c4d0 -1455068d -00000000 -1476068b -00000000 -24020000 -24030000 -10000007 -00000000 -3c023f1d -344295dc -05000009 -00000000 -10000009 -00000000 -3c086f27 -35084b3c -0500fff7 -00000000 -10000003 -00000000 -3c03efe0 -34630ff0 -24150000 -24160000 -14550675 -00000000 -14760673 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02a298 -3442d40c -05000009 -00000000 -10000009 -00000000 -3c08157f -350897ce -0500fff7 -00000000 -10000003 -00000000 -3c032ba5 -34635f00 -24150000 -24160000 -1455065d -00000000 -1476065b -00000000 -24020000 -24030000 -10000007 -00000000 -3c02bf4b -3442ea12 -05000009 -00000000 -10000009 -00000000 -3c087141 -35080cd0 -0500fff7 -00000000 -10000003 -00000000 -3c032ce5 -34632246 -24150000 -24160000 -14550645 -00000000 -14760643 -00000000 -24020000 -24030000 -10000007 -00000000 -3c0232ab -3442beef -05000009 -00000000 -10000009 -00000000 -3c08ee91 -350853d0 -0500fff7 -00000000 -10000003 -00000000 -3c039ef4 -346312d2 -3c1532ab -36b5beef -3c169ef4 -36d612d2 -1455062b -00000000 -14760629 -00000000 -24020000 -24030000 -10000007 -00000000 -3c024c78 -34422eb0 -05000009 -00000000 -10000009 -00000000 -3c088d84 -35088290 -0500fff7 -00000000 -10000003 -00000000 -3c033491 -3463e3fe -3c154c78 -36b52eb0 -3c163491 -36d6e3fe -14550611 -00000000 -1476060f -00000000 -24020000 -24030000 -10000007 -00000000 -3c02fced -3442a322 -05000009 -00000000 -10000009 -00000000 -3c082209 -35084f88 -0500fff7 -00000000 -10000003 -00000000 -3c03987c -3463e552 -24150000 -24160000 -145505f9 -00000000 -147605f7 -00000000 -24020000 -24030000 -10000007 -00000000 -3c029a99 -344284f4 -05000009 -00000000 -10000009 -00000000 -3c08dd5c -35084cdc -0500fff7 -00000000 -10000003 -00000000 -3c0395c7 -3463cfb8 -3c159a99 -36b584f4 -3c1695c7 -36d6cfb8 -145505df -00000000 -147605dd -00000000 -24020000 -24030000 -10000007 -00000000 -3c02859b -3442a710 -05000009 -00000000 -10000009 -00000000 -3c08401b -3508f5ce -0500fff7 -00000000 -10000003 -00000000 -3c03ad5e -3463f580 -24150000 -24160000 -145505c7 -00000000 -147605c5 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02e318 -344260dc -05000009 -00000000 -10000009 -00000000 -3c0844a5 -35086676 -0500fff7 -00000000 -10000003 -00000000 -3c034d43 -3463fd80 -24150000 -24160000 -145505af -00000000 -147605ad -00000000 -24020000 -24030000 -10000007 -00000000 -3c02190a -34421f10 -05000009 -00000000 -10000009 -00000000 -3c0885b9 -3508de28 -0500fff7 -00000000 -10000003 -00000000 -3c03f22f -346343cc -3c15190a -36b51f10 -3c16f22f -36d643cc -14550595 -00000000 -14760593 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02edf5 -344272fa -05000009 -00000000 -10000009 -00000000 -3c084ff3 -35082d84 -0500fff7 -00000000 -10000003 -00000000 -3c03f2ce -3463c4fc -24150000 -24160000 -1455057d -00000000 -1476057b -00000000 -24020000 -24030000 -10000007 -00000000 -3c02613b -3442fc20 -05000009 -00000000 -10000009 -00000000 -3c083185 -35085688 -0500fff7 -00000000 -10000003 -00000000 -3c03880b -34638150 -24150000 -24160000 -14550565 -00000000 -14760563 -00000000 -24020000 -24030000 -10000007 -00000000 -3c023fe0 -3442b906 -05000009 -00000000 -10000009 -00000000 -3c08a086 -3508eaa2 -0500fff7 -00000000 -10000003 -00000000 -3c0381b9 -34636b4a -3c153fe0 -36b5b906 -3c1681b9 -36d66b4a -1455054b -00000000 -14760549 -00000000 -24020000 -24030000 -10000007 -00000000 -3c022609 -3442357c -05000009 -00000000 -10000009 -00000000 -3c084a9c -3508f414 -0500fff7 -00000000 -10000003 -00000000 -3c03ce8a -3463bd3f -24150000 -24160000 -14550533 -00000000 -14760531 -00000000 -24020000 -24030000 -10000007 -00000000 -3c028dfa -3442eaca -05000009 -00000000 -10000009 -00000000 -3c08badb -3508bfac -0500fff7 -00000000 -10000003 -00000000 -3c0336ee -346347e8 -3c158dfa -36b5eaca -3c1636ee -36d647e8 -14550519 -00000000 -14760517 -00000000 -24020000 -24030000 -10000007 -00000000 -3c029471 -3442ebb8 -05000009 -00000000 -10000009 -00000000 -3c08e5d1 -35083dc0 -0500fff7 -00000000 -10000003 -00000000 -3c03d6fd -346376d4 -3c159471 -36b5ebb8 -3c16d6fd -36d676d4 -145504ff -00000000 -147604fd -00000000 -24020000 -24030000 -10000007 -00000000 -3c0286e1 -34422e78 -05000009 -00000000 -10000009 -00000000 -3c08632c -35085e60 -0500fff7 -00000000 -10000003 -00000000 -3c03659d -34637104 -24150000 -24160000 -145504e7 -00000000 -147604e5 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02aa94 -3442b69c -05000009 -00000000 -10000009 -00000000 -3c08cf91 -3508a250 -0500fff7 -00000000 -10000003 -00000000 -3c032ac1 -3463f1d6 -3c15aa94 -36b5b69c -3c162ac1 -36d6f1d6 -145504cd -00000000 -147604cb -00000000 -24020000 -24030000 -10000007 -00000000 -3c02faa8 -34421f0a -05000009 -00000000 -10000009 -00000000 -3c0849d1 -350896fe -0500fff7 -00000000 -10000003 -00000000 -3c03f9e1 -3463adb0 -24150000 -24160000 -145504b5 -00000000 -147604b3 -00000000 -24020000 -24030000 -10000007 -00000000 -3c0241be -3442d444 -05000009 -00000000 -10000009 -00000000 -3c089ebe -35082784 -0500fff7 -00000000 -10000003 -00000000 -3c031652 -3463560f -3c1541be -36b5d444 -3c161652 -36d6560f -1455049b -00000000 -14760499 -00000000 -24020000 -24030000 -10000007 -00000000 -3c025b82 -344221e0 -05000009 -00000000 -10000009 -00000000 -3c08b322 -3508d38c -0500fff7 -00000000 -10000003 -00000000 -3c031289 -3463bca0 -3c155b82 -36b521e0 -3c161289 -36d6bca0 -14550481 -00000000 -1476047f -00000000 -24020000 -24030000 -10000007 -00000000 -3c028770 -3442cafc -05000009 -00000000 -10000009 -00000000 -3c0811b9 -35085797 -0500fff7 -00000000 -10000003 -00000000 -3c03439a -3463b537 -24150000 -24160000 -14550469 -00000000 -14760467 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02ccc5 -3442cb60 -05000009 -00000000 -10000009 -00000000 -3c084bb0 -35086da4 -0500fff7 -00000000 -10000003 -00000000 -3c03d991 -3463fcb0 -24150000 -24160000 -14550451 -00000000 -1476044f -00000000 -24020000 -24030000 -10000007 -00000000 -3c025585 -34427404 -05000009 -00000000 -10000009 -00000000 -3c0880a2 -3508b0e0 -0500fff7 -00000000 -10000003 -00000000 -3c0337f8 -3463d0f0 -3c155585 -36b57404 -3c1637f8 -36d6d0f0 -14550437 -00000000 -14760435 -00000000 -24020000 -24030000 -10000007 -00000000 -3c022e74 -3442626c -05000009 -00000000 -10000009 -00000000 -3c080872 -3508dd3e -0500fff7 -00000000 -10000003 -00000000 -3c0317a6 -34635430 -24150000 -24160000 -1455041f -00000000 -1476041d -00000000 -24020000 -24030000 -10000007 -00000000 -3c029676 -3442e250 -05000009 -00000000 -10000009 -00000000 -3c086a9e -350876e0 -0500fff7 -00000000 -10000003 -00000000 -3c03755f -346353a0 -24150000 -24160000 -14550407 -00000000 -14760405 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02a3ef -344267c8 -05000009 -00000000 -10000009 -00000000 -3c082761 -35086458 -0500fff7 -00000000 -10000003 -00000000 -3c039d58 -34638850 -24150000 -24160000 -145503ef -00000000 -147603ed -00000000 -24020000 -24030000 -10000007 -00000000 -3c029851 -34427318 -05000009 -00000000 -10000009 -00000000 -3c0848cc -350805f0 -0500fff7 -00000000 -10000003 -00000000 -3c03b953 -3463e6ac -24150000 -24160000 -145503d7 -00000000 -147603d5 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02b332 -34426780 -05000009 -00000000 -10000009 -00000000 -3c08e0f0 -35085ce8 -0500fff7 -00000000 -10000003 -00000000 -3c03d62c -346364ba -3c15b332 -36b56780 -3c16d62c -36d664ba -145503bd -00000000 -147603bb -00000000 -24020000 -24030000 -10000007 -00000000 -3c027ce6 -3442e8e8 -05000009 -00000000 -10000009 -00000000 -3c08c5f3 -350875d0 -0500fff7 -00000000 -10000003 -00000000 -3c039a45 -3463b4e0 -3c157ce6 -36b5e8e8 -3c169a45 -36d6b4e0 -145503a3 -00000000 -147603a1 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02e297 -34427d50 -05000009 -00000000 -10000009 -00000000 -3c080def -35086e32 -0500fff7 -00000000 -10000003 -00000000 -3c03d513 -3463c978 -24150000 -24160000 -1455038b -00000000 -14760389 -00000000 -24020000 -24030000 -10000007 -00000000 -3c027db1 -3442fbb0 -05000009 -00000000 -10000009 -00000000 -3c08d2e6 -35088658 -0500fff7 -00000000 -10000003 -00000000 -3c032785 -3463dae6 -3c157db1 -36b5fbb0 -3c162785 -36d6dae6 -14550371 -00000000 -1476036f -00000000 -24020000 -24030000 -10000007 -00000000 -3c02c505 -3442eb80 -05000009 -00000000 -10000009 -00000000 -3c081905 -3508edb0 -0500fff7 -00000000 -10000003 -00000000 -3c0356c1 -3463479e -24150000 -24160000 -14550359 -00000000 -14760357 -00000000 -24020000 -24030000 -10000007 -00000000 -3c022938 -3442f462 -05000009 -00000000 -10000009 -00000000 -3c08a9fd -3508286c -0500fff7 -00000000 -10000003 -00000000 -3c035faa -34637298 -3c152938 -36b5f462 -3c165faa -36d67298 -1455033f -00000000 -1476033d -00000000 -24020000 -24030000 -10000007 -00000000 -3c024262 -34423100 -05000009 -00000000 -10000009 -00000000 -3c0834a5 -35083ea8 -0500fff7 -00000000 -10000003 -00000000 -3c036fee -34634f64 -24150000 -24160000 -14550327 -00000000 -14760325 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02e8c4 -3442474b -05000009 -00000000 -10000009 -00000000 -3c0852f9 -35083280 -0500fff7 -00000000 -10000003 -00000000 -3c03ca13 -3463b95f -24150000 -24160000 -1455030f -00000000 -1476030d -00000000 -24020000 -24030000 -10000007 -00000000 -3c021881 -3442b730 -05000009 -00000000 -10000009 -00000000 -3c0891dd -35087060 -0500fff7 -00000000 -10000003 -00000000 -3c039f53 -34634bfa -3c151881 -36b5b730 -3c169f53 -36d64bfa -145502f5 -00000000 -147602f3 -00000000 -24020000 -24030000 -10000007 -00000000 -3c026c91 -3442d050 -05000009 -00000000 -10000009 -00000000 -3c0851e6 -350836d8 -0500fff7 -00000000 -10000003 -00000000 -3c03a433 -3463dfcc -24150000 -24160000 -145502dd -00000000 -147602db -00000000 -24020000 -24030000 -10000007 -00000000 -3c0288a0 -3442e79e -05000009 -00000000 -10000009 -00000000 -3c081d91 -3508f062 -0500fff7 -00000000 -10000003 -00000000 -3c03d9f1 -34637580 -24150000 -24160000 -145502c5 -00000000 -147602c3 -00000000 -24020000 -24030000 -10000007 -00000000 -3c0244f3 -34429bec -05000009 -00000000 -10000009 -00000000 -3c08e151 -3508c109 -0500fff7 -00000000 -10000003 -00000000 -3c0338c7 -34634868 -3c1544f3 -36b59bec -3c1638c7 -36d64868 -145502ab -00000000 -147602a9 -00000000 -24020000 -24030000 -10000007 -00000000 -3c0296be -3442756c -05000009 -00000000 -10000009 -00000000 -3c08c93d -35086700 -0500fff7 -00000000 -10000003 -00000000 -3c031d8f -34633d83 -3c1596be -36b5756c -3c161d8f -36d63d83 -14550291 -00000000 -1476028f -00000000 -24020000 -24030000 -10000007 -00000000 -3c02d755 -34427eb4 -05000009 -00000000 -10000009 -00000000 -3c08fc0f -3508dece -0500fff7 -00000000 -10000003 -00000000 -3c035be7 -34638000 -3c15d755 -36b57eb4 -3c165be7 -36d68000 -14550277 -00000000 -14760275 -00000000 -24020000 -24030000 -10000007 -00000000 -3c027cf3 -34426c0a -05000009 -00000000 -10000009 -00000000 -3c08fbe4 -3508a3b0 -0500fff7 -00000000 -10000003 -00000000 -3c03d398 -346357d0 -3c157cf3 -36b56c0a -3c16d398 -36d657d0 -1455025d -00000000 -1476025b -00000000 -24020000 -24030000 -10000007 -00000000 -3c021ae7 -34423d80 -05000009 -00000000 -10000009 -00000000 -3c083601 -35088a74 -0500fff7 -00000000 -10000003 -00000000 -3c03c31e -3463a020 -24150000 -24160000 -14550245 -00000000 -14760243 -00000000 -24020000 -24030000 -10000007 -00000000 -3c025bb4 -34425c64 -05000009 -00000000 -10000009 -00000000 -3c08ac7c -3508e388 -0500fff7 -00000000 -10000003 -00000000 -3c03b6c8 -3463267d -3c155bb4 -36b55c64 -3c16b6c8 -36d6267d -1455022b -00000000 -14760229 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02aa54 -344290c4 -05000009 -00000000 -10000009 -00000000 -3c086649 -3508e200 -0500fff7 -00000000 -10000003 -00000000 -3c03956e -34636b98 -24150000 -24160000 -14550213 -00000000 -14760211 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02a3ff -34428230 -05000009 -00000000 -10000009 -00000000 -3c08f9c2 -35088bef -0500fff7 -00000000 -10000003 -00000000 -3c03fe12 -3463c0f2 -3c15a3ff -36b58230 -3c16fe12 -36d6c0f2 -145501f9 -00000000 -147601f7 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02c166 -34426df6 -05000009 -00000000 -10000009 -00000000 -3c08b415 -35081430 -0500fff7 -00000000 -10000003 -00000000 -3c038844 -346328c0 -3c15c166 -36b56df6 -3c168844 -36d628c0 -145501df -00000000 -147601dd -00000000 -24020000 -24030000 -10000007 -00000000 -3c021170 -3442e1c0 -05000009 -00000000 -10000009 -00000000 -3c089d2f -3508ffdc -0500fff7 -00000000 -10000003 -00000000 -3c034581 -3463cdba -3c151170 -36b5e1c0 -3c164581 -36d6cdba -145501c5 -00000000 -147601c3 -00000000 -24020000 -24030000 -10000007 -00000000 -3c027c88 -3442abf4 -05000009 -00000000 -10000009 -00000000 -3c08ad58 -3508fd06 -0500fff7 -00000000 -10000003 -00000000 -3c03c515 -346374d6 -3c157c88 -36b5abf4 -3c16c515 -36d674d6 -145501ab -00000000 -147601a9 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02c213 -34426700 -05000009 -00000000 -10000009 -00000000 -3c08f618 -35082edd -0500fff7 -00000000 -10000003 -00000000 -3c03ffa6 -3463f314 -3c15c213 -36b56700 -3c16ffa6 -36d6f314 -14550191 -00000000 -1476018f -00000000 -24020000 -24030000 -10000007 -00000000 -3c0219f9 -34425918 -05000009 -00000000 -10000009 -00000000 -3c08084d -35086082 -0500fff7 -00000000 -10000003 -00000000 -3c035057 -34632e1d -24150000 -24160000 -14550179 -00000000 -14760177 -00000000 -24020000 -24030000 -10000007 -00000000 -3c022fe0 -3442c760 -05000009 -00000000 -10000009 -00000000 -3c08d84a -35082ada -0500fff7 -00000000 -10000003 -00000000 -3c0377d6 -3463d4e8 -3c152fe0 -36b5c760 -3c1677d6 -36d6d4e8 -1455015f -00000000 -1476015d -00000000 -24020000 -24030000 -10000007 -00000000 -3c02a009 -344215a8 -05000009 -00000000 -10000009 -00000000 -3c0880dd -35087048 -0500fff7 -00000000 -10000003 -00000000 -3c037049 -3463d94a -3c15a009 -36b515a8 -3c167049 -36d6d94a -14550145 -00000000 -14760143 -00000000 -24020000 -24030000 -10000007 -00000000 -3c023456 -34421259 -05000009 -00000000 -10000009 -00000000 -3c084001 -3508558e -0500fff7 -00000000 -10000003 -00000000 -3c03d713 -3463845e -24150000 -24160000 -1455012d -00000000 -1476012b -00000000 -24020000 -24030000 -10000007 -00000000 -3c02bdcc -34428f44 -05000009 -00000000 -10000009 -00000000 -3c081e0b -3508a344 -0500fff7 -00000000 -10000003 -00000000 -3c03ea13 -3463b732 -24150000 -24160000 -14550115 -00000000 -14760113 -00000000 -24020000 -24030000 -10000007 -00000000 -3c0266fe -3442f41f -05000009 -00000000 -10000009 -00000000 -3c08adc6 -35082fa0 -0500fff7 -00000000 -10000003 -00000000 -3c0398a0 -3463ce08 -3c1566fe -36b5f41f -3c1698a0 -36d6ce08 -145500fb -00000000 -147600f9 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02b2d5 -3442538c -05000009 -00000000 -10000009 -00000000 -3c0864e0 -3508d7d2 -0500fff7 -00000000 -10000003 -00000000 -3c039eea -3463574c -24150000 -24160000 -145500e3 -00000000 -147600e1 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02bdd2 -3442d88f -05000009 -00000000 -10000009 -00000000 -3c0850eb -35083284 -0500fff7 -00000000 -10000003 -00000000 -3c0320c9 -3463711c -24150000 -24160000 -145500cb -00000000 -147600c9 -00000000 -24020000 -24030000 -10000007 -00000000 -3c0283e6 -3442c124 -05000009 -00000000 -10000009 -00000000 -3c089cb0 -35086f0b -0500fff7 -00000000 -10000003 -00000000 -3c030e42 -3463efa4 -3c1583e6 -36b5c124 -3c160e42 -36d6efa4 -145500b1 -00000000 -147600af -00000000 -24020000 -24030000 -10000007 -00000000 -3c02c019 -3442d540 -05000009 -00000000 -10000009 -00000000 -3c08d6dc -35087dde -0500fff7 -00000000 -10000003 -00000000 -3c03ffae -3463cc98 -3c15c019 -36b5d540 -3c16ffae -36d6cc98 -14550097 -00000000 -14760095 -00000000 -24020000 -24030000 -10000007 -00000000 -3c022dba -34427b70 -05000009 -00000000 -10000009 -00000000 -3c0870ca -35081af8 -0500fff7 -00000000 -10000003 -00000000 -3c03dba1 -346341b0 -24150000 -24160000 -1455007f -00000000 -1476007d -00000000 -24020000 -24030000 -10000007 -00000000 -3c02c841 -3442c5c8 -05000009 -00000000 -10000009 -00000000 -3c08733f -350861a6 -0500fff7 -00000000 -10000003 -00000000 -3c03e3f8 -34632434 -24150000 -24160000 -14550067 -00000000 -14760065 -00000000 -24020000 -24030000 -10000007 -00000000 -3c021838 -34429fc2 -05000009 -00000000 -10000009 -00000000 -3c08f596 -35089546 -0500fff7 -00000000 -10000003 -00000000 -3c03eb95 -346342c8 -3c151838 -36b59fc2 -3c16eb95 -36d642c8 -1455004d -00000000 -1476004b -00000000 -24020000 -24030000 -10000007 -00000000 -3c0207da -34429480 -05000009 -00000000 -10000009 -00000000 -3c080970 -35086a87 -0500fff7 -00000000 -10000003 -00000000 -3c0311a5 -34639570 -24150000 -24160000 -14550035 -00000000 -14760033 -00000000 -24020000 -24030000 -10000007 -00000000 -3c0242f9 -34428793 -05000009 -00000000 -10000009 -00000000 -3c08278f -350897e0 -0500fff7 -00000000 -10000003 -00000000 -3c03dd56 -34635344 -24150000 -24160000 -1455001d -00000000 -1476001b -00000000 -24020000 -24030000 -10000007 -00000000 -3c025f7d -34426c5f -05000008 -00000000 -10000008 -00000000 -24080000 -0500fff8 -00000000 -10000003 -00000000 -3c03632c -346331aa -24150000 -24160000 -14550006 -00000000 -14760004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -26100001 -24120000 -24020000 -24030000 -10000008 -00000000 -3c02be6e -34421670 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08dd4f -35081370 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c0328b8 -346350c0 -24150000 -24160000 -14551512 -00000000 -14761510 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02bcb4 -3442d170 -0501000b -00000000 -1000000b -00000000 -00000000 -3c089bc5 -350852e0 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03913c -346346ad -24150000 -24160000 -145514f8 -00000000 -147614f6 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0236ee -3442e270 -0501000b -00000000 -1000000b -00000000 -00000000 -3c0892f2 -35088a6a -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03aacb -3463fa12 -24150000 -24160000 -145514de -00000000 -147614dc -00000000 -24020000 -24030000 -10000008 -00000000 -3c021b22 -3442d200 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08d39a -35086be2 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c0319b3 -3463f80a -24150000 -24160000 -145514c4 -00000000 -147614c2 -00000000 -24020000 -24030000 -10000008 -00000000 -3c021b15 -34421f5e -0501000b -00000000 -1000000b -00000000 -00000000 -3c08bb00 -3508130a -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c030e69 -346329ba -24150000 -24160000 -145514aa -00000000 -147614a8 -00000000 -24020000 -24030000 -10000008 -00000000 -3c024020 -3442bf52 -0501000b -00000000 -1000000b -00000000 -00000000 -3c0844f2 -3508bff4 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c034efb -346306d3 -3c154020 -36b5bf52 -3c164efb -36d606d3 -1455148e -00000000 -1476148c -00000000 -24020000 -24030000 -10000008 -00000000 -3c0299b6 -344273c4 -0501000b -00000000 -1000000b -00000000 -00000000 -3c086524 -35082740 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c038f4f -3463a720 -3c1599b6 -36b573c4 -3c168f4f -36d6a720 -14551472 -00000000 -14761470 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02920d -3442fadc -0501000b -00000000 -1000000b -00000000 -00000000 -3c08d039 -35081fa3 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c030604 -34633543 -24150000 -24160000 -14551458 -00000000 -14761456 -00000000 -24020000 -24030000 -10000008 -00000000 -3c024382 -3442d088 -0501000b -00000000 -1000000b -00000000 -00000000 -3c085e84 -3508a770 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c037603 -346336b0 -3c154382 -36b5d088 -3c167603 -36d636b0 -1455143c -00000000 -1476143a -00000000 -24020000 -24030000 -10000008 -00000000 -3c028d08 -3442c888 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08a0f5 -35086986 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03c0af -346338c7 -24150000 -24160000 -14551422 -00000000 -14761420 -00000000 -24020000 -24030000 -10000008 -00000000 -3c029cf8 -344206ca -0501000b -00000000 -1000000b -00000000 -00000000 -3c085480 -350846c0 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03dd63 -3463ddf6 -3c159cf8 -36b506ca -3c16dd63 -36d6ddf6 -14551406 -00000000 -14761404 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f5d9 -34426e44 -0501000b -00000000 -1000000b -00000000 -00000000 -3c0859c1 -35084180 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03fba9 -346362f4 -3c15f5d9 -36b56e44 -3c16fba9 -36d662f4 -145513ea -00000000 -147613e8 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02fadc -3442604d -0501000b -00000000 -1000000b -00000000 -00000000 -3c08978d -3508eda0 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03d743 -34634d93 -24150000 -24160000 -145513d0 -00000000 -147613ce -00000000 -24020000 -24030000 -10000008 -00000000 -3c023fc4 -3442f924 -0501000b -00000000 -1000000b -00000000 -00000000 -3c089408 -3508bd4f -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03adda -3463cf90 -24150000 -24160000 -145513b6 -00000000 -147613b4 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02716f -3442e028 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08583d -35085220 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03ae52 -3463d592 -3c15716f -36b5e028 -3c16ae52 -36d6d592 -1455139a -00000000 -14761398 -00000000 -24020000 -24030000 -10000008 -00000000 -3c027b68 -34424a50 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08d4df -3508993d -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c0398f0 -3463413e -24150000 -24160000 -14551380 -00000000 -1476137e -00000000 -24020000 -24030000 -10000008 -00000000 -3c02bf3b -34423ff0 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08bff0 -350833bc -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c031be7 -34630714 -24150000 -24160000 -14551366 -00000000 -14761364 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0259f1 -3442b680 -0501000b -00000000 -1000000b -00000000 -00000000 -3c084897 -350803a0 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03cf7d -346368e8 -3c1559f1 -36b5b680 -3c16cf7d -36d668e8 -1455134a -00000000 -14761348 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02b271 -3442c17b -0501000b -00000000 -1000000b -00000000 -00000000 -3c080ccd -35088fca -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c0369da -34638c8f -3c15b271 -36b5c17b -3c1669da -36d68c8f -1455132e -00000000 -1476132c -00000000 -24020000 -24030000 -10000008 -00000000 -3c02ed7a -34427f00 -0501000b -00000000 -1000000b -00000000 -00000000 -3c086d83 -350839c8 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c032088 -3463a5bc -3c15ed7a -36b57f00 -3c162088 -36d6a5bc -14551312 -00000000 -14761310 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0257b5 -3442ba68 -0501000b -00000000 -1000000b -00000000 -00000000 -3c080a38 -3508c373 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c0388d1 -34632540 -3c1557b5 -36b5ba68 -3c1688d1 -36d62540 -145512f6 -00000000 -147612f4 -00000000 -24020000 -24030000 -10000008 -00000000 -3c026891 -3442a730 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08c84c -35089b2e -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c038c8f -3463d1d0 -24150000 -24160000 -145512dc -00000000 -147612da -00000000 -24020000 -24030000 -10000008 -00000000 -3c02db52 -3442103b -0501000b -00000000 -1000000b -00000000 -00000000 -3c088cf4 -35080c5c -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03eda6 -34631ae8 -24150000 -24160000 -145512c2 -00000000 -147612c0 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02eb53 -3442ad80 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08ba40 -35083e48 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03af8f -3463645c -24150000 -24160000 -145512a8 -00000000 -147612a6 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0210dd -344249c8 -0501000b -00000000 -1000000b -00000000 -00000000 -3c084470 -3508f76a -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c033b10 -34635830 -3c1510dd -36b549c8 -3c163b10 -36d65830 -1455128c -00000000 -1476128a -00000000 -24020000 -24030000 -10000008 -00000000 -3c020264 -344200de -0501000b -00000000 -1000000b -00000000 -00000000 -3c080873 -35085f48 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c039c0d -3463203d -3c150264 -36b500de -3c169c0d -36d6203d -14551270 -00000000 -1476126e -00000000 -24020000 -24030000 -10000008 -00000000 -3c022b64 -3442453e -0501000b -00000000 -1000000b -00000000 -00000000 -3c08891e -3508dab6 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c037769 -34631e00 -24150000 -24160000 -14551256 -00000000 -14761254 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f91f -3442f936 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08e553 -35088bea -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c0375aa -34634adc -24150000 -24160000 -1455123c -00000000 -1476123a -00000000 -24020000 -24030000 -10000008 -00000000 -3c0249b9 -34427758 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08baea -35088130 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03a2c4 -34636df0 -24150000 -24160000 -14551222 -00000000 -14761220 -00000000 -24020000 -24030000 -10000008 -00000000 -3c026e66 -344245f7 -0501000b -00000000 -1000000b -00000000 -00000000 -3c089f2a -3508fd80 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c0327d4 -34633f6a -24150000 -24160000 -14551208 -00000000 -14761206 -00000000 -24020000 -24030000 -10000008 -00000000 -3c027edd -34425dac -0501000b -00000000 -1000000b -00000000 -00000000 -3c089554 -350836ec -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c032ecc -34638300 -24150000 -24160000 -145511ee -00000000 -147611ec -00000000 -24020000 -24030000 -10000008 -00000000 -3c02960e -3442e830 -0501000b -00000000 -1000000b -00000000 -00000000 -3c0875e8 -35089323 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03cc41 -3463d6d0 -3c15960e -36b5e830 -3c16cc41 -36d6d6d0 -145511d2 -00000000 -147611d0 -00000000 -24020000 -24030000 -10000008 -00000000 -3c026143 -3442ab78 -0501000b -00000000 -1000000b -00000000 -00000000 -3c0833b3 -3508996c -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03a9b4 -34631e82 -3c156143 -36b5ab78 -3c16a9b4 -36d61e82 -145511b6 -00000000 -147611b4 -00000000 -24020000 -24030000 -10000008 -00000000 -3c024dd2 -34428e40 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08a973 -35088bf8 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c0372d6 -3463eebc -24150000 -24160000 -1455119c -00000000 -1476119a -00000000 -24020000 -24030000 -10000008 -00000000 -3c027340 -3442d7a8 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08a66a -35081140 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c030f8c -34635ed0 -24150000 -24160000 -14551182 -00000000 -14761180 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02180e -344230b6 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08bbe1 -35087a62 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03c7d2 -3463861f -24150000 -24160000 -14551168 -00000000 -14761166 -00000000 -24020000 -24030000 -10000008 -00000000 -3c028e4f -34421780 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08cb3d -35080bf6 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c036d81 -3463d6ce -24150000 -24160000 -1455114e -00000000 -1476114c -00000000 -24020000 -24030000 -10000008 -00000000 -3c02e4b3 -34424f14 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08391e -350865e0 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c032907 -3463cb38 -3c15e4b3 -36b54f14 -3c162907 -36d6cb38 -14551132 -00000000 -14761130 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02a222 -344293cc -0501000b -00000000 -1000000b -00000000 -00000000 -3c084355 -3508833a -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c031af2 -3463d540 -3c15a222 -36b593cc -3c161af2 -36d6d540 -14551116 -00000000 -14761114 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0248d5 -3442852a -0501000b -00000000 -1000000b -00000000 -00000000 -3c08192b -3508cea0 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03a0ab -34630060 -3c1548d5 -36b5852a -3c16a0ab -36d60060 -145510fa -00000000 -147610f8 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02a469 -3442de20 -0501000b -00000000 -1000000b -00000000 -00000000 -3c084a03 -35087cd3 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03cb19 -3463d72e -3c15a469 -36b5de20 -3c16cb19 -36d6d72e -145510de -00000000 -147610dc -00000000 -24020000 -24030000 -10000008 -00000000 -3c0217f8 -34429778 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08f86c -3508a928 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c038293 -34633648 -24150000 -24160000 -145510c4 -00000000 -147610c2 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f824 -34422c48 -0501000b -00000000 -1000000b -00000000 -00000000 -3c085c1d -350809aa -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c0356be -34635170 -3c15f824 -36b52c48 -3c1656be -36d65170 -145510a8 -00000000 -147610a6 -00000000 -24020000 -24030000 -10000008 -00000000 -3c029382 -344239a2 -0501000b -00000000 -1000000b -00000000 -00000000 -3c083b78 -35086004 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03c158 -34638c00 -3c159382 -36b539a2 -3c16c158 -36d68c00 -1455108c -00000000 -1476108a -00000000 -24020000 -24030000 -10000008 -00000000 -3c02e527 -34420510 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08ae3a -35085d26 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c038137 -3463db6a -24150000 -24160000 -14551072 -00000000 -14761070 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0241c4 -3442ea22 -0501000b -00000000 -1000000b -00000000 -00000000 -3c087e24 -35084800 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c035d13 -3463d3e8 -3c1541c4 -36b5ea22 -3c165d13 -36d6d3e8 -14551056 -00000000 -14761054 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0207d4 -3442c39c -0501000b -00000000 -1000000b -00000000 -00000000 -3c083763 -3508deb0 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c030407 -3463e570 -3c1507d4 -36b5c39c -3c160407 -36d6e570 -1455103a -00000000 -14761038 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0276e0 -34428acc -0501000b -00000000 -1000000b -00000000 -00000000 -3c08bc70 -3508cc00 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03aca1 -34636844 -24150000 -24160000 -14551020 -00000000 -1476101e -00000000 -24020000 -24030000 -10000008 -00000000 -3c021ec2 -3442df8b -0501000b -00000000 -1000000b -00000000 -00000000 -3c084da2 -3508c15d -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03dfec -34633dda -3c151ec2 -36b5df8b -3c16dfec -36d63dda -14551004 -00000000 -14761002 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02c8a4 -3442847f -0501000b -00000000 -1000000b -00000000 -00000000 -3c082936 -3508ae28 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03f9bf -34634784 -3c15c8a4 -36b5847f -3c16f9bf -36d64784 -14550fe8 -00000000 -14760fe6 -00000000 -24020000 -24030000 -10000008 -00000000 -3c029fb4 -34422bd0 -0501000b -00000000 -1000000b -00000000 -00000000 -3c0855b0 -350800e4 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03f358 -346335d0 -3c159fb4 -36b52bd0 -3c16f358 -36d635d0 -14550fcc -00000000 -14760fca -00000000 -24020000 -24030000 -10000008 -00000000 -3c025710 -3442959e -0501000b -00000000 -1000000b -00000000 -00000000 -3c083eca -35082bf3 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c0352e7 -346333e8 -3c155710 -36b5959e -3c1652e7 -36d633e8 -14550fb0 -00000000 -14760fae -00000000 -24020000 -24030000 -10000008 -00000000 -3c028cef -34424f00 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08357a -35081918 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c039dd2 -34630974 -3c158cef -36b54f00 -3c169dd2 -36d60974 -14550f94 -00000000 -14760f92 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02258f -344246be -0501000b -00000000 -1000000b -00000000 -00000000 -3c089774 -35081780 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03adfb -3463f618 -24150000 -24160000 -14550f7a -00000000 -14760f78 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0243b5 -3442b7c4 -0501000b -00000000 -1000000b -00000000 -00000000 -3c080a50 -35086980 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c039a68 -34630572 -3c1543b5 -36b5b7c4 -3c169a68 -36d60572 -14550f5e -00000000 -14760f5c -00000000 -24020000 -24030000 -10000008 -00000000 -3c025817 -3442b258 -0501000b -00000000 -1000000b -00000000 -00000000 -3c088446 -35085c90 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c035b02 -34630520 -24150000 -24160000 -14550f44 -00000000 -14760f42 -00000000 -24020000 -24030000 -10000008 -00000000 -3c024343 -34423ff0 -0501000b -00000000 -1000000b -00000000 -00000000 -3c082aff -35087bac -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c0367c1 -34631d59 -3c154343 -36b53ff0 -3c1667c1 -36d61d59 -14550f28 -00000000 -14760f26 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02445a -3442b3c8 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08ab80 -3508e9ef -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c031c80 -3463b925 -24150000 -24160000 -14550f0e -00000000 -14760f0c -00000000 -24020000 -24030000 -10000008 -00000000 -3c0266ed -34425fe4 -0501000b -00000000 -1000000b -00000000 -00000000 -3c087985 -3508d318 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03bef0 -346301d4 -3c1566ed -36b55fe4 -3c16bef0 -36d601d4 -14550ef2 -00000000 -14760ef0 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02e3b6 -344295da -0501000b -00000000 -1000000b -00000000 -00000000 -3c08ab5b -3508718d -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c030df2 -34637564 -24150000 -24160000 -14550ed8 -00000000 -14760ed6 -00000000 -24020000 -24030000 -10000008 -00000000 -3c023c5e -34426aee -0501000b -00000000 -1000000b -00000000 -00000000 -3c084102 -35082200 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03f830 -34630674 -3c153c5e -36b56aee -3c16f830 -36d60674 -14550ebc -00000000 -14760eba -00000000 -24020000 -24030000 -10000008 -00000000 -3c02c3da -34425df8 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08d3a4 -35088078 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c032b6f -34636b9d -24150000 -24160000 -14550ea2 -00000000 -14760ea0 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0268d8 -3442c134 -0501000b -00000000 -1000000b -00000000 -00000000 -3c084a81 -350822d8 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03bf66 -34632dba -3c1568d8 -36b5c134 -3c16bf66 -36d62dba -14550e86 -00000000 -14760e84 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0249c2 -3442236c -0501000b -00000000 -1000000b -00000000 -00000000 -3c087073 -3508e504 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03e9b0 -34634f03 -3c1549c2 -36b5236c -3c16e9b0 -36d64f03 -14550e6a -00000000 -14760e68 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0279d5 -34422590 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08f76b -35081185 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c033ad2 -346348bd -24150000 -24160000 -14550e50 -00000000 -14760e4e -00000000 -24020000 -24030000 -10000008 -00000000 -3c027603 -3442bd5e -0501000b -00000000 -1000000b -00000000 -00000000 -3c086b02 -35083600 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03dffa -3463ac7a -3c157603 -36b5bd5e -3c16dffa -36d6ac7a -14550e34 -00000000 -14760e32 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02d313 -3442d427 -0501000b -00000000 -1000000b -00000000 -00000000 -3c0887d8 -35081be4 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c032b4d -3463a5a0 -24150000 -24160000 -14550e1a -00000000 -14760e18 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02dead -34422f70 -0501000b -00000000 -1000000b -00000000 -00000000 -3c082c6f -35082563 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03bfdf -3463938e -3c15dead -36b52f70 -3c16bfdf -36d6938e -14550dfe -00000000 -14760dfc -00000000 -24020000 -24030000 -10000008 -00000000 -3c022ecc -3442a870 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08b562 -350883e0 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03210f -3463878e -24150000 -24160000 -14550de4 -00000000 -14760de2 -00000000 -24020000 -24030000 -10000008 -00000000 -3c025cf3 -3442c4c1 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08b3aa -3508e097 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c0356d7 -346339f8 -24150000 -24160000 -14550dca -00000000 -14760dc8 -00000000 -24020000 -24030000 -10000008 -00000000 -3c021e69 -344255c0 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08de31 -35085a6a -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03f7cc -34635b74 -24150000 -24160000 -14550db0 -00000000 -14760dae -00000000 -24020000 -24030000 -10000008 -00000000 -3c02656c -3442ebbc -0501000b -00000000 -1000000b -00000000 -00000000 -3c086fa5 -3508168e -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c032cfe -3463a380 -3c15656c -36b5ebbc -3c162cfe -36d6a380 -14550d94 -00000000 -14760d92 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02b335 -3442d658 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08cc6a -350842ea -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c035b0a -3463cf59 -24150000 -24160000 -14550d7a -00000000 -14760d78 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02551c -3442e904 -0501000b -00000000 -1000000b -00000000 -00000000 -3c083bc1 -35082228 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03c379 -34633342 -3c15551c -36b5e904 -3c16c379 -36d63342 -14550d5e -00000000 -14760d5c -00000000 -24020000 -24030000 -10000008 -00000000 -3c0214fb -3442a980 -0501000b -00000000 -1000000b -00000000 -00000000 -3c081483 -3508b780 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03e5a2 -34634a90 -3c1514fb -36b5a980 -3c16e5a2 -36d64a90 -14550d42 -00000000 -14760d40 -00000000 -24020000 -24030000 -10000008 -00000000 -3c028ffc -3442a172 -0501000b -00000000 -1000000b -00000000 -00000000 -3c081a31 -35080d05 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c034904 -346351f8 -3c158ffc -36b5a172 -3c164904 -36d651f8 -14550d26 -00000000 -14760d24 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02dc53 -34427222 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08242d -35084478 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03dc32 -34636bf4 -3c15dc53 -36b57222 -3c16dc32 -36d66bf4 -14550d0a -00000000 -14760d08 -00000000 -24020000 -24030000 -10000008 -00000000 -3c024266 -34426940 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08b19e -35085baa -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c033378 -346359cc -24150000 -24160000 -14550cf0 -00000000 -14760cee -00000000 -24020000 -24030000 -10000008 -00000000 -3c020468 -3442d78b -0501000b -00000000 -1000000b -00000000 -00000000 -3c08dcb0 -3508806d -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03b999 -3463cef0 -24150000 -24160000 -14550cd6 -00000000 -14760cd4 -00000000 -24020000 -24030000 -10000008 -00000000 -3c029f45 -3442b980 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08b756 -3508b10c -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03ed93 -346322d0 -24150000 -24160000 -14550cbc -00000000 -14760cba -00000000 -24020000 -24030000 -10000008 -00000000 -3c02a634 -3442afe0 -0501000b -00000000 -1000000b -00000000 -00000000 -3c084ffd -35080672 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03d57c -3463f804 -3c15a634 -36b5afe0 -3c16d57c -36d6f804 -14550ca0 -00000000 -14760c9e -00000000 -24020000 -24030000 -10000008 -00000000 -3c02a4ed -344261b0 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08fd09 -3508b090 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03b976 -346324f0 -24150000 -24160000 -14550c86 -00000000 -14760c84 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0261a6 -34426ca0 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08083e -35085184 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03a914 -34631e80 -3c1561a6 -36b56ca0 -3c16a914 -36d61e80 -14550c6a -00000000 -14760c68 -00000000 -24020000 -24030000 -10000008 -00000000 -3c022264 -3442b1c0 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08eac2 -35080670 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c033e1a -3463c7fc -24150000 -24160000 -14550c50 -00000000 -14760c4e -00000000 -24020000 -24030000 -10000008 -00000000 -3c02206b -34422465 -0501000b -00000000 -1000000b -00000000 -00000000 -3c082256 -35081740 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03bed7 -34638bf2 -3c15206b -36b52465 -3c16bed7 -36d68bf2 -14550c34 -00000000 -14760c32 -00000000 -24020000 -24030000 -10000008 -00000000 -3c026a2f -3442a32b -0501000b -00000000 -1000000b -00000000 -00000000 -3c08f686 -35085a84 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c033a97 -3463620e -24150000 -24160000 -14550c1a -00000000 -14760c18 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02eee8 -3442af8b -0501000b -00000000 -1000000b -00000000 -00000000 -3c0856f4 -350849a8 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c0329a2 -34630800 -3c15eee8 -36b5af8b -3c1629a2 -36d60800 -14550bfe -00000000 -14760bfc -00000000 -24020000 -24030000 -10000008 -00000000 -3c023f1f -3442b6c0 -0501000b -00000000 -1000000b -00000000 -00000000 -3c088693 -3508fbff -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03dfb1 -346349fa -24150000 -24160000 -14550be4 -00000000 -14760be2 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0273f1 -34421770 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08085c -35086ee0 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c039061 -34631c30 -3c1573f1 -36b51770 -3c169061 -36d61c30 -14550bc8 -00000000 -14760bc6 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02da75 -3442b7fe -0501000b -00000000 -1000000b -00000000 -00000000 -3c0824f9 -3508a320 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03877f -34639892 -3c15da75 -36b5b7fe -3c16877f -36d69892 -14550bac -00000000 -14760baa -00000000 -24020000 -24030000 -10000008 -00000000 -3c027b58 -3442a34e -0501000b -00000000 -1000000b -00000000 -00000000 -3c083f42 -35087d90 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c038fe1 -3463e8c6 -3c157b58 -36b5a34e -3c168fe1 -36d6e8c6 -14550b90 -00000000 -14760b8e -00000000 -24020000 -24030000 -10000008 -00000000 -3c026b6c -34423194 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08f6b9 -350868e2 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03bfb7 -34630648 -24150000 -24160000 -14550b76 -00000000 -14760b74 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f746 -3442e09a -0501000b -00000000 -1000000b -00000000 -00000000 -3c08aa04 -3508e800 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c031c2a -346376b0 -24150000 -24160000 -14550b5c -00000000 -14760b5a -00000000 -24020000 -24030000 -10000008 -00000000 -3c02260a -34422a00 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08f0f9 -35081a54 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03c709 -3463b674 -24150000 -24160000 -14550b42 -00000000 -14760b40 -00000000 -24020000 -24030000 -10000008 -00000000 -3c021df6 -34425631 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08d7df -35089f90 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03663c -3463f833 -24150000 -24160000 -14550b28 -00000000 -14760b26 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f138 -3442a309 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08e3be -3508a2c6 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c033088 -346316f6 -24150000 -24160000 -14550b0e -00000000 -14760b0c -00000000 -24020000 -24030000 -10000008 -00000000 -3c026af6 -34426730 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08bc55 -35087688 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03c4c2 -34633015 -24150000 -24160000 -14550af4 -00000000 -14760af2 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0288ea -3442fcc8 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08733a -3508155f -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c0390cb -3463b290 -3c1588ea -36b5fcc8 -3c1690cb -36d6b290 -14550ad8 -00000000 -14760ad6 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02dbdd -34429a30 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08c7a0 -350802e0 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c034096 -34634e90 -24150000 -24160000 -14550abe -00000000 -14760abc -00000000 -24020000 -24030000 -10000008 -00000000 -3c023931 -34426664 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08f8a0 -3508831f -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03e36f -3463ce90 -24150000 -24160000 -14550aa4 -00000000 -14760aa2 -00000000 -24020000 -24030000 -10000008 -00000000 -3c022ce1 -3442c350 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08890e -35080d55 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c032145 -34633eb2 -24150000 -24160000 -14550a8a -00000000 -14760a88 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0268cb -3442a230 -0501000b -00000000 -1000000b -00000000 -00000000 -3c082fdd -35083f70 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c035de7 -346314e8 -3c1568cb -36b5a230 -3c165de7 -36d614e8 -14550a6e -00000000 -14760a6c -00000000 -24020000 -24030000 -10000008 -00000000 -3c0211f7 -34429fe1 -0501000b -00000000 -1000000b -00000000 -00000000 -3c082ad5 -3508e9b4 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03620b -34637500 -3c1511f7 -36b59fe1 -3c16620b -36d67500 -14550a52 -00000000 -14760a50 -00000000 -24020000 -24030000 -10000008 -00000000 -3c022c50 -3442de20 -0501000b -00000000 -1000000b -00000000 -00000000 -3c081947 -3508e910 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03be0a -34631860 -3c152c50 -36b5de20 -3c16be0a -36d61860 -14550a36 -00000000 -14760a34 -00000000 -24020000 -24030000 -10000008 -00000000 -3c022b6f -34422c2d -0501000b -00000000 -1000000b -00000000 -00000000 -3c082d92 -350808b4 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03f7a6 -346366c8 -3c152b6f -36b52c2d -3c16f7a6 -36d666c8 -14550a1a -00000000 -14760a18 -00000000 -24020000 -24030000 -10000008 -00000000 -3c023c2f -34425c00 -0501000b -00000000 -1000000b -00000000 -00000000 -3c085330 -35085c40 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c035845 -3463b7a6 -3c153c2f -36b55c00 -3c165845 -36d6b7a6 -145509fe -00000000 -147609fc -00000000 -24020000 -24030000 -10000008 -00000000 -3c025bf5 -34428b7e -0501000b -00000000 -1000000b -00000000 -00000000 -3c082adf -3508ecc8 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03ebad -3463fa9b -3c155bf5 -36b58b7e -3c16ebad -36d6fa9b -145509e2 -00000000 -147609e0 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02cbf0 -34420430 -0501000b -00000000 -1000000b -00000000 -00000000 -3c083753 -3508c816 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03a0b2 -34639a1c -3c15cbf0 -36b50430 -3c16a0b2 -36d69a1c -145509c6 -00000000 -147609c4 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02917b -3442f4f1 -0501000b -00000000 -1000000b -00000000 -00000000 -3c0884cd -3508ee20 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c0344b0 -34630fbc -24150000 -24160000 -145509ac -00000000 -147609aa -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f210 -3442dfae -0501000b -00000000 -1000000b -00000000 -00000000 -3c0806c7 -35087478 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03c2a0 -346372fe -3c15f210 -36b5dfae -3c16c2a0 -36d672fe -14550990 -00000000 -1476098e -00000000 -24020000 -24030000 -10000008 -00000000 -3c0200a6 -34427800 -0501000b -00000000 -1000000b -00000000 -00000000 -3c086858 -35089474 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c0344bf -34634a08 -3c1500a6 -36b57800 -3c1644bf -36d64a08 -14550974 -00000000 -14760972 -00000000 -24020000 -24030000 -10000008 -00000000 -3c024f49 -34420f1e -0501000b -00000000 -1000000b -00000000 -00000000 -3c086d1d -3508f1f8 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c030e1b -3463a31a -3c154f49 -36b50f1e -3c160e1b -36d6a31a -14550958 -00000000 -14760956 -00000000 -24020000 -24030000 -10000007 -00000000 -3c02b7d3 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08ce0b -35083180 -0501fff7 -00000000 -10000004 -00000000 -00000000 -3c03bbaa -34634970 -24150000 -24160000 -1455093f -00000000 -1476093d -00000000 -24020000 -24030000 -10000008 -00000000 -3c02d6fb -34427bb8 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08a9e5 -350820ef -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03910c -34633bf8 -24150000 -24160000 -14550925 -00000000 -14760923 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0286c9 -3442d9b2 -0501000b -00000000 -1000000b -00000000 -00000000 -3c089154 -35089820 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c034c4b -3463c560 -24150000 -24160000 -1455090b -00000000 -14760909 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02940a -3442cce4 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08f5f9 -35086a90 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c036733 -3463a46b -24150000 -24160000 -145508f1 -00000000 -147608ef -00000000 -24020000 -24030000 -10000008 -00000000 -3c02fb93 -3442fd70 -0501000b -00000000 -1000000b -00000000 -00000000 -3c080725 -35087b68 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03e334 -346355f8 -3c15fb93 -36b5fd70 -3c16e334 -36d655f8 -145508d5 -00000000 -147608d3 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02065a -34421098 -0501000b -00000000 -1000000b -00000000 -00000000 -3c088b1e -35082400 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03ccd2 -3463bfd0 -24150000 -24160000 -145508bb -00000000 -147608b9 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02db7d -3442dfdc -0501000b -00000000 -1000000b -00000000 -00000000 -3c08a8ae -35089af0 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c034dfc -346353ac -24150000 -24160000 -145508a1 -00000000 -1476089f -00000000 -24020000 -24030000 -10000008 -00000000 -3c02451e -34425c8c -0501000b -00000000 -1000000b -00000000 -00000000 -3c08bc66 -35082680 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03ff73 -346319c0 -24150000 -24160000 -14550887 -00000000 -14760885 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f38c -3442b340 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08e9d0 -35088a10 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03b262 -346322aa -24150000 -24160000 -1455086d -00000000 -1476086b -00000000 -24020000 -24030000 -10000008 -00000000 -3c02d458 -3442fad4 -0501000b -00000000 -1000000b -00000000 -00000000 -3c082dca -3508c00c -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03d325 -3463befc -3c15d458 -36b5fad4 -3c16d325 -36d6befc -14550851 -00000000 -1476084f -00000000 -24020000 -24030000 -10000008 -00000000 -3c022575 -3442533e -0501000b -00000000 -1000000b -00000000 -00000000 -3c08e034 -35081d80 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c0326c5 -34631385 -24150000 -24160000 -14550837 -00000000 -14760835 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0256f3 -34426372 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08aa4e -3508eae0 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03a91c -346357f0 -24150000 -24160000 -1455081d -00000000 -1476081b -00000000 -24020000 -24030000 -10000008 -00000000 -3c02e7c2 -344275e6 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08a69c -3508a378 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03198a -34631bba -24150000 -24160000 -14550803 -00000000 -14760801 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02cc0d -34420f8a -0501000b -00000000 -1000000b -00000000 -00000000 -3c08166c -35084cc2 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c034df6 -3463a930 -3c15cc0d -36b50f8a -3c164df6 -36d6a930 -145507e7 -00000000 -147607e5 -00000000 -24020000 -24030000 -10000008 -00000000 -3c028364 -34420d8d -0501000b -00000000 -1000000b -00000000 -00000000 -3c085b21 -3508b7ec -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03b289 -34636d70 -3c158364 -36b50d8d -3c16b289 -36d66d70 -145507cb -00000000 -147607c9 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02ee9a -34422ae6 -0501000b -00000000 -1000000b -00000000 -00000000 -3c082b7c -350846ef -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03eaca -3463be60 -3c15ee9a -36b52ae6 -3c16eaca -36d6be60 -145507af -00000000 -147607ad -00000000 -24020000 -24030000 -10000008 -00000000 -3c023803 -34423780 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08a4c4 -3508d110 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03803b -34636bc4 -24150000 -24160000 -14550795 -00000000 -14760793 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0234a8 -344284dc -0501000b -00000000 -1000000b -00000000 -00000000 -3c08e053 -35087798 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03bf01 -346393a8 -24150000 -24160000 -1455077b -00000000 -14760779 -00000000 -24020000 -24030000 -10000008 -00000000 -3c020a97 -34426750 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08fc16 -3508d018 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03d1ab -3463784a -24150000 -24160000 -14550761 -00000000 -1476075f -00000000 -24020000 -24030000 -10000008 -00000000 -3c02ccf8 -3442a430 -0501000b -00000000 -1000000b -00000000 -00000000 -3c082775 -350824c8 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03d9f6 -3463054b -3c15ccf8 -36b5a430 -3c16d9f6 -36d6054b -14550745 -00000000 -14760743 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0219d7 -3442b374 -0501000b -00000000 -1000000b -00000000 -00000000 -3c085557 -350811c8 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03da24 -34631363 -3c1519d7 -36b5b374 -3c16da24 -36d61363 -14550729 -00000000 -14760727 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02ad9f -3442f4a0 -0501000b -00000000 -1000000b -00000000 -00000000 -3c0861c7 -3508c800 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c035edb -34632fe0 -3c15ad9f -36b5f4a0 -3c165edb -36d62fe0 -1455070d -00000000 -1476070b -00000000 -24020000 -24030000 -10000008 -00000000 -3c02e5da -34425190 -0501000b -00000000 -1000000b -00000000 -00000000 -3c080913 -35084c4a -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c0336c7 -3463cb78 -3c15e5da -36b55190 -3c1636c7 -36d6cb78 -145506f1 -00000000 -147606ef -00000000 -24020000 -24030000 -10000008 -00000000 -3c026470 -34427615 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08c8e6 -35086b94 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03773e -3463a1d0 -24150000 -24160000 -145506d7 -00000000 -147606d5 -00000000 -24020000 -24030000 -10000008 -00000000 -3c024ea0 -3442e848 -0501000b -00000000 -1000000b -00000000 -00000000 -3c087831 -350882d4 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03964a -34632d9b -3c154ea0 -36b5e848 -3c16964a -36d62d9b -145506bb -00000000 -147606b9 -00000000 -24020000 -24030000 -10000008 -00000000 -3c022414 -344268ff -0501000b -00000000 -1000000b -00000000 -00000000 -3c08d46a -35083973 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c0320ea -3463c928 -24150000 -24160000 -145506a1 -00000000 -1476069f -00000000 -24020000 -24030000 -10000008 -00000000 -3c0241c5 -34428820 -0501000b -00000000 -1000000b -00000000 -00000000 -3c0808b4 -3508c9f4 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c0367be -34639ed8 -3c1541c5 -36b58820 -3c1667be -36d69ed8 -14550685 -00000000 -14760683 -00000000 -24020000 -24030000 -10000008 -00000000 -3c025c1e -3442c0d7 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08a433 -35086dcb -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03af55 -3463c61a -24150000 -24160000 -1455066b -00000000 -14760669 -00000000 -24020000 -24030000 -10000008 -00000000 -3c029304 -3442b798 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08dce8 -350825d7 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03593f -3463b4e0 -24150000 -24160000 -14550651 -00000000 -1476064f -00000000 -24020000 -24030000 -10000008 -00000000 -3c0297f9 -34420edf -0501000b -00000000 -1000000b -00000000 -00000000 -3c08fd3e -35084638 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03d96d -3463052c -24150000 -24160000 -14550637 -00000000 -14760635 -00000000 -24020000 -24030000 -10000008 -00000000 -3c024b03 -34425134 -0501000b -00000000 -1000000b -00000000 -00000000 -3c086e35 -35080ae8 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03c05d -34633bb8 -3c154b03 -36b55134 -3c16c05d -36d63bb8 -1455061b -00000000 -14760619 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f2fe -3442acfa -0501000b -00000000 -1000000b -00000000 -00000000 -3c083c05 -35088100 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03ec80 -34638938 -3c15f2fe -36b5acfa -3c16ec80 -36d68938 -145505ff -00000000 -147605fd -00000000 -24020000 -24030000 -10000008 -00000000 -3c02b617 -34428480 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08fe8f -35087a50 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c0306c5 -34639558 -24150000 -24160000 -145505e5 -00000000 -147605e3 -00000000 -24020000 -24030000 -10000008 -00000000 -3c022df0 -3442f564 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08ab34 -35087d30 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03427a -3463d190 -24150000 -24160000 -145505cb -00000000 -147605c9 -00000000 -24020000 -24030000 -10000008 -00000000 -3c026c9d -3442b2e0 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08cf82 -3508f3a6 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c035bab -34630db7 -24150000 -24160000 -145505b1 -00000000 -147605af -00000000 -24020000 -24030000 -10000008 -00000000 -3c02fd8d -344290e3 -0501000b -00000000 -1000000b -00000000 -00000000 -3c081045 -35084360 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c034a09 -3463ff6f -3c15fd8d -36b590e3 -3c164a09 -36d6ff6f -14550595 -00000000 -14760593 -00000000 -24020000 -24030000 -10000008 -00000000 -3c023440 -344240f8 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08ea72 -35084300 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c031e6e -34630140 -24150000 -24160000 -1455057b -00000000 -14760579 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02af35 -3442cfd8 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08e4e2 -35080012 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03f704 -3463803f -24150000 -24160000 -14550561 -00000000 -1476055f -00000000 -24020000 -24030000 -10000008 -00000000 -3c0278ef -34421c5c -0501000b -00000000 -1000000b -00000000 -00000000 -3c088fd7 -3508495c -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c0397fb -3463a6e8 -24150000 -24160000 -14550547 -00000000 -14760545 -00000000 -24020000 -24030000 -10000008 -00000000 -3c025f66 -344263a6 -0501000b -00000000 -1000000b -00000000 -00000000 -3c083149 -3508131c -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c0387f6 -3463f094 -3c155f66 -36b563a6 -3c1687f6 -36d6f094 -1455052b -00000000 -14760529 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02b1a0 -3442d130 -0501000b -00000000 -1000000b -00000000 -00000000 -3c0829ec -3508535f -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c0345d2 -34639338 -3c15b1a0 -36b5d130 -3c1645d2 -36d69338 -1455050f -00000000 -1476050d -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f76a -3442c7c8 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08c403 -35084f18 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03ab0e -346348bc -24150000 -24160000 -145504f5 -00000000 -147604f3 -00000000 -24020000 -24030000 -10000008 -00000000 -3c028280 -34420d40 -0501000b -00000000 -1000000b -00000000 -00000000 -3c081764 -3508ab00 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c038c95 -34638d01 -3c158280 -36b50d40 -3c168c95 -36d68d01 -145504d9 -00000000 -147604d7 -00000000 -24020000 -24030000 -10000008 -00000000 -3c029359 -3442c254 -0501000b -00000000 -1000000b -00000000 -00000000 -3c088da1 -3508b4ca -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c030ea1 -34631ad4 -24150000 -24160000 -145504bf -00000000 -147604bd -00000000 -24020000 -24030000 -10000008 -00000000 -3c02ce7f -3442abfc -0501000b -00000000 -1000000b -00000000 -00000000 -3c087a7c -35089be0 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c036797 -34633548 -3c15ce7f -36b5abfc -3c166797 -36d63548 -145504a3 -00000000 -147604a1 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02ca11 -34420558 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08aca8 -3508ece4 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03c341 -3463bca0 -24150000 -24160000 -14550489 -00000000 -14760487 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f0b9 -3442fa40 -0501000b -00000000 -1000000b -00000000 -00000000 -3c0879d6 -350870b4 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c039aad -346394c0 -3c15f0b9 -36b5fa40 -3c169aad -36d694c0 -1455046d -00000000 -1476046b -00000000 -24020000 -24030000 -10000008 -00000000 -3c026819 -34427198 -0501000b -00000000 -1000000b -00000000 -00000000 -3c0896d8 -35089aca -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03cb1d -346382d6 -24150000 -24160000 -14550453 -00000000 -14760451 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02d420 -34428e50 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08b8f4 -3508850a -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c0354be -34634180 -24150000 -24160000 -14550439 -00000000 -14760437 -00000000 -24020000 -24030000 -10000008 -00000000 -3c025f20 -34424345 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08477b -35083924 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c034ede -34632a20 -3c155f20 -36b54345 -3c164ede -36d62a20 -1455041d -00000000 -1476041b -00000000 -24020000 -24030000 -10000008 -00000000 -3c0249b8 -34424ca8 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08f79a -3508e83a -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c031683 -34635880 -24150000 -24160000 -14550403 -00000000 -14760401 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02ff88 -34423700 -0501000b -00000000 -1000000b -00000000 -00000000 -3c085081 -35084720 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03d81c -346390b8 -3c15ff88 -36b53700 -3c16d81c -36d690b8 -145503e7 -00000000 -147603e5 -00000000 -24020000 -24030000 -10000008 -00000000 -3c027798 -3442a988 -0501000b -00000000 -1000000b -00000000 -00000000 -3c080a7c -35083d2c -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c039f53 -34639410 -3c157798 -36b5a988 -3c169f53 -36d69410 -145503cb -00000000 -147603c9 -00000000 -24020000 -24030000 -10000008 -00000000 -3c025fd7 -34425600 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08596d -350818a4 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c039bd0 -34637040 -3c155fd7 -36b55600 -3c169bd0 -36d67040 -145503af -00000000 -147603ad -00000000 -24020000 -24030000 -10000008 -00000000 -3c02c4f2 -344219c4 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08416f -35083e38 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c034f44 -3463d54a -3c15c4f2 -36b519c4 -3c164f44 -36d6d54a -14550393 -00000000 -14760391 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0271ff -34423402 -0501000b -00000000 -1000000b -00000000 -00000000 -3c085209 -35083896 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c039b57 -346383a6 -3c1571ff -36b53402 -3c169b57 -36d683a6 -14550377 -00000000 -14760375 -00000000 -24020000 -24030000 -10000008 -00000000 -3c024f2b -34421ff8 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08ba2d -35084a08 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c033606 -34638648 -24150000 -24160000 -1455035d -00000000 -1476035b -00000000 -24020000 -24030000 -10000008 -00000000 -3c0249b2 -3442e160 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08e025 -3508f06e -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c030576 -3463eba0 -24150000 -24160000 -14550343 -00000000 -14760341 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02135f -3442d774 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08c68a -3508a800 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c034003 -3463a3c0 -24150000 -24160000 -14550329 -00000000 -14760327 -00000000 -24020000 -24030000 -10000008 -00000000 -3c022d6b -34423398 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08a8b8 -350825e4 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c038e9a -3463be00 -24150000 -24160000 -1455030f -00000000 -1476030d -00000000 -24020000 -24030000 -10000008 -00000000 -3c02c27c -3442028e -0501000b -00000000 -1000000b -00000000 -00000000 -3c08e31b -3508e250 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c037973 -3463cb00 -24150000 -24160000 -145502f5 -00000000 -147602f3 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02c961 -344271c0 -0501000b -00000000 -1000000b -00000000 -00000000 -3c0872c9 -3508ad73 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03497c -34637380 -3c15c961 -36b571c0 -3c16497c -36d67380 -145502d9 -00000000 -147602d7 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0227d4 -3442aa2e -0501000b -00000000 -1000000b -00000000 -00000000 -3c08a26e -3508f663 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03d221 -3463e630 -24150000 -24160000 -145502bf -00000000 -147602bd -00000000 -24020000 -24030000 -10000008 -00000000 -3c02a3cf -3442acc0 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08d8b6 -35087f38 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c0375ce -34635e41 -24150000 -24160000 -145502a5 -00000000 -147602a3 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0262a4 -3442d9d7 -0501000b -00000000 -1000000b -00000000 -00000000 -3c080286 -35089c68 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c0399c7 -346351d9 -3c1562a4 -36b5d9d7 -3c1699c7 -36d651d9 -14550289 -00000000 -14760287 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02854e -3442abc9 -0501000b -00000000 -1000000b -00000000 -00000000 -3c087e28 -3508bb58 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03b28d -34630504 -3c15854e -36b5abc9 -3c16b28d -36d60504 -1455026d -00000000 -1476026b -00000000 -24020000 -24030000 -10000008 -00000000 -3c02c7cc -344229c0 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08d7ee -35087e05 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03ced6 -3463202f -24150000 -24160000 -14550253 -00000000 -14760251 -00000000 -24020000 -24030000 -10000008 -00000000 -3c020bd4 -34426608 -0501000b -00000000 -1000000b -00000000 -00000000 -3c0856cb -350827f0 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c038944 -34635180 -3c150bd4 -36b56608 -3c168944 -36d65180 -14550237 -00000000 -14760235 -00000000 -24020000 -24030000 -10000008 -00000000 -3c020522 -34424b76 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08292f -3508a940 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03e048 -34636aba -3c150522 -36b54b76 -3c16e048 -36d66aba -1455021b -00000000 -14760219 -00000000 -24020000 -24030000 -10000008 -00000000 -3c028287 -34422a29 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08e7d7 -3508d44c -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03df60 -3463c05c -24150000 -24160000 -14550201 -00000000 -147601ff -00000000 -24020000 -24030000 -10000008 -00000000 -3c0221ef -34421500 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08c8c1 -35082c8b -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c039b58 -34630e36 -24150000 -24160000 -145501e7 -00000000 -147601e5 -00000000 -24020000 -24030000 -10000008 -00000000 -3c022b14 -3442ef47 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08e4cd -35087cd0 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c038472 -34638a02 -24150000 -24160000 -145501cd -00000000 -147601cb -00000000 -24020000 -24030000 -10000008 -00000000 -3c028f36 -3442d4fc -0501000b -00000000 -1000000b -00000000 -00000000 -3c08c985 -35082ea8 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c032547 -3463a412 -24150000 -24160000 -145501b3 -00000000 -147601b1 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02e8ad -34425bf8 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08bb3e -35085b00 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03ff10 -34638780 -24150000 -24160000 -14550199 -00000000 -14760197 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f8b5 -34429594 -0501000b -00000000 -1000000b -00000000 -00000000 -3c082863 -3508be00 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03fa6c -346360a4 -3c15f8b5 -36b59594 -3c16fa6c -36d660a4 -1455017d -00000000 -1476017b -00000000 -24020000 -24030000 -10000008 -00000000 -3c022c3f -344228b4 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08b51e -35081a40 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03c896 -34635894 -24150000 -24160000 -14550163 -00000000 -14760161 -00000000 -24020000 -24030000 -10000008 -00000000 -3c028dda -34424160 -0501000b -00000000 -1000000b -00000000 -00000000 -3c081ad9 -3508c17f -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03e924 -346307c0 -3c158dda -36b54160 -3c16e924 -36d607c0 -14550147 -00000000 -14760145 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02dd2a -3442820c -0501000b -00000000 -1000000b -00000000 -00000000 -3c08e12b -350897d4 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03366f -3463f070 -24150000 -24160000 -1455012d -00000000 -1476012b -00000000 -24020000 -24030000 -10000008 -00000000 -3c02fd01 -3442f540 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08f021 -35082db8 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03c1cd -346320b0 -24150000 -24160000 -14550113 -00000000 -14760111 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02e741 -34425406 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08cbba -350881ec -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03741a -3463ed50 -24150000 -24160000 -145500f9 -00000000 -147600f7 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02b5ec -34421927 -0501000b -00000000 -1000000b -00000000 -00000000 -3c0802c3 -3508315c -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03468e -3463d6a0 -3c15b5ec -36b51927 -3c16468e -36d6d6a0 -145500dd -00000000 -147600db -00000000 -24020000 -24030000 -10000008 -00000000 -3c025c59 -34420ce0 -0501000b -00000000 -1000000b -00000000 -00000000 -3c087288 -3508e670 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c035420 -3463028c -3c155c59 -36b50ce0 -3c165420 -36d6028c -145500c1 -00000000 -147600bf -00000000 -24020000 -24030000 -10000008 -00000000 -3c0275ec -344278f4 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08d544 -350895e0 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c032eff -3463a6ac -24150000 -24160000 -145500a7 -00000000 -147600a5 -00000000 -24020000 -24030000 -10000008 -00000000 -3c021d4a -344255c9 -0501000b -00000000 -1000000b -00000000 -00000000 -3c089426 -350821af -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03720f -3463d55e -24150000 -24160000 -1455008d -00000000 -1476008b -00000000 -24020000 -24030000 -10000008 -00000000 -3c02c4bc -34429b80 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08a795 -3508e898 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03c2a1 -34630b38 -24150000 -24160000 -14550073 -00000000 -14760071 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02e00f -3442f5e8 -0501000b -00000000 -1000000b -00000000 -00000000 -3c084bfb -3508adb0 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03d694 -3463be06 -3c15e00f -36b5f5e8 -3c16d694 -36d6be06 -14550057 -00000000 -14760055 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02ab21 -34425888 -0501000b -00000000 -1000000b -00000000 -00000000 -3c0812bd -35088028 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c0355ac -3463a678 -3c15ab21 -36b55888 -3c1655ac -36d6a678 -1455003b -00000000 -14760039 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0221cc -3442b408 -0501000b -00000000 -1000000b -00000000 -00000000 -3c08f88b -3508cdf6 -0501fff6 -00000000 -10000004 -00000000 -00000000 -3c03990d -3463ea52 -24150000 -24160000 -14550021 -00000000 -1476001f -00000000 -24020000 -24030000 -10000008 -00000000 -3c021f13 -34429900 -0501000a -00000000 -1000000a -00000000 -00000000 -24080000 -0501fff7 -00000000 -10000004 -00000000 -00000000 -3c03af65 -346331c4 -3c151f13 -36b59900 -3c16af65 -36d631c4 -14550006 -00000000 -14760004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -24120000 -3c081f8f -35086000 -2409001c -24030001 -01281006 -14430898 -00000000 -3c08e51f -35086e9c -24090002 -3c033947 -3463dba7 -01281006 -14430890 -00000000 -3c08055d -3508f7e0 -24090008 -3c030005 -34635df7 -01281006 -14430888 -00000000 -3c08a821 -3508b3e6 -24090019 -24030054 -01281006 -14430881 -00000000 -3c08f333 -35080c74 -2409000a -3c03003c -3463ccc3 -01281006 -14430879 -00000000 -3c08096b -35085f00 -2409001f -24030000 -01281006 -14430872 -00000000 -3c0816f2 -3508bd5e -2409001b -24030002 -01281006 -1443086b -00000000 -3c08938a -35084c80 -2409001f -24030001 -01281006 -14430864 -00000000 -3c084995 -350878b8 -2409001c -24030004 -01281006 -1443085d -00000000 -3c08e917 -35084919 -24090019 -24030074 -01281006 -14430856 -00000000 -3c087150 -35081460 -24090013 -24030e2a -01281006 -1443084f -00000000 -3c0866c7 -35089be0 -24090014 -2403066c -01281006 -14430848 -00000000 -3c086e7e -35080c6c -24090014 -240306e7 -01281006 -14430841 -00000000 -3c085ce2 -350863d8 -2409000c -3c030005 -3463ce26 -01281006 -14430839 -00000000 -3c086bfa -35082f04 -2409000f -3403d7f4 -01281006 -14430832 -00000000 -3c082db6 -35087010 -24090004 -3c0302db -34636701 -01281006 -1443082a -00000000 -3c08b54e -35083520 -24090003 -3c0316a9 -3463c6a4 -01281006 -14430822 -00000000 -3c0807a2 -35080228 -2409000b -3403f440 -01281006 -1443081b -00000000 -3c0825a6 -3508cca8 -2409000a -3c030009 -346369b3 -01281006 -14430813 -00000000 -3c0867ed -35087379 -2409001e -24030001 -01281006 -1443080c -00000000 -3c08df65 -35084d10 -2409001a -24030037 -01281006 -14430805 -00000000 -3c084246 -350841f0 -24090017 -24030084 -01281006 -144307fe -00000000 -3c0855fd -35087a24 -2409001e -24030001 -01281006 -144307f7 -00000000 -3c085f2a -350828a0 -24090000 -3c035f2a -346328a0 -01281006 -144307ef -00000000 -3c087941 -35082088 -24090012 -24031e50 -01281006 -144307e8 -00000000 -3c08887a -3508b014 -24090009 -3c030044 -34633d58 -01281006 -144307e0 -00000000 -3c084751 -35085b10 -24090002 -3c0311d4 -346356c4 -01281006 -144307d8 -00000000 -3c08e2f3 -3508d9e0 -2409001e -24030003 -01281006 -144307d1 -00000000 -3c084a5e -35082b80 -2409000c -3c030004 -3463a5e2 -01281006 -144307c9 -00000000 -3c08d144 -35080a30 -2409001f -24030001 -01281006 -144307c2 -00000000 -3c0864f6 -35089af4 -24090001 -3c03327b -34634d7a -01281006 -144307ba -00000000 -3c0824c1 -350818a4 -2409000e -34039304 -01281006 -144307b3 -00000000 -3c08b01b -350825a0 -24090006 -3c0302c0 -34636c96 -01281006 -144307ab -00000000 -3c087693 -3508cb08 -24090009 -3c03003b -346349e5 -01281006 -144307a3 -00000000 -3c08c6a5 -3508b020 -24090011 -24036352 -01281006 -1443079c -00000000 -3c087b9a -35087cdc -2409000e -3c030001 -3463ee69 -01281006 -14430794 -00000000 -3c088319 -35086db0 -24090018 -24030083 -01281006 -1443078d -00000000 -3c08e334 -35081f60 -24090009 -3c030071 -34639a0f -01281006 -14430785 -00000000 -3c0835a4 -3508a0c0 -24090012 -24030d69 -01281006 -1443077e -00000000 -3c0884ba -3508afc0 -24090004 -3c03084b -3463aafc -01281006 -14430776 -00000000 -3c08f153 -35080f7a -24090002 -3c033c54 -3463c3de -01281006 -1443076e -00000000 -3c08522a -35089acd -24090012 -2403148a -01281006 -14430767 -00000000 -3c08a89e -3508c680 -24090010 -3403a89e -01281006 -14430760 -00000000 -3c089190 -350844bc -2409000d -3c030004 -34638c82 -01281006 -14430758 -00000000 -3c08baae -3508d4e0 -24090010 -3403baae -01281006 -14430751 -00000000 -3c083842 -35083890 -2409000d -3c030001 -3463c211 -01281006 -14430749 -00000000 -3c082632 -350898cc -24090007 -3c03004c -34636531 -01281006 -14430741 -00000000 -3c08d312 -35086c36 -2409001a -24030034 -01281006 -1443073a -00000000 -3c08c2a7 -3508f09f -24090012 -240330a9 -01281006 -14430733 -00000000 -3c08c339 -350887ee -24090009 -3c030061 -34639cc3 -01281006 -1443072b -00000000 -3c0885fc -3508fad8 -2409000a -3c030021 -34637f3e -01281006 -14430723 -00000000 -3c08a57b -35088d38 -24090004 -3c030a57 -3463b8d3 -01281006 -1443071b -00000000 -3c089f19 -3508c898 -2409001e -24030002 -01281006 -14430714 -00000000 -3c080cf6 -3508bc10 -2409000a -3c030003 -34633daf -01281006 -1443070c -00000000 -3c082be7 -3508fe80 -24090019 -24030015 -01281006 -14430705 -00000000 -3c08b4a4 -3508fb88 -24090011 -24035a52 -01281006 -144306fe -00000000 -3c0830aa -35086216 -2409000c -3c030003 -34630aa6 -01281006 -144306f6 -00000000 -3c086048 -35089db0 -2409000b -3c03000c -34630913 -01281006 -144306ee -00000000 -3c08c0b1 -35085ac0 -24090003 -3c031816 -34632b58 -01281006 -144306e6 -00000000 -3c08016d -35089715 -24090002 -3c03005b -346365c5 -01281006 -144306de -00000000 -3c0887c7 -3508157f -2409001e -24030002 -01281006 -144306d7 -00000000 -3c080ff3 -3508aac0 -24090012 -240303fc -01281006 -144306d0 -00000000 -3c0806c1 -35085102 -2409000d -2403360a -01281006 -144306c9 -00000000 -3c08a2f4 -35088fe0 -24090002 -3c0328bd -346323f8 -01281006 -144306c1 -00000000 -3c08f2dd -35084f47 -24090004 -3c030f2d -3463d4f4 -01281006 -144306b9 -00000000 -3c088fee -35082638 -2409001f -24030001 -01281006 -144306b2 -00000000 -3c085410 -350814ea -24090014 -24030541 -01281006 -144306ab -00000000 -3c08ae85 -35084050 -2409000f -3c030001 -34635d0a -01281006 -144306a3 -00000000 -3c087c29 -35082be8 -24090015 -240303e1 -01281006 -1443069c -00000000 -3c08a032 -35085283 -24090003 -3c031406 -34634a50 -01281006 -14430694 -00000000 -3c08f6c4 -35089bde -24090003 -3c031ed8 -3463937b -01281006 -1443068c -00000000 -3c08c906 -35082ff0 -24090002 -3c033241 -34638bfc -01281006 -14430684 -00000000 -3c08e04c -3508ed40 -24090008 -3c0300e0 -34634ced -01281006 -1443067c -00000000 -3c08bb52 -35085a80 -2409000f -3c030001 -346376a4 -01281006 -14430674 -00000000 -3c080e70 -3508556c -2409000d -24037382 -01281006 -1443066d -00000000 -3c0809bf -35085078 -24090002 -3c03026f -3463d41e -01281006 -14430665 -00000000 -3c089236 -35085f82 -2409000c -3c030009 -34632365 -01281006 -1443065d -00000000 -3c081286 -35083378 -24090017 -24030025 -01281006 -14430656 -00000000 -3c08746a -35083080 -24090013 -24030e8d -01281006 -1443064f -00000000 -3c086348 -350867c7 -24090011 -240331a4 -01281006 -14430648 -00000000 -3c08abfd -35081800 -24090008 -3c0300ab -3463fd18 -01281006 -14430640 -00000000 -3c08e06b -3508e5a4 -24090016 -24030381 -01281006 -14430639 -00000000 -3c08c237 -3508bfc1 -2409000b -3c030018 -346346f7 -01281006 -14430631 -00000000 -3c08a003 -35080450 -24090014 -24030a00 -01281006 -1443062a -00000000 -3c084098 -350811b8 -24090004 -3c030409 -3463811b -01281006 -14430622 -00000000 -3c089805 -3508da2c -24090002 -3c032601 -3463768b -01281006 -1443061a -00000000 -3c082af7 -35082a3a -24090016 -240300ab -01281006 -14430613 -00000000 -3c08b94e -35086930 -24090003 -3c031729 -3463cd26 -01281006 -1443060b -00000000 -3c08fd25 -3508cf55 -2409000e -3c030003 -3463f497 -01281006 -14430603 -00000000 -3c08f455 -3508b93e -2409001e -24030003 -01281006 -144305fc -00000000 -3c08dba4 -3508a0c8 -24090011 -24036dd2 -01281006 -144305f5 -00000000 -3c082ad0 -350803d0 -2409000c -3c030002 -3463ad00 -01281006 -144305ed -00000000 -3c085db2 -35085ec6 -24090004 -3c0305db -346325ec -01281006 -144305e5 -00000000 -3c084572 -3508e7b6 -24090014 -24030457 -01281006 -144305de -00000000 -3c0896c6 -35085acc -24090005 -3c0304b6 -346332d6 -01281006 -144305d6 -00000000 -3c08cfc3 -35084b9e -24090011 -240367e1 -01281006 -144305cf -00000000 -3c08f1ab -35085334 -2409001b -2403001e -01281006 -144305c8 -00000000 -3c088a12 -35085f54 -24090018 -2403008a -01281006 -144305c1 -00000000 -3c086152 -350884b0 -24090012 -24031854 -01281006 -144305ba -00000000 -3c0855ab -35087c98 -24090003 -3c030ab5 -34636f93 -01281006 -144305b2 -00000000 -3c08fe71 -3508e5f3 -2409001f -24030001 -01281006 -144305ab -00000000 -3c08748c -3508edd0 -24090003 -3c030e91 -34639dba -01281006 -144305a3 -00000000 -3c08600c -350897bc -24090011 -24033006 -01281006 -1443059c -00000000 -3c08bab6 -35082778 -2409001f -24030001 -01281006 -14430595 -00000000 -3c085dcb -35087600 -24090006 -3c030177 -34632dd8 -01281006 -1443058d -00000000 -3c088aa1 -3508b8c8 -2409001d -24030004 -01281006 -14430586 -00000000 -3c08a628 -35080968 -24090001 -3c035314 -346304b4 -01281006 -1443057e -00000000 -3c08e8ed -3508a6f4 -2409001f -24030001 -01281006 -14430577 -00000000 -3c08d386 -35089a00 -24090000 -3c03d386 -34639a00 -01281006 -1443056f -00000000 -3c08e44e -350834d3 -2409000a -3c030039 -3463138d -01281006 -14430567 -00000000 -3c0855b5 -3508f76c -24090009 -3c03002a -3463dafb -01281006 -1443055f -00000000 -3c08b359 -3508c3f0 -24090015 -2403059a -01281006 -14430558 -00000000 -3c0885dd -3508b640 -2409001b -24030010 -01281006 -14430551 -00000000 -3c083c3d -35081cc0 -24090014 -240303c3 -01281006 -1443054a -00000000 -3c08bea3 -3508711f -24090008 -3c0300be -3463a371 -01281006 -14430542 -00000000 -3c083f98 -3508ee78 -24090018 -2403003f -01281006 -1443053b -00000000 -3c0861f7 -350801f0 -2409000b -3c03000c -34633ee0 -01281006 -14430533 -00000000 -3c08a440 -3508f500 -24090007 -3c030148 -346381ea -01281006 -1443052b -00000000 -3c08ea38 -3508ab40 -24090012 -24033a8e -01281006 -14430524 -00000000 -3c08698a -3508156c -2409000f -3403d314 -01281006 -1443051d -00000000 -3c08c435 -3508e2b8 -24090019 -24030062 -01281006 -14430516 -00000000 -3c08baa8 -3508fdc0 -24090011 -24035d54 -01281006 -1443050f -00000000 -3c08af38 -3508bc06 -24090003 -3c0315e7 -34631780 -01281006 -14430507 -00000000 -3c084f07 -350805e0 -2409001d -24030002 -01281006 -14430500 -00000000 -3c085199 -35080430 -24090005 -3c03028c -3463c821 -01281006 -144304f8 -00000000 -3c08b6d2 -350830b8 -24090013 -240316da -01281006 -144304f1 -00000000 -3c08c32b -35081338 -24090014 -24030c32 -01281006 -144304ea -00000000 -3c0856f0 -35089ca0 -24090009 -3c03002b -3463784e -01281006 -144304e2 -00000000 -3c0820d5 -35085384 -2409000e -34038355 -01281006 -144304db -00000000 -3c08ee44 -35081e24 -2409000d -3c030007 -34637220 -01281006 -144304d3 -00000000 -3c089391 -35087f27 -24090000 -3c039391 -34637f27 -01281006 -144304cb -00000000 -3c08d392 -3508f564 -24090002 -3c0334e4 -3463bd59 -01281006 -144304c3 -00000000 -3c0861fd -350823fc -24090019 -24030030 -01281006 -144304bc -00000000 -3c083810 -3508ee98 -24090018 -24030038 -01281006 -144304b5 -00000000 -3c08450f -3508c4d0 -2409000f -34038a1f -01281006 -144304ae -00000000 -3c086c59 -3508a85e -2409001b -2403000d -01281006 -144304a7 -00000000 -3c0898c9 -35086979 -24090007 -3c030131 -346392d2 -01281006 -1443049f -00000000 -3c089289 -3508a95e -2409000f -3c030001 -34632513 -01281006 -14430497 -00000000 -3c087d27 -35081631 -24090010 -24037d27 -01281006 -14430490 -00000000 -3c08a7dc -3508f7a0 -2409000d -3c030005 -34633ee7 -01281006 -14430488 -00000000 -3c08eb76 -35084460 -24090000 -3c03eb76 -34634460 -01281006 -14430480 -00000000 -3c081ee8 -3508e1f0 -24090017 -2403003d -01281006 -14430479 -00000000 -3c0802fc -3508437c -2409001a -24030000 -01281006 -14430472 -00000000 -3c08d38b -350824a0 -24090013 -24031a71 -01281006 -1443046b -00000000 -3c0836fb -35084114 -24090013 -240306df -01281006 -14430464 -00000000 -3c08d468 -35083c56 -24090005 -3c0306a3 -346341e2 -01281006 -1443045c -00000000 -3c08befb -350803e3 -24090000 -3c03befb -346303e3 -01281006 -14430454 -00000000 -3c0869c5 -3508aef0 -24090009 -3c030034 -3463e2d7 -01281006 -1443044c -00000000 -3c08e2c2 -35089658 -2409001a -24030038 -01281006 -14430445 -00000000 -3c08eb30 -35083400 -24090015 -24030759 -01281006 -1443043e -00000000 -3c0872cb -35081bf0 -24090015 -24030396 -01281006 -14430437 -00000000 -3c08bdff -35081488 -24090016 -240302f7 -01281006 -14430430 -00000000 -3c08d1e8 -3508c6d0 -2409000f -3c030001 -3463a3d1 -01281006 -14430428 -00000000 -3c081649 -350809a0 -24090003 -3c0302c9 -34632134 -01281006 -14430420 -00000000 -3c08d735 -3508d3e8 -24090012 -240335cd -01281006 -14430419 -00000000 -3c080509 -35085050 -24090005 -3c030028 -34634a82 -01281006 -14430411 -00000000 -3c08d08f -35081360 -24090000 -3c03d08f -34631360 -01281006 -14430409 -00000000 -3c08d123 -35089010 -24090012 -24033448 -01281006 -14430402 -00000000 -3c080a60 -350829d0 -24090012 -24030298 -01281006 -144303fb -00000000 -3c08ea33 -350867e0 -2409001a -2403003a -01281006 -144303f4 -00000000 -3c083d0f -3508bdf8 -2409001a -2403000f -01281006 -144303ed -00000000 -3c08d4f0 -35083338 -24090011 -24036a78 -01281006 -144303e6 -00000000 -3c08af91 -3508e4e2 -24090010 -3403af91 -01281006 -144303df -00000000 -3c0831db -35082480 -24090014 -2403031d -01281006 -144303d8 -00000000 -3c0860d8 -3508d970 -2409000f -3403c1b1 -01281006 -144303d1 -00000000 -3c0829c7 -35081a40 -2409000c -3c030002 -34639c71 -01281006 -144303c9 -00000000 -3c082a3a -35089780 -24090001 -3c03151d -34634bc0 -01281006 -144303c1 -00000000 -3c084aad -3508ca7a -24090008 -3c03004a -3463adca -01281006 -144303b9 -00000000 -3c087a22 -35082e4c -2409000d -3c030003 -3463d111 -01281006 -144303b1 -00000000 -3c086a91 -35081ac0 -2409000c -3c030006 -3463a911 -01281006 -144303a9 -00000000 -3c088dd4 -3508eccc -2409000e -3c030002 -34633753 -01281006 -144303a1 -00000000 -3c0867a3 -35081abb -24090019 -24030033 -01281006 -1443039a -00000000 -3c08d966 -350875fa -24090014 -24030d96 -01281006 -14430393 -00000000 -3c085111 -35084399 -24090011 -24032888 -01281006 -1443038c -00000000 -3c08b22b -3508a180 -2409001f -24030001 -01281006 -14430385 -00000000 -3c08041e -35084880 -24090008 -3c030004 -34631e48 -01281006 -1443037d -00000000 -3c08e510 -350845f5 -24090003 -3c031ca2 -346308be -01281006 -14430375 -00000000 -3c0869e0 -3508a190 -2409000e -3c030001 -3463a782 -01281006 -1443036d -00000000 -3c082f79 -35083408 -24090015 -2403017b -01281006 -14430366 -00000000 -3c080396 -35084170 -2409000f -2403072c -01281006 -1443035f -00000000 -3c0859f7 -3508beb0 -24090009 -3c03002c -3463fbdf -01281006 -14430357 -00000000 -3c08d285 -35083e50 -2409000a -3c030034 -3463a14f -01281006 -1443034f -00000000 -3c082d74 -3508a370 -2409000a -3c03000b -34635d28 -01281006 -14430347 -00000000 -3c084c47 -3508414d -24090006 -3c030131 -34631d05 -01281006 -1443033f -00000000 -3c08b925 -35087506 -24090007 -3c030172 -34634aea -01281006 -14430337 -00000000 -3c08103a -350826d0 -24090008 -3c030010 -34633a26 -01281006 -1443032f -00000000 -3c083f7d -3508e000 -24090018 -2403003f -01281006 -14430328 -00000000 -3c087daa -3508001c -2409000c -3c030007 -3463daa0 -01281006 -14430320 -00000000 -3c080a9c -35087fe0 -2409000b -3c030001 -3463538f -01281006 -14430318 -00000000 -3c0858b4 -3508dba8 -24090013 -24030b16 -01281006 -14430311 -00000000 -3c08046a -3508da2c -24090019 -24030002 -01281006 -1443030a -00000000 -3c088545 -3508d310 -2409000f -3c030001 -34630a8b -01281006 -14430302 -00000000 -3c083297 -35085a30 -24090011 -2403194b -01281006 -144302fb -00000000 -3c080b73 -3508e91c -2409000b -3c030001 -34636e7d -01281006 -144302f3 -00000000 -3c082e90 -35088d07 -24090011 -24031748 -01281006 -144302ec -00000000 -3c08bc6d -3508ec64 -2409001d -24030005 -01281006 -144302e5 -00000000 -3c087fb0 -35083886 -24090009 -3c03003f -3463d81c -01281006 -144302dd -00000000 -3c08b0e5 -3508f6e4 -24090006 -3c0302c3 -346397db -01281006 -144302d5 -00000000 -3c084c15 -3508f2d5 -2409001d -24030002 -01281006 -144302ce -00000000 -3c08cfe5 -35084c57 -24090006 -3c03033f -34639531 -01281006 -144302c6 -00000000 -3c0816f9 -3508a9d8 -24090000 -3c0316f9 -3463a9d8 -01281006 -144302be -00000000 -3c08338f -3508a5cc -24090000 -3c03338f -3463a5cc -01281006 -144302b6 -00000000 -3c0822ea -3508ec90 -24090000 -3c0322ea -3463ec90 -01281006 -144302ae -00000000 -3c086dfb -35088ed4 -24090000 -3c036dfb -34638ed4 -01281006 -144302a6 -00000000 -3c08d6b4 -35080e56 -24090000 -3c03d6b4 -34630e56 -01281006 -1443029e -00000000 -3c0814b5 -35081bf3 -24090000 -3c0314b5 -34631bf3 -01281006 -14430296 -00000000 -3c081768 -35084810 -24090000 -3c031768 -34634810 -01281006 -1443028e -00000000 -3c080a95 -35085d3f -24090000 -3c030a95 -34635d3f -01281006 -14430286 -00000000 -3c0854b6 -35082ea0 -24090000 -3c0354b6 -34632ea0 -01281006 -1443027e -00000000 -3c08e0f7 -3508e1a0 -24090000 -3c03e0f7 -3463e1a0 -01281006 -14430276 -00000000 -3c0882b2 -35081d00 -24090000 -3c0382b2 -34631d00 -01281006 -1443026e -00000000 -3c0807a4 -35080684 -24090000 -3c0307a4 -34630684 -01281006 -14430266 -00000000 -3c088c5a -3508ce60 -24090000 -3c038c5a -3463ce60 -01281006 -1443025e -00000000 -3c08ecdb -35083fa0 -24090000 -3c03ecdb -34633fa0 -01281006 -14430256 -00000000 -3c08a23b -3508f234 -24090000 -3c03a23b -3463f234 -01281006 -1443024e -00000000 -3c088e3c -3508f02c -24090000 -3c038e3c -3463f02c -01281006 -14430246 -00000000 -3c08b891 -3508211c -24090000 -3c03b891 -3463211c -01281006 -1443023e -00000000 -3c08b82b -350861ae -24090000 -3c03b82b -346361ae -01281006 -14430236 -00000000 -3c08eeda -3508c8b0 -24090000 -3c03eeda -3463c8b0 -01281006 -1443022e -00000000 -3c086e0a -3508332c -24090000 -3c036e0a -3463332c -01281006 -14430226 -00000000 -3c086835 -3508b8a6 -24090000 -3c036835 -3463b8a6 -01281006 -1443021e -00000000 -3c08f259 -35080aee -24090000 -3c03f259 -34630aee -01281006 -14430216 -00000000 -3c086efb -3508f7c4 -24090000 -3c036efb -3463f7c4 -01281006 -1443020e -00000000 -3c087beb -35082ec8 -24090000 -3c037beb -34632ec8 -01281006 -14430206 -00000000 -3c080556 -3508beb4 -24090000 -3c030556 -3463beb4 -01281006 -144301fe -00000000 -3c082c01 -3508992b -24090000 -3c032c01 -3463992b -01281006 -144301f6 -00000000 -3c08d457 -35082cb0 -24090000 -3c03d457 -34632cb0 -01281006 -144301ee -00000000 -3c088568 -350805f3 -24090000 -3c038568 -346305f3 -01281006 -144301e6 -00000000 -3c086d73 -35088598 -24090000 -3c036d73 -34638598 -01281006 -144301de -00000000 -3c0811bd -35084e60 -24090000 -3c0311bd -34634e60 -01281006 -144301d6 -00000000 -3c089fa6 -3508c1f1 -24090000 -3c039fa6 -3463c1f1 -01281006 -144301ce -00000000 -3c08be3e -350884c0 -24090000 -3c03be3e -346384c0 -01281006 -144301c6 -00000000 -3c08c3d9 -3508dee8 -24090000 -3c03c3d9 -3463dee8 -01281006 -144301be -00000000 -3c08bb18 -350865e0 -24090000 -3c03bb18 -346365e0 -01281006 -144301b6 -00000000 -3c08c9b2 -35088d24 -24090000 -3c03c9b2 -34638d24 -01281006 -144301ae -00000000 -3c089bc8 -3508699e -24090000 -3c039bc8 -3463699e -01281006 -144301a6 -00000000 -3c083612 -3508ad00 -24090000 -3c033612 -3463ad00 -01281006 -1443019e -00000000 -3c0803ae -35087cd4 -24090000 -3c0303ae -34637cd4 -01281006 -14430196 -00000000 -3c083449 -35084370 -24090000 -3c033449 -34634370 -01281006 -1443018e -00000000 -3c08b331 -35080868 -24090000 -3c03b331 -34630868 -01281006 -14430186 -00000000 -3c0868bb -35083ae8 -24090000 -3c0368bb -34633ae8 -01281006 -1443017e -00000000 -3c086599 -35080e38 -24090000 -3c036599 -34630e38 -01281006 -14430176 -00000000 -3c08a2e3 -35086ffb -24090000 -3c03a2e3 -34636ffb -01281006 -1443016e -00000000 -3c0819c5 -3508302d -24090000 -3c0319c5 -3463302d -01281006 -14430166 -00000000 -3c083658 -35081a4d -24090000 -3c033658 -34631a4d -01281006 -1443015e -00000000 -3c08a2d1 -350883b0 -24090000 -3c03a2d1 -346383b0 -01281006 -14430156 -00000000 -3c082bcf -3508e02c -24090000 -3c032bcf -3463e02c -01281006 -1443014e -00000000 -3c0818d4 -3508683c -24090000 -3c0318d4 -3463683c -01281006 -14430146 -00000000 -3c086619 -35088182 -24090000 -3c036619 -34638182 -01281006 -1443013e -00000000 -3c084adf -3508f964 -24090000 -3c034adf -3463f964 -01281006 -14430136 -00000000 -24080000 -2409000a -24030000 -01281006 -14430130 -00000000 -24080000 -2409001d -24030000 -01281006 -1443012a -00000000 -24080000 -2409000d -24030000 -01281006 -14430124 -00000000 -24080000 -2409000c -24030000 -01281006 -1443011e -00000000 -24080000 -24090003 -24030000 -01281006 -14430118 -00000000 -24080000 -2409001d -24030000 -01281006 -14430112 -00000000 -24080000 -24090006 -24030000 -01281006 -1443010c -00000000 -24080000 -24090014 -24030000 -01281006 -14430106 -00000000 -24080000 -2409001d -24030000 -01281006 -14430100 -00000000 -24080000 -24090019 -24030000 -01281006 -144300fa -00000000 -24080000 -24090018 -24030000 -01281006 -144300f4 -00000000 -24080000 -24090006 -24030000 -01281006 -144300ee -00000000 -24080000 -2409000a -24030000 -01281006 -144300e8 -00000000 -24080000 -24090001 -24030000 -01281006 -144300e2 -00000000 -24080000 -2409000e -24030000 -01281006 -144300dc -00000000 -24080000 -2409001f -24030000 -01281006 -144300d6 -00000000 -24080000 -24090010 -24030000 -01281006 -144300d0 -00000000 -24080000 -24090018 -24030000 -01281006 -144300ca -00000000 -24080000 -24090005 -24030000 -01281006 -144300c4 -00000000 -24080000 -24090003 -24030000 -01281006 -144300be -00000000 -24080000 -24090013 -24030000 -01281006 -144300b8 -00000000 -24080000 -24090015 -24030000 -01281006 -144300b2 -00000000 -24080000 -2409000b -24030000 -01281006 -144300ac -00000000 -24080000 -24090002 -24030000 -01281006 -144300a6 -00000000 -24080000 -24090016 -24030000 -01281006 -144300a0 -00000000 -24080000 -24090000 -24030000 -01281006 -1443009a -00000000 -24080000 -24090008 -24030000 -01281006 -14430094 -00000000 -24080000 -2409000a -24030000 -01281006 -1443008e -00000000 -24080000 -24090019 -24030000 -01281006 -14430088 -00000000 -24080000 -24090007 -24030000 -01281006 -14430082 -00000000 -24080000 -24090015 -24030000 -01281006 -1443007c -00000000 -24080000 -24090006 -24030000 -01281006 -14430076 -00000000 -24080000 -24090008 -24030000 -01281006 -14430070 -00000000 -24080000 -2409001d -24030000 -01281006 -1443006a -00000000 -24080000 -2409000a -24030000 -01281006 -14430064 -00000000 -24080000 -24090003 -24030000 -01281006 -1443005e -00000000 -24080000 -24090004 -24030000 -01281006 -14430058 -00000000 -24080000 -24090018 -24030000 -01281006 -14430052 -00000000 -24080000 -24090017 -24030000 -01281006 -1443004c -00000000 -24080000 -2409000f -24030000 -01281006 -14430046 -00000000 -24080000 -2409001e -24030000 -01281006 -14430040 -00000000 -24080000 -2409000a -24030000 -01281006 -1443003a -00000000 -24080000 -2409000a -24030000 -01281006 -14430034 -00000000 -24080000 -2409000f -24030000 -01281006 -1443002e -00000000 -24080000 -2409001c -24030000 -01281006 -14430028 -00000000 -24080000 -2409001d -24030000 -01281006 -14430022 -00000000 -24080000 -24090016 -24030000 -01281006 -1443001c -00000000 -24080000 -24090018 -24030000 -01281006 -14430016 -00000000 -24080000 -24090017 -24030000 -01281006 -14430010 -00000000 -24080000 -2409000c -24030000 -01281006 -1443000a -00000000 -24080000 -24090000 -24030000 -01281006 -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -00000000 -26100001 -3c08800d -24120005 -ad120000 -40805800 -3c170040 -40976000 -00000000 -3c170005 -3c028003 -3442602a -3c038003 -3463602a -3c04800d -3484602a -3c0547cd -34a5f6da -24878c35 -ac828c32 -3c14bfc6 -2694d634 -a4858c35 -165700a2 -00000000 -8c828c32 -1443009f -00000000 -40164000 -14f6009c -00000000 -24120005 -3c026e9c -3442e24e -3c036e9c -3463e24e -3c04800d -34842c08 -3c056e9c -34a5e24e -2487098b -ac820988 -3c14bfc6 -2694d694 -ad080004 -ad140004 -a485098b -ad140000 -8d090004 -15340088 -00000000 -16570086 -00000000 -8c820988 -14430083 -00000000 -40164000 -14f60080 -00000000 -24120005 -ad120000 -24120005 -3c02419f -34429f3b -3c03419f -34639f3b -3c04800d -34841356 -3c05bb1a -34a5fce8 -24871dd3 -ac821dd2 -3c14bfc6 -2694d70c -01000011 -0110001b -a4851dd3 -00004810 -1128006b -00000000 -16570069 -00000000 -8c821dd2 -14430066 -00000000 -40164000 -14f60063 -00000000 -24120005 -3c028003 -34423729 -3c038003 -34633729 -3c04800d -3484372c -3c05190a -34a565ca -248786f1 -ac8286f0 -3c14bfc6 -2694d770 -a48586f1 -0208001b -16570052 -00000000 -8c8286f0 -1443004f -00000000 -40164000 -14f6004c -00000000 -24120005 -3c028003 -34421ff3 -3c038003 -34631ff3 -3c04800d -34841ff0 -3c059fcc -34a54ca0 -2487b663 -ac82b660 -3c14bfc6 -2694d7d4 -01000013 -01100019 -a485b663 -00004810 -11280039 -00000000 -16570037 -00000000 -8c82b660 -14430034 -00000000 -40164000 -14f60031 -00000000 -24120005 -3c0273b3 -34425a2b -3c0373b3 -34635a2b -3c04800d -3484351b -3c05bd6f -34a5420a -248764f2 -ac8264f1 -3c14bfc6 -2694d838 -a48564f2 -01120019 -16570020 -00000000 -8c8264f1 -1443001d -00000000 -40164000 -14f6001a -00000000 -24120005 -3c02a521 -34420b0a -3c03a521 -34630b0a -3c04800d -348463d7 -3c0500e9 -34a55990 -24877fc6 -ac827fc5 -3c14bfc6 -2694d898 -40927000 -a4857fc6 -40887000 -16570008 -00000000 -8c827fc5 -14430005 -00000000 -40164000 -14f60002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -26100001 -24120000 -3c081ade -3508f300 -3c0951dd -352958de -3c036cbc -34634bde -01091021 -14430a29 -00000000 -3c089674 -3508ea60 -3c09ab47 -35295792 -3c0341bc -346341f2 -01091021 -14430a20 -00000000 -3c08b60d -3508b986 -3c092e56 -3529c81a -3c03e464 -346381a0 -01091021 -14430a17 -00000000 -3c08d55e -3508dbc0 -3c0960f5 -3529cb0c -3c033654 -3463a6cc -01091021 -14430a0e -00000000 -3c08a2b8 -3508e4e0 -3c09c6e6 -35296aa0 -3c03699f -34634f80 -01091021 -14430a05 -00000000 -3c08ec05 -350801a1 -3c091826 -35297926 -3c03042b -34637ac7 -01091021 -144309fc -00000000 -3c086ade -350836b0 -3c09c01d -35294200 -3c032afb -346378b0 -01091021 -144309f3 -00000000 -3c086c08 -35088ce8 -3c09a1ce -35294040 -3c030dd6 -3463cd28 -01091021 -144309ea -00000000 -3c084f16 -3508e8c7 -3c092412 -3529bcd0 -3c037329 -3463a597 -01091021 -144309e1 -00000000 -3c08020a -350851db -3c09b68b -3529b4ba -3c03b896 -34630695 -01091021 -144309d8 -00000000 -3c084079 -350889a0 -3c097015 -352956bf -3c03b08e -3463e05f -01091021 -144309cf -00000000 -3c083c98 -35081568 -3c0923a8 -35292600 -3c036040 -34633b68 -01091021 -144309c6 -00000000 -3c0892e3 -35085540 -3c0971dd -3529650e -3c0304c0 -3463ba4e -01091021 -144309bd -00000000 -3c083d0e -3508ae36 -3c09487b -35290ba4 -3c038589 -3463b9da -01091021 -144309b4 -00000000 -3c0854ba -35082860 -3c0960f8 -35294428 -3c03b5b2 -34636c88 -01091021 -144309ab -00000000 -3c082fff -35086522 -3c0987e3 -352905b0 -3c03b7e2 -34636ad2 -01091021 -144309a2 -00000000 -3c084a66 -3508f66a -3c09d301 -3529b8d8 -3c031d68 -3463af42 -01091021 -14430999 -00000000 -3c088c45 -3508dcd0 -3c096920 -3529c5b8 -3c03f566 -3463a288 -01091021 -14430990 -00000000 -3c08cb37 -35082ca0 -3c091e3a -3529a120 -3c03e971 -3463cdc0 -01091021 -14430987 -00000000 -3c088c77 -35081188 -3c092549 -3529adba -3c03b1c0 -3463bf42 -01091021 -1443097e -00000000 -3c080dc9 -3508a5f0 -3c096854 -35290752 -3c03761d -3463ad42 -01091021 -14430975 -00000000 -3c08c5cd -3508a1f0 -3c09c7a5 -35291930 -3c038d72 -3463bb20 -01091021 -1443096c -00000000 -3c08194f -35087a4e -3c09d1c2 -35295e02 -3c03eb11 -3463d850 -01091021 -14430963 -00000000 -3c08fdf9 -350875ba -3c0973aa -35290697 -3c0371a3 -34637c51 -01091021 -1443095a -00000000 -3c08ecde -3508ab48 -3c09aa49 -35298990 -3c039728 -346334d8 -01091021 -14430951 -00000000 -3c08233c -35084034 -3c09ff55 -352978b8 -3c032291 -3463b8ec -01091021 -14430948 -00000000 -3c0833ae -35086e90 -3c09b2dd -35291830 -3c03e68b -346386c0 -01091021 -1443093f -00000000 -3c088c6a -3508a20a -3c0983df -35293d56 -3c031049 -3463df60 -01091021 -14430936 -00000000 -3c080088 -3508ef98 -3c09af25 -35292304 -3c03afae -3463129c -01091021 -1443092d -00000000 -3c08d95e -35082d30 -3c091367 -35296716 -3c03ecc5 -34639446 -01091021 -14430924 -00000000 -3c089cff -3508ad48 -3c09faca -35293c1c -3c0397c9 -3463e964 -01091021 -1443091b -00000000 -3c08342c -35089df8 -3c0975ec -35295689 -3c03aa18 -3463f481 -01091021 -14430912 -00000000 -3c0856fd -35082b00 -3c097112 -3529e207 -3c03c810 -34630d07 -01091021 -14430909 -00000000 -3c087db3 -350880a6 -3c09c2fb -35295cdc -3c0340ae -3463dd82 -01091021 -14430900 -00000000 -3c08e63e -350817c0 -3c092769 -3529dd8e -3c030da7 -3463f54e -01091021 -144308f7 -00000000 -3c08e962 -3508e8cc -3c09b0fe -3529fcde -3c039a61 -3463e5aa -01091021 -144308ee -00000000 -3c087d25 -35089100 -3c09c89e -3529d9a4 -3c0345c4 -34636aa4 -01091021 -144308e5 -00000000 -3c0838c2 -35088800 -3c0995be -35297944 -3c03ce81 -34630144 -01091021 -144308dc -00000000 -3c081a4e -3508a926 -3c09619d -3529c7e3 -3c037bec -34637109 -01091021 -144308d3 -00000000 -3c089df7 -35084de8 -3c0947af -35299418 -3c03e5a6 -3463e200 -01091021 -144308ca -00000000 -3c080dcf -35082690 -3c09d202 -3529f3ea -3c03dfd2 -34631a7a -01091021 -144308c1 -00000000 -3c087ed9 -3508cc90 -3c09c30a -35296858 -3c0341e4 -346334e8 -01091021 -144308b8 -00000000 -3c08ccd3 -35085173 -3c09f97d -352915c4 -3c03c650 -34636737 -01091021 -144308af -00000000 -3c08b392 -35088258 -3c09e989 -35296f40 -3c039d1b -3463f198 -01091021 -144308a6 -00000000 -3c08311b -35084e90 -3c09ad69 -3529ed90 -3c03de85 -34633c20 -01091021 -1443089d -00000000 -3c084614 -35083134 -3c09cec2 -3529639e -3c0314d6 -346394d2 -01091021 -14430894 -00000000 -3c08c466 -3508c8d4 -3c09fa04 -3529cca6 -3c03be6b -3463957a -01091021 -1443088b -00000000 -3c0878e8 -350854e0 -3c09b215 -35296670 -3c032afd -3463bb50 -01091021 -14430882 -00000000 -3c08c86f -350821e0 -3c09a93a -35297c78 -3c0371a9 -34639e58 -01091021 -14430879 -00000000 -3c089485 -3508c9f0 -3c0953bb -35292bc8 -3c03e840 -3463f5b8 -01091021 -14430870 -00000000 -3c080fce -3508e134 -3c092aa3 -3529c684 -3c033a72 -3463a7b8 -01091021 -14430867 -00000000 -3c08b610 -35085c03 -3c09fc3c -3529d85a -3c03b24d -3463345d -01091021 -1443085e -00000000 -3c0877f2 -35085918 -3c094e90 -3529dbe0 -3c03c683 -346334f8 -01091021 -14430855 -00000000 -3c08e8a5 -35084300 -3c091eff -352938dc -3c0307a4 -34637bdc -01091021 -1443084c -00000000 -3c0878f4 -3508529d -3c09190c -3529fc04 -3c039201 -34634ea1 -01091021 -14430843 -00000000 -3c08b771 -3508afe0 -3c09972f -3529cbc4 -3c034ea1 -34637ba4 -01091021 -1443083a -00000000 -3c089974 -35085200 -3c09ade8 -3529e029 -3c03475d -34633229 -01091021 -14430831 -00000000 -3c08426f -35087c70 -3c09b350 -352953d6 -3c03f5bf -3463d046 -01091021 -14430828 -00000000 -3c08977c -3508bf3e -3c09a73d -35292f77 -3c033eb9 -3463eeb5 -01091021 -1443081f -00000000 -3c085582 -3508389c -3c09c11d -35292f10 -3c03169f -346367ac -01091021 -14430816 -00000000 -3c08ea59 -35083c9c -3c096bc2 -3529a9ab -3c03561b -3463e647 -01091021 -1443080d -00000000 -3c085159 -35085f80 -3c09fd5a -3529a46d -3c034eb4 -346303ed -01091021 -14430804 -00000000 -3c080fb4 -3508c2da -3c098314 -35291a5a -3c0392c8 -3463dd34 -01091021 -144307fb -00000000 -3c08f03e -35083034 -3c090b8a -35299700 -3c03fbc8 -3463c734 -01091021 -144307f2 -00000000 -3c08ad53 -3508fc4e -3c0996cc -35293368 -3c034420 -34632fb6 -01091021 -144307e9 -00000000 -3c08798f -35087e3b -3c096b3b -35290180 -3c03e4ca -34637fbb -01091021 -144307e0 -00000000 -3c0869b3 -350849f8 -3c09bcf7 -35299d98 -3c0326aa -3463e790 -01091021 -144307d7 -00000000 -3c08c1f6 -35083730 -3c092d64 -35293390 -3c03ef5a -34636ac0 -01091021 -144307ce -00000000 -3c08fa67 -35082830 -3c099af9 -3529d9a0 -3c039561 -346301d0 -01091021 -144307c5 -00000000 -3c0892ff -3508eb08 -3c095e15 -3529c50c -3c03f115 -3463b014 -01091021 -144307bc -00000000 -3c0824cb -3508322c -3c099a73 -35292956 -3c03bf3e -34635b82 -01091021 -144307b3 -00000000 -3c088b7f -3508cca0 -3c09de7d -35292d30 -3c0369fc -3463f9d0 -01091021 -144307aa -00000000 -3c081a83 -35082f70 -3c098500 -35295ca4 -3c039f83 -34638c14 -01091021 -144307a1 -00000000 -3c086272 -35089700 -3c0938ba -352940f4 -3c039b2c -3463d7f4 -01091021 -14430798 -00000000 -3c089529 -3508d404 -3c09c53a -3529bb20 -3c035a64 -34638f24 -01091021 -1443078f -00000000 -3c08c322 -35084e73 -3c092ab1 -3529e7d0 -3c03edd4 -34633643 -01091021 -14430786 -00000000 -3c0825c5 -350834b0 -3c0970a4 -3529d680 -3c03966a -34630b30 -01091021 -1443077d -00000000 -3c0885c1 -35085a40 -3c097361 -3529f223 -3c03f923 -34634c63 -01091021 -14430774 -00000000 -3c080e56 -3508f760 -3c093e59 -3529d840 -3c034cb0 -3463cfa0 -01091021 -1443076b -00000000 -3c083821 -3508c9c4 -3c09b17f -35297000 -3c03e9a1 -346339c4 -01091021 -14430762 -00000000 -3c08d483 -350811f0 -3c09a60c -352950f8 -3c037a8f -346362e8 -01091021 -14430759 -00000000 -3c088787 -3508758c -3c097659 -352998cc -3c03fde1 -34630e58 -01091021 -14430750 -00000000 -3c08f7dc -3508c188 -3c09a800 -3529f8ea -3c039fdd -3463ba72 -01091021 -14430747 -00000000 -3c08f529 -3508881c -3c09f123 -3529d44d -3c03e64d -34635c69 -01091021 -1443073e -00000000 -3c08f882 -35086295 -3c09a4b0 -35295c51 -3c039d32 -3463bee6 -01091021 -14430735 -00000000 -3c08ea68 -35089caa -3c099a0a -3529c552 -3c038473 -346361fc -01091021 -1443072c -00000000 -3c080902 -35085080 -3c095f79 -352959c5 -3c03687b -3463aa45 -01091021 -14430723 -00000000 -3c08d8c2 -35088555 -3c098761 -3529cee0 -3c036024 -34635435 -01091021 -1443071a -00000000 -3c087d1c -350884b1 -3c09eb46 -3529ff9c -3c036863 -3463844d -01091021 -14430711 -00000000 -3c08e783 -35082e98 -3c09c6f1 -3529dbb0 -3c03ae75 -34630a48 -01091021 -14430708 -00000000 -3c08701f -3508d5ae -3c090a9c -35297894 -3c037abc -34634e42 -01091021 -144306ff -00000000 -3c08bb97 -35086ed0 -3c0986c3 -3529fae2 -3c03425b -346369b2 -01091021 -144306f6 -00000000 -3c08db7c -3508b30c -3c091212 -35295aaa -3c03ed8f -34630db6 -01091021 -144306ed -00000000 -3c080f0e -3508f91f -3c09f2a7 -35297d3b -3c0301b6 -3463765a -01091021 -144306e4 -00000000 -3c08c012 -35083708 -3c09a5e7 -3529a578 -3c0365f9 -3463dc80 -01091021 -144306db -00000000 -3c081cb9 -35084ac1 -3c09cf9d -35290168 -3c03ec56 -34634c29 -01091021 -144306d2 -00000000 -3c0869ba -35086aea -3c090fd6 -3529a85c -3c037991 -34631346 -01091021 -144306c9 -00000000 -3c08613b -3508cd5c -3c094483 -35294706 -3c03a5bf -34631462 -01091021 -144306c0 -00000000 -3c08a77d -3508c34d -3c09161b -35295d78 -3c03bd99 -346320c5 -01091021 -144306b7 -00000000 -3c08ccfb -350880de -3c095e65 -35293fd8 -3c032b60 -3463c0b6 -01091021 -144306ae -00000000 -3c08484e -3508c5c0 -3c09b836 -35295a0d -3c030085 -34631fcd -01091021 -144306a5 -00000000 -3c08c4d8 -350853e0 -3c09100d -35291fc0 -3c03d4e5 -346373a0 -01091021 -1443069c -00000000 -3c080eb6 -350861cd -3c091c83 -3529b94e -3c032b3a -34631b1b -01091021 -14430693 -00000000 -3c08e2ef -35083ea0 -3c0947a8 -35294fa4 -3c032a97 -34638e44 -01091021 -1443068a -00000000 -3c080c46 -35083b3c -3c0902ba -3529aecc -3c030f00 -3463ea08 -01091021 -14430681 -00000000 -3c084ce7 -3508aed9 -3c09bc5e -352917dc -3c030945 -3463c6b5 -01091021 -14430678 -00000000 -3c08dc95 -3508c140 -3c095947 -3529f1b8 -3c0335dd -3463b2f8 -01091021 -1443066f -00000000 -3c08483f -3508f182 -3c09293c -352987e9 -3c03717c -3463796b -01091021 -14430666 -00000000 -3c081975 -35083bae -3c090ccd -3529f280 -3c032643 -34632e2e -01091021 -1443065d -00000000 -3c08f8d7 -3508a0f0 -3c09034b -3529fa0c -3c03fc23 -34639afc -01091021 -14430654 -00000000 -3c0872ab -3508958c -3c099e4a -3529e4c8 -3c0310f6 -34637a54 -01091021 -1443064b -00000000 -3c08521d -350806c0 -3c09970d -3529cce0 -3c03e92a -3463d3a0 -01091021 -14430642 -00000000 -3c08c450 -3508df40 -3c09196f -352962bf -3c03ddc0 -346341ff -01091021 -14430639 -00000000 -3c08f2a3 -35085c0a -3c0948c6 -35293448 -3c033b69 -34639052 -01091021 -14430630 -00000000 -3c08b99a -35082cc0 -3c09ffaf -3529bdd2 -3c03b949 -3463ea92 -01091021 -14430627 -00000000 -3c089e85 -35080500 -3c09aa9a -3529e1e8 -3c03491f -3463e6e8 -01091021 -1443061e -00000000 -3c089c93 -3508a580 -3c09ce1e -3529bcd8 -3c036ab2 -34636258 -01091021 -14430615 -00000000 -3c08f1ad -35083312 -3c09994f -3529fae3 -3c038afd -34632df5 -01091021 -1443060c -00000000 -3c0845ed -35083365 -3c0979e3 -35293cb8 -3c03bfd0 -3463701d -01091021 -14430603 -00000000 -3c08c42c -35083098 -3c09d034 -352947f0 -3c039460 -34637888 -01091021 -144305fa -00000000 -3c085087 -35089fe8 -3c0995c0 -3529e370 -3c03e648 -34638358 -01091021 -144305f1 -00000000 -3c08d93f -35086f71 -3c097a15 -3529abe4 -3c035355 -34631b55 -01091021 -144305e8 -00000000 -3c08e3e1 -35080968 -3c0925fb -352921c0 -3c0309dc -34632b28 -01091021 -144305df -00000000 -3c083a37 -3508fca2 -3c09cd84 -3529d118 -3c0307bc -3463cdba -01091021 -144305d6 -00000000 -3c0866f0 -3508d6e0 -3c098545 -3529d310 -3c03ec36 -3463a9f0 -01091021 -144305cd -00000000 -3c0865dc -35080660 -3c090c8a -3529355a -3c037266 -34633bba -01091021 -144305c4 -00000000 -3c088f68 -35082a20 -3c090d2f -352996a0 -3c039c97 -3463c0c0 -01091021 -144305bb -00000000 -3c08fd43 -35084850 -3c09d93a -352985f4 -3c03d67d -3463ce44 -01091021 -144305b2 -00000000 -3c088727 -3508cc00 -3c092f98 -3529bb50 -3c03b6c0 -34638750 -01091021 -144305a9 -00000000 -3c08fd25 -3508a0e0 -3c0950fd -3529eb78 -3c034e23 -34638c58 -01091021 -144305a0 -00000000 -3c0812fd -3508c140 -3c09a20c -35293320 -3c03b509 -3463f460 -01091021 -14430597 -00000000 -3c088206 -35086660 -3c09069b -352927f4 -3c0388a1 -34638e54 -01091021 -1443058e -00000000 -3c08b258 -35082bc5 -3c09bf74 -35296194 -3c0371cc -34638d59 -01091021 -14430585 -00000000 -3c08b12e -3508f34a -3c09e440 -35293cd0 -3c03956f -3463301a -01091021 -1443057c -00000000 -3c0808b6 -3508f17e -3c095b36 -35297160 -3c0363ed -346362de -01091021 -14430573 -00000000 -3c08b4cd -3508964d -3c09def9 -35293dc4 -3c0393c6 -3463d411 -01091021 -1443056a -00000000 -3c08f4f8 -35084832 -3c09eb08 -3529b4c4 -3c03e000 -3463fcf6 -01091021 -14430561 -00000000 -3c082bf7 -35080600 -3c09a2e5 -3529fe6c -3c03cedd -3463046c -01091021 -14430558 -00000000 -3c0840c2 -3508cf98 -3c09e106 -35291200 -3c0321c8 -3463e198 -01091021 -1443054f -00000000 -3c083f20 -3508c268 -3c09855a -3529f7e0 -3c03c47b -3463ba48 -01091021 -14430546 -00000000 -3c08ceb2 -3508edb2 -3c095666 -3529deb0 -3c032519 -3463cc62 -01091021 -1443053d -00000000 -3c08cc68 -35089f8e -3c09ff42 -352951e2 -3c03cbaa -3463f170 -01091021 -14430534 -00000000 -3c08b881 -35084d99 -3c09d399 -35290374 -3c038c1a -3463510d -01091021 -1443052b -00000000 -3c08b23c -35080b92 -3c0938e3 -35292b3e -3c03eb1f -346336d0 -01091021 -14430522 -00000000 -3c08bd47 -3508a8d8 -3c093ee9 -3529b870 -3c03fc31 -34636148 -01091021 -14430519 -00000000 -3c08e1ef -3508fd20 -3c091387 -3529e740 -3c03f577 -3463e460 -01091021 -14430510 -00000000 -3c08e1b0 -350874ac -3c0918c8 -35293c12 -3c03fa78 -3463b0be -01091021 -14430507 -00000000 -3c08f17a -35081890 -3c094a03 -35294a3f -3c033b7d -346362cf -01091021 -144304fe -00000000 -3c080911 -35080120 -3c097297 -352960f4 -3c037ba8 -34636214 -01091021 -144304f5 -00000000 -3c08586f -35081834 -3c09f9c7 -3529ecc4 -3c035237 -346304f8 -01091021 -144304ec -00000000 -3c0831f3 -35086e80 -3c096b47 -35299f40 -3c039d3b -34630dc0 -01091021 -144304e3 -00000000 -3c084358 -3508a85e -3c095ccf -35294f60 -3c03a027 -3463f7be -01091021 -144304da -00000000 -3c08269f -35084ca0 -3c091b98 -3529fa12 -3c034238 -346346b2 -01091021 -144304d1 -00000000 -3c08c260 -35089300 -3c095c18 -3529f700 -3c031e79 -34638a00 -01091021 -144304c8 -00000000 -3c081d74 -350850e0 -3c0999e3 -3529ba00 -3c03b758 -34630ae0 -01091021 -144304bf -00000000 -3c08d9c6 -35088800 -3c094cb1 -35299f48 -3c032678 -34632748 -01091021 -144304b6 -00000000 -3c087735 -35081304 -3c09d75d -35299e58 -3c034e92 -3463b15c -01091021 -144304ad -00000000 -3c081f02 -3508aa48 -3c09b234 -35294e6f -3c03d136 -3463f8b7 -01091021 -144304a4 -00000000 -3c08faf8 -3508daa8 -3c091012 -3529ff56 -3c030b0b -3463d9fe -01091021 -1443049b -00000000 -3c08ac34 -3508488e -3c09327a -352924f6 -3c03deae -34636d84 -01091021 -14430492 -00000000 -3c086af4 -3508d9b0 -3c095b15 -35291a50 -3c03c609 -3463f400 -01091021 -14430489 -00000000 -3c089746 -35080a00 -3c093f6a -3529497c -3c03d6b0 -3463537c -01091021 -14430480 -00000000 -3c0862f6 -35089554 -3c09d9a3 -35299340 -3c033c9a -34632894 -01091021 -14430477 -00000000 -3c0885f5 -3508eb44 -3c09dc09 -35291d1b -3c0361ff -3463085f -01091021 -1443046e -00000000 -3c080666 -3508656c -3c0981c5 -35290a68 -3c03882b -34636fd4 -01091021 -14430465 -00000000 -3c086dba -35080db2 -3c0972cf -35297860 -3c03e089 -34638612 -01091021 -1443045c -00000000 -3c08343c -35087a64 -3c09c3ba -352914f6 -3c03f7f6 -34638f5a -01091021 -14430453 -00000000 -3c08d51f -35083a5e -3c09492f -35293fc0 -3c031e4e -34637a1e -01091021 -1443044a -00000000 -3c08ea48 -35081678 -3c09e569 -35291fc8 -3c03cfb1 -34633640 -01091021 -14430441 -00000000 -3c0898e2 -350862f0 -3c09c509 -352933ba -3c035deb -346396aa -01091021 -14430438 -00000000 -3c08d216 -3508545c -3c09758d -3529e170 -3c0347a4 -346335cc -01091021 -1443042f -00000000 -3c08c9c9 -35087b28 -3c093ebf -3529486b -3c030888 -3463c393 -01091021 -14430426 -00000000 -3c0880f3 -3508902f -3c09edf7 -352906e8 -3c036eea -34639717 -01091021 -1443041d -00000000 -3c083e19 -350820bf -3c09ec08 -3529cc9a -3c032a21 -3463ed59 -01091021 -14430414 -00000000 -3c08d9cf -35087428 -3c096d71 -3529cf80 -3c034741 -346343a8 -01091021 -1443040b -00000000 -3c08701e -3508ce78 -3c09fa83 -352976be -3c036aa2 -34634536 -01091021 -14430402 -00000000 -3c080f9e -3508b000 -3c09cccc -3529d650 -3c03dc6b -34638650 -01091021 -144303f9 -00000000 -3c088db5 -35080a70 -3c097645 -3529d930 -3c0303fa -3463e3a0 -01091021 -144303f0 -00000000 -3c08ffa2 -35080e80 -3c09d7fb -35296f9a -3c03d79d -34637e1a -01091021 -144303e7 -00000000 -3c088256 -35084134 -3c09cbee -35292480 -3c034e44 -346365b4 -01091021 -144303de -00000000 -3c0840d7 -3508aa06 -3c09b790 -35296e3f -3c03f868 -34631845 -01091021 -144303d5 -00000000 -3c083b3c -35086148 -3c09cf90 -35298cb0 -3c030acc -3463edf8 -01091021 -144303cc -00000000 -3c0881a1 -35087b0f -3c091f31 -35298824 -3c03a0d3 -34630333 -01091021 -144303c3 -00000000 -3c08f060 -35086cb0 -3c09473e -35290080 -3c03379e -34636d30 -01091021 -144303ba -00000000 -3c08fa24 -3508749a -3c09d205 -3529fddc -3c03cc2a -34637276 -01091021 -144303b1 -00000000 -3c08bdbe -3508b5d0 -3c09d0eb -3529dc20 -3c038eaa -346391f0 -01091021 -144303a8 -00000000 -3c087562 -35082881 -3c091497 -3529c4f8 -3c0389f9 -3463ed79 -01091021 -1443039f -00000000 -3c086bfb -35084c9c -3c0903fe -352930e8 -3c036ff9 -34637d84 -01091021 -14430396 -00000000 -3c08ea96 -35083504 -3c094383 -3529b5fb -3c032e19 -3463eaff -01091021 -1443038d -00000000 -3c089535 -35080f70 -3c09cf89 -352986c0 -3c0364be -34639630 -01091021 -14430384 -00000000 -3c081110 -3508ccc5 -3c093c3f -3529aad0 -3c034d50 -34637795 -01091021 -1443037b -00000000 -3c08f9cb -3508d880 -3c09d2a4 -35296860 -3c03cc70 -346340e0 -01091021 -14430372 -00000000 -3c08331f -3508baad -3c09da68 -35294d7c -3c030d88 -34630829 -01091021 -14430369 -00000000 -3c08d2b8 -3508ede0 -3c095991 -35293c64 -3c032c4a -34632a44 -01091021 -14430360 -00000000 -3c08f5fa -35085ab0 -3c09fd9e -35293c64 -3c03f398 -34639714 -01091021 -14430357 -00000000 -3c08b8b2 -350858ec -3c094fec -3529d506 -3c03089f -34632df2 -01091021 -1443034e -00000000 -3c088583 -35080497 -3c09f9e1 -3529917c -3c037f64 -34639613 -01091021 -14430345 -00000000 -3c08cf90 -35088d90 -3c096cfe -35293f0e -3c033c8e -3463cc9e -01091021 -1443033c -00000000 -3c084ab7 -3508f3b1 -3c092edd -35293206 -3c037995 -346325b7 -01091021 -14430333 -00000000 -3c08d5e4 -3508e264 -3c09332e -3529f640 -3c030913 -3463d8a4 -01091021 -1443032a -00000000 -3c08d47d -3508d056 -24090000 -3c03d47d -3463d056 -01091021 -14430322 -00000000 -3c088b0f -350875c8 -24090000 -3c038b0f -346375c8 -01091021 -1443031a -00000000 -3c083868 -3508003c -24090000 -3c033868 -3463003c -01091021 -14430312 -00000000 -3c08704f -350849ba -24090000 -3c03704f -346349ba -01091021 -1443030a -00000000 -3c080d61 -3508c550 -24090000 -3c030d61 -3463c550 -01091021 -14430302 -00000000 -3c087449 -3508d018 -24090000 -3c037449 -3463d018 -01091021 -144302fa -00000000 -3c0807f8 -35083e80 -24090000 -3c0307f8 -34633e80 -01091021 -144302f2 -00000000 -3c0800bc -35084138 -24090000 -3c0300bc -34634138 -01091021 -144302ea -00000000 -3c080fb8 -35089778 -24090000 -3c030fb8 -34639778 -01091021 -144302e2 -00000000 -3c08984f -350839b0 -24090000 -3c03984f -346339b0 -01091021 -144302da -00000000 -3c08461b -3508f48c -24090000 -3c03461b -3463f48c -01091021 -144302d2 -00000000 -3c081937 -35084434 -24090000 -3c031937 -34634434 -01091021 -144302ca -00000000 -3c0866ed -35088800 -24090000 -3c0366ed -34638800 -01091021 -144302c2 -00000000 -3c089ea7 -350898c0 -24090000 -3c039ea7 -346398c0 -01091021 -144302ba -00000000 -3c08c4ed -35081ad0 -24090000 -3c03c4ed -34631ad0 -01091021 -144302b2 -00000000 -3c0802f8 -3508d6a0 -24090000 -3c0302f8 -3463d6a0 -01091021 -144302aa -00000000 -3c08620a -35084c00 -24090000 -3c03620a -34634c00 -01091021 -144302a2 -00000000 -3c085164 -3508da77 -24090000 -3c035164 -3463da77 -01091021 -1443029a -00000000 -3c08f2b3 -35088680 -24090000 -3c03f2b3 -34638680 -01091021 -14430292 -00000000 -3c082e71 -3508b71d -24090000 -3c032e71 -3463b71d -01091021 -1443028a -00000000 -3c08bc6d -35084870 -24090000 -3c03bc6d -34634870 -01091021 -14430282 -00000000 -3c087193 -35089385 -24090000 -3c037193 -34639385 -01091021 -1443027a -00000000 -3c08e3f1 -3508d9c0 -24090000 -3c03e3f1 -3463d9c0 -01091021 -14430272 -00000000 -3c080903 -35086a40 -24090000 -3c030903 -34636a40 -01091021 -1443026a -00000000 -3c086ae8 -35088e14 -24090000 -3c036ae8 -34638e14 -01091021 -14430262 -00000000 -3c083cdf -35088f3f -24090000 -3c033cdf -34638f3f -01091021 -1443025a -00000000 -3c08379b -3508c4f8 -24090000 -3c03379b -3463c4f8 -01091021 -14430252 -00000000 -3c08092f -3508ade4 -24090000 -3c03092f -3463ade4 -01091021 -1443024a -00000000 -3c0816bc -350825f1 -24090000 -3c0316bc -346325f1 -01091021 -14430242 -00000000 -3c081158 -3508f422 -24090000 -3c031158 -3463f422 -01091021 -1443023a -00000000 -3c08d978 -3508731c -24090000 -3c03d978 -3463731c -01091021 -14430232 -00000000 -3c080c76 -350877c4 -24090000 -3c030c76 -346377c4 -01091021 -1443022a -00000000 -3c087520 -3508d795 -24090000 -3c037520 -3463d795 -01091021 -14430222 -00000000 -3c088a9b -35088610 -24090000 -3c038a9b -34638610 -01091021 -1443021a -00000000 -3c08a3ba -35086c16 -24090000 -3c03a3ba -34636c16 -01091021 -14430212 -00000000 -3c08623b -35085124 -24090000 -3c03623b -34635124 -01091021 -1443020a -00000000 -3c08b118 -350823a4 -24090000 -3c03b118 -346323a4 -01091021 -14430202 -00000000 -3c080506 -3508e4b2 -24090000 -3c030506 -3463e4b2 -01091021 -144301fa -00000000 -3c081349 -3508b420 -24090000 -3c031349 -3463b420 -01091021 -144301f2 -00000000 -3c08a020 -3508b050 -24090000 -3c03a020 -3463b050 -01091021 -144301ea -00000000 -3c080d2b -35089000 -24090000 -3c030d2b -34639000 -01091021 -144301e2 -00000000 -3c08ce57 -350843f0 -24090000 -3c03ce57 -346343f0 -01091021 -144301da -00000000 -3c081d53 -3508803c -24090000 -3c031d53 -3463803c -01091021 -144301d2 -00000000 -3c088134 -35086372 -24090000 -3c038134 -34636372 -01091021 -144301ca -00000000 -3c082b2e -350838c2 -24090000 -3c032b2e -346338c2 -01091021 -144301c2 -00000000 -3c0810f0 -3508288a -24090000 -3c0310f0 -3463288a -01091021 -144301ba -00000000 -3c08cc43 -35088150 -24090000 -3c03cc43 -34638150 -01091021 -144301b2 -00000000 -3c08e154 -3508b4b4 -24090000 -3c03e154 -3463b4b4 -01091021 -144301aa -00000000 -3c08a69f -35084a7c -24090000 -3c03a69f -34634a7c -01091021 -144301a2 -00000000 -3c08642d -35088a00 -24090000 -3c03642d -34638a00 -01091021 -1443019a -00000000 -24080000 -3c099ab8 -352976f5 -3c039ab8 -346376f5 -01091021 -14430192 -00000000 -24080000 -3c094fbe -35299680 -3c034fbe -34639680 -01091021 -1443018a -00000000 -24080000 -3c099029 -35292684 -3c039029 -34632684 -01091021 -14430182 -00000000 -24080000 -3c091c79 -3529b23e -3c031c79 -3463b23e -01091021 -1443017a -00000000 -24080000 -3c099521 -35296b71 -3c039521 -34636b71 -01091021 -14430172 -00000000 -24080000 -3c09c857 -35299b06 -3c03c857 -34639b06 -01091021 -1443016a -00000000 -24080000 -3c09ada9 -352914bd -3c03ada9 -346314bd -01091021 -14430162 -00000000 -24080000 -3c0953e0 -352975e4 -3c0353e0 -346375e4 -01091021 -1443015a -00000000 -24080000 -3c090004 -3529faca -3c030004 -3463faca -01091021 -14430152 -00000000 -24080000 -3c096d78 -352951e0 -3c036d78 -346351e0 -01091021 -1443014a -00000000 -24080000 -3c094ff9 -35294e72 -3c034ff9 -34634e72 -01091021 -14430142 -00000000 -24080000 -3c091f8e -35298cb8 -3c031f8e -34638cb8 -01091021 -1443013a -00000000 -24080000 -3c09140f -352958d8 -3c03140f -346358d8 -01091021 -14430132 -00000000 -24080000 -3c097028 -3529e438 -3c037028 -3463e438 -01091021 -1443012a -00000000 -24080000 -3c0906a6 -3529303c -3c0306a6 -3463303c -01091021 -14430122 -00000000 -24080000 -3c097d95 -3529119a -3c037d95 -3463119a -01091021 -1443011a -00000000 -24080000 -3c09d118 -3529e770 -3c03d118 -3463e770 -01091021 -14430112 -00000000 -24080000 -3c092d01 -3529ab00 -3c032d01 -3463ab00 -01091021 -1443010a -00000000 -24080000 -3c097ecc -352979e0 -3c037ecc -346379e0 -01091021 -14430102 -00000000 -24080000 -3c09c9f8 -3529a444 -3c03c9f8 -3463a444 -01091021 -144300fa -00000000 -24080000 -3c0917be -3529fe40 -3c0317be -3463fe40 -01091021 -144300f2 -00000000 -24080000 -3c09105d -35293124 -3c03105d -34633124 -01091021 -144300ea -00000000 -24080000 -3c0960a5 -3529ab64 -3c0360a5 -3463ab64 -01091021 -144300e2 -00000000 -24080000 -3c0954a9 -352909b0 -3c0354a9 -346309b0 -01091021 -144300da -00000000 -24080000 -3c0907ce -3529a9ac -3c0307ce -3463a9ac -01091021 -144300d2 -00000000 -24080000 -3c091ba4 -352959b0 -3c031ba4 -346359b0 -01091021 -144300ca -00000000 -24080000 -3c09e901 -3529e79c -3c03e901 -3463e79c -01091021 -144300c2 -00000000 -24080000 -3c09d094 -35291820 -3c03d094 -34631820 -01091021 -144300ba -00000000 -24080000 -3c09c74b -35290efc -3c03c74b -34630efc -01091021 -144300b2 -00000000 -24080000 -3c09d114 -35291a90 -3c03d114 -34631a90 -01091021 -144300aa -00000000 -24080000 -3c09bad6 -352962b6 -3c03bad6 -346362b6 -01091021 -144300a2 -00000000 -24080000 -3c09e3e0 -352935dc -3c03e3e0 -346335dc -01091021 -1443009a -00000000 -24080000 -3c098036 -352968e8 -3c038036 -346368e8 -01091021 -14430092 -00000000 -24080000 -3c099b06 -35290f64 -3c039b06 -34630f64 -01091021 -1443008a -00000000 -24080000 -3c090a23 -3529d40a -3c030a23 -3463d40a -01091021 -14430082 -00000000 -24080000 -3c0908ed -35291541 -3c0308ed -34631541 -01091021 -1443007a -00000000 -24080000 -3c09b0bf -3529dbe0 -3c03b0bf -3463dbe0 -01091021 -14430072 -00000000 -24080000 -3c099b0d -3529d6b6 -3c039b0d -3463d6b6 -01091021 -1443006a -00000000 -24080000 -3c09944f -3529d39c -3c03944f -3463d39c -01091021 -14430062 -00000000 -24080000 -3c09633a -352977e0 -3c03633a -346377e0 -01091021 -1443005a -00000000 -24080000 -3c09fa41 -35296a96 -3c03fa41 -34636a96 -01091021 -14430052 -00000000 -24080000 -3c094c63 -3529b1ce -3c034c63 -3463b1ce -01091021 -1443004a -00000000 -24080000 -3c093da7 -3529a838 -3c033da7 -3463a838 -01091021 -14430042 -00000000 -24080000 -3c091ce0 -3529f444 -3c031ce0 -3463f444 -01091021 -1443003a -00000000 -24080000 -3c098573 -3529c0f2 -3c038573 -3463c0f2 -01091021 -14430032 -00000000 -24080000 -3c092a4e -3529b3a0 -3c032a4e -3463b3a0 -01091021 -1443002a -00000000 -24080000 -3c096c38 -35295f78 -3c036c38 -34635f78 -01091021 -14430022 -00000000 -24080000 -3c09c1b4 -35299780 -3c03c1b4 -34639780 -01091021 -1443001a -00000000 -24080000 -3c09ed4a -35295381 -3c03ed4a -34635381 -01091021 -14430012 -00000000 -24080000 -3c093101 -35295100 -3c033101 -34635100 -01091021 -1443000a -00000000 -24080000 -24090000 -24030000 -01091021 -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -24120000 -3c08a0fd -350856b0 -01000011 -00001010 -3c15a0fd -36b556b0 -14550352 -00000000 -3c083403 -35086328 -01000011 -00001010 -3c153403 -36b56328 -1455034a -00000000 -3c087dca -3508d506 -01000011 -00001010 -3c157dca -36b5d506 -14550342 -00000000 -3c0862ca -3508efdc -01000011 -00001010 -3c1562ca -36b5efdc -1455033a -00000000 -3c084ec1 -3508d4e2 -01000011 -00001010 -3c154ec1 -36b5d4e2 -14550332 -00000000 -3c08bb3d -3508d000 -01000011 -00001010 -3c15bb3d -36b5d000 -1455032a -00000000 -3c08dac4 -35082a1c -01000011 -00001010 -3c15dac4 -36b52a1c -14550322 -00000000 -3c08966e -350884ac -01000011 -00001010 -3c15966e -36b584ac -1455031a -00000000 -3c083bcd -35087b10 -01000011 -00001010 -3c153bcd -36b57b10 -14550312 -00000000 -3c08ddc2 -35085525 -01000011 -00001010 -3c15ddc2 -36b55525 -1455030a -00000000 -3c088beb -3508f210 -01000011 -00001010 -3c158beb -36b5f210 -14550302 -00000000 -3c08f964 -3508e610 -01000011 -00001010 -3c15f964 -36b5e610 -145502fa -00000000 -3c0846e4 -35084b12 -01000011 -00001010 -3c1546e4 -36b54b12 -145502f2 -00000000 -3c08e2e6 -3508f846 -01000011 -00001010 -3c15e2e6 -36b5f846 -145502ea -00000000 -3c0846ae -35088aa8 -01000011 -00001010 -3c1546ae -36b58aa8 -145502e2 -00000000 -3c081191 -3508cd7f -01000011 -00001010 -3c151191 -36b5cd7f -145502da -00000000 -3c08bd80 -35083578 -01000011 -00001010 -3c15bd80 -36b53578 -145502d2 -00000000 -3c081302 -3508389a -01000011 -00001010 -3c151302 -36b5389a -145502ca -00000000 -3c083823 -350871da -01000011 -00001010 -3c153823 -36b571da -145502c2 -00000000 -3c08454f -35089e29 -01000011 -00001010 -3c15454f -36b59e29 -145502ba -00000000 -3c083832 -3508df89 -01000011 -00001010 -3c153832 -36b5df89 -145502b2 -00000000 -3c086f54 -35086cea -01000011 -00001010 -3c156f54 -36b56cea -145502aa -00000000 -3c08bf33 -3508bbb0 -01000011 -00001010 -3c15bf33 -36b5bbb0 -145502a2 -00000000 -3c089640 -35082740 -01000011 -00001010 -3c159640 -36b52740 -1455029a -00000000 -3c08f882 -35081e10 -01000011 -00001010 -3c15f882 -36b51e10 -14550292 -00000000 -3c086db7 -3508e680 -01000011 -00001010 -3c156db7 -36b5e680 -1455028a -00000000 -3c0888a8 -3508dd60 -01000011 -00001010 -3c1588a8 -36b5dd60 -14550282 -00000000 -3c082c03 -35080dc6 -01000011 -00001010 -3c152c03 -36b50dc6 -1455027a -00000000 -3c08a2de -35083f98 -01000011 -00001010 -3c15a2de -36b53f98 -14550272 -00000000 -3c086452 -350815a3 -01000011 -00001010 -3c156452 -36b515a3 -1455026a -00000000 -3c08b7bd -350808c0 -01000011 -00001010 -3c15b7bd -36b508c0 -14550262 -00000000 -3c087003 -3508883c -01000011 -00001010 -3c157003 -36b5883c -1455025a -00000000 -3c08b4e0 -3508116c -01000011 -00001010 -3c15b4e0 -36b5116c -14550252 -00000000 -3c0822bd -3508ca2a -01000011 -00001010 -3c1522bd -36b5ca2a -1455024a -00000000 -3c084567 -3508e2b5 -01000011 -00001010 -3c154567 -36b5e2b5 -14550242 -00000000 -3c0801f8 -3508285f -01000011 -00001010 -3c1501f8 -36b5285f -1455023a -00000000 -3c082033 -3508f310 -01000011 -00001010 -3c152033 -36b5f310 -14550232 -00000000 -3c083c3e -35088e57 -01000011 -00001010 -3c153c3e -36b58e57 -1455022a -00000000 -3c085792 -3508c206 -01000011 -00001010 -3c155792 -36b5c206 -14550222 -00000000 -3c083703 -35087ada -01000011 -00001010 -3c153703 -36b57ada -1455021a -00000000 -3c08602c -3508e460 -01000011 -00001010 -3c15602c -36b5e460 -14550212 -00000000 -3c087e21 -35088364 -01000011 -00001010 -3c157e21 -36b58364 -1455020a -00000000 -3c08465f -3508f380 -01000011 -00001010 -3c15465f -36b5f380 -14550202 -00000000 -3c081fab -3508a8dd -01000011 -00001010 -3c151fab -36b5a8dd -145501fa -00000000 -3c08ab45 -35085c80 -01000011 -00001010 -3c15ab45 -36b55c80 -145501f2 -00000000 -3c084460 -3508c128 -01000011 -00001010 -3c154460 -36b5c128 -145501ea -00000000 -3c08c7ca -3508d944 -01000011 -00001010 -3c15c7ca -36b5d944 -145501e2 -00000000 -3c08dec3 -35088e8e -01000011 -00001010 -3c15dec3 -36b58e8e -145501da -00000000 -3c08503a -350832a2 -01000011 -00001010 -3c15503a -36b532a2 -145501d2 -00000000 -3c085300 -35081f30 -01000011 -00001010 -3c155300 -36b51f30 -145501ca -00000000 -3c081d51 -3508e498 -01000011 -00001010 -3c151d51 -36b5e498 -145501c2 -00000000 -3c08f80f -35081780 -01000011 -00001010 -3c15f80f -36b51780 -145501ba -00000000 -3c084add -35085ee1 -01000011 -00001010 -3c154add -36b55ee1 -145501b2 -00000000 -3c08361e -3508d76a -01000011 -00001010 -3c15361e -36b5d76a -145501aa -00000000 -3c08e5d7 -35081450 -01000011 -00001010 -3c15e5d7 -36b51450 -145501a2 -00000000 -3c081cad -35086a18 -01000011 -00001010 -3c151cad -36b56a18 -1455019a -00000000 -3c08a3ce -35085b80 -01000011 -00001010 -3c15a3ce -36b55b80 -14550192 -00000000 -3c083291 -35089320 -01000011 -00001010 -3c153291 -36b59320 -1455018a -00000000 -3c08c4a4 -3508e200 -01000011 -00001010 -3c15c4a4 -36b5e200 -14550182 -00000000 -3c08b4d6 -350811b0 -01000011 -00001010 -3c15b4d6 -36b511b0 -1455017a -00000000 -3c082f7f -35084c0c -01000011 -00001010 -3c152f7f -36b54c0c -14550172 -00000000 -3c08f1de -350870c4 -01000011 -00001010 -3c15f1de -36b570c4 -1455016a -00000000 -3c08c419 -35088cf8 -01000011 -00001010 -3c15c419 -36b58cf8 -14550162 -00000000 -3c08401a -35086554 -01000011 -00001010 -3c15401a -36b56554 -1455015a -00000000 -3c08d674 -350833e0 -01000011 -00001010 -3c15d674 -36b533e0 -14550152 -00000000 -3c0839b0 -350888da -01000011 -00001010 -3c1539b0 -36b588da -1455014a -00000000 -3c083741 -35080b1a -01000011 -00001010 -3c153741 -36b50b1a -14550142 -00000000 -3c089a4a -3508fe50 -01000011 -00001010 -3c159a4a -36b5fe50 -1455013a -00000000 -3c0812b5 -3508de60 -01000011 -00001010 -3c1512b5 -36b5de60 -14550132 -00000000 -3c08bd1c -3508510c -01000011 -00001010 -3c15bd1c -36b5510c -1455012a -00000000 -3c084f0b -3508c620 -01000011 -00001010 -3c154f0b -36b5c620 -14550122 -00000000 -3c08398f -3508b9a8 -01000011 -00001010 -3c15398f -36b5b9a8 -1455011a -00000000 -3c085092 -3508936d -01000011 -00001010 -3c155092 -36b5936d -14550112 -00000000 -3c086251 -3508c1a0 -01000011 -00001010 -3c156251 -36b5c1a0 -1455010a -00000000 -3c088dae -3508a63b -01000011 -00001010 -3c158dae -36b5a63b -14550102 -00000000 -3c0879cb -3508b088 -01000011 -00001010 -3c1579cb -36b5b088 -145500fa -00000000 -3c083313 -35080bb6 -01000011 -00001010 -3c153313 -36b50bb6 -145500f2 -00000000 -3c08930a -3508196a -01000011 -00001010 -3c15930a -36b5196a -145500ea -00000000 -3c089e38 -35088580 -01000011 -00001010 -3c159e38 -36b58580 -145500e2 -00000000 -3c0830ef -35080e30 -01000011 -00001010 -3c1530ef -36b50e30 -145500da -00000000 -3c08f852 -35089c83 -01000011 -00001010 -3c15f852 -36b59c83 -145500d2 -00000000 -3c08a322 -3508cf9f -01000011 -00001010 -3c15a322 -36b5cf9f -145500ca -00000000 -3c08178b -3508aea0 -01000011 -00001010 -3c15178b -36b5aea0 -145500c2 -00000000 -3c08acdf -3508244e -01000011 -00001010 -3c15acdf -36b5244e -145500ba -00000000 -3c0872c8 -35087f74 -01000011 -00001010 -3c1572c8 -36b57f74 -145500b2 -00000000 -3c08e299 -35080f70 -01000011 -00001010 -3c15e299 -36b50f70 -145500aa -00000000 -3c082ebd -3508f808 -01000011 -00001010 -3c152ebd -36b5f808 -145500a2 -00000000 -3c085b15 -35080768 -01000011 -00001010 -3c155b15 -36b50768 -1455009a -00000000 -3c084d85 -35088c86 -01000011 -00001010 -3c154d85 -36b58c86 -14550092 -00000000 -3c081680 -3508a180 -01000011 -00001010 -3c151680 -36b5a180 -1455008a -00000000 -3c08b53c -35087514 -01000011 -00001010 -3c15b53c -36b57514 -14550082 -00000000 -3c08326a -3508f520 -01000011 -00001010 -3c15326a -36b5f520 -1455007a -00000000 -3c08d05d -35082da8 -01000011 -00001010 -3c15d05d -36b52da8 -14550072 -00000000 -3c08244b -35083ae0 -01000011 -00001010 -3c15244b -36b53ae0 -1455006a -00000000 -3c08a2d7 -3508b966 -01000011 -00001010 -3c15a2d7 -36b5b966 -14550062 -00000000 -3c08a9c6 -35087ce0 -01000011 -00001010 -3c15a9c6 -36b57ce0 -1455005a -00000000 -3c0894b5 -3508f36c -01000011 -00001010 -3c1594b5 -36b5f36c -14550052 -00000000 -3c083e82 -350897ea -01000011 -00001010 -3c153e82 -36b597ea -1455004a -00000000 -3c088d28 -3508d45c -01000011 -00001010 -3c158d28 -36b5d45c -14550042 -00000000 -3c08b9f6 -3508303c -01000011 -00001010 -3c15b9f6 -36b5303c -1455003a -00000000 -3c083324 -3508f55f -01000011 -00001010 -3c153324 -36b5f55f -14550032 -00000000 -3c08da57 -3508c2f0 -01000011 -00001010 -3c15da57 -36b5c2f0 -1455002a -00000000 -3c088a10 -35086518 -01000011 -00001010 -3c158a10 -36b56518 -14550022 -00000000 -3c08c6b2 -3508ae32 -01000011 -00001010 -3c15c6b2 -36b5ae32 -1455001a -00000000 -3c08625d -35087728 -01000011 -00001010 -3c15625d -36b57728 -14550012 -00000000 -3c080629 -350891d6 -01000011 -00001010 -3c150629 -36b591d6 -1455000a -00000000 -24080000 -01000011 -00001010 -24150000 -14550004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -24120000 -3c08d6fc -35080584 -3c095f97 -352965a8 -3c037764 -34639fdc -01091023 -14430a29 -00000000 -3c08bf9c -350895c2 -3c093368 -3529890e -3c038c34 -34630cb4 -01091023 -14430a20 -00000000 -3c08da67 -3508a888 -3c09a727 -3529b830 -3c03333f -3463f058 -01091023 -14430a17 -00000000 -3c082385 -35088808 -3c09657a -352998bc -3c03be0a -3463ef4c -01091023 -14430a0e -00000000 -3c08040a -3508e1f0 -3c094eff -35290fe8 -3c03b50b -3463d208 -01091023 -14430a05 -00000000 -3c0845c9 -3508e968 -3c09baec -3529ca18 -3c038add -34631f50 -01091023 -144309fc -00000000 -3c08541b -3508ce6c -3c09e3ee -3529b018 -3c03702d -34631e54 -01091023 -144309f3 -00000000 -3c080282 -35085068 -3c09a1de -3529973a -3c0360a3 -3463b92e -01091023 -144309ea -00000000 -3c08f8c1 -350813c0 -3c09052c -3529e450 -3c03f394 -34632f70 -01091023 -144309e1 -00000000 -3c089686 -35088792 -3c09d109 -3529051c -3c03c57d -34638276 -01091023 -144309d8 -00000000 -3c08f53c -35086d68 -3c09c1c4 -35296588 -3c033378 -346307e0 -01091023 -144309cf -00000000 -3c0815f9 -3508b790 -3c09d2e2 -35290d27 -3c034317 -3463aa69 -01091023 -144309c6 -00000000 -3c08dd8a -35084223 -3c09350d -352915c0 -3c03a87d -34632c63 -01091023 -144309bd -00000000 -3c088f31 -3508c286 -3c092cea -3529e250 -3c036246 -3463e036 -01091023 -144309b4 -00000000 -3c0875c8 -35083600 -3c0932f9 -35294254 -3c0342ce -3463f3ac -01091023 -144309ab -00000000 -3c084237 -350823c4 -3c097aa1 -352965d0 -3c03c795 -3463bdf4 -01091023 -144309a2 -00000000 -3c0832e5 -350871f0 -3c09baec -3529c1ac -3c0377f8 -3463b044 -01091023 -14430999 -00000000 -3c08c5d0 -35086600 -3c099161 -35291ea8 -3c03346f -34634758 -01091023 -14430990 -00000000 -3c0800c6 -35080432 -3c0998b2 -35295356 -3c036813 -3463b0dc -01091023 -14430987 -00000000 -3c0818a1 -35081fa1 -3c09dde9 -352917e4 -3c033ab8 -346307bd -01091023 -1443097e -00000000 -3c08c500 -35085fc8 -3c09e132 -3529c555 -3c03e3cd -34639a73 -01091023 -14430975 -00000000 -3c08b371 -35089000 -3c093699 -352995a3 -3c037cd7 -3463fa5d -01091023 -1443096c -00000000 -3c08c334 -3508c06c -3c0995e8 -35294978 -3c032d4c -346376f4 -01091023 -14430963 -00000000 -3c08ebdf -35080650 -3c09f625 -35291700 -3c03f5b9 -3463ef50 -01091023 -1443095a -00000000 -3c088343 -3508a5d0 -3c095a87 -3529c844 -3c0328bb -3463dd8c -01091023 -14430951 -00000000 -3c086b53 -3508ec00 -3c090f8d -35293793 -3c035bc6 -3463b46d -01091023 -14430948 -00000000 -3c08afeb -350838c2 -3c094ad9 -3529906c -3c036511 -3463a856 -01091023 -1443093f -00000000 -3c08d677 -35082c6c -3c09a1cf -35292440 -3c0334a8 -3463082c -01091023 -14430936 -00000000 -3c08d593 -3508ae94 -3c098e0b -3529c704 -3c034787 -3463e790 -01091023 -1443092d -00000000 -3c087e42 -35089d08 -3c09331d -3529d000 -3c034b24 -3463cd08 -01091023 -14430924 -00000000 -3c080f80 -3508fb92 -3c09e934 -35294e60 -3c03264c -3463ad32 -01091023 -1443091b -00000000 -3c08e875 -3508e234 -3c090d1e -3529885c -3c03db57 -346359d8 -01091023 -14430912 -00000000 -3c086f5f -35088dd7 -3c096593 -35291578 -3c0309cc -3463785f -01091023 -14430909 -00000000 -3c087675 -3508c428 -3c0990bd -3529fbb0 -3c03e5b7 -3463c878 -01091023 -14430900 -00000000 -3c08a915 -3508ba2f -3c090917 -3529c008 -3c039ffd -3463fa27 -01091023 -144308f7 -00000000 -3c089194 -3508ded8 -3c097cca -3529603c -3c0314ca -34637e9c -01091023 -144308ee -00000000 -3c081934 -35084280 -3c09921d -3529b4d2 -3c038716 -34638dae -01091023 -144308e5 -00000000 -3c08b17c -350833ec -3c0998e7 -3529f1c8 -3c031894 -34634224 -01091023 -144308dc -00000000 -3c08f05d -3508ec60 -3c09d3d0 -35295b00 -3c031c8d -34639160 -01091023 -144308d3 -00000000 -3c088be2 -3508ec4e -3c092f1e -35298ff6 -3c035cc4 -34635c58 -01091023 -144308ca -00000000 -3c085e69 -3508e280 -3c096b1c -3529b358 -3c03f34d -34632f28 -01091023 -144308c1 -00000000 -3c0823b4 -3508e63e -3c0901cb -352927a8 -3c0321e9 -3463be96 -01091023 -144308b8 -00000000 -3c0873a2 -3508f524 -3c091342 -35294cfd -3c036060 -3463a827 -01091023 -144308af -00000000 -3c08af2d -3508dbd0 -3c09a7c8 -3529a588 -3c030765 -34633648 -01091023 -144308a6 -00000000 -3c0840bc -3508cb24 -3c09d51e -3529a0e8 -3c036b9e -34632a3c -01091023 -1443089d -00000000 -3c08d55f -35081d58 -3c09ebcb -3529f0d8 -3c03e993 -34632c80 -01091023 -14430894 -00000000 -3c084000 -35087d14 -3c0973b4 -35290222 -3c03cc4c -34637af2 -01091023 -1443088b -00000000 -3c084c8d -350832a0 -3c09c29f -3529112c -3c0389ee -34632174 -01091023 -14430882 -00000000 -3c085190 -3508e68a -3c097c96 -3529b13c -3c03d4fa -3463354e -01091023 -14430879 -00000000 -3c086c65 -35089034 -3c09aee0 -3529b7cc -3c03bd84 -3463d868 -01091023 -14430870 -00000000 -3c08be39 -350803d0 -3c090375 -3529ed52 -3c03bac3 -3463167e -01091023 -14430867 -00000000 -3c08f8ec -3508ec8d -3c096eca -3529be4b -3c038a22 -34632e42 -01091023 -1443085e -00000000 -3c081836 -3508ae30 -3c0991e3 -3529d038 -3c038652 -3463ddf8 -01091023 -14430855 -00000000 -3c08ad52 -3508af54 -3c098db8 -35294360 -3c031f9a -34636bf4 -01091023 -1443084c -00000000 -3c084117 -3508ea50 -3c09d5b6 -3529bf90 -3c036b61 -34632ac0 -01091023 -14430843 -00000000 -3c086b14 -35080b9e -3c0909d5 -35293740 -3c03613e -3463d45e -01091023 -1443083a -00000000 -3c0845d3 -3508b555 -3c09ee9f -35291b40 -3c035734 -34639a15 -01091023 -14430831 -00000000 -3c0868f8 -3508ee5b -3c092b20 -3529c916 -3c033dd8 -34632545 -01091023 -14430828 -00000000 -3c08aca7 -350802e6 -3c090e8f -35290170 -3c039e18 -34630176 -01091023 -1443081f -00000000 -3c085b20 -3508ef94 -3c0914f6 -35292c69 -3c03462a -3463c32b -01091023 -14430816 -00000000 -3c084913 -35089100 -3c093f3c -3529b630 -3c0309d6 -3463dad0 -01091023 -1443080d -00000000 -3c08ee44 -35080f3c -3c09dd85 -3529e334 -3c0310be -34632c08 -01091023 -14430804 -00000000 -3c08f44f -35088ae0 -3c099f66 -3529ac00 -3c0354e8 -3463dee0 -01091023 -144307fb -00000000 -3c0858ff -35080bd0 -3c09c678 -35299a58 -3c039286 -34637178 -01091023 -144307f2 -00000000 -3c083a6a -350859dd -3c09a857 -352959f4 -3c039212 -3463ffe9 -01091023 -144307e9 -00000000 -3c08720a -35086644 -3c09da5b -35293a4a -3c0397af -34632bfa -01091023 -144307e0 -00000000 -3c084b26 -3508bda0 -3c09e7a2 -35293c38 -3c036384 -34638168 -01091023 -144307d7 -00000000 -3c0854c9 -35080300 -3c0959bc -3529dc53 -3c03fb0c -346326ad -01091023 -144307ce -00000000 -3c085871 -350812f8 -3c09216a -35297f8a -3c033706 -3463936e -01091023 -144307c5 -00000000 -3c082ab5 -35084d0e -3c0990f7 -3529c654 -3c0399bd -346386ba -01091023 -144307bc -00000000 -3c0893f6 -35084860 -3c09eeaa -3529a800 -3c03a54b -3463a060 -01091023 -144307b3 -00000000 -3c08947e -35083bc0 -3c09d101 -3529721c -3c03c37c -3463c9a4 -01091023 -144307aa -00000000 -3c0808b0 -35085218 -3c09f7df -352914c0 -3c0310d1 -34633d58 -01091023 -144307a1 -00000000 -3c088b99 -35080582 -3c09b45e -3529ca88 -3c03d73a -34633afa -01091023 -14430798 -00000000 -3c0854a0 -35089c60 -3c09f065 -3529ff59 -3c03643a -34639d07 -01091023 -1443078f -00000000 -3c0802a4 -3508e3d2 -3c095ca7 -35295800 -3c03a5fd -34638bd2 -01091023 -14430786 -00000000 -3c087102 -3508c503 -3c09458e -3529eabf -3c032b73 -3463da44 -01091023 -1443077d -00000000 -3c088493 -35080c00 -3c09f5c0 -35294224 -3c038ed2 -3463c9dc -01091023 -14430774 -00000000 -3c08e1f5 -35085702 -3c0941fc -35292a68 -3c039ff9 -34632c9a -01091023 -1443076b -00000000 -3c08fe1b -350855e2 -3c0944d4 -3529b784 -3c03b946 -34639e5e -01091023 -14430762 -00000000 -3c08a8c6 -350899f8 -3c094056 -3529c3a8 -3c03686f -3463d650 -01091023 -14430759 -00000000 -3c08e6e6 -3508ad02 -3c0906c3 -3529f8bc -3c03e022 -3463b446 -01091023 -14430750 -00000000 -3c08f305 -350870c0 -3c092fd8 -35296c00 -3c03c32d -346304c0 -01091023 -14430747 -00000000 -3c086add -3508b000 -3c0972dd -3529f116 -3c03f7ff -3463beea -01091023 -1443073e -00000000 -3c08005a -35084666 -3c0987aa -352908e6 -3c0378b0 -34633d80 -01091023 -14430735 -00000000 -3c0892c3 -35084fdc -3c09eed1 -35295158 -3c03a3f1 -3463fe84 -01091023 -1443072c -00000000 -3c08b925 -35083436 -3c09123d -35295420 -3c03a6e7 -3463e016 -01091023 -14430723 -00000000 -3c08d65e -350856b0 -3c09ab98 -35290008 -3c032ac6 -346356a8 -01091023 -1443071a -00000000 -3c08ac7c -3508059e -3c0952dc -35294fa0 -3c03599f -3463b5fe -01091023 -14430711 -00000000 -3c08bc07 -3508d9da -3c09ad7b -3529bcec -3c030e8c -34631cee -01091023 -14430708 -00000000 -3c086b4e -35086d00 -3c09ae14 -35296cf7 -3c03bd3a -34630009 -01091023 -144306ff -00000000 -3c086337 -35089060 -3c0919bd -3529810e -3c03497a -34630f52 -01091023 -144306f6 -00000000 -3c08904e -35080384 -3c09aa67 -3529e29c -3c03e5e6 -346320e8 -01091023 -144306ed -00000000 -3c0879cc -35088db2 -3c099ae3 -352999aa -3c03dee8 -3463f408 -01091023 -144306e4 -00000000 -3c08ce51 -3508dd0c -3c091836 -3529ad40 -3c03b61b -34632fcc -01091023 -144306db -00000000 -3c08ea3b -3508f860 -3c090248 -3529a513 -3c03e7f3 -3463534d -01091023 -144306d2 -00000000 -3c0840d4 -3508aa2a -3c09d4da -3529cd6f -3c036bf9 -3463dcbb -01091023 -144306c9 -00000000 -3c0853e3 -3508d700 -3c094f33 -3529d300 -3c0304b0 -34630400 -01091023 -144306c0 -00000000 -3c0830b8 -3508cba6 -3c093e29 -3529f09e -3c03f28e -3463db08 -01091023 -144306b7 -00000000 -3c08f4af -35082845 -3c095565 -35294200 -3c039f49 -3463e645 -01091023 -144306ae -00000000 -3c08cb0b -3508e8f8 -3c093473 -352965c8 -3c039698 -34638330 -01091023 -144306a5 -00000000 -3c08692e -35081180 -3c09c188 -3529d6a0 -3c03a7a5 -34633ae0 -01091023 -1443069c -00000000 -3c08fe94 -3508aaa8 -3c09ef27 -3529122e -3c030f6d -3463987a -01091023 -14430693 -00000000 -3c08a1f3 -35086ec0 -3c096669 -35293db2 -3c033b8a -3463310e -01091023 -1443068a -00000000 -3c08ae2f -3508b728 -3c094d61 -35297672 -3c0360ce -346340b6 -01091023 -14430681 -00000000 -3c089ba7 -3508b6e2 -3c091ebf -35298890 -3c037ce8 -34632e52 -01091023 -14430678 -00000000 -3c0860ef -3508d1c4 -3c090fe2 -3529f390 -3c03510c -3463de34 -01091023 -1443066f -00000000 -3c0831c9 -35088f88 -3c09bbc3 -3529d688 -3c037605 -3463b900 -01091023 -14430666 -00000000 -3c08d891 -35087445 -3c096589 -3529f460 -3c037307 -34637fe5 -01091023 -1443065d -00000000 -3c0825b4 -35085134 -3c09ad5b -35293f8c -3c037859 -346311a8 -01091023 -14430654 -00000000 -3c0834b0 -3508d278 -3c09a417 -35296f7b -3c039099 -346362fd -01091023 -1443064b -00000000 -3c081b1b -3508d5d9 -3c09e9ae -3529b1a4 -3c03316d -34632435 -01091023 -14430642 -00000000 -3c08cf4b -350810b0 -3c099124 -3529ed88 -3c033e26 -34632328 -01091023 -14430639 -00000000 -3c08cb8f -3508cc08 -3c098ad9 -35299afc -3c0340b6 -3463310c -01091023 -14430630 -00000000 -3c0852fe -3508bbe8 -3c09b0dd -3529ef40 -3c03a220 -3463cca8 -01091023 -14430627 -00000000 -3c087cb2 -35081da2 -3c09a937 -3529c0c0 -3c03d37a -34635ce2 -01091023 -1443061e -00000000 -3c08c5d6 -3508ae80 -3c09e29c -35298ce0 -3c03e33a -346321a0 -01091023 -14430615 -00000000 -3c08d8cd -350885fa -3c0981cd -35293d40 -3c035700 -346348ba -01091023 -1443060c -00000000 -3c08581b -35088e64 -3c09fddf -3529c888 -3c035a3b -3463c5dc -01091023 -14430603 -00000000 -3c08679a -3508a14d -3c092f25 -3529362d -3c033875 -34636b20 -01091023 -144305fa -00000000 -3c08c1be -35080410 -3c090f37 -35290c48 -3c03b286 -3463f7c8 -01091023 -144305f1 -00000000 -3c08df8e -35089f1c -3c09207f -352975b4 -3c03bf0f -34632968 -01091023 -144305e8 -00000000 -3c0806f7 -3508c99b -3c096217 -35296344 -3c03a4e0 -34636657 -01091023 -144305df -00000000 -3c085530 -3508a5a0 -3c090457 -35298103 -3c0350d9 -3463249d -01091023 -144305d6 -00000000 -3c08d403 -35088ae4 -3c097baa -35294c78 -3c035859 -34633e6c -01091023 -144305cd -00000000 -3c088cd5 -3508df00 -3c09555f -352905db -3c033776 -3463d925 -01091023 -144305c4 -00000000 -3c0802d8 -35085838 -3c09f397 -35295d44 -3c030f40 -3463faf4 -01091023 -144305bb -00000000 -3c084947 -3508f4c0 -3c09116b -3529b2bc -3c0337dc -34634204 -01091023 -144305b2 -00000000 -3c08c320 -35085480 -3c09f357 -35295cd8 -3c03cfc8 -3463f7a8 -01091023 -144305a9 -00000000 -3c083f89 -3508ff18 -3c09f4ff -352996f8 -3c034a8a -34636820 -01091023 -144305a0 -00000000 -3c0891ba -3508ea53 -3c0979f6 -3529c5c8 -3c0317c4 -3463248b -01091023 -14430597 -00000000 -3c08b55f -3508972a -3c09a609 -3529a5e0 -3c030f55 -3463f14a -01091023 -1443058e -00000000 -3c08c690 -3508f86f -3c09820c -352954b9 -3c034484 -3463a3b6 -01091023 -14430585 -00000000 -3c08c1e0 -3508ac00 -3c09cc9a -35292edb -3c03f546 -34637d25 -01091023 -1443057c -00000000 -3c08f1b1 -3508b086 -3c091724 -3529c0ca -3c03da8c -3463efbc -01091023 -14430573 -00000000 -3c08bfe4 -350867d8 -3c0990e6 -35290dcf -3c032efe -34635a09 -01091023 -1443056a -00000000 -3c0888af -3508a220 -3c09884e -35293c40 -3c030061 -346365e0 -01091023 -14430561 -00000000 -3c08ee2b -35083d28 -3c098b26 -3529d1e7 -3c036304 -34636b41 -01091023 -14430558 -00000000 -3c08b4ad -350854be -3c0944a2 -3529c3c2 -3c03700a -346390fc -01091023 -1443054f -00000000 -3c08c4f4 -3508a100 -3c09e32f -35292978 -3c03e1c5 -34637788 -01091023 -14430546 -00000000 -3c089c7e -3508895a -3c09327b -3529164c -3c036a03 -3463730e -01091023 -1443053d -00000000 -3c0888b9 -35088036 -3c09a0c0 -35299c10 -3c03e7f8 -3463e426 -01091023 -14430534 -00000000 -3c0878b5 -35084804 -3c092de3 -3529d8b4 -3c034ad1 -34636f50 -01091023 -1443052b -00000000 -3c08e404 -3508ea90 -3c09493a -35298a98 -3c039aca -34635ff8 -01091023 -14430522 -00000000 -3c084241 -3508cf80 -3c09b86f -35292a7c -3c0389d2 -3463a504 -01091023 -14430519 -00000000 -3c080af8 -35082928 -3c0960de -35296812 -3c03aa19 -3463c116 -01091023 -14430510 -00000000 -3c08aab5 -35081132 -3c09f37e -35299454 -3c03b736 -34637cde -01091023 -14430507 -00000000 -3c08c7b8 -350874cc -3c09e63f -3529ca48 -3c03e178 -3463aa84 -01091023 -144304fe -00000000 -3c08f461 -35089868 -3c098bcb -35292368 -3c036896 -34637500 -01091023 -144304f5 -00000000 -3c082c61 -350888e8 -3c098e6f -35297f98 -3c039df2 -34630950 -01091023 -144304ec -00000000 -3c084140 -3508a430 -3c09ec8c -352959ce -3c0354b4 -34634a62 -01091023 -144304e3 -00000000 -3c083513 -35087460 -3c09438c -35293e80 -3c03f187 -346335e0 -01091023 -144304da -00000000 -3c088bc8 -35085fd0 -3c09951e -3529fe00 -3c03f6a9 -346361d0 -01091023 -144304d1 -00000000 -3c08ae31 -3508f1ac -3c09f475 -35296000 -3c03b9bc -346391ac -01091023 -144304c8 -00000000 -3c085242 -350883d0 -3c096d99 -35295d14 -3c03e4a9 -346326bc -01091023 -144304bf -00000000 -3c086449 -350835e0 -3c09af2a -3529427e -3c03b51e -3463f362 -01091023 -144304b6 -00000000 -3c083892 -3508da96 -3c0964e0 -3529c4c0 -3c03d3b2 -346315d6 -01091023 -144304ad -00000000 -3c087853 -3508ba40 -3c09f602 -35291480 -3c038251 -3463a5c0 -01091023 -144304a4 -00000000 -3c08e074 -35083f35 -3c0993b8 -35295350 -3c034cbb -3463ebe5 -01091023 -1443049b -00000000 -3c08a06a -3508f7a0 -3c0987a3 -352927e6 -3c0318c7 -3463cfba -01091023 -14430492 -00000000 -3c083427 -35085f06 -3c0905f4 -3529e400 -3c032e32 -34637b06 -01091023 -14430489 -00000000 -3c08b0f7 -3508100a -3c092ef6 -3529b86c -3c038200 -3463579e -01091023 -14430480 -00000000 -3c087b87 -35089000 -3c091820 -35293584 -3c036367 -34635a7c -01091023 -14430477 -00000000 -3c086ab0 -35082470 -3c09891b -352926ff -3c03e194 -3463fd71 -01091023 -1443046e -00000000 -3c082b68 -35081478 -3c09f4fe -352993a8 -3c033669 -346380d0 -01091023 -14430465 -00000000 -3c083bd5 -35089120 -3c0976e9 -3529cc2c -3c03c4eb -3463c4f4 -01091023 -1443045c -00000000 -3c084d0a -35081d00 -3c0944fd -3529bcc0 -3c03080c -34636040 -01091023 -14430453 -00000000 -3c08fb2c -3508bab0 -3c0946f6 -35293e58 -3c03b436 -34637c58 -01091023 -1443044a -00000000 -3c0877ab -3508dbef -3c099db5 -3529bb31 -3c03d9f6 -346320be -01091023 -14430441 -00000000 -3c0870c2 -3508c980 -3c09f071 -3529d8c7 -3c038050 -3463f0b9 -01091023 -14430438 -00000000 -3c08b13a -35082182 -3c099099 -3529d9f0 -3c0320a0 -34634792 -01091023 -1443042f -00000000 -3c08476d -350821c0 -3c092dfd -35297322 -3c03196f -3463ae9e -01091023 -14430426 -00000000 -3c081906 -3508e980 -3c09de2b -3529a7c1 -3c033adb -346341bf -01091023 -1443041d -00000000 -3c0878ac -350802fa -3c09023b -3529f9ac -3c037670 -3463094e -01091023 -14430414 -00000000 -3c087c7c -3508db40 -3c09c081 -352990dc -3c03bbfb -34634a64 -01091023 -1443040b -00000000 -3c08b5a5 -350843c7 -3c096fd3 -35292de2 -3c0345d2 -346315e5 -01091023 -14430402 -00000000 -3c08aeef -35083248 -3c09fc4c -352987f0 -3c03b2a2 -3463aa58 -01091023 -144303f9 -00000000 -3c089e6b -35088bde -3c098b4c -352953ac -3c03131f -34633832 -01091023 -144303f0 -00000000 -3c08ec13 -35080070 -3c099211 -35298900 -3c035a01 -34637770 -01091023 -144303e7 -00000000 -3c085369 -350845b7 -3c0922bd -35290eb0 -3c0330ac -34633707 -01091023 -144303de -00000000 -3c086cd6 -35087d7c -3c090681 -3529f3f1 -3c036654 -3463898b -01091023 -144303d5 -00000000 -3c08aaad -35087566 -3c0966f3 -3529d400 -3c0343b9 -3463a166 -01091023 -144303cc -00000000 -3c082a60 -3508be07 -3c09b8d2 -3529339c -3c03718e -34638a6b -01091023 -144303c3 -00000000 -3c08b867 -35082c5a -3c098229 -35295036 -3c03363d -3463dc24 -01091023 -144303ba -00000000 -3c08db10 -35085dac -3c090fd4 -35298120 -3c03cb3b -3463dc8c -01091023 -144303b1 -00000000 -3c082639 -35088420 -3c09ab43 -35292e4a -3c037af6 -346355d6 -01091023 -144303a8 -00000000 -3c081ac8 -35080bd0 -3c091678 -3529bda8 -3c03044f -34634e28 -01091023 -1443039f -00000000 -3c08f727 -3508a30e -3c09ab1f -352990f0 -3c034c08 -3463121e -01091023 -14430396 -00000000 -3c080178 -3508bb00 -3c096ca8 -3529f6d0 -3c0394cf -3463c430 -01091023 -1443038d -00000000 -3c0855d0 -3508ca5e -3c092e56 -3529c9b4 -3c03277a -346300aa -01091023 -14430384 -00000000 -3c088d99 -3508ae61 -3c09ce4a -3529ce70 -3c03bf4e -3463dff1 -01091023 -1443037b -00000000 -3c08e239 -35085b00 -3c097673 -3529d91e -3c036bc5 -346381e2 -01091023 -14430372 -00000000 -3c080ddc -35084158 -3c094573 -352900c1 -3c03c869 -34634097 -01091023 -14430369 -00000000 -3c08fa4f -35089448 -3c09dec8 -3529ed78 -3c031b86 -3463a6d0 -01091023 -14430360 -00000000 -3c08f265 -3508977c -3c093058 -3529ce5e -3c03c20c -3463c91e -01091023 -14430357 -00000000 -3c08bd4e -35082324 -3c09921c -3529d211 -3c032b31 -34635113 -01091023 -1443034e -00000000 -3c08ee98 -3508daa2 -3c0906fd -352903d4 -3c03e79b -3463d6ce -01091023 -14430345 -00000000 -3c0837e6 -3508752c -3c096bd7 -352939d8 -3c03cc0f -34633b54 -01091023 -1443033c -00000000 -3c08af0d -3508e020 -3c09951f -35299e72 -3c0319ee -346341ae -01091023 -14430333 -00000000 -3c088178 -3508e270 -3c09c206 -352917d6 -3c03bf72 -3463ca9a -01091023 -1443032a -00000000 -3c0899e8 -350836ec -24090000 -3c0399e8 -346336ec -01091023 -14430322 -00000000 -3c08f706 -3508b614 -24090000 -3c03f706 -3463b614 -01091023 -1443031a -00000000 -3c08227c -35087b80 -24090000 -3c03227c -34637b80 -01091023 -14430312 -00000000 -3c089fbf -35084b5f -24090000 -3c039fbf -34634b5f -01091023 -1443030a -00000000 -3c08258a -350829f8 -24090000 -3c03258a -346329f8 -01091023 -14430302 -00000000 -3c08db53 -350861c0 -24090000 -3c03db53 -346361c0 -01091023 -144302fa -00000000 -3c088049 -35089d50 -24090000 -3c038049 -34639d50 -01091023 -144302f2 -00000000 -3c08d2df -3508b800 -24090000 -3c03d2df -3463b800 -01091023 -144302ea -00000000 -3c080618 -35080480 -24090000 -3c030618 -34630480 -01091023 -144302e2 -00000000 -3c08dbae -3508a9be -24090000 -3c03dbae -3463a9be -01091023 -144302da -00000000 -3c086337 -35083704 -24090000 -3c036337 -34633704 -01091023 -144302d2 -00000000 -3c084d07 -35088b90 -24090000 -3c034d07 -34638b90 -01091023 -144302ca -00000000 -3c0843a9 -35082170 -24090000 -3c0343a9 -34632170 -01091023 -144302c2 -00000000 -3c08aabc -3508e49c -24090000 -3c03aabc -3463e49c -01091023 -144302ba -00000000 -3c087282 -3508c1cc -24090000 -3c037282 -3463c1cc -01091023 -144302b2 -00000000 -3c089e7f -35081b26 -24090000 -3c039e7f -34631b26 -01091023 -144302aa -00000000 -3c08d30c -350875ac -24090000 -3c03d30c -346375ac -01091023 -144302a2 -00000000 -3c08c567 -350805ac -24090000 -3c03c567 -346305ac -01091023 -1443029a -00000000 -3c081603 -3508be38 -24090000 -3c031603 -3463be38 -01091023 -14430292 -00000000 -3c085ceb -3508a56b -24090000 -3c035ceb -3463a56b -01091023 -1443028a -00000000 -3c08dc21 -35087454 -24090000 -3c03dc21 -34637454 -01091023 -14430282 -00000000 -3c087ce9 -3508a074 -24090000 -3c037ce9 -3463a074 -01091023 -1443027a -00000000 -3c0842ed -35089a50 -24090000 -3c0342ed -34639a50 -01091023 -14430272 -00000000 -3c083e5f -35085070 -24090000 -3c033e5f -34635070 -01091023 -1443026a -00000000 -3c08fd05 -35081ed8 -24090000 -3c03fd05 -34631ed8 -01091023 -14430262 -00000000 -3c0893a4 -35086950 -24090000 -3c0393a4 -34636950 -01091023 -1443025a -00000000 -3c08bb52 -3508cb2a -24090000 -3c03bb52 -3463cb2a -01091023 -14430252 -00000000 -3c08845d -35089f04 -24090000 -3c03845d -34639f04 -01091023 -1443024a -00000000 -3c08e6f6 -35088ef4 -24090000 -3c03e6f6 -34638ef4 -01091023 -14430242 -00000000 -3c08e0ad -3508123c -24090000 -3c03e0ad -3463123c -01091023 -1443023a -00000000 -3c08670c -35080b90 -24090000 -3c03670c -34630b90 -01091023 -14430232 -00000000 -3c0868de -35082150 -24090000 -3c0368de -34632150 -01091023 -1443022a -00000000 -3c08eda0 -35080485 -24090000 -3c03eda0 -34630485 -01091023 -14430222 -00000000 -3c080ed8 -3508b604 -24090000 -3c030ed8 -3463b604 -01091023 -1443021a -00000000 -3c088433 -35084a18 -24090000 -3c038433 -34634a18 -01091023 -14430212 -00000000 -3c084b34 -35089a7c -24090000 -3c034b34 -34639a7c -01091023 -1443020a -00000000 -3c087919 -35080680 -24090000 -3c037919 -34630680 -01091023 -14430202 -00000000 -3c08ddf9 -3508e7f4 -24090000 -3c03ddf9 -3463e7f4 -01091023 -144301fa -00000000 -3c08e573 -3508dcfc -24090000 -3c03e573 -3463dcfc -01091023 -144301f2 -00000000 -3c08d6d1 -350849e8 -24090000 -3c03d6d1 -346349e8 -01091023 -144301ea -00000000 -3c083346 -3508f600 -24090000 -3c033346 -3463f600 -01091023 -144301e2 -00000000 -3c088f63 -3508d87a -24090000 -3c038f63 -3463d87a -01091023 -144301da -00000000 -3c083ef8 -3508af4a -24090000 -3c033ef8 -3463af4a -01091023 -144301d2 -00000000 -3c08ddc9 -3508fd94 -24090000 -3c03ddc9 -3463fd94 -01091023 -144301ca -00000000 -3c085f24 -3508f000 -24090000 -3c035f24 -3463f000 -01091023 -144301c2 -00000000 -3c08f1da -3508a803 -24090000 -3c03f1da -3463a803 -01091023 -144301ba -00000000 -3c0811f0 -3508cdac -24090000 -3c0311f0 -3463cdac -01091023 -144301b2 -00000000 -3c083d56 -3508de10 -24090000 -3c033d56 -3463de10 -01091023 -144301aa -00000000 -3c08832e -35087720 -24090000 -3c03832e -34637720 -01091023 -144301a2 -00000000 -3c086f6a -35083b6b -24090000 -3c036f6a -34633b6b -01091023 -1443019a -00000000 -24080000 -3c093f7b -35299fa8 -3c03c084 -34636058 -01091023 -14430192 -00000000 -24080000 -3c09f4e8 -352957f7 -3c030b17 -3463a809 -01091023 -1443018a -00000000 -24080000 -3c091d3e -3529874c -3c03e2c1 -346378b4 -01091023 -14430182 -00000000 -24080000 -3c096060 -3529a4d0 -3c039f9f -34635b30 -01091023 -1443017a -00000000 -24080000 -3c09ad02 -35296220 -3c0352fd -34639de0 -01091023 -14430172 -00000000 -24080000 -3c09421f -352985b0 -3c03bde0 -34637a50 -01091023 -1443016a -00000000 -24080000 -3c09718b -3529b2c8 -3c038e74 -34634d38 -01091023 -14430162 -00000000 -24080000 -3c095b84 -3529ec9f -3c03a47b -34631361 -01091023 -1443015a -00000000 -24080000 -3c09f8b5 -3529462f -3c03074a -3463b9d1 -01091023 -14430152 -00000000 -24080000 -3c098b91 -3529706c -3c03746e -34638f94 -01091023 -1443014a -00000000 -24080000 -3c09445c -35296544 -3c03bba3 -34639abc -01091023 -14430142 -00000000 -24080000 -3c091d34 -35294e02 -3c03e2cb -3463b1fe -01091023 -1443013a -00000000 -24080000 -3c094cc3 -35293600 -3c03b33c -3463ca00 -01091023 -14430132 -00000000 -24080000 -3c090517 -35294cf8 -3c03fae8 -3463b308 -01091023 -1443012a -00000000 -24080000 -3c0968c6 -3529ea90 -3c039739 -34631570 -01091023 -14430122 -00000000 -24080000 -3c09ad42 -352937d0 -3c0352bd -3463c830 -01091023 -1443011a -00000000 -24080000 -3c095e60 -3529f5d4 -3c03a19f -34630a2c -01091023 -14430112 -00000000 -24080000 -3c0902ab -3529610e -3c03fd54 -34639ef2 -01091023 -1443010a -00000000 -24080000 -3c0995d9 -35292f0a -3c036a26 -3463d0f6 -01091023 -14430102 -00000000 -24080000 -3c0960d5 -35291e10 -3c039f2a -3463e1f0 -01091023 -144300fa -00000000 -24080000 -3c09dae9 -3529ff00 -3c032516 -34630100 -01091023 -144300f2 -00000000 -24080000 -3c0987cd -352934c0 -3c037832 -3463cb40 -01091023 -144300ea -00000000 -24080000 -3c0962df -3529d480 -3c039d20 -34632b80 -01091023 -144300e2 -00000000 -24080000 -3c097970 -3529a300 -3c03868f -34635d00 -01091023 -144300da -00000000 -24080000 -3c09c41a -3529c2fa -3c033be5 -34633d06 -01091023 -144300d2 -00000000 -24080000 -3c097594 -35295b52 -3c038a6b -3463a4ae -01091023 -144300ca -00000000 -24080000 -3c09fa22 -35294c10 -3c0305dd -3463b3f0 -01091023 -144300c2 -00000000 -24080000 -3c0914b8 -3529e1e4 -3c03eb47 -34631e1c -01091023 -144300ba -00000000 -24080000 -3c09e6f1 -35292280 -3c03190e -3463dd80 -01091023 -144300b2 -00000000 -24080000 -3c09b8cc -3529bfa1 -3c034733 -3463405f -01091023 -144300aa -00000000 -24080000 -3c096734 -3529c0a8 -3c0398cb -34633f58 -01091023 -144300a2 -00000000 -24080000 -3c09cd2c -35297e01 -3c0332d3 -346381ff -01091023 -1443009a -00000000 -24080000 -3c09da89 -35291a33 -3c032576 -3463e5cd -01091023 -14430092 -00000000 -24080000 -3c09e06b -3529c618 -3c031f94 -346339e8 -01091023 -1443008a -00000000 -24080000 -3c09aeb2 -35292000 -3c03514d -3463e000 -01091023 -14430082 -00000000 -24080000 -3c0902fa -3529d700 -3c03fd05 -34632900 -01091023 -1443007a -00000000 -24080000 -3c099755 -35292b80 -3c0368aa -3463d480 -01091023 -14430072 -00000000 -24080000 -3c09490e -35295b20 -3c03b6f1 -3463a4e0 -01091023 -1443006a -00000000 -24080000 -3c093710 -35295fe8 -3c03c8ef -3463a018 -01091023 -14430062 -00000000 -24080000 -3c09ae9d -35294fa0 -3c035162 -3463b060 -01091023 -1443005a -00000000 -24080000 -3c09918f -3529373c -3c036e70 -3463c8c4 -01091023 -14430052 -00000000 -24080000 -3c090191 -3529739e -3c03fe6e -34638c62 -01091023 -1443004a -00000000 -24080000 -3c09a6af -352926a4 -3c035950 -3463d95c -01091023 -14430042 -00000000 -24080000 -3c09e51c -35290be4 -3c031ae3 -3463f41c -01091023 -1443003a -00000000 -24080000 -3c09219c -35297300 -3c03de63 -34638d00 -01091023 -14430032 -00000000 -24080000 -3c0946be -3529064a -3c03b941 -3463f9b6 -01091023 -1443002a -00000000 -24080000 -3c09ae77 -3529d814 -3c035188 -346327ec -01091023 -14430022 -00000000 -24080000 -3c098e25 -3529e370 -3c0371da -34631c90 -01091023 -1443001a -00000000 -24080000 -3c091b42 -35295f40 -3c03e4bd -3463a0c0 -01091023 -14430012 -00000000 -24080000 -3c09b407 -35293a78 -3c034bf8 -3463c588 -01091023 -1443000a -00000000 -24080000 -24090000 -24030000 -01091023 -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -24120000 -001fb821 -3c020000 -3c030000 -0ff18e17 -00000000 -03e02821 -3c028c3e -34421efa -0ff18e1d -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff18e0f -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03eb2b -3463d57c -0017f821 -3c158c3e -36b51efa -3c16eb2b -36d6d57c -1455101b -00000000 -24c60018 -14761018 -00000000 -14c51016 -00000000 -001fb821 -3c020000 -3c030000 -0ff18e39 -00000000 -03e02821 -3c02fbc1 -3442f5d0 -0ff18e3f -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff18e31 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03b91b -3463c0b0 -0017f821 -3c15fbc1 -36b5f5d0 -3c16b91b -36d6c0b0 -14550ff9 -00000000 -24c60018 -14760ff6 -00000000 -14c50ff4 -00000000 -001fb821 -3c020000 -3c030000 -0ff18e5b -00000000 -03e02821 -3c02c106 -34422356 -0ff18e61 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff18e53 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03f8d6 -34630c60 -0017f821 -3c15c106 -36b52356 -3c16f8d6 -36d60c60 -14550fd7 -00000000 -24c60018 -14760fd4 -00000000 -14c50fd2 -00000000 -001fb821 -3c020000 -3c030000 -0ff18e7d -00000000 -03e02821 -3c020b2d -3442c8e4 -0ff18e83 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff18e75 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03ff27 -34636d2f -0017f821 -3c150b2d -36b5c8e4 -3c16ff27 -36d66d2f -14550fb5 -00000000 -24c60018 -14760fb2 -00000000 -14c50fb0 -00000000 -001fb821 -3c020000 -3c030000 -0ff18e9f -00000000 -03e02821 -3c02312f -3442abd9 -0ff18ea5 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff18e97 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c039703 -346387ac -0017f821 -3c15312f -36b5abd9 -3c169703 -36d687ac -14550f93 -00000000 -24c60018 -14760f90 -00000000 -14c50f8e -00000000 -001fb821 -3c020000 -3c030000 -0ff18ec1 -00000000 -03e02821 -3c024636 -34420a68 -0ff18ec7 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff18eb9 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03f903 -3463f5cd -0017f821 -3c154636 -36b50a68 -3c16f903 -36d6f5cd -14550f71 -00000000 -24c60018 -14760f6e -00000000 -14c50f6c -00000000 -001fb821 -3c020000 -3c030000 -0ff18ee3 -00000000 -03e02821 -3c0241cc -3442660a -0ff18ee9 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff18edb -00000000 -10000005 -00000000 -00000000 -03e03021 -3c035229 -34635cdc -0017f821 -3c1541cc -36b5660a -3c165229 -36d65cdc -14550f4f -00000000 -24c60018 -14760f4c -00000000 -14c50f4a -00000000 -001fb821 -3c020000 -3c030000 -0ff18f05 -00000000 -03e02821 -3c0248fa -34423a04 -0ff18f0b -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff18efd -00000000 -10000005 -00000000 -00000000 -03e03021 -3c036963 -34636126 -0017f821 -3c1548fa -36b53a04 -3c166963 -36d66126 -14550f2d -00000000 -24c60018 -14760f2a -00000000 -14c50f28 -00000000 -001fb821 -3c020000 -3c030000 -0ff18f27 -00000000 -03e02821 -3c02bcd7 -3442cfec -0ff18f2d -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff18f1f -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03779a -346395ec -0017f821 -3c15bcd7 -36b5cfec -3c16779a -36d695ec -14550f0b -00000000 -24c60018 -14760f08 -00000000 -14c50f06 -00000000 -001fb821 -3c020000 -3c030000 -0ff18f49 -00000000 -03e02821 -3c025fc9 -34426388 -0ff18f4f -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff18f41 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03c43c -34634580 -0017f821 -3c155fc9 -36b56388 -3c16c43c -36d64580 -14550ee9 -00000000 -24c60018 -14760ee6 -00000000 -14c50ee4 -00000000 -001fb821 -3c020000 -3c030000 -0ff18f6b -00000000 -03e02821 -3c022e6a -3442cb2a -0ff18f71 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff18f63 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c033ff9 -346330e4 -0017f821 -3c152e6a -36b5cb2a -3c163ff9 -36d630e4 -14550ec7 -00000000 -24c60018 -14760ec4 -00000000 -14c50ec2 -00000000 -001fb821 -3c020000 -3c030000 -0ff18f8d -00000000 -03e02821 -3c025701 -344265c0 -0ff18f93 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff18f85 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03984b -3463d878 -0017f821 -3c155701 -36b565c0 -3c16984b -36d6d878 -14550ea5 -00000000 -24c60018 -14760ea2 -00000000 -14c50ea0 -00000000 -001fb821 -3c020000 -3c030000 -0ff18faf -00000000 -03e02821 -3c02881d -34425800 -0ff18fb5 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff18fa7 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03034e -34636000 -0017f821 -3c15881d -36b55800 -3c16034e -36d66000 -14550e83 -00000000 -24c60018 -14760e80 -00000000 -14c50e7e -00000000 -001fb821 -3c020000 -3c030000 -0ff18fd1 -00000000 -03e02821 -3c028a5b -34423be0 -0ff18fd7 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff18fc9 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03b94b -34636376 -0017f821 -3c158a5b -36b53be0 -3c16b94b -36d66376 -14550e61 -00000000 -24c60018 -14760e5e -00000000 -14c50e5c -00000000 -001fb821 -3c020000 -3c030000 -0ff18ff3 -00000000 -03e02821 -3c028b75 -3442ce52 -0ff18ff9 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff18feb -00000000 -10000005 -00000000 -00000000 -03e03021 -3c0313b7 -3463a780 -0017f821 -3c158b75 -36b5ce52 -3c1613b7 -36d6a780 -14550e3f -00000000 -24c60018 -14760e3c -00000000 -14c50e3a -00000000 -001fb821 -3c020000 -3c030000 -0ff19015 -00000000 -03e02821 -3c02fcdb -34421218 -0ff1901b -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff1900d -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03ff48 -34633538 -0017f821 -3c15fcdb -36b51218 -3c16ff48 -36d63538 -14550e1d -00000000 -24c60018 -14760e1a -00000000 -14c50e18 -00000000 -001fb821 -3c020000 -3c030000 -0ff19037 -00000000 -03e02821 -3c022e45 -34420deb -0ff1903d -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff1902f -00000000 -10000005 -00000000 -00000000 -03e03021 -3c031060 -34639f0c -0017f821 -3c152e45 -36b50deb -3c161060 -36d69f0c -14550dfb -00000000 -24c60018 -14760df8 -00000000 -14c50df6 -00000000 -001fb821 -3c020000 -3c030000 -0ff19059 -00000000 -03e02821 -3c023e80 -3442cb3e -0ff1905f -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19051 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03c960 -3463e400 -0017f821 -3c153e80 -36b5cb3e -3c16c960 -36d6e400 -14550dd9 -00000000 -24c60018 -14760dd6 -00000000 -14c50dd4 -00000000 -001fb821 -3c020000 -3c030000 -0ff1907b -00000000 -03e02821 -3c0244af -34429ce0 -0ff19081 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19073 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03800d -34633820 -0017f821 -3c1544af -36b59ce0 -3c16800d -36d63820 -14550db7 -00000000 -24c60018 -14760db4 -00000000 -14c50db2 -00000000 -001fb821 -3c020000 -3c030000 -0ff1909d -00000000 -03e02821 -3c0208ee -3442c534 -0ff190a3 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19095 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03b773 -34635884 -0017f821 -3c1508ee -36b5c534 -3c16b773 -36d65884 -14550d95 -00000000 -24c60018 -14760d92 -00000000 -14c50d90 -00000000 -001fb821 -3c020000 -3c030000 -0ff190bf -00000000 -03e02821 -3c02bc5a -344266a4 -0ff190c5 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff190b7 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03df14 -34634ab4 -0017f821 -3c15bc5a -36b566a4 -3c16df14 -36d64ab4 -14550d73 -00000000 -24c60018 -14760d70 -00000000 -14c50d6e -00000000 -001fb821 -3c020000 -3c030000 -0ff190e1 -00000000 -03e02821 -3c022aeb -34423f3c -0ff190e7 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff190d9 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03edcc -34639ce0 -0017f821 -3c152aeb -36b53f3c -3c16edcc -36d69ce0 -14550d51 -00000000 -24c60018 -14760d4e -00000000 -14c50d4c -00000000 -001fb821 -3c020000 -3c030000 -0ff19103 -00000000 -03e02821 -3c02cd78 -34424df5 -0ff19109 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff190fb -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03aff9 -34632f84 -0017f821 -3c15cd78 -36b54df5 -3c16aff9 -36d62f84 -14550d2f -00000000 -24c60018 -14760d2c -00000000 -14c50d2a -00000000 -001fb821 -3c020000 -3c030000 -0ff19125 -00000000 -03e02821 -3c02a34d -3442260a -0ff1912b -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff1911d -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03b77c -346387f4 -0017f821 -3c15a34d -36b5260a -3c16b77c -36d687f4 -14550d0d -00000000 -24c60018 -14760d0a -00000000 -14c50d08 -00000000 -001fb821 -3c020000 -3c030000 -0ff19147 -00000000 -03e02821 -3c02a0d8 -34426880 -0ff1914d -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff1913f -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03afeb -3463a4e4 -0017f821 -3c15a0d8 -36b56880 -3c16afeb -36d6a4e4 -14550ceb -00000000 -24c60018 -14760ce8 -00000000 -14c50ce6 -00000000 -001fb821 -3c020000 -3c030000 -0ff19169 -00000000 -03e02821 -3c02f7b8 -3442f37b -0ff1916f -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19161 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03911d -3463e040 -0017f821 -3c15f7b8 -36b5f37b -3c16911d -36d6e040 -14550cc9 -00000000 -24c60018 -14760cc6 -00000000 -14c50cc4 -00000000 -001fb821 -3c020000 -3c030000 -0ff1918b -00000000 -03e02821 -3c022e33 -3442290a -0ff19191 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19183 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03d934 -34636c82 -0017f821 -3c152e33 -36b5290a -3c16d934 -36d66c82 -14550ca7 -00000000 -24c60018 -14760ca4 -00000000 -14c50ca2 -00000000 -001fb821 -3c020000 -3c030000 -0ff191ad -00000000 -03e02821 -3c02864e -344294e4 -0ff191b3 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff191a5 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03a20d -346382e4 -0017f821 -3c15864e -36b594e4 -3c16a20d -36d682e4 -14550c85 -00000000 -24c60018 -14760c82 -00000000 -14c50c80 -00000000 -001fb821 -3c020000 -3c030000 -0ff191cf -00000000 -03e02821 -3c026367 -34427728 -0ff191d5 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff191c7 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c033d83 -3463ac49 -0017f821 -3c156367 -36b57728 -3c163d83 -36d6ac49 -14550c63 -00000000 -24c60018 -14760c60 -00000000 -14c50c5e -00000000 -001fb821 -3c020000 -3c030000 -0ff191f1 -00000000 -03e02821 -3c02dc9e -344295bc -0ff191f7 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff191e9 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c038089 -34630af0 -0017f821 -3c15dc9e -36b595bc -3c168089 -36d60af0 -14550c41 -00000000 -24c60018 -14760c3e -00000000 -14c50c3c -00000000 -001fb821 -3c020000 -3c030000 -0ff19213 -00000000 -03e02821 -3c026298 -34427b70 -0ff19219 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff1920b -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03b808 -346355ae -0017f821 -3c156298 -36b57b70 -3c16b808 -36d655ae -14550c1f -00000000 -24c60018 -14760c1c -00000000 -14c50c1a -00000000 -001fb821 -3c020000 -3c030000 -0ff19235 -00000000 -03e02821 -3c02b5b7 -34420534 -0ff1923b -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff1922d -00000000 -10000005 -00000000 -00000000 -03e03021 -3c036507 -3463ff98 -0017f821 -3c15b5b7 -36b50534 -3c166507 -36d6ff98 -14550bfd -00000000 -24c60018 -14760bfa -00000000 -14c50bf8 -00000000 -001fb821 -3c020000 -3c030000 -0ff19257 -00000000 -03e02821 -3c02ac72 -3442d980 -0ff1925d -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff1924f -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03bf98 -34639ac0 -0017f821 -3c15ac72 -36b5d980 -3c16bf98 -36d69ac0 -14550bdb -00000000 -24c60018 -14760bd8 -00000000 -14c50bd6 -00000000 -001fb821 -3c020000 -3c030000 -0ff19279 -00000000 -03e02821 -3c02f330 -3442e230 -0ff1927f -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19271 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c033e89 -346346c8 -0017f821 -3c15f330 -36b5e230 -3c163e89 -36d646c8 -14550bb9 -00000000 -24c60018 -14760bb6 -00000000 -14c50bb4 -00000000 -001fb821 -3c020000 -3c030000 -0ff1929b -00000000 -03e02821 -3c02a6d1 -344266cc -0ff192a1 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19293 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03e182 -34631d9f -0017f821 -3c15a6d1 -36b566cc -3c16e182 -36d61d9f -14550b97 -00000000 -24c60018 -14760b94 -00000000 -14c50b92 -00000000 -001fb821 -3c020000 -3c030000 -0ff192bd -00000000 -03e02821 -3c02f2a1 -3442547c -0ff192c3 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff192b5 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c032750 -34637968 -0017f821 -3c15f2a1 -36b5547c -3c162750 -36d67968 -14550b75 -00000000 -24c60018 -14760b72 -00000000 -14c50b70 -00000000 -001fb821 -3c020000 -3c030000 -0ff192df -00000000 -03e02821 -3c0222da -34429500 -0ff192e5 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff192d7 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c033567 -3463c320 -0017f821 -3c1522da -36b59500 -3c163567 -36d6c320 -14550b53 -00000000 -24c60018 -14760b50 -00000000 -14c50b4e -00000000 -001fb821 -3c020000 -3c030000 -0ff19301 -00000000 -03e02821 -3c024568 -344243ac -0ff19307 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff192f9 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c039078 -3463aa46 -0017f821 -3c154568 -36b543ac -3c169078 -36d6aa46 -14550b31 -00000000 -24c60018 -14760b2e -00000000 -14c50b2c -00000000 -001fb821 -3c020000 -3c030000 -0ff19323 -00000000 -03e02821 -3c02f637 -34424800 -0ff19329 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff1931b -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03fec9 -3463001c -0017f821 -3c15f637 -36b54800 -3c16fec9 -36d6001c -14550b0f -00000000 -24c60018 -14760b0c -00000000 -14c50b0a -00000000 -001fb821 -3c020000 -3c030000 -0ff19345 -00000000 -03e02821 -3c027772 -3442970e -0ff1934b -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff1933d -00000000 -10000005 -00000000 -00000000 -03e03021 -3c035c93 -3463caaf -0017f821 -3c157772 -36b5970e -3c165c93 -36d6caaf -14550aed -00000000 -24c60018 -14760aea -00000000 -14c50ae8 -00000000 -001fb821 -3c020000 -3c030000 -0ff19367 -00000000 -03e02821 -3c02d0de -3442ecae -0ff1936d -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff1935f -00000000 -10000005 -00000000 -00000000 -03e03021 -3c039242 -3463f92c -0017f821 -3c15d0de -36b5ecae -3c169242 -36d6f92c -14550acb -00000000 -24c60018 -14760ac8 -00000000 -14c50ac6 -00000000 -001fb821 -3c020000 -3c030000 -0ff19389 -00000000 -03e02821 -3c02f706 -3442e3d4 -0ff1938f -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19381 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03d800 -346365c8 -0017f821 -3c15f706 -36b5e3d4 -3c16d800 -36d665c8 -14550aa9 -00000000 -24c60018 -14760aa6 -00000000 -14c50aa4 -00000000 -001fb821 -3c020000 -3c030000 -0ff193ab -00000000 -03e02821 -3c0288ed -34421d00 -0ff193b1 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff193a3 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c030113 -34632628 -0017f821 -3c1588ed -36b51d00 -3c160113 -36d62628 -14550a87 -00000000 -24c60018 -14760a84 -00000000 -14c50a82 -00000000 -001fb821 -3c020000 -3c030000 -0ff193cd -00000000 -03e02821 -3c02f1d6 -3442dafe -0ff193d3 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff193c5 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03f8ed -3463f824 -0017f821 -3c15f1d6 -36b5dafe -3c16f8ed -36d6f824 -14550a65 -00000000 -24c60018 -14760a62 -00000000 -14c50a60 -00000000 -001fb821 -3c020000 -3c030000 -0ff193ef -00000000 -03e02821 -3c026539 -34424174 -0ff193f5 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff193e7 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03cc26 -34634320 -0017f821 -3c156539 -36b54174 -3c16cc26 -36d64320 -14550a43 -00000000 -24c60018 -14760a40 -00000000 -14c50a3e -00000000 -001fb821 -3c020000 -3c030000 -0ff19411 -00000000 -03e02821 -3c027f95 -3442e490 -0ff19417 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19409 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03b642 -346362d0 -0017f821 -3c157f95 -36b5e490 -3c16b642 -36d662d0 -14550a21 -00000000 -24c60018 -14760a1e -00000000 -14c50a1c -00000000 -001fb821 -3c020000 -3c030000 -0ff19433 -00000000 -03e02821 -3c02e67c -34428576 -0ff19439 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff1942b -00000000 -10000005 -00000000 -00000000 -03e03021 -3c0314fc -3463505c -0017f821 -3c15e67c -36b58576 -3c1614fc -36d6505c -145509ff -00000000 -24c60018 -147609fc -00000000 -14c509fa -00000000 -001fb821 -3c020000 -3c030000 -0ff19455 -00000000 -03e02821 -3c0254be -34427440 -0ff1945b -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff1944d -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03f66c -3463762e -0017f821 -3c1554be -36b57440 -3c16f66c -36d6762e -145509dd -00000000 -24c60018 -147609da -00000000 -14c509d8 -00000000 -001fb821 -3c020000 -3c030000 -0ff19477 -00000000 -03e02821 -3c02d7a7 -3442e4e6 -0ff1947d -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff1946f -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03cab5 -3463f8fb -0017f821 -3c15d7a7 -36b5e4e6 -3c16cab5 -36d6f8fb -145509bb -00000000 -24c60018 -147609b8 -00000000 -14c509b6 -00000000 -001fb821 -3c020000 -3c030000 -0ff19499 -00000000 -03e02821 -3c02626c -34427a3b -0ff1949f -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19491 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03c227 -34639a00 -0017f821 -3c15626c -36b57a3b -3c16c227 -36d69a00 -14550999 -00000000 -24c60018 -14760996 -00000000 -14c50994 -00000000 -001fb821 -3c020000 -3c030000 -0ff194bb -00000000 -03e02821 -3c02d058 -3442ca5d -0ff194c1 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff194b3 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c038703 -34633d19 -0017f821 -3c15d058 -36b5ca5d -3c168703 -36d63d19 -14550977 -00000000 -24c60018 -14760974 -00000000 -14c50972 -00000000 -001fb821 -3c020000 -3c030000 -0ff194dd -00000000 -03e02821 -3c024883 -3442255a -0ff194e3 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff194d5 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c035272 -346331d0 -0017f821 -3c154883 -36b5255a -3c165272 -36d631d0 -14550955 -00000000 -24c60018 -14760952 -00000000 -14c50950 -00000000 -001fb821 -3c020000 -3c030000 -0ff194ff -00000000 -03e02821 -3c02482d -34424ba0 -0ff19505 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff194f7 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03166f -3463e362 -0017f821 -3c15482d -36b54ba0 -3c16166f -36d6e362 -14550933 -00000000 -24c60018 -14760930 -00000000 -14c5092e -00000000 -001fb821 -3c020000 -3c030000 -0ff19521 -00000000 -03e02821 -3c02aa8a -3442f5cc -0ff19527 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19519 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c0312fd -3463c654 -0017f821 -3c15aa8a -36b5f5cc -3c1612fd -36d6c654 -14550911 -00000000 -24c60018 -1476090e -00000000 -14c5090c -00000000 -001fb821 -3c020000 -3c030000 -0ff19543 -00000000 -03e02821 -3c0260c6 -3442b2c4 -0ff19549 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff1953b -00000000 -10000005 -00000000 -00000000 -03e03021 -3c036d83 -3463e80a -0017f821 -3c1560c6 -36b5b2c4 -3c166d83 -36d6e80a -145508ef -00000000 -24c60018 -147608ec -00000000 -14c508ea -00000000 -001fb821 -3c020000 -3c030000 -0ff19565 -00000000 -03e02821 -3c028647 -34429cb8 -0ff1956b -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff1955d -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03b78f -3463b7a2 -0017f821 -3c158647 -36b59cb8 -3c16b78f -36d6b7a2 -145508cd -00000000 -24c60018 -147608ca -00000000 -14c508c8 -00000000 -001fb821 -3c020000 -3c030000 -0ff19587 -00000000 -03e02821 -3c02ab6b -3442767c -0ff1958d -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff1957f -00000000 -10000005 -00000000 -00000000 -03e03021 -3c033de3 -34637136 -0017f821 -3c15ab6b -36b5767c -3c163de3 -36d67136 -145508ab -00000000 -24c60018 -147608a8 -00000000 -14c508a6 -00000000 -001fb821 -3c020000 -3c030000 -0ff195a9 -00000000 -03e02821 -3c024f2c -34426700 -0ff195af -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff195a1 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c035c6e -34631608 -0017f821 -3c154f2c -36b56700 -3c165c6e -36d61608 -14550889 -00000000 -24c60018 -14760886 -00000000 -14c50884 -00000000 -001fb821 -3c020000 -3c030000 -0ff195cb -00000000 -03e02821 -3c028372 -344221e0 -0ff195d1 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff195c3 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03f67a -34631882 -0017f821 -3c158372 -36b521e0 -3c16f67a -36d61882 -14550867 -00000000 -24c60018 -14760864 -00000000 -14c50862 -00000000 -001fb821 -3c020000 -3c030000 -0ff195ed -00000000 -03e02821 -3c02e860 -34429af3 -0ff195f3 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff195e5 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03e8c6 -3463d23c -0017f821 -3c15e860 -36b59af3 -3c16e8c6 -36d6d23c -14550845 -00000000 -24c60018 -14760842 -00000000 -14c50840 -00000000 -001fb821 -3c020000 -3c030000 -0ff1960f -00000000 -03e02821 -3c02397d -3442f8e2 -0ff19615 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19607 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03dad4 -3463d9c8 -0017f821 -3c15397d -36b5f8e2 -3c16dad4 -36d6d9c8 -14550823 -00000000 -24c60018 -14760820 -00000000 -14c5081e -00000000 -001fb821 -3c020000 -3c030000 -0ff19631 -00000000 -03e02821 -3c0250a3 -344279d0 -0ff19637 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19629 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03cebe -3463c140 -0017f821 -3c1550a3 -36b579d0 -3c16cebe -36d6c140 -14550801 -00000000 -24c60018 -147607fe -00000000 -14c507fc -00000000 -001fb821 -3c020000 -3c030000 -0ff19653 -00000000 -03e02821 -3c023af9 -3442c4d7 -0ff19659 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff1964b -00000000 -10000005 -00000000 -00000000 -03e03021 -3c039d77 -34630cfe -0017f821 -3c153af9 -36b5c4d7 -3c169d77 -36d60cfe -145507df -00000000 -24c60018 -147607dc -00000000 -14c507da -00000000 -001fb821 -3c020000 -3c030000 -0ff19675 -00000000 -03e02821 -3c02e081 -34424d80 -0ff1967b -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff1966d -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03535d -346393c0 -0017f821 -3c15e081 -36b54d80 -3c16535d -36d693c0 -145507bd -00000000 -24c60018 -147607ba -00000000 -14c507b8 -00000000 -001fb821 -3c020000 -3c030000 -0ff19697 -00000000 -03e02821 -3c029886 -3442e010 -0ff1969d -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff1968f -00000000 -10000005 -00000000 -00000000 -03e03021 -3c033001 -346335f0 -0017f821 -3c159886 -36b5e010 -3c163001 -36d635f0 -1455079b -00000000 -24c60018 -14760798 -00000000 -14c50796 -00000000 -001fb821 -3c020000 -3c030000 -0ff196b9 -00000000 -03e02821 -3c0270f4 -3442bbd4 -0ff196bf -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff196b1 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c030afa -34636080 -0017f821 -3c1570f4 -36b5bbd4 -3c160afa -36d66080 -14550779 -00000000 -24c60018 -14760776 -00000000 -14c50774 -00000000 -001fb821 -3c020000 -3c030000 -0ff196db -00000000 -03e02821 -3c02957d -34423bd2 -0ff196e1 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff196d3 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c035726 -3463030a -0017f821 -3c15957d -36b53bd2 -3c165726 -36d6030a -14550757 -00000000 -24c60018 -14760754 -00000000 -14c50752 -00000000 -001fb821 -3c020000 -3c030000 -0ff196fd -00000000 -03e02821 -3c02ff44 -34421412 -0ff19703 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff196f5 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c039352 -34630ef6 -0017f821 -3c15ff44 -36b51412 -3c169352 -36d60ef6 -14550735 -00000000 -24c60018 -14760732 -00000000 -14c50730 -00000000 -001fb821 -3c020000 -3c030000 -0ff1971f -00000000 -03e02821 -3c02a3ad -34421eca -0ff19725 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19717 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c030f86 -3463f200 -0017f821 -3c15a3ad -36b51eca -3c160f86 -36d6f200 -14550713 -00000000 -24c60018 -14760710 -00000000 -14c5070e -00000000 -001fb821 -3c020000 -3c030000 -0ff19741 -00000000 -03e02821 -3c02e6bd -344289c0 -0ff19747 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19739 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c0301dc -34630560 -0017f821 -3c15e6bd -36b589c0 -3c1601dc -36d60560 -145506f1 -00000000 -24c60018 -147606ee -00000000 -14c506ec -00000000 -001fb821 -3c020000 -3c030000 -0ff19763 -00000000 -03e02821 -3c02f5e4 -3442174e -0ff19769 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff1975b -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03befb -3463f528 -0017f821 -3c15f5e4 -36b5174e -3c16befb -36d6f528 -145506cf -00000000 -24c60018 -147606cc -00000000 -14c506ca -00000000 -001fb821 -3c020000 -3c030000 -0ff19785 -00000000 -03e02821 -3c020e2e -344204b8 -0ff1978b -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff1977d -00000000 -10000005 -00000000 -00000000 -03e03021 -3c035e3a -3463d5e9 -0017f821 -3c150e2e -36b504b8 -3c165e3a -36d6d5e9 -145506ad -00000000 -24c60018 -147606aa -00000000 -14c506a8 -00000000 -001fb821 -3c020000 -3c030000 -0ff197a7 -00000000 -03e02821 -3c02f013 -34422abc -0ff197ad -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff1979f -00000000 -10000005 -00000000 -00000000 -03e03021 -3c036a99 -3463fa90 -0017f821 -3c15f013 -36b52abc -3c166a99 -36d6fa90 -1455068b -00000000 -24c60018 -14760688 -00000000 -14c50686 -00000000 -001fb821 -3c020000 -3c030000 -0ff197c9 -00000000 -03e02821 -3c02d29b -34426d80 -0ff197cf -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff197c1 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c035fde -3463970c -0017f821 -3c15d29b -36b56d80 -3c165fde -36d6970c -14550669 -00000000 -24c60018 -14760666 -00000000 -14c50664 -00000000 -001fb821 -3c020000 -3c030000 -0ff197eb -00000000 -03e02821 -3c02b35f -3442c4b0 -0ff197f1 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff197e3 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c030b66 -34635f50 -0017f821 -3c15b35f -36b5c4b0 -3c160b66 -36d65f50 -14550647 -00000000 -24c60018 -14760644 -00000000 -14c50642 -00000000 -001fb821 -3c020000 -3c030000 -0ff1980d -00000000 -03e02821 -3c028f73 -3442c708 -0ff19813 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19805 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c036031 -34635db8 -0017f821 -3c158f73 -36b5c708 -3c166031 -36d65db8 -14550625 -00000000 -24c60018 -14760622 -00000000 -14c50620 -00000000 -001fb821 -3c020000 -3c030000 -0ff1982f -00000000 -03e02821 -3c02148c -34421328 -0ff19835 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19827 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03b37f -34632bf5 -0017f821 -3c15148c -36b51328 -3c16b37f -36d62bf5 -14550603 -00000000 -24c60018 -14760600 -00000000 -14c505fe -00000000 -001fb821 -3c020000 -3c030000 -0ff19851 -00000000 -03e02821 -3c027731 -3442562a -0ff19857 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19849 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03b0d0 -3463928d -0017f821 -3c157731 -36b5562a -3c16b0d0 -36d6928d -145505e1 -00000000 -24c60018 -147605de -00000000 -14c505dc -00000000 -001fb821 -3c020000 -3c030000 -0ff19873 -00000000 -03e02821 -3c02e846 -34429a78 -0ff19879 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff1986b -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03f1e4 -34632cc0 -0017f821 -3c15e846 -36b59a78 -3c16f1e4 -36d62cc0 -145505bf -00000000 -24c60018 -147605bc -00000000 -14c505ba -00000000 -001fb821 -3c020000 -3c030000 -0ff19895 -00000000 -03e02821 -3c02872f -344283e8 -0ff1989b -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff1988d -00000000 -10000005 -00000000 -00000000 -03e03021 -3c039e52 -34635fe0 -0017f821 -3c15872f -36b583e8 -3c169e52 -36d65fe0 -1455059d -00000000 -24c60018 -1476059a -00000000 -14c50598 -00000000 -001fb821 -3c020000 -3c030000 -0ff198b7 -00000000 -03e02821 -3c02ca11 -34424c7f -0ff198bd -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff198af -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03d161 -34633e14 -0017f821 -3c15ca11 -36b54c7f -3c16d161 -36d63e14 -1455057b -00000000 -24c60018 -14760578 -00000000 -14c50576 -00000000 -001fb821 -3c020000 -3c030000 -0ff198d9 -00000000 -03e02821 -3c021f77 -34421c40 -0ff198df -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff198d1 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c035c13 -34631564 -0017f821 -3c151f77 -36b51c40 -3c165c13 -36d61564 -14550559 -00000000 -24c60018 -14760556 -00000000 -14c50554 -00000000 -001fb821 -3c020000 -3c030000 -0ff198fb -00000000 -03e02821 -3c025989 -34422de4 -0ff19901 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff198f3 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c037c4d -34636241 -0017f821 -3c155989 -36b52de4 -3c167c4d -36d66241 -14550537 -00000000 -24c60018 -14760534 -00000000 -14c50532 -00000000 -001fb821 -3c020000 -3c030000 -0ff1991d -00000000 -03e02821 -3c027620 -344214e5 -0ff19923 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19915 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03b748 -3463edf0 -0017f821 -3c157620 -36b514e5 -3c16b748 -36d6edf0 -14550515 -00000000 -24c60018 -14760512 -00000000 -14c50510 -00000000 -001fb821 -3c020000 -3c030000 -0ff1993f -00000000 -03e02821 -3c020630 -3442a598 -0ff19945 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19937 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03bf4f -3463c5a0 -0017f821 -3c150630 -36b5a598 -3c16bf4f -36d6c5a0 -145504f3 -00000000 -24c60018 -147604f0 -00000000 -14c504ee -00000000 -001fb821 -3c020000 -3c030000 -0ff19961 -00000000 -03e02821 -3c023d40 -3442efc0 -0ff19967 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19959 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03edfb -34630588 -0017f821 -3c153d40 -36b5efc0 -3c16edfb -36d60588 -145504d1 -00000000 -24c60018 -147604ce -00000000 -14c504cc -00000000 -001fb821 -3c020000 -3c030000 -0ff19983 -00000000 -03e02821 -3c02f36d -34421638 -0ff19989 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff1997b -00000000 -10000005 -00000000 -00000000 -03e03021 -3c0304b4 -346384c0 -0017f821 -3c15f36d -36b51638 -3c1604b4 -36d684c0 -145504af -00000000 -24c60018 -147604ac -00000000 -14c504aa -00000000 -001fb821 -3c020000 -3c030000 -0ff199a5 -00000000 -03e02821 -3c02af10 -34425dfc -0ff199ab -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff1999d -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03a7ba -34632b5c -0017f821 -3c15af10 -36b55dfc -3c16a7ba -36d62b5c -1455048d -00000000 -24c60018 -1476048a -00000000 -14c50488 -00000000 -001fb821 -3c020000 -3c030000 -0ff199c7 -00000000 -03e02821 -3c024433 -344223f8 -0ff199cd -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff199bf -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03f9a5 -3463cf25 -0017f821 -3c154433 -36b523f8 -3c16f9a5 -36d6cf25 -1455046b -00000000 -24c60018 -14760468 -00000000 -14c50466 -00000000 -001fb821 -3c020000 -3c030000 -0ff199e9 -00000000 -03e02821 -3c029580 -344283cc -0ff199ef -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff199e1 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c037abf -3463bd64 -0017f821 -3c159580 -36b583cc -3c167abf -36d6bd64 -14550449 -00000000 -24c60018 -14760446 -00000000 -14c50444 -00000000 -001fb821 -3c020000 -3c030000 -0ff19a0b -00000000 -03e02821 -3c020849 -3442c579 -0ff19a11 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19a03 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c034940 -346376ef -0017f821 -3c150849 -36b5c579 -3c164940 -36d676ef -14550427 -00000000 -24c60018 -14760424 -00000000 -14c50422 -00000000 -001fb821 -3c020000 -3c030000 -0ff19a2d -00000000 -03e02821 -3c020c3d -344252a0 -0ff19a33 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19a25 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03095f -34631c90 -0017f821 -3c150c3d -36b552a0 -3c16095f -36d61c90 -14550405 -00000000 -24c60018 -14760402 -00000000 -14c50400 -00000000 -001fb821 -3c020000 -3c030000 -0ff19a4f -00000000 -03e02821 -3c027869 -3442bfbc -0ff19a55 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19a47 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c035b92 -3463ccac -0017f821 -3c157869 -36b5bfbc -3c165b92 -36d6ccac -145503e3 -00000000 -24c60018 -147603e0 -00000000 -14c503de -00000000 -001fb821 -3c020000 -3c030000 -0ff19a71 -00000000 -03e02821 -3c02c45c -3442efa4 -0ff19a77 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19a69 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c037006 -3463ab64 -0017f821 -3c15c45c -36b5efa4 -3c167006 -36d6ab64 -145503c1 -00000000 -24c60018 -147603be -00000000 -14c503bc -00000000 -001fb821 -3c020000 -3c030000 -0ff19a93 -00000000 -03e02821 -3c029641 -3442dae6 -0ff19a99 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19a8b -00000000 -10000005 -00000000 -00000000 -03e03021 -3c0321bd -34630b07 -0017f821 -3c159641 -36b5dae6 -3c1621bd -36d60b07 -1455039f -00000000 -24c60018 -1476039c -00000000 -14c5039a -00000000 -001fb821 -3c020000 -3c030000 -0ff19ab5 -00000000 -03e02821 -3c024cd7 -3442ccef -0ff19abb -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19aad -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03b838 -3463965b -0017f821 -3c154cd7 -36b5ccef -3c16b838 -36d6965b -1455037d -00000000 -24c60018 -1476037a -00000000 -14c50378 -00000000 -001fb821 -3c020000 -3c030000 -0ff19ad7 -00000000 -03e02821 -3c02d924 -3442322a -0ff19add -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19acf -00000000 -10000005 -00000000 -00000000 -03e03021 -3c039ebb -3463b9dc -0017f821 -3c15d924 -36b5322a -3c169ebb -36d6b9dc -1455035b -00000000 -24c60018 -14760358 -00000000 -14c50356 -00000000 -001fb821 -3c020000 -3c030000 -0ff19af9 -00000000 -03e02821 -3c02b908 -34420a70 -0ff19aff -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19af1 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03cffa -3463d758 -0017f821 -3c15b908 -36b50a70 -3c16cffa -36d6d758 -14550339 -00000000 -24c60018 -14760336 -00000000 -14c50334 -00000000 -001fb821 -3c020000 -3c030000 -0ff19b1b -00000000 -03e02821 -3c0253a6 -34421c51 -0ff19b21 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19b13 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03d977 -34636eae -0017f821 -3c1553a6 -36b51c51 -3c16d977 -36d66eae -14550317 -00000000 -24c60018 -14760314 -00000000 -14c50312 -00000000 -001fb821 -3c020000 -3c030000 -0ff19b3d -00000000 -03e02821 -3c02a2af -3442bf34 -0ff19b43 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19b35 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c034756 -34632800 -0017f821 -3c15a2af -36b5bf34 -3c164756 -36d62800 -145502f5 -00000000 -24c60018 -147602f2 -00000000 -14c502f0 -00000000 -001fb821 -3c020000 -3c030000 -0ff19b5f -00000000 -03e02821 -3c025edf -34422815 -0ff19b65 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19b57 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c030965 -34634c40 -0017f821 -3c155edf -36b52815 -3c160965 -36d64c40 -145502d3 -00000000 -24c60018 -147602d0 -00000000 -14c502ce -00000000 -001fb821 -3c020000 -3c030000 -0ff19b81 -00000000 -03e02821 -3c0218fd -344252d0 -0ff19b87 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19b79 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c0383ff -34631689 -0017f821 -3c1518fd -36b552d0 -3c1683ff -36d61689 -145502b1 -00000000 -24c60018 -147602ae -00000000 -14c502ac -00000000 -001fb821 -3c020000 -3c030000 -0ff19ba3 -00000000 -03e02821 -3c02c186 -344268c2 -0ff19ba9 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19b9b -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03ec02 -34638728 -0017f821 -3c15c186 -36b568c2 -3c16ec02 -36d68728 -1455028f -00000000 -24c60018 -1476028c -00000000 -14c5028a -00000000 -001fb821 -3c020000 -3c030000 -0ff19bc5 -00000000 -03e02821 -3c026cc5 -34425230 -0ff19bcb -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19bbd -00000000 -10000005 -00000000 -00000000 -03e03021 -3c039a0a -3463f75e -0017f821 -3c156cc5 -36b55230 -3c169a0a -36d6f75e -1455026d -00000000 -24c60018 -1476026a -00000000 -14c50268 -00000000 -001fb821 -3c020000 -3c030000 -0ff19be7 -00000000 -03e02821 -3c02f5aa -3442ab48 -0ff19bed -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19bdf -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03d1b0 -3463328c -0017f821 -3c15f5aa -36b5ab48 -3c16d1b0 -36d6328c -1455024b -00000000 -24c60018 -14760248 -00000000 -14c50246 -00000000 -001fb821 -3c020000 -3c030000 -0ff19c09 -00000000 -03e02821 -3c02f3ff -34424eac -0ff19c0f -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19c01 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03ce6a -3463ecb3 -0017f821 -3c15f3ff -36b54eac -3c16ce6a -36d6ecb3 -14550229 -00000000 -24c60018 -14760226 -00000000 -14c50224 -00000000 -001fb821 -3c020000 -3c030000 -0ff19c2b -00000000 -03e02821 -3c020947 -3442cf11 -0ff19c31 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19c23 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c032c07 -3463ace8 -0017f821 -3c150947 -36b5cf11 -3c162c07 -36d6ace8 -14550207 -00000000 -24c60018 -14760204 -00000000 -14c50202 -00000000 -001fb821 -3c020000 -3c030000 -0ff19c4d -00000000 -03e02821 -3c025eae -3442c54e -0ff19c53 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19c45 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c0394d5 -346312f8 -0017f821 -3c155eae -36b5c54e -3c1694d5 -36d612f8 -145501e5 -00000000 -24c60018 -147601e2 -00000000 -14c501e0 -00000000 -001fb821 -3c020000 -3c030000 -0ff19c6f -00000000 -03e02821 -3c02a07b -34428e00 -0ff19c75 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19c67 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03ddfd -3463bc60 -0017f821 -3c15a07b -36b58e00 -3c16ddfd -36d6bc60 -145501c3 -00000000 -24c60018 -147601c0 -00000000 -14c501be -00000000 -001fb821 -3c020000 -3c030000 -0ff19c91 -00000000 -03e02821 -3c022eb1 -3442d6d6 -0ff19c97 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19c89 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c030f00 -34633580 -0017f821 -3c152eb1 -36b5d6d6 -3c160f00 -36d63580 -145501a1 -00000000 -24c60018 -1476019e -00000000 -14c5019c -00000000 -001fb821 -3c020000 -3c030000 -0ff19cb3 -00000000 -03e02821 -3c0232ea -3442e280 -0ff19cb9 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19cab -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03174f -34634580 -0017f821 -3c1532ea -36b5e280 -3c16174f -36d64580 -1455017f -00000000 -24c60018 -1476017c -00000000 -14c5017a -00000000 -001fb821 -3c020000 -3c030000 -0ff19cd5 -00000000 -03e02821 -3c02824c -34429710 -0ff19cdb -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19ccd -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03b2d3 -3463fe09 -0017f821 -3c15824c -36b59710 -3c16b2d3 -36d6fe09 -1455015d -00000000 -24c60018 -1476015a -00000000 -14c50158 -00000000 -001fb821 -3c020000 -3c030000 -0ff19cf7 -00000000 -03e02821 -3c02f413 -344238d8 -0ff19cfd -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19cef -00000000 -10000005 -00000000 -00000000 -03e03021 -3c037d52 -34637120 -0017f821 -3c15f413 -36b538d8 -3c167d52 -36d67120 -1455013b -00000000 -24c60018 -14760138 -00000000 -14c50136 -00000000 -001fb821 -3c020000 -3c030000 -0ff19d19 -00000000 -03e02821 -3c022ff1 -34423590 -0ff19d1f -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19d11 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03e511 -346379de -0017f821 -3c152ff1 -36b53590 -3c16e511 -36d679de -14550119 -00000000 -24c60018 -14760116 -00000000 -14c50114 -00000000 -001fb821 -3c020000 -3c030000 -0ff19d3b -00000000 -03e02821 -3c026310 -3442dd60 -0ff19d41 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19d33 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c039423 -3463fac0 -0017f821 -3c156310 -36b5dd60 -3c169423 -36d6fac0 -145500f7 -00000000 -24c60018 -147600f4 -00000000 -14c500f2 -00000000 -001fb821 -3c020000 -3c030000 -0ff19d5d -00000000 -03e02821 -3c029f43 -34424002 -0ff19d63 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19d55 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03775d -346306fc -0017f821 -3c159f43 -36b54002 -3c16775d -36d606fc -145500d5 -00000000 -24c60018 -147600d2 -00000000 -14c500d0 -00000000 -001fb821 -3c020000 -3c030000 -0ff19d7f -00000000 -03e02821 -3c0249b9 -3442c1c0 -0ff19d85 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19d77 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03a4a1 -3463f200 -0017f821 -3c1549b9 -36b5c1c0 -3c16a4a1 -36d6f200 -145500b3 -00000000 -24c60018 -147600b0 -00000000 -14c500ae -00000000 -001fb821 -3c020000 -3c030000 -0ff19da1 -00000000 -03e02821 -3c0252ea -3442fe00 -0ff19da7 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19d99 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03fadd -3463f60c -0017f821 -3c1552ea -36b5fe00 -3c16fadd -36d6f60c -14550091 -00000000 -24c60018 -1476008e -00000000 -14c5008c -00000000 -001fb821 -3c020000 -3c030000 -0ff19dc3 -00000000 -03e02821 -3c02d280 -3442ee0a -0ff19dc9 -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19dbb -00000000 -10000005 -00000000 -00000000 -03e03021 -3c032176 -3463f4c0 -0017f821 -3c15d280 -36b5ee0a -3c162176 -36d6f4c0 -1455006f -00000000 -24c60018 -1476006c -00000000 -14c5006a -00000000 -001fb821 -3c020000 -3c030000 -0ff19de5 -00000000 -03e02821 -3c02e9bc -34425a90 -0ff19deb -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19ddd -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03ab04 -346321a6 -0017f821 -3c15e9bc -36b55a90 -3c16ab04 -36d621a6 -1455004d -00000000 -24c60018 -1476004a -00000000 -14c50048 -00000000 -001fb821 -3c020000 -3c030000 -0ff19e07 -00000000 -03e02821 -3c028335 -3442d66d -0ff19e0d -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19dff -00000000 -10000005 -00000000 -00000000 -03e03021 -3c03daf2 -3463c222 -0017f821 -3c158335 -36b5d66d -3c16daf2 -36d6c222 -1455002b -00000000 -24c60018 -14760028 -00000000 -14c50026 -00000000 -001fb821 -3c020000 -3c030000 -0ff19e29 -00000000 -03e02821 -3c0218e0 -34428d00 -0ff19e2f -00000000 -1000000b -00000000 -00000000 -03e02021 -0ff19e21 -00000000 -10000005 -00000000 -00000000 -03e03021 -3c036fa3 -3463619e -0017f821 -3c1518e0 -36b58d00 -3c166fa3 -36d6619e -14550009 -00000000 -24c60018 -14760006 -00000000 -14c50004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -26100001 -24120000 -3c0979db -3529f0ff -3c08800d -35085498 -240300ff -ad091408 -25040004 -2505fff8 -ac841408 -aca51408 -91021408 -8c851408 -8ca41408 -8ca61408 -14430974 -00000000 -3c099b5b -3529ab6c -3c08800d -35084430 -2403005b -ad09252c -25040004 -2505fff8 -ac84252c -aca5252c -9102252e -8c85252c -8ca4252c -8ca6252c -14430964 -00000000 -3c09d156 -3529f470 -3c08800d -350845d8 -240300d1 -ad097608 -25040004 -2505fff8 -ac847608 -aca57608 -9102760b -8c857608 -8ca47608 -8ca67608 -14430954 -00000000 -3c094d85 -352964c0 -3c08800d -3508abac -240300c0 -ad095180 -25040004 -2505fff8 -ac845180 -aca55180 -91025180 -8c855180 -8ca45180 -8ca65180 -14430944 -00000000 -3c09927c -35299930 -3c08800d -3508ae00 -24030030 -ad094a28 -25040004 -2505fff8 -ac844a28 -aca54a28 -91024a28 -8c854a28 -8ca44a28 -8ca64a28 -14430934 -00000000 -3c099ec5 -3529966a -3c08800d -350872b8 -2403006a -ad091e9c -25040004 -2505fff8 -ac841e9c -aca51e9c -91021e9c -8c851e9c -8ca41e9c -8ca61e9c -14430924 -00000000 -3c0913f9 -35291e58 -3c08800d -35081f30 -24030058 -3c010001 -00280821 -ac29b600 -25040004 -2505fff8 -3c010001 -00240821 -ac24b600 -3c010001 -00250821 -ac25b600 -3c020001 -00481021 -9042b600 -3c050001 -00a42821 -8ca5b600 -3c040001 -00852021 -8c84b600 -3c060001 -00c53021 -8cc6b600 -14430906 -00000000 -3c090249 -3529eebd -3c08800d -35083d28 -240300bd -ad097e74 -25040004 -2505fff8 -ac847e74 -aca57e74 -91027e74 -8c857e74 -8ca47e74 -8ca67e74 -144308f6 -00000000 -3c094d40 -3529dd0e -3c08800d -35082c50 -24030040 -3c010001 -00280821 -ac29c2d0 -25040004 -2505fff8 -3c010001 -00240821 -ac24c2d0 -3c010001 -00250821 -ac25c2d0 -3c020001 -00481021 -9042c2d2 -3c050001 -00a42821 -8ca5c2d0 -3c040001 -00852021 -8c84c2d0 -3c060001 -00c53021 -8cc6c2d0 -144308d8 -00000000 -3c091dd0 -352943a8 -3c08800d -35086a7c -240300a8 -ad0930f8 -25040004 -2505fff8 -ac8430f8 -aca530f8 -910230f8 -8c8530f8 -8ca430f8 -8ca630f8 -144308c8 -00000000 -3c09ed11 -35291118 -3c08800d -350842b4 -24030018 -ad092b60 -25040004 -2505fff8 -ac842b60 -aca52b60 -91022b60 -8c852b60 -8ca42b60 -8ca62b60 -144308b8 -00000000 -3c096937 -3529c000 -3c08800d -3508e7f0 -240300c0 -ad090748 -25040004 -2505fff8 -ac840748 -aca50748 -91020749 -8c850748 -8ca40748 -8ca60748 -144308a8 -00000000 -3c09e4f7 -35296a00 -3c08800d -3508a130 -24030000 -ad090768 -25040004 -2505fff8 -ac840768 -aca50768 -91020768 -8c850768 -8ca40768 -8ca60768 -14430898 -00000000 -3c09ee33 -3529dcd0 -3c08800d -3508bc2c -240300d0 -ad091868 -25040004 -2505fff8 -ac841868 -aca51868 -91021868 -8c851868 -8ca41868 -8ca61868 -14430888 -00000000 -3c09a6a6 -35297232 -3c08800d -35088b40 -240300a6 -ad092f04 -25040004 -2505fff8 -ac842f04 -aca52f04 -91022f07 -8c852f04 -8ca42f04 -8ca62f04 -14430878 -00000000 -3c092c62 -3529e6d4 -3c08800d -35083cd4 -240300d4 -ad090270 -25040004 -2505fff8 -ac840270 -aca50270 -91020270 -8c850270 -8ca40270 -8ca60270 -14430868 -00000000 -3c09dbe7 -35295a30 -3c08800d -35082854 -240300e7 -ad090664 -25040004 -2505fff8 -ac840664 -aca50664 -91020666 -8c850664 -8ca40664 -8ca60664 -14430858 -00000000 -3c09d220 -35291348 -3c08800d -35088b40 -24030013 -ad092bc0 -25040004 -2505fff8 -ac842bc0 -aca52bc0 -91022bc1 -8c852bc0 -8ca42bc0 -8ca62bc0 -14430848 -00000000 -3c09bc50 -35299f3c -3c08800d -35080910 -240300bc -3c010001 -00280821 -ac2981c0 -25040004 -2505fff8 -3c010001 -00240821 -ac2481c0 -3c010001 -00250821 -ac2581c0 -3c020001 -00481021 -904281c3 -3c050001 -00a42821 -8ca581c0 -3c040001 -00852021 -8c8481c0 -3c060001 -00c53021 -8cc681c0 -1443082a -00000000 -3c09d03b -3529b99a -3c08800d -35082a84 -2403009a -ad093780 -25040004 -2505fff8 -ac843780 -aca53780 -91023780 -8c853780 -8ca43780 -8ca63780 -1443081a -00000000 -3c09c1da -35293a60 -3c08800d -350891c0 -24030060 -ad0954d0 -25040004 -2505fff8 -ac8454d0 -aca554d0 -910254d0 -8c8554d0 -8ca454d0 -8ca654d0 -1443080a -00000000 -3c092c56 -3529dcf0 -3c08800d -35086094 -24030056 -ad094c84 -25040004 -2505fff8 -ac844c84 -aca54c84 -91024c86 -8c854c84 -8ca44c84 -8ca64c84 -144307fa -00000000 -3c09f4a5 -35293d22 -3c08800d -35080384 -240300a5 -ad095324 -25040004 -2505fff8 -ac845324 -aca55324 -91025326 -8c855324 -8ca45324 -8ca65324 -144307ea -00000000 -3c0944b6 -35296444 -3c08800d -35089c48 -24030044 -ad093580 -25040004 -2505fff8 -ac843580 -aca53580 -91023580 -8c853580 -8ca43580 -8ca63580 -144307da -00000000 -3c092982 -3529f7ac -3c08800d -35080a18 -240300ac -ad091208 -25040004 -2505fff8 -ac841208 -aca51208 -91021208 -8c851208 -8ca41208 -8ca61208 -144307ca -00000000 -3c099089 -35295498 -3c08800d -35086210 -24030098 -ad09759c -25040004 -2505fff8 -ac84759c -aca5759c -9102759c -8c85759c -8ca4759c -8ca6759c -144307ba -00000000 -3c0971d0 -35294400 -3c08800d -35081d08 -24030071 -ad096fac -25040004 -2505fff8 -ac846fac -aca56fac -91026faf -8c856fac -8ca46fac -8ca66fac -144307aa -00000000 -3c09244f -35292870 -3c08800d -35081f50 -24030028 -3c010001 -00280821 -ac29a4c8 -25040004 -2505fff8 -3c010001 -00240821 -ac24a4c8 -3c010001 -00250821 -ac25a4c8 -3c020001 -00481021 -9042a4c9 -3c050001 -00a42821 -8ca5a4c8 -3c040001 -00852021 -8c84a4c8 -3c060001 -00c53021 -8cc6a4c8 -1443078c -00000000 -3c0960bd -3529b8c0 -3c08800d -350860e0 -240300c0 -3c010001 -00280821 -ac299944 -25040004 -2505fff8 -3c010001 -00240821 -ac249944 -3c010001 -00250821 -ac259944 -3c020001 -00481021 -90429944 -3c050001 -00a42821 -8ca59944 -3c040001 -00852021 -8c849944 -3c060001 -00c53021 -8cc69944 -1443076e -00000000 -3c09952b -3529094a -3c08800d -35084a94 -2403004a -ad095700 -25040004 -2505fff8 -ac845700 -aca55700 -91025700 -8c855700 -8ca45700 -8ca65700 -1443075e -00000000 -3c09407a -35298b80 -3c08800d -3508bb68 -24030080 -ad093d78 -25040004 -2505fff8 -ac843d78 -aca53d78 -91023d78 -8c853d78 -8ca43d78 -8ca63d78 -1443074e -00000000 -3c091ca9 -35293e6d -3c08800d -35080c60 -2403006d -ad097e14 -25040004 -2505fff8 -ac847e14 -aca57e14 -91027e14 -8c857e14 -8ca47e14 -8ca67e14 -1443073e -00000000 -3c09cbb3 -35295de0 -3c08800d -35082358 -240300e0 -ad0924e0 -25040004 -2505fff8 -ac8424e0 -aca524e0 -910224e0 -8c8524e0 -8ca424e0 -8ca624e0 -1443072e -00000000 -3c098bc6 -35290e3a -3c08800d -35082aa0 -240300c6 -ad093548 -25040004 -2505fff8 -ac843548 -aca53548 -9102354a -8c853548 -8ca43548 -8ca63548 -1443071e -00000000 -3c099502 -35290f1e -3c08800d -35082008 -2403000f -ad09320c -25040004 -2505fff8 -ac84320c -aca5320c -9102320d -8c85320c -8ca4320c -8ca6320c -1443070e -00000000 -3c094c60 -352982f4 -3c08800d -350829e8 -240300f4 -ad0959ec -25040004 -2505fff8 -ac8459ec -aca559ec -910259ec -8c8559ec -8ca459ec -8ca659ec -144306fe -00000000 -3c09e8c2 -35299c44 -3c08800d -350841e4 -240300c2 -ad0930c8 -25040004 -2505fff8 -ac8430c8 -aca530c8 -910230ca -8c8530c8 -8ca430c8 -8ca630c8 -144306ee -00000000 -3c097dd8 -35299185 -3c08800d -3508c0a8 -24030085 -ad093184 -25040004 -2505fff8 -ac843184 -aca53184 -91023184 -8c853184 -8ca43184 -8ca63184 -144306de -00000000 -3c09f2ef -35292428 -3c08800d -35084478 -24030028 -3c010001 -00280821 -ac29b5bc -25040004 -2505fff8 -3c010001 -00240821 -ac24b5bc -3c010001 -00250821 -ac25b5bc -3c020001 -00481021 -9042b5bc -3c050001 -00a42821 -8ca5b5bc -3c040001 -00852021 -8c84b5bc -3c060001 -00c53021 -8cc6b5bc -144306c0 -00000000 -3c092789 -3529e735 -3c08800d -35088088 -24030035 -ad09187c -25040004 -2505fff8 -ac84187c -aca5187c -9102187c -8c85187c -8ca4187c -8ca6187c -144306b0 -00000000 -3c095761 -35293900 -3c08800d -35086434 -24030000 -3c010001 -00280821 -ac2980c8 -25040004 -2505fff8 -3c010001 -00240821 -ac2480c8 -3c010001 -00250821 -ac2580c8 -3c020001 -00481021 -904280c8 -3c050001 -00a42821 -8ca580c8 -3c040001 -00852021 -8c8480c8 -3c060001 -00c53021 -8cc680c8 -14430692 -00000000 -3c09f831 -3529d258 -3c08800d -3508b5f0 -24030058 -ad0912cc -25040004 -2505fff8 -ac8412cc -aca512cc -910212cc -8c8512cc -8ca412cc -8ca612cc -14430682 -00000000 -3c099476 -35298ba0 -3c08800d -35089ef8 -240300a0 -ad093d84 -25040004 -2505fff8 -ac843d84 -aca53d84 -91023d84 -8c853d84 -8ca43d84 -8ca63d84 -14430672 -00000000 -3c096f5a -3529b393 -3c08800d -350823d0 -24030093 -ad0961b8 -25040004 -2505fff8 -ac8461b8 -aca561b8 -910261b8 -8c8561b8 -8ca461b8 -8ca661b8 -14430662 -00000000 -3c09d734 -352983da -3c08800d -35087a70 -24030083 -ad095008 -25040004 -2505fff8 -ac845008 -aca55008 -91025009 -8c855008 -8ca45008 -8ca65008 -14430652 -00000000 -3c094ab1 -3529c5a6 -3c08800d -35086ea8 -240300a6 -ad0961a0 -25040004 -2505fff8 -ac8461a0 -aca561a0 -910261a0 -8c8561a0 -8ca461a0 -8ca661a0 -14430642 -00000000 -3c09d4b6 -3529c948 -3c08800d -35085864 -240300d4 -ad096d0c -25040004 -2505fff8 -ac846d0c -aca56d0c -91026d0f -8c856d0c -8ca46d0c -8ca66d0c -14430632 -00000000 -3c091b18 -35299c1c -3c08800d -35082564 -24030018 -ad09317c -25040004 -2505fff8 -ac84317c -aca5317c -9102317e -8c85317c -8ca4317c -8ca6317c -14430622 -00000000 -3c09861b -35293d98 -3c08800d -35085df8 -24030098 -3c010001 -00280821 -ac2989a0 -25040004 -2505fff8 -3c010001 -00240821 -ac2489a0 -3c010001 -00250821 -ac2589a0 -3c020001 -00481021 -904289a0 -3c050001 -00a42821 -8ca589a0 -3c040001 -00852021 -8c8489a0 -3c060001 -00c53021 -8cc689a0 -14430604 -00000000 -3c091f87 -35296f58 -3c08800d -350810e0 -24030058 -ad0946bc -25040004 -2505fff8 -ac8446bc -aca546bc -910246bc -8c8546bc -8ca446bc -8ca646bc -144305f4 -00000000 -3c093b20 -35297858 -3c08800d -350814a4 -24030020 -ad091cf4 -25040004 -2505fff8 -ac841cf4 -aca51cf4 -91021cf6 -8c851cf4 -8ca41cf4 -8ca61cf4 -144305e4 -00000000 -3c0967c1 -3529dd18 -3c08800d -3508d370 -240300c1 -ad092324 -25040004 -2505fff8 -ac842324 -aca52324 -91022326 -8c852324 -8ca42324 -8ca62324 -144305d4 -00000000 -3c097066 -352969a8 -3c08800d -350823dc -240300a8 -ad093fb0 -25040004 -2505fff8 -ac843fb0 -aca53fb0 -91023fb0 -8c853fb0 -8ca43fb0 -8ca63fb0 -144305c4 -00000000 -3c090e43 -352983c0 -3c08800d -24030083 -ad0944a8 -25040004 -2505fff8 -ac8444a8 -aca544a8 -910244a9 -8c8544a8 -8ca444a8 -8ca644a8 -144305b5 -00000000 -3c09d9c8 -352961cc -3c08800d -240300c8 -ad095d3c -25040004 -2505fff8 -ac845d3c -aca55d3c -91025d3e -8c855d3c -8ca45d3c -8ca65d3c -144305a6 -00000000 -3c09fecf -352979cc -3c08800d -240300cc -ad096c20 -25040004 -2505fff8 -ac846c20 -aca56c20 -91026c20 -8c856c20 -8ca46c20 -8ca66c20 -14430597 -00000000 -3c0962ea -3529b940 -3c08800d -240300b9 -3c010001 -00280821 -ac29cfe0 -25040004 -2505fff8 -3c010001 -00240821 -ac24cfe0 -3c010001 -00250821 -ac25cfe0 -3c020001 -00481021 -9042cfe1 -3c050001 -00a42821 -8ca5cfe0 -3c040001 -00852021 -8c84cfe0 -3c060001 -00c53021 -8cc6cfe0 -1443057a -00000000 -3c09c5f7 -35291c93 -3c08800d -24030093 -ad0903ac -25040004 -2505fff8 -ac8403ac -aca503ac -910203ac -8c8503ac -8ca403ac -8ca603ac -1443056b -00000000 -3c09dc99 -35290bc0 -3c08800d -24030099 -ad094630 -25040004 -2505fff8 -ac844630 -aca54630 -91024632 -8c854630 -8ca44630 -8ca64630 -1443055c -00000000 -3c09ffa8 -352921b0 -3c08800d -240300a8 -ad090478 -25040004 -2505fff8 -ac840478 -aca50478 -9102047a -8c850478 -8ca40478 -8ca60478 -1443054d -00000000 -3c09669c -3529b8f8 -3c08800d -240300f8 -ad095dc8 -25040004 -2505fff8 -ac845dc8 -aca55dc8 -91025dc8 -8c855dc8 -8ca45dc8 -8ca65dc8 -1443053e -00000000 -3c09d965 -35290b98 -3c08800d -24030065 -3c010001 -00280821 -ac29d200 -25040004 -2505fff8 -3c010001 -00240821 -ac24d200 -3c010001 -00250821 -ac25d200 -3c020001 -00481021 -9042d202 -3c050001 -00a42821 -8ca5d200 -3c040001 -00852021 -8c84d200 -3c060001 -00c53021 -8cc6d200 -14430521 -00000000 -3c09845c -352979fc -3c08800d -240300fc -3c010001 -00280821 -ac29f504 -25040004 -2505fff8 -3c010001 -00240821 -ac24f504 -3c010001 -00250821 -ac25f504 -3c020001 -00481021 -9042f504 -3c050001 -00a42821 -8ca5f504 -3c040001 -00852021 -8c84f504 -3c060001 -00c53021 -8cc6f504 -14430504 -00000000 -3c09a7ed -35299420 -3c08800d -24030020 -3c010001 -00280821 -ac29e5e8 -25040004 -2505fff8 -3c010001 -00240821 -ac24e5e8 -3c010001 -00250821 -ac25e5e8 -3c020001 -00481021 -9042e5e8 -3c050001 -00a42821 -8ca5e5e8 -3c040001 -00852021 -8c84e5e8 -3c060001 -00c53021 -8cc6e5e8 -144304e7 -00000000 -3c09a458 -3529f1f2 -3c08800d -240300f1 -3c010001 -00280821 -ac299124 -25040004 -2505fff8 -3c010001 -00240821 -ac249124 -3c010001 -00250821 -ac259124 -3c020001 -00481021 -90429125 -3c050001 -00a42821 -8ca59124 -3c040001 -00852021 -8c849124 -3c060001 -00c53021 -8cc69124 -144304ca -00000000 -3c09ad33 -3529ad20 -3c08800d -24030033 -3c010001 -00280821 -ac29db18 -25040004 -2505fff8 -3c010001 -00240821 -ac24db18 -3c010001 -00250821 -ac25db18 -3c020001 -00481021 -9042db1a -3c050001 -00a42821 -8ca5db18 -3c040001 -00852021 -8c84db18 -3c060001 -00c53021 -8cc6db18 -144304ad -00000000 -3c09bd74 -35293318 -3c08800d -24030018 -3c010001 -00280821 -ac29c2f8 -25040004 -2505fff8 -3c010001 -00240821 -ac24c2f8 -3c010001 -00250821 -ac25c2f8 -3c020001 -00481021 -9042c2f8 -3c050001 -00a42821 -8ca5c2f8 -3c040001 -00852021 -8c84c2f8 -3c060001 -00c53021 -8cc6c2f8 -14430490 -00000000 -3c09ec31 -35295702 -3c08800d -24030002 -ad090230 -25040004 -2505fff8 -ac840230 -aca50230 -91020230 -8c850230 -8ca40230 -8ca60230 -14430481 -00000000 -3c097b43 -35293429 -3c08800d -24030029 -ad090ae0 -25040004 -2505fff8 -ac840ae0 -aca50ae0 -91020ae0 -8c850ae0 -8ca40ae0 -8ca60ae0 -14430472 -00000000 -3c093455 -352992f0 -3c08800d -240300f0 -3c010001 -00280821 -ac29d080 -25040004 -2505fff8 -3c010001 -00240821 -ac24d080 -3c010001 -00250821 -ac25d080 -3c020001 -00481021 -9042d080 -3c050001 -00a42821 -8ca5d080 -3c040001 -00852021 -8c84d080 -3c060001 -00c53021 -8cc6d080 -14430455 -00000000 -3c0915fe -3529c970 -3c08800d -24030070 -3c010001 -00280821 -ac29a6d0 -25040004 -2505fff8 -3c010001 -00240821 -ac24a6d0 -3c010001 -00250821 -ac25a6d0 -3c020001 -00481021 -9042a6d0 -3c050001 -00a42821 -8ca5a6d0 -3c040001 -00852021 -8c84a6d0 -3c060001 -00c53021 -8cc6a6d0 -14430438 -00000000 -3c09483e -3529c7ee -3c08800d -240300ee -3c010001 -00280821 -ac298570 -25040004 -2505fff8 -3c010001 -00240821 -ac248570 -3c010001 -00250821 -ac258570 -3c020001 -00481021 -90428570 -3c050001 -00a42821 -8ca58570 -3c040001 -00852021 -8c848570 -3c060001 -00c53021 -8cc68570 -1443041b -00000000 -3c09ca82 -3529fc00 -3c08800d -24030082 -ad095cfc -25040004 -2505fff8 -ac845cfc -aca55cfc -91025cfe -8c855cfc -8ca45cfc -8ca65cfc -1443040c -00000000 -3c092595 -35293f20 -3c08800d -24030025 -3c010001 -00280821 -ac29d0c0 -25040004 -2505fff8 -3c010001 -00240821 -ac24d0c0 -3c010001 -00250821 -ac25d0c0 -3c020001 -00481021 -9042d0c3 -3c050001 -00a42821 -8ca5d0c0 -3c040001 -00852021 -8c84d0c0 -3c060001 -00c53021 -8cc6d0c0 -144303ef -00000000 -3c09c718 -35294dde -3c08800d -240300de -ad095558 -25040004 -2505fff8 -ac845558 -aca55558 -91025558 -8c855558 -8ca45558 -8ca65558 -144303e0 -00000000 -3c09899b -3529e100 -3c08800d -24030000 -3c010001 -00280821 -ac29f0c4 -25040004 -2505fff8 -3c010001 -00240821 -ac24f0c4 -3c010001 -00250821 -ac25f0c4 -3c020001 -00481021 -9042f0c4 -3c050001 -00a42821 -8ca5f0c4 -3c040001 -00852021 -8c84f0c4 -3c060001 -00c53021 -8cc6f0c4 -144303c3 -00000000 -3c094629 -3529ad14 -3c08800d -24030014 -3c010001 -00280821 -ac29f550 -25040004 -2505fff8 -3c010001 -00240821 -ac24f550 -3c010001 -00250821 -ac25f550 -3c020001 -00481021 -9042f550 -3c050001 -00a42821 -8ca5f550 -3c040001 -00852021 -8c84f550 -3c060001 -00c53021 -8cc6f550 -144303a6 -00000000 -3c09b741 -3529c3b2 -3c08800d -240300b2 -3c010001 -00280821 -ac299370 -25040004 -2505fff8 -3c010001 -00240821 -ac249370 -3c010001 -00250821 -ac259370 -3c020001 -00481021 -90429370 -3c050001 -00a42821 -8ca59370 -3c040001 -00852021 -8c849370 -3c060001 -00c53021 -8cc69370 -14430389 -00000000 -3c093b7a -35298198 -3c08800d -24030081 -ad092dc4 -25040004 -2505fff8 -ac842dc4 -aca52dc4 -91022dc5 -8c852dc4 -8ca42dc4 -8ca62dc4 -1443037a -00000000 -3c09c5e5 -352941f6 -3c08800d -240300f6 -ad093560 -25040004 -2505fff8 -ac843560 -aca53560 -91023560 -8c853560 -8ca43560 -8ca63560 -1443036b -00000000 -3c09df5b -35291a0a -3c08800d -2403000a -3c010001 -00280821 -ac29d8c0 -25040004 -2505fff8 -3c010001 -00240821 -ac24d8c0 -3c010001 -00250821 -ac25d8c0 -3c020001 -00481021 -9042d8c0 -3c050001 -00a42821 -8ca5d8c0 -3c040001 -00852021 -8c84d8c0 -3c060001 -00c53021 -8cc6d8c0 -1443034e -00000000 -3c099e06 -3529fab8 -3c08800d -24030006 -ad0904c8 -25040004 -2505fff8 -ac8404c8 -aca504c8 -910204ca -8c8504c8 -8ca404c8 -8ca604c8 -1443033f -00000000 -3c0970df -35295f2c -3c08800d -240300df -3c010001 -00280821 -ac29b6b8 -25040004 -2505fff8 -3c010001 -00240821 -ac24b6b8 -3c010001 -00250821 -ac25b6b8 -3c020001 -00481021 -9042b6ba -3c050001 -00a42821 -8ca5b6b8 -3c040001 -00852021 -8c84b6b8 -3c060001 -00c53021 -8cc6b6b8 -14430322 -00000000 -3c095717 -3529a104 -3c08800d -24030017 -3c010001 -00280821 -ac29edc0 -25040004 -2505fff8 -3c010001 -00240821 -ac24edc0 -3c010001 -00250821 -ac25edc0 -3c020001 -00481021 -9042edc2 -3c050001 -00a42821 -8ca5edc0 -3c040001 -00852021 -8c84edc0 -3c060001 -00c53021 -8cc6edc0 -14430305 -00000000 -3c0991f2 -3529f789 -3c08800d -240300f2 -3c010001 -00280821 -ac29cf84 -25040004 -2505fff8 -3c010001 -00240821 -ac24cf84 -3c010001 -00250821 -ac25cf84 -3c020001 -00481021 -9042cf86 -3c050001 -00a42821 -8ca5cf84 -3c040001 -00852021 -8c84cf84 -3c060001 -00c53021 -8cc6cf84 -144302e8 -00000000 -3c0948f3 -3529e380 -3c08800d -24030080 -ad097b7c -25040004 -2505fff8 -ac847b7c -aca57b7c -91027b7c -8c857b7c -8ca47b7c -8ca67b7c -144302d9 -00000000 -3c09804e -35290100 -3c08800d -24030000 -3c010001 -00280821 -ac29ce00 -25040004 -2505fff8 -3c010001 -00240821 -ac24ce00 -3c010001 -00250821 -ac25ce00 -3c020001 -00481021 -9042ce00 -3c050001 -00a42821 -8ca5ce00 -3c040001 -00852021 -8c84ce00 -3c060001 -00c53021 -8cc6ce00 -144302bc -00000000 -3c092763 -35295fe4 -3c08800d -240300e4 -3c010001 -00280821 -ac29f2e0 -25040004 -2505fff8 -3c010001 -00240821 -ac24f2e0 -3c010001 -00250821 -ac25f2e0 -3c020001 -00481021 -9042f2e0 -3c050001 -00a42821 -8ca5f2e0 -3c040001 -00852021 -8c84f2e0 -3c060001 -00c53021 -8cc6f2e0 -1443029f -00000000 -3c09ffcb -3529e970 -3c08800d -240300cb -ad0959ac -25040004 -2505fff8 -ac8459ac -aca559ac -910259ae -8c8559ac -8ca459ac -8ca659ac -14430290 -00000000 -3c095a3c -3529ef6e -3c08800d -240300ef -3c010001 -00280821 -ac29a604 -25040004 -2505fff8 -3c010001 -00240821 -ac24a604 -3c010001 -00250821 -ac25a604 -3c020001 -00481021 -9042a605 -3c050001 -00a42821 -8ca5a604 -3c040001 -00852021 -8c84a604 -3c060001 -00c53021 -8cc6a604 -14430273 -00000000 -3c09ef7b -35295e90 -3c08800d -2403007b -3c010001 -00280821 -ac298894 -25040004 -2505fff8 -3c010001 -00240821 -ac248894 -3c010001 -00250821 -ac258894 -3c020001 -00481021 -90428896 -3c050001 -00a42821 -8ca58894 -3c040001 -00852021 -8c848894 -3c060001 -00c53021 -8cc68894 -14430256 -00000000 -3c09262a -35295e90 -3c08800d -24030026 -3c010001 -00280821 -ac29f96c -25040004 -2505fff8 -3c010001 -00240821 -ac24f96c -3c010001 -00250821 -ac25f96c -3c020001 -00481021 -9042f96f -3c050001 -00a42821 -8ca5f96c -3c040001 -00852021 -8c84f96c -3c060001 -00c53021 -8cc6f96c -14430239 -00000000 -3c09a267 -352901e8 -3c08800d -24030001 -3c010001 -00280821 -ac299398 -25040004 -2505fff8 -3c010001 -00240821 -ac249398 -3c010001 -00250821 -ac259398 -3c020001 -00481021 -90429399 -3c050001 -00a42821 -8ca59398 -3c040001 -00852021 -8c849398 -3c060001 -00c53021 -8cc69398 -1443021c -00000000 -3c092f2f -352973f0 -3c08800d -240300f0 -3c010001 -00280821 -ac29ea14 -25040004 -2505fff8 -3c010001 -00240821 -ac24ea14 -3c010001 -00250821 -ac25ea14 -3c020001 -00481021 -9042ea14 -3c050001 -00a42821 -8ca5ea14 -3c040001 -00852021 -8c84ea14 -3c060001 -00c53021 -8cc6ea14 -144301ff -00000000 -3c0938ce -35294640 -3c08800d -240300ce -ad095780 -25040004 -2505fff8 -ac845780 -aca55780 -91025782 -8c855780 -8ca45780 -8ca65780 -144301f0 -00000000 -3c09bb69 -3529c800 -3c08800d -24030069 -ad090b44 -25040004 -2505fff8 -ac840b44 -aca50b44 -91020b46 -8c850b44 -8ca40b44 -8ca60b44 -144301e1 -00000000 -3c097b9d -3529a800 -3c08800d -2403009d -3c010001 -00280821 -ac29f048 -25040004 -2505fff8 -3c010001 -00240821 -ac24f048 -3c010001 -00250821 -ac25f048 -3c020001 -00481021 -9042f04a -3c050001 -00a42821 -8ca5f048 -3c040001 -00852021 -8c84f048 -3c060001 -00c53021 -8cc6f048 -144301c4 -00000000 -3c095568 -3529c260 -3c08800d -24030060 -ad0972e0 -25040004 -2505fff8 -ac8472e0 -aca572e0 -910272e0 -8c8572e0 -8ca472e0 -8ca672e0 -144301b5 -00000000 -3c094bd9 -35293c80 -3c08800d -24030080 -3c010001 -00280821 -ac29ee30 -25040004 -2505fff8 -3c010001 -00240821 -ac24ee30 -3c010001 -00250821 -ac25ee30 -3c020001 -00481021 -9042ee30 -3c050001 -00a42821 -8ca5ee30 -3c040001 -00852021 -8c84ee30 -3c060001 -00c53021 -8cc6ee30 -14430198 -00000000 -3c0923ad -3529f432 -3c08800d -240300f4 -ad096008 -25040004 -2505fff8 -ac846008 -aca56008 -91026009 -8c856008 -8ca46008 -8ca66008 -14430189 -00000000 -3c096187 -3529f420 -3c08800d -24030020 -ad092fd4 -25040004 -2505fff8 -ac842fd4 -aca52fd4 -91022fd4 -8c852fd4 -8ca42fd4 -8ca62fd4 -1443017a -00000000 -3c096836 -35293fa0 -3c08800d -240300a0 -ad093e68 -25040004 -2505fff8 -ac843e68 -aca53e68 -91023e68 -8c853e68 -8ca43e68 -8ca63e68 -1443016b -00000000 -3c093723 -3529c7f3 -3c08800d -240300f3 -ad0943e0 -25040004 -2505fff8 -ac8443e0 -aca543e0 -910243e0 -8c8543e0 -8ca443e0 -8ca643e0 -1443015c -00000000 -3c09d367 -3529e11a -3c08800d -2403001a -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -91020000 -8c850000 -8ca40000 -8ca60000 -1443014d -00000000 -3c09ea1b -3529c1e0 -3c08800d -240300ea -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -91020003 -8c850000 -8ca40000 -8ca60000 -1443013e -00000000 -3c090dbc -3529d2ea -3c08800d -240300d2 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -91020001 -8c850000 -8ca40000 -8ca60000 -1443012f -00000000 -3c092e83 -352977c6 -3c08800d -240300c6 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -91020000 -8c850000 -8ca40000 -8ca60000 -14430120 -00000000 -3c0985d1 -3529767c -3c08800d -24030076 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -91020001 -8c850000 -8ca40000 -8ca60000 -14430111 -00000000 -3c092a80 -35297b6e -3c08800d -2403006e -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -91020000 -8c850000 -8ca40000 -8ca60000 -14430102 -00000000 -3c097c7e -3529468b -3c08800d -24030046 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -91020001 -8c850000 -8ca40000 -8ca60000 -144300f3 -00000000 -3c09766b -352930aa -3c08800d -240300aa -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -91020000 -8c850000 -8ca40000 -8ca60000 -144300e4 -00000000 -3c09f311 -35292744 -3c08800d -240300f3 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -91020003 -8c850000 -8ca40000 -8ca60000 -144300d5 -00000000 -3c0924da -3529377c -3c08800d -24030037 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -91020001 -8c850000 -8ca40000 -8ca60000 -144300c6 -00000000 -3c099eda -35291a30 -3c08800d -2403001a -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -91020001 -8c850000 -8ca40000 -8ca60000 -144300b7 -00000000 -3c091e77 -352930fe -3c08800d -240300fe -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -91020000 -8c850000 -8ca40000 -8ca60000 -144300a8 -00000000 -3c094acf -3529dea0 -3c08800d -240300de -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -91020001 -8c850000 -8ca40000 -8ca60000 -14430099 -00000000 -3c0984b7 -35290109 -3c08800d -24030084 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -91020003 -8c850000 -8ca40000 -8ca60000 -1443008a -00000000 -3c09ace9 -3529f794 -3c08800d -24030094 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -91020000 -8c850000 -8ca40000 -8ca60000 -1443007b -00000000 -3c0960a3 -3529b6d8 -3c08800d -240300b6 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -91020001 -8c850000 -8ca40000 -8ca60000 -1443006c -00000000 -3c09954e -3529b5ee -3c08800d -240300b5 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -91020001 -8c850000 -8ca40000 -8ca60000 -1443005d -00000000 -3c0995ff -3529cf80 -3c08800d -24030095 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -91020003 -8c850000 -8ca40000 -8ca60000 -1443004e -00000000 -3c09e20e -3529fe40 -3c08800d -24030040 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -91020000 -8c850000 -8ca40000 -8ca60000 -1443003f -00000000 -3c09826e -35290c40 -3c08800d -24030082 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -91020003 -8c850000 -8ca40000 -8ca60000 -14430030 -00000000 -3c093c7f -35293796 -3c08800d -2403003c -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -91020003 -8c850000 -8ca40000 -8ca60000 -14430021 -00000000 -3c09d82d -35294498 -3c08800d -2403002d -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -91020002 -8c850000 -8ca40000 -8ca60000 -14430012 -00000000 -24090000 -3c08800d -24030000 -ad090000 -25040004 -2505fff8 -ac840000 -aca50000 -91020000 -8c850000 -8ca40000 -8ca60000 -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -26100001 -3c08800d -24120001 -ad120000 -40805800 -3c170040 -40976000 -00000000 -3c170001 -3c14bfc7 -26949f7c -0000000c -1657003c -00000000 -24120001 -3c14bfc7 -26949f9c -ad080004 -ad140004 -0000000c -ad140000 -8d090004 -15340032 -00000000 -16570030 -00000000 -24120001 -ad120000 -24120001 -3c14bfc7 -26949fd4 -01000011 -0110001b -0000000c -00004810 -11280025 -00000000 -16570023 -00000000 -24120001 -3c14bfc7 -26949ff8 -0000000c -0208001b -1657001c -00000000 -24120001 -3c14bfc7 -2694a01c -01000013 -01100019 -0000000c -00004810 -11280013 -00000000 -16570011 -00000000 -24120001 -3c14bfc7 -2694a040 -0000000c -01120019 -1657000a -00000000 -24120001 -3c14bfc7 -2694a060 -40927000 -0000000c -40887000 -16570002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -26100001 -24120000 -3c0850e4 -35081484 -3c09ad35 -3529ea94 -3c03fdf5 -3463fe94 -01091025 -14430a26 -00000000 -3c08bbbf -3508afe4 -3c09c8e9 -35294400 -3c03fbff -3463efe4 -01091025 -14430a1d -00000000 -3c08f293 -3508f134 -3c09a7cc -3529798a -3c03f7df -3463f9be -01091025 -14430a14 -00000000 -3c08fb4e -3508ee5e -3c096696 -35298a90 -3c03ffde -3463eede -01091025 -14430a0b -00000000 -3c08bc98 -35088af7 -3c09986e -35292136 -3c03bcfe -3463abf7 -01091025 -14430a02 -00000000 -3c081ec7 -35087b94 -3c091bf2 -3529b5cc -3c031ff7 -3463ffdc -01091025 -144309f9 -00000000 -3c083f4f -350840ca -3c0989bf -352986b2 -3c03bfff -3463c6fa -01091025 -144309f0 -00000000 -3c08cf97 -3508afe8 -3c093c84 -35295a89 -3c03ff97 -3463ffe9 -01091025 -144309e7 -00000000 -3c087492 -35086eec -3c09556d -3529c1dc -3c0375ff -3463effc -01091025 -144309de -00000000 -3c08bb9c -35085258 -3c09c090 -3529aa10 -3c03fb9c -3463fa58 -01091025 -144309d5 -00000000 -3c08cad7 -35084640 -3c09db28 -3529e181 -3c03dbff -3463e7c1 -01091025 -144309cc -00000000 -3c0833b2 -350814b8 -3c09ca79 -35293c6a -3c03fbfb -34633cfa -01091025 -144309c3 -00000000 -3c0862e3 -3508914c -3c096762 -3529ab45 -3c0367e3 -3463bb4d -01091025 -144309ba -00000000 -3c0869ff -35089ea0 -3c094910 -3529452c -3c0369ff -3463dfac -01091025 -144309b1 -00000000 -3c081c4b -3508c4e8 -3c095aea -3529b614 -3c035eeb -3463f6fc -01091025 -144309a8 -00000000 -3c080da1 -350814aa -3c096c31 -3529e1a8 -3c036db1 -3463f5aa -01091025 -1443099f -00000000 -3c08ac65 -3508b92c -3c098047 -352934d8 -3c03ac67 -3463bdfc -01091025 -14430996 -00000000 -3c081019 -3508aba0 -3c096bec -35296690 -3c037bfd -3463efb0 -01091025 -1443098d -00000000 -3c080a53 -35080b08 -3c0994d5 -3529ba1a -3c039ed7 -3463bb1a -01091025 -14430984 -00000000 -3c088638 -35081080 -3c099130 -3529a0f0 -3c039738 -3463b0f0 -01091025 -1443097b -00000000 -3c08106e -3508ec44 -3c09d64d -35291eb9 -3c03d66f -3463fefd -01091025 -14430972 -00000000 -3c08d889 -35081000 -3c09cc0b -3529db4e -3c03dc8b -3463db4e -01091025 -14430969 -00000000 -3c086cc8 -35082d12 -3c09f321 -352986b0 -3c03ffe9 -3463afb2 -01091025 -14430960 -00000000 -3c0890bf -35082660 -3c0956e4 -35296fab -3c03d6ff -34636feb -01091025 -14430957 -00000000 -3c08e09a -3508c2d6 -3c092183 -35296000 -3c03e19b -3463e2d6 -01091025 -1443094e -00000000 -3c08bdc0 -35084d70 -3c091112 -35297c16 -3c03bdd2 -34637d76 -01091025 -14430945 -00000000 -3c0846dc -3508ded0 -3c091958 -35292954 -3c035fdc -3463ffd4 -01091025 -1443093c -00000000 -3c0806dc -35084900 -3c091893 -35294b67 -3c031edf -34634b67 -01091025 -14430933 -00000000 -3c083f09 -3508a74b -3c09a4e2 -352917bb -3c03bfeb -3463b7fb -01091025 -1443092a -00000000 -3c08dfe8 -35084d3c -3c095111 -3529bfaa -3c03dff9 -3463ffbe -01091025 -14430921 -00000000 -3c08978b -3508b400 -3c097ea2 -35297d30 -3c03ffab -3463fd30 -01091025 -14430918 -00000000 -3c08b292 -35089600 -3c092565 -35297e00 -3c03b7f7 -3463fe00 -01091025 -1443090f -00000000 -3c0858af -35082540 -3c0905ed -3529984a -3c035def -3463bd4a -01091025 -14430906 -00000000 -3c08b20c -35085500 -3c091906 -3529162c -3c03bb0e -3463572c -01091025 -144308fd -00000000 -3c0835a9 -35089b0c -3c0968cf -3529a700 -3c037def -3463bf0c -01091025 -144308f4 -00000000 -3c089ce9 -35085a98 -3c09966d -35297f48 -3c039eed -34637fd8 -01091025 -144308eb -00000000 -3c08db25 -35089d9f -3c092bf0 -35290d95 -3c03fbf5 -34639d9f -01091025 -144308e2 -00000000 -3c082881 -3508d544 -3c09e346 -3529aac0 -3c03ebc7 -3463ffc4 -01091025 -144308d9 -00000000 -3c08f12e -3508e860 -3c09443d -35299690 -3c03f53f -3463fef0 -01091025 -144308d0 -00000000 -3c08850b -3508156a -3c091a93 -3529032c -3c039f9b -3463176e -01091025 -144308c7 -00000000 -3c084ba7 -35084682 -3c09f97e -35290f50 -3c03fbff -34634fd2 -01091025 -144308be -00000000 -3c084ed5 -35084700 -3c091e6c -3529caf2 -3c035efd -3463cff2 -01091025 -144308b5 -00000000 -3c085355 -350898dc -3c09881b -3529a7d0 -3c03db5f -3463bfdc -01091025 -144308ac -00000000 -3c08c934 -35087cec -3c09cc4d -3529db60 -3c03cd7d -3463ffec -01091025 -144308a3 -00000000 -3c08464c -35089099 -3c09010f -3529d010 -3c03474f -3463d099 -01091025 -1443089a -00000000 -3c08f7e7 -35087584 -3c09391d -3529a864 -2403fde4 -01091025 -14430892 -00000000 -3c08aed7 -350833c9 -3c09e8d9 -35298fda -3c03eedf -3463bfdb -01091025 -14430889 -00000000 -3c08b18a -35084632 -3c09b712 -35291286 -3c03b79a -346356b6 -01091025 -14430880 -00000000 -3c08df71 -3508a9d0 -3c091c6f -35296a00 -3c03df7f -3463ebd0 -01091025 -14430877 -00000000 -3c08ec0b -350889ac -3c090f02 -352967a7 -3c03ef0b -3463efaf -01091025 -1443086e -00000000 -3c085e8e -3508a894 -3c090128 -35291cfa -3c035fae -3463bcfe -01091025 -14430865 -00000000 -3c088b7f -35083f2a -3c095cd0 -3529ba00 -3c03dfff -3463bf2a -01091025 -1443085c -00000000 -3c0869a6 -3508c180 -3c099ee8 -3529bda8 -3c03ffee -3463fda8 -01091025 -14430853 -00000000 -3c0830cd -3508ef30 -3c091dbb -3529c724 -3c033dff -3463ef34 -01091025 -1443084a -00000000 -3c0878d3 -3508fe74 -3c096152 -3529cf10 -3c0379d3 -3463ff74 -01091025 -14430841 -00000000 -3c089ccf -3508a1f0 -3c09e9f1 -35296114 -3c03fdff -3463e1f4 -01091025 -14430838 -00000000 -3c080a13 -3508c200 -3c091e33 -3529e864 -3c031e33 -3463ea64 -01091025 -1443082f -00000000 -3c08b881 -35080080 -3c095156 -3529f180 -3c03f9d7 -3463f180 -01091025 -14430826 -00000000 -3c08e734 -350838a8 -3c09aa89 -3529d5a0 -3c03efbd -3463fda8 -01091025 -1443081d -00000000 -3c083689 -35088e80 -3c096af7 -35293c18 -3c037eff -3463be98 -01091025 -14430814 -00000000 -3c08dda2 -35088308 -3c0901fd -3529aeb8 -3c03ddff -3463afb8 -01091025 -1443080b -00000000 -3c0811f8 -35086ce4 -3c091f89 -3529e9fd -3c031ff9 -3463edfd -01091025 -14430802 -00000000 -3c08d039 -3508fd38 -3c09c60b -35291870 -3c03d63b -3463fd78 -01091025 -144307f9 -00000000 -3c08343b -35087884 -3c09ad7b -3529640c -3c03bd7b -34637c8c -01091025 -144307f0 -00000000 -3c08e3b4 -3508d414 -3c094f5a -3529a278 -3c03effe -3463f67c -01091025 -144307e7 -00000000 -3c0883c5 -35085830 -3c09c242 -352953d0 -3c03c3c7 -34635bf0 -01091025 -144307de -00000000 -3c08f4f2 -3508dd59 -3c097db8 -3529474b -3c03fdfa -3463df5b -01091025 -144307d5 -00000000 -3c08fc67 -35087c68 -3c09d93b -3529fcda -3c03fd7f -3463fcfa -01091025 -144307cc -00000000 -3c08c877 -3508c154 -3c0997a6 -3529329c -3c03dff7 -3463f3dc -01091025 -144307c3 -00000000 -3c080d7f -35087f14 -3c09c816 -3529d4ce -3c03cd7f -3463ffde -01091025 -144307ba -00000000 -3c08c54a -3508677d -3c096dce -3529c0aa -3c03edce -3463e7ff -01091025 -144307b1 -00000000 -3c08c8b4 -35082670 -3c098eeb -35297eab -3c03ceff -34637efb -01091025 -144307a8 -00000000 -3c086f32 -3508147a -3c09ead8 -3529ab4d -3c03effa -3463bf7f -01091025 -1443079f -00000000 -3c08a20b -35082c3c -3c09fe6c -3529aeaf -3c03fe6f -3463aebf -01091025 -14430796 -00000000 -3c08ca0c -35089f50 -3c09549f -35292ec8 -3c03de9f -3463bfd8 -01091025 -1443078d -00000000 -3c0881e4 -35087e1e -3c09245c -3529ec80 -3c03a5fc -3463fe9e -01091025 -14430784 -00000000 -3c084f5f -35084154 -3c095b26 -3529f7b8 -3c035f7f -3463f7fc -01091025 -1443077b -00000000 -3c08f1e7 -350876a0 -3c0962d0 -35292580 -3c03f3f7 -346377a0 -01091025 -14430772 -00000000 -3c08ff6e -35082e40 -3c09694b -35299d00 -3c03ff6f -3463bf40 -01091025 -14430769 -00000000 -3c0823d3 -35083d30 -3c0981b7 -3529f81e -3c03a3f7 -3463fd3e -01091025 -14430760 -00000000 -3c08f6c6 -3508b4ea -3c09393f -35293526 -2403b5ee -01091025 -14430758 -00000000 -3c080eaf -3508a7d0 -3c0990d3 -3529d440 -3c039eff -3463f7d0 -01091025 -1443074f -00000000 -3c084a89 -35084ac0 -3c09fd92 -3529d224 -3c03ff9b -3463dae4 -01091025 -14430746 -00000000 -3c087777 -350878a8 -3c09fe12 -3529c1f1 -3c03ff77 -3463f9f9 -01091025 -1443073d -00000000 -3c0800d2 -35088785 -3c093fb1 -35294d40 -3c033ff3 -3463cfc5 -01091025 -14430734 -00000000 -3c083e97 -3508bd70 -3c0962ba -352928b4 -3c037ebf -3463bdf4 -01091025 -1443072b -00000000 -3c0840ed -3508a7c8 -3c098da8 -3529f970 -3c03cded -3463fff8 -01091025 -14430722 -00000000 -3c08feb8 -350898ce -3c097641 -352943c0 -3c03fef9 -3463dbce -01091025 -14430719 -00000000 -3c086786 -35088e48 -3c09514f -352913b2 -3c0377cf -34639ffa -01091025 -14430710 -00000000 -3c08e4e7 -3508fa54 -3c0948c7 -3529d50c -3c03ece7 -3463ff5c -01091025 -14430707 -00000000 -3c083c9a -35088f80 -3c0978fa -35290780 -3c037cfa -34638f80 -01091025 -144306fe -00000000 -3c08558f -3508d600 -3c094c38 -3529e77c -3c035dbf -3463f77c -01091025 -144306f5 -00000000 -3c081d46 -3508d718 -3c0915a0 -352922ba -3c031de6 -3463f7ba -01091025 -144306ec -00000000 -3c08a2a4 -35082f00 -3c09b919 -3529a7d0 -3c03bbbd -3463afd0 -01091025 -144306e3 -00000000 -3c081797 -3508d4a4 -3c0957b2 -35292c98 -3c0357b7 -3463fcbc -01091025 -144306da -00000000 -3c083d4d -35087394 -3c09a446 -35290d0c -3c03bd4f -34637f9c -01091025 -144306d1 -00000000 -3c086ff2 -35082260 -3c09431e -3529d6fd -3c036ffe -3463f6fd -01091025 -144306c8 -00000000 -3c08286b -35082da0 -3c094cce -3529de22 -3c036cef -3463ffa2 -01091025 -144306bf -00000000 -3c08e5db -35084a29 -3c095986 -35290bf0 -3c03fddf -34634bf9 -01091025 -144306b6 -00000000 -3c088651 -3508b153 -3c092ed7 -35297bd6 -3c03aed7 -3463fbd7 -01091025 -144306ad -00000000 -3c08f232 -3508af58 -3c094213 -35296718 -3c03f233 -3463ef58 -01091025 -144306a4 -00000000 -3c081315 -35080d2e -3c09b397 -35298c4e -3c03b397 -34638d6e -01091025 -1443069b -00000000 -3c088fa9 -350805ba -3c090240 -3529aa80 -3c038fe9 -3463afba -01091025 -14430692 -00000000 -3c089ee8 -3508fae0 -3c092c44 -35296d1a -3c03beec -3463fffa -01091025 -14430689 -00000000 -3c08c3b5 -3508114e -3c09dacc -3529441c -3c03dbfd -3463555e -01091025 -14430680 -00000000 -3c08c7ea -35087138 -3c096af8 -3529d654 -3c03effa -3463f77c -01091025 -14430677 -00000000 -3c0810ae -350810b8 -3c09ba04 -35295100 -3c03baae -346351b8 -01091025 -1443066e -00000000 -3c08502c -35086be8 -3c09c0d8 -35296248 -3c03d0fc -34636be8 -01091025 -14430665 -00000000 -3c08b5c4 -35083ba8 -3c09e2ea -3529ea18 -3c03f7ee -3463fbb8 -01091025 -1443065c -00000000 -3c08fab3 -3508f792 -3c090a90 -35297dde -3c03fab3 -3463ffde -01091025 -14430653 -00000000 -3c082cf0 -3508ee04 -3c09cff9 -3529ff80 -3c03eff9 -3463ff84 -01091025 -1443064a -00000000 -3c0808d1 -3508a45c -3c09bf6a -35291a5b -3c03bffb -3463be5f -01091025 -14430641 -00000000 -3c083d77 -3508d5b0 -3c099f43 -3529f300 -3c03bf77 -3463f7b0 -01091025 -14430638 -00000000 -3c0851ac -35083e60 -3c096b52 -3529e19c -3c037bfe -3463fffc -01091025 -1443062f -00000000 -3c08b70b -3508c630 -3c09b2f7 -35298e26 -3c03b7ff -3463ce36 -01091025 -14430626 -00000000 -3c08c16b -350860a8 -3c091914 -352989e2 -3c03d97f -3463e9ea -01091025 -1443061d -00000000 -3c0863e0 -3508b340 -3c09e285 -3529b680 -3c03e3e5 -3463b7c0 -01091025 -14430614 -00000000 -3c0870ce -35088a00 -3c091c09 -35298ec0 -3c037ccf -34638ec0 -01091025 -1443060b -00000000 -3c0867e7 -350886b8 -3c09db24 -3529005d -3c03ffe7 -346386fd -01091025 -14430602 -00000000 -3c08d2d4 -3508564c -3c097445 -35290bd0 -3c03f6d5 -34635fdc -01091025 -144305f9 -00000000 -3c08910e -350814d9 -3c098acb -352985e2 -3c039bcf -346395fb -01091025 -144305f0 -00000000 -3c083d15 -35089888 -3c093ac6 -35290e90 -3c033fd7 -34639e98 -01091025 -144305e7 -00000000 -3c08ead4 -3508311b -3c09c83a -35295380 -3c03eafe -3463739b -01091025 -144305de -00000000 -3c084fd6 -3508a6a8 -3c09bb88 -35298a4f -3c03ffde -3463aeef -01091025 -144305d5 -00000000 -3c082fb9 -350872a0 -3c0953b3 -3529ce04 -3c037fbb -3463fea4 -01091025 -144305cc -00000000 -3c086a04 -3508555a -3c0946a0 -35297f68 -3c036ea4 -34637f7a -01091025 -144305c3 -00000000 -3c081b7e -3508137a -3c09b5dd -352902ae -3c03bfff -346313fe -01091025 -144305ba -00000000 -3c083552 -35086914 -3c0991e9 -3529b6b2 -3c03b5fb -3463ffb6 -01091025 -144305b1 -00000000 -3c08f9b8 -3508389a -3c0927f0 -352972ee -3c03fff8 -34637afe -01091025 -144305a8 -00000000 -3c08a85d -35089189 -3c0916ff -3529a780 -3c03beff -3463b789 -01091025 -1443059f -00000000 -3c08436b -35088358 -3c09a02c -352918b8 -3c03e36f -34639bf8 -01091025 -14430596 -00000000 -3c08e505 -3508c620 -3c09a21c -35295380 -3c03e71d -3463d7a0 -01091025 -1443058d -00000000 -3c08c86d -3508acb4 -3c093d09 -35292b6d -3c03fd6d -3463affd -01091025 -14430584 -00000000 -3c088cdb -350840cc -3c09a05b -35295546 -3c03acdb -346355ce -01091025 -1443057b -00000000 -3c086f1e -35083ca0 -3c096e89 -35298826 -3c036f9f -3463bca6 -01091025 -14430572 -00000000 -3c08859c -35082444 -3c0921f9 -352961e9 -3c03a5fd -346365ed -01091025 -14430569 -00000000 -3c08d78e -35087bf6 -3c0937b1 -35298310 -3c03f7bf -3463fbf6 -01091025 -14430560 -00000000 -3c08971a -3508f4e0 -3c094c54 -3529addc -3c03df5e -3463fdfc -01091025 -14430557 -00000000 -3c08dd91 -3508b5e0 -3c09c850 -3529e340 -3c03ddd1 -3463f7e0 -01091025 -1443054e -00000000 -3c0854ca -35088ab4 -3c09dff4 -3529ba70 -3c03dffe -3463baf4 -01091025 -14430545 -00000000 -3c08e1f9 -350892d8 -3c09a2a5 -3529d019 -3c03e3fd -3463d2d9 -01091025 -1443053c -00000000 -3c089ff8 -3508eaa0 -3c09e26c -3529dc80 -3c03fffc -3463fea0 -01091025 -14430533 -00000000 -3c08a07d -35080c80 -3c099f37 -3529e678 -3c03bf7f -3463eef8 -01091025 -1443052a -00000000 -3c08a7fa -35081a14 -3c0982bb -3529aa38 -3c03a7fb -3463ba3c -01091025 -14430521 -00000000 -3c0879fe -350868ac -3c09d836 -3529ebd6 -3c03f9fe -3463ebfe -01091025 -14430518 -00000000 -3c08631f -35081200 -3c09a946 -35295f50 -3c03eb5f -34635f50 -01091025 -1443050f -00000000 -3c08503e -3508d3b0 -3c09d4c3 -3529f80e -3c03d4ff -3463fbbe -01091025 -14430506 -00000000 -3c082f7d -35089231 -3c097dbf -35299bf8 -3c037fff -34639bf9 -01091025 -144304fd -00000000 -3c0885a8 -35085689 -3c099b3a -35293514 -3c039fba -3463779d -01091025 -144304f4 -00000000 -3c081fd3 -35081088 -3c09df89 -352904d6 -3c03dfdb -346314de -01091025 -144304eb -00000000 -3c0849ea -35085256 -3c097800 -35294ec8 -3c0379ea -34635ede -01091025 -144304e2 -00000000 -3c08a3db -35080a10 -3c095650 -3529db82 -3c03f7db -3463db92 -01091025 -144304d9 -00000000 -3c080ca8 -35086144 -3c093ffd -3529b54c -3c033ffd -3463f54c -01091025 -144304d0 -00000000 -3c08b1c7 -3508731a -3c09fa49 -3529621c -3c03fbcf -3463731e -01091025 -144304c7 -00000000 -3c08b3d8 -35088649 -3c09960a -3529282e -3c03b7da -3463ae6f -01091025 -144304be -00000000 -3c0857ad -3508bf94 -3c099a1a -3529cf40 -3c03dfbf -3463ffd4 -01091025 -144304b5 -00000000 -3c08f5fd -3508f238 -3c097e77 -352905f6 -2403f7fe -01091025 -144304ad -00000000 -3c08d78f -3508be00 -3c097c55 -3529c280 -3c03ffdf -3463fe80 -01091025 -144304a4 -00000000 -3c08ec34 -35084c1e -3c09ad81 -3529375e -3c03edb5 -34637f5e -01091025 -1443049b -00000000 -3c081df7 -3508ea7c -3c09bf40 -352975ca -3c03bff7 -3463fffe -01091025 -14430492 -00000000 -3c08b1b5 -3508cd64 -3c09fee9 -35295920 -3c03fffd -3463dd64 -01091025 -14430489 -00000000 -3c08310f -350883a0 -3c09d96a -35295108 -3c03f96f -3463d3a8 -01091025 -14430480 -00000000 -3c084b2f -3508bef7 -3c095c42 -35299632 -3c035f6f -3463bef7 -01091025 -14430477 -00000000 -3c08eaf7 -350845ca -3c096560 -352949dc -3c03eff7 -34634dde -01091025 -1443046e -00000000 -3c08bc1a -3508f088 -3c0988ce -3529928a -3c03bcde -3463f28a -01091025 -14430465 -00000000 -3c085608 -35082ce0 -3c090f23 -3529c550 -3c035f2b -3463edf0 -01091025 -1443045c -00000000 -3c08dba3 -35086c09 -3c0945e9 -3529a498 -3c03dfeb -3463ec99 -01091025 -14430453 -00000000 -3c083e9d -35089320 -3c096694 -3529bbb9 -3c037e9d -3463bbb9 -01091025 -1443044a -00000000 -3c08b080 -3508abe7 -3c094670 -352943ce -3c03f6f0 -3463ebef -01091025 -14430441 -00000000 -3c087419 -3508beb0 -3c0934ac -3529b0c0 -3c0374bd -3463bef0 -01091025 -14430438 -00000000 -3c083176 -350835f8 -3c091193 -35295b4c -3c0331f7 -34637ffc -01091025 -1443042f -00000000 -3c08f052 -35085ca0 -3c0952e8 -35295c2e -3c03f2fa -34635cae -01091025 -14430426 -00000000 -3c08aa43 -35083600 -3c09747f -35299a81 -3c03fe7f -3463be81 -01091025 -1443041d -00000000 -3c08ae06 -35087a50 -3c09ce05 -35298e6e -3c03ee07 -3463fe7e -01091025 -14430414 -00000000 -3c0875a7 -35080618 -3c090f18 -3529b00c -3c037fbf -3463b61c -01091025 -1443040b -00000000 -3c084f8d -3508a580 -3c095a96 -35296f8e -3c035f9f -3463ef8e -01091025 -14430402 -00000000 -3c08f8d6 -3508e5cc -3c09881c -35299970 -3c03f8de -3463fdfc -01091025 -144303f9 -00000000 -3c08c789 -35088fdc -3c09c94a -35294b30 -3c03cfcb -3463cffc -01091025 -144303f0 -00000000 -3c088dbc -35082648 -3c09a1bc -3529c900 -3c03adbc -3463ef48 -01091025 -144303e7 -00000000 -3c088e58 -3508fa10 -3c09f9d7 -35294a50 -3c03ffdf -3463fa50 -01091025 -144303de -00000000 -3c082987 -3508a216 -3c09a97a -35299500 -3c03a9ff -3463b716 -01091025 -144303d5 -00000000 -3c08f7ce -35083e74 -3c098e1d -35294b80 -3c03ffdf -34637ff4 -01091025 -144303cc -00000000 -3c080caa -35082a2c -3c09a471 -352959e0 -3c03acfb -34637bec -01091025 -144303c3 -00000000 -3c0854bb -3508fd22 -3c096a96 -3529d77c -3c037ebf -3463ff7e -01091025 -144303ba -00000000 -3c080fd0 -35084100 -3c09fabd -3529bef4 -3c03fffd -3463fff4 -01091025 -144303b1 -00000000 -3c08b2ec -35082940 -3c0902af -35296f40 -3c03b2ef -34636f40 -01091025 -144303a8 -00000000 -3c08064a -3508ea18 -3c0975c7 -35297690 -3c0377cf -3463fe98 -01091025 -1443039f -00000000 -3c08f64b -3508b53a -3c0929e0 -3529e4bc -3c03ffeb -3463f5be -01091025 -14430396 -00000000 -3c08798c -3508d730 -3c09e1b2 -35297640 -3c03f9be -3463f770 -01091025 -1443038d -00000000 -3c08dc93 -3508f5a0 -3c099339 -3529734c -3c03dfbb -3463f7ec -01091025 -14430384 -00000000 -3c084f6b -3508fc88 -3c098661 -3529709a -3c03cf6b -3463fc9a -01091025 -1443037b -00000000 -3c08f5c6 -3508cf24 -3c099503 -3529cff8 -3c03f5c7 -3463cffc -01091025 -14430372 -00000000 -3c0874e8 -3508eb50 -3c09a935 -3529c81a -3c03fdfd -3463eb5a -01091025 -14430369 -00000000 -3c087035 -35089bfe -3c09daab -3529921c -3c03fabf -34639bfe -01091025 -14430360 -00000000 -3c0851b5 -350875f8 -3c0986e5 -352994f8 -3c03d7f5 -3463f5f8 -01091025 -14430357 -00000000 -3c089aff -35082c00 -3c099d61 -3529b0b8 -3c039fff -3463bcb8 -01091025 -1443034e -00000000 -3c086940 -3508a810 -3c0990d5 -3529f27d -3c03f9d5 -3463fa7d -01091025 -14430345 -00000000 -3c087c96 -35084a84 -3c0933a6 -35293a20 -3c037fb6 -34637aa4 -01091025 -1443033c -00000000 -3c087ca8 -3508a820 -3c0947a3 -3529f067 -3c037fab -3463f867 -01091025 -14430333 -00000000 -3c0847e3 -35087c74 -3c093bae -35297420 -3c037fef -34637c74 -01091025 -1443032a -00000000 -3c082ace -35080d52 -24090000 -3c032ace -34630d52 -01091025 -14430322 -00000000 -3c08c7d6 -3508b540 -24090000 -3c03c7d6 -3463b540 -01091025 -1443031a -00000000 -3c08297a -350886a0 -24090000 -3c03297a -346386a0 -01091025 -14430312 -00000000 -3c08bb35 -3508e180 -24090000 -3c03bb35 -3463e180 -01091025 -1443030a -00000000 -3c083cff -350898b0 -24090000 -3c033cff -346398b0 -01091025 -14430302 -00000000 -3c080549 -3508cf7c -24090000 -3c030549 -3463cf7c -01091025 -144302fa -00000000 -3c08b901 -35081280 -24090000 -3c03b901 -34631280 -01091025 -144302f2 -00000000 -3c0802a8 -350823d8 -24090000 -3c0302a8 -346323d8 -01091025 -144302ea -00000000 -3c08c21e -35083f78 -24090000 -3c03c21e -34633f78 -01091025 -144302e2 -00000000 -3c086499 -350881c3 -24090000 -3c036499 -346381c3 -01091025 -144302da -00000000 -3c086129 -35088b3e -24090000 -3c036129 -34638b3e -01091025 -144302d2 -00000000 -3c08f1bc -3508a7d5 -24090000 -3c03f1bc -3463a7d5 -01091025 -144302ca -00000000 -3c0895ca -350882c2 -24090000 -3c0395ca -346382c2 -01091025 -144302c2 -00000000 -3c08e66d -35085ef8 -24090000 -3c03e66d -34635ef8 -01091025 -144302ba -00000000 -3c084ade -350853ec -24090000 -3c034ade -346353ec -01091025 -144302b2 -00000000 -3c087657 -35083eaa -24090000 -3c037657 -34633eaa -01091025 -144302aa -00000000 -3c08b1eb -35088732 -24090000 -3c03b1eb -34638732 -01091025 -144302a2 -00000000 -3c08e5fc -3508ea30 -24090000 -3c03e5fc -3463ea30 -01091025 -1443029a -00000000 -3c084476 -350880de -24090000 -3c034476 -346380de -01091025 -14430292 -00000000 -3c08b68a -35085d00 -24090000 -3c03b68a -34635d00 -01091025 -1443028a -00000000 -3c085594 -3508dab0 -24090000 -3c035594 -3463dab0 -01091025 -14430282 -00000000 -3c08b628 -3508f368 -24090000 -3c03b628 -3463f368 -01091025 -1443027a -00000000 -3c0805a8 -350824c6 -24090000 -3c0305a8 -346324c6 -01091025 -14430272 -00000000 -3c085ecb -3508e5d6 -24090000 -3c035ecb -3463e5d6 -01091025 -1443026a -00000000 -3c0886ec -3508793c -24090000 -3c0386ec -3463793c -01091025 -14430262 -00000000 -3c08c190 -3508a088 -24090000 -3c03c190 -3463a088 -01091025 -1443025a -00000000 -3c0885a6 -35085990 -24090000 -3c0385a6 -34635990 -01091025 -14430252 -00000000 -3c088780 -3508e64f -24090000 -3c038780 -3463e64f -01091025 -1443024a -00000000 -3c082a03 -35088100 -24090000 -3c032a03 -34638100 -01091025 -14430242 -00000000 -3c08ebc4 -35081cb0 -24090000 -3c03ebc4 -34631cb0 -01091025 -1443023a -00000000 -3c0827e9 -35080bc3 -24090000 -3c0327e9 -34630bc3 -01091025 -14430232 -00000000 -3c08cd10 -3508459c -24090000 -3c03cd10 -3463459c -01091025 -1443022a -00000000 -3c08df3b -3508a4c0 -24090000 -3c03df3b -3463a4c0 -01091025 -14430222 -00000000 -3c083e25 -35089f78 -24090000 -3c033e25 -34639f78 -01091025 -1443021a -00000000 -3c081c9d -3508c120 -24090000 -3c031c9d -3463c120 -01091025 -14430212 -00000000 -3c089bf9 -3508a092 -24090000 -3c039bf9 -3463a092 -01091025 -1443020a -00000000 -3c089ebb -350865e4 -24090000 -3c039ebb -346365e4 -01091025 -14430202 -00000000 -3c08f4da -35087282 -24090000 -3c03f4da -34637282 -01091025 -144301fa -00000000 -3c08c5a9 -3508dcfc -24090000 -3c03c5a9 -3463dcfc -01091025 -144301f2 -00000000 -3c0826b4 -350838e8 -24090000 -3c0326b4 -346338e8 -01091025 -144301ea -00000000 -3c08249d -3508f131 -24090000 -3c03249d -3463f131 -01091025 -144301e2 -00000000 -3c08c302 -35085ef2 -24090000 -3c03c302 -34635ef2 -01091025 -144301da -00000000 -3c08ec12 -3508fb80 -24090000 -3c03ec12 -3463fb80 -01091025 -144301d2 -00000000 -3c083f11 -350857c0 -24090000 -3c033f11 -346357c0 -01091025 -144301ca -00000000 -3c08393b -3508ea60 -24090000 -3c03393b -3463ea60 -01091025 -144301c2 -00000000 -3c080bbf -3508d440 -24090000 -3c030bbf -3463d440 -01091025 -144301ba -00000000 -3c08ca64 -3508cbf4 -24090000 -3c03ca64 -3463cbf4 -01091025 -144301b2 -00000000 -3c083f9d -350807d8 -24090000 -3c033f9d -346307d8 -01091025 -144301aa -00000000 -3c08dc25 -3508bfc0 -24090000 -3c03dc25 -3463bfc0 -01091025 -144301a2 -00000000 -3c08e3cf -35082eac -24090000 -3c03e3cf -34632eac -01091025 -1443019a -00000000 -24080000 -3c099ba8 -35296780 -3c039ba8 -34636780 -01091025 -14430192 -00000000 -24080000 -3c093b31 -3529cb30 -3c033b31 -3463cb30 -01091025 -1443018a -00000000 -24080000 -3c090d07 -35292a80 -3c030d07 -34632a80 -01091025 -14430182 -00000000 -24080000 -3c09f561 -3529aaf4 -3c03f561 -3463aaf4 -01091025 -1443017a -00000000 -24080000 -3c09d112 -352946d0 -3c03d112 -346346d0 -01091025 -14430172 -00000000 -24080000 -3c09cd5a -352989a0 -3c03cd5a -346389a0 -01091025 -1443016a -00000000 -24080000 -3c09040b -35297cd3 -3c03040b -34637cd3 -01091025 -14430162 -00000000 -24080000 -3c09e6c3 -3529a3a0 -3c03e6c3 -3463a3a0 -01091025 -1443015a -00000000 -24080000 -3c09a4cf -3529ec40 -3c03a4cf -3463ec40 -01091025 -14430152 -00000000 -24080000 -3c0970b9 -352955fc -3c0370b9 -346355fc -01091025 -1443014a -00000000 -24080000 -3c099548 -3529afc8 -3c039548 -3463afc8 -01091025 -14430142 -00000000 -24080000 -3c0990f9 -35296c1c -3c0390f9 -34636c1c -01091025 -1443013a -00000000 -24080000 -3c09141b -3529a508 -3c03141b -3463a508 -01091025 -14430132 -00000000 -24080000 -3c09a31c -35297dd4 -3c03a31c -34637dd4 -01091025 -1443012a -00000000 -24080000 -3c09dea3 -35291510 -3c03dea3 -34631510 -01091025 -14430122 -00000000 -24080000 -3c09427b -3529dff8 -3c03427b -3463dff8 -01091025 -1443011a -00000000 -24080000 -3c095539 -35294930 -3c035539 -34634930 -01091025 -14430112 -00000000 -24080000 -3c09af98 -35290b62 -3c03af98 -34630b62 -01091025 -1443010a -00000000 -24080000 -3c097a39 -35295780 -3c037a39 -34635780 -01091025 -14430102 -00000000 -24080000 -3c09678f -3529a33c -3c03678f -3463a33c -01091025 -144300fa -00000000 -24080000 -3c09e770 -352988a8 -3c03e770 -346388a8 -01091025 -144300f2 -00000000 -24080000 -3c09b19e -35293821 -3c03b19e -34633821 -01091025 -144300ea -00000000 -24080000 -3c09df10 -35291522 -3c03df10 -34631522 -01091025 -144300e2 -00000000 -24080000 -3c0910f4 -35299ef0 -3c0310f4 -34639ef0 -01091025 -144300da -00000000 -24080000 -3c097364 -3529415a -3c037364 -3463415a -01091025 -144300d2 -00000000 -24080000 -3c09d5e6 -35297d80 -3c03d5e6 -34637d80 -01091025 -144300ca -00000000 -24080000 -3c09aed2 -35292fda -3c03aed2 -34632fda -01091025 -144300c2 -00000000 -24080000 -3c09d248 -352919fa -3c03d248 -346319fa -01091025 -144300ba -00000000 -24080000 -3c09ba95 -352902a7 -3c03ba95 -346302a7 -01091025 -144300b2 -00000000 -24080000 -3c09e877 -352913b8 -3c03e877 -346313b8 -01091025 -144300aa -00000000 -24080000 -3c09027e -3529d0e6 -3c03027e -3463d0e6 -01091025 -144300a2 -00000000 -24080000 -3c09b9d5 -35293134 -3c03b9d5 -34633134 -01091025 -1443009a -00000000 -24080000 -3c09c9c0 -3529776a -3c03c9c0 -3463776a -01091025 -14430092 -00000000 -24080000 -3c094cc8 -35292840 -3c034cc8 -34632840 -01091025 -1443008a -00000000 -24080000 -3c095a59 -35296fc0 -3c035a59 -34636fc0 -01091025 -14430082 -00000000 -24080000 -3c09be7a -35290130 -3c03be7a -34630130 -01091025 -1443007a -00000000 -24080000 -3c09fb87 -35291612 -3c03fb87 -34631612 -01091025 -14430072 -00000000 -24080000 -3c09a88d -35295966 -3c03a88d -34635966 -01091025 -1443006a -00000000 -24080000 -3c09e30d -35295408 -3c03e30d -34635408 -01091025 -14430062 -00000000 -24080000 -3c09247b -3529c054 -3c03247b -3463c054 -01091025 -1443005a -00000000 -24080000 -3c09be49 -35292860 -3c03be49 -34632860 -01091025 -14430052 -00000000 -24080000 -3c094e0f -3529a84c -3c034e0f -3463a84c -01091025 -1443004a -00000000 -24080000 -3c092c3d -35290ff8 -3c032c3d -34630ff8 -01091025 -14430042 -00000000 -24080000 -3c096632 -35297d80 -3c036632 -34637d80 -01091025 -1443003a -00000000 -24080000 -3c099e5d -352996bb -3c039e5d -346396bb -01091025 -14430032 -00000000 -24080000 -3c09bb43 -352901d1 -3c03bb43 -346301d1 -01091025 -1443002a -00000000 -24080000 -3c098a12 -35296074 -3c038a12 -34636074 -01091025 -14430022 -00000000 -24080000 -3c090734 -3529f91e -3c030734 -3463f91e -01091025 -1443001a -00000000 -24080000 -3c098ad8 -3529c75c -3c038ad8 -3463c75c -01091025 -14430012 -00000000 -24080000 -3c09c82d -3529f286 -3c03c82d -3463f286 -01091025 -1443000a -00000000 -24080000 -24090000 -24030000 -01091025 -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -00000000 -03e0b021 -26100001 -3c08800d -40805800 -3c170040 -40976000 -00000000 -24120001 -3c170001 -ad120000 -3c14bfc7 -2694c9a0 -041100af -0000000c -165700ad -00000000 -24120001 -3c14bfc7 -2694c9bc -051100a8 -0000000c -165700a6 -00000000 -24120002 -3c170002 -ad120000 -3c14bfc7 -2694c9e0 -0411009f -0000000d -1657009d -00000000 -24120002 -3c14bfc7 -2694c9fc -05110098 -0000000d -16570096 -00000000 -24120003 -3c170003 -ad120000 -3c14bfc7 -2694ca30 -3c04ba03 -34844f60 -3c05b615 -34a5fd67 -0411008b -0085b820 -16570089 -00000000 -24120003 -3c14bfc7 -2694ca4c -05110084 -0085b820 -ad170000 -16570081 -00000000 -24120003 -ad120000 -3c14bfc7 -2694ca78 -3c047fff -3484c19e -04110079 -20976512 -16570077 -00000000 -24120003 -3c14bfc7 -2694ca94 -05110072 -20976512 -16570070 -00000000 -24120003 -3c14bfc7 -2694cac0 -3c04a85e -34847d00 -3c056b7e -34a58e36 -04110067 -0085b822 -16570065 -00000000 -24120003 -3c14bfc7 -2694cadc -05110060 -0085b822 -1657005e -00000000 -24120004 -3c170004 -ad120000 -3c14bfc7 -2694cb00 -04110057 -8d170002 -16570055 -00000000 -24120004 -3c14bfc7 -2694cb1c -05110050 -8d170002 -1657004e -00000000 -24120004 -3c14bfc7 -2694cb38 -04110049 -85170001 -02f2001b -16570046 -00000000 -24120004 -3c14bfc7 -2694cb58 -05110041 -85170001 -1657003f -00000000 -3c14bfc7 -2694cb70 -0411003b -95170003 -16570039 -00000000 -24120004 -3c14bfc7 -2694cb8c -05110034 -95170003 -16570032 -00000000 -24120005 -3c170005 -ad120000 -3c14bfc7 -2694cbb0 -0411002b -ad170002 -16570029 -00000000 -24120005 -3c14bfc7 -2694cbcc -05110024 -ad170002 -16570022 -00000000 -24120005 -3c14bfc7 -2694cbe8 -0411001d -a5170001 -1657001b -00000000 -24120005 -3c14bfc7 -2694cc04 -05110016 -a5170001 -16570014 -00000000 -24120007 -3c170007 -ad120000 -3c14bfc7 -2694cc28 -0411000d -9e3c56aa -02f20018 -1657000a -00000000 -24120007 -3c14bfc7 -2694cc4c -02f20018 -05110004 -ec1ba960 -16570002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -02c0f821 -03e00008 -00000000 -00000000 -00000000 -26100001 -3c08800d -40805800 -3c170040 -40976000 -00000000 -24120001 -3c170001 -ad120000 -3c14bfc7 -2694ccac -140000af -0000000c -165700ad -00000000 -24120001 -3c14bfc7 -2694ccc8 -150000a8 -0000000c -165700a6 -00000000 -24120002 -3c170002 -ad120000 -3c14bfc7 -2694ccec -1400009f -0000000d -1657009d -00000000 -24120002 -3c14bfc7 -2694cd08 -15000098 -0000000d -16570096 -00000000 -24120003 -3c170003 -ad120000 -3c14bfc7 -2694cd3c -3c04ba03 -34844f60 -3c05b615 -34a5fd67 -1400008b -0085b820 -16570089 -00000000 -24120003 -3c14bfc7 -2694cd58 -15000084 -0085b820 -16570082 -00000000 -24120003 -3c14bfc7 -2694cd7c -3c047fff -3484c19e -1400007b -20976512 -16570079 -00000000 -24120003 -3c14bfc7 -2694cd98 -15000074 -20976512 -16570072 -00000000 -24120003 -3c14bfc7 -2694cdc4 -3c04a85e -34847d00 -3c056b7e -34a58e36 -14000069 -0085b822 -16570067 -00000000 -24120003 -3c14bfc7 -2694cde0 -15000062 -0085b822 -16570060 -00000000 -24120004 -3c170004 -ad120000 -3c14bfc7 -2694ce04 -14000059 -8d170002 -ad170000 -16570056 -00000000 -24120004 -ad120000 -3c14bfc7 -2694ce28 -15000050 -8d170002 -1657004e -00000000 -24120004 -3c14bfc7 -2694ce44 -14000049 -85170001 -16570047 -00000000 -24120004 -3c14bfc7 -2694ce60 -15000042 -85170001 -16570040 -00000000 -3c14bfc7 -2694ce78 -1400003c -95170003 -1657003a -00000000 -24120004 -3c14bfc7 -2694ce94 -15000035 -95170003 -16570033 -00000000 -24120005 -3c170005 -ad120000 -3c14bfc7 -2694ceb8 -1400002c -ad170002 -02f2001b -16570029 -00000000 -24120005 -3c14bfc7 -2694ced8 -15000024 -ad170002 -16570022 -00000000 -24120005 -3c14bfc7 -2694cef4 -1400001d -a5170001 -1657001b -00000000 -24120005 -3c14bfc7 -2694cf10 -15000016 -a5170001 -16570014 -00000000 -24120007 -3c170007 -ad120000 -3c14bfc7 -2694cf34 -1400000d -9e3c56aa -02f20018 -1657000a -00000000 -24120007 -3c14bfc7 -2694cf58 -02f20018 -15000004 -ec1ba960 -16570002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -24120000 -3c084c23 -3508cdd4 -24034c80 -31025e89 -144306d9 -00000000 -3c08a128 -35086600 -24030000 -310208aa -144306d3 -00000000 -3c08ea42 -3508f8c0 -34038800 -31028d3e -144306cd -00000000 -3c08fbbe -3508a379 -34038250 -31029654 -144306c7 -00000000 -3c08701f -3508f540 -24036000 -3102601f -144306c1 -00000000 -3c08509b -35088bd4 -34038914 -3102fd3c -144306bb -00000000 -3c087f92 -3508d195 -24030180 -310207a0 -144306b5 -00000000 -3c082e27 -35083e78 -24031658 -3102175e -144306af -00000000 -3c08866d -3508cbc0 -3403c840 -3102c84c -144306a9 -00000000 -3c08d0b3 -35085788 -24034200 -31026224 -144306a3 -00000000 -3c0805d1 -350843e2 -24030362 -3102b37a -1443069d -00000000 -3c087287 -3508ec60 -24030c20 -31021e2e -14430697 -00000000 -3c080eea -3508b150 -34038140 -3102c349 -14430691 -00000000 -3c082a3a -35089780 -34039180 -3102d980 -1443068b -00000000 -3c082b7f -35088e00 -24030600 -310206e9 -14430685 -00000000 -3c081e9a -3508e240 -24034000 -31025505 -1443067f -00000000 -3c082a4c -35084ce3 -24034c80 -3102df84 -14430679 -00000000 -3c0803f6 -3508e344 -3403c000 -3102c020 -14430673 -00000000 -3c08ff64 -3508c5dd -24034550 -31025d50 -1443066d -00000000 -3c08aa1c -3508c200 -34038200 -31028ee3 -14430667 -00000000 -3c086241 -3508b174 -34038170 -31028170 -14430661 -00000000 -3c0875d3 -350868ca -24036002 -3102e336 -1443065b -00000000 -3c0896b1 -35088fd2 -34038d40 -3102dd40 -14430655 -00000000 -3c08a174 -3508a3c8 -24030100 -31025936 -1443064f -00000000 -3c083295 -350875a8 -24031120 -31021160 -14430649 -00000000 -3c08c441 -35085b00 -24030b00 -31028b5d -14430643 -00000000 -3c085572 -350828b0 -24030800 -31020a48 -1443063d -00000000 -3c08c9e3 -35086fbc -24036a34 -31026a35 -14430637 -00000000 -3c086f8b -3508c9dd -34038845 -3102ae65 -14430631 -00000000 -3c08e2b0 -350858c0 -240318c0 -3102bcc0 -1443062b -00000000 -3c0871f1 -3508c140 -24030100 -3102219c -14430625 -00000000 -3c08e082 -35087181 -24037080 -3102fca6 -1443061f -00000000 -3c080abf -3508f996 -34038880 -310288c9 -14430619 -00000000 -3c08b8ae -3508d1b6 -24035136 -3102517f -14430613 -00000000 -3c084d92 -3508ee9e -3403c68e -3102c7ce -1443060d -00000000 -3c088d2a -35087020 -24030020 -310201a6 -14430607 -00000000 -3c08f21a -3508fb20 -24030020 -31020470 -14430601 -00000000 -3c0809bc -35088058 -24030048 -310262c8 -144305fb -00000000 -3c08941a -35085f1d -2403021c -3102a21c -144305f5 -00000000 -3c085d2c -3508e596 -24036100 -31026941 -144305ef -00000000 -3c08237e -3508e620 -3403e400 -3102f505 -144305e9 -00000000 -3c08a82b -350838f0 -24032870 -3102ab7a -144305e3 -00000000 -3c0811bd -3508cf7c -34038908 -31028908 -144305dd -00000000 -3c0869f1 -35084ac2 -24030a40 -31022a6d -144305d7 -00000000 -3c08dd27 -3508baac -3403b220 -3102b320 -144305d1 -00000000 -3c08e39e -35089284 -24030004 -31022176 -144305cb -00000000 -3c08ed94 -35088c28 -24030c28 -31024c6a -144305c5 -00000000 -3c088f4f -3508a6a8 -3403a480 -3102e4c0 -144305bf -00000000 -3c08c9bb -35084800 -24034800 -3102ffac -144305b9 -00000000 -3c08acb5 -3508fb96 -3403d200 -3102d600 -144305b3 -00000000 -3c08df6e -350823d5 -24030310 -3102df38 -144305ad -00000000 -3c08c105 -350825c0 -24030580 -310215ab -144305a7 -00000000 -3c085add -3508c038 -24030008 -3102258d -144305a1 -00000000 -3c08be1b -3508c16c -34038004 -31028807 -1443059b -00000000 -3c08c2f2 -3508f240 -24034240 -31024648 -14430595 -00000000 -3c08e62d -3508324d -24030245 -31020747 -1443058f -00000000 -3c08f85c -35081eac -24031e04 -3102fe17 -14430589 -00000000 -3c082ad1 -3508aed8 -340382c0 -3102c2c4 -14430583 -00000000 -3c08ff7f -3508abc4 -24032a84 -31023eb4 -1443057d -00000000 -3c089585 -3508f1d2 -3403d040 -3102d660 -14430577 -00000000 -3c085a20 -35082319 -24030200 -3102da24 -14430571 -00000000 -3c087f2c -3508baf0 -24030aa0 -31020fa0 -1443056b -00000000 -3c08f8c8 -3508d908 -24034808 -31024eea -14430565 -00000000 -3c0888b9 -35089343 -34039240 -3102dae0 -1443055f -00000000 -3c08acea -3508571a -2403500a -3102f06b -14430559 -00000000 -3c088eec -350893f0 -34038050 -3102cc59 -14430553 -00000000 -3c088dae -3508e7e0 -24030340 -31020b40 -1443054d -00000000 -3c08c328 -3508f184 -3403d000 -3102da22 -14430547 -00000000 -3c0846d2 -3508c0cb -240340cb -310275db -14430541 -00000000 -3c08ffa4 -3508e240 -3403c000 -3102c88e -1443053b -00000000 -3c08d9c1 -350833b8 -24032088 -31026c88 -14430535 -00000000 -3c0850b2 -350876c0 -24037640 -3102f64c -1443052f -00000000 -3c088f87 -35081660 -24031260 -3102b27c -14430529 -00000000 -3c085d4b -35080f1b -24030710 -31025774 -14430523 -00000000 -3c08e187 -35081463 -24031000 -31029b00 -1443051d -00000000 -3c088863 -350867fc -24030538 -31021539 -14430517 -00000000 -3c08da10 -3508c9e1 -24030000 -31021010 -14430511 -00000000 -3c08d756 -3508e5a8 -3403a0a8 -3102b8ea -1443050b -00000000 -3c083037 -350876a0 -240364a0 -310265b9 -14430505 -00000000 -3c08679f -35083538 -24031430 -31025c36 -144304ff -00000000 -3c083cab -3508a000 -3403a000 -3102f42b -144304f9 -00000000 -3c089c3a -35082af6 -24030072 -3102947a -144304f3 -00000000 -3c083e11 -35080120 -24030120 -31020933 -144304ed -00000000 -3c085b44 -35084b50 -24034350 -310253fd -144304e7 -00000000 -3c087bc8 -35083792 -24030582 -31024dca -144304e1 -00000000 -3c0870f5 -35082ba0 -240302a0 -310246ae -144304db -00000000 -3c0882e0 -3508e700 -24030500 -31021df4 -144304d5 -00000000 -3c08a4c4 -35087db6 -24037112 -3102f31a -144304cf -00000000 -3c08ae6b -350872c9 -24030200 -31020704 -144304c9 -00000000 -3c083193 -35082830 -24030830 -31020cfa -144304c3 -00000000 -3c085f3d -3508333a -24030130 -310205f0 -144304bd -00000000 -3c08fd89 -35087e9e -24035484 -3102d584 -144304b7 -00000000 -3c08c95c -3508d808 -34039808 -3102be7d -144304b1 -00000000 -3c08ed80 -3508b6cb -3403b4c8 -3102b4f8 -144304ab -00000000 -3c0813ad -35085f46 -24030302 -3102a3ba -144304a5 -00000000 -3c08ddca -350889b0 -34038130 -3102c17d -1443049f -00000000 -3c080056 -3508f828 -3403a820 -3102ac60 -14430499 -00000000 -3c089da4 -350864e2 -24030420 -31028528 -14430493 -00000000 -3c086bd8 -35088840 -24030000 -3102552d -1443048d -00000000 -3c083078 -35082928 -24030800 -31025a82 -14430487 -00000000 -3c08d760 -3508f054 -34039054 -310292d4 -14430481 -00000000 -3c084592 -35087f80 -24034080 -3102c0af -1443047b -00000000 -3c08d3b7 -35080800 -24030800 -31020863 -14430475 -00000000 -3c08a4ff -35084a18 -24034a18 -31026f1e -1443046f -00000000 -3c085713 -3508fefe -3403860e -3102870e -14430469 -00000000 -3c08c7cd -3508d321 -24034300 -31026f46 -14430463 -00000000 -3c0874b8 -350899e4 -240300a0 -310202b0 -1443045d -00000000 -3c081c09 -35088ec0 -34038480 -3102a488 -14430457 -00000000 -3c0821b0 -350811c0 -24030180 -3102a1b3 -14430451 -00000000 -3c089fa6 -35089f68 -34039220 -3102d230 -1443044b -00000000 -3c087f3c -35084c95 -24030c04 -31022e4c -14430445 -00000000 -3c08004c -35089682 -24031280 -31021bc0 -1443043f -00000000 -3c08e36c -3508870c -34038304 -3102e354 -14430439 -00000000 -3c08b158 -3508d481 -24031480 -31023cd0 -14430433 -00000000 -3c08c926 -35085040 -24035000 -3102f124 -1443042d -00000000 -3c08a9ee -3508ef7b -34038a73 -31028af3 -14430427 -00000000 -3c08bd9c -350832aa -24033280 -3102fb85 -14430421 -00000000 -3c08d146 -3508e020 -24034000 -31025219 -1443041b -00000000 -3c08ec63 -3508fefa -24032a02 -31022a02 -14430415 -00000000 -3c08aad9 -3508a6e2 -3403a660 -3102ee60 -1443040f -00000000 -3c083813 -350872fc -24033034 -31023834 -14430409 -00000000 -3c08a2ef -35085b64 -24034b64 -3102ef65 -14430403 -00000000 -3c08e62e -3508bb8c -34039304 -31029347 -144303fd -00000000 -3c081ac0 -3508fd8d -34038400 -31028670 -144303f7 -00000000 -3c08e8ee -35081820 -24030820 -3102ad68 -144303f1 -00000000 -3c08c7c7 -350823dc -240303c4 -310293e5 -144303eb -00000000 -3c086b02 -35087aaa -24034a28 -31024f68 -144303e5 -00000000 -3c080fce -35080850 -24030010 -3102243a -144303df -00000000 -3c0885d8 -350852f8 -24034280 -3102ce83 -144303d9 -00000000 -3c087049 -350886dc -240306c8 -31022eea -144303d3 -00000000 -3c080d4d -35089452 -34039450 -3102b4fc -144303cd -00000000 -3c089afb -35080dcd -24030000 -31021020 -144303c7 -00000000 -3c08396a -350858de -24031888 -31023e88 -144303c1 -00000000 -3c08bb4a -3508d310 -24035210 -31025276 -144303bb -00000000 -3c0894b8 -350896ba -340382aa -3102ebeb -144303b5 -00000000 -3c08d8ee -35082d71 -24032d60 -3102afec -144303af -00000000 -3c08c079 -35088d00 -24030100 -31024390 -144303a9 -00000000 -3c08ea32 -35085e48 -24035000 -3102d1b4 -144303a3 -00000000 -3c082bac -35084149 -24030000 -31023a30 -1443039d -00000000 -3c08377d -35084040 -24030040 -31028ecc -14430397 -00000000 -3c08cdf6 -35082f00 -24032500 -3102b508 -14430391 -00000000 -3c0815c1 -3508c13e -2403402c -3102646c -1443038b -00000000 -3c08babb -35085e27 -24031c06 -31021d0e -14430385 -00000000 -3c0804d9 -350831c0 -240310c0 -31021adc -1443037f -00000000 -3c084942 -35086dd4 -24036d14 -31027d1e -14430379 -00000000 -3c086f24 -3508aeec -3403a888 -3102f88b -14430373 -00000000 -3c08a5f5 -3508f200 -24037200 -310276b8 -1443036d -00000000 -3c082582 -35086e76 -24036254 -310273d5 -14430367 -00000000 -3c08eddc -3508d8ec -3403d028 -3102f43a -14430361 -00000000 -3c080007 -3508e4e4 -3403e464 -3102e474 -1443035b -00000000 -3c0862b8 -3508ba1c -34038810 -310289d0 -14430355 -00000000 -3c08cc5c -350834c4 -240304c4 -3102cfce -1443034f -00000000 -3c08eb34 -35082068 -24030020 -3102c734 -14430349 -00000000 -3c08c2ca -3508db00 -34038200 -310282b1 -14430343 -00000000 -3c08f168 -3508f07c -2403304c -31023e4f -1443033d -00000000 -3c08b7df -3508c700 -34038400 -3102ac0f -14430337 -00000000 -3c087dcb -3508a54c -34038000 -3102d200 -14430331 -00000000 -3c0898a8 -3508a1b0 -3403a190 -3102f1d2 -1443032b -00000000 -3c08be67 -35086615 -24034014 -3102d896 -14430325 -00000000 -3c080e2d -35080dac -2403090c -31022b1e -1443031f -00000000 -3c08ef28 -3508f600 -3403e400 -3102e500 -14430319 -00000000 -3c08cd0d -3508570c -24030208 -31020a1a -14430313 -00000000 -3c08ec25 -35084b7a -24030800 -31028804 -1443030d -00000000 -3c083e31 -3508b970 -24030000 -3102408e -14430307 -00000000 -3c081e92 -35083138 -24032128 -3102636d -14430301 -00000000 -3c081853 -3508113b -24030112 -3102c1d6 -144302fb -00000000 -3c0838ec -35080c00 -24030800 -3102f89b -144302f5 -00000000 -3c0890df -3508c0f4 -3403c080 -3102e980 -144302ef -00000000 -3c08f0f2 -3508863c -34038218 -3102fbd9 -144302e9 -00000000 -3c085893 -350805c8 -24030548 -31024748 -144302e3 -00000000 -3c08cb3b -350843b8 -240303b8 -31023bb8 -144302dd -00000000 -3c084fdf -3508a51c -24030408 -31024eab -144302d7 -00000000 -3c08ac86 -3508fbe0 -24030960 -31020972 -144302d1 -00000000 -3c086247 -35084c80 -24030800 -31020b5a -144302cb -00000000 -3c08fef5 -35087efc -24036c98 -3102ed98 -144302c5 -00000000 -3c0862e5 -35083c80 -24030c00 -31028d5c -144302bf -00000000 -3c08297f -35087040 -24030000 -31028e8f -144302b9 -00000000 -3c08bdd8 -35081cc1 -24030081 -3102e399 -144302b3 -00000000 -3c08a6cd -350825d9 -24032448 -31022e4c -144302ad -00000000 -3c081a63 -35088e63 -34038402 -3102958a -144302a7 -00000000 -3c088dc0 -3508afec -340384e0 -310284f0 -144302a1 -00000000 -3c086bae -3508246e -24032060 -3102b060 -1443029b -00000000 -3c083cfa -3508ff80 -24032700 -3102275b -14430295 -00000000 -3c085695 -35087cf1 -24030850 -3102085c -1443028f -00000000 -3c08ab39 -35089314 -34038014 -3102c874 -14430289 -00000000 -3c08bb5c -35086f4a -2403220a -3102228f -14430283 -00000000 -3c0889e8 -35084318 -24034210 -3102cef4 -1443027d -00000000 -3c08dcb8 -35088a10 -34038810 -3102d9dc -14430277 -00000000 -3c089c17 -35088075 -24030075 -310202ff -14430271 -00000000 -3c08703d -3508ef20 -24032200 -31022201 -1443026b -00000000 -3c08525f -35081bc4 -24031b40 -3102ff42 -14430265 -00000000 -3c0840e4 -35085ee8 -24031868 -3102387d -1443025f -00000000 -3c08fd12 -3508c8b8 -24030838 -31023e3d -14430259 -00000000 -3c088dd3 -35084660 -24034620 -3102e6b9 -14430253 -00000000 -3c082d89 -35089331 -24030200 -310202c0 -1443024d -00000000 -3c08c380 -3508bae0 -240318c0 -31021ccf -14430247 -00000000 -3c086901 -3508f8aa -3403d0aa -3102d7be -14430241 -00000000 -3c08195e -35085c70 -24035000 -3102d28c -1443023b -00000000 -3c08045d -35080d20 -24030920 -3102197d -14430235 -00000000 -3c085852 -35083014 -24032010 -31026d72 -1443022f -00000000 -3c084593 -3508277c -24030000 -31020000 -14430229 -00000000 -3c0849b1 -3508cc7b -24030000 -31020000 -14430223 -00000000 -3c08f03f -35087e70 -24030000 -31020000 -1443021d -00000000 -3c0843ea -3508e8f0 -24030000 -31020000 -14430217 -00000000 -3c08c5a8 -35082940 -24030000 -31020000 -14430211 -00000000 -3c08ac1f -350835a0 -24030000 -31020000 -1443020b -00000000 -3c08ac1b -35080623 -24030000 -31020000 -14430205 -00000000 -3c083abb -350876c0 -24030000 -31020000 -144301ff -00000000 -3c08cf6b -3508d3fc -24030000 -31020000 -144301f9 -00000000 -3c083b7f -350871f3 -24030000 -31020000 -144301f3 -00000000 -3c089fef -35081a7c -24030000 -31020000 -144301ed -00000000 -3c08b198 -35080f60 -24030000 -31020000 -144301e7 -00000000 -3c08135f -35083ae8 -24030000 -31020000 -144301e1 -00000000 -3c081638 -3508ddf6 -24030000 -31020000 -144301db -00000000 -3c08426d -35083664 -24030000 -31020000 -144301d5 -00000000 -3c08a164 -3508a7a3 -24030000 -31020000 -144301cf -00000000 -3c08af15 -35089c7a -24030000 -31020000 -144301c9 -00000000 -3c086895 -35080560 -24030000 -31020000 -144301c3 -00000000 -3c08840c -3508ef68 -24030000 -31020000 -144301bd -00000000 -3c0865a7 -35082314 -24030000 -31020000 -144301b7 -00000000 -3c084372 -3508c5c0 -24030000 -31020000 -144301b1 -00000000 -3c0880f3 -3508a836 -24030000 -31020000 -144301ab -00000000 -3c08c617 -350877fc -24030000 -31020000 -144301a5 -00000000 -3c08de35 -3508ed25 -24030000 -31020000 -1443019f -00000000 -3c0800f0 -3508ac7a -24030000 -31020000 -14430199 -00000000 -3c08b0de -350836a8 -24030000 -31020000 -14430193 -00000000 -3c0808f1 -35087adc -24030000 -31020000 -1443018d -00000000 -3c0815e1 -3508b69c -24030000 -31020000 -14430187 -00000000 -3c087b69 -350826c4 -24030000 -31020000 -14430181 -00000000 -3c08cc90 -3508f600 -24030000 -31020000 -1443017b -00000000 -3c0848c9 -3508e84b -24030000 -31020000 -14430175 -00000000 -3c08146f -3508da2e -24030000 -31020000 -1443016f -00000000 -3c08aade -35083180 -24030000 -31020000 -14430169 -00000000 -3c08a6d6 -3508f0f0 -24030000 -31020000 -14430163 -00000000 -3c081be7 -35086f70 -24030000 -31020000 -1443015d -00000000 -3c081f49 -3508becc -24030000 -31020000 -14430157 -00000000 -3c08587e -35081ec1 -24030000 -31020000 -14430151 -00000000 -3c083b1d -35080ec0 -24030000 -31020000 -1443014b -00000000 -3c08d3ac -3508c110 -24030000 -31020000 -14430145 -00000000 -3c08e925 -3508fd50 -24030000 -31020000 -1443013f -00000000 -3c08cf2b -35088c46 -24030000 -31020000 -14430139 -00000000 -3c08368c -35085db5 -24030000 -31020000 -14430133 -00000000 -3c0800af -3508f7c8 -24030000 -31020000 -1443012d -00000000 -3c083ce7 -35084c00 -24030000 -31020000 -14430127 -00000000 -3c083131 -35088f60 -24030000 -31020000 -14430121 -00000000 -3c081b68 -35084480 -24030000 -31020000 -1443011b -00000000 -3c08cfc9 -3508a7a8 -24030000 -31020000 -14430115 -00000000 -3c08f34f -35089e20 -24030000 -31020000 -1443010f -00000000 -3c081914 -3508123c -24030000 -31020000 -14430109 -00000000 -3c08daaa -3508e9aa -24030000 -31020000 -14430103 -00000000 -24080000 -24030000 -3102f73c -144300fe -00000000 -24080000 -24030000 -3102c186 -144300f9 -00000000 -24080000 -24030000 -31027b48 -144300f4 -00000000 -24080000 -24030000 -3102d5e0 -144300ef -00000000 -24080000 -24030000 -31025495 -144300ea -00000000 -24080000 -24030000 -3102bafc -144300e5 -00000000 -24080000 -24030000 -3102b130 -144300e0 -00000000 -24080000 -24030000 -31027965 -144300db -00000000 -24080000 -24030000 -3102e238 -144300d6 -00000000 -24080000 -24030000 -31029444 -144300d1 -00000000 -24080000 -24030000 -31022fc4 -144300cc -00000000 -24080000 -24030000 -3102a378 -144300c7 -00000000 -24080000 -24030000 -31021fa6 -144300c2 -00000000 -24080000 -24030000 -31025b9e -144300bd -00000000 -24080000 -24030000 -31029928 -144300b8 -00000000 -24080000 -24030000 -310233a0 -144300b3 -00000000 -24080000 -24030000 -31022f6d -144300ae -00000000 -24080000 -24030000 -3102a348 -144300a9 -00000000 -24080000 -24030000 -31026f00 -144300a4 -00000000 -24080000 -24030000 -31020900 -1443009f -00000000 -24080000 -24030000 -3102fba0 -1443009a -00000000 -24080000 -24030000 -3102d560 -14430095 -00000000 -24080000 -24030000 -31021099 -14430090 -00000000 -24080000 -24030000 -31025f98 -1443008b -00000000 -24080000 -24030000 -3102fd24 -14430086 -00000000 -24080000 -24030000 -3102e294 -14430081 -00000000 -24080000 -24030000 -310299c8 -1443007c -00000000 -24080000 -24030000 -3102f52f -14430077 -00000000 -24080000 -24030000 -310293e1 -14430072 -00000000 -24080000 -24030000 -310253c7 -1443006d -00000000 -24080000 -24030000 -31028718 -14430068 -00000000 -24080000 -24030000 -31029a98 -14430063 -00000000 -24080000 -24030000 -3102495e -1443005e -00000000 -24080000 -24030000 -310280d0 -14430059 -00000000 -24080000 -24030000 -31026cf5 -14430054 -00000000 -24080000 -24030000 -31026f38 -1443004f -00000000 -24080000 -24030000 -31029801 -1443004a -00000000 -24080000 -24030000 -31027d32 -14430045 -00000000 -24080000 -24030000 -31029e2c -14430040 -00000000 -24080000 -24030000 -310278b2 -1443003b -00000000 -24080000 -24030000 -31027028 -14430036 -00000000 -24080000 -24030000 -3102c013 -14430031 -00000000 -24080000 -24030000 -3102e000 -1443002c -00000000 -24080000 -24030000 -3102db02 -14430027 -00000000 -24080000 -24030000 -3102cb00 -14430022 -00000000 -24080000 -24030000 -3102ee05 -1443001d -00000000 -24080000 -24030000 -310224ca -14430018 -00000000 -24080000 -24030000 -310220b2 -14430013 -00000000 -24080000 -24030000 -31027bc7 -1443000e -00000000 -24080000 -24030000 -3102546b -14430009 -00000000 -24080000 -24030000 -31020000 -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -00000000 -26100001 -24120000 -3c084799 -35084e5e -3c038f32 -34639cbc -00081040 -14430760 -00000000 -3c08482a -3508c578 -3c03558a -3463f000 -00081240 -14430759 -00000000 -3c087419 -3508091a -3c03c848 -3463d000 -000812c0 -14430752 -00000000 -3c08ba65 -3508ad72 -3c03d32d -34636b90 -000810c0 -1443074b -00000000 -3c0850a5 -3508f780 -3c038000 -00081600 -14430745 -00000000 -3c08738d -35082871 -3c039438 -34638000 -000813c0 -1443073e -00000000 -3c08556f -3508af00 -3c03af00 -00081400 -14430738 -00000000 -3c083005 -350835d6 -3c030535 -3463d600 -00081200 -14430731 -00000000 -3c0824ec -35082590 -3c032761 -34632c80 -000810c0 -1443072a -00000000 -3c08e3cb -35083a58 -3c03b3a5 -34638000 -00081300 -14430723 -00000000 -3c08a20d -35080b10 -3c0341a1 -34636200 -00081140 -1443071c -00000000 -3c08263f -3508c560 -3c03c7f8 -3463ac00 -00081140 -14430715 -00000000 -3c08b15c -35089f10 -24030000 -00081700 -1443070f -00000000 -3c084e57 -35086df0 -24030000 -00081740 -14430709 -00000000 -3c087ada -35084d80 -3c03b693 -34636000 -00081180 -14430702 -00000000 -3c0877d3 -35080188 -3c031000 -00081640 -144306fc -00000000 -3c08fd9a -35088a90 -3c03d454 -34638000 -000812c0 -144306f5 -00000000 -3c08cb97 -35083890 -3c03cb9c -34634800 -000811c0 -144306ee -00000000 -3c08cdcf -3508b000 -24030000 -000815c0 -144306e8 -00000000 -3c08cc34 -35083782 -3c03bc10 -000814c0 -144306e2 -00000000 -3c08d78b -35087d00 -3c03df40 -00081380 -144306dc -00000000 -3c081a1f -350828ce -3c037ca3 -34633800 -00081280 -144306d5 -00000000 -3c089fb0 -3508c5f6 -3c035f60 -00081500 -144306cf -00000000 -3c08f700 -350858d0 -24030000 -00081780 -144306c9 -00000000 -3c083c0c -3508d7ae -3c035c00 -00081640 -144306c3 -00000000 -3c08f4ce -3508179a -3c03e179 -3463a000 -00081300 -144306bc -00000000 -3c08468e -35086b1c -24030000 -000817c0 -144306b6 -00000000 -3c08a665 -35086698 -3c035669 -34638000 -00081300 -144306af -00000000 -3c08d889 -3508922c -3c036226 -346348b0 -00081080 -144306a8 -00000000 -3c089f8e -350899f0 -3c034cf8 -000813c0 -144306a2 -00000000 -3c085ccc -3508150c -3c03a180 -00081540 -1443069c -00000000 -3c085a5c -35086a07 -3c030380 -000815c0 -14430696 -00000000 -3c083ef7 -35085672 -3c03ace4 -00081440 -14430690 -00000000 -3c08255c -350870dc -3c031b80 -00081540 -1443068a -00000000 -3c0804a7 -350888f0 -3c034780 -000814c0 -14430684 -00000000 -3c082f1f -35085840 -3c03b080 -00081440 -1443067e -00000000 -3c08d9ab -3508f1dc -3c03e000 -000816c0 -14430678 -00000000 -3c08aa27 -3508be82 -3c030400 -00081640 -14430672 -00000000 -3c089c5c -3508b278 -3c03c5cb -34632780 -00081100 -1443066b -00000000 -3c0857d2 -35085a38 -3c038000 -00081700 -14430665 -00000000 -3c084ffb -350893ec -3c037fdc -34639f60 -000810c0 -1443065e -00000000 -3c0867b9 -3508e2f0 -3c035e00 -00081540 -14430658 -00000000 -3c082589 -3508b408 -3c030200 -00081580 -14430652 -00000000 -3c089553 -35087c44 -3c0354df -34631100 -00081180 -1443064b -00000000 -3c0839c7 -3508673a -3c0339c7 -3463673a -00081000 -14430644 -00000000 -3c082d5c -35086ba0 -3c0371ae -34638000 -00081280 -1443063d -00000000 -3c08b69f -35086fd8 -3c03a7db -3463f600 -00081180 -14430636 -00000000 -3c08b231 -35081918 -3c033230 -00081440 -14430630 -00000000 -3c0804bf -35081faa -3c0325f8 -3463fd50 -000810c0 -14430629 -00000000 -3c08cf33 -3508ef3c -3c0399f7 -34639e00 -000811c0 -14430622 -00000000 -3c089b49 -350896d0 -3c03b400 -00081580 -1443061c -00000000 -3c0881df -35086b40 -3c0377da -3463d000 -00081180 -14430615 -00000000 -3c0898d7 -3508f1e0 -3c03c780 -00081480 -1443060f -00000000 -3c08dd6e -35083f61 -3c03b080 -000815c0 -14430609 -00000000 -3c0821b8 -3508b320 -24030000 -000816c0 -14430603 -00000000 -3c086e00 -350858d0 -3c038d00 -00081500 -144305fd -00000000 -3c08f616 -350800ce -3c03019c -00081440 -144305f7 -00000000 -3c085fcf -3508d000 -3c03f400 -00081380 -144305f1 -00000000 -3c08b0c1 -3508dae5 -3c039400 -00081680 -144305eb -00000000 -3c08e2ae -3508e250 -3c03b894 -00081380 -144305e5 -00000000 -3c08e407 -35084e50 -3c030e9c -3463a000 -00081240 -144305de -00000000 -3c08c87b -350886cc -24030000 -00081780 -144305d8 -00000000 -3c0839f6 -35081008 -3c032010 -00081440 -144305d2 -00000000 -3c0849ab -3508c3b8 -3c033b80 -00081500 -144305cc -00000000 -3c08a018 -3508b028 -3c030a00 -00081580 -144305c6 -00000000 -3c08f81f -3508909d -3c03fc84 -3463e800 -000812c0 -144305bf -00000000 -3c086219 -350815f0 -3c03915f -00081300 -144305b9 -00000000 -3c084327 -3508ab9b -3c033600 -00081640 -144305b3 -00000000 -3c08cc30 -35088445 -3c031842 -34632280 -000811c0 -144305ac -00000000 -3c088325 -350845e8 -3c034000 -000816c0 -144305a6 -00000000 -3c0875fd -35086110 -3c036110 -00081400 -144305a0 -00000000 -3c08d4a0 -35083837 -3c03a038 -34633700 -00081200 -14430599 -00000000 -3c081642 -3508c680 -3c03b216 -34633400 -000810c0 -14430592 -00000000 -3c08d106 -3508dc60 -3c03d106 -3463dc60 -00081000 -1443058b -00000000 -3c089f30 -35088277 -3c036104 -3463ee00 -00081240 -14430584 -00000000 -3c088013 -35085d28 -3c035000 -00081640 -1443057e -00000000 -3c08aae1 -3508e09a -3c031340 -00081540 -14430578 -00000000 -3c088c7c -3508ab1e -3c0363e5 -346358f0 -000810c0 -14430571 -00000000 -3c08b818 -3508b0e2 -3c038000 -00081780 -1443056b -00000000 -3c08e937 -3508b364 -3c03d26f -346366c8 -00081040 -14430564 -00000000 -3c088e14 -3508bef0 -3c0314be -3463f000 -00081200 -1443055d -00000000 -3c08fa55 -3508f471 -3c035f47 -34631000 -00081300 -14430556 -00000000 -3c08949f -3508f1c0 -3c03e380 -00081440 -14430550 -00000000 -3c08e20f -35081000 -3c03f100 -00081300 -1443054a -00000000 -3c085911 -35083ddc -3c03889e -3463ee00 -000811c0 -14430543 -00000000 -3c083fac -350873a8 -3c0358e7 -34635000 -00081240 -1443053c -00000000 -3c086785 -35089a1a -3c036785 -34639a1a -00081000 -14430535 -00000000 -3c08cf12 -35080200 -3c039010 -000812c0 -1443052f -00000000 -3c086072 -3508ca26 -3c0381cb -34632898 -00081080 -14430528 -00000000 -3c083f79 -3508cac0 -3c03fde7 -34632b00 -00081080 -14430521 -00000000 -3c08d204 -3508130c -3c031800 -00081640 -1443051b -00000000 -3c086594 -3508c514 -24030000 -000817c0 -14430515 -00000000 -3c086d4a -35088ffc -3c03a547 -3463fe00 -000811c0 -1443050e -00000000 -3c08dd9d -35080cc0 -3c039d0c -3463c000 -00081200 -14430507 -00000000 -3c08c2cb -3508a0de -3c030de0 -00081500 -14430501 -00000000 -3c089038 -3508d880 -3c0381c6 -3463c400 -000810c0 -144304fa -00000000 -3c0859ee -35084cef -3c0333bc -00081480 -144304f4 -00000000 -3c089d2a -35082a18 -3c0374a8 -3463a860 -00081080 -144304ed -00000000 -3c08677a -350848b4 -3c034000 -00081700 -144304e7 -00000000 -3c084f84 -3508d0f0 -3c03f84d -34630f00 -00081100 -144304e0 -00000000 -3c08cb83 -35080868 -3c03b830 -34638680 -00081100 -144304d9 -00000000 -3c08343b -35082320 -3c03ec8c -34638000 -00081280 -144304d2 -00000000 -3c08df6e -35080ee0 -3c03b800 -00081580 -144304cc -00000000 -3c086965 -3508d880 -24030000 -00081680 -144304c6 -00000000 -3c08b20d -35083240 -3c039069 -34639200 -000810c0 -144304bf -00000000 -3c083f70 -35081158 -3c033f70 -34631158 -00081000 -144304b8 -00000000 -3c08a9e4 -3508a438 -3c03c000 -000816c0 -144304b2 -00000000 -3c087b03 -350898d8 -3c037b03 -346398d8 -00081000 -144304ab -00000000 -3c0865cc -35082f00 -3c03c2f0 -00081300 -144304a5 -00000000 -3c086763 -35082ffb -3c037fd8 -000814c0 -1443049f -00000000 -3c0822c6 -3508a208 -3c03d441 -00081340 -14430499 -00000000 -3c08990a -350839f7 -3c030a39 -3463f700 -00081200 -14430492 -00000000 -3c08e4c3 -3508d10c -3c038600 -000815c0 -1443048c -00000000 -3c08955c -35083456 -3c035800 -00081680 -14430486 -00000000 -3c0833ce -35086412 -3c030900 -000815c0 -14430480 -00000000 -3c0867b4 -35081200 -3c038000 -00081580 -1443047a -00000000 -3c080380 -3508d8b8 -3c031700 -00081540 -14430474 -00000000 -3c08da01 -350841f0 -3c037c00 -00081580 -1443046e -00000000 -3c084c6a -35084618 -3c030c00 -000815c0 -14430468 -00000000 -3c08c417 -35083a6a -3c03173a -34636a00 -00081200 -14430461 -00000000 -3c08c79f -350879e0 -3c038000 -00081680 -1443045b -00000000 -3c0856db -35085516 -3c03adb6 -3463aa2c -00081040 -14430454 -00000000 -3c08e5c6 -3508fa78 -24030000 -000817c0 -1443044e -00000000 -3c0898dd -35080099 -3c0304c8 -000814c0 -14430448 -00000000 -3c086adb -350841c0 -3c038000 -00081640 -14430442 -00000000 -3c0854d8 -35084300 -3c0310c0 -00081380 -1443043c -00000000 -3c087fb7 -350866c6 -3c03cd8c -00081440 -14430436 -00000000 -3c08e4ee -35086ba6 -3c03c000 -00081740 -14430430 -00000000 -3c0868ee -35085e60 -24030000 -000816c0 -1443042a -00000000 -3c08fb0f -35080089 -3c034000 -00081780 -14430424 -00000000 -3c08d98c -35081ee0 -3c03d98c -34631ee0 -00081000 -1443041d -00000000 -3c086dad -35086a22 -3c03d6a2 -34632000 -00081300 -14430416 -00000000 -3c084e1b -3508c194 -3c03de0c -3463a000 -000812c0 -1443040f -00000000 -3c08bee5 -3508d930 -24030000 -00081700 -14430409 -00000000 -3c08bcc5 -35083010 -24030000 -000817c0 -14430403 -00000000 -3c082dae -35087637 -3c0373b1 -3463b800 -000812c0 -144303fc -00000000 -3c0842a8 -35083300 -3c035506 -34636000 -00081140 -144303f5 -00000000 -3c08ce7d -35088cc7 -3c03e000 -00081740 -144303ef -00000000 -3c08a2f9 -350828b2 -3c038000 -00081780 -144303e9 -00000000 -3c081622 -3508e39c -3c03b8e7 -00081380 -144303e3 -00000000 -3c08b0ab -3508fdca -3c0357fb -34639400 -00081240 -144303dc -00000000 -3c089faa -35085a80 -3c03ea96 -3463a000 -00081180 -144303d5 -00000000 -3c083354 -3508c094 -3c03a000 -000816c0 -144303cf -00000000 -3c084a49 -35081cb8 -24030000 -00081780 -144303c9 -00000000 -3c087dd8 -3508aa30 -3c03eec5 -34635180 -000810c0 -144303c2 -00000000 -3c08bdac -35088ea0 -3c0323a8 -00081380 -144303bc -00000000 -3c08bf8d -35081106 -3c03c688 -34638300 -000811c0 -144303b5 -00000000 -3c087357 -3508e674 -3c03bf33 -3463a000 -000812c0 -144303ae -00000000 -3c088120 -3508994c -3c035300 -00081580 -144303a8 -00000000 -3c08ee76 -35088d3c -3c03ced1 -3463a780 -00081140 -144303a1 -00000000 -3c0838dc -35086cfc -3c03b8d9 -3463f800 -00081240 -1443039a -00000000 -3c08a09b -35087890 -3c03bc48 -000813c0 -14430394 -00000000 -3c0863cb -35088d00 -3c038f2e -34633400 -00081080 -1443038d -00000000 -3c089db2 -350868b0 -3c03a2c0 -00081480 -14430387 -00000000 -3c08e6d7 -35086fc7 -3c03df8e -00081440 -14430381 -00000000 -3c08c101 -35089e51 -3c034400 -00081680 -1443037b -00000000 -3c08fc9e -350891a0 -3c032340 -00081440 -14430375 -00000000 -3c0841c5 -35084e60 -3c0338a9 -3463cc00 -00081140 -1443036e -00000000 -3c080a92 -3508bc39 -3c032000 -00081740 -14430368 -00000000 -3c08ba53 -3508beb6 -3c03d6c0 -00081540 -14430362 -00000000 -3c08d1ef -35086870 -3c033ded -34630e00 -00081140 -1443035b -00000000 -3c0843f6 -3508d1b4 -3c038000 -00081740 -14430355 -00000000 -3c0859c5 -3508b394 -3c03ce50 -00081480 -1443034f -00000000 -3c084e9c -3508b07a -3c0360f4 -00081440 -14430349 -00000000 -3c08d8bc -35089780 -3c03f25e -00081280 -14430343 -00000000 -3c089d95 -35082d78 -3c03b5e0 -00081480 -1443033d -00000000 -3c08ed9c -3508d568 -3c038000 -00081700 -14430337 -00000000 -3c08297f -35086323 -3c034600 -00081640 -14430331 -00000000 -3c084b52 -3508cc52 -3c031480 -00081580 -1443032b -00000000 -3c08de37 -3508c5c4 -3c03f1be -34632e20 -000810c0 -14430324 -00000000 -3c08c8d3 -3508a864 -3c03a190 -00081480 -1443031e -00000000 -3c08cc76 -3508ee32 -3c033b77 -34631900 -000811c0 -14430317 -00000000 -3c0854f0 -35089600 -3c0353c2 -34635800 -00081080 -14430310 -00000000 -3c0827b0 -3508fa54 -3c03ec3e -34639500 -00081180 -14430309 -00000000 -3c08e893 -350868d0 -3c038936 -34638d00 -00081100 -14430302 -00000000 -3c086ed8 -3508b7d2 -3c03df48 -00081480 -144302fc -00000000 -3c086bd8 -35087d10 -3c034400 -00081580 -144302f6 -00000000 -3c08a72b -350875b0 -24030000 -000817c0 -144302f0 -00000000 -3c085387 -350879e2 -3c03779e -34632000 -00081300 -144302e9 -00000000 -3c0828aa -35089431 -3c0328aa -34639431 -00081000 -144302e2 -00000000 -3c0891de -350820b0 -3c03bc41 -34636000 -00081240 -144302db -00000000 -3c083d0b -3508e9c0 -3c03f42f -3463a700 -00081080 -144302d4 -00000000 -3c0848cc -35083f30 -3c038cc3 -3463f300 -00081100 -144302cd -00000000 -3c08fc51 -35088448 -24030000 -000817c0 -144302c7 -00000000 -3c087ae8 -3508be34 -3c03745f -34631a00 -000811c0 -144302c0 -00000000 -3c089e07 -3508b8bc -3c03e2f0 -00081480 -144302ba -00000000 -3c086392 -3508e668 -3c0392e6 -34636800 -00081200 -144302b3 -00000000 -3c08df45 -35085e10 -3c03455e -34631000 -00081200 -144302ac -00000000 -3c080708 -35088f21 -3c039080 -000815c0 -144302a6 -00000000 -3c083518 -35084800 -24030000 -00081640 -144302a0 -00000000 -3c08e4c7 -350815e4 -3c03e400 -00081600 -1443029a -00000000 -3c088e69 -35088400 -24030000 -00081580 -14430294 -00000000 -3c082ceb -35086fb2 -3c037d90 -000814c0 -1443028e -00000000 -3c089f54 -35087120 -3c03a389 -000812c0 -14430288 -00000000 -3c085cfb -3508a16d -3c03b9f7 -346342da -00081040 -14430281 -00000000 -3c089832 -3508e740 -3c035ce8 -00081340 -1443027b -00000000 -3c08e78f -3508c4f8 -3c03f13e -00081380 -14430275 -00000000 -3c0848d0 -3508c228 -3c033430 -34638a00 -00081180 -1443026e -00000000 -3c084894 -3508d178 -3c039129 -3463a2f0 -00081040 -14430267 -00000000 -3c08c1b2 -350858a0 -3c031400 -00081540 -14430261 -00000000 -3c08b6f7 -3508d1cc -3c03b6f7 -3463d1cc -00081000 -1443025a -00000000 -3c087ac0 -350827f0 -3c037ac0 -346327f0 -00081000 -14430253 -00000000 -3c087cfd -3508e1e0 -3c037cfd -3463e1e0 -00081000 -1443024c -00000000 -3c08bfa2 -3508e928 -3c03bfa2 -3463e928 -00081000 -14430245 -00000000 -3c0867b4 -35080770 -3c0367b4 -34630770 -00081000 -1443023e -00000000 -3c08447e -3508018c -3c03447e -3463018c -00081000 -14430237 -00000000 -3c08f7bd -350848e6 -3c03f7bd -346348e6 -00081000 -14430230 -00000000 -3c082a8a -35081140 -3c032a8a -34631140 -00081000 -14430229 -00000000 -3c087390 -35088458 -3c037390 -34638458 -00081000 -14430222 -00000000 -3c08d470 -35089350 -3c03d470 -34639350 -00081000 -1443021b -00000000 -3c085d67 -3508ee80 -3c035d67 -3463ee80 -00081000 -14430214 -00000000 -3c08392a -350824a0 -3c03392a -346324a0 -00081000 -1443020d -00000000 -3c0815ff -35085ed9 -3c0315ff -34635ed9 -00081000 -14430206 -00000000 -3c083e1f -3508d219 -3c033e1f -3463d219 -00081000 -144301ff -00000000 -3c089b79 -3508a2e8 -3c039b79 -3463a2e8 -00081000 -144301f8 -00000000 -3c081b94 -3508962c -3c031b94 -3463962c -00081000 -144301f1 -00000000 -3c08aa85 -35089446 -3c03aa85 -34639446 -00081000 -144301ea -00000000 -3c08033e -35088e74 -3c03033e -34638e74 -00081000 -144301e3 -00000000 -3c08484a -3508e2bc -3c03484a -3463e2bc -00081000 -144301dc -00000000 -3c08f9a5 -3508bd1d -3c03f9a5 -3463bd1d -00081000 -144301d5 -00000000 -3c08d1d8 -3508fe72 -3c03d1d8 -3463fe72 -00081000 -144301ce -00000000 -3c089bd5 -350800b8 -3c039bd5 -346300b8 -00081000 -144301c7 -00000000 -3c08f700 -3508ccf1 -3c03f700 -3463ccf1 -00081000 -144301c0 -00000000 -3c08e31b -3508ddfc -3c03e31b -3463ddfc -00081000 -144301b9 -00000000 -3c082e11 -350897b0 -3c032e11 -346397b0 -00081000 -144301b2 -00000000 -3c08eb3f -35089bf8 -3c03eb3f -34639bf8 -00081000 -144301ab -00000000 -3c0886ca -3508fcec -3c0386ca -3463fcec -00081000 -144301a4 -00000000 -3c0814d0 -350898b8 -3c0314d0 -346398b8 -00081000 -1443019d -00000000 -3c08a3e1 -35080114 -3c03a3e1 -34630114 -00081000 -14430196 -00000000 -3c08c3b4 -3508bed0 -3c03c3b4 -3463bed0 -00081000 -1443018f -00000000 -3c08c963 -3508e299 -3c03c963 -3463e299 -00081000 -14430188 -00000000 -3c08dcb7 -3508aaf4 -3c03dcb7 -3463aaf4 -00081000 -14430181 -00000000 -3c089806 -3508a5ec -3c039806 -3463a5ec -00081000 -1443017a -00000000 -3c082108 -3508d9cb -3c032108 -3463d9cb -00081000 -14430173 -00000000 -3c08c768 -350858a0 -3c03c768 -346358a0 -00081000 -1443016c -00000000 -3c083057 -3508b780 -3c033057 -3463b780 -00081000 -14430165 -00000000 -3c085ea6 -3508d1ea -3c035ea6 -3463d1ea -00081000 -1443015e -00000000 -3c08c8ac -3508d874 -3c03c8ac -3463d874 -00081000 -14430157 -00000000 -3c08c701 -35089de0 -3c03c701 -34639de0 -00081000 -14430150 -00000000 -3c0892a6 -350834de -3c0392a6 -346334de -00081000 -14430149 -00000000 -3c082490 -350818dd -3c032490 -346318dd -00081000 -14430142 -00000000 -3c0834d2 -3508bbc4 -3c0334d2 -3463bbc4 -00081000 -1443013b -00000000 -3c082f62 -3508470c -3c032f62 -3463470c -00081000 -14430134 -00000000 -3c087de9 -35083ffe -3c037de9 -34633ffe -00081000 -1443012d -00000000 -3c08ca48 -35088c00 -3c03ca48 -34638c00 -00081000 -14430126 -00000000 -3c089733 -3508d3ca -3c039733 -3463d3ca -00081000 -1443011f -00000000 -3c082b32 -35089d1c -3c032b32 -34639d1c -00081000 -14430118 -00000000 -3c0851fa -3508c62e -3c0351fa -3463c62e -00081000 -14430111 -00000000 -3c080684 -3508045e -3c030684 -3463045e -00081000 -1443010a -00000000 -3c0802a1 -3508a840 -3c0302a1 -3463a840 -00081000 -14430103 -00000000 -24080000 -24030000 -000815c0 -144300fe -00000000 -24080000 -24030000 -000814c0 -144300f9 -00000000 -24080000 -24030000 -00081580 -144300f4 -00000000 -24080000 -24030000 -00081040 -144300ef -00000000 -24080000 -24030000 -00081540 -144300ea -00000000 -24080000 -24030000 -00081080 -144300e5 -00000000 -24080000 -24030000 -00081080 -144300e0 -00000000 -24080000 -24030000 -00081680 -144300db -00000000 -24080000 -24030000 -00081180 -144300d6 -00000000 -24080000 -24030000 -00081400 -144300d1 -00000000 -24080000 -24030000 -00081580 -144300cc -00000000 -24080000 -24030000 -00081140 -144300c7 -00000000 -24080000 -24030000 -00081580 -144300c2 -00000000 -24080000 -24030000 -000810c0 -144300bd -00000000 -24080000 -24030000 -00081140 -144300b8 -00000000 -24080000 -24030000 -000816c0 -144300b3 -00000000 -24080000 -24030000 -00081740 -144300ae -00000000 -24080000 -24030000 -00081440 -144300a9 -00000000 -24080000 -24030000 -000815c0 -144300a4 -00000000 -24080000 -24030000 -00081500 -1443009f -00000000 -24080000 -24030000 -00081440 -1443009a -00000000 -24080000 -24030000 -000815c0 -14430095 -00000000 -24080000 -24030000 -000814c0 -14430090 -00000000 -24080000 -24030000 -00081680 -1443008b -00000000 -24080000 -24030000 -00081640 -14430086 -00000000 -24080000 -24030000 -00081580 -14430081 -00000000 -24080000 -24030000 -00081740 -1443007c -00000000 -24080000 -24030000 -00081080 -14430077 -00000000 -24080000 -24030000 -00081440 -14430072 -00000000 -24080000 -24030000 -00081780 -1443006d -00000000 -24080000 -24030000 -00081480 -14430068 -00000000 -24080000 -24030000 -00081040 -14430063 -00000000 -24080000 -24030000 -00081480 -1443005e -00000000 -24080000 -24030000 -00081180 -14430059 -00000000 -24080000 -24030000 -00081580 -14430054 -00000000 -24080000 -24030000 -00081040 -1443004f -00000000 -24080000 -24030000 -00081480 -1443004a -00000000 -24080000 -24030000 -00081700 -14430045 -00000000 -24080000 -24030000 -00081400 -14430040 -00000000 -24080000 -24030000 -000810c0 -1443003b -00000000 -24080000 -24030000 -00081280 -14430036 -00000000 -24080000 -24030000 -00081380 -14430031 -00000000 -24080000 -24030000 -00081480 -1443002c -00000000 -24080000 -24030000 -00081740 -14430027 -00000000 -24080000 -24030000 -000814c0 -14430022 -00000000 -24080000 -24030000 -00081540 -1443001d -00000000 -24080000 -24030000 -00081200 -14430018 -00000000 -24080000 -24030000 -00081140 -14430013 -00000000 -24080000 -24030000 -000815c0 -1443000e -00000000 -24080000 -24030000 -00081280 -14430009 -00000000 -24080000 -24030000 -00081000 -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -00000000 -26100001 -24120000 -24020000 -24030000 -10000008 -00000000 -3c026ad0 -3442a0b8 -1900000b -00000000 -1000000b -00000000 -00000000 -3c0895b9 -3508206f -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c038f08 -3463db03 -3c156ad0 -36b5a0b8 -3c168f08 -36d6db03 -14551511 -00000000 -1476150f -00000000 -24020000 -24030000 -10000008 -00000000 -3c02c782 -34426200 -1900000b -00000000 -1000000b -00000000 -00000000 -3c082c09 -3508b044 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0313ea -34632762 -24150000 -24160000 -145514f7 -00000000 -147614f5 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02a07a -34424a41 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08095b -35087ae8 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0356ac -346395c0 -24150000 -24160000 -145514dd -00000000 -147614db -00000000 -24020000 -24030000 -10000008 -00000000 -3c022f1c -3442d2c0 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08ce67 -3508bc51 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0300ba -34638e99 -3c152f1c -36b5d2c0 -3c1600ba -36d68e99 -145514c1 -00000000 -147614bf -00000000 -24020000 -24030000 -10000008 -00000000 -3c0250fd -3442d280 -1900000b -00000000 -1000000b -00000000 -00000000 -3c082a69 -3508b9f8 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0381eb -34636d5e -24150000 -24160000 -145514a7 -00000000 -147614a5 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02d957 -34429e00 -1900000b -00000000 -1000000b -00000000 -00000000 -3c084a89 -3508b5b0 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c035963 -34631c54 -24150000 -24160000 -1455148d -00000000 -1476148b -00000000 -24020000 -24030000 -10000008 -00000000 -3c028c56 -34422016 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08b65d -35088ec0 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03e027 -34637158 -3c158c56 -36b52016 -3c16e027 -36d67158 -14551471 -00000000 -1476146f -00000000 -24020000 -24030000 -10000008 -00000000 -3c02404b -344279a8 -1900000b -00000000 -1000000b -00000000 -00000000 -3c082487 -35083e20 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03074d -3463e3ca -24150000 -24160000 -14551457 -00000000 -14761455 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0283cc -3442eb23 -1900000b -00000000 -1000000b -00000000 -00000000 -3c0868aa -350832f0 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03c390 -34632420 -24150000 -24160000 -1455143d -00000000 -1476143b -00000000 -24020000 -24030000 -10000008 -00000000 -3c023f18 -34420c13 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08e047 -3508d460 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c033bc3 -34638a98 -3c153f18 -36b50c13 -3c163bc3 -36d68a98 -14551421 -00000000 -1476141f -00000000 -24020000 -24030000 -10000008 -00000000 -3c024b4a -344215fc -1900000b -00000000 -1000000b -00000000 -00000000 -3c087e5e -3508ca9a -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03d348 -34630b3e -24150000 -24160000 -14551407 -00000000 -14761405 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02bf05 -34427200 -1900000b -00000000 -1000000b -00000000 -00000000 -3c087430 -3508a9bc -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c032fdb -3463be72 -24150000 -24160000 -145513ed -00000000 -147613eb -00000000 -24020000 -24030000 -10000008 -00000000 -3c0237c8 -344216b0 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08f836 -3508bb94 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03b512 -34633aa5 -3c1537c8 -36b516b0 -3c16b512 -36d63aa5 -145513d1 -00000000 -147613cf -00000000 -24020000 -24030000 -10000008 -00000000 -3c02294e -344260b0 -1900000b -00000000 -1000000b -00000000 -00000000 -3c086b6d -3508aebe -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03500d -3463f160 -24150000 -24160000 -145513b7 -00000000 -147613b5 -00000000 -24020000 -24030000 -10000008 -00000000 -3c020bc7 -34429c38 -1900000b -00000000 -1000000b -00000000 -00000000 -3c080274 -35085600 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03623d -3463501e -24150000 -24160000 -1455139d -00000000 -1476139b -00000000 -24020000 -24030000 -10000008 -00000000 -3c02699a -34423b30 -1900000b -00000000 -1000000b -00000000 -00000000 -3c088d27 -35084934 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03ecb8 -3463b910 -3c15699a -36b53b30 -3c16ecb8 -36d6b910 -14551381 -00000000 -1476137f -00000000 -24020000 -24030000 -10000008 -00000000 -3c0282f6 -3442e288 -1900000b -00000000 -1000000b -00000000 -00000000 -3c084797 -3508d3c4 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c031854 -34639ab0 -24150000 -24160000 -14551367 -00000000 -14761365 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02240d -3442ab00 -1900000b -00000000 -1000000b -00000000 -00000000 -3c084df2 -3508d5b0 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03fc31 -34633800 -24150000 -24160000 -1455134d -00000000 -1476134b -00000000 -24020000 -24030000 -10000008 -00000000 -3c022120 -344227e4 -1900000b -00000000 -1000000b -00000000 -00000000 -3c0857a5 -35082a38 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03fa71 -34639eb0 -24150000 -24160000 -14551333 -00000000 -14761331 -00000000 -24020000 -24030000 -10000008 -00000000 -3c021bcc -344205b9 -1900000b -00000000 -1000000b -00000000 -00000000 -3c088e03 -35088139 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0372ae -346372b0 -3c151bcc -36b505b9 -3c1672ae -36d672b0 -14551317 -00000000 -14761315 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02e541 -3442fb00 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08bf9c -35088198 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c031b71 -346326c8 -3c15e541 -36b5fb00 -3c161b71 -36d626c8 -145512fb -00000000 -147612f9 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0201b1 -34422380 -1900000b -00000000 -1000000b -00000000 -00000000 -3c081249 -3508b078 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c032f82 -3463a822 -24150000 -24160000 -145512e1 -00000000 -147612df -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f9cb -3442a288 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08ecce -35081f70 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03d13e -34632f00 -3c15f9cb -36b5a288 -3c16d13e -36d62f00 -145512c5 -00000000 -147612c3 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02c848 -34422c40 -1900000b -00000000 -1000000b -00000000 -00000000 -3c0800c3 -35088455 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03525f -34638eeb -24150000 -24160000 -145512ab -00000000 -147612a9 -00000000 -24020000 -24030000 -10000008 -00000000 -3c029808 -344256a0 -1900000b -00000000 -1000000b -00000000 -00000000 -3c089b68 -35084c3e -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03b7a9 -34636a50 -3c159808 -36b556a0 -3c16b7a9 -36d66a50 -1455128f -00000000 -1476128d -00000000 -24020000 -24030000 -10000008 -00000000 -3c02234e -34423918 -1900000b -00000000 -1000000b -00000000 -00000000 -3c086b77 -350893d8 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03ffac -34634ebc -24150000 -24160000 -14551275 -00000000 -14761273 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02840e -3442da46 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08e6d3 -3508f752 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03e0fd -3463dba0 -3c15840e -36b5da46 -3c16e0fd -36d6dba0 -14551259 -00000000 -14761257 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0291ce -344291aa -1900000b -00000000 -1000000b -00000000 -00000000 -3c083fc3 -35081ca0 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03dc8b -3463c8e8 -24150000 -24160000 -1455123f -00000000 -1476123d -00000000 -24020000 -24030000 -10000008 -00000000 -3c0250f6 -34421b8c -1900000b -00000000 -1000000b -00000000 -00000000 -3c08fa9c -35087468 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03c3de -34635780 -3c1550f6 -36b51b8c -3c16c3de -36d65780 -14551223 -00000000 -14761221 -00000000 -24020000 -24030000 -10000008 -00000000 -3c025959 -34424bd0 -1900000b -00000000 -1000000b -00000000 -00000000 -3c081b91 -3508e180 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03edfc -3463a8b8 -24150000 -24160000 -14551209 -00000000 -14761207 -00000000 -24020000 -24030000 -10000008 -00000000 -3c029157 -34423db4 -1900000b -00000000 -1000000b -00000000 -00000000 -3c0841cd -3508ee76 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0371ca -3463fa0d -24150000 -24160000 -145511ef -00000000 -147611ed -00000000 -24020000 -24030000 -10000008 -00000000 -3c026f2e -34427f30 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08eba5 -3508e8e0 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c038c9a -3463b700 -3c156f2e -36b57f30 -3c168c9a -36d6b700 -145511d3 -00000000 -147611d1 -00000000 -24020000 -24030000 -10000008 -00000000 -3c029821 -344299e2 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08d821 -35087e04 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03f3b1 -3463afed -3c159821 -36b599e2 -3c16f3b1 -36d6afed -145511b7 -00000000 -147611b5 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02a23c -3442df53 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08585b -3508f2ea -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0383ea -34630f80 -24150000 -24160000 -1455119d -00000000 -1476119b -00000000 -24020000 -24030000 -10000008 -00000000 -3c02d9b4 -3442357c -1900000b -00000000 -1000000b -00000000 -00000000 -3c0887b6 -3508f470 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c039583 -3463d2d0 -3c15d9b4 -36b5357c -3c169583 -36d6d2d0 -14551181 -00000000 -1476117f -00000000 -24020000 -24030000 -10000008 -00000000 -3c0279e1 -3442ef50 -1900000b -00000000 -1000000b -00000000 -00000000 -3c086d9f -35084500 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03a776 -346373c0 -24150000 -24160000 -14551167 -00000000 -14761165 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02c307 -34427338 -1900000b -00000000 -1000000b -00000000 -00000000 -3c0883c1 -3508a418 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03f790 -3463ea84 -3c15c307 -36b57338 -3c16f790 -36d6ea84 -1455114b -00000000 -14761149 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02e288 -34427e9a -1900000b -00000000 -1000000b -00000000 -00000000 -3c08b9ad -3508f050 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03cd44 -34637a90 -3c15e288 -36b57e9a -3c16cd44 -36d67a90 -1455112f -00000000 -1476112d -00000000 -24020000 -24030000 -10000008 -00000000 -3c02218b -34424000 -1900000b -00000000 -1000000b -00000000 -00000000 -3c0873fd -35084d18 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03a411 -3463db70 -24150000 -24160000 -14551115 -00000000 -14761113 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0275f6 -34425d40 -1900000b -00000000 -1000000b -00000000 -00000000 -3c082b26 -3508a3d5 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0341ad -34633428 -24150000 -24160000 -145510fb -00000000 -147610f9 -00000000 -24020000 -24030000 -10000008 -00000000 -3c024fb0 -3442ded0 -1900000b -00000000 -1000000b -00000000 -00000000 -3c088fb1 -3508c111 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0345e6 -34633380 -3c154fb0 -36b5ded0 -3c1645e6 -36d63380 -145510df -00000000 -147610dd -00000000 -24020000 -24030000 -10000008 -00000000 -3c02fd9c -3442b0c0 -1900000b -00000000 -1000000b -00000000 -00000000 -3c0864e3 -350834c0 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03af32 -3463dc00 -24150000 -24160000 -145510c5 -00000000 -147610c3 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f3e2 -3442611c -1900000b -00000000 -1000000b -00000000 -00000000 -3c089a27 -3508606f -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03d5e2 -346347ef -3c15f3e2 -36b5611c -3c16d5e2 -36d647ef -145510a9 -00000000 -147610a7 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0201a3 -344296fc -1900000b -00000000 -1000000b -00000000 -00000000 -3c0867f6 -350841d0 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03b659 -3463e860 -24150000 -24160000 -1455108f -00000000 -1476108d -00000000 -24020000 -24030000 -10000008 -00000000 -3c02beee -34421cd5 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08132b -35089e7a -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03e9fa -34636eed -24150000 -24160000 -14551075 -00000000 -14761073 -00000000 -24020000 -24030000 -10000008 -00000000 -3c021047 -34424470 -1900000b -00000000 -1000000b -00000000 -00000000 -3c081439 -3508b2f1 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03b23f -34634a58 -24150000 -24160000 -1455105b -00000000 -14761059 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02054c -34429768 -1900000b -00000000 -1000000b -00000000 -00000000 -3c088647 -35082668 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c036b14 -34630a00 -3c15054c -36b59768 -3c166b14 -36d60a00 -1455103f -00000000 -1476103d -00000000 -24020000 -24030000 -10000008 -00000000 -3c028f2a -3442dfc4 -1900000b -00000000 -1000000b -00000000 -00000000 -3c083d59 -3508835a -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c037618 -3463c700 -24150000 -24160000 -14551025 -00000000 -14761023 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02ab9e -34422684 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08c289 -3508835c -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c030372 -34637b3a -3c15ab9e -36b52684 -3c160372 -36d67b3a -14551009 -00000000 -14761007 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02cf15 -3442a60a -1900000b -00000000 -1000000b -00000000 -00000000 -3c086316 -35082733 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c034e2c -3463ab60 -24150000 -24160000 -14550fef -00000000 -14760fed -00000000 -24020000 -24030000 -10000008 -00000000 -3c0284fa -3442c8f4 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08e4e1 -3508b69c -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03f317 -3463b3b8 -3c1584fa -36b5c8f4 -3c16f317 -36d6b3b8 -14550fd3 -00000000 -14760fd1 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0213ef -3442a0f8 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08114c -35085c60 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c039b06 -346395dc -24150000 -24160000 -14550fb9 -00000000 -14760fb7 -00000000 -24020000 -24030000 -10000008 -00000000 -3c024d43 -34422770 -1900000b -00000000 -1000000b -00000000 -00000000 -3c0887b0 -350819d8 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03ce14 -3463ef40 -3c154d43 -36b52770 -3c16ce14 -36d6ef40 -14550f9d -00000000 -14760f9b -00000000 -24020000 -24030000 -10000008 -00000000 -3c028c91 -3442b054 -1900000b -00000000 -1000000b -00000000 -00000000 -3c086554 -35084740 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c033ad3 -3463df8e -24150000 -24160000 -14550f83 -00000000 -14760f81 -00000000 -24020000 -24030000 -10000008 -00000000 -3c025cc4 -3442f38c -1900000b -00000000 -1000000b -00000000 -00000000 -3c08f1ec -3508411c -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03780a -3463a740 -3c155cc4 -36b5f38c -3c16780a -36d6a740 -14550f67 -00000000 -14760f65 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02c0f6 -34422e1c -1900000b -00000000 -1000000b -00000000 -00000000 -3c08cbf5 -3508b318 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03ddbf -34636d18 -3c15c0f6 -36b52e1c -3c16ddbf -36d66d18 -14550f4b -00000000 -14760f49 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0217ed -344266a0 -1900000b -00000000 -1000000b -00000000 -00000000 -3c085ba1 -3508e1e3 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0396f1 -34634968 -24150000 -24160000 -14550f31 -00000000 -14760f2f -00000000 -24020000 -24030000 -10000008 -00000000 -3c029f17 -3442b83c -1900000b -00000000 -1000000b -00000000 -00000000 -3c087028 -3508d5ee -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03c7b0 -3463a700 -24150000 -24160000 -14550f17 -00000000 -14760f15 -00000000 -24020000 -24030000 -10000008 -00000000 -3c022d83 -3442cddc -1900000b -00000000 -1000000b -00000000 -00000000 -3c08ba71 -3508b96e -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03879b -34631b76 -3c152d83 -36b5cddc -3c16879b -36d61b76 -14550efb -00000000 -14760ef9 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02b047 -34429198 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08e5f8 -35087908 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c037455 -3463d8b5 -3c15b047 -36b59198 -3c167455 -36d6d8b5 -14550edf -00000000 -14760edd -00000000 -24020000 -24030000 -10000008 -00000000 -3c023755 -3442f1b1 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08f993 -35088b1c -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c037138 -346378d2 -3c153755 -36b5f1b1 -3c167138 -36d678d2 -14550ec3 -00000000 -14760ec1 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0251d0 -3442ada5 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08bed7 -35081b16 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03edaa -3463ec18 -3c1551d0 -36b5ada5 -3c16edaa -36d6ec18 -14550ea7 -00000000 -14760ea5 -00000000 -24020000 -24030000 -10000008 -00000000 -3c024abd -3442b63c -1900000b -00000000 -1000000b -00000000 -00000000 -3c081e2a -350814d4 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c032b8a -34631cee -24150000 -24160000 -14550e8d -00000000 -14760e8b -00000000 -24020000 -24030000 -10000008 -00000000 -3c021ff2 -34426132 -1900000b -00000000 -1000000b -00000000 -00000000 -3c0850f9 -35082580 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0388fb -34637170 -24150000 -24160000 -14550e73 -00000000 -14760e71 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02de3c -3442740c -1900000b -00000000 -1000000b -00000000 -00000000 -3c08772d -350824f0 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03b9d0 -34631798 -24150000 -24160000 -14550e59 -00000000 -14760e57 -00000000 -24020000 -24030000 -10000008 -00000000 -3c022eee -34425b14 -1900000b -00000000 -1000000b -00000000 -00000000 -3c0818bc -35082f30 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03ab5f -34639b60 -24150000 -24160000 -14550e3f -00000000 -14760e3d -00000000 -24020000 -24030000 -10000008 -00000000 -3c024397 -34422480 -1900000b -00000000 -1000000b -00000000 -00000000 -3c083cc6 -3508c742 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0391b3 -346369d8 -24150000 -24160000 -14550e25 -00000000 -14760e23 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0286a8 -34423afc -1900000b -00000000 -1000000b -00000000 -00000000 -3c08bd93 -35080ae0 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03ce1a -34635b3c -3c1586a8 -36b53afc -3c16ce1a -36d65b3c -14550e09 -00000000 -14760e07 -00000000 -24020000 -24030000 -10000008 -00000000 -3c028e3e -34422bde -1900000b -00000000 -1000000b -00000000 -00000000 -3c081355 -35084e80 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0370e5 -3463cc74 -24150000 -24160000 -14550def -00000000 -14760ded -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f42a -34423336 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08aa20 -350805c0 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03ed40 -346381fe -3c15f42a -36b53336 -3c16ed40 -36d681fe -14550dd3 -00000000 -14760dd1 -00000000 -24020000 -24030000 -10000008 -00000000 -3c024f05 -3442b73c -1900000b -00000000 -1000000b -00000000 -00000000 -3c0897e9 -3508c124 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0332b5 -34635baa -3c154f05 -36b5b73c -3c1632b5 -36d65baa -14550db7 -00000000 -14760db5 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02b974 -34423552 -1900000b -00000000 -1000000b -00000000 -00000000 -3c0837a1 -35087580 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c038331 -3463b3e4 -24150000 -24160000 -14550d9d -00000000 -14760d9b -00000000 -24020000 -24030000 -10000008 -00000000 -3c027a60 -3442c600 -1900000b -00000000 -1000000b -00000000 -00000000 -3c088362 -3508c950 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c035f37 -34630104 -3c157a60 -36b5c600 -3c165f37 -36d60104 -14550d81 -00000000 -14760d7f -00000000 -24020000 -24030000 -10000008 -00000000 -3c02a3fa -344222e6 -1900000b -00000000 -1000000b -00000000 -00000000 -3c089085 -35086db8 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c036a27 -3463abc6 -3c15a3fa -36b522e6 -3c166a27 -36d6abc6 -14550d65 -00000000 -14760d63 -00000000 -24020000 -24030000 -10000008 -00000000 -3c022b46 -34422220 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08beaf -3508dd2a -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03cc7f -34638e40 -3c152b46 -36b52220 -3c16cc7f -36d68e40 -14550d49 -00000000 -14760d47 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0279d3 -344283d4 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08e595 -3508a157 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0327cb -34631dfe -3c1579d3 -36b583d4 -3c1627cb -36d61dfe -14550d2d -00000000 -14760d2b -00000000 -24020000 -24030000 -10000008 -00000000 -3c022e26 -3442cbc8 -1900000b -00000000 -1000000b -00000000 -00000000 -3c081a12 -3508957a -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03b498 -34632052 -24150000 -24160000 -14550d13 -00000000 -14760d11 -00000000 -24020000 -24030000 -10000008 -00000000 -3c029be9 -3442a801 -1900000b -00000000 -1000000b -00000000 -00000000 -3c0851fe -35085cb0 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03c089 -34633889 -24150000 -24160000 -14550cf9 -00000000 -14760cf7 -00000000 -24020000 -24030000 -10000008 -00000000 -3c020e67 -34429c00 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08c89a -35083f80 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c038708 -34637ca8 -3c150e67 -36b59c00 -3c168708 -36d67ca8 -14550cdd -00000000 -14760cdb -00000000 -24020000 -24030000 -10000008 -00000000 -3c02de42 -3442e4dc -1900000b -00000000 -1000000b -00000000 -00000000 -3c089e99 -35088ff0 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03ffa0 -34638270 -3c15de42 -36b5e4dc -3c16ffa0 -36d68270 -14550cc1 -00000000 -14760cbf -00000000 -24020000 -24030000 -10000008 -00000000 -3c02c3e4 -3442cf24 -1900000b -00000000 -1000000b -00000000 -00000000 -3c089be1 -3508f200 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0378d8 -3463a4f0 -3c15c3e4 -36b5cf24 -3c1678d8 -36d6a4f0 -14550ca5 -00000000 -14760ca3 -00000000 -24020000 -24030000 -10000008 -00000000 -3c023d11 -344200a0 -1900000b -00000000 -1000000b -00000000 -00000000 -3c0849a6 -350824a4 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03fd4d -3463fbaa -24150000 -24160000 -14550c8b -00000000 -14760c89 -00000000 -24020000 -24030000 -10000008 -00000000 -3c028182 -344277d7 -1900000b -00000000 -1000000b -00000000 -00000000 -3c080d5b -35085fc4 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0396d4 -34632172 -24150000 -24160000 -14550c71 -00000000 -14760c6f -00000000 -24020000 -24030000 -10000008 -00000000 -3c022e6c -3442244c -1900000b -00000000 -1000000b -00000000 -00000000 -3c08fdcf -35084418 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c039f5f -34631880 -3c152e6c -36b5244c -3c169f5f -36d61880 -14550c55 -00000000 -14760c53 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02952c -34421842 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08b7c0 -35089260 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c038de5 -3463fb68 -3c15952c -36b51842 -3c168de5 -36d6fb68 -14550c39 -00000000 -14760c37 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02c824 -3442a130 -1900000b -00000000 -1000000b -00000000 -00000000 -3c085c96 -35082200 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0396d2 -34634278 -24150000 -24160000 -14550c1f -00000000 -14760c1d -00000000 -24020000 -24030000 -10000008 -00000000 -3c024a10 -34428f7e -1900000b -00000000 -1000000b -00000000 -00000000 -3c0815bb -350813a8 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03c62c -3463a571 -24150000 -24160000 -14550c05 -00000000 -14760c03 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f114 -344226c6 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08c482 -350872e0 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0351e6 -3463261e -3c15f114 -36b526c6 -3c1651e6 -36d6261e -14550be9 -00000000 -14760be7 -00000000 -24020000 -24030000 -10000008 -00000000 -3c021d3e -34425368 -1900000b -00000000 -1000000b -00000000 -00000000 -3c080eaf -3508c4fc -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c039e44 -34635690 -24150000 -24160000 -14550bcf -00000000 -14760bcd -00000000 -24020000 -24030000 -10000008 -00000000 -3c028c34 -3442482a -1900000b -00000000 -1000000b -00000000 -00000000 -3c0877ce -3508d790 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03e163 -34636980 -24150000 -24160000 -14550bb5 -00000000 -14760bb3 -00000000 -24020000 -24030000 -10000008 -00000000 -3c021428 -34425356 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08fcb0 -35084740 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c033158 -346341de -3c151428 -36b55356 -3c163158 -36d641de -14550b99 -00000000 -14760b97 -00000000 -24020000 -24030000 -10000008 -00000000 -3c026d02 -3442a228 -1900000b -00000000 -1000000b -00000000 -00000000 -3c085be2 -350815d5 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03ac79 -34630995 -24150000 -24160000 -14550b7f -00000000 -14760b7d -00000000 -24020000 -24030000 -10000008 -00000000 -3c021fb3 -344204a0 -1900000b -00000000 -1000000b -00000000 -00000000 -3c089b7e -3508c798 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03beb2 -346380f4 -3c151fb3 -36b504a0 -3c16beb2 -36d680f4 -14550b63 -00000000 -14760b61 -00000000 -24020000 -24030000 -10000008 -00000000 -3c023d1d -3442a630 -1900000b -00000000 -1000000b -00000000 -00000000 -3c080563 -3508cc5c -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0376c5 -346395b2 -24150000 -24160000 -14550b49 -00000000 -14760b47 -00000000 -24020000 -24030000 -10000008 -00000000 -3c029317 -34429354 -1900000b -00000000 -1000000b -00000000 -00000000 -3c084aeb -35082cb0 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03af9a -3463d73c -24150000 -24160000 -14550b2f -00000000 -14760b2d -00000000 -24020000 -24030000 -10000008 -00000000 -3c02b3e9 -3442d820 -1900000b -00000000 -1000000b -00000000 -00000000 -3c087cef -35084170 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03786d -3463db38 -24150000 -24160000 -14550b15 -00000000 -14760b13 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0234f9 -344280ac -1900000b -00000000 -1000000b -00000000 -00000000 -3c081b8c -3508c576 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03e047 -346387c0 -24150000 -24160000 -14550afb -00000000 -14760af9 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0224c7 -34426233 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08f0ad -350869c4 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03a4c0 -34636ad8 -3c1524c7 -36b56233 -3c16a4c0 -36d66ad8 -14550adf -00000000 -14760add -00000000 -24020000 -24030000 -10000008 -00000000 -3c02696e -3442f32e -1900000b -00000000 -1000000b -00000000 -00000000 -3c08275b -35085e48 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03040b -34635bf5 -24150000 -24160000 -14550ac5 -00000000 -14760ac3 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0259c4 -344205e8 -1900000b -00000000 -1000000b -00000000 -00000000 -3c087577 -35083b3f -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03ab48 -34633c80 -24150000 -24160000 -14550aab -00000000 -14760aa9 -00000000 -24020000 -24030000 -10000008 -00000000 -3c021e86 -3442071b -1900000b -00000000 -1000000b -00000000 -00000000 -3c08dabd -35086b80 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03d097 -3463d70c -3c151e86 -36b5071b -3c16d097 -36d6d70c -14550a8f -00000000 -14760a8d -00000000 -24020000 -24030000 -10000008 -00000000 -3c02664a -34428080 -1900000b -00000000 -1000000b -00000000 -00000000 -3c085640 -3508c590 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03e773 -34630e6c -24150000 -24160000 -14550a75 -00000000 -14760a73 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02b6e2 -34429ec0 -1900000b -00000000 -1000000b -00000000 -00000000 -3c082fe0 -35085383 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c036d57 -3463065d -24150000 -24160000 -14550a5b -00000000 -14760a59 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02efd8 -34426630 -1900000b -00000000 -1000000b -00000000 -00000000 -3c089a90 -35083470 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c035b08 -3463ad7c -3c15efd8 -36b56630 -3c165b08 -36d6ad7c -14550a3f -00000000 -14760a3d -00000000 -24020000 -24030000 -10000008 -00000000 -3c020da1 -34421d60 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08808b -3508b1b0 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03f6c2 -34637e00 -3c150da1 -36b51d60 -3c16f6c2 -36d67e00 -14550a23 -00000000 -14760a21 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02d4f8 -34428718 -1900000b -00000000 -1000000b -00000000 -00000000 -3c0868f7 -35083642 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c034396 -34636450 -24150000 -24160000 -14550a09 -00000000 -14760a07 -00000000 -24020000 -24030000 -10000008 -00000000 -3c023176 -34427808 -1900000b -00000000 -1000000b -00000000 -00000000 -3c0807fd -350855aa -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c030a5d -3463a390 -24150000 -24160000 -145509ef -00000000 -147609ed -00000000 -24020000 -24030000 -10000008 -00000000 -3c02a758 -34423a00 -1900000b -00000000 -1000000b -00000000 -00000000 -3c0816bb -35088e40 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03b4b4 -3463b4b4 -24150000 -24160000 -145509d5 -00000000 -147609d3 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02b753 -34422635 -1900000b -00000000 -1000000b -00000000 -00000000 -3c085a06 -3508e0f0 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03ae95 -3463fbf8 -24150000 -24160000 -145509bb -00000000 -147609b9 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02c4e3 -3442df56 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08a77f -3508f1d2 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c032c32 -3463b8cc -3c15c4e3 -36b5df56 -3c162c32 -36d6b8cc -1455099f -00000000 -1476099d -00000000 -24020000 -24030000 -10000008 -00000000 -3c02b8e1 -34427e80 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08524f -3508086e -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0317c2 -34639a30 -24150000 -24160000 -14550985 -00000000 -14760983 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02cd69 -3442f000 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08f11c -3508b410 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03d551 -3463659c -3c15cd69 -36b5f000 -3c16d551 -36d6659c -14550969 -00000000 -14760967 -00000000 -24020000 -24030000 -10000008 -00000000 -3c025e83 -3442b720 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08c3d1 -35085830 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03f6f8 -34637f00 -3c155e83 -36b5b720 -3c16f6f8 -36d67f00 -1455094d -00000000 -1476094b -00000000 -24020000 -24030000 -10000008 -00000000 -3c02cf93 -34426450 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08468e -350863a5 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c033a60 -346392ac -24150000 -24160000 -14550933 -00000000 -14760931 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02d3e3 -34420300 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08c9f4 -3508180f -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03c0cc -34635af0 -3c15d3e3 -36b50300 -3c16c0cc -36d65af0 -14550917 -00000000 -14760915 -00000000 -24020000 -24030000 -10000008 -00000000 -3c028a18 -3442f159 -1900000b -00000000 -1000000b -00000000 -00000000 -3c088d7a -35080320 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c033495 -34632370 -3c158a18 -36b5f159 -3c163495 -36d62370 -145508fb -00000000 -147608f9 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0245cf -3442ce80 -1900000b -00000000 -1000000b -00000000 -00000000 -3c087b2e -35083980 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03827f -3463a060 -24150000 -24160000 -145508e1 -00000000 -147608df -00000000 -24020000 -24030000 -10000008 -00000000 -3c02fe7b -3442cfc6 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08ec92 -35087780 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03e41f -3463e171 -3c15fe7b -36b5cfc6 -3c16e41f -36d6e171 -145508c5 -00000000 -147608c3 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02a2af -3442d67f -1900000b -00000000 -1000000b -00000000 -00000000 -3c08e1d4 -3508d41e -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c035afa -3463056c -3c15a2af -36b5d67f -3c165afa -36d6056c -145508a9 -00000000 -147608a7 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0235be -344298ae -1900000b -00000000 -1000000b -00000000 -00000000 -3c08fdc9 -35085ce0 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03157d -3463ec7c -3c1535be -36b598ae -3c16157d -36d6ec7c -1455088d -00000000 -1476088b -00000000 -24020000 -24030000 -10000008 -00000000 -3c0289c4 -34424f40 -1900000b -00000000 -1000000b -00000000 -00000000 -3c089483 -3508e85f -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c036063 -34637e46 -3c1589c4 -36b54f40 -3c166063 -36d67e46 -14550871 -00000000 -1476086f -00000000 -24020000 -24030000 -10000008 -00000000 -3c024f7c -34423640 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08c0de -35084c64 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03a2f4 -346370c8 -3c154f7c -36b53640 -3c16a2f4 -36d670c8 -14550855 -00000000 -14760853 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0250d2 -3442757c -1900000b -00000000 -1000000b -00000000 -00000000 -3c08a27a -35084d9c -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03b928 -34635670 -3c1550d2 -36b5757c -3c16b928 -36d65670 -14550839 -00000000 -14760837 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02c242 -34421be0 -1900000b -00000000 -1000000b -00000000 -00000000 -3c081cef -35086038 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03babb -34638e77 -24150000 -24160000 -1455081f -00000000 -1476081d -00000000 -24020000 -24030000 -10000008 -00000000 -3c02695c -3442fda0 -1900000b -00000000 -1000000b -00000000 -00000000 -3c089be6 -35088840 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03a71b -3463c078 -3c15695c -36b5fda0 -3c16a71b -36d6c078 -14550803 -00000000 -14760801 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f8b2 -34423c1a -1900000b -00000000 -1000000b -00000000 -00000000 -3c08ccca -35083490 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03b9ac -34634d90 -3c15f8b2 -36b53c1a -3c16b9ac -36d64d90 -145507e7 -00000000 -147607e5 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0271bf -34428368 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08da31 -35083724 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c030154 -34638108 -3c1571bf -36b58368 -3c160154 -36d68108 -145507cb -00000000 -147607c9 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02bdbe -3442aa7c -1900000b -00000000 -1000000b -00000000 -00000000 -3c080262 -35081df8 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c037b9d -34633200 -24150000 -24160000 -145507b1 -00000000 -147607af -00000000 -24020000 -24030000 -10000008 -00000000 -3c02b7fe -34429960 -1900000b -00000000 -1000000b -00000000 -00000000 -3c0801eb -35083db0 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c031ce5 -346320fe -24150000 -24160000 -14550797 -00000000 -14760795 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0288ae -34427dee -1900000b -00000000 -1000000b -00000000 -00000000 -3c084b18 -3508d264 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03f3ac -3463d260 -24150000 -24160000 -1455077d -00000000 -1476077b -00000000 -24020000 -24030000 -10000008 -00000000 -3c0241dc -34425a50 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08143a -3508ae48 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03828a -3463dbaa -24150000 -24160000 -14550763 -00000000 -14760761 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f427 -344212e6 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08366c -35083c2c -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c034b9a -3463ad60 -24150000 -24160000 -14550749 -00000000 -14760747 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02056b -34424fe2 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08e771 -35081093 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0349f5 -3463abe6 -3c15056b -36b54fe2 -3c1649f5 -36d6abe6 -1455072d -00000000 -1476072b -00000000 -24020000 -24030000 -10000008 -00000000 -3c022324 -34420c39 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08138b -3508c958 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c037944 -3463bbb0 -24150000 -24160000 -14550713 -00000000 -14760711 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02c40b -3442105f -1900000b -00000000 -1000000b -00000000 -00000000 -3c084b6e -35082452 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03aeb9 -346327cc -24150000 -24160000 -145506f9 -00000000 -147606f7 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02d55e -3442f4f0 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08e77d -3508d0e0 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c033eff -3463d5dd -3c15d55e -36b5f4f0 -3c163eff -36d6d5dd -145506dd -00000000 -147606db -00000000 -24020000 -24030000 -10000008 -00000000 -3c022d2f -3442ade4 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08d51d -35080a50 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c030d72 -34631da1 -3c152d2f -36b5ade4 -3c160d72 -36d61da1 -145506c1 -00000000 -147606bf -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f931 -3442b650 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08520e -35086cdd -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03cd9c -3463db8a -24150000 -24160000 -145506a7 -00000000 -147606a5 -00000000 -24020000 -24030000 -10000008 -00000000 -3c021062 -3442e6de -1900000b -00000000 -1000000b -00000000 -00000000 -3c08a0c7 -3508dbb0 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03f0a4 -34638a34 -3c151062 -36b5e6de -3c16f0a4 -36d68a34 -1455068b -00000000 -14760689 -00000000 -24020000 -24030000 -10000008 -00000000 -3c023845 -34426eec -1900000b -00000000 -1000000b -00000000 -00000000 -3c08ae6b -3508eae0 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03472d -3463b7c1 -3c153845 -36b56eec -3c16472d -36d6b7c1 -1455066f -00000000 -1476066d -00000000 -24020000 -24030000 -10000008 -00000000 -3c02d4e1 -3442944a -1900000b -00000000 -1000000b -00000000 -00000000 -3c082ef8 -35088884 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c035174 -3463eba4 -24150000 -24160000 -14550655 -00000000 -14760653 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0296d0 -3442634c -1900000b -00000000 -1000000b -00000000 -00000000 -3c082a1d -3508efe0 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03a2f2 -3463be02 -24150000 -24160000 -1455063b -00000000 -14760639 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0271b3 -3442c7cc -1900000b -00000000 -1000000b -00000000 -00000000 -3c08a9bb -3508b9e0 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0389f3 -346348b8 -3c1571b3 -36b5c7cc -3c1689f3 -36d648b8 -1455061f -00000000 -1476061d -00000000 -24020000 -24030000 -10000008 -00000000 -3c02cd65 -344220c8 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08a854 -35089800 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03b1ce -3463ff00 -3c15cd65 -36b520c8 -3c16b1ce -36d6ff00 -14550603 -00000000 -14760601 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02223e -34422ce3 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08b80d -35088e28 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03cb32 -3463ecfc -3c15223e -36b52ce3 -3c16cb32 -36d6ecfc -145505e7 -00000000 -147605e5 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0272fa -34426330 -1900000b -00000000 -1000000b -00000000 -00000000 -3c088635 -3508f602 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0325d2 -3463801a -3c1572fa -36b56330 -3c1625d2 -36d6801a -145505cb -00000000 -147605c9 -00000000 -24020000 -24030000 -10000008 -00000000 -3c022de6 -3442fb00 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08a090 -3508c24a -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03c14a -3463318a -3c152de6 -36b5fb00 -3c16c14a -36d6318a -145505af -00000000 -147605ad -00000000 -24020000 -24030000 -10000008 -00000000 -3c020774 -3442f390 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08bc55 -35087042 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0373c6 -34634745 -3c150774 -36b5f390 -3c1673c6 -36d64745 -14550593 -00000000 -14760591 -00000000 -24020000 -24030000 -10000008 -00000000 -3c028a3b -34426daa -1900000b -00000000 -1000000b -00000000 -00000000 -3c08dae2 -35088800 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03f313 -34636500 -3c158a3b -36b56daa -3c16f313 -36d66500 -14550577 -00000000 -14760575 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02a02c -344226b6 -1900000b -00000000 -1000000b -00000000 -00000000 -3c0824a6 -35082776 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03fdf6 -34632090 -24150000 -24160000 -1455055d -00000000 -1476055b -00000000 -24020000 -24030000 -10000008 -00000000 -3c02ed77 -344214b0 -1900000b -00000000 -1000000b -00000000 -00000000 -3c083692 -35085ac4 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c036629 -3463ee00 -24150000 -24160000 -14550543 -00000000 -14760541 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0271bb -3442ded0 -1900000b -00000000 -1000000b -00000000 -00000000 -3c0867ab -3508bfc0 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c033fee -34636160 -24150000 -24160000 -14550529 -00000000 -14760527 -00000000 -24020000 -24030000 -10000008 -00000000 -3c023d8f -34421a8a -1900000b -00000000 -1000000b -00000000 -00000000 -3c0864bb -35080041 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c030441 -346392d0 -24150000 -24160000 -1455050f -00000000 -1476050d -00000000 -24020000 -24030000 -10000008 -00000000 -3c026fb6 -34428600 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08ef5e -350836ec -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03de3b -3463e459 -3c156fb6 -36b58600 -3c16de3b -36d6e459 -145504f3 -00000000 -147604f1 -00000000 -24020000 -24030000 -10000008 -00000000 -3c021e47 -34425e98 -1900000b -00000000 -1000000b -00000000 -00000000 -3c085861 -35087c0c -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03d25d -34633c80 -24150000 -24160000 -145504d9 -00000000 -147604d7 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02fed4 -3442acc0 -1900000b -00000000 -1000000b -00000000 -00000000 -3c084f5a -3508a540 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0394e2 -346390c0 -24150000 -24160000 -145504bf -00000000 -147604bd -00000000 -24020000 -24030000 -10000008 -00000000 -3c02d41b -34421e8e -1900000b -00000000 -1000000b -00000000 -00000000 -3c0815c8 -3508a6a4 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03107e -3463c850 -24150000 -24160000 -145504a5 -00000000 -147604a3 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02180f -3442c230 -1900000b -00000000 -1000000b -00000000 -00000000 -3c0884ae -3508b3d1 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c030f6b -3463277c -3c15180f -36b5c230 -3c160f6b -36d6277c -14550489 -00000000 -14760487 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02d46d -3442c404 -1900000b -00000000 -1000000b -00000000 -00000000 -3c0875f1 -3508e8ec -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c038a0c -34632f80 -24150000 -24160000 -1455046f -00000000 -1476046d -00000000 -24020000 -24030000 -10000008 -00000000 -3c029dbd -344296ba -1900000b -00000000 -1000000b -00000000 -00000000 -3c08a71d -3508f424 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03c34f -34631395 -3c159dbd -36b596ba -3c16c34f -36d61395 -14550453 -00000000 -14760451 -00000000 -24020000 -24030000 -10000008 -00000000 -3c026ca5 -34421928 -1900000b -00000000 -1000000b -00000000 -00000000 -3c086a49 -35087260 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c034963 -34631ed4 -24150000 -24160000 -14550439 -00000000 -14760437 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0203ee -3442a8a0 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08de46 -35085880 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0375a8 -34638f70 -3c1503ee -36b5a8a0 -3c1675a8 -36d68f70 -1455041d -00000000 -1476041b -00000000 -24020000 -24030000 -10000008 -00000000 -3c020710 -3442f698 -1900000b -00000000 -1000000b -00000000 -00000000 -3c0862b8 -35084868 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c035d48 -34638830 -24150000 -24160000 -14550403 -00000000 -14760401 -00000000 -24020000 -24030000 -10000008 -00000000 -3c026736 -3442cbdc -1900000b -00000000 -1000000b -00000000 -00000000 -3c086f0b -35085010 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03b410 -34634e66 -24150000 -24160000 -145503e9 -00000000 -147603e7 -00000000 -24020000 -24030000 -10000008 -00000000 -3c027cd6 -3442e57c -1900000b -00000000 -1000000b -00000000 -00000000 -3c086268 -3508d97e -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c030372 -3463e4e8 -24150000 -24160000 -145503cf -00000000 -147603cd -00000000 -24020000 -24030000 -10000008 -00000000 -3c02d741 -34428070 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08bdf6 -350815ac -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0322dd -3463bf82 -3c15d741 -36b58070 -3c1622dd -36d6bf82 -145503b3 -00000000 -147603b1 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02dced -34420c38 -1900000b -00000000 -1000000b -00000000 -00000000 -3c085f8e -35089c47 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c035818 -34638fe0 -24150000 -24160000 -14550399 -00000000 -14760397 -00000000 -24020000 -24030000 -10000008 -00000000 -3c023f59 -34429ee0 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08200a -35081580 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03c9a4 -346316ac -24150000 -24160000 -1455037f -00000000 -1476037d -00000000 -24020000 -24030000 -10000008 -00000000 -3c02cfa4 -3442be8b -1900000b -00000000 -1000000b -00000000 -00000000 -3c08c483 -3508b8a4 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c035fb8 -3463c0f6 -3c15cfa4 -36b5be8b -3c165fb8 -36d6c0f6 -14550363 -00000000 -14760361 -00000000 -24020000 -24030000 -10000008 -00000000 -3c025deb -34425e4c -1900000b -00000000 -1000000b -00000000 -00000000 -3c08cd79 -35083200 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03512f -34633cea -3c155deb -36b55e4c -3c16512f -36d63cea -14550347 -00000000 -14760345 -00000000 -24020000 -24030000 -10000008 -00000000 -3c026203 -34425890 -1900000b -00000000 -1000000b -00000000 -00000000 -3c083308 -3508ef00 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c039722 -3463fa12 -24150000 -24160000 -1455032d -00000000 -1476032b -00000000 -24020000 -24030000 -10000008 -00000000 -3c02c02e -3442de0d -1900000b -00000000 -1000000b -00000000 -00000000 -3c085938 -3508314e -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c039bbe -3463f21a -24150000 -24160000 -14550313 -00000000 -14760311 -00000000 -24020000 -24030000 -10000008 -00000000 -3c024a6e -34420b42 -1900000b -00000000 -1000000b -00000000 -00000000 -3c0858dc -35089f26 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c036c5c -3463deb0 -24150000 -24160000 -145502f9 -00000000 -147602f7 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02afa5 -3442358e -1900000b -00000000 -1000000b -00000000 -00000000 -3c082bbb -35088200 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03b5c9 -34634626 -24150000 -24160000 -145502df -00000000 -147602dd -00000000 -24020000 -24030000 -10000008 -00000000 -3c025caf -3442581c -1900000b -00000000 -1000000b -00000000 -00000000 -3c08c04e -350853a0 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03e20e -34638a18 -3c155caf -36b5581c -3c16e20e -36d68a18 -145502c3 -00000000 -147602c1 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02bee2 -3442a7c6 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08c5a2 -350891b6 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03ee1d -34634d60 -3c15bee2 -36b5a7c6 -3c16ee1d -36d64d60 -145502a7 -00000000 -147602a5 -00000000 -24020000 -24030000 -10000008 -00000000 -3c025a12 -344265a6 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08b01a -3508b8d0 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c030791 -34634eb2 -3c155a12 -36b565a6 -3c160791 -36d64eb2 -1455028b -00000000 -14760289 -00000000 -24020000 -24030000 -10000008 -00000000 -3c026810 -3442e584 -1900000b -00000000 -1000000b -00000000 -00000000 -3c089d16 -35080dfc -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c031a4a -3463d589 -3c156810 -36b5e584 -3c161a4a -36d6d589 -1455026f -00000000 -1476026d -00000000 -24020000 -24030000 -10000008 -00000000 -3c0210d1 -34421628 -1900000b -00000000 -1000000b -00000000 -00000000 -3c081f0b -3508a8e4 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c033875 -34633511 -24150000 -24160000 -14550255 -00000000 -14760253 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02ea5f -34429140 -1900000b -00000000 -1000000b -00000000 -00000000 -3c086507 -3508ec40 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0317f2 -34631988 -24150000 -24160000 -1455023b -00000000 -14760239 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02a932 -3442da00 -1900000b -00000000 -1000000b -00000000 -00000000 -3c081868 -3508a42b -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c031f46 -34636b40 -24150000 -24160000 -14550221 -00000000 -1476021f -00000000 -24020000 -24030000 -10000008 -00000000 -3c023830 -3442c310 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08b857 -35088598 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c039a19 -346349a8 -3c153830 -36b5c310 -3c169a19 -36d649a8 -14550205 -00000000 -14760203 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f1ce -34427584 -1900000b -00000000 -1000000b -00000000 -00000000 -3c083dbf -35089e34 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03b008 -3463118b -24150000 -24160000 -145501eb -00000000 -147601e9 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02b8e0 -344206b2 -1900000b -00000000 -1000000b -00000000 -00000000 -3c080fe6 -35086641 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c037fc5 -34632652 -24150000 -24160000 -145501d1 -00000000 -147601cf -00000000 -24020000 -24030000 -10000008 -00000000 -3c02cd12 -3442d338 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08306d -3508c10e -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03bba7 -3463d90c -24150000 -24160000 -145501b7 -00000000 -147601b5 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02eec3 -34426fc0 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08540d -3508c4a4 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c037405 -3463fca0 -24150000 -24160000 -1455019d -00000000 -1476019b -00000000 -24020000 -24030000 -10000008 -00000000 -3c02cfe8 -3442ef46 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08a437 -35080260 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c034ca6 -34631163 -3c15cfe8 -36b5ef46 -3c164ca6 -36d61163 -14550181 -00000000 -1476017f -00000000 -24020000 -24030000 -10000008 -00000000 -3c021097 -34420080 -1900000b -00000000 -1000000b -00000000 -00000000 -3c085e23 -3508d148 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0324e4 -3463393d -24150000 -24160000 -14550167 -00000000 -14760165 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f7ef -3442a088 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08e886 -3508dcfa -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03fff8 -346314d0 -3c15f7ef -36b5a088 -3c16fff8 -36d614d0 -1455014b -00000000 -14760149 -00000000 -24020000 -24030000 -10000008 -00000000 -3c0209e3 -3442f920 -1900000b -00000000 -1000000b -00000000 -00000000 -3c080e73 -3508e9d5 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0319f2 -346327c0 -24150000 -24160000 -14550131 -00000000 -1476012f -00000000 -24020000 -24030000 -10000008 -00000000 -3c02b4b7 -34428c80 -1900000b -00000000 -1000000b -00000000 -00000000 -3c0875eb -350813ea -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03ea25 -34638bd0 -24150000 -24160000 -14550117 -00000000 -14760115 -00000000 -24020000 -24030000 -10000008 -00000000 -3c024e19 -344240fc -1900000b -00000000 -1000000b -00000000 -00000000 -3c081901 -35085b8e -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0338e2 -34630270 -24150000 -24160000 -145500fd -00000000 -147600fb -00000000 -24020000 -24030000 -10000008 -00000000 -3c024aaf -3442c444 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08972d -3508e888 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03a570 -3463efa8 -3c154aaf -36b5c444 -3c16a570 -36d6efa8 -145500e1 -00000000 -147600df -00000000 -24020000 -24030000 -10000008 -00000000 -3c02f0d7 -3442500c -1900000b -00000000 -1000000b -00000000 -00000000 -3c08ee1a -35082edc -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c031757 -3463a2b8 -3c15f0d7 -36b5500c -3c161757 -36d6a2b8 -145500c5 -00000000 -147600c3 -00000000 -24020000 -24030000 -10000008 -00000000 -3c023e94 -34423321 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08443c -35087e4e -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03f4a1 -346352a0 -24150000 -24160000 -145500ab -00000000 -147600a9 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02babf -344226a8 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08117e -35088344 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c039c06 -3463c0c0 -24150000 -24160000 -14550091 -00000000 -1476008f -00000000 -24020000 -24030000 -10000008 -00000000 -3c02ea86 -34427f00 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08dab5 -350862ac -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c036d76 -346350e5 -3c15ea86 -36b57f00 -3c166d76 -36d650e5 -14550075 -00000000 -14760073 -00000000 -24020000 -24030000 -10000008 -00000000 -3c02d052 -34422db0 -1900000b -00000000 -1000000b -00000000 -00000000 -3c088d7e -35089274 -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03d10a -3463197c -3c15d052 -36b52db0 -3c16d10a -36d6197c -14550059 -00000000 -14760057 -00000000 -24020000 -24030000 -10000008 -00000000 -3c022a46 -3442001d -1900000b -00000000 -1000000b -00000000 -00000000 -3c08dcfa -3508fe3c -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c0305fa -34632efa -3c152a46 -36b5001d -3c1605fa -36d62efa -1455003d -00000000 -1476003b -00000000 -24020000 -24030000 -10000008 -00000000 -3c02207b -3442d558 -1900000b -00000000 -1000000b -00000000 -00000000 -3c08f293 -35088d4c -1900fff6 -00000000 -10000004 -00000000 -00000000 -3c03aacf -3463ecf0 -3c15207b -36b5d558 -3c16aacf -36d6ecf0 -14550021 -00000000 -1476001f -00000000 -24020000 -24030000 -10000008 -00000000 -3c02bb97 -344234a0 -1900000a -00000000 -1000000a -00000000 -00000000 -24080000 -1900fff7 -00000000 -10000004 -00000000 -00000000 -3c03ff0a -3463f084 -3c15bb97 -36b534a0 -3c16ff0a -36d6f084 -14550006 -00000000 -14760004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -00000000 -26100001 -24120000 -3c0879db -3508db34 -24090007 -3c03eded -34639a00 -01281004 -1443087e -00000000 -3c08a903 -3508fa10 -2409001d -24030000 -01281004 -14430877 -00000000 -3c086bd7 -350839d8 -2409000d -3c03e73b -01281004 -14430870 -00000000 -3c08273a -3508784a -2409000a -3c03e9e1 -34632800 -01281004 -14430868 -00000000 -3c083405 -35088000 -24090009 -3c030b00 -01281004 -14430861 -00000000 -3c087c82 -35085738 -24090002 -3c03f209 -34635ce0 -01281004 -14430859 -00000000 -3c087016 -3508cbc2 -2409000a -3c035b2f -34630800 -01281004 -14430851 -00000000 -3c084a4a -350830e0 -24090009 -3c039461 -3463c000 -01281004 -14430849 -00000000 -3c08949d -350824ae -2409000f -3c039257 -01281004 -14430842 -00000000 -3c08951c -3508a218 -2409001c -3c038000 -01281004 -1443083b -00000000 -3c08c137 -3508cea0 -24090013 -3c037500 -01281004 -14430834 -00000000 -3c0896b7 -3508d6f6 -24090019 -3c03ec00 -01281004 -1443082d -00000000 -3c08e2b9 -3508c7a9 -24090016 -3c03ea40 -01281004 -14430826 -00000000 -3c08b2b3 -35080175 -24090014 -3c031750 -01281004 -1443081f -00000000 -3c0869be -35084540 -2409000a -3c03f915 -01281004 -14430818 -00000000 -3c087c52 -3508a6b8 -2409000c -3c032a6b -34638000 -01281004 -14430810 -00000000 -3c08f5fa -3508f940 -24090010 -3c03f940 -01281004 -14430809 -00000000 -3c08be28 -35087b6d -24090017 -3c03b680 -01281004 -14430802 -00000000 -3c0827fb -35082ce5 -2409001b -3c032800 -01281004 -144307fb -00000000 -3c0810e5 -35086648 -2409000c -3c035664 -34638000 -01281004 -144307f3 -00000000 -3c08f1f7 -35086d5c -24090019 -3c03b800 -01281004 -144307ec -00000000 -3c081eea -35084938 -24090014 -3c039380 -01281004 -144307e5 -00000000 -3c089925 -3508ee64 -2409000f -3c03f732 -01281004 -144307de -00000000 -3c08687c -350868b0 -24090014 -3c038b00 -01281004 -144307d7 -00000000 -3c085783 -35086790 -24090016 -3c03e400 -01281004 -144307d0 -00000000 -3c08f105 -3508ef10 -2409000d -3c03bde2 -01281004 -144307c9 -00000000 -3c08f214 -3508adb4 -24090006 -3c03852b -34636d00 -01281004 -144307c1 -00000000 -3c08398a -35082730 -24090013 -3c033980 -01281004 -144307ba -00000000 -3c085b29 -3508289c -24090013 -3c0344e0 -01281004 -144307b3 -00000000 -3c08c9a4 -350819c0 -24090019 -3c038000 -01281004 -144307ac -00000000 -3c088788 -35083249 -24090013 -3c039248 -01281004 -144307a5 -00000000 -3c08a1d6 -3508c588 -24090011 -3c038b10 -01281004 -1443079e -00000000 -3c082375 -35088004 -24090009 -3c03eb00 -34630800 -01281004 -14430796 -00000000 -3c08c6e9 -350828d0 -2409000f -3c039468 -01281004 -1443078f -00000000 -3c088d90 -35080ae4 -24090010 -3c030ae4 -01281004 -14430788 -00000000 -3c0899e3 -3508ba00 -2409001b -24030000 -01281004 -14430781 -00000000 -3c080137 -3508d1e8 -2409000d -3c03fa3d -01281004 -1443077a -00000000 -3c088fd6 -35082ad0 -24090000 -3c038fd6 -34632ad0 -01281004 -14430772 -00000000 -3c080b88 -35088d4c -2409001a -3c033000 -01281004 -1443076b -00000000 -3c08585f -35088f28 -24090007 -3c032fc7 -34639400 -01281004 -14430763 -00000000 -3c08b0b0 -35089f98 -24090007 -3c03584f -3463cc00 -01281004 -1443075b -00000000 -3c08e08d -3508ab9c -24090009 -3c031b57 -34633800 -01281004 -14430753 -00000000 -3c08c0f7 -35081e1c -24090004 -3c030f71 -3463e1c0 -01281004 -1443074b -00000000 -3c08ff68 -35085a9c -2409001f -24030000 -01281004 -14430744 -00000000 -3c08a32c -35084348 -24090017 -3c03a400 -01281004 -1443073d -00000000 -3c08e261 -35081a00 -2409000a -3c038468 -01281004 -14430736 -00000000 -3c080122 -3508739b -2409000d -3c034e73 -34636000 -01281004 -1443072e -00000000 -3c08c743 -35083a9e -2409000d -3c036753 -3463c000 -01281004 -14430726 -00000000 -3c08118f -3508cb00 -24090002 -3c03463f -34632c00 -01281004 -1443071e -00000000 -3c0872d3 -3508ced8 -24090015 -3c03db00 -01281004 -14430717 -00000000 -3c08ce4d -35082a10 -2409001a -3c034000 -01281004 -14430710 -00000000 -3c084ea4 -3508b03a -24090013 -3c0381d0 -01281004 -14430709 -00000000 -3c08470a -3508c0d0 -2409001d -24030000 -01281004 -14430702 -00000000 -3c087106 -3508c6a0 -24090017 -3c035000 -01281004 -144306fb -00000000 -3c08eb36 -3508b8d6 -24090006 -3c03cdae -34633580 -01281004 -144306f3 -00000000 -3c08e69f -3508eb9a -2409000b -3c03ff5c -3463d000 -01281004 -144306eb -00000000 -3c08d2fb -3508fd80 -24090019 -24030000 -01281004 -144306e4 -00000000 -3c0899b0 -3508b320 -24090018 -3c032000 -01281004 -144306dd -00000000 -3c083d43 -3508a180 -24090016 -3c036000 -01281004 -144306d6 -00000000 -3c088116 -350833f0 -2409001d -24030000 -01281004 -144306cf -00000000 -3c080ada -3508f9d0 -24090009 -3c03b5f3 -3463a000 -01281004 -144306c7 -00000000 -3c082ac4 -3508db84 -2409000b -3c0326dc -34632000 -01281004 -144306bf -00000000 -3c08e6b4 -35081000 -24090000 -3c03e6b4 -34631000 -01281004 -144306b7 -00000000 -3c084405 -35080d44 -2409001c -3c034000 -01281004 -144306b0 -00000000 -3c08cef4 -35087ae0 -2409001f -24030000 -01281004 -144306a9 -00000000 -3c08cb58 -3508e299 -2409001f -3c038000 -01281004 -144306a2 -00000000 -3c08d761 -3508ba60 -2409000a -3c0386e9 -34638000 -01281004 -1443069a -00000000 -3c08c4b9 -35087c6e -24090006 -3c032e5f -34631b80 -01281004 -14430692 -00000000 -3c08d8e0 -350884e0 -24090017 -3c037000 -01281004 -1443068b -00000000 -3c086f62 -3508be20 -24090000 -3c036f62 -3463be20 -01281004 -14430683 -00000000 -3c0893fa -35082224 -24090009 -3c03f444 -34634800 -01281004 -1443067b -00000000 -3c081746 -35080a00 -24090019 -24030000 -01281004 -14430674 -00000000 -3c087d04 -3508da00 -2409000f -3c036d00 -01281004 -1443066d -00000000 -3c08940d -3508f080 -24090013 -3c038400 -01281004 -14430666 -00000000 -3c084deb -3508fc42 -2409001d -3c034000 -01281004 -1443065f -00000000 -3c08e8bc -3508a424 -2409000e -3c032909 -01281004 -14430658 -00000000 -3c084ded -3508e958 -2409001b -3c03c000 -01281004 -14430651 -00000000 -3c084e70 -3508b0be -24090011 -3c03617c -01281004 -1443064a -00000000 -3c08b9f7 -3508da6c -24090004 -3c039f7d -3463a6c0 -01281004 -14430642 -00000000 -3c08d82f -3508c800 -24090001 -3c03b05f -34639000 -01281004 -1443063a -00000000 -3c08bccf -35086abc -2409000d -3c03ed57 -34638000 -01281004 -14430632 -00000000 -3c08fca4 -35086278 -2409001f -24030000 -01281004 -1443062b -00000000 -3c08d6e4 -35082464 -24090008 -3c03e424 -34636400 -01281004 -14430623 -00000000 -3c08c016 -35086f60 -2409000d -3c03cdec -01281004 -1443061c -00000000 -3c0814d7 -3508f5f0 -2409000e -3c03fd7c -01281004 -14430615 -00000000 -3c082a87 -3508d301 -24090005 -3c0350fa -34636020 -01281004 -1443060d -00000000 -3c081295 -35088a26 -24090003 -3c0394ac -34635130 -01281004 -14430605 -00000000 -3c08406a -35083de8 -2409001e -24030000 -01281004 -144305fe -00000000 -3c08680b -3508ecb0 -2409000f -3c03f658 -01281004 -144305f7 -00000000 -3c08e67d -350854c0 -2409000d -3c03aa98 -01281004 -144305f0 -00000000 -3c081687 -35084504 -2409001b -3c032000 -01281004 -144305e9 -00000000 -3c08b655 -3508a278 -2409001d -24030000 -01281004 -144305e2 -00000000 -3c080a08 -3508c174 -24090011 -3c0382e8 -01281004 -144305db -00000000 -3c08e5e5 -35088380 -24090006 -3c037960 -3463e000 -01281004 -144305d3 -00000000 -3c08148d -3508c340 -24090017 -3c03a000 -01281004 -144305cc -00000000 -3c08c6ff -3508cf60 -2409000b -3c03fe7b -01281004 -144305c5 -00000000 -3c0851ed -3508adc8 -2409000e -3c036b72 -01281004 -144305be -00000000 -3c082810 -35084394 -24090006 -3c030410 -3463e500 -01281004 -144305b6 -00000000 -3c08dc32 -35087b4e -24090016 -3c03d380 -01281004 -144305af -00000000 -3c08dc61 -3508023b -24090012 -3c0308ec -01281004 -144305a8 -00000000 -3c082589 -35085ec8 -2409000f -3c03af64 -01281004 -144305a1 -00000000 -3c0820e4 -350862e8 -24090019 -3c03d000 -01281004 -1443059a -00000000 -3c08fa6c -3508e618 -24090005 -3c034d9c -3463c300 -01281004 -14430592 -00000000 -3c087ffa -3508f5c0 -2409001e -24030000 -01281004 -1443058b -00000000 -3c0840b4 -3508e265 -24090014 -3c032650 -01281004 -14430584 -00000000 -3c089648 -35086a70 -2409000d -3c030d4e -01281004 -1443057d -00000000 -3c08ca89 -35085580 -24090002 -3c032a25 -34635600 -01281004 -14430575 -00000000 -3c0889a4 -350815a8 -24090013 -3c03ad40 -01281004 -1443056e -00000000 -3c08bcdf -3508c854 -24090007 -3c036fe4 -34632a00 -01281004 -14430566 -00000000 -3c08a3e7 -35088c0e -24090019 -3c031c00 -01281004 -1443055f -00000000 -3c08a17c -350875cc -24090012 -3c03d730 -01281004 -14430558 -00000000 -3c08d682 -3508d870 -2409000d -3c035b0e -01281004 -14430551 -00000000 -3c08cce4 -35081a43 -24090015 -3c034860 -01281004 -1443054a -00000000 -3c085a9f -3508d367 -2409001d -3c03e000 -01281004 -14430543 -00000000 -3c08d7c5 -3508af3c -24090008 -3c03c5af -34633c00 -01281004 -1443053b -00000000 -3c087c15 -35089e3c -2409000d -3c03b3c7 -34638000 -01281004 -14430533 -00000000 -3c08dcdf -35081a48 -24090014 -3c03a480 -01281004 -1443052c -00000000 -3c082994 -35082540 -24090002 -3c03a650 -34639500 -01281004 -14430524 -00000000 -3c08b73d -3508c880 -24090015 -3c031000 -01281004 -1443051d -00000000 -3c08a363 -35085354 -24090012 -3c034d50 -01281004 -14430516 -00000000 -3c085186 -35089ead -24090015 -3c03d5a0 -01281004 -1443050f -00000000 -3c087e8a -35083b38 -24090000 -3c037e8a -34633b38 -01281004 -14430507 -00000000 -3c088da6 -35083f26 -24090015 -3c03e4c0 -01281004 -14430500 -00000000 -3c0839b6 -35086e1a -24090007 -3c03db37 -34630d00 -01281004 -144304f8 -00000000 -3c0869ec -3508a580 -24090018 -3c038000 -01281004 -144304f1 -00000000 -3c083915 -350854e5 -2409000b -3c03aaa7 -34632800 -01281004 -144304e9 -00000000 -3c087825 -3508fdca -24090012 -3c03f728 -01281004 -144304e2 -00000000 -3c0876ad -350879c0 -2409000e -3c035e70 -01281004 -144304db -00000000 -3c089251 -35080adb -24090018 -3c03db00 -01281004 -144304d4 -00000000 -3c080067 -350826cc -2409001e -24030000 -01281004 -144304cd -00000000 -3c087199 -35080146 -24090013 -3c030a30 -01281004 -144304c6 -00000000 -3c08b16d -3508ffdc -2409000b -3c036ffe -3463e000 -01281004 -144304be -00000000 -3c081497 -35085570 -24090008 -3c039755 -34637000 -01281004 -144304b6 -00000000 -3c0877c0 -35081184 -24090000 -3c0377c0 -34631184 -01281004 -144304ae -00000000 -3c086785 -35087183 -24090006 -3c03e15c -346360c0 -01281004 -144304a6 -00000000 -3c089de3 -3508b83f -2409000d -3c037707 -3463e000 -01281004 -1443049e -00000000 -3c08d4ba -350897c4 -2409000a -3c03ea5f -34631000 -01281004 -14430496 -00000000 -3c08437e -35088e14 -2409001e -24030000 -01281004 -1443048f -00000000 -3c089cb2 -350831d4 -24090010 -3c0331d4 -01281004 -14430488 -00000000 -3c08de53 -35087f8c -24090011 -3c03ff18 -01281004 -14430481 -00000000 -3c08f387 -35081474 -24090008 -3c038714 -34637400 -01281004 -14430479 -00000000 -3c08003d -3508b9a8 -24090008 -3c033db9 -3463a800 -01281004 -14430471 -00000000 -3c08ef20 -3508582a -24090008 -3c032058 -34632a00 -01281004 -14430469 -00000000 -3c08c355 -35083251 -24090019 -3c03a200 -01281004 -14430462 -00000000 -3c08bb30 -35082ae0 -24090005 -3c036605 -34635c00 -01281004 -1443045a -00000000 -3c08ff1c -35086596 -24090016 -3c036580 -01281004 -14430453 -00000000 -3c089f65 -3508a5c2 -24090013 -3c032e10 -01281004 -1443044c -00000000 -3c08a337 -35086784 -2409000e -3c03d9e1 -01281004 -14430445 -00000000 -3c08be04 -35080fcc -24090019 -3c039800 -01281004 -1443043e -00000000 -3c08ee62 -35082b70 -2409001b -3c038000 -01281004 -14430437 -00000000 -3c088e71 -3508dbe2 -24090014 -3c03be20 -01281004 -14430430 -00000000 -3c0878c4 -350803d7 -24090005 -3c031880 -34637ae0 -01281004 -14430428 -00000000 -3c08d00d -3508b648 -24090007 -3c0306db -34632400 -01281004 -14430420 -00000000 -3c082f7b -35089bfa -24090004 -3c03f7b9 -3463bfa0 -01281004 -14430418 -00000000 -3c0833a4 -3508be82 -2409001a -3c030800 -01281004 -14430411 -00000000 -3c081451 -3508c0dc -24090015 -3c031b80 -01281004 -1443040a -00000000 -3c08e70d -3508261e -24090003 -3c033869 -346330f0 -01281004 -14430402 -00000000 -3c082b63 -3508cb38 -2409001b -3c03c000 -01281004 -144303fb -00000000 -3c08c56b -35088b90 -24090011 -3c031720 -01281004 -144303f4 -00000000 -3c082442 -350819d4 -2409001f -24030000 -01281004 -144303ed -00000000 -3c086b51 -3508e9c2 -2409001a -3c030800 -01281004 -144303e6 -00000000 -3c08b8d9 -3508e5f8 -2409000c -3c039e5f -34638000 -01281004 -144303de -00000000 -3c089492 -3508c630 -2409000c -3c032c63 -01281004 -144303d7 -00000000 -3c08a419 -3508afc0 -2409001b -24030000 -01281004 -144303d0 -00000000 -3c08fef3 -35084de0 -24090009 -3c03e69b -3463c000 -01281004 -144303c8 -00000000 -3c084eb8 -3508cbca -2409001d -3c034000 -01281004 -144303c1 -00000000 -3c086649 -35085b88 -2409000d -3c032b71 -01281004 -144303ba -00000000 -3c082726 -35087278 -24090015 -3c034f00 -01281004 -144303b3 -00000000 -3c083278 -35089910 -2409001c -24030000 -01281004 -144303ac -00000000 -3c089db8 -350898e9 -24090015 -3c031d20 -01281004 -144303a5 -00000000 -3c08f2f8 -350835c0 -2409001c -24030000 -01281004 -1443039e -00000000 -3c08e5d0 -35088f1c -24090000 -3c03e5d0 -34638f1c -01281004 -14430396 -00000000 -3c087231 -35085bfc -24090014 -3c03bfc0 -01281004 -1443038f -00000000 -3c087a38 -3508d700 -24090001 -3c03f471 -3463ae00 -01281004 -14430387 -00000000 -3c0876cd -3508f700 -24090016 -3c03c000 -01281004 -14430380 -00000000 -3c08dbe4 -35086800 -24090010 -3c036800 -01281004 -14430379 -00000000 -3c08722b -3508ca40 -24090011 -3c039480 -01281004 -14430372 -00000000 -3c08d371 -350816f8 -24090006 -3c03dc45 -3463be00 -01281004 -1443036a -00000000 -3c088c4d -35084800 -24090017 -24030000 -01281004 -14430363 -00000000 -3c084415 -350866d5 -24090019 -3c03aa00 -01281004 -1443035c -00000000 -3c081c9d -3508905c -2409001f -24030000 -01281004 -14430355 -00000000 -3c085fef -35089198 -24090012 -3c034660 -01281004 -1443034e -00000000 -3c08ee6f -3508f60b -2409000c -3c03ff60 -3463b000 -01281004 -14430346 -00000000 -3c08da51 -35089dd4 -24090007 -3c0328ce -3463ea00 -01281004 -1443033e -00000000 -3c0827a1 -35084a12 -2409000a -3c038528 -34634800 -01281004 -14430336 -00000000 -3c0821e4 -350867b0 -2409000f -3c0333d8 -01281004 -1443032f -00000000 -3c080103 -35084900 -24090004 -3c031034 -34639000 -01281004 -14430327 -00000000 -3c083826 -3508bdf6 -2409001a -3c03d800 -01281004 -14430320 -00000000 -3c088b14 -35088fe0 -24090003 -3c0358a4 -34637f00 -01281004 -14430318 -00000000 -3c08ce87 -35088c10 -24090007 -3c0343c6 -34630800 -01281004 -14430310 -00000000 -3c08fd68 -35081070 -24090017 -3c033800 -01281004 -14430309 -00000000 -3c080b43 -35089f62 -24090013 -3c03fb10 -01281004 -14430302 -00000000 -3c08a1ee -35080314 -2409000b -3c037018 -3463a000 -01281004 -144302fa -00000000 -3c086d21 -350875a0 -2409001d -24030000 -01281004 -144302f3 -00000000 -3c082050 -35085abd -24090017 -3c035e80 -01281004 -144302ec -00000000 -3c08f7fe -3508a1d0 -24090007 -3c03ff50 -3463e800 -01281004 -144302e4 -00000000 -3c08c7a3 -3508f400 -2409000c -3c033f40 -01281004 -144302dd -00000000 -3c081b96 -350890c3 -2409001b -3c031800 -01281004 -144302d6 -00000000 -3c08999f -3508f140 -24090000 -3c03999f -3463f140 -01281004 -144302ce -00000000 -3c08235b -35080856 -2409000e -3c03c215 -34638000 -01281004 -144302c6 -00000000 -3c08bd3f -35083520 -24090000 -3c03bd3f -34633520 -01281004 -144302be -00000000 -3c082ba8 -3508915a -24090000 -3c032ba8 -3463915a -01281004 -144302b6 -00000000 -3c08c2d4 -3508a826 -24090000 -3c03c2d4 -3463a826 -01281004 -144302ae -00000000 -3c085b74 -35089a60 -24090000 -3c035b74 -34639a60 -01281004 -144302a6 -00000000 -3c080829 -35081e00 -24090000 -3c030829 -34631e00 -01281004 -1443029e -00000000 -3c0880b5 -35083fd8 -24090000 -3c0380b5 -34633fd8 -01281004 -14430296 -00000000 -3c08bd63 -35080190 -24090000 -3c03bd63 -34630190 -01281004 -1443028e -00000000 -3c08ae46 -3508e1d8 -24090000 -3c03ae46 -3463e1d8 -01281004 -14430286 -00000000 -3c084afb -35089404 -24090000 -3c034afb -34639404 -01281004 -1443027e -00000000 -3c08aa34 -35085ff4 -24090000 -3c03aa34 -34635ff4 -01281004 -14430276 -00000000 -3c0804e4 -35086b9c -24090000 -3c0304e4 -34636b9c -01281004 -1443026e -00000000 -3c089851 -3508a9ab -24090000 -3c039851 -3463a9ab -01281004 -14430266 -00000000 -3c08cf81 -35084896 -24090000 -3c03cf81 -34634896 -01281004 -1443025e -00000000 -3c084431 -35080c9e -24090000 -3c034431 -34630c9e -01281004 -14430256 -00000000 -3c08fd51 -350832aa -24090000 -3c03fd51 -346332aa -01281004 -1443024e -00000000 -3c08cf2b -35086950 -24090000 -3c03cf2b -34636950 -01281004 -14430246 -00000000 -3c086351 -35088bb0 -24090000 -3c036351 -34638bb0 -01281004 -1443023e -00000000 -3c08e8f3 -3508cf20 -24090000 -3c03e8f3 -3463cf20 -01281004 -14430236 -00000000 -3c08d3e7 -3508db28 -24090000 -3c03d3e7 -3463db28 -01281004 -1443022e -00000000 -3c08f54b -350866fc -24090000 -3c03f54b -346366fc -01281004 -14430226 -00000000 -3c0831ed -3508e4b8 -24090000 -3c0331ed -3463e4b8 -01281004 -1443021e -00000000 -3c082728 -3508c3a2 -24090000 -3c032728 -3463c3a2 -01281004 -14430216 -00000000 -3c080c40 -35080340 -24090000 -3c030c40 -34630340 -01281004 -1443020e -00000000 -3c080b5b -35083e04 -24090000 -3c030b5b -34633e04 -01281004 -14430206 -00000000 -3c083080 -35087cb0 -24090000 -3c033080 -34637cb0 -01281004 -144301fe -00000000 -3c08ace9 -35082d24 -24090000 -3c03ace9 -34632d24 -01281004 -144301f6 -00000000 -3c088b48 -35085f60 -24090000 -3c038b48 -34635f60 -01281004 -144301ee -00000000 -3c084ee5 -350819ee -24090000 -3c034ee5 -346319ee -01281004 -144301e6 -00000000 -3c08d477 -3508fb2c -24090000 -3c03d477 -3463fb2c -01281004 -144301de -00000000 -3c0830ea -3508056b -24090000 -3c0330ea -3463056b -01281004 -144301d6 -00000000 -3c082752 -3508c3c0 -24090000 -3c032752 -3463c3c0 -01281004 -144301ce -00000000 -3c0857c6 -35089600 -24090000 -3c0357c6 -34639600 -01281004 -144301c6 -00000000 -3c088d41 -35084e38 -24090000 -3c038d41 -34634e38 -01281004 -144301be -00000000 -3c0897d3 -35088920 -24090000 -3c0397d3 -34638920 -01281004 -144301b6 -00000000 -3c0894d6 -35089c62 -24090000 -3c0394d6 -34639c62 -01281004 -144301ae -00000000 -3c0867da -35083e31 -24090000 -3c0367da -34633e31 -01281004 -144301a6 -00000000 -3c08729d -35083688 -24090000 -3c03729d -34633688 -01281004 -1443019e -00000000 -3c08a51f -350879bf -24090000 -3c03a51f -346379bf -01281004 -14430196 -00000000 -3c081473 -35086ed5 -24090000 -3c031473 -34636ed5 -01281004 -1443018e -00000000 -3c082ccf -3508043c -24090000 -3c032ccf -3463043c -01281004 -14430186 -00000000 -3c087739 -3508bde0 -24090000 -3c037739 -3463bde0 -01281004 -1443017e -00000000 -3c087cb7 -35080888 -24090000 -3c037cb7 -34630888 -01281004 -14430176 -00000000 -3c08c878 -350883ac -24090000 -3c03c878 -346383ac -01281004 -1443016e -00000000 -3c081e2c -3508beb6 -24090000 -3c031e2c -3463beb6 -01281004 -14430166 -00000000 -3c0881cd -3508bff3 -24090000 -3c0381cd -3463bff3 -01281004 -1443015e -00000000 -3c084934 -35086960 -24090000 -3c034934 -34636960 -01281004 -14430156 -00000000 -3c08bf69 -3508f668 -24090000 -3c03bf69 -3463f668 -01281004 -1443014e -00000000 -3c08ff16 -35088870 -24090000 -3c03ff16 -34638870 -01281004 -14430146 -00000000 -3c08223c -350815f4 -24090000 -3c03223c -346315f4 -01281004 -1443013e -00000000 -3c08323b -3508d800 -24090000 -3c03323b -3463d800 -01281004 -14430136 -00000000 -24080000 -2409001e -24030000 -01281004 -14430130 -00000000 -24080000 -24090003 -24030000 -01281004 -1443012a -00000000 -24080000 -24090016 -24030000 -01281004 -14430124 -00000000 -24080000 -24090003 -24030000 -01281004 -1443011e -00000000 -24080000 -2409001a -24030000 -01281004 -14430118 -00000000 -24080000 -24090017 -24030000 -01281004 -14430112 -00000000 -24080000 -24090011 -24030000 -01281004 -1443010c -00000000 -24080000 -24090002 -24030000 -01281004 -14430106 -00000000 -24080000 -24090015 -24030000 -01281004 -14430100 -00000000 -24080000 -24090018 -24030000 -01281004 -144300fa -00000000 -24080000 -2409000a -24030000 -01281004 -144300f4 -00000000 -24080000 -24090012 -24030000 -01281004 -144300ee -00000000 -24080000 -24090018 -24030000 -01281004 -144300e8 -00000000 -24080000 -2409001d -24030000 -01281004 -144300e2 -00000000 -24080000 -24090015 -24030000 -01281004 -144300dc -00000000 -24080000 -2409000a -24030000 -01281004 -144300d6 -00000000 -24080000 -2409000f -24030000 -01281004 -144300d0 -00000000 -24080000 -2409001e -24030000 -01281004 -144300ca -00000000 -24080000 -2409000e -24030000 -01281004 -144300c4 -00000000 -24080000 -2409000b -24030000 -01281004 -144300be -00000000 -24080000 -24090006 -24030000 -01281004 -144300b8 -00000000 -24080000 -24090019 -24030000 -01281004 -144300b2 -00000000 -24080000 -2409000a -24030000 -01281004 -144300ac -00000000 -24080000 -2409000f -24030000 -01281004 -144300a6 -00000000 -24080000 -24090000 -24030000 -01281004 -144300a0 -00000000 -24080000 -2409001f -24030000 -01281004 -1443009a -00000000 -24080000 -2409001f -24030000 -01281004 -14430094 -00000000 -24080000 -24090007 -24030000 -01281004 -1443008e -00000000 -24080000 -24090017 -24030000 -01281004 -14430088 -00000000 -24080000 -2409001d -24030000 -01281004 -14430082 -00000000 -24080000 -24090017 -24030000 -01281004 -1443007c -00000000 -24080000 -2409000f -24030000 -01281004 -14430076 -00000000 -24080000 -24090019 -24030000 -01281004 -14430070 -00000000 -24080000 -2409000a -24030000 -01281004 -1443006a -00000000 -24080000 -24090005 -24030000 -01281004 -14430064 -00000000 -24080000 -2409000a -24030000 -01281004 -1443005e -00000000 -24080000 -24090011 -24030000 -01281004 -14430058 -00000000 -24080000 -24090017 -24030000 -01281004 -14430052 -00000000 -24080000 -24090010 -24030000 -01281004 -1443004c -00000000 -24080000 -24090006 -24030000 -01281004 -14430046 -00000000 -24080000 -24090009 -24030000 -01281004 -14430040 -00000000 -24080000 -24090014 -24030000 -01281004 -1443003a -00000000 -24080000 -2409000a -24030000 -01281004 -14430034 -00000000 -24080000 -24090003 -24030000 -01281004 -1443002e -00000000 -24080000 -2409000b -24030000 -01281004 -14430028 -00000000 -24080000 -24090014 -24030000 -01281004 -14430022 -00000000 -24080000 -2409000b -24030000 -01281004 -1443001c -00000000 -24080000 -24090017 -24030000 -01281004 -14430016 -00000000 -24080000 -24090016 -24030000 -01281004 -14430010 -00000000 -24080000 -24090001 -24030000 -01281004 -1443000a -00000000 -24080000 -24090000 -24030000 -01281004 -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -24120000 -3c080d48 -3508918a -3c030d48 -3463ffee -35027fe6 -144307d2 -00000000 -3c08891d -350817a0 -3c03891d -3463b7b4 -3502b034 -144307cb -00000000 -3c088bec -3508f220 -3c038bec -3463fa20 -3502d800 -144307c4 -00000000 -3c0834e0 -35081280 -3c0334e0 -346333d5 -35023155 -144307bd -00000000 -3c082019 -35082340 -3c032019 -3463eff0 -3502ccf0 -144307b6 -00000000 -3c0806d7 -35081894 -3c0306d7 -3463dcbe -3502c43a -144307af -00000000 -3c089c16 -35082100 -3c039c16 -34637b7e -35027b7e -144307a8 -00000000 -3c08d2e0 -35087498 -3c03d2e0 -3463f4fa -3502a4ea -144307a1 -00000000 -3c08e5bd -35081f00 -3c03e5bd -34631fc0 -35021ac0 -1443079a -00000000 -3c0805e0 -35085844 -3c0305e0 -34635c7c -35020c78 -14430793 -00000000 -3c081c18 -35082184 -3c031c18 -3463f7ec -3502d768 -1443078c -00000000 -3c08f64d -350802e0 -3c03f64d -346303f7 -350203f7 -14430785 -00000000 -3c089f9e -35089140 -3c039f9e -3463b578 -35023538 -1443077e -00000000 -3c088d04 -3508cdec -3c038d04 -3463ffec -35027fcc -14430777 -00000000 -3c08660d -3508371d -3c03660d -3463ff3d -3502ff38 -14430770 -00000000 -3c081f77 -3508fb68 -3c031f77 -3463ffe8 -3502e5a0 -14430769 -00000000 -3c086ee5 -3508e2c6 -3c036ee5 -3463ebc7 -3502cb85 -14430762 -00000000 -3c087b70 -35080500 -3c037b70 -34635d7a -35025c7a -1443075b -00000000 -3c08cc88 -350814e4 -3c03cc88 -346314ec -350200e8 -14430754 -00000000 -3c08ca03 -3508f8ea -3c03ca03 -3463faff -3502f275 -1443074d -00000000 -3c086d02 -350831d0 -3c036d02 -346337f8 -35023728 -14430746 -00000000 -3c0832c1 -35081c28 -3c0332c1 -34633cee -350234ce -1443073f -00000000 -3c0837b8 -350864f3 -3c0337b8 -346367f7 -35020794 -14430738 -00000000 -3c0803cf -35081400 -3c0303cf -3463be04 -3502aa04 -14430731 -00000000 -3c083808 -35088740 -3c033808 -3463afc7 -3502ad87 -1443072a -00000000 -3c08e90b -3508610d -3c03e90b -346379fd -350259f9 -14430723 -00000000 -3c081b8e -350894f0 -3c031b8e -3463b4fe -3502246e -1443071c -00000000 -3c08b06a -35086414 -3c03b06a -34637c5c -3502785c -14430715 -00000000 -3c08bbdf -35088fb8 -3c03bbdf -3463cff8 -350240c0 -1443070e -00000000 -3c0820e4 -35085530 -3c0320e4 -34635d3a -3502080a -14430707 -00000000 -3c0864fd -3508ea6e -3c0364fd -3463eefe -3502e4b4 -14430700 -00000000 -3c08fab0 -35089626 -3c03fab0 -3463d766 -35025746 -144306f9 -00000000 -3c083725 -3508b59a -3c033725 -3463fdbf -35024927 -144306f2 -00000000 -3c085caf -3508d54e -3c035caf -3463f7ee -350223aa -144306eb -00000000 -3c08034c -3508cef4 -3c03034c -3463fffe -35027b0e -144306e4 -00000000 -3c085cd6 -35087abc -3c035cd6 -3463fbbe -3502c312 -144306dd -00000000 -3c081cad -3508cbf8 -3c031cad -3463ebfe -35026306 -144306d6 -00000000 -3c08b325 -35080f97 -3c03b325 -34638f97 -35028915 -144306cf -00000000 -3c081e60 -350827e0 -3c031e60 -3463aff0 -35028830 -144306c8 -00000000 -3c0826b6 -350884c0 -3c0326b6 -3463f4cc -350270cc -144306c1 -00000000 -3c0803ac -3508e660 -3c0303ac -3463e7ed -350225ed -144306ba -00000000 -3c080adc -35085ba2 -3c030adc -34637ffe -35022cde -144306b3 -00000000 -3c089597 -350803a0 -3c039597 -346337ba -3502341a -144306ac -00000000 -3c08b07f -3508d414 -3c03b07f -3463fe14 -3502ba00 -144306a5 -00000000 -3c0889d5 -350819d0 -3c0389d5 -3463ddfe -3502cdee -1443069e -00000000 -3c08f726 -35081eb0 -3c03f726 -34633ffc -35022fdc -14430697 -00000000 -3c082c09 -3508492f -3c032c09 -3463596f -35025844 -14430690 -00000000 -3c0827d2 -35086fc0 -3c0327d2 -3463ffee -3502b3ae -14430689 -00000000 -3c088f38 -35086b68 -3c038f38 -3463ef7a -3502ee32 -14430682 -00000000 -3c08eb31 -350825b0 -3c03eb31 -3463adb4 -35028984 -1443067b -00000000 -3c08a5b5 -3508cb24 -3c03a5b5 -3463dfa6 -350257a6 -14430674 -00000000 -3c086928 -35080b7c -3c036928 -34639f7e -35029e06 -1443066d -00000000 -3c08576c -3508c234 -3c03576c -3463e2bf -3502628f -14430666 -00000000 -3c087771 -35084bc4 -3c037771 -34634fc4 -35024e40 -1443065f -00000000 -3c087554 -350832a0 -3c037554 -3463fba0 -3502d9a0 -14430658 -00000000 -3c08dadf -3508b0ac -3c03dadf -3463bcbe -35029c3a -14430651 -00000000 -3c083756 -3508d37c -3c033756 -3463db7f -3502182f -1443064a -00000000 -3c08c107 -35081950 -3c03c107 -34639bf0 -35029aa0 -14430643 -00000000 -3c08b5d8 -350879d0 -3c03b5d8 -346379df -3502290f -1443063c -00000000 -3c08074e -35084e72 -3c03074e -34636f73 -35022521 -14430635 -00000000 -3c08136b -35083d46 -3c03136b -3463ffd6 -3502ded4 -1443062e -00000000 -3c0809e3 -3508e474 -3c0309e3 -3463eef4 -35028af0 -14430627 -00000000 -3c08d831 -3508a1f0 -3c03d831 -3463e3f2 -35024322 -14430620 -00000000 -3c087b5e -3508c670 -3c037b5e -3463c77a -3502070a -14430619 -00000000 -3c08b49f -3508fdd0 -3c03b49f -3463fdfa -350224ba -14430612 -00000000 -3c0830ef -35080e30 -3c0330ef -3463ff3a -3502f11a -1443060b -00000000 -3c08c75e -3508db8c -3c03c75e -3463dbae -3502db2e -14430604 -00000000 -3c08921f -35083e58 -3c03921f -3463bff8 -350293e8 -144305fd -00000000 -3c08df52 -35085ee0 -3c03df52 -34637fec -35023d0c -144305f6 -00000000 -3c082006 -3508e300 -3c032006 -3463ff58 -35025c58 -144305ef -00000000 -3c0830cc -3508a294 -3c0330cc -3463f6f5 -35025461 -144305e8 -00000000 -3c08a0b9 -35084de0 -3c03a0b9 -34635fee -3502576e -144305e1 -00000000 -3c0889ca -35080d20 -3c0389ca -34639f6f -35029f4f -144305da -00000000 -3c088cb5 -3508f778 -3c038cb5 -3463f7f8 -3502f5e0 -144305d3 -00000000 -3c0838dd -350802d4 -3c0338dd -34638bd7 -35028947 -144305cc -00000000 -3c08c344 -3508fcfe -3c03c344 -3463fffe -3502e340 -144305c5 -00000000 -3c08de63 -35082ca3 -3c03de63 -34633ea7 -35023206 -144305be -00000000 -3c08ca24 -35081a9c -3c03ca24 -34639b9e -3502911e -144305b7 -00000000 -3c081b94 -3508665a -3c031b94 -34636fde -350229cc -144305b0 -00000000 -3c088cad -350815b8 -3c038cad -346357b8 -35024720 -144305a9 -00000000 -3c08488f -3508c0b6 -3c03488f -3463e1fe -3502217c -144305a2 -00000000 -3c08df14 -35081680 -3c03df14 -346377d2 -35027152 -1443059b -00000000 -3c084319 -3508f170 -3c034319 -3463fbf6 -35023a86 -14430594 -00000000 -3c08aaf9 -35080038 -3c03aaf9 -3463e2fa -3502e2ca -1443058d -00000000 -3c08245b -3508c428 -3c03245b -3463ec6c -3502286c -14430586 -00000000 -3c08d4b4 -3508de78 -3c03d4b4 -3463dffd -3502d9bd -1443057f -00000000 -3c087760 -35083f4e -3c037760 -34637fde -350250d2 -14430578 -00000000 -3c080bc0 -3508eeb8 -3c030bc0 -3463ffbc -35025114 -14430571 -00000000 -3c08b7b0 -35081200 -3c03b7b0 -3463f234 -3502f234 -1443056a -00000000 -3c08e352 -35080ac2 -3c03e352 -3463afde -3502a71e -14430563 -00000000 -3c085fb2 -3508fcdc -3c035fb2 -3463ffff -350277b7 -1443055c -00000000 -3c083572 -35083688 -3c033572 -34633e9c -35022c9c -14430555 -00000000 -3c08d898 -3508bbf2 -3c03d898 -3463fff6 -35025686 -1443054e -00000000 -3c0864be -3508d538 -3c0364be -3463fd3c -3502691c -14430547 -00000000 -3c08f2c9 -3508b240 -3c03f2c9 -3463f3ce -3502618e -14430540 -00000000 -3c087c5b -35086584 -3c037c5b -3463ffac -3502daac -14430539 -00000000 -3c08ad85 -35087400 -3c03ad85 -34637ca4 -35021ca4 -14430532 -00000000 -3c0838e6 -350879d0 -3c0338e6 -3463f9fa -3502a9ea -1443052b -00000000 -3c08f834 -35087356 -3c03f834 -34637b56 -35027910 -14430524 -00000000 -3c0828fd -35089f34 -3c0328fd -3463df74 -35025240 -1443051d -00000000 -3c086d28 -35086d78 -3c036d28 -3463fd7b -3502f403 -14430516 -00000000 -3c08ad87 -35086708 -3c03ad87 -34637f68 -35023b68 -1443050f -00000000 -3c083025 -35080d28 -3c033025 -3463ff38 -3502f738 -14430508 -00000000 -3c08d01e -35089a08 -3c03d01e -3463db7a -3502c97a -14430501 -00000000 -3c08d8ca -3508d66c -3c03d8ca -3463deef -350258af -144304fa -00000000 -3c08e257 -35089b80 -3c03e257 -3463bfbe -3502af3e -144304f3 -00000000 -3c081e4a -35081000 -3c031e4a -346314b8 -350204b8 -144304ec -00000000 -3c085346 -3508e4d8 -3c035346 -3463e4db -3502e44b -144304e5 -00000000 -3c085cc3 -35087c88 -3c035cc3 -3463fdcb -3502f94b -144304de -00000000 -3c08a697 -35080491 -3c03a697 -346377d3 -35027752 -144304d7 -00000000 -3c085a71 -350857fc -3c035a71 -3463fffc -3502e910 -144304d0 -00000000 -3c08220a -35080c60 -3c03220a -3463ff73 -3502f713 -144304c9 -00000000 -3c08ddb2 -35087280 -3c03ddb2 -34637fab -35025f2b -144304c2 -00000000 -3c082ef9 -35085576 -3c032ef9 -34635576 -35024554 -144304bb -00000000 -3c08976e -35085e98 -3c03976e -34635ed8 -35020458 -144304b4 -00000000 -3c08354d -35080320 -3c03354d -3463ebad -3502ea8d -144304ad -00000000 -3c0894b6 -3508eb72 -3c0394b6 -3463fbfb -3502fbab -144304a6 -00000000 -3c08f652 -3508ddc0 -3c03f652 -3463ddf6 -3502dcf6 -1443049f -00000000 -3c0883f6 -3508ded0 -3c0383f6 -3463ffde -3502eb9e -14430498 -00000000 -3c081576 -3508ee33 -3c031576 -3463eeff -3502aaec -14430491 -00000000 -3c08dec2 -3508831b -3c03dec2 -3463cf5f -35024f46 -1443048a -00000000 -3c088afa -35080658 -3c038afa -34639f5a -3502994a -14430483 -00000000 -3c08db33 -3508e5a0 -3c03db33 -3463f5af -3502b18f -1443047c -00000000 -3c089527 -3508dc50 -3c039527 -3463fdf0 -35023de0 -14430475 -00000000 -3c083973 -35082998 -3c033973 -34636b9f -35024b1f -1443046e -00000000 -3c0835b8 -3508f6d8 -3c0335b8 -3463fef8 -35029c60 -14430467 -00000000 -3c08f023 -3508c8c6 -3c03f023 -3463efce -3502ef4a -14430460 -00000000 -3c085453 -3508363d -3c035453 -3463f73f -3502d113 -14430459 -00000000 -3c08b38d -35083666 -3c03b38d -3463ff76 -3502fb10 -14430452 -00000000 -3c084d3c -35088579 -3c034d3c -3463a57d -3502a40c -1443044b -00000000 -3c087d84 -350830e8 -3c037d84 -346370ea -35027082 -14430444 -00000000 -3c08bd3f -35081480 -3c03bd3f -3463fee0 -3502ee60 -1443043d -00000000 -3c086055 -3508ac72 -3c036055 -3463fcfe -350258ec -14430436 -00000000 -3c08efe1 -35083aa0 -3c03efe1 -3463fef8 -3502d4d8 -1443042f -00000000 -3c08b1d6 -350823aa -3c03b1d6 -3463fbfa -3502fbd0 -14430428 -00000000 -3c08953f -3508f764 -3c03953f -3463f7fc -3502a6fc -14430421 -00000000 -3c088bd5 -35089790 -3c038bd5 -3463f7d0 -3502e6c0 -1443041a -00000000 -3c0813ef -350859ce -3c0313ef -3463d9ee -350298a4 -14430413 -00000000 -3c08bc31 -3508829c -3c03bc31 -3463c2be -3502c026 -1443040c -00000000 -3c084e4c -35081a00 -3c034e4c -3463fecd -3502fccd -14430405 -00000000 -3c088e57 -3508c6a2 -3c038e57 -3463d6bf -3502943f -144303fe -00000000 -3c08bd1c -350806ed -3c03bd1c -34633eed -35023c65 -144303f7 -00000000 -3c08efaf -3508cd50 -3c03efaf -3463fdfa -350230aa -144303f0 -00000000 -3c08a2cf -35086860 -3c03a2cf -3463ec72 -3502ac72 -144303e9 -00000000 -3c08e082 -3508dd28 -3c03e082 -3463dfed -3502c7e5 -144303e2 -00000000 -3c0818ed -350812b4 -3c0318ed -3463f2bf -3502f09b -144303db -00000000 -3c08c9f7 -35083d9f -3c03c9f7 -3463bfff -3502b36c -144303d4 -00000000 -3c08be45 -3508a000 -3c03be45 -3463b9ff -3502b9ff -144303cd -00000000 -3c08ded2 -3508a4a8 -3c03ded2 -3463b7ac -35021304 -144303c6 -00000000 -3c089aaa -3508ef18 -3c039aaa -3463ff98 -35029390 -144303bf -00000000 -3c08dbce -35081804 -3c03dbce -34637a8c -35026a8c -144303b8 -00000000 -3c0846d6 -350819d4 -3c0346d6 -346339f4 -350228a0 -144303b1 -00000000 -3c08c293 -35085100 -3c03c293 -3463d56c -3502946c -144303aa -00000000 -3c08fef8 -35089ad6 -3c03fef8 -34639ad6 -35029210 -144303a3 -00000000 -3c082ab7 -3508a890 -3c032ab7 -3463adf0 -35028560 -1443039c -00000000 -3c08ce9e -35081788 -3c03ce9e -3463bfcc -3502a9c4 -14430395 -00000000 -3c082c4b -3508a739 -3c032c4b -3463bf3b -3502b902 -1443038e -00000000 -3c08fbaa -3508c1b8 -3c03fbaa -3463e1fa -3502e0d2 -14430387 -00000000 -3c0847ae -35087e9c -3c0347ae -34637efc -35024ee0 -14430380 -00000000 -3c08b90d -35081d4e -3c03b90d -3463dfde -3502d2d0 -14430379 -00000000 -3c08c313 -35084de6 -3c03c313 -34636de6 -35026126 -14430372 -00000000 -3c081840 -35081aaa -3c031840 -34639aea -350292ca -1443036b -00000000 -3c08a67d -3508ca53 -3c03a67d -3463cb73 -35024b23 -14430364 -00000000 -3c08b6d7 -3508927a -3c03b6d7 -3463b37e -3502336e -1443035d -00000000 -3c087b6e -350894d8 -3c037b6e -3463b6dd -3502b6cd -14430356 -00000000 -3c08de1e -3508bbda -3c03de1e -3463bbda -350289c0 -1443034f -00000000 -3c089965 -3508f113 -3c039965 -3463f93b -3502f928 -14430348 -00000000 -3c08bc0f -35080ab0 -3c03bc0f -3463caba -3502c83a -14430341 -00000000 -3c087b99 -350813ee -3c037b99 -3463ffef -3502fee5 -1443033a -00000000 -3c085b94 -350851e8 -3c035b94 -3463d3ff -35028337 -14430333 -00000000 -3c0823f9 -35083c34 -3c0323f9 -3463fcb6 -3502d4a2 -1443032c -00000000 -3c083bf9 -35084812 -3c033bf9 -3463dc5e -35029c4c -14430325 -00000000 -3c0810ec -3508e560 -3c0310ec -3463e764 -35020324 -1443031e -00000000 -3c080d86 -3508f558 -3c030d86 -3463f5d9 -35021489 -14430317 -00000000 -3c0824bc -3508972d -3c0324bc -346397fd -350291d0 -14430310 -00000000 -3c08b6d1 -35087ce6 -3c03b6d1 -3463ffee -3502974a -14430309 -00000000 -3c080bb6 -350882bc -3c030bb6 -34639efc -35021ec0 -14430302 -00000000 -3c087ab4 -35085fe2 -3c037ab4 -34635fe2 -350211c2 -144302fb -00000000 -3c08bfcb -3508a888 -3c03bfcb -3463b8c8 -3502b840 -144302f4 -00000000 -3c0889d4 -35089b8f -3c0389d4 -34639f8f -3502860a -144302ed -00000000 -3c08739b -3508e6e8 -3c03739b -3463e6ea -350206c2 -144302e6 -00000000 -3c08a9b4 -35082b00 -3c03a9b4 -3463bb44 -35029a44 -144302df -00000000 -3c087651 -35084d40 -3c037651 -34634f44 -35020204 -144302d8 -00000000 -3c0868f8 -35080800 -3c0368f8 -3463c966 -3502c166 -144302d1 -00000000 -3c08035d -3508ac7e -3c03035d -3463effe -3502ebc8 -144302ca -00000000 -3c08d1b9 -35084930 -3c03d1b9 -3463cf3f -3502871f -144302c3 -00000000 -3c08d5b8 -35085b86 -3c03d5b8 -34635fbe -3502043e -144302bc -00000000 -3c082d26 -350838e0 -3c032d26 -34633ff0 -350237b0 -144302b5 -00000000 -3c08e47c -350881bc -3c03e47c -3463e5ff -350265d7 -144302ae -00000000 -3c08e8b4 -350883f3 -3c03e8b4 -3463a3fb -3502a39a -144302a7 -00000000 -3c08fe58 -3508c120 -3c03fe58 -3463d92c -3502192c -144302a0 -00000000 -3c085eed -35084089 -3c035eed -34635bdd -35021bdc -14430299 -00000000 -3c08418d -35089d98 -3c03418d -34639d99 -35028409 -14430292 -00000000 -3c086870 -35083e32 -3c036870 -3463bf76 -35028d56 -1443028b -00000000 -3c08a5aa -35088a80 -3c03a5aa -3463bad2 -35023ad2 -14430284 -00000000 -3c081345 -3508c932 -3c031345 -3463eb77 -35026247 -1443027d -00000000 -3c089e77 -35088cec -3c039e77 -3463cdff -3502c5df -14430276 -00000000 -3c08e47a -35083820 -3c03e47a -34633fa9 -350237a9 -1443026f -00000000 -3c08d92a -350874e0 -3c03d92a -3463f5f5 -3502b5d5 -14430268 -00000000 -3c08255f -35083270 -3c03255f -34637b71 -35024b41 -14430261 -00000000 -3c08d44c -35089f59 -3c03d44c -34639f59 -35020000 -1443025a -00000000 -3c08a34a -35088759 -3c03a34a -34638759 -35020000 -14430253 -00000000 -3c085c27 -3508d4ac -3c035c27 -3463d4ac -35020000 -1443024c -00000000 -3c0892dc -3508a4e0 -3c0392dc -3463a4e0 -35020000 -14430245 -00000000 -3c084be1 -3508411c -3c034be1 -3463411c -35020000 -1443023e -00000000 -3c088206 -35086660 -3c038206 -34636660 -35020000 -14430237 -00000000 -3c0851ca -35083726 -3c0351ca -34633726 -35020000 -14430230 -00000000 -3c08ac12 -3508e711 -3c03ac12 -3463e711 -35020000 -14430229 -00000000 -3c082b96 -3508a5d8 -3c032b96 -3463a5d8 -35020000 -14430222 -00000000 -3c088463 -350833dc -3c038463 -346333dc -35020000 -1443021b -00000000 -3c08bb9e -35082b40 -3c03bb9e -34632b40 -35020000 -14430214 -00000000 -3c082ae8 -35084900 -3c032ae8 -34634900 -35020000 -1443020d -00000000 -3c082da8 -350848c8 -3c032da8 -346348c8 -35020000 -14430206 -00000000 -3c088948 -35086176 -3c038948 -34636176 -35020000 -144301ff -00000000 -3c08c521 -3508e80c -3c03c521 -3463e80c -35020000 -144301f8 -00000000 -3c086179 -350855c4 -3c036179 -346355c4 -35020000 -144301f1 -00000000 -3c08b52a -35086838 -3c03b52a -34636838 -35020000 -144301ea -00000000 -3c08228a -3508f848 -3c03228a -3463f848 -35020000 -144301e3 -00000000 -3c0858d2 -350897b4 -3c0358d2 -346397b4 -35020000 -144301dc -00000000 -3c08f5ad -35087cce -3c03f5ad -34637cce -35020000 -144301d5 -00000000 -3c088ce1 -3508fb50 -3c038ce1 -3463fb50 -35020000 -144301ce -00000000 -3c089524 -350874c0 -3c039524 -346374c0 -35020000 -144301c7 -00000000 -3c08eb9a -3508ec1a -3c03eb9a -3463ec1a -35020000 -144301c0 -00000000 -3c08ec76 -35086400 -3c03ec76 -34636400 -35020000 -144301b9 -00000000 -3c083c65 -3508f0e0 -3c033c65 -3463f0e0 -35020000 -144301b2 -00000000 -3c082c9e -350891bf -3c032c9e -346391bf -35020000 -144301ab -00000000 -3c08ab70 -35082a00 -3c03ab70 -34632a00 -35020000 -144301a4 -00000000 -3c08b15e -350841a1 -3c03b15e -346341a1 -35020000 -1443019d -00000000 -3c083028 -3508f734 -3c033028 -3463f734 -35020000 -14430196 -00000000 -3c0838e6 -35082150 -3c0338e6 -34632150 -35020000 -1443018f -00000000 -3c086302 -3508aa80 -3c036302 -3463aa80 -35020000 -14430188 -00000000 -3c0846cf -350837fc -3c0346cf -346337fc -35020000 -14430181 -00000000 -3c089b9b -3508c370 -3c039b9b -3463c370 -35020000 -1443017a -00000000 -3c088524 -35081290 -3c038524 -34631290 -35020000 -14430173 -00000000 -3c0828f6 -350820ea -3c0328f6 -346320ea -35020000 -1443016c -00000000 -3c08b176 -350855e0 -3c03b176 -346355e0 -35020000 -14430165 -00000000 -3c08f23b -350825c8 -3c03f23b -346325c8 -35020000 -1443015e -00000000 -3c08cff6 -3508da18 -3c03cff6 -3463da18 -35020000 -14430157 -00000000 -3c08f420 -3508b7f0 -3c03f420 -3463b7f0 -35020000 -14430150 -00000000 -3c082c5b -35087e44 -3c032c5b -34637e44 -35020000 -14430149 -00000000 -3c08689d -35086e48 -3c03689d -34636e48 -35020000 -14430142 -00000000 -3c08587c -35087960 -3c03587c -34637960 -35020000 -1443013b -00000000 -3c08115d -3508d974 -3c03115d -3463d974 -35020000 -14430134 -00000000 -3c082c0f -3508663b -3c032c0f -3463663b -35020000 -1443012d -00000000 -3c08f29c -3508d1fb -3c03f29c -3463d1fb -35020000 -14430126 -00000000 -3c083c38 -3508c883 -3c033c38 -3463c883 -35020000 -1443011f -00000000 -3c085bf8 -35082500 -3c035bf8 -34632500 -35020000 -14430118 -00000000 -3c0803dd -3508621c -3c0303dd -3463621c -35020000 -14430111 -00000000 -3c0843a3 -3508d75c -3c0343a3 -3463d75c -35020000 -1443010a -00000000 -3c08b39d -3508d06c -3c03b39d -3463d06c -35020000 -14430103 -00000000 -24080000 -3403bde4 -3502bde4 -144300fe -00000000 -24080000 -240322e2 -350222e2 -144300f9 -00000000 -24080000 -3403fa34 -3502fa34 -144300f4 -00000000 -24080000 -3403cea7 -3502cea7 -144300ef -00000000 -24080000 -3403a738 -3502a738 -144300ea -00000000 -24080000 -3403cb80 -3502cb80 -144300e5 -00000000 -24080000 -3403c5ae -3502c5ae -144300e0 -00000000 -24080000 -240368ed -350268ed -144300db -00000000 -24080000 -24037d58 -35027d58 -144300d6 -00000000 -24080000 -24031eb4 -35021eb4 -144300d1 -00000000 -24080000 -3403a76c -3502a76c -144300cc -00000000 -24080000 -240340a8 -350240a8 -144300c7 -00000000 -24080000 -34039cd8 -35029cd8 -144300c2 -00000000 -24080000 -3403882c -3502882c -144300bd -00000000 -24080000 -24031714 -35021714 -144300b8 -00000000 -24080000 -24036665 -35026665 -144300b3 -00000000 -24080000 -340388ef -350288ef -144300ae -00000000 -24080000 -3403b800 -3502b800 -144300a9 -00000000 -24080000 -24030a5f -35020a5f -144300a4 -00000000 -24080000 -3403ea0e -3502ea0e -1443009f -00000000 -24080000 -3403999e -3502999e -1443009a -00000000 -24080000 -3403fa20 -3502fa20 -14430095 -00000000 -24080000 -24030768 -35020768 -14430090 -00000000 -24080000 -2403001c -3502001c -1443008b -00000000 -24080000 -34039a60 -35029a60 -14430086 -00000000 -24080000 -3403d637 -3502d637 -14430081 -00000000 -24080000 -24031300 -35021300 -1443007c -00000000 -24080000 -3403e54e -3502e54e -14430077 -00000000 -24080000 -340391f5 -350291f5 -14430072 -00000000 -24080000 -3403e29b -3502e29b -1443006d -00000000 -24080000 -24037449 -35027449 -14430068 -00000000 -24080000 -24030a2c -35020a2c -14430063 -00000000 -24080000 -34039a04 -35029a04 -1443005e -00000000 -24080000 -24036980 -35026980 -14430059 -00000000 -24080000 -3403b93f -3502b93f -14430054 -00000000 -24080000 -24032659 -35022659 -1443004f -00000000 -24080000 -34038b28 -35028b28 -1443004a -00000000 -24080000 -24032338 -35022338 -14430045 -00000000 -24080000 -24034abb -35024abb -14430040 -00000000 -24080000 -3403affe -3502affe -1443003b -00000000 -24080000 -3403f484 -3502f484 -14430036 -00000000 -24080000 -340385aa -350285aa -14430031 -00000000 -24080000 -24036560 -35026560 -1443002c -00000000 -24080000 -24032cdd -35022cdd -14430027 -00000000 -24080000 -3403dca7 -3502dca7 -14430022 -00000000 -24080000 -24035b2e -35025b2e -1443001d -00000000 -24080000 -3403bf5d -3502bf5d -14430018 -00000000 -24080000 -3403f373 -3502f373 -14430013 -00000000 -24080000 -24030c46 -35020c46 -1443000e -00000000 -24080000 -3403ed94 -3502ed94 -14430009 -00000000 -24080000 -24030000 -35020000 -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -26100001 -24120000 -24150001 -12a00006 -3c08800d -3c16800d -15160136 -00000000 -12b50003 -3c17800d -10000132 -00000000 -16f60130 -00000000 -24150001 -12a00006 -25098123 -25168123 -1536012a -00000000 -12b50003 -25178123 -10000126 -00000000 -16f60124 -00000000 -24150001 -12a00006 -ad098ee0 -ad168ee0 -1536011e -00000000 -12b50003 -ad178ee0 -1000011a -00000000 -16f60118 -00000000 -24150001 -12a00006 -8d0a8ee0 -8d168ee0 -15560112 -00000000 -12b50003 -8d178ee0 -1000010e -00000000 -16f6010c -00000000 -24150001 -12a00006 -012a5821 -012ab021 -15760106 -00000000 -12b50003 -012ab821 -10000102 -00000000 -16f60100 -00000000 -24150001 -12a00006 -02326025 -0232b025 -159600fa -00000000 -12b50003 -0232b825 -100000f6 -00000000 -16f600f4 -00000000 -24150001 -12a00006 -0253682a -0253b02a -15b600ee -00000000 -12b50003 -0253b82a -100000ea -00000000 -16f600e8 -00000000 -24150001 -12a00006 -2a4e8011 -2a568011 -15d600e2 -00000000 -12b50003 -2a578011 -100000de -00000000 -16f600dc -00000000 -24150001 -12a00006 -2e4f8011 -2e568011 -15f600d6 -00000000 -12b50003 -2e578011 -100000d2 -00000000 -16f600d0 -00000000 -24150001 -12a00006 -0253c02b -0253b02b -171600ca -00000000 -12b50003 -0253b82b -100000c6 -00000000 -16f600c4 -00000000 -24150001 -12a00006 -00124c40 -0012b440 -153600be -00000000 -12b50003 -0012bc40 -100000ba -00000000 -16f600b8 -00000000 -24150001 -12a00006 -01105020 -0110b020 -155600b2 -00000000 -12b50003 -0110b820 -100000ae -00000000 -16f600ac -00000000 -24150001 -12a00006 -220b8002 -22168002 -157600a6 -00000000 -12b50003 -22178002 -100000a2 -00000000 -16f600a0 -00000000 -24150001 -12a00006 -01106022 -0110b022 -1596009a -00000000 -12b50003 -0110b822 -10000096 -00000000 -16f60094 -00000000 -24150001 -12a00006 -01106823 -0110b023 -15b6008e -00000000 -12b50003 -0110b823 -1000008a -00000000 -16f60088 -00000000 -24150001 -12a00006 -01107024 -0110b024 -15d60082 -00000000 -12b50003 -0110b824 -1000007e -00000000 -16f6007c -00000000 -24150001 -12a00006 -320f8ff2 -32168ff2 -15f60076 -00000000 -12b50003 -32178ff2 -10000072 -00000000 -16f60070 -00000000 -24150001 -12a00006 -0110c027 -0110b027 -1716006a -00000000 -12b50003 -0110b827 -10000066 -00000000 -16f60064 -00000000 -24150001 -12a00006 -36098ff2 -36168ff2 -1536005e -00000000 -12b50003 -36178ff2 -1000005a -00000000 -16f60058 -00000000 -24150001 -12a00006 -01105026 -0110b026 -15560052 -00000000 -12b50003 -0110b826 -1000004e -00000000 -16f6004c -00000000 -24150001 -12a00006 -3a0b8ff2 -3a168ff2 -15760046 -00000000 -12b50003 -3a178ff2 -10000042 -00000000 -16f60040 -00000000 -24150001 -12a00006 -02086004 -0208b004 -1596003a -00000000 -12b50003 -0208b804 -10000036 -00000000 -16f60034 -00000000 -24150001 -12a00006 -00106a03 -0010b203 -15b6002e -00000000 -12b50003 -0010ba03 -1000002a -00000000 -16f60028 -00000000 -24150001 -12a00006 -02087007 -0208b007 -15d60022 -00000000 -12b50003 -0208b807 -1000001e -00000000 -16f6001c -00000000 -24150001 -12a00006 -00107a02 -0010b202 -15f60016 -00000000 -12b50003 -0010ba02 -10000012 -00000000 -16f60010 -00000000 -24150001 -12a00006 -0208c006 -0208b006 -1716000a -00000000 -12b50003 -0208b806 -10000006 -00000000 -16f60004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -26100001 -3c08800d -40805800 -3c170040 -40976000 -00000000 -24120001 -3c170001 -ad120000 -3c14bfc8 -2694a49c -1e4000af -0000000c -165700ad -00000000 -24120001 -3c14bfc8 -2694a4b8 -1d0000a8 -0000000c -165700a6 -00000000 -24120002 -3c170002 -ad120000 -3c14bfc8 -2694a4dc -1e40009f -0000000d -1657009d -00000000 -24120002 -3c14bfc8 -2694a4f8 -1d000098 -0000000d -16570096 -00000000 -24120003 -3c170003 -ad120000 -3c14bfc8 -2694a52c -3c04ba03 -34844f60 -3c05b615 -34a5fd67 -1e40008b -0085b820 -16570089 -00000000 -24120003 -3c14bfc8 -2694a548 -1d000084 -0085b820 -ad170000 -16570081 -00000000 -24120003 -ad120000 -3c14bfc8 -2694a574 -3c047fff -3484c19e -1e400079 -20976512 -16570077 -00000000 -24120003 -3c14bfc8 -2694a590 -1d000072 -20976512 -16570070 -00000000 -24120003 -3c14bfc8 -2694a5bc -3c04a85e -34847d00 -3c056b7e -34a58e36 -1e400067 -0085b822 -16570065 -00000000 -24120003 -3c14bfc8 -2694a5d8 -1d000060 -0085b822 -1657005e -00000000 -24120004 -3c170004 -ad120000 -3c14bfc8 -2694a5fc -1e400057 -8d170002 -16570055 -00000000 -24120004 -3c14bfc8 -2694a618 -1d000050 -8d170002 -1657004e -00000000 -24120004 -3c14bfc8 -2694a634 -1e400049 -85170001 -02f2001b -16570046 -00000000 -24120004 -3c14bfc8 -2694a654 -1d000041 -85170001 -1657003f -00000000 -3c14bfc8 -2694a66c -1e40003b -95170003 -16570039 -00000000 -24120004 -3c14bfc8 -2694a688 -1d000034 -95170003 -16570032 -00000000 -24120005 -3c170005 -ad120000 -3c14bfc8 -2694a6ac -1e40002b -ad170002 -16570029 -00000000 -24120005 -3c14bfc8 -2694a6c8 -1d000024 -ad170002 -16570022 -00000000 -24120005 -3c14bfc8 -2694a6e4 -1e40001d -a5170001 -1657001b -00000000 -24120005 -3c14bfc8 -2694a700 -1d000016 -a5170001 -16570014 -00000000 -24120007 -3c170007 -ad120000 -3c14bfc8 -2694a724 -1e40000d -9e3c56aa -02f20018 -1657000a -00000000 -24120007 -3c14bfc8 -2694a748 -02f20018 -1d000004 -ec1ba960 -16570002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -24120000 -3c08158f -35082b29 -3c09421c -35290a42 -24030001 -0109102b -144308fe -00000000 -3c086034 -35083bf8 -3c09dd17 -3529b30a -24030001 -0109102b -144308f6 -00000000 -3c082d5c -35083180 -3c0914df -35294718 -24030000 -0109102b -144308ee -00000000 -3c087560 -3508fb80 -3c092a98 -352914b9 -24030000 -0109102b -144308e6 -00000000 -3c08ca60 -35086900 -3c099416 -35294d3a -24030000 -0109102b -144308de -00000000 -3c08df4e -35082bc0 -3c0937bd -35295259 -24030000 -0109102b -144308d6 -00000000 -3c08d671 -3508d650 -3c09f9a4 -35299f10 -24030001 -0109102b -144308ce -00000000 -3c089e63 -350841e0 -3c0961c7 -35290130 -24030000 -0109102b -144308c6 -00000000 -3c087e12 -3508e4af -3c09a7fa -35299200 -24030001 -0109102b -144308be -00000000 -3c0824d2 -35080908 -3c09e7ff -35299120 -24030001 -0109102b -144308b6 -00000000 -3c08f49d -35085fa6 -3c09a79b -35292c2e -24030000 -0109102b -144308ae -00000000 -3c088ffc -35089a40 -3c0927aa -352967e8 -24030000 -0109102b -144308a6 -00000000 -3c0860cc -35083a3f -3c0978df -3529cfb0 -24030001 -0109102b -1443089e -00000000 -3c087be6 -3508e8b0 -3c099cf3 -352969ea -24030001 -0109102b -14430896 -00000000 -3c08586b -35084150 -3c09cab4 -3529808a -24030001 -0109102b -1443088e -00000000 -3c083467 -3508ec80 -3c09fb77 -35291004 -24030001 -0109102b -14430886 -00000000 -3c08eb27 -35085cc0 -3c090b03 -352905a0 -24030000 -0109102b -1443087e -00000000 -3c08637e -35085f66 -3c09aab1 -3529eab2 -24030001 -0109102b -14430876 -00000000 -3c0867cc -3508c850 -3c092d3b -35292b94 -24030000 -0109102b -1443086e -00000000 -3c08c64e -350846e7 -3c092d46 -352956d0 -24030000 -0109102b -14430866 -00000000 -3c08df61 -35088000 -3c09fb0d -35290c40 -24030001 -0109102b -1443085e -00000000 -3c08a1d1 -3508f0e4 -3c099e1d -35294924 -24030000 -0109102b -14430856 -00000000 -3c08e13c -350893cc -3c098928 -3529c13c -24030000 -0109102b -1443084e -00000000 -3c08e4da -3508b380 -3c094111 -3529657c -24030000 -0109102b -14430846 -00000000 -3c082fc7 -35081578 -3c096e07 -352988ac -24030001 -0109102b -1443083e -00000000 -3c08dabf -35083fc0 -3c09d5a6 -3529cf9c -24030000 -0109102b -14430836 -00000000 -3c08d5d3 -3508b71e -3c09350b -352950d6 -24030000 -0109102b -1443082e -00000000 -3c084d05 -3508b42b -3c096074 -3529d740 -24030001 -0109102b -14430826 -00000000 -3c08dae2 -35088800 -3c09f336 -35292c68 -24030001 -0109102b -1443081e -00000000 -3c088797 -3508789a -3c09c87c -35291e28 -24030001 -0109102b -14430816 -00000000 -3c080eb3 -3508e608 -3c09462a -352944d4 -24030001 -0109102b -1443080e -00000000 -3c08b7b5 -3508fb30 -3c0962c8 -35293598 -24030000 -0109102b -14430806 -00000000 -3c086a37 -35082f40 -3c097243 -3529db20 -24030001 -0109102b -144307fe -00000000 -3c08defe -35089c90 -3c09b2f1 -35299278 -24030000 -0109102b -144307f6 -00000000 -3c088ad5 -3508dfa8 -3c0955da -35294740 -24030000 -0109102b -144307ee -00000000 -3c08bba4 -35085882 -3c0933be -35292558 -24030000 -0109102b -144307e6 -00000000 -3c08e164 -35086e90 -3c09c82a -35291fb0 -24030000 -0109102b -144307de -00000000 -3c0828b2 -3508da80 -3c093c7c -3529306a -24030001 -0109102b -144307d6 -00000000 -3c08199c -350816ef -3c0976be -35299aa0 -24030001 -0109102b -144307ce -00000000 -3c08a66d -350873fc -3c09be2e -35293f4c -24030001 -0109102b -144307c6 -00000000 -3c08806e -350875e0 -3c09be9d -3529131f -24030001 -0109102b -144307be -00000000 -3c08cca7 -350850ac -3c095fa5 -3529bcf0 -24030000 -0109102b -144307b6 -00000000 -3c08e85c -35089d6c -3c091d84 -3529150c -24030000 -0109102b -144307ae -00000000 -3c081ee4 -35084d08 -3c09b304 -3529b390 -24030001 -0109102b -144307a6 -00000000 -3c08129a -3508349f -3c0975ef -35294ad2 -24030001 -0109102b -1443079e -00000000 -3c086ab8 -35084278 -3c09d122 -3529cbac -24030001 -0109102b -14430796 -00000000 -3c08fdeb -3508066c -3c09ce3c -35298df0 -24030000 -0109102b -1443078e -00000000 -3c089808 -3508a230 -3c099fe4 -35291574 -24030001 -0109102b -14430786 -00000000 -3c082648 -3508526c -3c090c86 -3529441c -24030000 -0109102b -1443077e -00000000 -3c08db72 -35089341 -3c091994 -3529083c -24030000 -0109102b -14430776 -00000000 -3c08665c -35082481 -3c094bc9 -3529ddaf -24030000 -0109102b -1443076e -00000000 -3c080d79 -3508720c -3c09060c -35291f50 -24030000 -0109102b -14430766 -00000000 -3c085ce5 -350889dc -3c093cce -35297f52 -24030000 -0109102b -1443075e -00000000 -3c0819f5 -35086db8 -3c09cdd0 -35299064 -24030001 -0109102b -14430756 -00000000 -3c0848d0 -3508c3d8 -3c09c2c2 -3529a4ab -24030001 -0109102b -1443074e -00000000 -3c0847d4 -3508befc -3c09f8ba -352905c8 -24030001 -0109102b -14430746 -00000000 -3c080496 -35080c70 -3c094f26 -35297b9d -24030001 -0109102b -1443073e -00000000 -3c084292 -3508fddd -3c097a51 -35294ca0 -24030001 -0109102b -14430736 -00000000 -3c084447 -3508223a -3c098322 -352993d2 -24030001 -0109102b -1443072e -00000000 -3c086609 -3508acf8 -3c0932a1 -35299df5 -24030000 -0109102b -14430726 -00000000 -3c08ec16 -3508fb64 -3c09c949 -35290954 -24030000 -0109102b -1443071e -00000000 -3c087e63 -3508be30 -3c0941c9 -35294e36 -24030000 -0109102b -14430716 -00000000 -3c08e377 -35089a7b -3c099807 -3529199a -24030000 -0109102b -1443070e -00000000 -3c086510 -35089b22 -3c09ea4d -35291eb0 -24030001 -0109102b -14430706 -00000000 -3c08af59 -3508d3e0 -3c091048 -35294714 -24030000 -0109102b -144306fe -00000000 -3c08646b -3508f2f5 -3c093f7d -352997d4 -24030000 -0109102b -144306f6 -00000000 -3c081547 -35082c00 -3c095aba -352976f0 -24030001 -0109102b -144306ee -00000000 -3c08b0c4 -3508d85c -3c0966d1 -35296d40 -24030000 -0109102b -144306e6 -00000000 -3c085042 -35081a14 -3c095114 -35291000 -24030001 -0109102b -144306de -00000000 -3c08e2e6 -3508cb65 -3c098c81 -3529768e -24030000 -0109102b -144306d6 -00000000 -3c084f79 -350837a1 -3c090467 -35296200 -24030000 -0109102b -144306ce -00000000 -3c086e52 -3508adf6 -3c09dd07 -3529efd3 -24030001 -0109102b -144306c6 -00000000 -3c08f161 -350864c0 -3c098e69 -35299b30 -24030000 -0109102b -144306be -00000000 -3c084097 -35080e5f -3c099499 -35297457 -24030001 -0109102b -144306b6 -00000000 -3c087ec1 -3508a6f8 -3c09c9f9 -352992f4 -24030001 -0109102b -144306ae -00000000 -3c0873cb -3508e59d -3c099d6e -3529b340 -24030001 -0109102b -144306a6 -00000000 -3c08ea86 -350811d8 -3c093b39 -352959e0 -24030000 -0109102b -1443069e -00000000 -3c08b39b -350806a0 -3c09f071 -352977bb -24030001 -0109102b -14430696 -00000000 -3c086509 -35083c68 -3c094814 -3529318c -24030000 -0109102b -1443068e -00000000 -3c08d6ab -35089100 -3c09f078 -35299a60 -24030001 -0109102b -14430686 -00000000 -3c087b96 -3508aa28 -3c09bbba -3529bca0 -24030001 -0109102b -1443067e -00000000 -3c0877af -3508e110 -3c0933a2 -35292745 -24030000 -0109102b -14430676 -00000000 -3c08208b -350881f2 -3c093561 -35299d76 -24030001 -0109102b -1443066e -00000000 -3c08ead6 -35088300 -3c091816 -352953b8 -24030000 -0109102b -14430666 -00000000 -3c08bf82 -35081bf8 -3c09dc76 -3529614e -24030001 -0109102b -1443065e -00000000 -3c08a52a -35088900 -3c09065f -3529c4ce -24030000 -0109102b -14430656 -00000000 -3c089d76 -3508e6c0 -3c093d05 -35292180 -24030000 -0109102b -1443064e -00000000 -3c08cb15 -3508ab60 -3c0904eb -35291920 -24030000 -0109102b -14430646 -00000000 -3c086879 -3508217e -3c099024 -35297a50 -24030001 -0109102b -1443063e -00000000 -3c08a356 -3508f200 -3c090820 -3529db10 -24030000 -0109102b -14430636 -00000000 -3c08693d -350832fc -3c093126 -3529c90d -24030000 -0109102b -1443062e -00000000 -3c08876a -350847c0 -3c09788a -352931cb -24030000 -0109102b -14430626 -00000000 -3c08cad2 -3508dc6d -3c09674f -3529d43a -24030000 -0109102b -1443061e -00000000 -3c088028 -3508f3f0 -3c09be92 -35297870 -24030001 -0109102b -14430616 -00000000 -3c08db98 -35082660 -3c0955af -35296136 -24030000 -0109102b -1443060e -00000000 -3c088378 -3508f1a9 -3c0942e0 -35290b48 -24030000 -0109102b -14430606 -00000000 -3c0836d9 -3508ec05 -3c091296 -352974c6 -24030000 -0109102b -144305fe -00000000 -3c08d44f -3508c694 -3c0914bb -35299f40 -24030000 -0109102b -144305f6 -00000000 -3c08dda5 -350878d8 -3c094c9e -35292340 -24030000 -0109102b -144305ee -00000000 -3c08b360 -3508ef10 -3c09ee7b -3529afcc -24030001 -0109102b -144305e6 -00000000 -3c08ce2d -35087fba -3c0958e2 -3529d7e3 -24030000 -0109102b -144305de -00000000 -3c083c8a -35087f80 -3c090d32 -35295cc0 -24030000 -0109102b -144305d6 -00000000 -3c0833fd -35089e80 -3c092923 -35291300 -24030000 -0109102b -144305ce -00000000 -3c08e55b -35082fe4 -3c092601 -3529575f -24030000 -0109102b -144305c6 -00000000 -3c084fc1 -3508b6c0 -3c092950 -35297db6 -24030000 -0109102b -144305be -00000000 -3c08fb6a -35083f1c -3c09af11 -35297150 -24030000 -0109102b -144305b6 -00000000 -3c08becd -350881c0 -3c0917c4 -35299cc0 -24030000 -0109102b -144305ae -00000000 -3c08fea3 -3508fd88 -3c097fc8 -3529cbc0 -24030000 -0109102b -144305a6 -00000000 -3c08025e -350881c0 -3c093fb2 -35294e80 -24030001 -0109102b -1443059e -00000000 -3c08f150 -35086600 -3c09b07d -3529acb6 -24030000 -0109102b -14430596 -00000000 -3c089328 -35088bc0 -3c09eb6e -3529ff0e -24030001 -0109102b -1443058e -00000000 -3c083a57 -3508cd20 -3c098961 -35296d40 -24030001 -0109102b -14430586 -00000000 -3c08076b -35088c44 -3c097759 -3529de58 -24030001 -0109102b -1443057e -00000000 -3c089233 -35087a66 -3c098c11 -35297ce4 -24030000 -0109102b -14430576 -00000000 -3c08947b -35084a90 -3c09566d -352927b8 -24030000 -0109102b -1443056e -00000000 -3c08237a -3508e908 -3c0900a7 -3529d162 -24030000 -0109102b -14430566 -00000000 -3c086800 -35088182 -3c095b20 -35291f98 -24030000 -0109102b -1443055e -00000000 -3c089a2c -35080998 -3c093a80 -35294898 -24030000 -0109102b -14430556 -00000000 -3c082139 -35083334 -3c09042d -3529594c -24030000 -0109102b -1443054e -00000000 -3c083120 -35088762 -3c09f913 -35298678 -24030001 -0109102b -14430546 -00000000 -3c0841bb -35083000 -3c09f03d -352955e1 -24030001 -0109102b -1443053e -00000000 -3c0863b3 -35089e32 -3c09660b -35298d99 -24030001 -0109102b -14430536 -00000000 -3c089fb0 -35088c21 -3c095dc6 -352911f0 -24030000 -0109102b -1443052e -00000000 -3c08c13a -350831f0 -3c09b8b5 -3529325a -24030000 -0109102b -14430526 -00000000 -3c0827e4 -3508a93e -3c099a3d -35295f02 -24030001 -0109102b -1443051e -00000000 -3c084119 -35083ba0 -3c097181 -352969f0 -24030001 -0109102b -14430516 -00000000 -3c0824d4 -35084f40 -3c09aac2 -35296990 -24030001 -0109102b -1443050e -00000000 -3c086020 -350850b8 -3c097ad0 -35291608 -24030001 -0109102b -14430506 -00000000 -3c082182 -35081644 -3c09bf63 -35293f70 -24030001 -0109102b -144304fe -00000000 -3c081832 -350868bf -3c09da0f -3529ad1c -24030001 -0109102b -144304f6 -00000000 -3c0897af -35084180 -3c09b77b -352951da -24030001 -0109102b -144304ee -00000000 -3c087239 -3508a4fb -3c0904f0 -352926da -24030000 -0109102b -144304e6 -00000000 -3c084113 -3508f292 -3c091716 -35298180 -24030000 -0109102b -144304de -00000000 -3c08ec1f -35082d5a -3c091f2b -35298827 -24030000 -0109102b -144304d6 -00000000 -3c089136 -35087184 -3c09ecb5 -3529c188 -24030001 -0109102b -144304ce -00000000 -3c08d193 -3508dcf8 -3c095295 -35294f2c -24030000 -0109102b -144304c6 -00000000 -3c08d5fc -3508aa70 -3c09230c -3529e6d8 -24030000 -0109102b -144304be -00000000 -3c083d55 -350842e0 -3c094db4 -3529a06c -24030001 -0109102b -144304b6 -00000000 -3c08c48a -35088384 -3c0927bb -35291400 -24030000 -0109102b -144304ae -00000000 -3c08699a -35080fbe -3c09c9db -3529064f -24030001 -0109102b -144304a6 -00000000 -3c084de2 -35085b05 -3c09b49a -35298509 -24030001 -0109102b -1443049e -00000000 -3c084473 -3508e1bb -3c09dd31 -35299dcf -24030001 -0109102b -14430496 -00000000 -3c0805ad -35082174 -3c09f14d -3529ce78 -24030001 -0109102b -1443048e -00000000 -3c08e1bb -3508fc33 -3c092f20 -352986a0 -24030000 -0109102b -14430486 -00000000 -3c084fe2 -350814d0 -3c092265 -3529b254 -24030000 -0109102b -1443047e -00000000 -3c08cea0 -350856ac -3c0913f6 -3529c0c0 -24030000 -0109102b -14430476 -00000000 -3c08d545 -3508aa5e -3c095eb4 -3529fc1a -24030000 -0109102b -1443046e -00000000 -3c08b80f -35080f3a -3c095af2 -352942ba -24030000 -0109102b -14430466 -00000000 -3c08076f -3508c4db -3c094fc5 -35299e2a -24030001 -0109102b -1443045e -00000000 -3c086271 -3508cbac -3c09e940 -35296d5e -24030001 -0109102b -14430456 -00000000 -3c08d733 -35081578 -3c099d39 -3529d4f0 -24030000 -0109102b -1443044e -00000000 -3c086689 -3508f1e8 -3c098305 -352949ec -24030001 -0109102b -14430446 -00000000 -3c08dd0d -3508b690 -3c09a412 -35292620 -24030000 -0109102b -1443043e -00000000 -3c08ebe8 -35083100 -3c0948d9 -3529c13d -24030000 -0109102b -14430436 -00000000 -3c0822a6 -35086280 -3c09c05e -35298e00 -24030001 -0109102b -1443042e -00000000 -3c089138 -3508d8e8 -3c09109f -352946c2 -24030000 -0109102b -14430426 -00000000 -3c08f8fd -3508433f -3c09bc08 -3529c128 -24030000 -0109102b -1443041e -00000000 -3c0806f4 -350881f0 -3c098ccd -3529d828 -24030001 -0109102b -14430416 -00000000 -3c0821d5 -3508ea2f -3c099688 -35298da5 -24030001 -0109102b -1443040e -00000000 -3c080fa1 -3508f028 -3c094d8b -35294912 -24030001 -0109102b -14430406 -00000000 -3c08f72d -35087340 -3c0983f4 -3529b638 -24030000 -0109102b -144303fe -00000000 -3c083dde -35081600 -3c09b8b2 -3529ca58 -24030001 -0109102b -144303f6 -00000000 -3c08b38e -3508d2fc -3c097c49 -35293240 -24030000 -0109102b -144303ee -00000000 -3c088483 -35084e0c -3c09ef63 -35296abb -24030001 -0109102b -144303e6 -00000000 -3c0883e4 -3508a882 -3c09d49d -35290fa0 -24030001 -0109102b -144303de -00000000 -3c0810ed -35087a38 -3c093fbe -3529aaca -24030001 -0109102b -144303d6 -00000000 -3c08cca8 -3508a845 -3c09acca -3529b9b0 -24030000 -0109102b -144303ce -00000000 -3c0824d5 -3508a3c0 -3c09a6fa -35297dda -24030001 -0109102b -144303c6 -00000000 -3c08c43a -35088720 -3c098696 -3529ca72 -24030000 -0109102b -144303be -00000000 -3c086a31 -35085010 -3c09fd19 -3529f586 -24030001 -0109102b -144303b6 -00000000 -3c08cc63 -3508ca94 -3c094339 -352941dc -24030000 -0109102b -144303ae -00000000 -3c084d11 -3508dae4 -3c09b128 -352928ba -24030001 -0109102b -144303a6 -00000000 -3c088ffd -350830c0 -3c09c474 -3529bbc0 -24030001 -0109102b -1443039e -00000000 -3c08ec9c -3508b980 -3c0922de -3529ebc4 -24030000 -0109102b -14430396 -00000000 -3c0879ba -3508fd62 -3c09b8ba -3529e6f0 -24030001 -0109102b -1443038e -00000000 -3c0867b5 -35089000 -3c097637 -3529afba -24030001 -0109102b -14430386 -00000000 -3c086cd2 -35084e2e -3c09245c -35294d43 -24030000 -0109102b -1443037e -00000000 -3c085d61 -350844dc -3c09b58b -3529778f -24030001 -0109102b -14430376 -00000000 -3c08014c -3508f4cc -3c097fbe -35297340 -24030001 -0109102b -1443036e -00000000 -3c08a7df -3508c844 -3c09c15b -35291558 -24030001 -0109102b -14430366 -00000000 -3c082cbe -3508e9b7 -3c09ee71 -3529c4d0 -24030001 -0109102b -1443035e -00000000 -3c081a22 -3508f920 -3c092f91 -35290898 -24030001 -0109102b -14430356 -00000000 -3c08bc90 -3508e272 -3c09213c -3529d464 -24030000 -0109102b -1443034e -00000000 -3c082543 -3508d804 -3c09b230 -3529d4b2 -24030001 -0109102b -14430346 -00000000 -3c08e553 -350818f0 -3c09758f -352961b0 -24030000 -0109102b -1443033e -00000000 -3c0806d0 -3508d250 -3c09f1c7 -3529d6d0 -24030001 -0109102b -14430336 -00000000 -3c08dd41 -3508b686 -3c09b8f9 -35294d58 -24030000 -0109102b -1443032e -00000000 -3c08edb1 -3508f591 -3c09f67a -3529c84c -24030001 -0109102b -14430326 -00000000 -3c084404 -3508df16 -3c09e91a -3529e4f0 -24030001 -0109102b -1443031e -00000000 -3c082556 -35085ee0 -3c09a612 -35291330 -24030001 -0109102b -14430316 -00000000 -3c086d7e -35081370 -3c09c7e3 -35292139 -24030001 -0109102b -1443030e -00000000 -3c083dc9 -35088258 -3c098b93 -3529ffc0 -24030001 -0109102b -14430306 -00000000 -3c080c8d -3508c160 -3c09647a -35293b40 -24030001 -0109102b -144302fe -00000000 -3c083267 -3508ed10 -3c09900e -352904e0 -24030001 -0109102b -144302f6 -00000000 -3c08eb56 -3508b226 -3c09be63 -3529007a -24030000 -0109102b -144302ee -00000000 -3c08131e -3508e630 -3c09362f -352965ba -24030001 -0109102b -144302e6 -00000000 -3c082688 -350831c5 -3c09d9c4 -3529ac3c -24030001 -0109102b -144302de -00000000 -3c08751c -350800fc -3c09ee70 -35292f68 -24030001 -0109102b -144302d6 -00000000 -3c084b98 -350804dc -3c09ef7c -3529a5b8 -24030001 -0109102b -144302ce -00000000 -3c082339 -350860b8 -3c09adf8 -3529f658 -24030001 -0109102b -144302c6 -00000000 -3c0880bc -3508c7a2 -24090000 -24030000 -0109102b -144302bf -00000000 -3c084512 -3508c5b4 -24090000 -24030000 -0109102b -144302b8 -00000000 -3c08690e -3508ca38 -24090000 -24030000 -0109102b -144302b1 -00000000 -3c08cae0 -350883a5 -24090000 -24030000 -0109102b -144302aa -00000000 -3c086db9 -35082ba5 -24090000 -24030000 -0109102b -144302a3 -00000000 -3c08c5a8 -350894c9 -24090000 -24030000 -0109102b -1443029c -00000000 -3c081dac -35088320 -24090000 -24030000 -0109102b -14430295 -00000000 -3c08fe7e -35088fd4 -24090000 -24030000 -0109102b -1443028e -00000000 -3c08f5b2 -35081a40 -24090000 -24030000 -0109102b -14430287 -00000000 -3c0899a2 -3508b300 -24090000 -24030000 -0109102b -14430280 -00000000 -3c0880c0 -3508dbfc -24090000 -24030000 -0109102b -14430279 -00000000 -3c082a60 -3508735a -24090000 -24030000 -0109102b -14430272 -00000000 -3c08d2ad -35088810 -24090000 -24030000 -0109102b -1443026b -00000000 -3c08d6f6 -350857a0 -24090000 -24030000 -0109102b -14430264 -00000000 -3c0880b5 -3508dc22 -24090000 -24030000 -0109102b -1443025d -00000000 -3c08e9f9 -35088f48 -24090000 -24030000 -0109102b -14430256 -00000000 -3c08b15c -3508f710 -24090000 -24030000 -0109102b -1443024f -00000000 -3c0809b4 -35081b80 -24090000 -24030000 -0109102b -14430248 -00000000 -3c081ad7 -3508ed46 -24090000 -24030000 -0109102b -14430241 -00000000 -3c0853b1 -35085ae8 -24090000 -24030000 -0109102b -1443023a -00000000 -3c0830c6 -3508b680 -24090000 -24030000 -0109102b -14430233 -00000000 -3c08e74d -350839c2 -24090000 -24030000 -0109102b -1443022c -00000000 -3c08ee4a -35082198 -24090000 -24030000 -0109102b -14430225 -00000000 -3c082a4c -35081f00 -24090000 -24030000 -0109102b -1443021e -00000000 -3c08a08d -35080546 -24090000 -24030000 -0109102b -14430217 -00000000 -3c0894cd -35080c00 -24090000 -24030000 -0109102b -14430210 -00000000 -3c08d1d2 -35082a40 -24090000 -24030000 -0109102b -14430209 -00000000 -3c088002 -35085000 -24090000 -24030000 -0109102b -14430202 -00000000 -3c0811ce -35081c00 -24090000 -24030000 -0109102b -144301fb -00000000 -3c086f25 -35085bec -24090000 -24030000 -0109102b -144301f4 -00000000 -3c08ae35 -3508b410 -24090000 -24030000 -0109102b -144301ed -00000000 -3c08c432 -3508266a -24090000 -24030000 -0109102b -144301e6 -00000000 -3c08943f -35085b66 -24090000 -24030000 -0109102b -144301df -00000000 -3c089428 -35082250 -24090000 -24030000 -0109102b -144301d8 -00000000 -3c085c06 -3508de3f -24090000 -24030000 -0109102b -144301d1 -00000000 -3c08524c -3508c000 -24090000 -24030000 -0109102b -144301ca -00000000 -3c0824f2 -35087490 -24090000 -24030000 -0109102b -144301c3 -00000000 -3c08f725 -3508ddc0 -24090000 -24030000 -0109102b -144301bc -00000000 -3c08dfcb -3508b9d8 -24090000 -24030000 -0109102b -144301b5 -00000000 -3c08c832 -350888d4 -24090000 -24030000 -0109102b -144301ae -00000000 -3c08fe76 -3508d830 -24090000 -24030000 -0109102b -144301a7 -00000000 -3c08630e -3508bd84 -24090000 -24030000 -0109102b -144301a0 -00000000 -3c0803dc -3508b908 -24090000 -24030000 -0109102b -14430199 -00000000 -3c088a50 -35080d38 -24090000 -24030000 -0109102b -14430192 -00000000 -3c088448 -350866e0 -24090000 -24030000 -0109102b -1443018b -00000000 -3c08ddf2 -35086488 -24090000 -24030000 -0109102b -14430184 -00000000 -3c086bf4 -35088ff0 -24090000 -24030000 -0109102b -1443017d -00000000 -3c08f6ac -35080fac -24090000 -24030000 -0109102b -14430176 -00000000 -3c08c94a -3508b2e8 -24090000 -24030000 -0109102b -1443016f -00000000 -3c0855ca -3508aca0 -24090000 -24030000 -0109102b -14430168 -00000000 -24080000 -3c09d2fb -35291bfc -24030001 -0109102b -14430161 -00000000 -24080000 -3c09851e -352906f7 -24030001 -0109102b -1443015a -00000000 -24080000 -3c092922 -352977f0 -24030001 -0109102b -14430153 -00000000 -24080000 -3c09a979 -3529b406 -24030001 -0109102b -1443014c -00000000 -24080000 -3c093bca -3529f627 -24030001 -0109102b -14430145 -00000000 -24080000 -3c095174 -3529d9c0 -24030001 -0109102b -1443013e -00000000 -24080000 -3c09c501 -352907a4 -24030001 -0109102b -14430137 -00000000 -24080000 -3c09e381 -3529126c -24030001 -0109102b -14430130 -00000000 -24080000 -3c09f547 -3529978a -24030001 -0109102b -14430129 -00000000 -24080000 -3c09fd40 -35290d52 -24030001 -0109102b -14430122 -00000000 -24080000 -3c0928a8 -35292746 -24030001 -0109102b -1443011b -00000000 -24080000 -3c090b7c -3529c1c0 -24030001 -0109102b -14430114 -00000000 -24080000 -3c09ffdd -3529b9c6 -24030001 -0109102b -1443010d -00000000 -24080000 -3c091046 -35291858 -24030001 -0109102b -14430106 -00000000 -24080000 -3c0958ef -35298349 -24030001 -0109102b -144300ff -00000000 -24080000 -3c0911be -3529fc7c -24030001 -0109102b -144300f8 -00000000 -24080000 -3c099b36 -35290690 -24030001 -0109102b -144300f1 -00000000 -24080000 -3c090b68 -3529d018 -24030001 -0109102b -144300ea -00000000 -24080000 -3c09800c -3529a9de -24030001 -0109102b -144300e3 -00000000 -24080000 -3c09346e -3529b190 -24030001 -0109102b -144300dc -00000000 -24080000 -3c0930ff -3529e000 -24030001 -0109102b -144300d5 -00000000 -24080000 -3c0999c7 -352991ec -24030001 -0109102b -144300ce -00000000 -24080000 -3c095aec -35291334 -24030001 -0109102b -144300c7 -00000000 -24080000 -3c096c34 -35297ff2 -24030001 -0109102b -144300c0 -00000000 -24080000 -3c0964f2 -352918fc -24030001 -0109102b -144300b9 -00000000 -24080000 -3c09fbe3 -35291c68 -24030001 -0109102b -144300b2 -00000000 -24080000 -3c09fafd -352990d4 -24030001 -0109102b -144300ab -00000000 -24080000 -3c093892 -3529b520 -24030001 -0109102b -144300a4 -00000000 -24080000 -3c090b75 -35297ee4 -24030001 -0109102b -1443009d -00000000 -24080000 -3c090e1e -35295029 -24030001 -0109102b -14430096 -00000000 -24080000 -3c0934b9 -35294fdc -24030001 -0109102b -1443008f -00000000 -24080000 -3c09b68d -35299ab6 -24030001 -0109102b -14430088 -00000000 -24080000 -3c09d8a2 -3529e3ce -24030001 -0109102b -14430081 -00000000 -24080000 -3c099049 -35292a8e -24030001 -0109102b -1443007a -00000000 -24080000 -3c09e220 -3529eeda -24030001 -0109102b -14430073 -00000000 -24080000 -3c090b31 -352933a0 -24030001 -0109102b -1443006c -00000000 -24080000 -3c09b71b -3529c7ce -24030001 -0109102b -14430065 -00000000 -24080000 -3c092aa7 -352946a6 -24030001 -0109102b -1443005e -00000000 -24080000 -3c094543 -35298a68 -24030001 -0109102b -14430057 -00000000 -24080000 -3c09c76a -35295250 -24030001 -0109102b -14430050 -00000000 -24080000 -3c0939ab -35290100 -24030001 -0109102b -14430049 -00000000 -24080000 -3c0952ef -35294485 -24030001 -0109102b -14430042 -00000000 -24080000 -3c09ad19 -3529dd1c -24030001 -0109102b -1443003b -00000000 -24080000 -3c09dc03 -3529b4c0 -24030001 -0109102b -14430034 -00000000 -24080000 -3c092fa8 -3529986c -24030001 -0109102b -1443002d -00000000 -24080000 -3c09ed08 -3529ea47 -24030001 -0109102b -14430026 -00000000 -24080000 -3c093063 -352992cc -24030001 -0109102b -1443001f -00000000 -24080000 -3c09ba46 -3529c85d -24030001 -0109102b -14430018 -00000000 -24080000 -3c09059e -35292da8 -24030001 -0109102b -14430011 -00000000 -24080000 -3c0932f2 -35297784 -24030001 -0109102b -1443000a -00000000 -24080000 -24090000 -24030000 -0109102b -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -3c08800d -24120003 -ad120000 -40805800 -3c170040 -40976000 -00000000 -3c170003 -3c0273b2 -3442cf92 -3c0373b2 -3463cf92 -3c0490a5 -3484f39c -3c05d421 -34a579e0 -3c14bfc8 -2694cbec -00851020 -1657007a -00000000 -14430078 -00000000 -24120003 -3c021a37 -34426500 -3c031a37 -34636500 -3c042a3c -3484a166 -3c05797f -34a530b9 -3c14bfc8 -2694cc34 -ad080004 -ad140004 -00851020 -ad140000 -8d090004 -15340066 -00000000 -16570064 -00000000 -14430062 -00000000 -24120003 -ad120000 -24120003 -3c14bfc8 -2694cc94 -01000011 -3c0257b9 -3442e040 -3c0357b9 -3463e040 -3c048054 -348413c0 -3c05dea0 -34a5e60a -0110001b -00851020 -00004810 -1128004f -00000000 -1657004d -00000000 -1443004b -00000000 -24120003 -3c0289a0 -3442a980 -3c0389a0 -3463a980 -3c04474d -3484b690 -3c054d4c -34a5bef8 -3c14bfc8 -2694cce0 -00851020 -0208001b -1657003c -00000000 -1443003a -00000000 -24120003 -3c020f29 -3442c5e0 -3c030f29 -3463c5e0 -3c046818 -3484e272 -3c056f6d -34a52620 -3c14bfc8 -2694cd2c -01000013 -01100019 -00851020 -00004810 -11280029 -00000000 -16570027 -00000000 -14430025 -00000000 -24120003 -3c029f1c -34425870 -3c039f1c -34635870 -3c04a7b7 -3484a764 -3c05c2d6 -34a51d9c -3c14bfc8 -2694cd78 -00851020 -01120019 -16570016 -00000000 -14430014 -00000000 -24120003 -3c0231e6 -3442699f -3c0331e6 -3463699f -3c048a78 -3484cc40 -3c05ab72 -34a584da -3c14bfc8 -2694cdc0 -40927000 -00851020 -40887000 -16570004 -00000000 -14430002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -3c08800d -24120003 -ad120000 -40805800 -3c170040 -40976000 -00000000 -3c170003 -3c02deb0 -34426fd0 -3c03deb0 -34636fd0 -24042c26 -3c047fff -3484f84b -3c14bfc8 -2694ce38 -20822c26 -16570072 -00000000 -24120003 -3c026c53 -344292aa -3c036c53 -346392aa -240454b0 -3c047fff -3484f480 -3c14bfc8 -2694ce74 -ad080004 -ad140004 -208254b0 -ad140000 -8d090004 -15340061 -00000000 -1657005f -00000000 -1443005d -00000000 -24120003 -ad120000 -24120003 -3c0260a7 -34421e30 -3c0360a7 -34631e30 -240471db -3c047fff -34849b21 -3c14bfc8 -2694ced0 -01000011 -0110001b -208271db -00004810 -1128004b -00000000 -16570049 -00000000 -14430047 -00000000 -24120003 -3c02e607 -34425700 -3c03e607 -34635700 -3404be07 -3c048000 -34843a57 -3c14bfc8 -2694cf18 -2082be07 -0208001b -16570039 -00000000 -14430037 -00000000 -24120003 -3c028f7e -3442e6c0 -3c038f7e -3463e6c0 -3404845d -3c048000 -34842c93 -3c14bfc8 -2694cf60 -01000013 -01100019 -2082845d -00004810 -11280027 -00000000 -16570025 -00000000 -14430023 -00000000 -24120003 -3c02bd3e -3442a700 -3c03bd3e -3463a700 -340481f4 -3c048000 -34844016 -3c14bfc8 -2694cfa8 -208281f4 -01120019 -16570015 -00000000 -14430013 -00000000 -24120003 -3c020615 -34422570 -3c030615 -34632570 -3404baa6 -3c048000 -34843510 -3c14bfc8 -2694cfec -40927000 -2082baa6 -40887000 -16570004 -00000000 -14430002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -26100001 -24120000 -3c048000 -3c057fff -34a5ffff -04a00006 -3c08800d -3c16800d -151601da -00000000 -04800003 -3c17800d -100001d6 -00000000 -16f601d4 -00000000 -3c048000 -3c057fff -34a5ffff -04a00006 -25098123 -25168123 -153601cc -00000000 -04800003 -25178123 -100001c8 -00000000 -16f601c6 -00000000 -3c048000 -3c057fff -34a5ffff -04a00006 -ad098ee0 -ad168ee0 -153601be -00000000 -04800003 -ad178ee0 -100001ba -00000000 -16f601b8 -00000000 -3c048000 -3c057fff -34a5ffff -04a00006 -8d0a8ee0 -8d168ee0 -155601b0 -00000000 -04800003 -8d178ee0 -100001ac -00000000 -16f601aa -00000000 -3c048000 -3c057fff -34a5ffff -04a00006 -012a5821 -012ab021 -157601a2 -00000000 -04800003 -012ab821 -1000019e -00000000 -16f6019c -00000000 -3c048000 -3c057fff -34a5ffff -04a00006 -02326025 -0232b025 -15960194 -00000000 -04800003 -0232b825 -10000190 -00000000 -16f6018e -00000000 -3c048000 -3c057fff -34a5ffff -04a00006 -0253682a -0253b02a -15b60186 -00000000 -04800003 -0253b82a -10000182 -00000000 -16f60180 -00000000 -3c048000 -3c057fff -34a5ffff -04a00006 -2a4e8011 -2a568011 -15d60178 -00000000 -04800003 -2a578011 -10000174 -00000000 -16f60172 -00000000 -3c048000 -3c057fff -34a5ffff -04a00006 -2e4f8011 -2e568011 -15f6016a -00000000 -04800003 -2e578011 -10000166 -00000000 -16f60164 -00000000 -3c048000 -3c057fff -34a5ffff -04a00006 -0253c02b -0253b02b -1716015c -00000000 -04800003 -0253b82b -10000158 -00000000 -16f60156 -00000000 -3c048000 -3c057fff -34a5ffff -04a00006 -00124c40 -0012b440 -1536014e -00000000 -04800003 -0012bc40 -1000014a -00000000 -16f60148 -00000000 -3c048000 -3c057fff -34a5ffff -04a00006 -01105020 -0110b020 -15560140 -00000000 -04800003 -0110b820 -1000013c -00000000 -16f6013a -00000000 -3c048000 -3c057fff -34a5ffff -04a00006 -220b8002 -22168002 -15760132 -00000000 -04800003 -22178002 -1000012e -00000000 -16f6012c -00000000 -3c048000 -3c057fff -34a5ffff -04a00006 -01106022 -0110b022 -15960124 -00000000 -04800003 -0110b822 -10000120 -00000000 -16f6011e -00000000 -3c048000 -3c057fff -34a5ffff -04a00006 -01106823 -0110b023 -15b60116 -00000000 -04800003 -0110b823 -10000112 -00000000 -16f60110 -00000000 -3c048000 -3c057fff -34a5ffff -04a00006 -01107024 -0110b024 -15d60108 -00000000 -04800003 -0110b824 -10000104 -00000000 -16f60102 -00000000 -3c048000 -3c057fff -34a5ffff -04a00006 -320f8ff2 -32168ff2 -15f600fa -00000000 -04800003 -32178ff2 -100000f6 -00000000 -16f600f4 -00000000 -3c048000 -3c057fff -34a5ffff -04a00006 -0110c027 -0110b027 -171600ec -00000000 -04800003 -0110b827 -100000e8 -00000000 -16f600e6 -00000000 -3c048000 -3c057fff -34a5ffff -04a00006 -36098ff2 -36168ff2 -153600de -00000000 -04800003 -36178ff2 -100000da -00000000 -16f600d8 -00000000 -3c048000 -3c057fff -34a5ffff -04a00006 -01105026 -0110b026 -155600d0 -00000000 -04800003 -0110b826 -100000cc -00000000 -16f600ca -00000000 -3c048000 -3c057fff -34a5ffff -04a00006 -3a0b8ff2 -3a168ff2 -157600c2 -00000000 -04800003 -3a178ff2 -100000be -00000000 -16f600bc -00000000 -3c048000 -3c057fff -34a5ffff -04a00006 -02086004 -0208b004 -159600b4 -00000000 -04800003 -0208b804 -100000b0 -00000000 -16f600ae -00000000 -3c048000 -3c057fff -34a5ffff -04a00006 -00106a03 -0010b203 -15b600a6 -00000000 -04800003 -0010ba03 -100000a2 -00000000 -16f600a0 -00000000 -3c048000 -3c057fff -34a5ffff -04a00006 -02087007 -0208b007 -15d60098 -00000000 -04800003 -0208b807 -10000094 -00000000 -16f60092 -00000000 -3c048000 -3c057fff -34a5ffff -04a00006 -00107a02 -0010b202 -15f6008a -00000000 -04800003 -0010ba02 -10000086 -00000000 -16f60084 -00000000 -3c048000 -3c057fff -34a5ffff -04a00006 -0208c006 -0208b006 -1716007c -00000000 -04800003 -0208b806 -10000078 -00000000 -16f60076 -00000000 -3c088000 -34098000 -3c048000 -3c057fff -34a5ffff -24020000 -24030000 -04a0000a -0109001a -00001012 -00800013 -0109001a -0000b012 -14560067 -00000000 -00800013 -04800003 -0109001a -10000062 -00000000 -00001812 -1476005f -00000000 -3c048000 -3c057fff -34a5ffff -24020000 -24030000 -04a0000a -0109001b -00001012 -00800013 -0109001b -0000b012 -14560052 -00000000 -00800013 -04800003 -0109001b -1000004d -00000000 -00001812 -1476004a -00000000 -3c048000 -3c057fff -34a5ffff -24020000 -24030000 -04a0000a -01090018 -00001012 -00800013 -01090018 -0000b012 -1456003d -00000000 -00800013 -04800003 -01090018 -10000038 -00000000 -00001812 -14760035 -00000000 -3c048000 -3c057fff -34a5ffff -24020000 -24030000 -04a0000a -01090019 -00001012 -00800013 -01090019 -0000b012 -14560028 -00000000 -00800013 -04800003 -01090019 -10000023 -00000000 -00001812 -14760020 -00000000 -3c048000 -3c057fff -34a5ffff -04a00006 -00007810 -0000b010 -15f60018 -00000000 -04800003 -0000b810 -10000014 -00000000 -16f60012 -00000000 -3c048000 -3c057fff -34a5ffff -04a00006 -00007012 -0000b012 -15d6000a -00000000 -04800003 -0000b812 -10000006 -00000000 -16f60004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -24120000 -3c0856be -3508dfa4 -3c092083 -35291400 -0109001a -0000a812 -0000b010 -24020002 -3c0315b8 -3463b7a4 -1455069e -00000000 -1476069c -00000000 -3c08fda5 -3508ea8a -3c09fac1 -3529873c -0109001a -0000a812 -0000b010 -24020000 -3c03fda5 -3463ea8a -14550690 -00000000 -1476068e -00000000 -3c0853eb -35084a70 -3c0907e1 -35293dd1 -0109001a -0000a812 -0000b010 -2402000a -3c03051e -3463e046 -14550682 -00000000 -14760680 -00000000 -3c083236 -350876e0 -3c09dc3a -35293f10 -0109001a -0000a812 -0000b010 -2402ffff -3c030e70 -3463b5f0 -14550674 -00000000 -14760672 -00000000 -3c08c3e0 -3508f060 -3c09e9c9 -35297944 -0109001a -0000a812 -0000b010 -24020002 -3c03f04d -3463fdd8 -14550666 -00000000 -14760664 -00000000 -3c087c7b -350885f2 -3c09db7e -35296dc0 -0109001a -0000a812 -0000b010 -2402fffd -3c030ef6 -3463cf32 -14550658 -00000000 -14760656 -00000000 -3c083bbf -35081da0 -3c09e73f -35299eea -0109001a -0000a812 -0000b010 -2402fffe -3c030a3e -34635b74 -1455064a -00000000 -14760648 -00000000 -3c088786 -3508a50c -3c09412d -3529c050 -0109001a -0000a812 -0000b010 -2402ffff -3c03c8b4 -3463655c -1455063c -00000000 -1476063a -00000000 -3c08ee98 -3508aaf8 -3c093673 -35290f80 -0109001a -0000a812 -0000b010 -24020000 -3c03ee98 -3463aaf8 -1455062e -00000000 -1476062c -00000000 -3c0868d6 -35085d90 -3c09d6d5 -35292b70 -0109001a -0000a812 -0000b010 -2402fffe -3c031680 -3463b470 -14550620 -00000000 -1476061e -00000000 -3c081777 -35089850 -3c09511b -35291fba -0109001a -0000a812 -0000b010 -24020000 -3c031777 -34639850 -14550612 -00000000 -14760610 -00000000 -3c087bfc -350898c0 -3c09dffb -35298d8c -0109001a -0000a812 -0000b010 -2402fffd -3c031bef -34634164 -14550604 -00000000 -14760602 -00000000 -3c08a109 -35080e30 -3c099f63 -35294c20 -0109001a -0000a812 -0000b010 -24020000 -3c03a109 -34630e30 -145505f6 -00000000 -147605f4 -00000000 -3c089447 -350889e0 -3c09bc1a -3529eab0 -0109001a -0000a812 -0000b010 -24020001 -3c03d82c -34639f30 -145505e8 -00000000 -147605e6 -00000000 -3c089191 -35083c20 -3c090d7f -3529a4a0 -0109001a -0000a812 -0000b010 -2402fff8 -3c03fd8e -34636120 -145505da -00000000 -147605d8 -00000000 -3c08a079 -35082145 -3c09d931 -35296a68 -0109001a -0000a812 -0000b010 -24020002 -3c03ee16 -34634c75 -145505cc -00000000 -147605ca -00000000 -3c080dac -35081e00 -3c09692a -35290470 -0109001a -0000a812 -0000b010 -24020000 -3c030dac -34631e00 -145505be -00000000 -147605bc -00000000 -3c08816e -35084490 -3c0916df -35293f00 -0109001a -0000a812 -0000b010 -2402fffb -3c03f3ca -34637f90 -145505b0 -00000000 -147605ae -00000000 -3c089471 -3508ab8a -3c09c428 -3529d407 -0109001a -0000a812 -0000b010 -24020001 -3c03d048 -3463d783 -145505a2 -00000000 -147605a0 -00000000 -3c081819 -35087510 -3c09859b -35293ae8 -0109001a -0000a812 -0000b010 -24020000 -3c031819 -34637510 -14550594 -00000000 -14760592 -00000000 -3c082885 -35082031 -3c097eab -352985d6 -0109001a -0000a812 -0000b010 -24020000 -3c032885 -34632031 -14550586 -00000000 -14760584 -00000000 -3c082170 -35087800 -3c09ea3c -35293580 -0109001a -0000a812 -0000b010 -2402ffff -3c030bac -3463ad80 -14550578 -00000000 -14760576 -00000000 -3c08f434 -3508d0f8 -3c09d260 -35296068 -0109001a -0000a812 -0000b010 -24020000 -3c03f434 -3463d0f8 -1455056a -00000000 -14760568 -00000000 -3c0889fa -35089ce0 -3c098b74 -35296d5c -0109001a -0000a812 -0000b010 -24020001 -3c03fe86 -34632f84 -1455055c -00000000 -1476055a -00000000 -3c082fb0 -3508dcbc -3c09b389 -35296224 -0109001a -0000a812 -0000b010 -24020000 -3c032fb0 -3463dcbc -1455054e -00000000 -1476054c -00000000 -3c08c7b1 -350828a4 -3c090600 -3529b15d -0109001a -0000a812 -0000b010 -2402fff7 -3c03fdb7 -346364e9 -14550540 -00000000 -1476053e -00000000 -3c0857d6 -3508fe0a -3c092dbe -3529c2d0 -0109001a -0000a812 -0000b010 -24020001 -3c032a18 -34633b3a -14550532 -00000000 -14760530 -00000000 -3c08a78b -3508ba58 -3c091d1c -3529e488 -0109001a -0000a812 -0000b010 -2402fffd -3c03fee2 -346367f0 -14550524 -00000000 -14760522 -00000000 -3c086dac -3508f9c8 -3c0945e5 -3529c7a0 -0109001a -0000a812 -0000b010 -24020001 -3c0327c7 -34633228 -14550516 -00000000 -14760514 -00000000 -3c0862d0 -3508a060 -3c09b370 -35298762 -0109001a -0000a812 -0000b010 -2402ffff -3c031641 -346327c2 -14550508 -00000000 -14760506 -00000000 -3c081276 -35083f9c -3c09f896 -3529d530 -0109001a -0000a812 -0000b010 -2402fffe -3c0303a3 -3463e9fc -145504fa -00000000 -147604f8 -00000000 -3c08098e -3508f6a0 -3c09cf03 -35295c50 -0109001a -0000a812 -0000b010 -24020000 -3c03098e -3463f6a0 -145504ec -00000000 -147604ea -00000000 -3c083a24 -350891a3 -3c091f05 -35294400 -0109001a -0000a812 -0000b010 -24020001 -3c031b1f -34634da3 -145504de -00000000 -147604dc -00000000 -3c08dd12 -3508c65c -3c098874 -3529feb8 -0109001a -0000a812 -0000b010 -24020000 -3c03dd12 -3463c65c -145504d0 -00000000 -147604ce -00000000 -3c086d39 -35084d48 -3c09fddf -3529c888 -0109001a -0000a812 -0000b010 -2402ffcd -3c0300ce -34634060 -145504c2 -00000000 -147604c0 -00000000 -3c0817c5 -350825ee -3c09ff6e -352916fc -0109001a -0000a812 -0000b010 -2402ffd7 -3c030066 -3463d44a -145504b4 -00000000 -147604b2 -00000000 -3c08a752 -3508a72f -3c09e35b -352951ba -0109001a -0000a812 -0000b010 -24020003 -3c03fd40 -3463b201 -145504a6 -00000000 -147604a4 -00000000 -3c08d92d -3508e300 -3c0915a8 -3529cfe5 -0109001a -0000a812 -0000b010 -2402ffff -3c03eed6 -3463b2e5 -14550498 -00000000 -14760496 -00000000 -3c08e775 -3508a23d -3c09a45e -3529f71c -0109001a -0000a812 -0000b010 -24020000 -3c03e775 -3463a23d -1455048a -00000000 -14760488 -00000000 -3c0831f9 -35088592 -3c09d610 -352978b1 -0109001a -0000a812 -0000b010 -2402ffff -3c030809 -3463fe43 -1455047c -00000000 -1476047a -00000000 -3c088055 -35083a33 -3c09eca4 -3529bbf1 -0109001a -0000a812 -0000b010 -24020006 -3c03f478 -3463d28d -1455046e -00000000 -1476046c -00000000 -3c085e6d -3508ac0d -3c09048e -352906c9 -0109001a -0000a812 -0000b010 -24020014 -3c030355 -34632459 -14550460 -00000000 -1476045e -00000000 -3c0885b2 -35088db3 -3c0978d4 -35298e18 -0109001a -0000a812 -0000b010 -2402ffff -3c03fe87 -34631bcb -14550452 -00000000 -14760450 -00000000 -3c0859f9 -35086b98 -3c090455 -3529de88 -0109001a -0000a812 -0000b010 -24020014 -3c030344 -346308f8 -14550444 -00000000 -14760442 -00000000 -3c086b36 -3508df10 -3c097744 -3529092c -0109001a -0000a812 -0000b010 -24020000 -3c036b36 -3463df10 -14550436 -00000000 -14760434 -00000000 -3c081f9e -3508644f -3c09ad18 -3529886c -0109001a -0000a812 -0000b010 -24020000 -3c031f9e -3463644f -14550428 -00000000 -14760426 -00000000 -3c086d18 -35089a72 -3c09645d -35298aac -0109001a -0000a812 -0000b010 -24020001 -3c0308bb -34630fc6 -1455041a -00000000 -14760418 -00000000 -3c080c11 -350866a8 -3c096526 -3529ce40 -0109001a -0000a812 -0000b010 -24020000 -3c030c11 -346366a8 -1455040c -00000000 -1476040a -00000000 -3c085af7 -35089440 -3c09a772 -35297e50 -0109001a -0000a812 -0000b010 -2402ffff -3c03026a -34631290 -145503fe -00000000 -147603fc -00000000 -3c08ebbd -35086e70 -3c090d2b -35294b5b -0109001a -0000a812 -0000b010 -2402ffff -3c03f8e8 -3463b9cb -145503f0 -00000000 -147603ee -00000000 -3c08b218 -35080178 -3c099cb3 -35293ba8 -0109001a -0000a812 -0000b010 -24020000 -3c03b218 -34630178 -145503e2 -00000000 -147603e0 -00000000 -3c089d41 -350833d8 -3c09b268 -3529ae15 -0109001a -0000a812 -0000b010 -24020001 -3c03ead8 -346385c3 -145503d4 -00000000 -147603d2 -00000000 -3c08bd45 -350828a6 -3c094ebd -35297e00 -0109001a -0000a812 -0000b010 -24020000 -3c03bd45 -346328a6 -145503c6 -00000000 -147603c4 -00000000 -3c08e4bd -35081250 -3c09488a -3529bc1c -0109001a -0000a812 -0000b010 -24020000 -3c03e4bd -34631250 -145503b8 -00000000 -147603b6 -00000000 -3c08a2a7 -35087eae -3c09299d -35292a20 -0109001a -0000a812 -0000b010 -2402fffe -3c03f5e1 -3463d2ee -145503aa -00000000 -147603a8 -00000000 -3c084b68 -35088500 -3c0916d5 -3529bb7c -0109001a -0000a812 -0000b010 -24020003 -3c0306e7 -3463528c -1455039c -00000000 -1476039a -00000000 -3c08a1da -3508497c -3c09c7ed -35291a50 -0109001a -0000a812 -0000b010 -24020001 -3c03d9ed -34632f2c -1455038e -00000000 -1476038c -00000000 -3c086226 -35080fe8 -3c095ba0 -3529b130 -0109001a -0000a812 -0000b010 -24020001 -3c030685 -34635eb8 -14550380 -00000000 -1476037e -00000000 -3c089bb3 -3508f6d9 -3c0941e1 -352936a4 -0109001a -0000a812 -0000b010 -2402ffff -3c03dd95 -34632d7d -14550372 -00000000 -14760370 -00000000 -3c08d5fc -3508d1d6 -3c09c073 -3529ea20 -0109001a -0000a812 -0000b010 -24020000 -3c03d5fc -3463d1d6 -14550364 -00000000 -14760362 -00000000 -3c08aace -3508ef00 -3c09b934 -3529eec0 -0109001a -0000a812 -0000b010 -24020001 -3c03f19a -34630040 -14550356 -00000000 -14760354 -00000000 -3c08f21b -350828a8 -3c09724b -35297460 -0109001a -0000a812 -0000b010 -24020000 -3c03f21b -346328a8 -14550348 -00000000 -14760346 -00000000 -3c08630e -350869e4 -3c093d1c -3529de06 -0109001a -0000a812 -0000b010 -24020001 -3c0325f1 -34638bde -1455033a -00000000 -14760338 -00000000 -3c08be57 -3508f2e4 -3c093e9c -35290ea0 -0109001a -0000a812 -0000b010 -2402ffff -3c03fcf4 -34630184 -1455032c -00000000 -1476032a -00000000 -3c084e2c -350828a6 -3c097266 -35292240 -0109001a -0000a812 -0000b010 -24020000 -3c034e2c -346328a6 -1455031e -00000000 -1476031c -00000000 -3c085f95 -3508c708 -3c09cf41 -3529487b -0109001a -0000a812 -0000b010 -2402ffff -3c032ed7 -34630f83 -14550310 -00000000 -1476030e -00000000 -3c088dce -3508ffe3 -3c09dc6a -35293b80 -0109001a -0000a812 -0000b010 -24020003 -3c03f890 -34634d63 -14550302 -00000000 -14760300 -00000000 -3c08f5d4 -3508fec0 -3c09f2a8 -3529f09c -0109001a -0000a812 -0000b010 -24020000 -3c03f5d4 -3463fec0 -145502f4 -00000000 -147602f2 -00000000 -3c08881d -3508ab60 -3c099a38 -35290358 -0109001a -0000a812 -0000b010 -24020001 -3c03ede5 -3463a808 -145502e6 -00000000 -147602e4 -00000000 -3c08d077 -350815a0 -3c0966e6 -352939b3 -0109001a -0000a812 -0000b010 -24020000 -3c03d077 -346315a0 -145502d8 -00000000 -147602d6 -00000000 -3c087820 -350895ce -3c0993be -35293000 -0109001a -0000a812 -0000b010 -2402ffff -3c030bde -3463c5ce -145502ca -00000000 -147602c8 -00000000 -3c0889ec -350882ca -3c09e20b -35292a70 -0109001a -0000a812 -0000b010 -24020003 -3c03e3cb -3463037a -145502bc -00000000 -147602ba -00000000 -3c08a193 -3508b0e0 -3c0920fa -35290b00 -0109001a -0000a812 -0000b010 -2402fffe -3c03e387 -3463c6e0 -145502ae -00000000 -147602ac -00000000 -3c083557 -3508ea04 -3c0975c4 -352978d0 -0109001a -0000a812 -0000b010 -24020000 -3c033557 -3463ea04 -145502a0 -00000000 -1476029e -00000000 -3c08a832 -3508f328 -3c09ee25 -3529c038 -0109001a -0000a812 -0000b010 -24020004 -3c03ef9b -3463f248 -14550292 -00000000 -14760290 -00000000 -3c0852b5 -3508d68a -3c098899 -3529c4a8 -0109001a -0000a812 -0000b010 -24020000 -3c0352b5 -3463d68a -14550284 -00000000 -14760282 -00000000 -3c085eec -35088ab7 -3c0990af -352959cc -0109001a -0000a812 -0000b010 -24020000 -3c035eec -34638ab7 -14550276 -00000000 -14760274 -00000000 -3c08d93d -35083180 -3c0972d0 -35293460 -0109001a -0000a812 -0000b010 -24020000 -3c03d93d -34633180 -14550268 -00000000 -14760266 -00000000 -3c087786 -35086a8e -3c093265 -35299e96 -0109001a -0000a812 -0000b010 -24020002 -3c0312bb -34632d62 -1455025a -00000000 -14760258 -00000000 -3c085958 -3508f077 -3c09eb2b -3529d5ec -0109001a -0000a812 -0000b010 -2402fffc -3c030608 -34634827 -1455024c -00000000 -1476024a -00000000 -3c086efa -35081a58 -3c09b3f6 -35295f42 -0109001a -0000a812 -0000b010 -2402ffff -3c0322f0 -3463799a -1455023e -00000000 -1476023c -00000000 -3c08be71 -35088690 -3c09e54a -35292a9e -0109001a -0000a812 -0000b010 -24020002 -3c03f3dd -34633154 -14550230 -00000000 -1476022e -00000000 -3c08d5e2 -3508a4b0 -3c099a86 -35290828 -0109001a -0000a812 -0000b010 -24020000 -3c03d5e2 -3463a4b0 -14550222 -00000000 -14760220 -00000000 -3c0852d1 -35086644 -3c092d06 -3529d3ac -0109001a -0000a812 -0000b010 -24020001 -3c0325ca -34639298 -14550214 -00000000 -14760212 -00000000 -3c08ea72 -3508e2b6 -3c09ec30 -35297a80 -0109001a -0000a812 -0000b010 -24020001 -3c03fe42 -34636836 -14550206 -00000000 -14760204 -00000000 -3c08ca15 -35080860 -3c0968ac -35294460 -0109001a -0000a812 -0000b010 -24020000 -3c03ca15 -34630860 -145501f8 -00000000 -147601f6 -00000000 -3c0899a8 -35081ef8 -3c094956 -35299c66 -0109001a -0000a812 -0000b010 -2402ffff -3c03e2fe -3463bb5e -145501ea -00000000 -147601e8 -00000000 -3c083181 -3508e9f0 -3c096f9b -35299c74 -0109001a -0000a812 -0000b010 -24020000 -3c033181 -3463e9f0 -145501dc -00000000 -147601da -00000000 -3c0815dd -35081e40 -3c0950a7 -35292ba0 -0109001a -0000a812 -0000b010 -24020000 -3c0315dd -34631e40 -145501ce -00000000 -147601cc -00000000 -3c08f61a -3508fe37 -3c09b6fc -3529bca3 -0109001a -0000a812 -0000b010 -24020000 -3c03f61a -3463fe37 -145501c0 -00000000 -147601be -00000000 -3c08682f -3508edd2 -3c09b339 -3529543e -0109001a -0000a812 -0000b010 -2402ffff -3c031b69 -34634210 -145501b2 -00000000 -147601b0 -00000000 -3c08e58a -35084420 -3c09e374 -35294db0 -0109001a -0000a812 -0000b010 -24020000 -3c03e58a -34634420 -145501a4 -00000000 -147601a2 -00000000 -3c08b6b9 -3508f08a -3c09199a -35296c48 -0109001a -0000a812 -0000b010 -2402fffe -3c03e9ee -3463c91a -14550196 -00000000 -14760194 -00000000 -3c08debc -3508b606 -3c09e8bb -3529aeb0 -0109001a -0000a812 -0000b010 -24020001 -3c03f601 -34630756 -14550188 -00000000 -14760186 -00000000 -3c083a71 -3508821e -3c097501 -35297300 -0109001a -0000a812 -0000b010 -24020000 -3c033a71 -3463821e -1455017a -00000000 -14760178 -00000000 -3c0816be -3508834c -3c09a7ea -35293340 -0109001a -0000a812 -0000b010 -24020000 -3c0316be -3463834c -1455016c -00000000 -1476016a -00000000 -3c087130 -3508e360 -3c09b8ec -3529acc0 -0109001a -0000a812 -0000b010 -2402ffff -3c032a1d -34639020 -1455015e -00000000 -1476015c -00000000 -3c0848e6 -35088d72 -3c096195 -35298b0f -0109001a -0000a812 -0000b010 -24020000 -3c0348e6 -34638d72 -14550150 -00000000 -1476014e -00000000 -3c08da59 -35084800 -3c098045 -3529367d -0109001a -0000a812 -0000b010 -24020000 -3c03da59 -34634800 -14550142 -00000000 -14760140 -00000000 -3c08e8c2 -3508df9a -3c09e6c6 -35296c34 -0109001a -0000a812 -0000b010 -24020000 -3c03e8c2 -3463df9a -14550134 -00000000 -14760132 -00000000 -3c089e51 -35086c26 -3c09ef3e -35293bd4 -0109001a -0000a812 -0000b010 -24020005 -3c03f21a -34634102 -14550126 -00000000 -14760124 -00000000 -3c087f9c -35084ad4 -3c096c56 -3529d48c -0109001a -0000a812 -0000b010 -24020001 -3c031345 -34637648 -14550118 -00000000 -14760116 -00000000 -3c083032 -35082930 -3c091b8d -35293720 -0109001a -0000a812 -0000b010 -24020001 -3c0314a4 -3463f210 -1455010a -00000000 -14760108 -00000000 -3c08f7be -3508d7b0 -3c09db77 -3529e540 -0109001a -0000a812 -0000b010 -24020000 -3c03f7be -3463d7b0 -145500fc -00000000 -147600fa -00000000 -3c08a0c7 -3508d748 -3c098de6 -35291300 -0109001a -0000a812 -0000b010 -24020000 -3c03a0c7 -3463d748 -145500ee -00000000 -147600ec -00000000 -3c08deb2 -3508f704 -3c09fd2b -35290c11 -0109001a -0000a812 -0000b010 -2402000b -3c03fdd9 -34637249 -145500e0 -00000000 -147600de -00000000 -3c08c08e -350813d8 -3c091f02 -35295330 -0109001a -0000a812 -0000b010 -2402fffe -3c03fe92 -3463ba38 -145500d2 -00000000 -147600d0 -00000000 -3c081c4f -3508b5a4 -3c099f16 -3529309a -0109001a -0000a812 -0000b010 -24020000 -3c031c4f -3463b5a4 -145500c4 -00000000 -147600c2 -00000000 -3c08c79d -3508d5a8 -3c091708 -3529cffa -0109001a -0000a812 -0000b010 -2402fffe -3c03f5af -3463759c -145500b6 -00000000 -147600b4 -00000000 -3c08ee85 -35086ae8 -3c0980b4 -3529ba58 -0109001a -0000a812 -0000b010 -24020000 -3c03ee85 -34636ae8 -145500a8 -00000000 -147600a6 -00000000 -3c088f9f -3508c561 -3c09bd96 -3529c9d4 -0109001a -0000a812 -0000b010 -24020001 -3c03d208 -3463fb8d -1455009a -00000000 -14760098 -00000000 -3c08b992 -3508d620 -3c09ced2 -35294e3e -0109001a -0000a812 -0000b010 -24020001 -3c03eac0 -346387e2 -1455008c -00000000 -1476008a -00000000 -3c084967 -3508f580 -3c09e138 -35291905 -0109001a -0000a812 -0000b010 -2402fffe -3c030bd8 -3463278a -1455007e -00000000 -1476007c -00000000 -3c08722d -3508059f -3c09705c -3529ea80 -0109001a -0000a812 -0000b010 -24020001 -3c0301d0 -34631b1f -14550070 -00000000 -1476006e -00000000 -3c081505 -35083974 -3c098b5e -35295c00 -0109001a -0000a812 -0000b010 -24020000 -3c031505 -34633974 -14550062 -00000000 -14760060 -00000000 -3c08664c -35082a8c -3c0950bf -35290b96 -0109001a -0000a812 -0000b010 -24020001 -3c03158d -34631ef6 -14550054 -00000000 -14760052 -00000000 -3c089239 -35085380 -3c0915c2 -3529099e -0109001a -0000a812 -0000b010 -2402fffb -3c03ff03 -34638396 -14550046 -00000000 -14760044 -00000000 -3c08f24a -35082a85 -3c09ca40 -35296d34 -0109001a -0000a812 -0000b010 -24020000 -3c03f24a -34632a85 -14550038 -00000000 -14760036 -00000000 -3c089187 -3508ed80 -3c09b8ff -35294cc8 -0109001a -0000a812 -0000b010 -24020001 -3c03d888 -3463a0b8 -1455002a -00000000 -14760028 -00000000 -24080000 -3c09a7bb -35291ef0 -0109001a -0000a812 -0000b010 -24020000 -24030000 -1455001e -00000000 -1476001c -00000000 -24080000 -3c093050 -3529efec -0109001a -0000a812 -0000b010 -24020000 -24030000 -14550012 -00000000 -14760010 -00000000 -24080000 -3c0994e2 -35299c00 -0109001a -0000a812 -0000b010 -24020000 -24030000 -14550006 -00000000 -14760004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -24120000 -3c080480 -3508ff04 -3c094093 -35293204 -3c034514 -34633108 -01091020 -1443085d -00000000 -3c082a19 -3508dd40 -3c09a879 -352971e0 -3c03d293 -34634f20 -01091020 -14430854 -00000000 -3c088061 -35083360 -3c0942ad -3529f91d -3c03c30f -34632c7d -01091020 -1443084b -00000000 -3c085bec -350825e2 -3c09f96e -3529dfe4 -3c03555b -346305c6 -01091020 -14430842 -00000000 -3c0870b9 -3508a200 -3c09d9bf -35294900 -3c034a78 -3463eb00 -01091020 -14430839 -00000000 -3c08b3b7 -35082934 -3c093c7e -3529ad62 -3c03f035 -3463d696 -01091020 -14430830 -00000000 -3c086d0c -35084270 -3c0981b2 -3529013c -3c03eebe -346343ac -01091020 -14430827 -00000000 -3c083c35 -3508a398 -3c0918fb -35297c38 -3c035531 -34631fd0 -01091020 -1443081e -00000000 -3c08c7ef -350822ec -3c0904fe -35296cdb -3c03cced -34638fc7 -01091020 -14430815 -00000000 -3c087080 -3508076c -3c09a343 -3529f990 -3c0313c4 -346300fc -01091020 -1443080c -00000000 -3c083a1b -35083c40 -3c09c5af -35294eea -3c03ffca -34638b2a -01091020 -14430803 -00000000 -3c082969 -3c098b34 -3529011c -3c03b49d -3463011c -01091020 -144307fb -00000000 -3c08b466 -35087af0 -3c0932f3 -35296c2c -3c03e759 -3463e71c -01091020 -144307f2 -00000000 -3c08e4e7 -350886e2 -3c09b3c9 -3529e1ad -3c0398b1 -3463688f -01091020 -144307e9 -00000000 -3c08fddf -3508d88a -3c09f06b -3529a9f0 -3c03ee4b -3463827a -01091020 -144307e0 -00000000 -3c08bf2d -35086a27 -3c095976 -35298f20 -3c0318a3 -3463f947 -01091020 -144307d7 -00000000 -3c0802fa -3508b2dc -3c09c1f9 -35296840 -3c03c4f4 -34631b1c -01091020 -144307ce -00000000 -3c08cb72 -3508c8d8 -3c09c005 -3529a5a4 -3c038b78 -34636e7c -01091020 -144307c5 -00000000 -3c080913 -3508c7b8 -3c096c5f -3529982c -3c037573 -34635fe4 -01091020 -144307bc -00000000 -3c08fb64 -3508f900 -3c099625 -3529bacc -3c03918a -3463b3cc -01091020 -144307b3 -00000000 -3c08a8f1 -3508f964 -3c097cd0 -3529bd40 -3c0325c2 -3463b6a4 -01091020 -144307aa -00000000 -3c08f603 -35087818 -3c096fc0 -3529fc40 -3c0365c4 -34637458 -01091020 -144307a1 -00000000 -3c084a8f -35082a00 -3c091b09 -352931d8 -3c036598 -34635bd8 -01091020 -14430798 -00000000 -3c08e8d9 -35088fda -3c09fff4 -35297fd0 -3c03e8ce -34630faa -01091020 -1443078f -00000000 -3c08bde8 -3508c034 -3c09d7c6 -35296c81 -3c0395af -34632cb5 -01091020 -14430786 -00000000 -3c082890 -3508ffb0 -3c0945d5 -3529eda8 -3c036e66 -3463ed58 -01091020 -1443077d -00000000 -3c08d8d4 -35080d50 -3c091daa -3529bd88 -3c03f67e -3463cad8 -01091020 -14430774 -00000000 -3c084e39 -35086fda -3c098b7f -35293f2a -3c03d9b8 -3463af04 -01091020 -1443076b -00000000 -3c086e51 -3508cc78 -3c09db9b -3529e892 -3c0349ed -3463b50a -01091020 -14430762 -00000000 -3c08e5f5 -3508e676 -3c091569 -35297ab8 -3c03fb5f -3463612e -01091020 -14430759 -00000000 -3c089382 -3508c800 -3c095a74 -3529eb25 -3c03edf7 -3463b325 -01091020 -14430750 -00000000 -3c08b4c0 -3508b8b1 -3c091bb1 -3529d280 -3c03d072 -34638b31 -01091020 -14430747 -00000000 -3c0807b5 -350808fc -3c09ba89 -3529d4b0 -3c03c23e -3463ddac -01091020 -1443073e -00000000 -3c08a704 -35083250 -3c0962cc -3529ff3c -3c0309d1 -3463318c -01091020 -14430735 -00000000 -3c085501 -3508212e -3c0988e7 -3529310c -3c03dde8 -3463523a -01091020 -1443072c -00000000 -3c086f85 -35085e10 -3c09d094 -352944cc -3c034019 -3463a2dc -01091020 -14430723 -00000000 -3c080717 -3508db60 -3c0901c9 -3529a7d2 -3c0308e1 -34638332 -01091020 -1443071a -00000000 -3c086142 -35081240 -3c09a75c -3529b880 -3c03089e -3463cac0 -01091020 -14430711 -00000000 -3c08b0c4 -350853e0 -3c09e8e2 -3529b0e0 -3c0399a7 -346304c0 -01091020 -14430708 -00000000 -3c082c8f -3508c895 -3c09c0d2 -352916c8 -3c03ed61 -3463df5d -01091020 -144306ff -00000000 -3c082c07 -3508a9b4 -3c090456 -352984e0 -3c03305e -34632e94 -01091020 -144306f6 -00000000 -3c08c378 -3508c630 -3c092d6f -3529f8c4 -3c03f0e8 -3463bef4 -01091020 -144306ed -00000000 -3c08654a -35086d00 -3c09f6d8 -3529fa3c -3c035c23 -3463673c -01091020 -144306e4 -00000000 -3c08d8d7 -3508dfb8 -3c093646 -3529eb40 -3c030f1e -3463caf8 -01091020 -144306db -00000000 -3c082e46 -350806cb -3c0907c2 -35292b08 -3c033608 -346331d3 -01091020 -144306d2 -00000000 -3c081025 -350810e0 -3c09b846 -35299a80 -3c03c86b -3463ab60 -01091020 -144306c9 -00000000 -3c08b466 -35081d44 -3c09dab6 -352944c0 -3c038f1c -34636204 -01091020 -144306c0 -00000000 -3c083bfc -350896b0 -3c099408 -35299300 -3c03d005 -346329b0 -01091020 -144306b7 -00000000 -3c08d257 -35088988 -3c095f0c -35291e7c -3c033163 -3463a804 -01091020 -144306ae -00000000 -3c081954 -35083980 -3c090649 -35290f30 -3c031f9d -346348b0 -01091020 -144306a5 -00000000 -3c08db0b -3508c840 -3c0976bc -3529a630 -3c0351c8 -34636e70 -01091020 -1443069c -00000000 -3c08125b -350885d8 -3c099916 -352956ff -3c03ab71 -3463dcd7 -01091020 -14430693 -00000000 -3c08ee74 -35089ed2 -3c09d0ae -35290328 -3c03bf22 -3463a1fa -01091020 -1443068a -00000000 -3c08f349 -3508bde8 -3c09c50f -352959a0 -3c03b859 -34631788 -01091020 -14430681 -00000000 -3c08638d -3508c380 -3c09a2bc -35297b50 -3c03064a -34633ed0 -01091020 -14430678 -00000000 -3c08d08c -35080ea7 -3c09289f -35292bee -3c03f92b -34633a95 -01091020 -1443066f -00000000 -3c08afa6 -3508f5dd -3c09230a -3529e844 -3c03d2b1 -3463de21 -01091020 -14430666 -00000000 -3c08659a -35086000 -3c09dac5 -3529fc2a -3c034060 -34635c2a -01091020 -1443065d -00000000 -3c08130e -35085c06 -3c099fc5 -352975b0 -3c03b2d3 -3463d1b6 -01091020 -14430654 -00000000 -3c082543 -3508a725 -3c091eea -3529f0c0 -3c03442e -346397e5 -01091020 -1443064b -00000000 -3c08a34d -3508f8e6 -3c0974b2 -35295fe3 -3c031800 -346358c9 -01091020 -14430642 -00000000 -3c08894c -3508b10e -3c0928dd -3529c3f0 -3c03b22a -346374fe -01091020 -14430639 -00000000 -3c08c1e6 -350853e8 -3c090548 -3529668c -3c03c72e -3463ba74 -01091020 -14430630 -00000000 -3c08f42e -3508089d -3c098c10 -3529cbf2 -3c03803e -3463d48f -01091020 -14430627 -00000000 -3c0887b2 -35088080 -3c0914c8 -3529d33a -3c039c7b -346353ba -01091020 -1443061e -00000000 -3c089445 -3508a5e8 -3c0959d8 -35291740 -3c03ee1d -3463bd28 -01091020 -14430615 -00000000 -3c08ece1 -350866c4 -3c090378 -352990b8 -3c03f059 -3463f77c -01091020 -1443060c -00000000 -3c086f5f -35088ad8 -3c09c428 -3529d407 -3c033388 -34635edf -01091020 -14430603 -00000000 -3c080fb0 -350840e4 -3c0943e9 -3529fdbe -3c03539a -34633ea2 -01091020 -144305fa -00000000 -3c0858b1 -35080ae6 -3c099b7c -352955a6 -3c03f42d -3463608c -01091020 -144305f1 -00000000 -3c086728 -35084f30 -3c09b43f -352965c8 -3c031b67 -3463b4f8 -01091020 -144305e8 -00000000 -3c0893e2 -35085fd6 -3c0948db -35299200 -3c03dcbd -3463f1d6 -01091020 -144305df -00000000 -3c08db38 -35081270 -3c091ee0 -35296388 -3c03fa18 -346375f8 -01091020 -144305d6 -00000000 -3c081172 -3508cacc -3c09c155 -3529ac94 -3c03d2c8 -34637760 -01091020 -144305cd -00000000 -3c0824eb -3508e196 -3c09abf5 -35298f5b -3c03d0e1 -346370f1 -01091020 -144305c4 -00000000 -3c088629 -35088c20 -3c094991 -3529917c -3c03cfbb -34631d9c -01091020 -144305bb -00000000 -3c08d043 -35089d20 -3c09210c -35294488 -3c03f14f -3463e1a8 -01091020 -144305b2 -00000000 -3c087807 -3508fdc4 -3c09fa71 -35291356 -3c037279 -3463111a -01091020 -144305a9 -00000000 -3c08cc9e -3508aa56 -3c0963b3 -352937f0 -3c033051 -3463e246 -01091020 -144305a0 -00000000 -3c08c023 -35084854 -3c091d03 -3529d95c -3c03dd27 -346321b0 -01091020 -14430597 -00000000 -3c089a02 -3508ad94 -3c0918cf -3529b1be -3c03b2d2 -34635f52 -01091020 -1443058e -00000000 -3c08b841 -3508ce28 -3c092143 -3529a6d8 -3c03d985 -34637500 -01091020 -14430585 -00000000 -3c08b3c4 -35082189 -3c0948ae -3529b8d8 -3c03fc72 -3463da61 -01091020 -1443057c -00000000 -3c08faff -3508bdc0 -3c094fe3 -35292000 -3c034ae2 -3463ddc0 -01091020 -14430573 -00000000 -3c08de7c -35081570 -3c09dda9 -35299466 -3c03bc25 -3463a9d6 -01091020 -1443056a -00000000 -3c083fe9 -350895bc -3c0927db -3529ab12 -3c0367c5 -346340ce -01091020 -14430561 -00000000 -3c08447b -35081c9e -3c09efd4 -352986b6 -3c03344f -3463a354 -01091020 -14430558 -00000000 -3c08b9f9 -3508b5b5 -3c0964dd -3529b854 -3c031ed7 -34636e09 -01091020 -1443054f -00000000 -3c084124 -35086f7e -3c09a659 -35294438 -3c03e77d -3463b3b6 -01091020 -14430546 -00000000 -3c08e5db -35089814 -3c09a5a7 -3529cbb0 -3c038b83 -346363c4 -01091020 -1443053d -00000000 -3c0899a7 -35087b00 -3c09e872 -35297460 -3c038219 -3463ef60 -01091020 -14430534 -00000000 -3c085def -35081400 -3c09fe18 -3529c6ce -3c035c07 -3463dace -01091020 -1443052b -00000000 -3c0837b6 -3508f4e8 -3c09aae1 -352966b1 -3c03e298 -34635b99 -01091020 -14430522 -00000000 -3c08dcff -3508e600 -3c092104 -352967fd -3c03fe04 -34634dfd -01091020 -14430519 -00000000 -3c086098 -350865a5 -3c09d566 -35290a0a -3c0335fe -34636faf -01091020 -14430510 -00000000 -3c0854a4 -35080d20 -3c099b39 -35292c22 -3c03efdd -34633942 -01091020 -14430507 -00000000 -3c081de7 -35085ded -3c0930b6 -35299371 -3c034e9d -3463f15e -01091020 -144304fe -00000000 -3c0827b2 -3508c3c0 -3c09c65a -3529c230 -3c03ee0d -346385f0 -01091020 -144304f5 -00000000 -3c081126 -35082f28 -3c09a538 -35296ec0 -3c03b65e -34639de8 -01091020 -144304ec -00000000 -3c08a7a4 -35081dd0 -3c093946 -3529369c -3c03e0ea -3463546c -01091020 -144304e3 -00000000 -3c08e6ef -35084d40 -3c09a259 -35299058 -3c038948 -3463dd98 -01091020 -144304da -00000000 -3c08429e -35081470 -3c09a72c -3529e8b2 -3c03e9ca -3463fd22 -01091020 -144304d1 -00000000 -3c082174 -350892f0 -3c09d3c7 -35291dec -3c03f53b -3463b0dc -01091020 -144304c8 -00000000 -3c080f94 -35083daa -3c09a5f7 -35299c5c -3c03b58b -3463da06 -01091020 -144304bf -00000000 -3c088f4f -3508d7a1 -3c0943eb -3529fee0 -3c03d33b -3463d681 -01091020 -144304b6 -00000000 -3c08956b -3508c990 -3c094fcb -3529533c -3c03e537 -34631ccc -01091020 -144304ad -00000000 -3c088144 -3508d10c -3c094a12 -35296abf -3c03cb57 -34633bcb -01091020 -144304a4 -00000000 -3c087b61 -350897d9 -3c0986c2 -3529e19c -3c030224 -34637975 -01091020 -1443049b -00000000 -3c085310 -3508cb33 -3c09ccc5 -35299f90 -3c031fd6 -34636ac3 -01091020 -14430492 -00000000 -3c085db2 -3508c780 -3c09b05b -35294fa0 -3c030e0e -34631720 -01091020 -14430489 -00000000 -3c08dcbf -3508ed68 -3c090aa8 -35295480 -3c03e768 -346341e8 -01091020 -14430480 -00000000 -3c08cfc4 -350859fc -3c097fdc -35292bd0 -3c034fa0 -346385cc -01091020 -14430477 -00000000 -3c0816da -35083978 -3c09fdc7 -3529d63c -3c0314a2 -34630fb4 -01091020 -1443046e -00000000 -3c083dc3 -3508b03c -3c0923b1 -3529d078 -3c036175 -346380b4 -01091020 -14430465 -00000000 -3c0800a9 -35083035 -3c096c55 -3529f880 -3c036cff -346328b5 -01091020 -1443045c -00000000 -3c08e573 -35083fd8 -3c09a6fa -35294164 -3c038c6d -3463813c -01091020 -14430453 -00000000 -3c0835a6 -3508ea20 -3c09b569 -35291b76 -3c03eb10 -34630596 -01091020 -1443044a -00000000 -3c087b9d -3508a3d6 -3c099ef1 -35295eb6 -3c031a8f -3463028c -01091020 -14430441 -00000000 -3c08e567 -35088dd8 -3c095240 -35299b00 -3c0337a8 -346328d8 -01091020 -14430438 -00000000 -3c080d3c -3508e538 -3c09527e -352941f2 -3c035fbb -3463272a -01091020 -1443042f -00000000 -3c083637 -350857cc -3c098a98 -3529cdd8 -3c03c0d0 -346325a4 -01091020 -14430426 -00000000 -3c08287c -3508f188 -3c09f91b -352974ae -3c032198 -34636636 -01091020 -1443041d -00000000 -3c0836a0 -35080a90 -3c09ec01 -35295018 -3c0322a1 -34635aa8 -01091020 -14430414 -00000000 -3c080956 -350893f9 -3c09624e -35293a55 -3c036ba4 -3463ce4e -01091020 -1443040b -00000000 -3c08debf -35086070 -3c09f718 -3529da20 -3c03d5d8 -34633a90 -01091020 -14430402 -00000000 -3c082ce2 -350898b8 -3c09da63 -35294914 -3c030745 -3463e1cc -01091020 -144303f9 -00000000 -3c0806b9 -3508ea50 -3c09d2b2 -3529d100 -3c03d96c -3463bb50 -01091020 -144303f0 -00000000 -3c08493f -3508bc87 -3c098f6d -35298850 -3c03d8ad -346344d7 -01091020 -144303e7 -00000000 -3c087336 -3508c9a6 -3c090c99 -3529b200 -3c037fd0 -34637ba6 -01091020 -144303de -00000000 -3c083d7e -3508fb3f -3c09fcd2 -35295f3a -3c033a51 -34635a79 -01091020 -144303d5 -00000000 -3c081bed -35082920 -3c0936a6 -35296558 -3c035293 -34638e78 -01091020 -144303cc -00000000 -3c080f3b -35081014 -3c09a200 -3529954f -3c03b13b -3463a563 -01091020 -144303c3 -00000000 -3c080d6e -35088886 -3c095b2e -3529074c -3c03689c -34638fd2 -01091020 -144303ba -00000000 -3c082deb -350813d0 -3c0926fe -3529ddc2 -3c0354e9 -3463f192 -01091020 -144303b1 -00000000 -3c08e576 -35084f49 -3c092000 -35290380 -3c030576 -346352c9 -01091020 -144303a8 -00000000 -3c089f35 -3508bb7c -3c097045 -3529536d -3c030f7b -34630ee9 -01091020 -1443039f -00000000 -3c08ca45 -350844c4 -3c0925e6 -3529b2fa -3c03f02b -3463f7be -01091020 -14430396 -00000000 -3c08e86d -3508ce88 -3c09eef5 -35291a30 -3c03d762 -3463e8b8 -01091020 -1443038d -00000000 -3c081a92 -3508a5a0 -3c09d1ea -3529c31b -3c03ec7d -346368bb -01091020 -14430384 -00000000 -3c08dec0 -3508f040 -3c0959bc -35293412 -3c03387d -34632452 -01091020 -1443037b -00000000 -3c08e4b6 -35082124 -3c096f17 -352972b8 -3c0353cd -346393dc -01091020 -14430372 -00000000 -3c088e76 -35088b29 -3c094edd -3529e040 -3c03dd54 -34636b69 -01091020 -14430369 -00000000 -3c08bae5 -3508f8ae -3c09690a -35291ae4 -3c0323f0 -34631392 -01091020 -14430360 -00000000 -3c083196 -35084010 -3c09ae2c -35297275 -3c03dfc2 -3463b285 -01091020 -14430357 -00000000 -3c08195c -3508f434 -3c098061 -3529cc2c -3c0399be -3463c060 -01091020 -1443034e -00000000 -3c08a6c1 -3508a140 -3c0933fa -35294568 -3c03dabb -3463e6a8 -01091020 -14430345 -00000000 -3c0808d7 -3508e000 -3c092b22 -35291251 -3c0333f9 -3463f251 -01091020 -1443033c -00000000 -3c08c48f -35081392 -3c092d9d -352931b9 -3c03f22c -3463454b -01091020 -14430333 -00000000 -3c08bccd -350854c8 -3c090a2c -35293b14 -3c03c6f9 -34638fdc -01091020 -1443032a -00000000 -3c0895f0 -3508c7b0 -24090000 -3c0395f0 -3463c7b0 -01091020 -14430322 -00000000 -3c08c417 -35083200 -24090000 -3c03c417 -34633200 -01091020 -1443031a -00000000 -3c08d930 -35086edd -24090000 -3c03d930 -34636edd -01091020 -14430312 -00000000 -3c08c9f8 -35088a42 -24090000 -3c03c9f8 -34638a42 -01091020 -1443030a -00000000 -3c081cf1 -350890aa -24090000 -3c031cf1 -346390aa -01091020 -14430302 -00000000 -3c080442 -35086fba -24090000 -3c030442 -34636fba -01091020 -144302fa -00000000 -3c085290 -3508f108 -24090000 -3c035290 -3463f108 -01091020 -144302f2 -00000000 -3c08a85a -3508d630 -24090000 -3c03a85a -3463d630 -01091020 -144302ea -00000000 -3c086bb9 -350827f0 -24090000 -3c036bb9 -346327f0 -01091020 -144302e2 -00000000 -3c088397 -350819a0 -24090000 -3c038397 -346319a0 -01091020 -144302da -00000000 -3c08c25d -3508ccc6 -24090000 -3c03c25d -3463ccc6 -01091020 -144302d2 -00000000 -3c08e6c7 -3508ae37 -24090000 -3c03e6c7 -3463ae37 -01091020 -144302ca -00000000 -3c08aca0 -35083790 -24090000 -3c03aca0 -34633790 -01091020 -144302c2 -00000000 -3c085930 -3508eb58 -24090000 -3c035930 -3463eb58 -01091020 -144302ba -00000000 -3c0801d8 -3508a468 -24090000 -3c0301d8 -3463a468 -01091020 -144302b2 -00000000 -3c08d451 -350809f4 -24090000 -3c03d451 -346309f4 -01091020 -144302aa -00000000 -3c082edf -3508beb6 -24090000 -3c032edf -3463beb6 -01091020 -144302a2 -00000000 -3c0861f5 -3508c300 -24090000 -3c0361f5 -3463c300 -01091020 -1443029a -00000000 -3c08cd1a -350893d0 -24090000 -3c03cd1a -346393d0 -01091020 -14430292 -00000000 -3c088750 -35087900 -24090000 -3c038750 -34637900 -01091020 -1443028a -00000000 -3c08d5f2 -3508358e -24090000 -3c03d5f2 -3463358e -01091020 -14430282 -00000000 -3c0866a2 -3508afa8 -24090000 -3c0366a2 -3463afa8 -01091020 -1443027a -00000000 -3c088b3c -35082c00 -24090000 -3c038b3c -34632c00 -01091020 -14430272 -00000000 -3c088d43 -35088a80 -24090000 -3c038d43 -34638a80 -01091020 -1443026a -00000000 -3c0871fb -35086f30 -24090000 -3c0371fb -34636f30 -01091020 -14430262 -00000000 -3c08f76b -3508e7b1 -24090000 -3c03f76b -3463e7b1 -01091020 -1443025a -00000000 -3c086b3a -35082a6e -24090000 -3c036b3a -34632a6e -01091020 -14430252 -00000000 -3c088ee4 -3508975a -24090000 -3c038ee4 -3463975a -01091020 -1443024a -00000000 -3c08f70b -3508c684 -24090000 -3c03f70b -3463c684 -01091020 -14430242 -00000000 -3c08d888 -350881f7 -24090000 -3c03d888 -346381f7 -01091020 -1443023a -00000000 -3c08abef -3508f090 -24090000 -3c03abef -3463f090 -01091020 -14430232 -00000000 -3c084ca3 -350887b5 -24090000 -3c034ca3 -346387b5 -01091020 -1443022a -00000000 -3c08fb35 -35085d54 -24090000 -3c03fb35 -34635d54 -01091020 -14430222 -00000000 -3c088f71 -35089220 -24090000 -3c038f71 -34639220 -01091020 -1443021a -00000000 -3c086310 -35081805 -24090000 -3c036310 -34631805 -01091020 -14430212 -00000000 -3c088f8a -35089c94 -24090000 -3c038f8a -34639c94 -01091020 -1443020a -00000000 -3c08c0f0 -3508e740 -24090000 -3c03c0f0 -3463e740 -01091020 -14430202 -00000000 -3c08e02a -350841e0 -24090000 -3c03e02a -346341e0 -01091020 -144301fa -00000000 -3c087b59 -35081a80 -24090000 -3c037b59 -34631a80 -01091020 -144301f2 -00000000 -3c08e56d -3508f940 -24090000 -3c03e56d -3463f940 -01091020 -144301ea -00000000 -3c087e0e -35081b60 -24090000 -3c037e0e -34631b60 -01091020 -144301e2 -00000000 -3c084d39 -3508ef10 -24090000 -3c034d39 -3463ef10 -01091020 -144301da -00000000 -3c0840ca -350880c8 -24090000 -3c0340ca -346380c8 -01091020 -144301d2 -00000000 -3c08dd07 -35080424 -24090000 -3c03dd07 -34630424 -01091020 -144301ca -00000000 -3c08d8f7 -35088190 -24090000 -3c03d8f7 -34638190 -01091020 -144301c2 -00000000 -3c08b891 -35084282 -24090000 -3c03b891 -34634282 -01091020 -144301ba -00000000 -3c0860d9 -3508761c -24090000 -3c0360d9 -3463761c -01091020 -144301b2 -00000000 -3c0816d7 -3508c65c -24090000 -3c0316d7 -3463c65c -01091020 -144301aa -00000000 -3c086b74 -35080588 -24090000 -3c036b74 -34630588 -01091020 -144301a2 -00000000 -3c0825e5 -3508fad8 -24090000 -3c0325e5 -3463fad8 -01091020 -1443019a -00000000 -24080000 -3c09dcaf -35295e62 -3c03dcaf -34635e62 -01091020 -14430192 -00000000 -24080000 -3c099cce -3529c250 -3c039cce -3463c250 -01091020 -1443018a -00000000 -24080000 -3c0927e3 -35298688 -3c0327e3 -34638688 -01091020 -14430182 -00000000 -24080000 -3c0927e8 -3529ccbe -3c0327e8 -3463ccbe -01091020 -1443017a -00000000 -24080000 -3c09c57d -3529bed0 -3c03c57d -3463bed0 -01091020 -14430172 -00000000 -24080000 -3c09fd86 -352988df -3c03fd86 -346388df -01091020 -1443016a -00000000 -24080000 -3c096571 -3529faf7 -3c036571 -3463faf7 -01091020 -14430162 -00000000 -24080000 -3c093318 -352984e0 -3c033318 -346384e0 -01091020 -1443015a -00000000 -24080000 -3c09cc69 -35297f17 -3c03cc69 -34637f17 -01091020 -14430152 -00000000 -24080000 -3c091d11 -35299540 -3c031d11 -34639540 -01091020 -1443014a -00000000 -24080000 -3c09f38b -35291eb4 -3c03f38b -34631eb4 -01091020 -14430142 -00000000 -24080000 -3c09b111 -35291f18 -3c03b111 -34631f18 -01091020 -1443013a -00000000 -24080000 -3c095af9 -3529ecd2 -3c035af9 -3463ecd2 -01091020 -14430132 -00000000 -24080000 -3c095c50 -35291b02 -3c035c50 -34631b02 -01091020 -1443012a -00000000 -24080000 -3c095f79 -35295d74 -3c035f79 -34635d74 -01091020 -14430122 -00000000 -24080000 -3c096798 -35297f80 -3c036798 -34637f80 -01091020 -1443011a -00000000 -24080000 -3c09fbe5 -35298fce -3c03fbe5 -34638fce -01091020 -14430112 -00000000 -24080000 -3c09371c -3529f200 -3c03371c -3463f200 -01091020 -1443010a -00000000 -24080000 -3c099a22 -3529a180 -3c039a22 -3463a180 -01091020 -14430102 -00000000 -24080000 -3c093517 -3529fe00 -3c033517 -3463fe00 -01091020 -144300fa -00000000 -24080000 -3c0902a0 -352979e0 -3c0302a0 -346379e0 -01091020 -144300f2 -00000000 -24080000 -3c09de7e -352972e0 -3c03de7e -346372e0 -01091020 -144300ea -00000000 -24080000 -3c09688c -35299aae -3c03688c -34639aae -01091020 -144300e2 -00000000 -24080000 -3c09927d -3529ba60 -3c03927d -3463ba60 -01091020 -144300da -00000000 -24080000 -3c094339 -352939c8 -3c034339 -346339c8 -01091020 -144300d2 -00000000 -24080000 -3c09a68c -35299b88 -3c03a68c -34639b88 -01091020 -144300ca -00000000 -24080000 -3c09fe36 -35295800 -3c03fe36 -34635800 -01091020 -144300c2 -00000000 -24080000 -3c09a258 -35299558 -3c03a258 -34639558 -01091020 -144300ba -00000000 -24080000 -3c09a280 -3529193c -3c03a280 -3463193c -01091020 -144300b2 -00000000 -24080000 -3c096ba8 -3529a1e0 -3c036ba8 -3463a1e0 -01091020 -144300aa -00000000 -24080000 -3c093a7d -35292c54 -3c033a7d -34632c54 -01091020 -144300a2 -00000000 -24080000 -3c093a76 -35290f50 -3c033a76 -34630f50 -01091020 -1443009a -00000000 -24080000 -3c09265c -35291a47 -3c03265c -34631a47 -01091020 -14430092 -00000000 -24080000 -3c092ab3 -35291958 -3c032ab3 -34631958 -01091020 -1443008a -00000000 -24080000 -3c09641e -35296088 -3c03641e -34636088 -01091020 -14430082 -00000000 -24080000 -3c09c5bc -3529dbdb -3c03c5bc -3463dbdb -01091020 -1443007a -00000000 -24080000 -3c09beed -352903d0 -3c03beed -346303d0 -01091020 -14430072 -00000000 -24080000 -3c092377 -3529b600 -3c032377 -3463b600 -01091020 -1443006a -00000000 -24080000 -3c09f99a -35293d40 -3c03f99a -34633d40 -01091020 -14430062 -00000000 -24080000 -3c09e005 -3529c4ac -3c03e005 -3463c4ac -01091020 -1443005a -00000000 -24080000 -3c09ea36 -3529e54f -3c03ea36 -3463e54f -01091020 -14430052 -00000000 -24080000 -3c092c7e -3529f160 -3c032c7e -3463f160 -01091020 -1443004a -00000000 -24080000 -3c099f35 -35294ce8 -3c039f35 -34634ce8 -01091020 -14430042 -00000000 -24080000 -3c09a5ea -35291069 -3c03a5ea -34631069 -01091020 -1443003a -00000000 -24080000 -3c09d1ee -35290242 -3c03d1ee -34630242 -01091020 -14430032 -00000000 -24080000 -3c091fc6 -35290cf8 -3c031fc6 -34630cf8 -01091020 -1443002a -00000000 -24080000 -3c090f1b -35294000 -3c030f1b -34634000 -01091020 -14430022 -00000000 -24080000 -3c09201c -3529dee8 -3c03201c -3463dee8 -01091020 -1443001a -00000000 -24080000 -3c0931c1 -35294954 -3c0331c1 -34634954 -01091020 -14430012 -00000000 -24080000 -3c096e70 -35291f70 -3c036e70 -34631f70 -01091020 -1443000a -00000000 -24080000 -24090000 -24030000 -01091020 -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -24120000 -24150001 -16b50006 -3c04800d -3c16800d -14960136 -00000000 -16a00003 -3c17800d -10000132 -00000000 -16f60130 -00000000 -24150001 -16b50006 -24858123 -24968123 -14b6012a -00000000 -16a00003 -24978123 -10000126 -00000000 -16f60124 -00000000 -24150001 -16b50006 -ac850120 -ac960120 -14b6011e -00000000 -16a00003 -ac970120 -1000011a -00000000 -16f60118 -00000000 -24150001 -16b50006 -8c860120 -8c960120 -14d60112 -00000000 -16a00003 -8c970120 -1000010e -00000000 -16f6010c -00000000 -24150001 -16b50006 -00a63821 -00a6b021 -14f60106 -00000000 -16a00003 -00a6b821 -10000102 -00000000 -16f60100 -00000000 -24150001 -16b50006 -02324825 -0232b025 -153600fa -00000000 -16a00003 -0232b825 -100000f6 -00000000 -16f600f4 -00000000 -24150001 -16b50006 -0253502a -0253b02a -155600ee -00000000 -16a00003 -0253b82a -100000ea -00000000 -16f600e8 -00000000 -24150001 -16b50006 -2a4b8011 -2a568011 -157600e2 -00000000 -16a00003 -2a578011 -100000de -00000000 -16f600dc -00000000 -24150001 -16b50006 -2e4f8011 -2e568011 -15f600d6 -00000000 -16a00003 -2e578011 -100000d2 -00000000 -16f600d0 -00000000 -24150001 -16b50006 -0253c02b -0253b02b -171600ca -00000000 -16a00003 -0253b82b -100000c6 -00000000 -16f600c4 -00000000 -24150001 -16b50006 -00124c40 -0012b440 -153600be -00000000 -16a00003 -0012bc40 -100000ba -00000000 -16f600b8 -00000000 -24150001 -16b50006 -01105020 -0110b020 -155600b2 -00000000 -16a00003 -0110b820 -100000ae -00000000 -16f600ac -00000000 -24150001 -16b50006 -220b8002 -22168002 -157600a6 -00000000 -16a00003 -22178002 -100000a2 -00000000 -16f600a0 -00000000 -24150001 -16b50006 -01106022 -0110b022 -1596009a -00000000 -16a00003 -0110b822 -10000096 -00000000 -16f60094 -00000000 -24150001 -16b50006 -01106823 -0110b023 -15b6008e -00000000 -16a00003 -0110b823 -1000008a -00000000 -16f60088 -00000000 -24150001 -16b50006 -01107024 -0110b024 -15d60082 -00000000 -16a00003 -0110b824 -1000007e -00000000 -16f6007c -00000000 -24150001 -16b50006 -320f8ff2 -32168ff2 -15f60076 -00000000 -16a00003 -32178ff2 -10000072 -00000000 -16f60070 -00000000 -24150001 -16b50006 -0110c027 -0110b027 -1716006a -00000000 -16a00003 -0110b827 -10000066 -00000000 -16f60064 -00000000 -24150001 -16b50006 -36098ff2 -36168ff2 -1536005e -00000000 -16a00003 -36178ff2 -1000005a -00000000 -16f60058 -00000000 -24150001 -16b50006 -01105026 -0110b026 -15560052 -00000000 -16a00003 -0110b826 -1000004e -00000000 -16f6004c -00000000 -24150001 -16b50006 -3a0b8ff2 -3a168ff2 -15760046 -00000000 -16a00003 -3a178ff2 -10000042 -00000000 -16f60040 -00000000 -24150001 -16b50006 -02086004 -0208b004 -1596003a -00000000 -16a00003 -0208b804 -10000036 -00000000 -16f60034 -00000000 -24150001 -16b50006 -00106a03 -0010b203 -15b6002e -00000000 -16a00003 -0010ba03 -1000002a -00000000 -16f60028 -00000000 -24150001 -16b50006 -02087007 -0208b007 -15d60022 -00000000 -16a00003 -0208b807 -1000001e -00000000 -16f6001c -00000000 -24150001 -16b50006 -00107a02 -0010b202 -15f60016 -00000000 -16a00003 -0010ba02 -10000012 -00000000 -16f60010 -00000000 -24150001 -16b50006 -0208c006 -0208b006 -1716000a -00000000 -16a00003 -0208b806 -10000006 -00000000 -16f60004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -26100001 -24120000 -3c0899c9 -3508a500 -3c096c1a -35291b60 -01090019 -0000a812 -0000b010 -3c02b204 -3442e000 -3c0340f0 -3463c088 -14550826 -00000000 -14760824 -00000000 -3c08ee02 -35086dc0 -3c09d85e -35290aec -01090019 -0000a812 -0000b010 -3c02cf06 -3442ad00 -3c03c929 -34637ba5 -14550817 -00000000 -14760815 -00000000 -3c08a49b -350833d4 -3c09894d -35296a78 -01090019 -0000a812 -0000b010 -3c0276fa -34421360 -3c035848 -3463d5e0 -14550808 -00000000 -14760806 -00000000 -3c08d16d -35080152 -3c09bcd4 -3529f694 -01090019 -0000a812 -0000b010 -3c022231 -34428f68 -3c039a7a -346344f5 -145507f9 -00000000 -147607f7 -00000000 -3c089880 -3508cf50 -3c09d7e3 -35293d18 -01090019 -0000a812 -0000b010 -3c020169 -34427f80 -3c03809b -34638cb9 -145507ea -00000000 -147607e8 -00000000 -3c08686d -3508ecfc -3c092bb0 -35299c9f -01090019 -0000a812 -0000b010 -3c0219ef -3442c084 -3c0311d2 -34638245 -145507db -00000000 -147607d9 -00000000 -3c08290c -3508a739 -3c09c1cc -35294ec0 -01090019 -0000a812 -0000b010 -3c02dedc -3442c8c0 -3c031f13 -34634cc7 -145507cc -00000000 -147607ca -00000000 -3c081d1e -3508b998 -3c09d5b8 -3529328e -01090019 -0000a812 -0000b010 -3c02048a -3442a250 -3c03184f -34638441 -145507bd -00000000 -147607bb -00000000 -3c0879b7 -3508d394 -3c090ba9 -35299ece -01090019 -0000a812 -0000b010 -3c026f35 -34429918 -3c03058b -34638bf3 -145507ae -00000000 -147607ac -00000000 -3c080d7f -35089488 -3c093647 -3529ab9c -01090019 -0000a812 -0000b010 -3c0253ad -34425ae0 -3c0302dc -3463b0c3 -1455079f -00000000 -1476079d -00000000 -3c083196 -3508de58 -3c094c28 -3529d54e -01090019 -0000a812 -0000b010 -3c0280b6 -3442f6d0 -3c030ec0 -3463b2e6 -14550790 -00000000 -1476078e -00000000 -3c08473a -35080e0a -3c09e092 -35295338 -01090019 -0000a812 -0000b010 -3c0228f4 -34425030 -3c033e7b -3463828c -14550781 -00000000 -1476077f -00000000 -3c083721 -3508c560 -3c09e7f3 -35295d08 -01090019 -0000a812 -0000b010 -3c02f7e2 -34420b00 -3c0331f3 -3463e230 -14550772 -00000000 -14760770 -00000000 -3c08536c -3508d050 -3c09675d -3529c658 -01090019 -0000a812 -0000b010 -3c02b395 -34427b80 -3c0321af -346356fa -14550763 -00000000 -14760761 -00000000 -3c082310 -3508a2f4 -3c0907cd -35298030 -01090019 -0000a812 -0000b010 -3c020dfc -34428dc0 -3c030111 -34639a56 -14550754 -00000000 -14760752 -00000000 -3c08c2fd -35085307 -3c09034a -35293375 -01090019 -0000a812 -0000b010 -3c02aa57 -34425733 -3c030281 -34637c64 -14550745 -00000000 -14760743 -00000000 -3c0879fb -3508a360 -3c09cc30 -35298ea8 -01090019 -0000a812 -0000b010 -3c02c3c2 -34427700 -3c03614b -3463a958 -14550736 -00000000 -14760734 -00000000 -3c083f1c -35087b7a -3c0989f4 -3529a9ff -01090019 -0000a812 -0000b010 -3c02a52a -34428886 -3c032202 -34638f22 -14550727 -00000000 -14760725 -00000000 -3c086451 -3508cbd8 -3c0985dc -35292080 -01090019 -0000a812 -0000b010 -3c02c800 -3442ec00 -3c033474 -3463c1ee -14550718 -00000000 -14760716 -00000000 -3c088885 -3508fb40 -3c0965a9 -3529fc18 -01090019 -0000a812 -0000b010 -3c02cd22 -34428e00 -3c033637 -34638303 -14550709 -00000000 -14760707 -00000000 -3c0871f5 -3508e890 -3c091c7f -3529ba40 -01090019 -0000a812 -0000b010 -3c0247e2 -3442c400 -3c030caf -3463c157 -145506fa -00000000 -147606f8 -00000000 -3c08527b -350808db -3c09c4c2 -3529d838 -01090019 -0000a812 -0000b010 -3c023c58 -3442b7e8 -3c033f64 -3463f9ae -145506eb -00000000 -147606e9 -00000000 -3c08d2d0 -35080316 -3c095ce4 -35298028 -01090019 -0000a812 -0000b010 -3c0299a3 -34427b70 -3c034c7e -3463ebe7 -145506dc -00000000 -147606da -00000000 -3c08a47b -3508a800 -3c0983d0 -35296930 -01090019 -0000a812 -0000b010 -3c020f17 -34428000 -3c0354b1 -34632f06 -145506cd -00000000 -147606cb -00000000 -3c08cb3e -3508ee22 -3c0959a7 -3529fa20 -01090019 -0000a812 -0000b010 -3c020698 -3442f840 -3c03472e -34633d6c -145506be -00000000 -147606bc -00000000 -3c084092 -3508ce98 -3c09ef2c -3529bae3 -01090019 -0000a812 -0000b010 -3c025667 -3442a0c8 -3c033c54 -3463573f -145506af -00000000 -147606ad -00000000 -3c0876a3 -3508d520 -3c090219 -3529a7f1 -01090019 -0000a812 -0000b010 -3c02a063 -34428320 -3c0300f9 -34632b7e -145506a0 -00000000 -1476069e -00000000 -3c084dba -350887a0 -3c09abfd -352953c0 -01090019 -0000a812 -0000b010 -3c02aefe -34429800 -3c033438 -3463835d -14550691 -00000000 -1476068f -00000000 -3c08b21d -3508db80 -3c0986c4 -3529337c -01090019 -0000a812 -0000b010 -3c024730 -3442d200 -3c035dc4 -34632393 -14550682 -00000000 -14760680 -00000000 -3c0824bf -350843c2 -3c095ebb -3529156c -01090019 -0000a812 -0000b010 -3c02ebf5 -34427fd8 -3c030d99 -346315aa -14550673 -00000000 -14760671 -00000000 -3c088893 -35083830 -3c099b18 -3529625e -01090019 -0000a812 -0000b010 -3c02d611 -344201a0 -3c0352be -3463254c -14550664 -00000000 -14760662 -00000000 -3c083bd6 -3508f96c -3c091c41 -35293041 -01090019 -0000a812 -0000b010 -3c02a4c5 -3442946c -3c03069a -3463c024 -14550655 -00000000 -14760653 -00000000 -3c080b09 -35083c0a -3c09f967 -3529e2ce -01090019 -0000a812 -0000b010 -3c02ea75 -3442240c -3c030ac0 -346375e3 -14550646 -00000000 -14760644 -00000000 -3c08f0e4 -35086398 -3c0995db -3529f923 -01090019 -0000a812 -0000b010 -3c02bf20 -344275c8 -3c038d03 -3463ebc7 -14550637 -00000000 -14760635 -00000000 -3c08109f -35080e5c -3c09c6bd -35294b78 -01090019 -0000a812 -0000b010 -3c0225af -3442af20 -3c030ce7 -34634f6f -14550628 -00000000 -14760626 -00000000 -3c0823a1 -3508f870 -3c0988a8 -35290670 -01090019 -0000a812 -0000b010 -3c02ec2f -34425100 -3c031305 -34636f2b -14550619 -00000000 -14760617 -00000000 -3c08383b -3508f8e0 -3c0978e1 -35291c9e -01090019 -0000a812 -0000b010 -3c02011c -34421a40 -3c031a8d -34638fa8 -1455060a -00000000 -14760608 -00000000 -3c087a24 -35089e47 -3c09de35 -3529e25c -01090019 -0000a812 -0000b010 -3c028f96 -34428f84 -3c036a05 -346376d6 -145505fb -00000000 -147605f9 -00000000 -3c089bbd -35081a87 -3c0987bc -3529ed28 -01090019 -0000a812 -0000b010 -3c02133f -34422018 -3c035293 -3463a823 -145505ec -00000000 -147605ea -00000000 -3c0858b0 -3508b4c2 -3c094b2e -3529af04 -01090019 -0000a812 -0000b010 -3c027f2f -34427108 -3c031a0b -3463f157 -145505dd -00000000 -147605db -00000000 -3c08abb5 -3508baa8 -3c09e59a -35290d6c -01090019 -0000a812 -0000b010 -3c023c35 -344246e0 -3c039a00 -3463e44b -145505ce -00000000 -147605cc -00000000 -3c08ef33 -35081cb8 -3c09b5a9 -35298f8c -01090019 -0000a812 -0000b010 -3c026a76 -34427ca0 -3c03a9bd -3463922c -145505bf -00000000 -147605bd -00000000 -3c08fbd2 -35081f10 -3c09e381 -3529c1fc -01090019 -0000a812 -0000b010 -3c022351 -3442a3c0 -3c03dfca -3463f53e -145505b0 -00000000 -147605ae -00000000 -3c080e43 -35087d14 -3c09f764 -352994cd -01090019 -0000a812 -0000b010 -3c02982a -3442b904 -3c030dc8 -3463b855 -145505a1 -00000000 -1476059f -00000000 -3c0836f9 -35087280 -3c09d2dc -352944ac -01090019 -0000a812 -0000b010 -3c029802 -3442ee00 -3c032d47 -3463ed0a -14550592 -00000000 -14760590 -00000000 -3c08c019 -35086848 -3c0923e6 -352972e2 -01090019 -0000a812 -0000b010 -3c026f8e -34421f90 -3c031af0 -3463664a -14550583 -00000000 -14760581 -00000000 -3c08ad0a -3508f755 -3c0946ab -35298a3c -01090019 -0000a812 -0000b010 -3c02ebac -3442c9ec -3c032fc4 -3463f364 -14550574 -00000000 -14760572 -00000000 -3c0878c4 -350838e8 -3c09b592 -352996e0 -01090019 -0000a812 -0000b010 -3c022159 -3442bb00 -3c0355a7 -3463e351 -14550565 -00000000 -14760563 -00000000 -3c089541 -35087ec8 -3c09cdef -352910ec -01090019 -0000a812 -0000b010 -3c023505 -34426060 -3c037810 -3463d489 -14550556 -00000000 -14760554 -00000000 -3c08abd4 -35082ba4 -3c099f4d -3529fd40 -01090019 -0000a812 -0000b010 -3c02a07f -3442fd00 -3c036aed -34631fe7 -14550547 -00000000 -14760545 -00000000 -3c089c76 -35087890 -3c0913f1 -35290784 -01090019 -0000a812 -0000b010 -3c0219f2 -34421a40 -3c030c30 -34631b12 -14550538 -00000000 -14760536 -00000000 -3c083371 -350874a4 -3c0953b2 -3529a442 -01090019 -0000a812 -0000b010 -3c023801 -34422248 -3c0310d1 -3463aeb6 -14550529 -00000000 -14760527 -00000000 -3c088bbc -35084c00 -3c094f9e -3529d450 -01090019 -0000a812 -0000b010 -3c0281c7 -3442c000 -3c032b75 -3463cd8e -1455051a -00000000 -14760518 -00000000 -3c0898e3 -35089c2e -3c09db32 -3529e0b0 -01090019 -0000a812 -0000b010 -3c02201f -34429fa0 -3c0382e9 -34631940 -1455050b -00000000 -14760509 -00000000 -3c086b08 -3508ed68 -3c091ec9 -35293800 -01090019 -0000a812 -0000b010 -3c028a96 -3442c000 -3c030cdf -34632d3e -145504fc -00000000 -147604fa -00000000 -3c08deda -3508acc4 -3c096522 -352903d0 -01090019 -0000a812 -0000b010 -3c02e7ba -3442ab40 -3c035809 -3463e285 -145504ed -00000000 -147604eb -00000000 -3c08a715 -35081a96 -3c094efa -3529b6b6 -01090019 -0000a812 -0000b010 -3c027463 -34428aa4 -3c03338c -34630ff5 -145504de -00000000 -147604dc -00000000 -3c08b11d -3508f5a0 -3c097312 -3529ec50 -01090019 -0000a812 -0000b010 -3c021d0c -34424200 -3c034f9d -34638cf1 -145504cf -00000000 -147604cd -00000000 -3c08800e -35084cb0 -3c0939de -35296540 -01090019 -0000a812 -0000b010 -3c025874 -34429c00 -3c031cf2 -34636e1f -145504c0 -00000000 -147604be -00000000 -3c086ba0 -35081e66 -3c096141 -3529f7c8 -01090019 -0000a812 -0000b010 -3c02f052 -344229b0 -3c0328e3 -34636757 -145504b1 -00000000 -147604af -00000000 -3c0805c0 -35081d30 -3c0951b5 -3529330e -01090019 -0000a812 -0000b010 -3c026942 -344228a0 -3c0301d5 -3463db36 -145504a2 -00000000 -147604a0 -00000000 -3c087b68 -35085660 -3c095571 -352952ba -01090019 -0000a812 -0000b010 -3c0215d9 -344281c0 -3c032930 -3463459d -14550493 -00000000 -14760491 -00000000 -3c084396 -3508b2d6 -3c097d40 -3529f2c4 -01090019 -0000a812 -0000b010 -3c0267ef -344237d8 -3c032111 -3463bb17 -14550484 -00000000 -14760482 -00000000 -3c08a33d -350854b2 -3c091ff7 -3529f310 -01090019 -0000a812 -0000b010 -3c02b0f8 -34424120 -3c031462 -3463886b -14550475 -00000000 -14760473 -00000000 -3c08827d -35084976 -3c0946c7 -3529d260 -01090019 -0000a812 -0000b010 -3c0213f8 -34425840 -3c032414 -34631cb6 -14550466 -00000000 -14760464 -00000000 -3c08b2c4 -35086680 -3c092106 -3529dc9b -01090019 -0000a812 -0000b010 -3c02ec00 -34420f80 -3c031710 -34631bdd -14550457 -00000000 -14760455 -00000000 -3c0861e8 -3508744c -3c09f048 -35295710 -01090019 -0000a812 -0000b010 -3c02136d -344218c0 -3c035be5 -346397b4 -14550448 -00000000 -14760446 -00000000 -3c085105 -350823c0 -3c09c4ee -3529f4ec -01090019 -0000a812 -0000b010 -3c02d34f -3442f500 -3c033e53 -34638fa9 -14550439 -00000000 -14760437 -00000000 -3c086cab -35085300 -3c0924d4 -35297fd0 -01090019 -0000a812 -0000b010 -3c020560 -34427000 -3c030fa2 -34634bce -1455042a -00000000 -14760428 -00000000 -3c08113f -350838b0 -3c09960f -35290fb8 -01090019 -0000a812 -0000b010 -3c028c13 -34420e80 -3c030a1c -34630efa -1455041b -00000000 -14760419 -00000000 -3c08a4cd -3508966c -3c098946 -3529015e -01090019 -0000a812 -0000b010 -3c023e9b -3442a7a8 -3c03585f -34631698 -1455040c -00000000 -1476040a -00000000 -3c08997a -3508b490 -3c098318 -3529fc14 -01090019 -0000a812 -0000b010 -3c0264d3 -3442db40 -3c034e98 -3463c507 -145503fd -00000000 -147603fb -00000000 -3c083bf0 -35084cfc -3c094303 -3529bb23 -01090019 -0000a812 -0000b010 -3c02950a -34429a74 -3c030fb0 -3463c3c7 -145503ee -00000000 -147603ec -00000000 -3c08f58f -35085fa3 -3c096095 -3529f500 -01090019 -0000a812 -0000b010 -3c020065 -3442ff00 -3c035ca5 -34639b52 -145503df -00000000 -147603dd -00000000 -3c08abaa -35084e80 -3c09370e -3529a7f2 -01090019 -0000a812 -0000b010 -3c022b33 -3442b500 -3c0324eb -34636acc -145503d0 -00000000 -147603ce -00000000 -3c083a8c -3508ff75 -3c09c7c8 -35299600 -01090019 -0000a812 -0000b010 -3c022416 -34428e00 -3c032db1 -34637b0a -145503c1 -00000000 -147603bf -00000000 -3c086952 -3508957c -3c099f95 -3529ba00 -01090019 -0000a812 -0000b010 -3c0205c8 -34421800 -3c0341a7 -3463e46f -145503b2 -00000000 -147603b0 -00000000 -3c08f003 -3508fcc0 -3c096bf9 -3529ab92 -01090019 -0000a812 -0000b010 -3c02a2da -34426580 -3c03653b -3463bf60 -145503a3 -00000000 -147603a1 -00000000 -3c08948d -3508f508 -3c099aa8 -35294872 -01090019 -0000a812 -0000b010 -3c02b161 -34425d90 -3c0359bf -34630c99 -14550394 -00000000 -14760392 -00000000 -3c08e14a -3508a0c0 -3c09f0d1 -35296230 -01090019 -0000a812 -0000b010 -3c020c47 -3442a400 -3c03d3ee -34633b0a -14550385 -00000000 -14760383 -00000000 -3c08b1d8 -3508a680 -3c0999f2 -3529fdf0 -01090019 -0000a812 -0000b010 -3c02bca8 -34429800 -3c036af3 -34634ab9 -14550376 -00000000 -14760374 -00000000 -3c0806d5 -35083ad0 -3c096289 -3529382a -01090019 -0000a812 -0000b010 -3c02dd29 -34422620 -3c0302a1 -34634a1f -14550367 -00000000 -14760365 -00000000 -3c08b406 -3508d184 -3c09ce15 -3529399c -01090019 -0000a812 -0000b010 -3c02a0a2 -34421070 -3c0390ec -346369aa -14550358 -00000000 -14760356 -00000000 -3c08ff4c -35086260 -3c09f71b -35292a00 -01090019 -0000a812 -0000b010 -3c028843 -3442c000 -3c03f66d -3463c9db -14550349 -00000000 -14760347 -00000000 -3c0802f1 -35083cac -3c09ea42 -3529d2c0 -01090019 -0000a812 -0000b010 -3c02f50a -34429900 -3c0302b1 -34634612 -1455033a -00000000 -14760338 -00000000 -3c087fb8 -35089370 -3c096495 -3529a978 -01090019 -0000a812 -0000b010 -3c02480a -34420c80 -3c03322e -3463c492 -1455032b -00000000 -14760329 -00000000 -3c08db04 -35084c80 -3c095bb4 -352948cc -01090019 -0000a812 -0000b010 -3c0206f0 -3442f600 -3c034e74 -3463c47f -1455031c -00000000 -1476031a -00000000 -3c08a90d -3508ec6c -3c09f03c -3529d014 -01090019 -0000a812 -0000b010 -3c022e7e -34423870 -3c039ea5 -34633651 -1455030d -00000000 -1476030b -00000000 -3c0872b3 -3508e604 -3c093ccf -3529167e -01090019 -0000a812 -0000b010 -3c02d78b -34428df8 -3c031b3e -3463f373 -145502fe -00000000 -147602fc -00000000 -3c08f181 -3508714c -3c09e030 -35294af4 -01090019 -0000a812 -0000b010 -3c02585f -3442f470 -3c03d37e -3463d21d -145502ef -00000000 -147602ed -00000000 -3c087a1b -3508ddc0 -3c095b74 -3529305c -01090019 -0000a812 -0000b010 -3c02d697 -3442b100 -3c032b9f -34635384 -145502e0 -00000000 -147602de -00000000 -3c085390 -35081b70 -3c09582d -35296690 -01090019 -0000a812 -0000b010 -3c02beae -34420f00 -3c031cc8 -34635b3d -145502d1 -00000000 -147602cf -00000000 -3c081abf -3508afc4 -3c094c4d -35295a00 -01090019 -0000a812 -0000b010 -3c0271be -3442e800 -3c0307f8 -3463fd3d -145502c2 -00000000 -147602c0 -00000000 -3c08c401 -3508c3d9 -3c096442 -352983da -01090019 -0000a812 -0000b010 -3c0212aa -3442d1ca -3c034cc3 -34639de9 -145502b3 -00000000 -147602b1 -00000000 -3c08c3d9 -35082a7c -3c0910f8 -3529e302 -01090019 -0000a812 -0000b010 -3c02007e -344248f8 -3c030cfb -3463fab4 -145502a4 -00000000 -147602a2 -00000000 -3c085847 -35084c02 -3c099f69 -352992fe -01090019 -0000a812 -0000b010 -3c02aae8 -34428dfc -3c0336f8 -3463b023 -14550295 -00000000 -14760293 -00000000 -3c08bb0f -35086845 -3c091647 -352974b0 -01090019 -0000a812 -0000b010 -3c026ef9 -3442f370 -3c031047 -3463897f -14550286 -00000000 -14760284 -00000000 -3c083a05 -350847ba -3c0997b4 -3529583e -01090019 -0000a812 -0000b010 -3c0202b7 -34424f0c -3c032261 -3463fd05 -14550277 -00000000 -14760275 -00000000 -3c08c418 -3508111b -3c09f491 -352930d0 -01090019 -0000a812 -0000b010 -3c02430d -3442f5f0 -3c03bb56 -34632753 -14550268 -00000000 -14760266 -00000000 -3c08696f -3508dee5 -3c097160 -352928d0 -01090019 -0000a812 -0000b010 -3c02d098 -3442e210 -3c032eb1 -3463fc25 -14550259 -00000000 -14760257 -00000000 -3c086b09 -3508a660 -3c09e6f1 -35297192 -01090019 -0000a812 -0000b010 -3c022e51 -344242c0 -3c03608f -34639f0c -1455024a -00000000 -14760248 -00000000 -3c08e52e -350858ea -3c09c1a2 -35291800 -01090019 -0000a812 -0000b010 -3c020669 -3442f000 -3c03ad59 -34630dd9 -1455023b -00000000 -14760239 -00000000 -3c081060 -3508c3f6 -3c090eed -3529e718 -01090019 -0000a812 -0000b010 -3c02b8a3 -34425910 -3c0300f4 -34638315 -1455022c -00000000 -1476022a -00000000 -3c08df06 -35081f84 -3c09d9f5 -35291b0d -01090019 -0000a812 -0000b010 -3c0205f6 -344285b4 -3c03bde1 -3463b924 -1455021d -00000000 -1476021b -00000000 -3c082ef3 -350801f4 -3c095f1a -35298bd0 -01090019 -0000a812 -0000b010 -3c02d649 -34421240 -3c031171 -34630c0b -1455020e -00000000 -1476020c -00000000 -3c0846c2 -35084000 -3c097381 -35298980 -01090019 -0000a812 -0000b010 -3c029560 -3c031fed -346310a3 -14550200 -00000000 -147601fe -00000000 -3c08257e -350827d0 -3c091dce -3529bf84 -01090019 -0000a812 -0000b010 -3c020e20 -3442b740 -3c03045d -34639213 -145501f1 -00000000 -147601ef -00000000 -3c08a942 -350802b9 -3c0978c5 -35294868 -01090019 -0000a812 -0000b010 -3c0223f2 -34422328 -3c034fd9 -346360f2 -145501e2 -00000000 -147601e0 -00000000 -3c082981 -3508ba00 -3c09fa88 -3529781d -01090019 -0000a812 -0000b010 -3c0252e2 -34421200 -3c03289e -3463d008 -145501d3 -00000000 -147601d1 -00000000 -3c083ee6 -35084b08 -3c095534 -3529a83a -01090019 -0000a812 -0000b010 -3c02470a -34423fd0 -3c0314ef -34636706 -145501c4 -00000000 -147601c2 -00000000 -3c089178 -3508bce0 -3c096bd3 -35297980 -01090019 -0000a812 -0000b010 -3c021a44 -34425000 -3c033d45 -3463a280 -145501b5 -00000000 -147601b3 -00000000 -3c080bcf -3508bae8 -3c09e12a -3529fb00 -01090019 -0000a812 -0000b010 -3c023e51 -34427800 -3c030a63 -34638eef -145501a6 -00000000 -147601a4 -00000000 -3c08eea8 -35080fda -3c0999dd -35296bd0 -01090019 -0000a812 -0000b010 -3c02205e -3442ff20 -3c038f70 -3463dd11 -14550197 -00000000 -14760195 -00000000 -3c08cd7c -3508cc40 -3c0979ff -3529ffca -01090019 -0000a812 -0000b010 -3c0227ac -3442ea80 -3c0361ed -3463792b -14550188 -00000000 -14760186 -00000000 -3c08f0d9 -3508a3fc -3c09bd1d -3529a000 -01090019 -0000a812 -0000b010 -3c02a609 -34428000 -3c03b1ec -34638d40 -14550179 -00000000 -14760177 -00000000 -3c08575f -35083e98 -3c097166 -35299498 -01090019 -0000a812 -0000b010 -3c02f94d -34420a40 -3c0326b4 -34630d4a -1455016a -00000000 -14760168 -00000000 -3c081cc3 -35088b14 -3c095973 -3529913a -01090019 -0000a812 -0000b010 -3c02b40f -3442d688 -3c030a0c -3463f782 -1455015b -00000000 -14760159 -00000000 -3c0889c6 -3508f81f -3c09a280 -35292db0 -01090019 -0000a812 -0000b010 -3c025fe8 -34420850 -3c035774 -3463e516 -1455014c -00000000 -1476014a -00000000 -3c08455a -35083838 -3c09847a -3529d600 -01090019 -0000a812 -0000b010 -3c0215ae -3442d000 -3c0323e3 -3463cbf5 -1455013d -00000000 -1476013b -00000000 -3c083dfb -350893e4 -3c094f10 -35299ba8 -01090019 -0000a812 -0000b010 -3c0299e4 -344219a0 -3c031324 -3463a80c -1455012e -00000000 -1476012c -00000000 -3c087a51 -3508a910 -3c092038 -3529e3d6 -01090019 -0000a812 -0000b010 -3c02a4ac -34428360 -3c030f65 -346363db -1455011f -00000000 -1476011d -00000000 -3c08a004 -35082132 -3c0978d9 -3529f754 -01090019 -0000a812 -0000b010 -3c0210c4 -34422268 -3c034b8a -34632da8 -14550110 -00000000 -1476010e -00000000 -3c08194f -35087a4e -3c09c9fa -3529d040 -01090019 -0000a812 -0000b010 -3c029569 -3442f380 -3c0313f8 -3463333b -14550101 -00000000 -147600ff -00000000 -3c0828e5 -35085f80 -3c09a3d2 -3529a69c -01090019 -0000a812 -0000b010 -3c027eb3 -34423200 -3c031a2b -3463b294 -145500f2 -00000000 -147600f0 -00000000 -3c08bcc4 -3508d7a8 -3c09923c -35297e90 -01090019 -0000a812 -0000b010 -3c026c3d -3442fe80 -3c036bd4 -3463de73 -145500e3 -00000000 -147600e1 -00000000 -3c089f32 -3508e060 -3c093178 -3529e100 -01090019 -0000a812 -0000b010 -3c024434 -34426000 -3c031ec3 -3463e8b7 -145500d4 -00000000 -147600d2 -00000000 -3c08e9b8 -35087330 -3c09372b -35294f78 -01090019 -0000a812 -0000b010 -3c022311 -3442ce80 -3c03325e -34632b48 -145500c5 -00000000 -147600c3 -00000000 -3c081048 -35083e78 -3c09efa7 -35290d6a -01090019 -0000a812 -0000b010 -3c02315d -3442f5b0 -3c030f3e -3463124d -145500b6 -00000000 -147600b4 -00000000 -3c086285 -3508d9a4 -3c094823 -35298818 -01090019 -0000a812 -0000b010 -3c023997 -34428760 -3c031bc3 -346351e3 -145500a7 -00000000 -147600a5 -00000000 -3c088ee8 -35083024 -3c092a47 -3529e0d0 -01090019 -0000a812 -0000b010 -3c0288c2 -34429d40 -3c03179a -346337ca -14550098 -00000000 -14760096 -00000000 -3c084f1e -3508b000 -3c0922e9 -3529e3b4 -01090019 -0000a812 -0000b010 -3c0207a3 -3442c000 -3c030aca -34635cae -14550089 -00000000 -14760087 -00000000 -3c0857ae -3508a34c -24090000 -01090019 -0000a812 -0000b010 -24020000 -24030000 -1455007d -00000000 -1476007b -00000000 -3c0804db -3508dd80 -24090000 -01090019 -0000a812 -0000b010 -24020000 -24030000 -14550071 -00000000 -1476006f -00000000 -3c0879d5 -3508a6b7 -24090000 -01090019 -0000a812 -0000b010 -24020000 -24030000 -14550065 -00000000 -14760063 -00000000 -3c089ad9 -35080f8c -24090000 -01090019 -0000a812 -0000b010 -24020000 -24030000 -14550059 -00000000 -14760057 -00000000 -3c088237 -3508f918 -24090000 -01090019 -0000a812 -0000b010 -24020000 -24030000 -1455004d -00000000 -1476004b -00000000 -3c08c5ec -3508adb0 -24090000 -01090019 -0000a812 -0000b010 -24020000 -24030000 -14550041 -00000000 -1476003f -00000000 -24080000 -3c09cec8 -3529f500 -01090019 -0000a812 -0000b010 -24020000 -24030000 -14550035 -00000000 -14760033 -00000000 -24080000 -3c090fed -3529823c -01090019 -0000a812 -0000b010 -24020000 -24030000 -14550029 -00000000 -14760027 -00000000 -24080000 -3c093ac7 -3529f7a0 -01090019 -0000a812 -0000b010 -24020000 -24030000 -1455001d -00000000 -1476001b -00000000 -24080000 -3c0904e4 -3529cfaa -01090019 -0000a812 -0000b010 -24020000 -24030000 -14550011 -00000000 -1476000f -00000000 -24080000 -24090000 -01090019 -0000a812 -0000b010 -24020000 -24030000 -14550006 -00000000 -14760004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -00000000 -26100001 -24120000 -3c020000 -3c030000 -3c08bfc8 -25083a58 -3c09bfc8 -25293a88 -10000008 -00000000 -3c02c21e -34426e78 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c030e2e -3463a248 -3c15c21e -36b56e78 -3c160e2e -36d6a248 -1455108c -00000000 -1476108a -00000000 -3c020000 -3c030000 -3c08bfc8 -25083ad0 -3c09bfc8 -25293b00 -10000008 -00000000 -3c026793 -3442c49c -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03654b -34632d70 -3c156793 -36b5c49c -3c16654b -36d62d70 -1455106e -00000000 -1476106c -00000000 -3c020000 -3c030000 -3c08bfc8 -25083b48 -3c09bfc8 -25293b78 -10000008 -00000000 -3c02ff0a -344208b0 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c0350d2 -3463bb38 -3c15ff0a -36b508b0 -3c1650d2 -36d6bb38 -14551050 -00000000 -1476104e -00000000 -3c020000 -3c030000 -3c08bfc8 -25083bc0 -3c09bfc8 -25293bf0 -10000008 -00000000 -3c027064 -34420e44 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03391a -3463fbca -3c157064 -36b50e44 -3c16391a -36d6fbca -14551032 -00000000 -14761030 -00000000 -3c020000 -3c030000 -3c08bfc8 -25083c38 -3c09bfc8 -25293c68 -10000008 -00000000 -3c020506 -3442233b -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03b141 -346315a8 -3c150506 -36b5233b -3c16b141 -36d615a8 -14551014 -00000000 -14761012 -00000000 -3c020000 -3c030000 -3c08bfc8 -25083cb0 -3c09bfc8 -25293ce0 -10000008 -00000000 -3c029c78 -34421547 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03de17 -34638220 -3c159c78 -36b51547 -3c16de17 -36d68220 -14550ff6 -00000000 -14760ff4 -00000000 -3c020000 -3c030000 -3c08bfc8 -25083d28 -3c09bfc8 -25293d58 -10000008 -00000000 -3c02a8dd -34422c05 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03fb3d -34638034 -3c15a8dd -36b52c05 -3c16fb3d -36d68034 -14550fd8 -00000000 -14760fd6 -00000000 -3c020000 -3c030000 -3c08bfc8 -25083da0 -3c09bfc8 -25293dd0 -10000008 -00000000 -3c0201c4 -34425860 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c036bdc -34634550 -3c1501c4 -36b55860 -3c166bdc -36d64550 -14550fba -00000000 -14760fb8 -00000000 -3c020000 -3c030000 -3c08bfc8 -25083e18 -3c09bfc8 -25293e48 -10000008 -00000000 -3c0247d1 -3442c1c0 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03f853 -3463cd8e -3c1547d1 -36b5c1c0 -3c16f853 -36d6cd8e -14550f9c -00000000 -14760f9a -00000000 -3c020000 -3c030000 -3c08bfc8 -25083e90 -3c09bfc8 -25293ec0 -10000008 -00000000 -3c027089 -3442b600 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03b8da -34631d86 -3c157089 -36b5b600 -3c16b8da -36d61d86 -14550f7e -00000000 -14760f7c -00000000 -3c020000 -3c030000 -3c08bfc8 -25083f08 -3c09bfc8 -25293f38 -10000008 -00000000 -3c027292 -3442aac0 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c030e66 -3463c29a -3c157292 -36b5aac0 -3c160e66 -36d6c29a -14550f60 -00000000 -14760f5e -00000000 -3c020000 -3c030000 -3c08bfc8 -25083f80 -3c09bfc8 -25293fb0 -10000008 -00000000 -3c028c9b -3442ab9e -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c0332b2 -34637d8c -3c158c9b -36b5ab9e -3c1632b2 -36d67d8c -14550f42 -00000000 -14760f40 -00000000 -3c020000 -3c030000 -3c08bfc8 -25083ff8 -3c09bfc8 -25294028 -10000008 -00000000 -3c021bac -3442298c -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c0364cd -34638070 -3c151bac -36b5298c -3c1664cd -36d68070 -14550f24 -00000000 -14760f22 -00000000 -3c020000 -3c030000 -3c08bfc8 -25084070 -3c09bfc8 -252940a0 -10000008 -00000000 -3c02f6cc -3442a88d -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c0357d6 -34634306 -3c15f6cc -36b5a88d -3c1657d6 -36d64306 -14550f06 -00000000 -14760f04 -00000000 -3c020000 -3c030000 -3c08bfc8 -250840e8 -3c09bfc8 -25294118 -10000008 -00000000 -3c02b792 -3442bde0 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c030ac1 -3463da9a -3c15b792 -36b5bde0 -3c160ac1 -36d6da9a -14550ee8 -00000000 -14760ee6 -00000000 -3c020000 -3c030000 -3c08bfc8 -25084160 -3c09bfc8 -25294190 -10000008 -00000000 -3c02d694 -34425e3f -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c034a8c -3463a140 -3c15d694 -36b55e3f -3c164a8c -36d6a140 -14550eca -00000000 -14760ec8 -00000000 -3c020000 -3c030000 -3c08bfc8 -250841d8 -3c09bfc8 -25294208 -10000008 -00000000 -3c026c8b -34424b9e -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03a614 -3463d1d3 -3c156c8b -36b54b9e -3c16a614 -36d6d1d3 -14550eac -00000000 -14760eaa -00000000 -3c020000 -3c030000 -3c08bfc8 -25084250 -3c09bfc8 -25294280 -10000008 -00000000 -3c02b1ba -344284c0 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03debf -34636380 -3c15b1ba -36b584c0 -3c16debf -36d66380 -14550e8e -00000000 -14760e8c -00000000 -3c020000 -3c030000 -3c08bfc8 -250842c8 -3c09bfc8 -252942f8 -10000008 -00000000 -3c029090 -34421228 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c0333c3 -34632888 -3c159090 -36b51228 -3c1633c3 -36d62888 -14550e70 -00000000 -14760e6e -00000000 -3c020000 -3c030000 -3c08bfc8 -25084340 -3c09bfc8 -25294370 -10000008 -00000000 -3c02c7eb -344269e0 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c035879 -34636a6c -3c15c7eb -36b569e0 -3c165879 -36d66a6c -14550e52 -00000000 -14760e50 -00000000 -3c020000 -3c030000 -3c08bfc8 -250843b8 -3c09bfc8 -252943e8 -10000008 -00000000 -3c02549e -3442c268 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03c98b -34636a8a -3c15549e -36b5c268 -3c16c98b -36d66a8a -14550e34 -00000000 -14760e32 -00000000 -3c020000 -3c030000 -3c08bfc8 -25084430 -3c09bfc8 -25294460 -10000008 -00000000 -3c02fb01 -34420550 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c035114 -3463cdbc -3c15fb01 -36b50550 -3c165114 -36d6cdbc -14550e16 -00000000 -14760e14 -00000000 -3c020000 -3c030000 -3c08bfc8 -250844a8 -3c09bfc8 -252944d8 -10000008 -00000000 -3c0262bc -34426ba6 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c037be6 -34634fa2 -3c1562bc -36b56ba6 -3c167be6 -36d64fa2 -14550df8 -00000000 -14760df6 -00000000 -3c020000 -3c030000 -3c08bfc8 -25084520 -3c09bfc8 -25294550 -10000008 -00000000 -3c02bf3b -3442a098 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c030cd8 -34633240 -3c15bf3b -36b5a098 -3c160cd8 -36d63240 -14550dda -00000000 -14760dd8 -00000000 -3c020000 -3c030000 -3c08bfc8 -25084598 -3c09bfc8 -252945c8 -10000008 -00000000 -3c023e1a -344296ec -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c035eb2 -3463c340 -3c153e1a -36b596ec -3c165eb2 -36d6c340 -14550dbc -00000000 -14760dba -00000000 -3c020000 -3c030000 -3c08bfc8 -25084610 -3c09bfc8 -25294640 -10000008 -00000000 -3c023a7d -3442a350 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03d06a -3463825a -3c153a7d -36b5a350 -3c16d06a -36d6825a -14550d9e -00000000 -14760d9c -00000000 -3c020000 -3c030000 -3c08bfc8 -25084688 -3c09bfc8 -252946b8 -10000008 -00000000 -3c02b2d9 -344232b0 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03c243 -3463527a -3c15b2d9 -36b532b0 -3c16c243 -36d6527a -14550d80 -00000000 -14760d7e -00000000 -3c020000 -3c030000 -3c08bfc8 -25084700 -3c09bfc8 -25294730 -10000008 -00000000 -3c02b181 -34420096 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03072e -3463ceb0 -3c15b181 -36b50096 -3c16072e -36d6ceb0 -14550d62 -00000000 -14760d60 -00000000 -3c020000 -3c030000 -3c08bfc8 -25084778 -3c09bfc8 -252947a8 -10000008 -00000000 -3c028123 -3442d3a0 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c0340cd -34635ed8 -3c158123 -36b5d3a0 -3c1640cd -36d65ed8 -14550d44 -00000000 -14760d42 -00000000 -3c020000 -3c030000 -3c08bfc8 -250847f0 -3c09bfc8 -25294820 -10000008 -00000000 -3c026488 -34424488 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c035f73 -346312da -3c156488 -36b54488 -3c165f73 -36d612da -14550d26 -00000000 -14760d24 -00000000 -3c020000 -3c030000 -3c08bfc8 -25084868 -3c09bfc8 -25294898 -10000008 -00000000 -3c027023 -34429b80 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c033339 -34632afc -3c157023 -36b59b80 -3c163339 -36d62afc -14550d08 -00000000 -14760d06 -00000000 -3c020000 -3c030000 -3c08bfc8 -250848e0 -3c09bfc8 -25294910 -10000008 -00000000 -3c026298 -3442a0cc -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03893e -3463fc1b -3c156298 -36b5a0cc -3c16893e -36d6fc1b -14550cea -00000000 -14760ce8 -00000000 -3c020000 -3c030000 -3c08bfc8 -25084958 -3c09bfc8 -25294988 -10000008 -00000000 -3c02b00f -344260cd -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c0365c1 -3463af16 -3c15b00f -36b560cd -3c1665c1 -36d6af16 -14550ccc -00000000 -14760cca -00000000 -3c020000 -3c030000 -3c08bfc8 -250849d0 -3c09bfc8 -25294a00 -10000008 -00000000 -3c020823 -34427624 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c0338c0 -3463ece0 -3c150823 -36b57624 -3c1638c0 -36d6ece0 -14550cae -00000000 -14760cac -00000000 -3c020000 -3c030000 -3c08bfc8 -25084a48 -3c09bfc8 -25294a78 -10000008 -00000000 -3c022dfe -3442e5be -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03e51d -346375a0 -3c152dfe -36b5e5be -3c16e51d -36d675a0 -14550c90 -00000000 -14760c8e -00000000 -3c020000 -3c030000 -3c08bfc8 -25084ac0 -3c09bfc8 -25294af0 -10000008 -00000000 -3c022ca5 -3442486c -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c037805 -34636284 -3c152ca5 -36b5486c -3c167805 -36d66284 -14550c72 -00000000 -14760c70 -00000000 -3c020000 -3c030000 -3c08bfc8 -25084b38 -3c09bfc8 -25294b68 -10000008 -00000000 -3c026770 -3442ec50 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c032d3c -34634286 -3c156770 -36b5ec50 -3c162d3c -36d64286 -14550c54 -00000000 -14760c52 -00000000 -3c020000 -3c030000 -3c08bfc8 -25084bb0 -3c09bfc8 -25294be0 -10000008 -00000000 -3c02b37c -34428454 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c034c65 -346333f3 -3c15b37c -36b58454 -3c164c65 -36d633f3 -14550c36 -00000000 -14760c34 -00000000 -3c020000 -3c030000 -3c08bfc8 -25084c28 -3c09bfc8 -25294c58 -10000008 -00000000 -3c0220aa -34420280 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c034d84 -34635d70 -3c1520aa -36b50280 -3c164d84 -36d65d70 -14550c18 -00000000 -14760c16 -00000000 -3c020000 -3c030000 -3c08bfc8 -25084ca0 -3c09bfc8 -25294cd0 -10000008 -00000000 -3c02557c -344266c0 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c0301ba -346381a4 -3c15557c -36b566c0 -3c1601ba -36d681a4 -14550bfa -00000000 -14760bf8 -00000000 -3c020000 -3c030000 -3c08bfc8 -25084d18 -3c09bfc8 -25294d48 -10000008 -00000000 -3c024819 -3442c4f0 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c0368fa -3463809c -3c154819 -36b5c4f0 -3c1668fa -36d6809c -14550bdc -00000000 -14760bda -00000000 -3c020000 -3c030000 -3c08bfc8 -25084d90 -3c09bfc8 -25294dc0 -10000008 -00000000 -3c02ba2a -34421bbc -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03e5a7 -34632720 -3c15ba2a -36b51bbc -3c16e5a7 -36d62720 -14550bbe -00000000 -14760bbc -00000000 -3c020000 -3c030000 -3c08bfc8 -25084e08 -3c09bfc8 -25294e38 -10000008 -00000000 -3c0294a8 -34425658 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c0306ef -34635a14 -3c1594a8 -36b55658 -3c1606ef -36d65a14 -14550ba0 -00000000 -14760b9e -00000000 -3c020000 -3c030000 -3c08bfc8 -25084e80 -3c09bfc8 -25294eb0 -10000008 -00000000 -3c024729 -3442cab8 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03dcc9 -3463db9c -3c154729 -36b5cab8 -3c16dcc9 -36d6db9c -14550b82 -00000000 -14760b80 -00000000 -3c020000 -3c030000 -3c08bfc8 -25084ef8 -3c09bfc8 -25294f28 -10000008 -00000000 -3c02f29a -34421c5c -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03c9d1 -3463a960 -3c15f29a -36b51c5c -3c16c9d1 -36d6a960 -14550b64 -00000000 -14760b62 -00000000 -3c020000 -3c030000 -3c08bfc8 -25084f70 -3c09bfc8 -25294fa0 -10000008 -00000000 -3c02363e -34429340 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03463f -34637863 -3c15363e -36b59340 -3c16463f -36d67863 -14550b46 -00000000 -14760b44 -00000000 -3c020000 -3c030000 -3c08bfc8 -25084fe8 -3c09bfc8 -25295018 -10000008 -00000000 -3c02c029 -3442cea0 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c033f18 -3463b948 -3c15c029 -36b5cea0 -3c163f18 -36d6b948 -14550b28 -00000000 -14760b26 -00000000 -3c020000 -3c030000 -3c08bfc8 -25085060 -3c09bfc8 -25295090 -10000008 -00000000 -3c026529 -3442aa00 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c0389b7 -346321fc -3c156529 -36b5aa00 -3c1689b7 -36d621fc -14550b0a -00000000 -14760b08 -00000000 -3c020000 -3c030000 -3c08bfc8 -250850d8 -3c09bfc8 -25295108 -10000008 -00000000 -3c02a3d4 -344211de -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03f422 -34633eae -3c15a3d4 -36b511de -3c16f422 -36d63eae -14550aec -00000000 -14760aea -00000000 -3c020000 -3c030000 -3c08bfc8 -25085150 -3c09bfc8 -25295180 -10000008 -00000000 -3c0290a7 -3442772f -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c030b25 -346380ba -3c1590a7 -36b5772f -3c160b25 -36d680ba -14550ace -00000000 -14760acc -00000000 -3c020000 -3c030000 -3c08bfc8 -250851c8 -3c09bfc8 -252951f8 -10000008 -00000000 -3c02637d -34429eba -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c033926 -346382d4 -3c15637d -36b59eba -3c163926 -36d682d4 -14550ab0 -00000000 -14760aae -00000000 -3c020000 -3c030000 -3c08bfc8 -25085240 -3c09bfc8 -25295270 -10000008 -00000000 -3c020896 -344219d0 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03ca33 -34630c5b -3c150896 -36b519d0 -3c16ca33 -36d60c5b -14550a92 -00000000 -14760a90 -00000000 -3c020000 -3c030000 -3c08bfc8 -250852b8 -3c09bfc8 -252952e8 -10000008 -00000000 -3c023153 -3442acc0 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03d82d -34632884 -3c153153 -36b5acc0 -3c16d82d -36d62884 -14550a74 -00000000 -14760a72 -00000000 -3c020000 -3c030000 -3c08bfc8 -25085330 -3c09bfc8 -25295360 -10000008 -00000000 -3c02c3e2 -3442c3c8 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03d457 -34633f50 -3c15c3e2 -36b5c3c8 -3c16d457 -36d63f50 -14550a56 -00000000 -14760a54 -00000000 -3c020000 -3c030000 -3c08bfc8 -250853a8 -3c09bfc8 -252953d8 -10000008 -00000000 -3c025ddc -3442207b -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c0331e5 -34630dad -3c155ddc -36b5207b -3c1631e5 -36d60dad -14550a38 -00000000 -14760a36 -00000000 -3c020000 -3c030000 -3c08bfc8 -25085420 -3c09bfc8 -25295450 -10000008 -00000000 -3c02da24 -3442472c -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03db1e -3463eac0 -3c15da24 -36b5472c -3c16db1e -36d6eac0 -14550a1a -00000000 -14760a18 -00000000 -3c020000 -3c030000 -3c08bfc8 -25085498 -3c09bfc8 -252954c8 -10000008 -00000000 -3c022efe -3442847d -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03e5d6 -3463d5be -3c152efe -36b5847d -3c16e5d6 -36d6d5be -145509fc -00000000 -147609fa -00000000 -3c020000 -3c030000 -3c08bfc8 -25085510 -3c09bfc8 -25295540 -10000008 -00000000 -3c02b694 -34429ab3 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03b1e8 -34639022 -3c15b694 -36b59ab3 -3c16b1e8 -36d69022 -145509de -00000000 -147609dc -00000000 -3c020000 -3c030000 -3c08bfc8 -25085588 -3c09bfc8 -252955b8 -10000008 -00000000 -3c023fe1 -3442f2a0 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03c026 -3463ca09 -3c153fe1 -36b5f2a0 -3c16c026 -36d6ca09 -145509c0 -00000000 -147609be -00000000 -3c020000 -3c030000 -3c08bfc8 -25085600 -3c09bfc8 -25295630 -10000008 -00000000 -3c028390 -344299b4 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03b34f -34634200 -3c158390 -36b599b4 -3c16b34f -36d64200 -145509a2 -00000000 -147609a0 -00000000 -3c020000 -3c030000 -3c08bfc8 -25085678 -3c09bfc8 -252956a8 -10000008 -00000000 -3c020309 -3442efb3 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c033d90 -3463e910 -3c150309 -36b5efb3 -3c163d90 -36d6e910 -14550984 -00000000 -14760982 -00000000 -3c020000 -3c030000 -3c08bfc8 -250856f0 -3c09bfc8 -25295720 -10000008 -00000000 -3c02cf4e -3442331c -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03f966 -346362d4 -3c15cf4e -36b5331c -3c16f966 -36d662d4 -14550966 -00000000 -14760964 -00000000 -3c020000 -3c030000 -3c08bfc8 -25085768 -3c09bfc8 -25295798 -10000008 -00000000 -3c0231fe -344218a8 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03ea76 -3463604d -3c1531fe -36b518a8 -3c16ea76 -36d6604d -14550948 -00000000 -14760946 -00000000 -3c020000 -3c030000 -3c08bfc8 -250857e0 -3c09bfc8 -25295810 -10000008 -00000000 -3c024378 -344250a5 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03afc8 -34634cc0 -3c154378 -36b550a5 -3c16afc8 -36d64cc0 -1455092a -00000000 -14760928 -00000000 -3c020000 -3c030000 -3c08bfc8 -25085858 -3c09bfc8 -25295888 -10000008 -00000000 -3c02305f -3442e32c -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c039958 -3463bca0 -3c15305f -36b5e32c -3c169958 -36d6bca0 -1455090c -00000000 -1476090a -00000000 -3c020000 -3c030000 -3c08bfc8 -250858d0 -3c09bfc8 -25295900 -10000008 -00000000 -3c026819 -3442c7ac -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c0372ae -34635be8 -3c156819 -36b5c7ac -3c1672ae -36d65be8 -145508ee -00000000 -147608ec -00000000 -3c020000 -3c030000 -3c08bfc8 -25085948 -3c09bfc8 -25295978 -10000008 -00000000 -3c02bc48 -34423294 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c035ee9 -3463cab7 -3c15bc48 -36b53294 -3c165ee9 -36d6cab7 -145508d0 -00000000 -147608ce -00000000 -3c020000 -3c030000 -3c08bfc8 -250859c0 -3c09bfc8 -252959f0 -10000008 -00000000 -3c02992c -3442a086 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03db12 -3463ba3e -3c15992c -36b5a086 -3c16db12 -36d6ba3e -145508b2 -00000000 -147608b0 -00000000 -3c020000 -3c030000 -3c08bfc8 -25085a38 -3c09bfc8 -25295a68 -10000008 -00000000 -3c024815 -3442f586 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03601e -3463841c -3c154815 -36b5f586 -3c16601e -36d6841c -14550894 -00000000 -14760892 -00000000 -3c020000 -3c030000 -3c08bfc8 -25085ab0 -3c09bfc8 -25295ae0 -10000008 -00000000 -3c02d72e -3442de76 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c033839 -34638460 -3c15d72e -36b5de76 -3c163839 -36d68460 -14550876 -00000000 -14760874 -00000000 -3c020000 -3c030000 -3c08bfc8 -25085b28 -3c09bfc8 -25295b58 -10000008 -00000000 -3c02fd78 -34420804 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03d267 -3463e691 -3c15fd78 -36b50804 -3c16d267 -36d6e691 -14550858 -00000000 -14760856 -00000000 -3c020000 -3c030000 -3c08bfc8 -25085ba0 -3c09bfc8 -25295bd0 -10000008 -00000000 -3c0214b6 -34427f0f -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c034af4 -3463a348 -3c1514b6 -36b57f0f -3c164af4 -36d6a348 -1455083a -00000000 -14760838 -00000000 -3c020000 -3c030000 -3c08bfc8 -25085c18 -3c09bfc8 -25295c48 -10000008 -00000000 -3c021180 -3442a96c -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03d387 -34637780 -3c151180 -36b5a96c -3c16d387 -36d67780 -1455081c -00000000 -1476081a -00000000 -3c020000 -3c030000 -3c08bfc8 -25085c90 -3c09bfc8 -25295cc0 -10000008 -00000000 -3c0236e5 -3442c8b0 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c038919 -3463ab62 -3c1536e5 -36b5c8b0 -3c168919 -36d6ab62 -145507fe -00000000 -147607fc -00000000 -3c020000 -3c030000 -3c08bfc8 -25085d08 -3c09bfc8 -25295d38 -10000008 -00000000 -3c02ebe4 -34421ae0 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03b1ec -34639648 -3c15ebe4 -36b51ae0 -3c16b1ec -36d69648 -145507e0 -00000000 -147607de -00000000 -3c020000 -3c030000 -3c08bfc8 -25085d80 -3c09bfc8 -25295db0 -10000008 -00000000 -3c024ea5 -3442e93c -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c0306d5 -3463f244 -3c154ea5 -36b5e93c -3c1606d5 -36d6f244 -145507c2 -00000000 -147607c0 -00000000 -3c020000 -3c030000 -3c08bfc8 -25085df8 -3c09bfc8 -25295e28 -10000008 -00000000 -3c02df92 -3442436a -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c034b4f -346358bc -3c15df92 -36b5436a -3c164b4f -36d658bc -145507a4 -00000000 -147607a2 -00000000 -3c020000 -3c030000 -3c08bfc8 -25085e70 -3c09bfc8 -25295ea0 -10000008 -00000000 -3c02a046 -34421040 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c038238 -3463a17c -3c15a046 -36b51040 -3c168238 -36d6a17c -14550786 -00000000 -14760784 -00000000 -3c020000 -3c030000 -3c08bfc8 -25085ee8 -3c09bfc8 -25295f18 -10000008 -00000000 -3c02bca8 -344232fa -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03c098 -3463cecc -3c15bca8 -36b532fa -3c16c098 -36d6cecc -14550768 -00000000 -14760766 -00000000 -3c020000 -3c030000 -3c08bfc8 -25085f60 -3c09bfc8 -25295f90 -10000008 -00000000 -3c02cc4d -3442c3c0 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03a974 -34635af0 -3c15cc4d -36b5c3c0 -3c16a974 -36d65af0 -1455074a -00000000 -14760748 -00000000 -3c020000 -3c030000 -3c08bfc8 -25085fd8 -3c09bfc8 -25296008 -10000008 -00000000 -3c022369 -344277c8 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03c805 -34637a46 -3c152369 -36b577c8 -3c16c805 -36d67a46 -1455072c -00000000 -1476072a -00000000 -3c020000 -3c030000 -3c08bfc8 -25086050 -3c09bfc8 -25296080 -10000008 -00000000 -3c028b7b -344285f2 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03c72b -346374a0 -3c158b7b -36b585f2 -3c16c72b -36d674a0 -1455070e -00000000 -1476070c -00000000 -3c020000 -3c030000 -3c08bfc8 -250860c8 -3c09bfc8 -252960f8 -10000008 -00000000 -3c02e8a9 -34420d98 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03daaf -3463b741 -3c15e8a9 -36b50d98 -3c16daaf -36d6b741 -145506f0 -00000000 -147606ee -00000000 -3c020000 -3c030000 -3c08bfc8 -25086140 -3c09bfc8 -25296170 -10000008 -00000000 -3c02a7e7 -3442b2b1 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c035c33 -346340d2 -3c15a7e7 -36b5b2b1 -3c165c33 -36d640d2 -145506d2 -00000000 -147606d0 -00000000 -3c020000 -3c030000 -3c08bfc8 -250861b8 -3c09bfc8 -252961e8 -10000008 -00000000 -3c022058 -344254d0 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c037e62 -34633f9b -3c152058 -36b554d0 -3c167e62 -36d63f9b -145506b4 -00000000 -147606b2 -00000000 -3c020000 -3c030000 -3c08bfc8 -25086230 -3c09bfc8 -25296260 -10000008 -00000000 -3c02c8fd -34421218 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c0329c8 -34632be4 -3c15c8fd -36b51218 -3c1629c8 -36d62be4 -14550696 -00000000 -14760694 -00000000 -3c020000 -3c030000 -3c08bfc8 -250862a8 -3c09bfc8 -252962d8 -10000008 -00000000 -3c02248c -3442bb10 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c0304e6 -34631518 -3c15248c -36b5bb10 -3c1604e6 -36d61518 -14550678 -00000000 -14760676 -00000000 -3c020000 -3c030000 -3c08bfc8 -25086320 -3c09bfc8 -25296350 -10000008 -00000000 -3c024e68 -34421e00 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c0305eb -34634288 -3c154e68 -36b51e00 -3c1605eb -36d64288 -1455065a -00000000 -14760658 -00000000 -3c020000 -3c030000 -3c08bfc8 -25086398 -3c09bfc8 -252963c8 -10000008 -00000000 -3c02f923 -34427e68 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03b278 -34633f58 -3c15f923 -36b57e68 -3c16b278 -36d63f58 -1455063c -00000000 -1476063a -00000000 -3c020000 -3c030000 -3c08bfc8 -25086410 -3c09bfc8 -25296440 -10000008 -00000000 -3c022902 -3442d948 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c0372a7 -34631480 -3c152902 -36b5d948 -3c1672a7 -36d61480 -1455061e -00000000 -1476061c -00000000 -3c020000 -3c030000 -3c08bfc8 -25086488 -3c09bfc8 -252964b8 -10000008 -00000000 -3c02e24e -344254f0 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03a6d1 -346366cc -3c15e24e -36b554f0 -3c16a6d1 -36d666cc -14550600 -00000000 -147605fe -00000000 -3c020000 -3c030000 -3c08bfc8 -25086500 -3c09bfc8 -25296530 -10000008 -00000000 -3c022627 -3442dbca -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03556d -3463ff0c -3c152627 -36b5dbca -3c16556d -36d6ff0c -145505e2 -00000000 -147605e0 -00000000 -3c020000 -3c030000 -3c08bfc8 -25086578 -3c09bfc8 -252965a8 -10000008 -00000000 -3c0283ce -34427672 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03e3fc -3463075d -3c1583ce -36b57672 -3c16e3fc -36d6075d -145505c4 -00000000 -147605c2 -00000000 -3c020000 -3c030000 -3c08bfc8 -250865f0 -3c09bfc8 -25296620 -10000008 -00000000 -3c029b26 -34428b70 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03eaed -34635ca8 -3c159b26 -36b58b70 -3c16eaed -36d65ca8 -145505a6 -00000000 -147605a4 -00000000 -3c020000 -3c030000 -3c08bfc8 -25086668 -3c09bfc8 -25296698 -10000008 -00000000 -3c023585 -344214a0 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03f114 -346383e7 -3c153585 -36b514a0 -3c16f114 -36d683e7 -14550588 -00000000 -14760586 -00000000 -3c020000 -3c030000 -3c08bfc8 -250866e0 -3c09bfc8 -25296710 -10000008 -00000000 -3c02ee61 -3442423b -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03282e -34633580 -3c15ee61 -36b5423b -3c16282e -36d63580 -1455056a -00000000 -14760568 -00000000 -3c020000 -3c030000 -3c08bfc8 -25086758 -3c09bfc8 -25296788 -10000008 -00000000 -3c02dccf -3442d296 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03d26d -34635480 -3c15dccf -36b5d296 -3c16d26d -36d65480 -1455054c -00000000 -1476054a -00000000 -3c020000 -3c030000 -3c08bfc8 -250867d0 -3c09bfc8 -25296800 -10000008 -00000000 -3c0229be -34428f01 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c034955 -3463d3eb -3c1529be -36b58f01 -3c164955 -36d6d3eb -1455052e -00000000 -1476052c -00000000 -3c020000 -3c030000 -3c08bfc8 -25086848 -3c09bfc8 -25296878 -10000008 -00000000 -3c02b069 -344236c0 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c039166 -3463ccc0 -3c15b069 -36b536c0 -3c169166 -36d6ccc0 -14550510 -00000000 -1476050e -00000000 -3c020000 -3c030000 -3c08bfc8 -250868c0 -3c09bfc8 -252968f0 -10000008 -00000000 -3c02e9b5 -3442cca8 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03bbf0 -34639201 -3c15e9b5 -36b5cca8 -3c16bbf0 -36d69201 -145504f2 -00000000 -147604f0 -00000000 -3c020000 -3c030000 -3c08bfc8 -25086938 -3c09bfc8 -25296968 -10000008 -00000000 -3c02544f -34425380 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c0397e8 -3463441a -3c15544f -36b55380 -3c1697e8 -36d6441a -145504d4 -00000000 -147604d2 -00000000 -3c020000 -3c030000 -3c08bfc8 -250869b0 -3c09bfc8 -252969e0 -10000008 -00000000 -3c028cff -344233f7 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c0385e9 -34634ea8 -3c158cff -36b533f7 -3c1685e9 -36d64ea8 -145504b6 -00000000 -147604b4 -00000000 -3c020000 -3c030000 -3c08bfc8 -25086a28 -3c09bfc8 -25296a58 -10000008 -00000000 -3c022f42 -3442c720 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03aff0 -346350dc -3c152f42 -36b5c720 -3c16aff0 -36d650dc -14550498 -00000000 -14760496 -00000000 -3c020000 -3c030000 -3c08bfc8 -25086aa0 -3c09bfc8 -25296ad0 -10000008 -00000000 -3c02357f -3442fcc0 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03e272 -34635c22 -3c15357f -36b5fcc0 -3c16e272 -36d65c22 -1455047a -00000000 -14760478 -00000000 -3c020000 -3c030000 -3c08bfc8 -25086b18 -3c09bfc8 -25296b48 -10000008 -00000000 -3c02f065 -34423e7f -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c037fe6 -34635b38 -3c15f065 -36b53e7f -3c167fe6 -36d65b38 -1455045c -00000000 -1476045a -00000000 -3c020000 -3c030000 -3c08bfc8 -25086b90 -3c09bfc8 -25296bc0 -10000008 -00000000 -3c0275be -3442951c -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c0313ed -346314e8 -3c1575be -36b5951c -3c1613ed -36d614e8 -1455043e -00000000 -1476043c -00000000 -3c020000 -3c030000 -3c08bfc8 -25086c08 -3c09bfc8 -25296c38 -10000008 -00000000 -3c024954 -34427b18 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03d762 -3463dc10 -3c154954 -36b57b18 -3c16d762 -36d6dc10 -14550420 -00000000 -1476041e -00000000 -3c020000 -3c030000 -3c08bfc8 -25086c80 -3c09bfc8 -25296cb0 -10000008 -00000000 -3c0270fe -3442c57a -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c039048 -34632cbe -3c1570fe -36b5c57a -3c169048 -36d62cbe -14550402 -00000000 -14760400 -00000000 -3c020000 -3c030000 -3c08bfc8 -25086cf8 -3c09bfc8 -25296d28 -10000008 -00000000 -3c02e61b -34422f08 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03ea0a -34633b7e -3c15e61b -36b52f08 -3c16ea0a -36d63b7e -145503e4 -00000000 -147603e2 -00000000 -3c020000 -3c030000 -3c08bfc8 -25086d70 -3c09bfc8 -25296da0 -10000008 -00000000 -3c023365 -34421ede -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c0326cc -3463b363 -3c153365 -36b51ede -3c1626cc -36d6b363 -145503c6 -00000000 -147603c4 -00000000 -3c020000 -3c030000 -3c08bfc8 -25086de8 -3c09bfc8 -25296e18 -10000008 -00000000 -3c0295f5 -34420600 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c0391b7 -3463fe70 -3c1595f5 -36b50600 -3c1691b7 -36d6fe70 -145503a8 -00000000 -147603a6 -00000000 -3c020000 -3c030000 -3c08bfc8 -25086e60 -3c09bfc8 -25296e90 -10000008 -00000000 -3c026dc4 -34429bfc -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03a48e -3463e500 -3c156dc4 -36b59bfc -3c16a48e -36d6e500 -1455038a -00000000 -14760388 -00000000 -3c020000 -3c030000 -3c08bfc8 -25086ed8 -3c09bfc8 -25296f08 -10000008 -00000000 -3c0223be -34428800 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c033b31 -34636965 -3c1523be -36b58800 -3c163b31 -36d66965 -1455036c -00000000 -1476036a -00000000 -3c020000 -3c030000 -3c08bfc8 -25086f50 -3c09bfc8 -25296f80 -10000008 -00000000 -3c02ac03 -344299e8 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03a854 -34633092 -3c15ac03 -36b599e8 -3c16a854 -36d63092 -1455034e -00000000 -1476034c -00000000 -3c020000 -3c030000 -3c08bfc8 -25086fc8 -3c09bfc8 -25296ff8 -10000008 -00000000 -3c02bc7b -34424a80 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03a4d6 -34637100 -3c15bc7b -36b54a80 -3c16a4d6 -36d67100 -14550330 -00000000 -1476032e -00000000 -3c020000 -3c030000 -3c08bfc8 -25087040 -3c09bfc8 -25297070 -10000008 -00000000 -3c02781b -34428190 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c035b4d -34638a31 -3c15781b -36b58190 -3c165b4d -36d68a31 -14550312 -00000000 -14760310 -00000000 -3c020000 -3c030000 -3c08bfc8 -250870b8 -3c09bfc8 -252970e8 -10000008 -00000000 -3c02e0e6 -34423b40 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c034c2f -3463352c -3c15e0e6 -36b53b40 -3c164c2f -36d6352c -145502f4 -00000000 -147602f2 -00000000 -3c020000 -3c030000 -3c08bfc8 -25087130 -3c09bfc8 -25297160 -10000008 -00000000 -3c02f12d -344268c4 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c0341cb -3463f8c8 -3c15f12d -36b568c4 -3c1641cb -36d6f8c8 -145502d6 -00000000 -147602d4 -00000000 -3c020000 -3c030000 -3c08bfc8 -250871a8 -3c09bfc8 -252971d8 -10000008 -00000000 -3c021ed1 -3442d128 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03500d -346340f8 -3c151ed1 -36b5d128 -3c16500d -36d640f8 -145502b8 -00000000 -147602b6 -00000000 -3c020000 -3c030000 -3c08bfc8 -25087220 -3c09bfc8 -25297250 -10000008 -00000000 -3c02ae9d -3442d038 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03688b -34638be2 -3c15ae9d -36b5d038 -3c16688b -36d68be2 -1455029a -00000000 -14760298 -00000000 -3c020000 -3c030000 -3c08bfc8 -25087298 -3c09bfc8 -252972c8 -10000008 -00000000 -3c02df3b -3442cb3d -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03c717 -34635e68 -3c15df3b -36b5cb3d -3c16c717 -36d65e68 -1455027c -00000000 -1476027a -00000000 -3c020000 -3c030000 -3c08bfc8 -25087310 -3c09bfc8 -25297340 -10000008 -00000000 -3c025813 -3442b77e -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03c2a2 -3463c3e6 -3c155813 -36b5b77e -3c16c2a2 -36d6c3e6 -1455025e -00000000 -1476025c -00000000 -3c020000 -3c030000 -3c08bfc8 -25087388 -3c09bfc8 -252973b8 -10000008 -00000000 -3c021ec9 -3442f890 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c0316f6 -34637880 -3c151ec9 -36b5f890 -3c1616f6 -36d67880 -14550240 -00000000 -1476023e -00000000 -3c020000 -3c030000 -3c08bfc8 -25087400 -3c09bfc8 -25297430 -10000008 -00000000 -3c02fede -3442f1a8 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03fac2 -34630a98 -3c15fede -36b5f1a8 -3c16fac2 -36d60a98 -14550222 -00000000 -14760220 -00000000 -3c020000 -3c030000 -3c08bfc8 -25087478 -3c09bfc8 -252974a8 -10000008 -00000000 -3c0273d8 -3442ff9f -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c039b54 -34638d8e -3c1573d8 -36b5ff9f -3c169b54 -36d68d8e -14550204 -00000000 -14760202 -00000000 -3c020000 -3c030000 -3c08bfc8 -250874f0 -3c09bfc8 -25297520 -10000008 -00000000 -3c02efcf -344297c0 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03da43 -346381ca -3c15efcf -36b597c0 -3c16da43 -36d681ca -145501e6 -00000000 -147601e4 -00000000 -3c020000 -3c030000 -3c08bfc8 -25087568 -3c09bfc8 -25297598 -10000008 -00000000 -3c02fb8a -344258f0 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c039332 -34630d80 -3c15fb8a -36b558f0 -3c169332 -36d60d80 -145501c8 -00000000 -147601c6 -00000000 -3c020000 -3c030000 -3c08bfc8 -250875e0 -3c09bfc8 -25297610 -10000008 -00000000 -3c027048 -3442ea70 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c0333d2 -3463c620 -3c157048 -36b5ea70 -3c1633d2 -36d6c620 -145501aa -00000000 -147601a8 -00000000 -3c020000 -3c030000 -3c08bfc8 -25087658 -3c09bfc8 -25297688 -10000008 -00000000 -3c025378 -3442f23e -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03fdf9 -34637c20 -3c155378 -36b5f23e -3c16fdf9 -36d67c20 -1455018c -00000000 -1476018a -00000000 -3c020000 -3c030000 -3c08bfc8 -250876d0 -3c09bfc8 -25297700 -10000008 -00000000 -3c020cdf -3442dc00 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c0351cf -3463fb64 -3c150cdf -36b5dc00 -3c1651cf -36d6fb64 -1455016e -00000000 -1476016c -00000000 -3c020000 -3c030000 -3c08bfc8 -25087748 -3c09bfc8 -25297778 -10000008 -00000000 -3c0276b0 -344247e0 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03f24d -3463c540 -3c1576b0 -36b547e0 -3c16f24d -36d6c540 -14550150 -00000000 -1476014e -00000000 -3c020000 -3c030000 -3c08bfc8 -250877c0 -3c09bfc8 -252977f0 -10000008 -00000000 -3c027adc -34429690 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c035add -34638e08 -3c157adc -36b59690 -3c165add -36d68e08 -14550132 -00000000 -14760130 -00000000 -3c020000 -3c030000 -3c08bfc8 -25087838 -3c09bfc8 -25297868 -10000008 -00000000 -3c02933e -34429498 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c039417 -346309d0 -3c15933e -36b59498 -3c169417 -36d609d0 -14550114 -00000000 -14760112 -00000000 -3c020000 -3c030000 -3c08bfc8 -250878b0 -3c09bfc8 -252978e0 -10000008 -00000000 -3c02ad2d -34426f80 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03eea3 -34632370 -3c15ad2d -36b56f80 -3c16eea3 -36d62370 -145500f6 -00000000 -147600f4 -00000000 -3c020000 -3c030000 -3c08bfc8 -25087928 -3c09bfc8 -25297958 -10000008 -00000000 -3c02e502 -3442ad76 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c034a76 -3463af5c -3c15e502 -36b5ad76 -3c164a76 -36d6af5c -145500d8 -00000000 -147600d6 -00000000 -3c020000 -3c030000 -3c08bfc8 -250879a0 -3c09bfc8 -252979d0 -10000008 -00000000 -3c0233d8 -34428514 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03cc8e -34632034 -3c1533d8 -36b58514 -3c16cc8e -36d62034 -145500ba -00000000 -147600b8 -00000000 -3c020000 -3c030000 -3c08bfc8 -25087a18 -3c09bfc8 -25297a48 -10000008 -00000000 -3c02dd0c -34422b1c -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03af9b -34633df0 -3c15dd0c -36b52b1c -3c16af9b -36d63df0 -1455009c -00000000 -1476009a -00000000 -3c020000 -3c030000 -3c08bfc8 -25087a90 -3c09bfc8 -25297ac0 -10000008 -00000000 -3c024ae7 -34421680 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03dfa6 -3463fd40 -3c154ae7 -36b51680 -3c16dfa6 -36d6fd40 -1455007e -00000000 -1476007c -00000000 -3c020000 -3c030000 -3c08bfc8 -25087b08 -3c09bfc8 -25297b38 -10000008 -00000000 -3c02c6f7 -344225de -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c037acd -34636378 -3c15c6f7 -36b525de -3c167acd -36d66378 -14550060 -00000000 -1476005e -00000000 -3c020000 -3c030000 -3c08bfc8 -25087b80 -3c09bfc8 -25297bb0 -10000008 -00000000 -3c02dbe4 -3442cb34 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03b66e -34639b84 -3c15dbe4 -36b5cb34 -3c16b66e -36d69b84 -14550042 -00000000 -14760040 -00000000 -3c020000 -3c030000 -3c08bfc8 -25087bf8 -3c09bfc8 -25297c28 -10000008 -00000000 -3c025b4b -3442e384 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03edd9 -34632dd4 -3c155b4b -36b5e384 -3c16edd9 -36d62dd4 -14550024 -00000000 -14760022 -00000000 -3c020000 -3c030000 -3c08bfc8 -25087c70 -3c09bfc8 -25297ca0 -10000008 -00000000 -3c028715 -34421984 -01200008 -00000000 -10000009 -00000000 -00000000 -01000008 -00000000 -10000004 -00000000 -00000000 -3c03381f -3463d770 -3c158715 -36b51984 -3c16381f -36d6d770 -14550006 -00000000 -14760004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -26100001 -24120000 -3c15bfc8 -26b57d14 -3c16800d -02a00008 -3c08800d -100000e7 -00000000 -151600e5 -00000000 -3c15bfc8 -26b57d38 -25168123 -02a00008 -25098123 -100000de -00000000 -153600dc -00000000 -3c15bfc8 -26b57d5c -ad168ee0 -02a00008 -ad098ee0 -100000d5 -00000000 -153600d3 -00000000 -3c15bfc8 -26b57d80 -8d168ee0 -02a00008 -8d0a8ee0 -100000cc -00000000 -155600ca -00000000 -3c15bfc8 -26b57da4 -012ab021 -02a00008 -012a5821 -100000c3 -00000000 -157600c1 -00000000 -3c15bfc8 -26b57dc8 -0232b025 -02a00008 -02326025 -100000ba -00000000 -159600b8 -00000000 -3c15bfc8 -26b57dec -0253b02a -02a00008 -0253682a -100000b1 -00000000 -15b600af -00000000 -3c15bfc8 -26b57e10 -2a568011 -02a00008 -2a4e8011 -100000a8 -00000000 -15d600a6 -00000000 -3c15bfc8 -26b57e34 -2e568011 -02a00008 -2e4f8011 -1000009f -00000000 -15f6009d -00000000 -3c15bfc8 -26b57e58 -0253b02b -02a00008 -0253c02b -10000096 -00000000 -17160094 -00000000 -3c15bfc8 -26b57e7c -0012b440 -02a00008 -00124c40 -1000008d -00000000 -1536008b -00000000 -3c15bfc8 -26b57ea0 -0110b020 -02a00008 -01105020 -10000084 -00000000 -15560082 -00000000 -3c15bfc8 -26b57ec4 -22168002 -02a00008 -220b8002 -1000007b -00000000 -15760079 -00000000 -3c15bfc8 -26b57ee8 -0110b022 -02a00008 -01106022 -10000072 -00000000 -15960070 -00000000 -3c15bfc8 -26b57f0c -0110b023 -02a00008 -01106823 -10000069 -00000000 -15b60067 -00000000 -3c15bfc8 -26b57f30 -0110b024 -02a00008 -01107024 -10000060 -00000000 -15d6005e -00000000 -3c15bfc8 -26b57f54 -32168ff2 -02a00008 -320f8ff2 -10000057 -00000000 -15f60055 -00000000 -3c15bfc8 -26b57f78 -0110b027 -02a00008 -0110c027 -1000004e -00000000 -1716004c -00000000 -3c15bfc8 -26b57f9c -36168ff2 -02a00008 -36098ff2 -10000045 -00000000 -15360043 -00000000 -3c15bfc8 -26b57fc0 -0110b026 -02a00008 -01105026 -1000003c -00000000 -1556003a -00000000 -3c15bfc8 -26b57fe4 -3a168ff2 -02a00008 -3a0b8ff2 -10000033 -00000000 -15760031 -00000000 -3c15bfc9 -26b58008 -0208b004 -02a00008 -02086004 -1000002a -00000000 -15960028 -00000000 -3c15bfc9 -26b5802c -0010b203 -02a00008 -00106a03 -10000021 -00000000 -15b6001f -00000000 -3c15bfc9 -26b58050 -0208b007 -02a00008 -02087007 -10000018 -00000000 -15d60016 -00000000 -3c15bfc9 -26b58074 -0010b202 -02a00008 -00107a02 -1000000f -00000000 -15f6000d -00000000 -3c15bfc9 -26b58098 -0208b006 -02a00008 -0208c006 -10000006 -00000000 -17160004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -03e0b021 -26100001 -3c08800d -40805800 -3c170040 -40976000 -00000000 -24120001 -3c170001 -ad120000 -3c14bfc9 -269480f0 -051000af -0000000c -165700ad -00000000 -24120001 -3c14bfc9 -2694810c -065000a8 -0000000c -165700a6 -00000000 -24120002 -3c170002 -ad120000 -3c14bfc9 -26948130 -0510009f -0000000d -1657009d -00000000 -24120002 -3c14bfc9 -2694814c -06500098 -0000000d -16570096 -00000000 -24120003 -3c170003 -ad120000 -3c14bfc9 -26948180 -3c04ba03 -34844f60 -3c05b615 -34a5fd67 -0510008b -0085b820 -16570089 -00000000 -24120003 -3c14bfc9 -2694819c -06500084 -0085b820 -ad170000 -16570081 -00000000 -24120003 -ad120000 -3c14bfc9 -269481c8 -3c047fff -3484c19e -05100079 -20976512 -16570077 -00000000 -24120003 -3c14bfc9 -269481e4 -06500072 -20976512 -16570070 -00000000 -24120003 -3c14bfc9 -26948210 -3c04a85e -34847d00 -3c056b7e -34a58e36 -05100067 -0085b822 -16570065 -00000000 -24120003 -3c14bfc9 -2694822c -06500060 -0085b822 -1657005e -00000000 -24120004 -3c170004 -ad120000 -3c14bfc9 -26948250 -05100057 -8d170002 -16570055 -00000000 -24120004 -3c14bfc9 -2694826c -06500050 -8d170002 -1657004e -00000000 -24120004 -3c14bfc9 -26948288 -05100049 -85170001 -02f2001b -16570046 -00000000 -24120004 -3c14bfc9 -269482a8 -06500041 -85170001 -1657003f -00000000 -3c14bfc9 -269482c0 -0510003b -95170003 -16570039 -00000000 -24120004 -3c14bfc9 -269482dc -06500034 -95170003 -16570032 -00000000 -24120005 -3c170005 -ad120000 -3c14bfc9 -26948300 -0510002b -ad170002 -16570029 -00000000 -24120005 -3c14bfc9 -2694831c -06500024 -ad170002 -16570022 -00000000 -24120005 -3c14bfc9 -26948338 -0510001d -a5170001 -1657001b -00000000 -24120005 -3c14bfc9 -26948354 -06500016 -a5170001 -16570014 -00000000 -24120007 -3c170007 -ad120000 -3c14bfc9 -26948378 -0510000d -9e3c56aa -02f20018 -1657000a -00000000 -24120007 -3c14bfc9 -2694839c -02f20018 -06500004 -ec1ba960 -16570002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -02c0f821 -03e00008 -00000000 -00000000 -00000000 -26100001 -24120000 -3c08bd59 -350872d1 -01000011 -00001010 -3c15bd59 -36b572d1 -14550392 -00000000 -3c08b63e -350863e4 -01000011 -00001010 -3c15b63e -36b563e4 -1455038a -00000000 -3c08c290 -35082fdc -01000011 -00001010 -3c15c290 -36b52fdc -14550382 -00000000 -3c087261 -35087ff5 -01000011 -00001010 -3c157261 -36b57ff5 -1455037a -00000000 -3c083ea9 -35081bf2 -01000011 -00001010 -3c153ea9 -36b51bf2 -14550372 -00000000 -3c08dab0 -3508b4f0 -01000011 -00001010 -3c15dab0 -36b5b4f0 -1455036a -00000000 -3c088cee -3508aa08 -01000011 -00001010 -3c158cee -36b5aa08 -14550362 -00000000 -3c083ee6 -350844c0 -01000011 -00001010 -3c153ee6 -36b544c0 -1455035a -00000000 -3c089a5d -35086fe0 -01000011 -00001010 -3c159a5d -36b56fe0 -14550352 -00000000 -3c082eaf -350838e8 -01000011 -00001010 -3c152eaf -36b538e8 -1455034a -00000000 -3c08fd28 -35081a38 -01000011 -00001010 -3c15fd28 -36b51a38 -14550342 -00000000 -3c087399 -350822d0 -01000011 -00001010 -3c157399 -36b522d0 -1455033a -00000000 -3c0835e0 -35082b56 -01000011 -00001010 -3c1535e0 -36b52b56 -14550332 -00000000 -3c08ccf9 -350848ba -01000011 -00001010 -3c15ccf9 -36b548ba -1455032a -00000000 -3c082cd2 -350806d8 -01000011 -00001010 -3c152cd2 -36b506d8 -14550322 -00000000 -3c08783c -3508ec40 -01000011 -00001010 -3c15783c -36b5ec40 -1455031a -00000000 -3c083711 -3508e200 -01000011 -00001010 -3c153711 -36b5e200 -14550312 -00000000 -3c08364e -3508ca6e -01000011 -00001010 -3c15364e -36b5ca6e -1455030a -00000000 -3c0857b0 -3508d404 -01000011 -00001010 -3c1557b0 -36b5d404 -14550302 -00000000 -3c084e0a -35082670 -01000011 -00001010 -3c154e0a -36b52670 -145502fa -00000000 -3c08201e -3508c750 -01000011 -00001010 -3c15201e -36b5c750 -145502f2 -00000000 -3c086ad8 -35084ba0 -01000011 -00001010 -3c156ad8 -36b54ba0 -145502ea -00000000 -3c088607 -3508994c -01000011 -00001010 -3c158607 -36b5994c -145502e2 -00000000 -3c08d81d -350841ea -01000011 -00001010 -3c15d81d -36b541ea -145502da -00000000 -3c088428 -35084dc0 -01000011 -00001010 -3c158428 -36b54dc0 -145502d2 -00000000 -3c08dbe9 -3508f33a -01000011 -00001010 -3c15dbe9 -36b5f33a -145502ca -00000000 -3c087178 -35080f80 -01000011 -00001010 -3c157178 -36b50f80 -145502c2 -00000000 -3c080d95 -35082de0 -01000011 -00001010 -3c150d95 -36b52de0 -145502ba -00000000 -3c0816ec -35084528 -01000011 -00001010 -3c1516ec -36b54528 -145502b2 -00000000 -3c084776 -3508e0ae -01000011 -00001010 -3c154776 -36b5e0ae -145502aa -00000000 -3c089408 -35087e02 -01000011 -00001010 -3c159408 -36b57e02 -145502a2 -00000000 -3c08b36c -35089cfc -01000011 -00001010 -3c15b36c -36b59cfc -1455029a -00000000 -3c084658 -35087f08 -01000011 -00001010 -3c154658 -36b57f08 -14550292 -00000000 -3c082225 -350845bc -01000011 -00001010 -3c152225 -36b545bc -1455028a -00000000 -3c08d3c6 -350817c0 -01000011 -00001010 -3c15d3c6 -36b517c0 -14550282 -00000000 -3c082e6b -3508fd75 -01000011 -00001010 -3c152e6b -36b5fd75 -1455027a -00000000 -3c083130 -3508e930 -01000011 -00001010 -3c153130 -36b5e930 -14550272 -00000000 -3c08ffca -350805f8 -01000011 -00001010 -3c15ffca -36b505f8 -1455026a -00000000 -3c081026 -350893fa -01000011 -00001010 -3c151026 -36b593fa -14550262 -00000000 -3c08d3fe -35083f14 -01000011 -00001010 -3c15d3fe -36b53f14 -1455025a -00000000 -3c088b1d -3508e170 -01000011 -00001010 -3c158b1d -36b5e170 -14550252 -00000000 -3c08956a -3508769b -01000011 -00001010 -3c15956a -36b5769b -1455024a -00000000 -3c08ace6 -35086bcc -01000011 -00001010 -3c15ace6 -36b56bcc -14550242 -00000000 -3c08d0fd -350819f0 -01000011 -00001010 -3c15d0fd -36b519f0 -1455023a -00000000 -3c08ed13 -3508df18 -01000011 -00001010 -3c15ed13 -36b5df18 -14550232 -00000000 -3c08a1ba -3508d7a6 -01000011 -00001010 -3c15a1ba -36b5d7a6 -1455022a -00000000 -3c082ad7 -350814b0 -01000011 -00001010 -3c152ad7 -36b514b0 -14550222 -00000000 -3c081417 -35082b70 -01000011 -00001010 -3c151417 -36b52b70 -1455021a -00000000 -3c087cff -35084e80 -01000011 -00001010 -3c157cff -36b54e80 -14550212 -00000000 -3c08171f -350865d8 -01000011 -00001010 -3c15171f -36b565d8 -1455020a -00000000 -3c08cb7c -35086c00 -01000011 -00001010 -3c15cb7c -36b56c00 -14550202 -00000000 -3c089d1b -35085482 -01000011 -00001010 -3c159d1b -36b55482 -145501fa -00000000 -3c081445 -3508c71c -01000011 -00001010 -3c151445 -36b5c71c -145501f2 -00000000 -3c080961 -35080836 -01000011 -00001010 -3c150961 -36b50836 -145501ea -00000000 -3c087815 -3508eb60 -01000011 -00001010 -3c157815 -36b5eb60 -145501e2 -00000000 -3c0870fa -35082370 -01000011 -00001010 -3c1570fa -36b52370 -145501da -00000000 -3c089130 -35084650 -01000011 -00001010 -3c159130 -36b54650 -145501d2 -00000000 -3c080182 -3508aca8 -01000011 -00001010 -3c150182 -36b5aca8 -145501ca -00000000 -3c08ac51 -35089e50 -01000011 -00001010 -3c15ac51 -36b59e50 -145501c2 -00000000 -3c08f2b1 -35088ec0 -01000011 -00001010 -3c15f2b1 -36b58ec0 -145501ba -00000000 -3c08b2d1 -35087089 -01000011 -00001010 -3c15b2d1 -36b57089 -145501b2 -00000000 -3c08892a -3508fd04 -01000011 -00001010 -3c15892a -36b5fd04 -145501aa -00000000 -3c0879f9 -35086348 -01000011 -00001010 -3c1579f9 -36b56348 -145501a2 -00000000 -3c08e4ad -35083ddd -01000011 -00001010 -3c15e4ad -36b53ddd -1455019a -00000000 -3c081508 -3508b690 -01000011 -00001010 -3c151508 -36b5b690 -14550192 -00000000 -3c08dcae -35085c80 -01000011 -00001010 -3c15dcae -36b55c80 -1455018a -00000000 -3c084d20 -3508d118 -01000011 -00001010 -3c154d20 -36b5d118 -14550182 -00000000 -3c087c0d -3508b120 -01000011 -00001010 -3c157c0d -36b5b120 -1455017a -00000000 -3c085064 -3508e560 -01000011 -00001010 -3c155064 -36b5e560 -14550172 -00000000 -3c084c15 -3508f2d5 -01000011 -00001010 -3c154c15 -36b5f2d5 -1455016a -00000000 -3c08c46d -3508ac00 -01000011 -00001010 -3c15c46d -36b5ac00 -14550162 -00000000 -3c0813bf -350878e0 -01000011 -00001010 -3c1513bf -36b578e0 -1455015a -00000000 -3c08801d -3508a900 -01000011 -00001010 -3c15801d -36b5a900 -14550152 -00000000 -3c080461 -35087750 -01000011 -00001010 -3c150461 -36b57750 -1455014a -00000000 -3c08a564 -3508430b -01000011 -00001010 -3c15a564 -36b5430b -14550142 -00000000 -3c085666 -35082adc -01000011 -00001010 -3c155666 -36b52adc -1455013a -00000000 -3c085331 -35087267 -01000011 -00001010 -3c155331 -36b57267 -14550132 -00000000 -3c08dcc2 -3508f8d6 -01000011 -00001010 -3c15dcc2 -36b5f8d6 -1455012a -00000000 -3c087f9b -350808c0 -01000011 -00001010 -3c157f9b -36b508c0 -14550122 -00000000 -3c082aea -3508842c -01000011 -00001010 -3c152aea -36b5842c -1455011a -00000000 -3c082b3e -35085458 -01000011 -00001010 -3c152b3e -36b55458 -14550112 -00000000 -3c08df41 -35080fc0 -01000011 -00001010 -3c15df41 -36b50fc0 -1455010a -00000000 -3c08c20e -35085b9c -01000011 -00001010 -3c15c20e -36b55b9c -14550102 -00000000 -3c0869b5 -3508f0d6 -01000011 -00001010 -3c1569b5 -36b5f0d6 -145500fa -00000000 -3c082bfd -350857a6 -01000011 -00001010 -3c152bfd -36b557a6 -145500f2 -00000000 -3c08a9bc -35081acc -01000011 -00001010 -3c15a9bc -36b51acc -145500ea -00000000 -3c08e8cd -3508c640 -01000011 -00001010 -3c15e8cd -36b5c640 -145500e2 -00000000 -3c080ee2 -3508a818 -01000011 -00001010 -3c150ee2 -36b5a818 -145500da -00000000 -3c08cb71 -3508a800 -01000011 -00001010 -3c15cb71 -36b5a800 -145500d2 -00000000 -3c0809ed -3508f428 -01000011 -00001010 -3c1509ed -36b5f428 -145500ca -00000000 -3c08ed82 -35083800 -01000011 -00001010 -3c15ed82 -36b53800 -145500c2 -00000000 -3c08d93a -3508b3f8 -01000011 -00001010 -3c15d93a -36b5b3f8 -145500ba -00000000 -3c08afb6 -3508e9c0 -01000011 -00001010 -3c15afb6 -36b5e9c0 -145500b2 -00000000 -3c08a293 -35087eb0 -01000011 -00001010 -3c15a293 -36b57eb0 -145500aa -00000000 -3c08c36b -35084870 -01000011 -00001010 -3c15c36b -36b54870 -145500a2 -00000000 -3c08ea86 -350833d0 -01000011 -00001010 -3c15ea86 -36b533d0 -1455009a -00000000 -3c084f81 -35084438 -01000011 -00001010 -3c154f81 -36b54438 -14550092 -00000000 -3c087ef5 -350898e8 -01000011 -00001010 -3c157ef5 -36b598e8 -1455008a -00000000 -3c081c2d -3508e7d0 -01000011 -00001010 -3c151c2d -36b5e7d0 -14550082 -00000000 -3c08ccfd -3508fbc9 -01000011 -00001010 -3c15ccfd -36b5fbc9 -1455007a -00000000 -3c08d9d2 -3508d81a -01000011 -00001010 -3c15d9d2 -36b5d81a -14550072 -00000000 -3c0821fa -3508397c -01000011 -00001010 -3c1521fa -36b5397c -1455006a -00000000 -3c083d1c -3508f92c -01000011 -00001010 -3c153d1c -36b5f92c -14550062 -00000000 -3c08137a -3508f739 -01000011 -00001010 -3c15137a -36b5f739 -1455005a -00000000 -3c089d32 -35085d28 -01000011 -00001010 -3c159d32 -36b55d28 -14550052 -00000000 -3c088bc7 -350884f8 -01000011 -00001010 -3c158bc7 -36b584f8 -1455004a -00000000 -3c08267e -3508ae80 -01000011 -00001010 -3c15267e -36b5ae80 -14550042 -00000000 -3c08abfa -3508c0ca -01000011 -00001010 -3c15abfa -36b5c0ca -1455003a -00000000 -3c087a28 -35086b6c -01000011 -00001010 -3c157a28 -36b56b6c -14550032 -00000000 -3c08741a -3508c718 -01000011 -00001010 -3c15741a -36b5c718 -1455002a -00000000 -3c080a0d -35084930 -01000011 -00001010 -3c150a0d -36b54930 -14550022 -00000000 -3c08c86e -3508c474 -01000011 -00001010 -3c15c86e -36b5c474 -1455001a -00000000 -3c0807fe -3508cfd8 -01000011 -00001010 -3c1507fe -36b5cfd8 -14550012 -00000000 -3c088474 -35087a80 -01000011 -00001010 -3c158474 -36b57a80 -1455000a -00000000 -24080000 -01000011 -00001010 -24150000 -14550004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -26100001 -24120000 -3c08fb26 -35083d10 -3c03fb26 -346329a6 -2502ec96 -14430352 -00000000 -3c087ec1 -35080538 -3c037ec1 -34630ece -25020996 -1443034b -00000000 -3c080e50 -35085a00 -3c030e50 -34631118 -2502b718 -14430344 -00000000 -3c08a522 -3508b9d7 -3c03a522 -3463815b -2502c784 -1443033d -00000000 -3c089b45 -3508d7c0 -3c039b45 -34638e92 -2502b6d2 -14430336 -00000000 -3c08a4c6 -350855b8 -3c03a4c6 -3463021a -2502ac62 -1443032f -00000000 -3c08a52b -3508697a -3c03a52b -34631ad3 -2502b159 -14430328 -00000000 -3c08dcc8 -35082666 -3c03dcc8 -34638dc1 -2502675b -14430321 -00000000 -3c08ab24 -3508a3c3 -3c03ab24 -3463aed2 -25020b0f -1443031a -00000000 -3c08db65 -35080604 -3c03db64 -3463aff3 -2502a9ef -14430313 -00000000 -3c087a30 -35085380 -3c037a30 -34634cf4 -2502f974 -1443030c -00000000 -3c086baf -3508ed18 -3c036baf -3463c0b6 -2502d39e -14430305 -00000000 -3c0876de -35081bd0 -3c0376de -34631e2d -2502025d -144302fe -00000000 -3c08c330 -3508d268 -3c03c331 -34633b7a -25026912 -144302f7 -00000000 -3c082d27 -350801f1 -3c032d27 -346342e0 -250240ef -144302f0 -00000000 -3c085454 -3508990a -3c035454 -3463d083 -25023779 -144302e9 -00000000 -3c0821b8 -3508cf00 -3c0321b8 -346377f8 -2502a8f8 -144302e2 -00000000 -3c0844e3 -35081f12 -3c0344e2 -3463d292 -2502b380 -144302db -00000000 -3c0840f8 -3508f8f8 -3c0340f8 -3463b0a8 -2502b7b0 -144302d4 -00000000 -3c08d500 -350873d0 -3c03d500 -3463d6c7 -250262f7 -144302cd -00000000 -3c085226 -3508e1b0 -3c035226 -3463a6cc -2502c51c -144302c6 -00000000 -3c082514 -35088680 -3c032514 -346383c0 -2502fd40 -144302bf -00000000 -3c08afd5 -35085a35 -3c03afd5 -34630871 -2502ae3c -144302b8 -00000000 -3c08fab9 -3508b6bf -3c03fab9 -3463dc8b -250225cc -144302b1 -00000000 -3c08ab40 -3508e400 -3c03ab41 -346317b8 -250233b8 -144302aa -00000000 -3c083ee8 -35087380 -3c033ee8 -34635c26 -2502e8a6 -144302a3 -00000000 -3c082b0b -3508f1ba -3c032b0c -34631eaa -25022cf0 -1443029c -00000000 -3c0802b5 -3508b620 -3c0302b5 -34637c6b -2502c64b -14430295 -00000000 -3c08e61d -3508f57a -3c03e61e -346365e2 -25027068 -1443028e -00000000 -3c08992f -3508982c -3c03992f -346339f4 -2502a1c8 -14430287 -00000000 -3c08193a -3508e478 -3c03193a -34638bab -2502a733 -14430280 -00000000 -3c08b755 -35084a70 -3c03b755 -346370aa -2502263a -14430279 -00000000 -3c08e664 -35084fa0 -3c03e664 -3463bf18 -25026f78 -14430272 -00000000 -3c08deff -350813d4 -3c03deff -3463519b -25023dc7 -1443026b -00000000 -3c085c07 -3508037c -3c035c07 -346341d2 -25023e56 -14430264 -00000000 -3c08c06c -350854f0 -3c03c06c -346317a0 -2502c2b0 -1443025d -00000000 -3c08f5f6 -3508a31c -3c03f5f6 -3463aa1c -25020700 -14430256 -00000000 -3c088da0 -35088d64 -3c038da1 -34630068 -25027304 -1443024f -00000000 -3c082f39 -35088330 -3c032f39 -3463a9b0 -25022680 -14430248 -00000000 -3c0816b4 -35084d6e -3c0316b3 -3463dac6 -25028d58 -14430241 -00000000 -3c08a79f -350887b2 -3c03a79f -34635941 -2502d18f -1443023a -00000000 -3c0852a8 -3508369a -3c0352a8 -3463ad3a -250276a0 -14430233 -00000000 -3c0818c0 -3508f00e -3c0318c0 -3463af9c -2502bf8e -1443022c -00000000 -3c0833fb -3508b9c0 -3c0333fb -34637325 -2502b965 -14430225 -00000000 -3c0870c8 -3508b0f7 -3c0370c8 -34636f59 -2502be62 -1443021e -00000000 -3c083f01 -350894b4 -3c033f02 -34631388 -25027ed4 -14430217 -00000000 -3c08c5c1 -350866c0 -3c03c5c1 -3463dcd6 -25027616 -14430210 -00000000 -3c089edd -35087138 -3c039edd -34639af8 -250229c0 -14430209 -00000000 -3c08a608 -3508d4a8 -3c03a608 -34635bc3 -2502871b -14430202 -00000000 -3c080e35 -3508d674 -3c030e35 -3463db4a -250204d6 -144301fb -00000000 -3c080b3a -350817e8 -3c030b39 -3463ebe0 -2502d3f8 -144301f4 -00000000 -3c08fc4b -35084e00 -3c03fc4b -34630b0a -2502bd0a -144301ed -00000000 -3c08cd35 -35080818 -3c03cd34 -3463bffc -2502b7e4 -144301e6 -00000000 -3c086729 -35086578 -3c036729 -3463c8a8 -25026330 -144301df -00000000 -3c08e5b1 -3508f42a -3c03e5b2 -34630f8e -25021b64 -144301d8 -00000000 -3c08d814 -3508f8b8 -3c03d815 -34632812 -25022f5a -144301d1 -00000000 -3c08b0f4 -350845a2 -3c03b0f4 -34637dba -25023818 -144301ca -00000000 -3c089764 -35084268 -3c039764 -3463aa70 -25026808 -144301c3 -00000000 -3c082ce4 -350884d1 -3c032ce4 -3463376b -2502b29a -144301bc -00000000 -3c088a3b -3508eb89 -3c038a3b -3463aa69 -2502bee0 -144301b5 -00000000 -3c083e64 -3508a422 -3c033e64 -34639c1c -2502f7fa -144301ae -00000000 -3c08363f -35085f5a -3c03363f -3463cdfe -25026ea4 -144301a7 -00000000 -3c089b14 -3508a354 -3c039b14 -3463c414 -250220c0 -144301a0 -00000000 -3c082273 -35083f48 -3c032273 -346333e6 -2502f49e -14430199 -00000000 -3c08018b -35088160 -3c03018b -3463639e -2502e23e -14430192 -00000000 -3c08584e -350880ae -3c03584e -34637cad -2502fbff -1443018b -00000000 -3c089fe3 -35080c58 -3c039fe2 -34639294 -2502863c -14430184 -00000000 -3c08045a -3508a874 -3c03045a -34632c8c -25028418 -1443017d -00000000 -3c08f890 -3508cfc0 -3c03f890 -3463b12c -2502e16c -14430176 -00000000 -3c08aebd -3508c18e -3c03aebd -3463691e -2502a790 -1443016f -00000000 -3c08d049 -350849c0 -3c03d049 -346364b8 -25021af8 -14430168 -00000000 -3c087494 -35083d80 -3c037494 -3463877c -250249fc -14430161 -00000000 -3c08383e -3508cfd8 -3c03383e -3463a9d0 -2502d9f8 -1443015a -00000000 -3c083d2d -3508ae08 -3c033d2e -346329c6 -25027bbe -14430153 -00000000 -3c08f399 -35082fc0 -3c03f399 -3463a0a8 -250270e8 -1443014c -00000000 -3c08a774 -35089c20 -3c03a774 -34637b50 -2502df30 -14430145 -00000000 -3c089255 -35086ce8 -3c039255 -3463b3c0 -250246d8 -1443013e -00000000 -3c08aa13 -35089e00 -3c03aa13 -3463478a -2502a98a -14430137 -00000000 -3c08d0a2 -3508ede0 -3c03d0a3 -3463390e -25024b2e -14430130 -00000000 -3c08c1ac -3508e9cc -3c03c1ad -34633107 -2502473b -14430129 -00000000 -3c08dbd9 -3508f2a0 -3c03dbda -34631620 -25022380 -14430122 -00000000 -3c080f65 -35080db8 -3c030f65 -3463494a -25023b92 -1443011b -00000000 -3c08550f -35081e96 -3c03550e -3463da0a -2502bb74 -14430114 -00000000 -3c08d1ce -350832b8 -3c03d1cd -3463ce38 -25029b80 -1443010d -00000000 -3c083afc -35082d2a -3c033afc -34638a85 -25025d5b -14430106 -00000000 -3c081fe5 -3508c9fc -3c031fe5 -3463cbf0 -250201f4 -144300ff -00000000 -3c08c3ce -3508865a -3c03c3ce -346341f9 -2502bb9f -144300f8 -00000000 -3c0878a0 -3508a5c0 -3c0378a0 -34635538 -2502af78 -144300f1 -00000000 -3c087035 -35089bfe -3c037035 -3463a2f8 -250206fa -144300ea -00000000 -3c084320 -3508a31e -3c034320 -346326ea -250283cc -144300e3 -00000000 -3c0859df -3508ac54 -3c0359e0 -34632970 -25027d1c -144300dc -00000000 -3c0845d8 -35087ca0 -3c0345d8 -34635620 -2502d980 -144300d5 -00000000 -3c08049e -3508c678 -3c03049e -34634f2e -250288b6 -144300ce -00000000 -3c080c88 -3508f0c8 -3c030c89 -34631b3a -25022a72 -144300c7 -00000000 -3c088a25 -35080cd0 -3c038a24 -3463c210 -2502b540 -144300c0 -00000000 -3c08ae82 -350825b3 -3c03ae81 -3463ebdf -2502c62c -144300b9 -00000000 -3c08d8a7 -350848bc -3c03d8a7 -34631fb5 -2502d6f9 -144300b2 -00000000 -3c0875f0 -3508666e -3c0375f0 -34638d36 -250226c8 -144300ab -00000000 -3c08257c -3508f136 -3c03257c -3463c17f -2502d049 -144300a4 -00000000 -3c08c040 -3508fc10 -3c03c041 -34637938 -25027d28 -1443009d -00000000 -3c085ac0 -3508c900 -3c035ac1 -3463405d -2502775d -14430096 -00000000 -3c08aa1e -350808d6 -3c03aa1e -34632b63 -2502228d -1443008f -00000000 -3c08dca9 -35080938 -3c03dca9 -346375d0 -25026c98 -14430088 -00000000 -3c085794 -35085512 -3c035794 -346342ba -2502eda8 -14430081 -00000000 -3c08d5c7 -3508d9c0 -3c03d5c7 -34637f7f -2502a5bf -1443007a -00000000 -3c08e228 -35087446 -3c03e228 -3463a6aa -25023264 -14430073 -00000000 -3c08ef90 -3508df60 -3c03ef91 -3463518b -2502722b -1443006c -00000000 -3c08750b -35087770 -3c03750b -34637770 -25020000 -14430065 -00000000 -3c0886ff -3508d3dc -3c0386ff -3463d3dc -25020000 -1443005e -00000000 -3c08c647 -35089348 -3c03c647 -34639348 -25020000 -14430057 -00000000 -3c08feb9 -3508209d -3c03feb9 -3463209d -25020000 -14430050 -00000000 -3c08f8ca -3508f9a4 -3c03f8ca -3463f9a4 -25020000 -14430049 -00000000 -3c08ef30 -3508ffee -3c03ef30 -3463ffee -25020000 -14430042 -00000000 -3c08850e -350819af -3c03850e -346319af -25020000 -1443003b -00000000 -3c08fa5c -3508b710 -3c03fa5c -3463b710 -25020000 -14430034 -00000000 -3c08394e -35085640 -3c03394e -34635640 -25020000 -1443002d -00000000 -3c0849ce -3508ac94 -3c0349ce -3463ac94 -25020000 -14430026 -00000000 -3c0823ae -3508136b -3c0323ae -3463136b -25020000 -1443001f -00000000 -3c08f650 -3508e782 -3c03f650 -3463e782 -25020000 -14430018 -00000000 -24080000 -240304a0 -250204a0 -14430013 -00000000 -24080000 -2403d6d9 -2502d6d9 -1443000e -00000000 -24080000 -2403cdc8 -2502cdc8 -14430009 -00000000 -24080000 -24030000 -25020000 -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -26100001 -24120000 -3c08ad9c -3508c00e -3c0938b7 -3529ec24 -3c034240 -346313d1 -01091027 -14430a27 -00000000 -3c08668d -35085db0 -3c09a094 -35295bf0 -3c031962 -3463a00f -01091027 -14430a1e -00000000 -3c086d83 -35080f90 -3c0966b3 -35291460 -3c03904c -3463e00f -01091027 -14430a15 -00000000 -3c086008 -3508f35f -3c0954ae -352981fa -3c038b51 -34630c00 -01091027 -14430a0c -00000000 -3c08acc8 -3508f2d2 -3c095149 -35291760 -3c030236 -3463080d -01091027 -14430a03 -00000000 -3c082f80 -350839e0 -3c09f4ac -35296718 -3c030053 -34638007 -01091027 -144309fa -00000000 -3c08dc9e -3508ddc0 -3c091a3a -3529ebc8 -3c032141 -34630037 -01091027 -144309f1 -00000000 -3c08fa40 -3508f126 -3c09fa38 -35292538 -3c030587 -34630ac1 -01091027 -144309e8 -00000000 -3c080603 -35083064 -3c09a758 -3529b5c0 -3c0358a4 -34634a1b -01091027 -144309df -00000000 -3c088d0f -35087094 -3c0913b7 -3529b000 -3c036040 -34630f6b -01091027 -144309d6 -00000000 -3c08596e -3508aab2 -3c099e2f -35296d2f -3c032090 -34631040 -01091027 -144309cd -00000000 -3c08336f -3508f361 -3c090132 -3529a370 -3c03cc80 -34630c8e -01091027 -144309c4 -00000000 -3c08881c -35088d00 -3c0980ed -35293fa3 -3c037702 -3463405c -01091027 -144309bb -00000000 -3c086b30 -35084d15 -3c094f80 -3529c3e0 -3c03904f -3463300a -01091027 -144309b2 -00000000 -3c08efc4 -3508d858 -3c09761c -3529c242 -3c030023 -346325a5 -01091027 -144309a9 -00000000 -3c080e2e -3508bb18 -3c09e32f -352900c0 -3c0310d0 -34634427 -01091027 -144309a0 -00000000 -3c08362f -35087100 -3c097ea3 -35291a1c -3c038150 -346384e3 -01091027 -14430997 -00000000 -3c08edd9 -35081c90 -3c09024b -35299692 -3c031024 -3463616d -01091027 -1443098e -00000000 -3c0859a8 -35085bd4 -3c098646 -35297170 -3c032011 -3463840b -01091027 -14430985 -00000000 -3c086b10 -3508f624 -3c090a4b -352976d8 -3c0394a4 -34630903 -01091027 -1443097c -00000000 -3c089f73 -35080fc0 -3c09c1bf -3529fac1 -3c032000 -3463003e -01091027 -14430973 -00000000 -3c08ef12 -35082cf6 -3c0907a0 -35295f82 -3c03104d -34638009 -01091027 -1443096a -00000000 -3c085aa2 -35083f84 -3c097624 -352934b0 -3c038159 -3463c04b -01091027 -14430961 -00000000 -3c086508 -350822f1 -3c0906c0 -3529d750 -3c039837 -3463080e -01091027 -14430958 -00000000 -3c085aae -35085308 -3c090433 -3529ae98 -3c03a140 -34630067 -01091027 -1443094f -00000000 -3c0827e9 -3508d2c8 -3c098aca -35290a5c -3c035014 -34632523 -01091027 -14430946 -00000000 -3c08440b -35085a10 -3c092eb5 -3529c542 -3c039140 -346320ad -01091027 -1443093d -00000000 -3c087417 -3508c21f -3c095cc0 -352936a0 -3c038328 -34630940 -01091027 -14430934 -00000000 -3c08661f -35089c50 -3c09724f -3529b448 -3c0389a0 -346343a7 -01091027 -1443092b -00000000 -3c082843 -3508655c -3c09708a -35293150 -3c038734 -34638aa3 -01091027 -14430922 -00000000 -3c08a8cc -35083958 -3c096a77 -352968ae -3c031500 -34638601 -01091027 -14430919 -00000000 -3c087883 -350828c0 -3c098f03 -3529da20 -3c03007c -3463051f -01091027 -14430910 -00000000 -3c085964 -35088e68 -3c095a09 -35296666 -3c03a492 -34631191 -01091027 -14430907 -00000000 -3c0805fb -3508883c -3c09444a -3529da50 -3c03ba04 -34632583 -01091027 -144308fe -00000000 -3c08b23d -3508a7d4 -3c0924ae -35299280 -3c034940 -3463482b -01091027 -144308f5 -00000000 -3c08027e -3508d780 -3c096389 -3529c8c2 -3c039c00 -3463203d -01091027 -144308ec -00000000 -3c089042 -35089b10 -3c09ced7 -3529927c -3c032128 -34636483 -01091027 -144308e3 -00000000 -3c08a236 -35086e27 -3c091fce -35295203 -3c034001 -346381d8 -01091027 -144308da -00000000 -3c081271 -350831e0 -3c097586 -3529f5c4 -3c038808 -34630a1b -01091027 -144308d1 -00000000 -3c088f51 -35088a60 -3c092e0f -3529ead0 -3c0350a0 -3463150f -01091027 -144308c8 -00000000 -3c0825a5 -35088614 -3c09de20 -35298f4a -3c03005a -346370a1 -01091027 -144308bf -00000000 -3c089c17 -3508a0c0 -3c090d90 -35298fc3 -3c036268 -3463503c -01091027 -144308b6 -00000000 -3c083d90 -3508eb80 -3c09b4f8 -3529ea91 -3c034207 -3463146e -01091027 -144308ad -00000000 -3c08594c -35084c50 -3c09f13b -3529ea0c -3c030680 -346311a3 -01091027 -144308a4 -00000000 -3c08a66f -35085f40 -3c090ab4 -35294d08 -3c035100 -3463a0b7 -01091027 -1443089b -00000000 -3c08cdd1 -3508b1c8 -3c09356e -3529e9fb -3c030200 -34630604 -01091027 -14430892 -00000000 -3c080a28 -350884bc -3c090bf1 -35290114 -3c03f406 -34637a43 -01091027 -14430889 -00000000 -3c08374f -3508e71c -3c0980e8 -35291eac -3c034810 -34630043 -01091027 -14430880 -00000000 -3c084efe -350813f0 -3c09984c -3529a1c6 -3c032101 -34634c09 -01091027 -14430877 -00000000 -3c08512f -35087b26 -3c09408c -3529ab08 -3c03ae50 -346304d1 -01091027 -1443086e -00000000 -3c08ed05 -3508bffa -3c09fc42 -352998ba -3c0302b8 -34634005 -01091027 -14430865 -00000000 -3c0819c2 -3508050e -3c09c4eb -35293ea8 -3c032214 -3463c051 -01091027 -1443085c -00000000 -3c08ba04 -35081f3c -3c09ac1f -352954a0 -3c0341e0 -3463a043 -01091027 -14430853 -00000000 -3c08cd2b -3508cc88 -3c09f2c0 -3529cddd -3c030014 -34633222 -01091027 -1443084a -00000000 -3c08a8bf -3508eb90 -3c091e93 -3529d54f -3c034140 -34630020 -01091027 -14430841 -00000000 -3c0853c0 -350881f8 -3c099b9b -3529c370 -3c032424 -34633c07 -01091027 -14430838 -00000000 -3c08fa01 -3508abaa -3c0962ee -35298d90 -3c030510 -34635045 -01091027 -1443082f -00000000 -3c08db0e -3508e4c4 -3c09a03a -35292b2f -3c0304c1 -34631010 -01091027 -14430826 -00000000 -3c0895e9 -350887f3 -3c09f73f -35290968 -3c030800 -34637004 -01091027 -1443081d -00000000 -3c08a70c -3508c140 -3c090c1b -3529895c -3c0350e0 -346336a3 -01091027 -14430814 -00000000 -3c0803d1 -3508b3cc -3c09b101 -3529c000 -3c034c2e -34630c33 -01091027 -1443080b -00000000 -3c08df0d -3508a114 -3c09231a -35291e40 -3c0300e0 -346340ab -01091027 -14430802 -00000000 -3c089e45 -3508d49e -3c094d0a -3529831c -3c0320b0 -34632861 -01091027 -144307f9 -00000000 -3c08b7c6 -3508c72c -3c09c044 -3529a700 -3c030839 -346318d3 -01091027 -144307f0 -00000000 -3c08243a -350857d6 -3c09b6d6 -3529fd04 -3c034901 -34630029 -01091027 -144307e7 -00000000 -3c082043 -3508e6b4 -3c09f6ab -35293e00 -3c030914 -3463014b -01091027 -144307de -00000000 -3c08b1ee -35089c00 -3c091460 -3529ff1c -3c034a11 -346300e3 -01091027 -144307d5 -00000000 -3c08feae -3508ef69 -3c0999eb -35295628 -3c030010 -34630096 -01091027 -144307cc -00000000 -3c08fc6e -350860d0 -3c0925ce -3529d000 -3c030211 -34630f2f -01091027 -144307c3 -00000000 -3c08292f -3508ef47 -3c09ccf3 -35299d30 -3c031200 -34630088 -01091027 -144307ba -00000000 -3c08b972 -3508576d -3c096b5d -3529e304 -3c030480 -34630892 -01091027 -144307b1 -00000000 -3c08f2c8 -35083a02 -3c09c8ba -352976ad -3c030505 -34638150 -01091027 -144307a8 -00000000 -3c087fac -35089b0a -3c0928a5 -3529555c -3c038052 -346320a1 -01091027 -1443079f -00000000 -3c08fb82 -350806d0 -3c0937cb -3529e2b0 -3c030034 -3463190f -01091027 -14430796 -00000000 -3c080ce1 -35085bc0 -3c09833c -35298465 -3c037002 -3463201a -01091027 -1443078d -00000000 -3c08d64b -3508fe58 -3c09c0ce -352986c0 -3c032930 -34630127 -01091027 -14430784 -00000000 -3c0850c6 -35087f78 -3c09f7da -35299c80 -3c030821 -34630007 -01091027 -1443077b -00000000 -3c083e0a -35088464 -3c090256 -35292e56 -3c03c1a1 -34635189 -01091027 -14430772 -00000000 -3c08a86a -350803c9 -3c09d304 -35297b0c -3c030491 -34638432 -01091027 -14430769 -00000000 -3c084cc4 -350808c0 -3c0973c2 -35296f1c -3c038039 -34639023 -01091027 -14430760 -00000000 -3c083ddb -3508b284 -3c097dca -35291ea2 -3c038224 -34634159 -01091027 -14430757 -00000000 -3c0882f1 -35084014 -3c09654b -3529ce00 -3c031804 -346331eb -01091027 -1443074e -00000000 -3c08d68f -35081ca1 -3c09dbed -3529cc18 -3c032010 -34632346 -01091027 -14430745 -00000000 -3c08ad32 -3508d5e2 -3c09e5d1 -3529d240 -3c03120c -3463281d -01091027 -1443073c -00000000 -3c08f339 -350887b4 -3c091fd4 -35299a00 -3c030002 -3463604b -01091027 -14430733 -00000000 -3c08fa57 -3508bb00 -3c0916da -35293978 -3c030120 -34634487 -01091027 -1443072a -00000000 -3c080105 -35081660 -3c093f52 -3529af3b -3c03c0a8 -34634084 -01091027 -14430721 -00000000 -3c085f7c -350877c4 -3c0921c1 -3529d67c -3c038002 -34630803 -01091027 -14430718 -00000000 -3c08c609 -3508d248 -3c094c7f -35293a06 -3c033180 -346305b1 -01091027 -1443070f -00000000 -3c08993a -35089cee -3c0956f9 -3529eb3d -3c032004 -01091027 -14430707 -00000000 -3c0895f4 -3508f59d -3c09fbe6 -35298ad4 -3c030009 -34630022 -01091027 -144306fe -00000000 -3c08ed68 -35085948 -3c0992d9 -352914b0 -3c030006 -3463a207 -01091027 -144306f5 -00000000 -3c08d75b -3508fb80 -3c093f9b -35298c20 -3c030024 -3463005f -01091027 -144306ec -00000000 -3c088468 -35080288 -3c09e61d -35295ed2 -3c031982 -3463a125 -01091027 -144306e3 -00000000 -3c080c03 -3508c4c0 -3c09b226 -352982c4 -3c0341d8 -3463393b -01091027 -144306da -00000000 -3c08ebcd -35081e3c -3c09b44d -3529cb9e -3c030032 -34632041 -01091027 -144306d1 -00000000 -3c083033 -350861cc -3c09d760 -352968c0 -3c03088c -34639633 -01091027 -144306c8 -00000000 -3c0888c9 -35087c00 -3c092235 -352926b4 -3c035502 -3463814b -01091027 -144306bf -00000000 -3c080750 -3508b298 -3c093132 -3529df60 -3c03c88d -34630007 -01091027 -144306b6 -00000000 -3c08f75b -350864b5 -3c094346 -35296818 -3c0308a0 -34639342 -01091027 -144306ad -00000000 -3c08de4b -35085be8 -3c090b37 -35294ff6 -3c032080 -3463a001 -01091027 -144306a4 -00000000 -3c0860a3 -35084a40 -3c09c920 -35298ee0 -3c03165c -3463311f -01091027 -1443069b -00000000 -3c08bf72 -35089976 -3c0918d5 -3529decc -3c034008 -34632001 -01091027 -14430692 -00000000 -3c08f431 -35083902 -3c09a2af -35292800 -3c030940 -3463c6fd -01091027 -14430689 -00000000 -3c084e8b -35081960 -3c09aeff -35290e95 -3c031100 -3463e00a -01091027 -14430680 -00000000 -3c087ea5 -3508628a -3c097312 -3529a904 -3c038048 -34631471 -01091027 -14430677 -00000000 -3c084d2d -35088a38 -3c091502 -35291a4c -3c03a2d0 -34636583 -01091027 -1443066e -00000000 -3c08c398 -3508a340 -3c09e2d1 -3529f800 -3c031c26 -346304bf -01091027 -14430665 -00000000 -3c088388 -35082a66 -3c09dd3a -35291a54 -3c032045 -3463c589 -01091027 -1443065c -00000000 -3c087048 -350892e7 -3c09ae2e -3529d910 -3c030191 -34632408 -01091027 -14430653 -00000000 -3c0818d6 -35086130 -3c099075 -3529b486 -3c036708 -34630a49 -01091027 -1443064a -00000000 -3c08935e -35081e10 -3c09c861 -35299b28 -3c032480 -346360c7 -01091027 -14430641 -00000000 -3c08fd9c -35082bba -3c096234 -3529d118 -3c030043 -34630445 -01091027 -14430638 -00000000 -3c085ef3 -350886e4 -3c098b56 -3529a080 -3c032008 -3463591b -01091027 -1443062f -00000000 -3c083b8a -35083c4c -3c09cabb -35295d00 -3c030444 -346382b3 -01091027 -14430626 -00000000 -3c0828e0 -35080790 -3c09efee -3529d2f8 -3c031011 -34632807 -01091027 -1443061d -00000000 -3c08a4c2 -35089deb -3c094ad4 -352951d0 -3c031129 -34632204 -01091027 -14430614 -00000000 -3c082923 -35083f52 -3c09f8ba -3529ab00 -3c030644 -346340ad -01091027 -1443060b -00000000 -3c080798 -3508b15e -3c0963b5 -3529ae3f -3c039842 -34634080 -01091027 -14430602 -00000000 -3c086c8c -35086148 -3c09ea9a -35296100 -3c031161 -34639eb7 -01091027 -144305f9 -00000000 -3c08dec9 -3508b2cc -3c0959fb -3529d249 -3c032004 -34630d32 -01091027 -144305f0 -00000000 -3c088b48 -35084934 -3c09aa27 -3529ed6c -3c035490 -34631283 -01091027 -144305e7 -00000000 -3c082eaa -3508d5e7 -3c09f494 -3529df80 -3c030141 -34632018 -01091027 -144305de -00000000 -3c08d171 -3508b190 -3c09c428 -3529fa08 -3c032a86 -34630467 -01091027 -144305d5 -00000000 -3c08101c -35088734 -3c097846 -35297184 -3c0387a1 -3463084b -01091027 -144305cc -00000000 -3c082a7e -3508e580 -3c098660 -35298538 -3c035181 -34631a47 -01091027 -144305c3 -00000000 -3c08070c -35087944 -3c09c4e3 -35293cb0 -3c033810 -3463820b -01091027 -144305ba -00000000 -3c08d0d2 -35086710 -3c09de2e -35293540 -3c032101 -346388af -01091027 -144305b1 -00000000 -3c082ce9 -3508174e -3c09e3a8 -352904f8 -3c031016 -3463e801 -01091027 -144305a8 -00000000 -3c084810 -350865c0 -3c096610 -3529c428 -3c0391ef -34631a17 -01091027 -1443059f -00000000 -3c084f92 -35080790 -3c0986b3 -3529e018 -3c03304c -34631867 -01091027 -14430596 -00000000 -3c089ef6 -3508b13a -3c09ba55 -3529f000 -3c034108 -34630ec5 -01091027 -1443058d -00000000 -3c08f959 -35088680 -3c090e96 -3529b2c0 -3c030020 -3463493f -01091027 -14430584 -00000000 -3c08c369 -3508bcb8 -3c094034 -3529919c -3c033c82 -34634243 -01091027 -1443057b -00000000 -3c08acd1 -3508fe58 -3c0912df -3529df3e -3c034120 -34630081 -01091027 -14430572 -00000000 -3c08e596 -3508541c -3c09d733 -35297a18 -3c030848 -346381e3 -01091027 -14430569 -00000000 -3c089abb -3508bf30 -3c09447a -352959c8 -3c032104 -34630007 -01091027 -14430560 -00000000 -3c081035 -35081428 -3c093252 -35296560 -3c03cd88 -34638a97 -01091027 -14430557 -00000000 -3c082a9b -35086800 -3c091af1 -3529bf4a -3c03c504 -346300b5 -01091027 -1443054e -00000000 -3c08f405 -350865a4 -3c09d533 -3529bdc4 -3c030ac8 -3463021b -01091027 -14430545 -00000000 -3c086e3c -35080e69 -3c093857 -35299a98 -3c038180 -34636106 -01091027 -1443053c -00000000 -3c08bb0c -3508bf04 -3c094a01 -35294272 -3c0304f2 -34630089 -01091027 -14430533 -00000000 -3c084153 -3508ebc9 -3c093f39 -352941aa -3c038084 -34631414 -01091027 -1443052a -00000000 -3c08a281 -35084c60 -3c097853 -35290580 -3c03052c -3463b21f -01091027 -14430521 -00000000 -3c08d3c8 -3508ad0a -3c09f488 -35297be3 -3c030837 -34630014 -01091027 -14430518 -00000000 -3c0880eb -3508bfac -3c09981e -3529b0ea -3c036700 -34634011 -01091027 -1443050f -00000000 -3c08cff2 -35085fee -3c09784e -3529d707 -3c030001 -34632010 -01091027 -14430506 -00000000 -3c08cc20 -3508a604 -3c09c374 -3529e71c -3c03308b -346318e3 -01091027 -144304fd -00000000 -3c08fc4b -3508a708 -3c090267 -35292e1c -3c030190 -346350e3 -01091027 -144304f4 -00000000 -3c08f798 -350885d0 -3c094646 -3529d442 -3c030821 -34632a2d -01091027 -144304eb -00000000 -3c086996 -3508d370 -3c097fbf -35297a00 -3c038040 -3463048f -01091027 -144304e2 -00000000 -3c08fc29 -350899b5 -3c0929f1 -35294590 -3c030206 -3463224a -01091027 -144304d9 -00000000 -3c08f455 -3508fb20 -3c09cc32 -3529d628 -3c030388 -346300d7 -01091027 -144304d0 -00000000 -3c083b57 -35082de7 -3c09a4aa -3529fe7e -3c034000 -01091027 -144304c8 -00000000 -3c088e1d -35084b80 -3c09b4c9 -352955b0 -3c034122 -3463a04f -01091027 -144304bf -00000000 -3c080812 -3508f0f0 -3c096f66 -3529ebe0 -3c039089 -3463040f -01091027 -144304b6 -00000000 -3c08b5b3 -3508cf8c -3c095c48 -3529fa68 -3c030204 -34630013 -01091027 -144304ad -00000000 -3c0883ef -350887e6 -3c094979 -3529b2fb -3c033400 -34634800 -01091027 -144304a4 -00000000 -3c08f3a9 -350831b0 -3c090e10 -3529c1ce -3c030046 -34630e01 -01091027 -1443049b -00000000 -3c08a249 -3508c694 -3c0962d3 -35298dcc -3c031d24 -34633023 -01091027 -14430492 -00000000 -3c0874e2 -3508386a -3c091dbe -3529ee00 -3c038201 -34630195 -01091027 -14430489 -00000000 -3c0858f5 -3508ada0 -3c09531e -3529bb80 -3c03a400 -3463405f -01091027 -14430480 -00000000 -3c08ab5e -35088db0 -3c0994e2 -35295a28 -3c034001 -34632047 -01091027 -14430477 -00000000 -3c08d845 -3508af72 -3c09a77d -3529cfb0 -3c030082 -3463100d -01091027 -1443046e -00000000 -3c085b0a -3508b58a -3c09141b -35298598 -3c03a0e4 -34634a65 -01091027 -14430465 -00000000 -3c08afd2 -3508fe07 -3c09a1fc -3529a2d4 -3c035001 -34630128 -01091027 -1443045c -00000000 -3c0858e8 -3508c9a8 -3c09a1d0 -35290770 -3c030607 -34633007 -01091027 -14430453 -00000000 -3c088ba7 -3508b89c -3c09e2c8 -35293fc0 -3c031410 -34634023 -01091027 -1443044a -00000000 -3c080c59 -35086a72 -3c09cb34 -3529187e -3c033082 -34638581 -01091027 -14430441 -00000000 -3c08f3bd -3508beeb -3c0944ce -35294276 -3c030800 -34630100 -01091027 -14430438 -00000000 -3c08fa5d -3508615a -3c094ff1 -3529c40a -3c030002 -34631aa5 -01091027 -1443042f -00000000 -3c083ed2 -3508ee00 -3c0953da -3529806f -3c038025 -34631190 -01091027 -14430426 -00000000 -3c08a527 -3508070a -3c090dfd -35293e2b -3c035200 -3463c0d4 -01091027 -1443041d -00000000 -3c08077d -3508cba0 -3c09398b -3529a23c -3c03c000 -34631443 -01091027 -14430414 -00000000 -3c08bfa2 -3508e928 -3c095baf -3529c5e0 -3c030050 -34631217 -01091027 -1443040b -00000000 -3c087d09 -35086978 -3c095f37 -35292180 -3c0380c0 -34639607 -01091027 -14430402 -00000000 -3c08e7d1 -35080ab2 -3c09bc8a -3529dba0 -3c030024 -3463244d -01091027 -144303f9 -00000000 -3c08b9aa -35087173 -3c095a3e -3529eb15 -3c030441 -34630488 -01091027 -144303f0 -00000000 -3c08dcc7 -3508baa0 -3c095b47 -35298418 -3c032038 -34634147 -01091027 -144303e7 -00000000 -3c08f818 -3508bf38 -3c09d2ee -35290a2c -3c030501 -346340c3 -01091027 -144303de -00000000 -3c0830ea -35084f48 -3c097695 -3529ee4e -3c038900 -346310b1 -01091027 -144303d5 -00000000 -3c088c45 -35086640 -3c099ac7 -3529c7e4 -3c036138 -3463181b -01091027 -144303cc -00000000 -3c08fc2d -3508c9be -3c097f88 -3529bd13 -3c030052 -34630240 -01091027 -144303c3 -00000000 -3c0869b3 -35089b38 -3c092a04 -35293f20 -3c039448 -346340c7 -01091027 -144303ba -00000000 -3c0881b8 -3508e36c -3c09ef50 -352923a0 -3c031007 -34631c13 -01091027 -144303b1 -00000000 -3c08115a -3508331e -3c099b47 -3529077e -3c0364a0 -3463c881 -01091027 -144303a8 -00000000 -3c085936 -35083cbc -3c09dc16 -35297b98 -3c0322c9 -34638043 -01091027 -1443039f -00000000 -3c0870a7 -35089087 -3c095ffa -35292b27 -3c038000 -34634458 -01091027 -14430396 -00000000 -3c0804bb -3508f65d -3c09a3a2 -35299d62 -3c035844 -34630080 -01091027 -1443038d -00000000 -3c08c30c -3508ff48 -3c09f843 -35290cc4 -3c0304b0 -34630033 -01091027 -14430384 -00000000 -3c0827cd -35080240 -3c090557 -35290d50 -3c03d820 -3463f0af -01091027 -1443037b -00000000 -3c08ec4f -3508b6ac -3c09a51f -3529c104 -3c0312a0 -34630853 -01091027 -14430372 -00000000 -3c08a9ae -35089c10 -3c0917da -35298cf6 -3c034001 -34636309 -01091027 -14430369 -00000000 -3c0895e4 -3508fe46 -3c0991e5 -3529d4c0 -3c036a1a -34630139 -01091027 -14430360 -00000000 -3c082a6a -35089bd6 -3c099344 -3529b900 -3c034491 -34634429 -01091027 -14430357 -00000000 -3c08af20 -3508c132 -3c09f15d -3529ec9c -3c030082 -34631241 -01091027 -1443034e -00000000 -3c0839bf -3508c7a0 -3c093cc7 -35290c56 -3c03c200 -34633009 -01091027 -14430345 -00000000 -3c08667d -3508ae50 -3c0978ae -3529e774 -3c038100 -3463108b -01091027 -1443033c -00000000 -3c08b32a -350823f0 -3c09cad3 -3529e307 -3c030404 -34631c08 -01091027 -14430333 -00000000 -3c08f96b -35089c74 -3c0958d6 -35294eb8 -3c030600 -34632103 -01091027 -1443032a -00000000 -3c080c6d -35080d66 -24090000 -3c03f392 -3463f299 -01091027 -14430322 -00000000 -3c08cd2c -350870c8 -24090000 -3c0332d3 -34638f37 -01091027 -1443031a -00000000 -3c083212 -35084018 -24090000 -3c03cded -3463bfe7 -01091027 -14430312 -00000000 -3c086a68 -350881b4 -24090000 -3c039597 -34637e4b -01091027 -1443030a -00000000 -3c08aa05 -3508e6b0 -24090000 -3c0355fa -3463194f -01091027 -14430302 -00000000 -3c08b9df -35082820 -24090000 -3c034620 -3463d7df -01091027 -144302fa -00000000 -3c08cbf5 -3508cd30 -24090000 -3c03340a -346332cf -01091027 -144302f2 -00000000 -3c08063e -35081dce -24090000 -3c03f9c1 -3463e231 -01091027 -144302ea -00000000 -3c08c68b -3508849c -24090000 -3c033974 -34637b63 -01091027 -144302e2 -00000000 -3c08b77c -35088382 -24090000 -3c034883 -34637c7d -01091027 -144302da -00000000 -3c087937 -35083a9c -24090000 -3c0386c8 -3463c563 -01091027 -144302d2 -00000000 -3c0854a8 -3508cb30 -24090000 -3c03ab57 -346334cf -01091027 -144302ca -00000000 -3c08126c -35088620 -24090000 -3c03ed93 -346379df -01091027 -144302c2 -00000000 -3c08a279 -3508a544 -24090000 -3c035d86 -34635abb -01091027 -144302ba -00000000 -3c088807 -3508eaad -24090000 -3c0377f8 -34631552 -01091027 -144302b2 -00000000 -3c080ace -35087fe8 -24090000 -3c03f531 -34638017 -01091027 -144302aa -00000000 -3c080535 -3508bdc0 -24090000 -3c03faca -3463423f -01091027 -144302a2 -00000000 -3c08bcd1 -350880d0 -24090000 -3c03432e -34637f2f -01091027 -1443029a -00000000 -3c08f2a9 -35085552 -24090000 -3c030d56 -3463aaad -01091027 -14430292 -00000000 -3c08a919 -3508e806 -24090000 -3c0356e6 -346317f9 -01091027 -1443028a -00000000 -3c0838a8 -3508f322 -24090000 -3c03c757 -34630cdd -01091027 -14430282 -00000000 -3c088a63 -3508e2ce -24090000 -3c03759c -34631d31 -01091027 -1443027a -00000000 -3c087183 -35083ec0 -24090000 -3c038e7c -3463c13f -01091027 -14430272 -00000000 -3c08a1a5 -3508ba90 -24090000 -3c035e5a -3463456f -01091027 -1443026a -00000000 -3c08ee2c -350878a4 -24090000 -3c0311d3 -3463875b -01091027 -14430262 -00000000 -3c086d57 -3508c060 -24090000 -3c0392a8 -34633f9f -01091027 -1443025a -00000000 -3c08f4e2 -35085500 -24090000 -3c030b1d -3463aaff -01091027 -14430252 -00000000 -3c088a35 -35081980 -24090000 -3c0375ca -3463e67f -01091027 -1443024a -00000000 -3c08cab3 -350841f8 -24090000 -3c03354c -3463be07 -01091027 -14430242 -00000000 -3c08c3c7 -3508a598 -24090000 -3c033c38 -34635a67 -01091027 -1443023a -00000000 -3c08dec4 -35085910 -24090000 -3c03213b -3463a6ef -01091027 -14430232 -00000000 -3c08416c -350851e6 -24090000 -3c03be93 -3463ae19 -01091027 -1443022a -00000000 -3c0859dc -35084d80 -24090000 -3c03a623 -3463b27f -01091027 -14430222 -00000000 -3c0820b8 -350838a8 -24090000 -3c03df47 -3463c757 -01091027 -1443021a -00000000 -3c08c13e -3508dcee -24090000 -3c033ec1 -34632311 -01091027 -14430212 -00000000 -3c08cb6d -35081a04 -24090000 -3c033492 -3463e5fb -01091027 -1443020a -00000000 -3c080bcf -3508b7b4 -24090000 -3c03f430 -3463484b -01091027 -14430202 -00000000 -3c08a57a -350808c0 -24090000 -3c035a85 -3463f73f -01091027 -144301fa -00000000 -3c087e76 -35089b08 -24090000 -3c038189 -346364f7 -01091027 -144301f2 -00000000 -3c081187 -35085fc3 -24090000 -3c03ee78 -3463a03c -01091027 -144301ea -00000000 -3c08b92d -350858d0 -24090000 -3c0346d2 -3463a72f -01091027 -144301e2 -00000000 -3c08f0a0 -35083037 -24090000 -3c030f5f -3463cfc8 -01091027 -144301da -00000000 -3c086ec6 -3508d2c0 -24090000 -3c039139 -34632d3f -01091027 -144301d2 -00000000 -3c082503 -35084ce0 -24090000 -3c03dafc -3463b31f -01091027 -144301ca -00000000 -3c082e6c -35089f72 -24090000 -3c03d193 -3463608d -01091027 -144301c2 -00000000 -3c0887fa -35088ae4 -24090000 -3c037805 -3463751b -01091027 -144301ba -00000000 -3c08df03 -35080240 -24090000 -3c0320fc -3463fdbf -01091027 -144301b2 -00000000 -3c08c169 -350899e8 -24090000 -3c033e96 -34636617 -01091027 -144301aa -00000000 -3c08c7fe -35089850 -24090000 -3c033801 -346367af -01091027 -144301a2 -00000000 -3c08d0fe -3508e910 -24090000 -3c032f01 -346316ef -01091027 -1443019a -00000000 -24080000 -3c09bec4 -35291820 -3c03413b -3463e7df -01091027 -14430192 -00000000 -24080000 -3c091281 -35299cd8 -3c03ed7e -34636327 -01091027 -1443018a -00000000 -24080000 -3c099179 -35291260 -3c036e86 -3463ed9f -01091027 -14430182 -00000000 -24080000 -3c09d8f4 -35293c67 -3c03270b -3463c398 -01091027 -1443017a -00000000 -24080000 -3c09622e -35299a80 -3c039dd1 -3463657f -01091027 -14430172 -00000000 -24080000 -3c09d88f -3529db70 -3c032770 -3463248f -01091027 -1443016a -00000000 -24080000 -3c090d2f -35298e00 -3c03f2d0 -346371ff -01091027 -14430162 -00000000 -24080000 -3c09d4cb -35297180 -3c032b34 -34638e7f -01091027 -1443015a -00000000 -24080000 -3c09529a -352964e8 -3c03ad65 -34639b17 -01091027 -14430152 -00000000 -24080000 -3c096ba7 -35295e70 -3c039458 -3463a18f -01091027 -1443014a -00000000 -24080000 -3c09c898 -35297153 -3c033767 -34638eac -01091027 -14430142 -00000000 -24080000 -3c094c4e -35299ba0 -3c03b3b1 -3463645f -01091027 -1443013a -00000000 -24080000 -3c09f520 -35290028 -3c030adf -3463ffd7 -01091027 -14430132 -00000000 -24080000 -3c09d399 -35297138 -3c032c66 -34638ec7 -01091027 -1443012a -00000000 -24080000 -3c09ae45 -35298640 -3c0351ba -346379bf -01091027 -14430122 -00000000 -24080000 -3c09a7f1 -35293186 -3c03580e -3463ce79 -01091027 -1443011a -00000000 -24080000 -3c09f6b8 -352969a8 -3c030947 -34639657 -01091027 -14430112 -00000000 -24080000 -3c096116 -35294f98 -3c039ee9 -3463b067 -01091027 -1443010a -00000000 -24080000 -3c0903c9 -3529a2fc -3c03fc36 -34635d03 -01091027 -14430102 -00000000 -24080000 -3c097b66 -35294d80 -3c038499 -3463b27f -01091027 -144300fa -00000000 -24080000 -3c09e05b -3529f600 -3c031fa4 -346309ff -01091027 -144300f2 -00000000 -24080000 -3c098714 -35299700 -3c0378eb -346368ff -01091027 -144300ea -00000000 -24080000 -3c0912f4 -3529bd56 -3c03ed0b -346342a9 -01091027 -144300e2 -00000000 -24080000 -3c0903be -3529f798 -3c03fc41 -34630867 -01091027 -144300da -00000000 -24080000 -3c09493c -3529ab90 -3c03b6c3 -3463546f -01091027 -144300d2 -00000000 -24080000 -3c0941f2 -35299fa4 -3c03be0d -3463605b -01091027 -144300ca -00000000 -24080000 -3c098500 -3529b112 -3c037aff -34634eed -01091027 -144300c2 -00000000 -24080000 -3c0949c9 -3529c823 -3c03b636 -346337dc -01091027 -144300ba -00000000 -24080000 -3c09806b -3529f524 -3c037f94 -34630adb -01091027 -144300b2 -00000000 -24080000 -3c09925e -3529744c -3c036da1 -34638bb3 -01091027 -144300aa -00000000 -24080000 -3c0980ea -3529540c -3c037f15 -3463abf3 -01091027 -144300a2 -00000000 -24080000 -3c0915ff -3529ba38 -3c03ea00 -346345c7 -01091027 -1443009a -00000000 -24080000 -3c094bb0 -3529467a -3c03b44f -3463b985 -01091027 -14430092 -00000000 -24080000 -3c099da6 -3529a668 -3c036259 -34635997 -01091027 -1443008a -00000000 -24080000 -3c09f038 -35291380 -3c030fc7 -3463ec7f -01091027 -14430082 -00000000 -24080000 -3c0962c8 -35294b4a -3c039d37 -3463b4b5 -01091027 -1443007a -00000000 -24080000 -3c09aac6 -35294a94 -3c035539 -3463b56b -01091027 -14430072 -00000000 -24080000 -3c092e60 -352975b8 -3c03d19f -34638a47 -01091027 -1443006a -00000000 -24080000 -3c096c0b -35297912 -3c0393f4 -346386ed -01091027 -14430062 -00000000 -24080000 -3c0902eb -3529612d -3c03fd14 -34639ed2 -01091027 -1443005a -00000000 -24080000 -3c092793 -3529252e -3c03d86c -3463dad1 -01091027 -14430052 -00000000 -24080000 -3c09f857 -35297680 -3c0307a8 -3463897f -01091027 -1443004a -00000000 -24080000 -3c09e145 -3529d318 -3c031eba -34632ce7 -01091027 -14430042 -00000000 -24080000 -3c099dd5 -3529ae8c -3c03622a -34635173 -01091027 -1443003a -00000000 -24080000 -3c09fec5 -3529c500 -3c03013a -34633aff -01091027 -14430032 -00000000 -24080000 -3c09d4d5 -3529131c -3c032b2a -3463ece3 -01091027 -1443002a -00000000 -24080000 -3c09bf16 -35298bd0 -3c0340e9 -3463742f -01091027 -14430022 -00000000 -24080000 -3c090980 -35290273 -3c03f67f -3463fd8c -01091027 -1443001a -00000000 -24080000 -3c09e07c -3529dec0 -3c031f83 -3463213f -01091027 -14430012 -00000000 -24080000 -3c09c5b3 -35291dc7 -3c033a4c -3463e238 -01091027 -1443000a -00000000 -24080000 -24090000 -2403ffff -01091027 -14430004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -00000000 -00000000 -26100001 -24120000 -3c047fff -3484ffff -18800006 -3c08800d -3c16800d -151601bb -00000000 -18000003 -3c17800d -100001b7 -00000000 -16f601b5 -00000000 -3c047fff -3484ffff -18800006 -25098123 -25168123 -153601ae -00000000 -18000003 -25178123 -100001aa -00000000 -16f601a8 -00000000 -3c047fff -3484ffff -18800006 -ad098ee0 -ad168ee0 -153601a1 -00000000 -18000003 -ad178ee0 -1000019d -00000000 -16f6019b -00000000 -3c047fff -3484ffff -18800006 -8d0a8ee0 -8d168ee0 -15560194 -00000000 -18000003 -8d178ee0 -10000190 -00000000 -16f6018e -00000000 -3c047fff -3484ffff -18800006 -012a5821 -012ab021 -15760187 -00000000 -18000003 -012ab821 -10000183 -00000000 -16f60181 -00000000 -3c047fff -3484ffff -18800006 -02326025 -0232b025 -1596017a -00000000 -18000003 -0232b825 -10000176 -00000000 -16f60174 -00000000 -3c047fff -3484ffff -18800006 -0253682a -0253b02a -15b6016d -00000000 -18000003 -0253b82a -10000169 -00000000 -16f60167 -00000000 -3c047fff -3484ffff -18800006 -2a4e8011 -2a568011 -15d60160 -00000000 -18000003 -2a578011 -1000015c -00000000 -16f6015a -00000000 -3c047fff -3484ffff -18800006 -2e4f8011 -2e568011 -15f60153 -00000000 -18000003 -2e578011 -1000014f -00000000 -16f6014d -00000000 -3c047fff -3484ffff -18800006 -0253c02b -0253b02b -17160146 -00000000 -18000003 -0253b82b -10000142 -00000000 -16f60140 -00000000 -3c047fff -3484ffff -18800006 -00124c40 -0012b440 -15360139 -00000000 -18000003 -0012bc40 -10000135 -00000000 -16f60133 -00000000 -3c047fff -3484ffff -18800006 -01105020 -0110b020 -1556012c -00000000 -18000003 -0110b820 -10000128 -00000000 -16f60126 -00000000 -3c047fff -3484ffff -18800006 -220b8002 -22168002 -1576011f -00000000 -18000003 -22178002 -1000011b -00000000 -16f60119 -00000000 -3c047fff -3484ffff -18800006 -01106022 -0110b022 -15960112 -00000000 -18000003 -0110b822 -1000010e -00000000 -16f6010c -00000000 -3c047fff -3484ffff -18800006 -01106823 -0110b023 -15b60105 -00000000 -18000003 -0110b823 -10000101 -00000000 -16f600ff -00000000 -3c047fff -3484ffff -18800006 -01107024 -0110b024 -15d600f8 -00000000 -18000003 -0110b824 -100000f4 -00000000 -16f600f2 -00000000 -3c047fff -3484ffff -18800006 -320f8ff2 -32168ff2 -15f600eb -00000000 -18000003 -32178ff2 -100000e7 -00000000 -16f600e5 -00000000 -3c047fff -3484ffff -18800006 -0110c027 -0110b027 -171600de -00000000 -18000003 -0110b827 -100000da -00000000 -16f600d8 -00000000 -3c047fff -3484ffff -18800006 -36098ff2 -36168ff2 -153600d1 -00000000 -18000003 -36178ff2 -100000cd -00000000 -16f600cb -00000000 -3c047fff -3484ffff -18800006 -01105026 -0110b026 -155600c4 -00000000 -18000003 -0110b826 -100000c0 -00000000 -16f600be -00000000 -3c047fff -3484ffff -18800006 -3a0b8ff2 -3a168ff2 -157600b7 -00000000 -18000003 -3a178ff2 -100000b3 -00000000 -16f600b1 -00000000 -3c047fff -3484ffff -18800006 -02086004 -0208b004 -159600aa -00000000 -18000003 -0208b804 -100000a6 -00000000 -16f600a4 -00000000 -3c047fff -3484ffff -18800006 -00106a03 -0010b203 -15b6009d -00000000 -18000003 -0010ba03 -10000099 -00000000 -16f60097 -00000000 -3c047fff -3484ffff -18800006 -02087007 -0208b007 -15d60090 -00000000 -18000003 -0208b807 -1000008c -00000000 -16f6008a -00000000 -3c047fff -3484ffff -18800006 -00107a02 -0010b202 -15f60083 -00000000 -18000003 -0010ba02 -1000007f -00000000 -16f6007d -00000000 -3c047fff -3484ffff -18800006 -0208c006 -0208b006 -17160076 -00000000 -18000003 -0208b806 -10000072 -00000000 -16f60070 -00000000 -3c088000 -34098000 -3c047fff -3484ffff -24020000 -24030000 -1880000a -0109001a -00001012 -00800013 -0109001a -0000b012 -14560062 -00000000 -00800013 -18000003 -0109001a -1000005d -00000000 -00001812 -1476005a -00000000 -3c047fff -3484ffff -24020000 -24030000 -1880000a -0109001b -00001012 -00800013 -0109001b -0000b012 -1456004e -00000000 -00800013 -18000003 -0109001b -10000049 -00000000 -00001812 -14760046 -00000000 -3c047fff -3484ffff -24020000 -24030000 -1880000a -01090018 -00001012 -00800013 -01090018 -0000b012 -1456003a -00000000 -00800013 -18000003 -01090018 -10000035 -00000000 -00001812 -14760032 -00000000 -3c047fff -3484ffff -24020000 -24030000 -1880000a -01090019 -00001012 -00800013 -01090019 -0000b012 -14560026 -00000000 -00800013 -18000003 -01090019 -10000021 -00000000 -00001812 -1476001e -00000000 -3c047fff -3484ffff -18800006 -00007810 -0000b010 -15f60017 -00000000 -18000003 -0000b810 -10000013 -00000000 -16f60011 -00000000 -3c047fff -3484ffff -18800006 -00007012 -0000b012 -15d6000a -00000000 -18000003 -0000b812 -10000006 -00000000 -16f60004 -00000000 -16400002 -00000000 -26730001 -00104e00 -01334025 -ae280000 -03e00008 -00000000 -9e3f7f70 -00000000 -00000000 -00000000 -00000000 -00000000 -00000000 diff --git a/src/testbench/MMU/soc_lite_top.sv b/src/testbench/MMU/soc_lite_top.sv deleted file mode 100644 index da4d33d..0000000 --- a/src/testbench/MMU/soc_lite_top.sv +++ /dev/null @@ -1,894 +0,0 @@ -`timescale 1ns / 1ps - -`define TESTBENCH - -`include "ICache.svh" -`include "DCache.svh" -`include "sram.svh" -`include "AXI.svh" - -module soc_axi_lite_top (); - - reg resetn; - reg clk; - - wire [ 15:0] led; - wire [1 : 0] led_rg0; - wire [1 : 0] led_rg1; - wire [7 : 0] num_csn; - wire [6 : 0] num_a_g; - wire [7 : 0] switch; - wire [3 : 0] btn_key_col; - wire [3 : 0] btn_key_row; - wire [1 : 0] btn_step; - - //clk and resetn - wire cpu_clk; - wire sys_clk; - reg cpu_resetn_t, cpu_resetn; - reg sys_resetn_t, sys_resetn; - always @(posedge cpu_clk) begin - cpu_resetn_t <= resetn; - cpu_resetn <= cpu_resetn_t; - end - always @(posedge sys_clk) begin - sys_resetn_t <= resetn; - sys_resetn <= sys_resetn_t; - end - - assign cpu_clk = clk; - assign sys_clk = clk; - - - //cpu axi - wire [3 : 0] cpu_arid; - wire [ 31:0] cpu_araddr; - wire [3 : 0] cpu_arlen; - wire [2 : 0] cpu_arsize; - wire [1 : 0] cpu_arburst; - wire [1 : 0] cpu_arlock; - wire [3 : 0] cpu_arcache; - wire [2 : 0] cpu_arprot; - wire cpu_arvalid; - wire cpu_arready; - wire [3 : 0] cpu_rid; - wire [ 31:0] cpu_rdata; - wire [1 : 0] cpu_rresp; - wire cpu_rlast; - wire cpu_rvalid; - wire cpu_rready; - wire [3 : 0] cpu_awid; - wire [ 31:0] cpu_awaddr; - wire [3 : 0] cpu_awlen; - wire [2 : 0] cpu_awsize; - wire [1 : 0] cpu_awburst; - wire [1 : 0] cpu_awlock; - wire [3 : 0] cpu_awcache; - wire [2 : 0] cpu_awprot; - wire cpu_awvalid; - wire cpu_awready; - wire [3 : 0] cpu_wid; - wire [ 31:0] cpu_wdata; - wire [3 : 0] cpu_wstrb; - wire cpu_wlast; - wire cpu_wvalid; - wire cpu_wready; - wire [3 : 0] cpu_bid; - wire [1 : 0] cpu_bresp; - wire cpu_bvalid; - wire cpu_bready; - - //cpu axi wrap - wire cpu_wrap_aclk; - wire cpu_wrap_aresetn; - wire [3 : 0] cpu_wrap_arid; - wire [ 31:0] cpu_wrap_araddr; - wire [3 : 0] cpu_wrap_arlen; - wire [2 : 0] cpu_wrap_arsize; - wire [1 : 0] cpu_wrap_arburst; - wire [1 : 0] cpu_wrap_arlock; - wire [3 : 0] cpu_wrap_arcache; - wire [2 : 0] cpu_wrap_arprot; - wire cpu_wrap_arvalid; - wire cpu_wrap_arready; - wire [3 : 0] cpu_wrap_rid; - wire [ 31:0] cpu_wrap_rdata; - wire [1 : 0] cpu_wrap_rresp; - wire cpu_wrap_rlast; - wire cpu_wrap_rvalid; - wire cpu_wrap_rready; - wire [3 : 0] cpu_wrap_awid; - wire [ 31:0] cpu_wrap_awaddr; - wire [3 : 0] cpu_wrap_awlen; - wire [2 : 0] cpu_wrap_awsize; - wire [1 : 0] cpu_wrap_awburst; - wire [1 : 0] cpu_wrap_awlock; - wire [3 : 0] cpu_wrap_awcache; - wire [2 : 0] cpu_wrap_awprot; - wire cpu_wrap_awvalid; - wire cpu_wrap_awready; - wire [3 : 0] cpu_wrap_wid; - wire [ 31:0] cpu_wrap_wdata; - wire [3 : 0] cpu_wrap_wstrb; - wire cpu_wrap_wlast; - wire cpu_wrap_wvalid; - wire cpu_wrap_wready; - wire [3 : 0] cpu_wrap_bid; - wire [1 : 0] cpu_wrap_bresp; - wire cpu_wrap_bvalid; - wire cpu_wrap_bready; - //cpu axi sync - wire [3 : 0] cpu_sync_arid; - wire [ 31:0] cpu_sync_araddr; - wire [3 : 0] cpu_sync_arlen; - wire [2 : 0] cpu_sync_arsize; - wire [1 : 0] cpu_sync_arburst; - wire [1 : 0] cpu_sync_arlock; - wire [3 : 0] cpu_sync_arcache; - wire [2 : 0] cpu_sync_arprot; - wire cpu_sync_arvalid; - wire cpu_sync_arready; - wire [3 : 0] cpu_sync_rid; - wire [ 31:0] cpu_sync_rdata; - wire [1 : 0] cpu_sync_rresp; - wire cpu_sync_rlast; - wire cpu_sync_rvalid; - wire cpu_sync_rready; - wire [3 : 0] cpu_sync_awid; - wire [ 31:0] cpu_sync_awaddr; - wire [3 : 0] cpu_sync_awlen; - wire [2 : 0] cpu_sync_awsize; - wire [1 : 0] cpu_sync_awburst; - wire [1 : 0] cpu_sync_awlock; - wire [3 : 0] cpu_sync_awcache; - wire [2 : 0] cpu_sync_awprot; - wire cpu_sync_awvalid; - wire cpu_sync_awready; - wire [3 : 0] cpu_sync_wid; - wire [ 31:0] cpu_sync_wdata; - wire [3 : 0] cpu_sync_wstrb; - wire cpu_sync_wlast; - wire cpu_sync_wvalid; - wire cpu_sync_wready; - wire [3 : 0] cpu_sync_bid; - wire [1 : 0] cpu_sync_bresp; - wire cpu_sync_bvalid; - wire cpu_sync_bready; - //axi ram - wire [3 : 0] ram_arid; - wire [ 31:0] ram_araddr; - wire [3 : 0] ram_arlen; - wire [2 : 0] ram_arsize; - wire [1 : 0] ram_arburst; - wire [1 : 0] ram_arlock; - wire [3 : 0] ram_arcache; - wire [2 : 0] ram_arprot; - wire ram_arvalid; - wire ram_arready; - wire [3 : 0] ram_rid; - wire [ 31:0] ram_rdata; - wire [1 : 0] ram_rresp; - wire ram_rlast; - wire ram_rvalid; - wire ram_rready; - wire [3 : 0] ram_awid; - wire [ 31:0] ram_awaddr; - wire [3 : 0] ram_awlen; - wire [2 : 0] ram_awsize; - wire [1 : 0] ram_awburst; - wire [1 : 0] ram_awlock; - wire [3 : 0] ram_awcache; - wire [2 : 0] ram_awprot; - wire ram_awvalid; - wire ram_awready; - wire [3 : 0] ram_wid; - wire [ 31:0] ram_wdata; - wire [3 : 0] ram_wstrb; - wire ram_wlast; - wire ram_wvalid; - wire ram_wready; - wire [3 : 0] ram_bid; - wire [1 : 0] ram_bresp; - wire ram_bvalid; - wire ram_bready; - //conf - wire [3 : 0] conf_arid; - wire [ 31:0] conf_araddr; - wire [3 : 0] conf_arlen; - wire [2 : 0] conf_arsize; - wire [1 : 0] conf_arburst; - wire [1 : 0] conf_arlock; - wire [3 : 0] conf_arcache; - wire [2 : 0] conf_arprot; - wire conf_arvalid; - wire conf_arready; - wire [3 : 0] conf_rid; - wire [ 31:0] conf_rdata; - wire [1 : 0] conf_rresp; - wire conf_rlast; - wire conf_rvalid; - wire conf_rready; - wire [3 : 0] conf_awid; - wire [ 31:0] conf_awaddr; - wire [3 : 0] conf_awlen; - wire [2 : 0] conf_awsize; - wire [1 : 0] conf_awburst; - wire [1 : 0] conf_awlock; - wire [3 : 0] conf_awcache; - wire [2 : 0] conf_awprot; - wire conf_awvalid; - wire conf_awready; - wire [3 : 0] conf_wid; - wire [ 31:0] conf_wdata; - wire [3 : 0] conf_wstrb; - wire conf_wlast; - wire conf_wvalid; - wire conf_wready; - wire [3 : 0] conf_bid; - wire [1 : 0] conf_bresp; - wire conf_bvalid; - wire conf_bready; - - //for lab6 - wire [4 : 0] ram_random_mask; - - //cpu axi wrap - axi_wrap u_cpu_axi_wrap ( - .m_aclk (cpu_clk), - .m_aresetn(cpu_resetn), - //ar - .m_arid (cpu_arid), - .m_araddr (cpu_araddr), - .m_arlen (cpu_arlen), - .m_arsize (cpu_arsize), - .m_arburst(cpu_arburst), - .m_arlock (cpu_arlock), - .m_arcache(cpu_arcache), - .m_arprot (cpu_arprot), - .m_arvalid(cpu_arvalid), - .m_arready(cpu_arready), - //r - .m_rid (cpu_rid), - .m_rdata (cpu_rdata), - .m_rresp (cpu_rresp), - .m_rlast (cpu_rlast), - .m_rvalid (cpu_rvalid), - .m_rready (cpu_rready), - //aw - .m_awid (cpu_awid), - .m_awaddr (cpu_awaddr), - .m_awlen (cpu_awlen), - .m_awsize (cpu_awsize), - .m_awburst(cpu_awburst), - .m_awlock (cpu_awlock), - .m_awcache(cpu_awcache), - .m_awprot (cpu_awprot), - .m_awvalid(cpu_awvalid), - .m_awready(cpu_awready), - //w - .m_wid (cpu_wid), - .m_wdata (cpu_wdata), - .m_wstrb (cpu_wstrb), - .m_wlast (cpu_wlast), - .m_wvalid (cpu_wvalid), - .m_wready (cpu_wready), - //b - .m_bid (cpu_bid), - .m_bresp (cpu_bresp), - .m_bvalid (cpu_bvalid), - .m_bready (cpu_bready), - - .s_aclk (cpu_wrap_aclk), - .s_aresetn(cpu_wrap_aresetn), - //ar - .s_arid (cpu_wrap_arid), - .s_araddr (cpu_wrap_araddr), - .s_arlen (cpu_wrap_arlen), - .s_arsize (cpu_wrap_arsize), - .s_arburst(cpu_wrap_arburst), - .s_arlock (cpu_wrap_arlock), - .s_arcache(cpu_wrap_arcache), - .s_arprot (cpu_wrap_arprot), - .s_arvalid(cpu_wrap_arvalid), - .s_arready(cpu_wrap_arready), - //r - .s_rid (cpu_wrap_rid), - .s_rdata (cpu_wrap_rdata), - .s_rresp (cpu_wrap_rresp), - .s_rlast (cpu_wrap_rlast), - .s_rvalid (cpu_wrap_rvalid), - .s_rready (cpu_wrap_rready), - //aw - .s_awid (cpu_wrap_awid), - .s_awaddr (cpu_wrap_awaddr), - .s_awlen (cpu_wrap_awlen), - .s_awsize (cpu_wrap_awsize), - .s_awburst(cpu_wrap_awburst), - .s_awlock (cpu_wrap_awlock), - .s_awcache(cpu_wrap_awcache), - .s_awprot (cpu_wrap_awprot), - .s_awvalid(cpu_wrap_awvalid), - .s_awready(cpu_wrap_awready), - //w - .s_wid (cpu_wrap_wid), - .s_wdata (cpu_wrap_wdata), - .s_wstrb (cpu_wrap_wstrb), - .s_wlast (cpu_wrap_wlast), - .s_wvalid (cpu_wrap_wvalid), - .s_wready (cpu_wrap_wready), - //b - .s_bid (cpu_wrap_bid), - .s_bresp (cpu_wrap_bresp), - .s_bvalid (cpu_wrap_bvalid), - .s_bready (cpu_wrap_bready) - ); - - //clock sync: from CPU to AXI_Crossbar - axi_clock_converter u_axi_clock_sync ( - .s_axi_aclk (cpu_clk), - .s_axi_aresetn(cpu_resetn), - .s_axi_awid (cpu_wrap_awid), - .s_axi_awaddr (cpu_wrap_awaddr), - .s_axi_awlen (cpu_wrap_awlen), - .s_axi_awsize (cpu_wrap_awsize), - .s_axi_awburst(cpu_wrap_awburst), - .s_axi_awlock (cpu_wrap_awlock), - .s_axi_awcache(cpu_wrap_awcache), - .s_axi_awprot (cpu_wrap_awprot), - .s_axi_awqos (4'd0), - .s_axi_awvalid(cpu_wrap_awvalid), - .s_axi_awready(cpu_wrap_awready), - .s_axi_wid (cpu_wrap_wid), - .s_axi_wdata (cpu_wrap_wdata), - .s_axi_wstrb (cpu_wrap_wstrb), - .s_axi_wlast (cpu_wrap_wlast), - .s_axi_wvalid (cpu_wrap_wvalid), - .s_axi_wready (cpu_wrap_wready), - .s_axi_bid (cpu_wrap_bid), - .s_axi_bresp (cpu_wrap_bresp), - .s_axi_bvalid (cpu_wrap_bvalid), - .s_axi_bready (cpu_wrap_bready), - .s_axi_arid (cpu_wrap_arid), - .s_axi_araddr (cpu_wrap_araddr), - .s_axi_arlen (cpu_wrap_arlen), - .s_axi_arsize (cpu_wrap_arsize), - .s_axi_arburst(cpu_wrap_arburst), - .s_axi_arlock (cpu_wrap_arlock), - .s_axi_arcache(cpu_wrap_arcache), - .s_axi_arprot (cpu_wrap_arprot), - .s_axi_arqos (4'd0), - .s_axi_arvalid(cpu_wrap_arvalid), - .s_axi_arready(cpu_wrap_arready), - .s_axi_rid (cpu_wrap_rid), - .s_axi_rdata (cpu_wrap_rdata), - .s_axi_rresp (cpu_wrap_rresp), - .s_axi_rlast (cpu_wrap_rlast), - .s_axi_rvalid (cpu_wrap_rvalid), - .s_axi_rready (cpu_wrap_rready), - .m_axi_aclk (sys_clk), - .m_axi_aresetn(sys_resetn), - .m_axi_awid (cpu_sync_awid), - .m_axi_awaddr (cpu_sync_awaddr), - .m_axi_awlen (cpu_sync_awlen), - .m_axi_awsize (cpu_sync_awsize), - .m_axi_awburst(cpu_sync_awburst), - .m_axi_awlock (cpu_sync_awlock), - .m_axi_awcache(cpu_sync_awcache), - .m_axi_awprot (cpu_sync_awprot), - .m_axi_awqos (), - .m_axi_awvalid(cpu_sync_awvalid), - .m_axi_awready(cpu_sync_awready), - .m_axi_wid (cpu_sync_wid), - .m_axi_wdata (cpu_sync_wdata), - .m_axi_wstrb (cpu_sync_wstrb), - .m_axi_wlast (cpu_sync_wlast), - .m_axi_wvalid (cpu_sync_wvalid), - .m_axi_wready (cpu_sync_wready), - .m_axi_bid (cpu_sync_bid), - .m_axi_bresp (cpu_sync_bresp), - .m_axi_bvalid (cpu_sync_bvalid), - .m_axi_bready (cpu_sync_bready), - .m_axi_arid (cpu_sync_arid), - .m_axi_araddr (cpu_sync_araddr), - .m_axi_arlen (cpu_sync_arlen), - .m_axi_arsize (cpu_sync_arsize), - .m_axi_arburst(cpu_sync_arburst), - .m_axi_arlock (cpu_sync_arlock), - .m_axi_arcache(cpu_sync_arcache), - .m_axi_arprot (cpu_sync_arprot), - .m_axi_arqos (), - .m_axi_arvalid(cpu_sync_arvalid), - .m_axi_arready(cpu_sync_arready), - .m_axi_rid (cpu_sync_rid), - .m_axi_rdata (cpu_sync_rdata), - .m_axi_rresp (cpu_sync_rresp), - .m_axi_rlast (cpu_sync_rlast), - .m_axi_rvalid (cpu_sync_rvalid), - .m_axi_rready (cpu_sync_rready) - ); - - - axi_crossbar_1x2 u_axi_crossbar_1x2 ( - .aclk (sys_clk), // i, 1 - .aresetn(sys_resetn), // i, 1 - - .s_axi_arid (cpu_sync_arid), - .s_axi_araddr (cpu_sync_araddr), - .s_axi_arlen (cpu_sync_arlen[3:0]), - .s_axi_arsize (cpu_sync_arsize), - .s_axi_arburst(cpu_sync_arburst), - .s_axi_arlock (cpu_sync_arlock), - .s_axi_arcache(cpu_sync_arcache), - .s_axi_arprot (cpu_sync_arprot), - .s_axi_arqos (4'd0), - .s_axi_arvalid(cpu_sync_arvalid), - .s_axi_arready(cpu_sync_arready), - .s_axi_rid (cpu_sync_rid), - .s_axi_rdata (cpu_sync_rdata), - .s_axi_rresp (cpu_sync_rresp), - .s_axi_rlast (cpu_sync_rlast), - .s_axi_rvalid (cpu_sync_rvalid), - .s_axi_rready (cpu_sync_rready), - .s_axi_awid (cpu_sync_awid), - .s_axi_awaddr (cpu_sync_awaddr), - .s_axi_awlen (cpu_sync_awlen[3:0]), - .s_axi_awsize (cpu_sync_awsize), - .s_axi_awburst(cpu_sync_awburst), - .s_axi_awlock (cpu_sync_awlock), - .s_axi_awcache(cpu_sync_awcache), - .s_axi_awprot (cpu_sync_awprot), - .s_axi_awqos (4'd0), - .s_axi_awvalid(cpu_sync_awvalid), - .s_axi_awready(cpu_sync_awready), - .s_axi_wid (cpu_sync_wid), - .s_axi_wdata (cpu_sync_wdata), - .s_axi_wstrb (cpu_sync_wstrb), - .s_axi_wlast (cpu_sync_wlast), - .s_axi_wvalid (cpu_sync_wvalid), - .s_axi_wready (cpu_sync_wready), - .s_axi_bid (cpu_sync_bid), - .s_axi_bresp (cpu_sync_bresp), - .s_axi_bvalid (cpu_sync_bvalid), - .s_axi_bready (cpu_sync_bready), - - .m_axi_arid ({ram_arid, conf_arid}), - .m_axi_araddr ({ram_araddr, conf_araddr}), - .m_axi_arlen ({ram_arlen, conf_arlen}), - .m_axi_arsize ({ram_arsize, conf_arsize}), - .m_axi_arburst({ram_arburst, conf_arburst}), - .m_axi_arlock ({ram_arlock, conf_arlock}), - .m_axi_arcache({ram_arcache, conf_arcache}), - .m_axi_arprot ({ram_arprot, conf_arprot}), - .m_axi_arqos (), - .m_axi_arvalid({ram_arvalid, conf_arvalid}), - .m_axi_arready({ram_arready, conf_arready}), - .m_axi_rid ({ram_rid, conf_rid}), - .m_axi_rdata ({ram_rdata, conf_rdata}), - .m_axi_rresp ({ram_rresp, conf_rresp}), - .m_axi_rlast ({ram_rlast, conf_rlast}), - .m_axi_rvalid ({ram_rvalid, conf_rvalid}), - .m_axi_rready ({ram_rready, conf_rready}), - .m_axi_awid ({ram_awid, conf_awid}), - .m_axi_awaddr ({ram_awaddr, conf_awaddr}), - .m_axi_awlen ({ram_awlen, conf_awlen}), - .m_axi_awsize ({ram_awsize, conf_awsize}), - .m_axi_awburst({ram_awburst, conf_awburst}), - .m_axi_awlock ({ram_awlock, conf_awlock}), - .m_axi_awcache({ram_awcache, conf_awcache}), - .m_axi_awprot ({ram_awprot, conf_awprot}), - .m_axi_awqos (), - .m_axi_awvalid({ram_awvalid, conf_awvalid}), - .m_axi_awready({ram_awready, conf_awready}), - .m_axi_wid ({ram_wid, conf_wid}), - .m_axi_wdata ({ram_wdata, conf_wdata}), - .m_axi_wstrb ({ram_wstrb, conf_wstrb}), - .m_axi_wlast ({ram_wlast, conf_wlast}), - .m_axi_wvalid ({ram_wvalid, conf_wvalid}), - .m_axi_wready ({ram_wready, conf_wready}), - .m_axi_bid ({ram_bid, conf_bid}), - .m_axi_bresp ({ram_bresp, conf_bresp}), - .m_axi_bvalid ({ram_bvalid, conf_bvalid}), - .m_axi_bready ({ram_bready, conf_bready}) - - ); - - //axi ram - axi_wrap_ram u_axi_ram ( - .aclk (sys_clk), - .aresetn (sys_resetn), - //ar - .axi_arid (ram_arid), - .axi_araddr (ram_araddr), - .axi_arlen ({4'd0, ram_arlen}), - .axi_arsize (ram_arsize), - .axi_arburst(ram_arburst), - .axi_arlock (ram_arlock), - .axi_arcache(ram_arcache), - .axi_arprot (ram_arprot), - .axi_arvalid(ram_arvalid), - .axi_arready(ram_arready), - //r - .axi_rid (ram_rid), - .axi_rdata (ram_rdata), - .axi_rresp (ram_rresp), - .axi_rlast (ram_rlast), - .axi_rvalid (ram_rvalid), - .axi_rready (ram_rready), - //aw - .axi_awid (ram_awid), - .axi_awaddr (ram_awaddr), - .axi_awlen ({4'd0, ram_awlen[3:0]}), - .axi_awsize (ram_awsize), - .axi_awburst(ram_awburst), - .axi_awlock (ram_awlock), - .axi_awcache(ram_awcache), - .axi_awprot (ram_awprot), - .axi_awvalid(ram_awvalid), - .axi_awready(ram_awready), - //w - .axi_wid (ram_wid), - .axi_wdata (ram_wdata), - .axi_wstrb (ram_wstrb), - .axi_wlast (ram_wlast), - .axi_wvalid (ram_wvalid), - .axi_wready (ram_wready), - //b ram - .axi_bid (ram_bid), - .axi_bresp (ram_bresp), - .axi_bvalid (ram_bvalid), - .axi_bready (ram_bready), - - //random mask - .ram_random_mask(ram_random_mask) - ); - - //confreg - confreg #(1'b1) u_confreg ( - .timer_clk(sys_clk), // i, 1 - .aclk (sys_clk), // i, 1 - .aresetn (sys_resetn), // i, 1 - - .arid (conf_arid), - .araddr (conf_araddr), - .arlen (conf_arlen), - .arsize (conf_arsize), - .arburst(conf_arburst), - .arlock (conf_arlock), - .arcache(conf_arcache), - .arprot (conf_arprot), - .arvalid(conf_arvalid), - .arready(conf_arready), - .rid (conf_rid), - .rdata (conf_rdata), - .rresp (conf_rresp), - .rlast (conf_rlast), - .rvalid (conf_rvalid), - .rready (conf_rready), - .awid (conf_awid), - .awaddr (conf_awaddr), - .awlen (conf_awlen), - .awsize (conf_awsize), - .awburst(conf_awburst), - .awlock (conf_awlock), - .awcache(conf_awcache), - .awprot (conf_awprot), - .awvalid(conf_awvalid), - .awready(conf_awready), - .wid (conf_wid), - .wdata (conf_wdata), - .wstrb (conf_wstrb), - .wlast (conf_wlast), - .wvalid (conf_wvalid), - .wready (conf_wready), - .bid (conf_bid), - .bresp (conf_bresp), - .bvalid (conf_bvalid), - .bready (conf_bready), - - .ram_random_mask(ram_random_mask), - .led (led), // o, 16 - .led_rg0 (led_rg0), // o, 2 - .led_rg1 (led_rg1), // o, 2 - .num_csn (num_csn), // o, 8 - .num_a_g (num_a_g), // o, 7 - .switch (switch), // i, 8 - .btn_key_col (btn_key_col), // o, 4 - .btn_key_row (btn_key_row), // i, 4 - .btn_step (btn_step) // i, 2 - ); - - - - - - - - - - - - - ICache_i ic (); - DCache_i dc (); - sramro_i inst (); - sram_i data (); - SRAM_RO_AXI_i inst_axi (); - AXIRead_i fake_axi_read (); - AXIWrite_i fake_axi_write (); - SRAM_RO_AXI_i data_rdata (); - SRAM_W_AXI_i data_wdata (); - - assign fake_axi_read.AXIReadData.arready = cpu_arready; - assign fake_axi_read.AXIReadData.rid = cpu_rid; - assign fake_axi_read.AXIReadData.rdata = cpu_rdata; - assign fake_axi_read.AXIReadData.rresp = cpu_rresp; - assign fake_axi_read.AXIReadData.rlast = cpu_rlast; - assign fake_axi_read.AXIReadData.rvalid = cpu_rvalid; - - assign cpu_arid = fake_axi_read.AXIReadAddr.arid; - assign cpu_araddr = fake_axi_read.AXIReadAddr.araddr; - assign cpu_arlen = fake_axi_read.AXIReadAddr.arlen; - assign cpu_arsize = fake_axi_read.AXIReadAddr.arsize; - assign cpu_arburst = fake_axi_read.AXIReadAddr.arburst; - assign cpu_arlock = fake_axi_read.AXIReadAddr.arlock; - assign cpu_arcache = fake_axi_read.AXIReadAddr.arcache; - assign cpu_arprot = fake_axi_read.AXIReadAddr.arprot; - assign cpu_arvalid = fake_axi_read.AXIReadAddr.arvalid; - assign cpu_rready = fake_axi_read.AXIReadAddr.rready; - - assign fake_axi_write.AXIWriteData.awready = cpu_awready; - assign fake_axi_write.AXIWriteData.wready = cpu_wready; - assign fake_axi_write.AXIWriteData.bid = cpu_bid; - assign fake_axi_write.AXIWriteData.bresp = cpu_bresp; - assign fake_axi_write.AXIWriteData.bvalid = cpu_bvalid; - - assign cpu_awid = fake_axi_write.AXIWriteAddr.awid; - assign cpu_awaddr = fake_axi_write.AXIWriteAddr.awaddr; - assign cpu_awlen = fake_axi_write.AXIWriteAddr.awlen; - assign cpu_awsize = fake_axi_write.AXIWriteAddr.awsize; - assign cpu_awburst = fake_axi_write.AXIWriteAddr.awburst; - assign cpu_awlock = fake_axi_write.AXIWriteAddr.awlock; - assign cpu_awcache = fake_axi_write.AXIWriteAddr.awcache; - assign cpu_awprot = fake_axi_write.AXIWriteAddr.awprot; - assign cpu_awvalid = fake_axi_write.AXIWriteAddr.awvalid; - assign cpu_wid = fake_axi_write.AXIWriteAddr.wid; - assign cpu_wdata = fake_axi_write.AXIWriteAddr.wdata; - assign cpu_wstrb = fake_axi_write.AXIWriteAddr.wstrb; - assign cpu_wlast = fake_axi_write.AXIWriteAddr.wlast; - assign cpu_wvalid = fake_axi_write.AXIWriteAddr.wvalid; - assign cpu_bready = fake_axi_write.AXIWriteAddr.bready; - - AXI axi ( - .clk(cpu_clk), - .rst(~cpu_resetn), - .AXIRead(fake_axi_read.master), - .AXIWrite(fake_axi_write.master), - .inst(inst_axi.slave), - .rdata(data_rdata.slave), - .wdata(data_wdata.slave) - ); - - MMU mmu ( - .clk(cpu_clk), - .rst(~cpu_resetn), - .K0(2'b11), - .ic(ic.mmu), - .dc(dc.mmu), - .inst(inst.slave), - .data(data.slave), - .inst_axi(inst_axi.master), - .rdata_axi(data_rdata.master), - .wdata_axi(data_wdata.master) - ); - - ICache icache ( - .clk (cpu_clk), - .rst (~cpu_resetn), - .port(ic.cache) - ); - - DCache dcache ( - .clk (cpu_clk), - .rst (~cpu_resetn), - .port(dc.cache) - ); - - typedef struct packed { - logic req; - word_t addr; - } iq_t; - - typedef struct packed { - logic req; - logic wr; - word_t addr; - logic [3:0] wstrb; - word_t wdata; - } dq_t; - - - typedef struct packed { - logic ignore; - word_t rdata0; - word_t rdata1; - } iq_ans_t; - - typedef struct packed { - logic ignore; - word_t rdata; - } dq_ans_t; - - iq_t iqueue[$]; - dq_t dqueue[$]; - - iq_ans_t iqueue_ans[$]; - dq_ans_t dqueue_ans[$]; - - integer counter, counter_inst, counter_data; - - `define C_B 32'h8000_0000 - `define U_B 32'h0000_0000 - - initial begin - $dumpfile("dump.vcd"); - $dumpvars(); - - // ====================================================================== - // =============================== DCache =============================== - // ====================================================================== - - // ====================================== - // RO Replace (~hit & ~dirt_valid & ~wr) - // ====================================== - dqueue.push_back({1'b1, 1'b0, `C_B | 32'b0000_000000_0000, 4'b1111, 32'h0}); // 0x0000 Way0 - dqueue.push_back({1'b1, 1'b0, `C_B | 32'b0001_000000_0000, 4'b1111, 32'h0}); // 0x0400 Way1 - dqueue.push_back({1'b1, 1'b0, `C_B | 32'b0010_000000_0000, 4'b1111, 32'h0}); // 0x0800 Way2 - dqueue.push_back({1'b1, 1'b0, `C_B | 32'b0011_000000_0000, 4'b1111, 32'h0}); // 0x0C00 Way3 - dqueue.push_back({1'b1, 1'b0, `C_B | 32'b0100_000000_0000, 4'b1111, 32'h0 - }); // 0x1000 REPLACE Way0 - - // Way0 Way1 Way2 Way3 - // Tag 0100 0001 0010 0011 - // TagRAM 010001 000101 001001 001101 - // HEX 11 5 9 D - // LRU 1 0 0 1 - - // ============================================== - // Replace Dirt -> Read (~hit & dirt_valid & ~wr) - // ============================================== - dqueue.push_back({1'b1, 1'b1, `C_B | 32'b0100_000000_0000, 4'b1111, 32'hAAAAAAAA - }); // Way0 Dirty - dqueue.push_back({1'b1, 1'b1, `C_B | 32'b0001_000000_0000, 4'b1111, 32'hBBBBBBBB - }); // Way1 Dirty - dqueue.push_back({1'b1, 1'b1, `C_B | 32'b0010_000000_0000, 4'b1111, 32'hCCCCCCCC - }); // Way2 Dirty - dqueue.push_back({1'b1, 1'b1, `C_B | 32'b0011_000000_0000, 4'b1111, 32'hDDDDDDDD - }); // Way3 Dirty - dqueue.push_back({1'b1, 1'b0, `C_B | 32'b0000_000000_0000, 4'b1111, 32'h0 - }); // READ + REPLACE Way0 - - // Way Tag Dirt Data TagRAM LRU - // Way0 0000 0 ???????? 000001->1 1 - // Way1 0001 1 BBBBBBBB 000111->7 0 - // Way2 0010 1 CCCCCCCC 001011->B 1 - // Way3 0011 1 DDDDDDDD 001111->F 1 - - // ============================================== - // Replace Dirt -> Write (~hit & dirt_valid & wr) - // ============================================== - dqueue.push_back({1'b1, 1'b1, `C_B | 32'b0000_000000_0000, 4'b1111, 32'hAAAAAAAA - }); // Way0 Dirty - dqueue.push_back({1'b1, 1'b1, `C_B | 32'b0100_000000_0000, 4'b1100, 32'hA5A5A5A5 - }); // WRITE + REPLACE Way1 - - // Way Tag Dirt Data TagRAM LRU - // Way0 0000 1 AAAAAAAA 000011->03 0 - // Way1 0100 1 A5A5AAAA 010011->13 1 - // Way2 0010 1 CCCCCCCC 001011->0B 0 - // Way3 0011 1 DDDDDDDD 001111->0F 0 - - // ===================================== - // Read on Dirt (hit & dirt_valid & ~wr) - // ===================================== - dqueue.push_back({1'b1, 1'b0, `C_B | 32'b0000_000000_0000, 4'b1111, 32'h0}); // Read Way0 - dqueue.push_back({1'b1, 1'b0, `C_B | 32'b0100_000000_0000, 4'b1111, 32'h0}); // Read Way1 - dqueue.push_back({1'b1, 1'b0, `C_B | 32'b0010_000000_0000, 4'b1111, 32'h0}); // Read Way2 - dqueue.push_back({1'b1, 1'b0, `C_B | 32'b0011_000000_0000, 4'b1111, 32'h0}); // Read Way3 - - // Way Tag Dirt Data TagRAM LRU - // Way0 0000 1 AAAAAAAA 000011->03 0 - // Way1 0100 1 A5A5AAAA 010011->13 0 - // Way2 0010 1 CCCCCCCC 001011->0B 0 - // Way3 0011 1 DDDDDDDD 001111->0F 1 - - // ===================================== - // Write on Dirt (hit & dirt_valid & wr) - // ===================================== - dqueue.push_back({1'b1, 1'b1, `C_B | 32'b0000_000000_0000, 4'b1100, 32'hBBBBBBBB - }); // Write Way0 - dqueue.push_back({1'b1, 1'b1, `C_B | 32'b0100_000000_0000, 4'b0100, 32'hBBBBBBBB - }); // Write Way1 - dqueue.push_back({1'b1, 1'b1, `C_B | 32'b0010_000000_0000, 4'b0010, 32'hAAAAAAAA - }); // Write Way2 - dqueue.push_back({1'b1, 1'b1, `C_B | 32'b0011_000000_0000, 4'b0011, 32'hAAAAAAAA - }); // Write Way3 - - // Way Tag Dirt Data TagRAM LRU - // Way0 0000 1 BBBBAAAA 000011->03 0 - // Way1 0100 1 A5BBAAAA 010011->13 0 - // Way2 0010 1 CCCCAACC 001011->0B 1 - // Way3 0011 1 DDDDAAAA 001111->0F 1 - - // ============== - // Basic Function - // ============== - dqueue.push_back({1'b1, 1'b1, `C_B | 32'd0, 4'b1111, 32'h12345678}); - dqueue.push_back({1'b1, 1'b1, `C_B | 32'd0, 4'b1100, 32'hABCDEFAB}); - dqueue.push_back({1'b1, 1'b0, `C_B | 32'd0, 4'b1111, 32'h12345678}); - dqueue.push_back({1'b1, 1'b0, `C_B | 32'd0, 4'b0011, 32'hABCDEFAB}); - dqueue.push_back({1'b1, 1'b1, `U_B | 32'd0, 4'b1111, 32'hA5A5A5A5}); - dqueue.push_back({1'b1, 1'b0, `U_B | 32'd0, 4'b1111, 32'hABCDEFAB}); - - // ====================================================================== - // =============================== ICache =============================== - // ====================================================================== - - // Replace Test - iqueue.push_back({1'b1, `C_B | 32'b0000_000000_0000}); // Way0 - iqueue.push_back({1'b1, `C_B | 32'b0001_000000_0000}); // Way1 - iqueue.push_back({1'b1, `C_B | 32'b0010_000000_0000}); // Way2 - iqueue.push_back({1'b1, `C_B | 32'b0011_000000_0000}); // Way3 - iqueue.push_back({1'b1, `C_B | 32'b0100_000000_0000}); // REPLACE Way0 - - // Way0 Way1 Way2 Way3 - // 0100 0001 0010 0011 - - // Cached + Uncached - iqueue.push_back({1'b1, `C_B + 0}); - iqueue.push_back({1'b1, `C_B + 0}); - iqueue.push_back({1'b1, `C_B + 0}); - iqueue.push_back({1'b1, `U_B + 0}); - iqueue.push_back({1'b1, `U_B + 0}); - iqueue.push_back({1'b1, `U_B + 0}); - - - resetn = 0; - #5; - resetn = 1; - end - - initial begin - clk = 1; - forever begin - #10 clk = ~clk; - end - end - - always_ff @(posedge cpu_clk) begin - if (~cpu_resetn) begin - counter = 0; - counter_inst = 0; - counter_data = 0; - {inst.req, inst.addr} = 0; - {data.req, data.wr, data.addr, data.wstrb, data.wdata} = 0; - end else begin - if (inst.addr_ok & iqueue.size() > 0) begin - {inst.req, inst.addr} = iqueue.pop_front(); - $display("[%d]inst: %d 0x%h", counter, inst.req, inst.addr); - counter_inst = counter_inst + 1; - end - if (data.addr_ok & dqueue.size() > 0) begin - {data.req, data.wr, data.addr, data.wstrb, data.wdata} = dqueue.pop_front(); - $display("[%d]data: %d %d 0x%h 0x%h 0x%h", counter, data.req, data.wr, data.addr, - data.wstrb, data.wdata); - counter_data = counter_data + 1; - end - end - - counter = counter + 1; - - end - -endmodule - - diff --git a/src/testbench/MMU/tmp.coe b/src/testbench/MMU/tmp.coe deleted file mode 100644 index 62f410f..0000000 --- a/src/testbench/MMU/tmp.coe +++ /dev/null @@ -1,4098 +0,0 @@ -memory_initialization_radix=16; -memory_initialization_vector= -00000000, -00000001, -00000002, -00000003, -00000004, -00000005, -00000006, -00000007, -00000008, -00000009, -0000000a, -0000000b, -0000000c, -0000000d, -0000000e, -0000000f, -00000010, -00000011, -00000012, -00000013, -00000014, -00000015, -00000016, -00000017, -00000018, -00000019, -0000001a, -0000001b, -0000001c, -0000001d, -0000001e, -0000001f, -00000020, -00000021, -00000022, -00000023, -00000024, -00000025, -00000026, -00000027, -00000028, -00000029, -0000002a, -0000002b, -0000002c, -0000002d, -0000002e, -0000002f, -00000030, -00000031, -00000032, -00000033, -00000034, -00000035, -00000036, -00000037, -00000038, -00000039, -0000003a, -0000003b, -0000003c, -0000003d, -0000003e, -0000003f, -00000040, -00000041, -00000042, -00000043, -00000044, -00000045, -00000046, -00000047, -00000048, -00000049, -0000004a, -0000004b, -0000004c, -0000004d, -0000004e, -0000004f, -00000050, -00000051, -00000052, -00000053, -00000054, -00000055, -00000056, -00000057, -00000058, -00000059, -0000005a, -0000005b, -0000005c, -0000005d, -0000005e, -0000005f, -00000060, -00000061, -00000062, -00000063, -00000064, -00000065, -00000066, -00000067, -00000068, -00000069, -0000006a, -0000006b, -0000006c, -0000006d, -0000006e, -0000006f, -00000070, -00000071, -00000072, -00000073, -00000074, -00000075, -00000076, -00000077, -00000078, -00000079, -0000007a, -0000007b, -0000007c, -0000007d, -0000007e, -0000007f, -00000080, -00000081, -00000082, -00000083, -00000084, -00000085, -00000086, -00000087, -00000088, -00000089, -0000008a, -0000008b, -0000008c, -0000008d, -0000008e, -0000008f, -00000090, -00000091, -00000092, -00000093, -00000094, -00000095, -00000096, -00000097, -00000098, -00000099, -0000009a, -0000009b, -0000009c, -0000009d, -0000009e, -0000009f, -000000a0, -000000a1, -000000a2, -000000a3, -000000a4, -000000a5, -000000a6, -000000a7, -000000a8, -000000a9, -000000aa, -000000ab, -000000ac, -000000ad, -000000ae, -000000af, -000000b0, -000000b1, -000000b2, -000000b3, -000000b4, -000000b5, -000000b6, -000000b7, -000000b8, -000000b9, -000000ba, -000000bb, -000000bc, -000000bd, -000000be, -000000bf, -000000c0, -000000c1, -000000c2, -000000c3, -000000c4, -000000c5, -000000c6, -000000c7, -000000c8, -000000c9, -000000ca, -000000cb, -000000cc, -000000cd, -000000ce, -000000cf, -000000d0, -000000d1, -000000d2, -000000d3, -000000d4, -000000d5, -000000d6, -000000d7, -000000d8, -000000d9, -000000da, -000000db, -000000dc, -000000dd, -000000de, -000000df, -000000e0, -000000e1, -000000e2, -000000e3, -000000e4, -000000e5, -000000e6, -000000e7, -000000e8, -000000e9, -000000ea, -000000eb, -000000ec, -000000ed, -000000ee, -000000ef, -000000f0, -000000f1, -000000f2, -000000f3, -000000f4, -000000f5, -000000f6, -000000f7, -000000f8, -000000f9, -000000fa, -000000fb, -000000fc, -000000fd, -000000fe, -000000ff, -00000100, -00000101, -00000102, -00000103, -00000104, -00000105, -00000106, -00000107, -00000108, -00000109, -0000010a, -0000010b, -0000010c, -0000010d, -0000010e, -0000010f, -00000110, -00000111, -00000112, -00000113, -00000114, -00000115, -00000116, -00000117, -00000118, -00000119, -0000011a, -0000011b, -0000011c, -0000011d, -0000011e, -0000011f, -00000120, -00000121, -00000122, -00000123, -00000124, -00000125, -00000126, -00000127, -00000128, -00000129, -0000012a, -0000012b, -0000012c, -0000012d, -0000012e, -0000012f, -00000130, -00000131, -00000132, -00000133, -00000134, -00000135, -00000136, -00000137, -00000138, -00000139, -0000013a, -0000013b, -0000013c, -0000013d, -0000013e, -0000013f, -00000140, -00000141, -00000142, -00000143, -00000144, -00000145, -00000146, -00000147, -00000148, -00000149, -0000014a, -0000014b, -0000014c, -0000014d, -0000014e, -0000014f, -00000150, -00000151, -00000152, -00000153, -00000154, -00000155, -00000156, -00000157, -00000158, -00000159, -0000015a, -0000015b, -0000015c, -0000015d, -0000015e, -0000015f, -00000160, -00000161, -00000162, -00000163, -00000164, -00000165, -00000166, -00000167, -00000168, -00000169, -0000016a, -0000016b, -0000016c, -0000016d, -0000016e, -0000016f, -00000170, -00000171, -00000172, -00000173, -00000174, -00000175, -00000176, -00000177, -00000178, -00000179, -0000017a, -0000017b, -0000017c, -0000017d, -0000017e, -0000017f, -00000180, -00000181, -00000182, -00000183, -00000184, -00000185, -00000186, -00000187, -00000188, -00000189, -0000018a, -0000018b, -0000018c, -0000018d, -0000018e, -0000018f, -00000190, -00000191, -00000192, -00000193, -00000194, -00000195, -00000196, -00000197, -00000198, -00000199, -0000019a, -0000019b, -0000019c, -0000019d, -0000019e, -0000019f, -000001a0, -000001a1, -000001a2, -000001a3, -000001a4, -000001a5, -000001a6, -000001a7, -000001a8, -000001a9, -000001aa, -000001ab, -000001ac, -000001ad, -000001ae, -000001af, -000001b0, -000001b1, -000001b2, -000001b3, -000001b4, -000001b5, -000001b6, -000001b7, -000001b8, -000001b9, -000001ba, -000001bb, -000001bc, -000001bd, -000001be, -000001bf, -000001c0, -000001c1, -000001c2, -000001c3, -000001c4, -000001c5, -000001c6, -000001c7, -000001c8, -000001c9, -000001ca, -000001cb, -000001cc, -000001cd, -000001ce, -000001cf, -000001d0, -000001d1, -000001d2, -000001d3, -000001d4, -000001d5, -000001d6, -000001d7, -000001d8, -000001d9, -000001da, -000001db, -000001dc, -000001dd, -000001de, -000001df, -000001e0, -000001e1, -000001e2, -000001e3, -000001e4, -000001e5, -000001e6, -000001e7, -000001e8, -000001e9, -000001ea, -000001eb, -000001ec, -000001ed, -000001ee, -000001ef, -000001f0, -000001f1, -000001f2, -000001f3, -000001f4, -000001f5, -000001f6, -000001f7, -000001f8, -000001f9, -000001fa, -000001fb, -000001fc, -000001fd, -000001fe, -000001ff, -00000200, -00000201, -00000202, -00000203, -00000204, -00000205, -00000206, -00000207, -00000208, -00000209, -0000020a, -0000020b, -0000020c, -0000020d, -0000020e, -0000020f, -00000210, -00000211, -00000212, -00000213, -00000214, -00000215, -00000216, -00000217, -00000218, -00000219, -0000021a, -0000021b, -0000021c, -0000021d, -0000021e, -0000021f, -00000220, -00000221, -00000222, -00000223, -00000224, -00000225, -00000226, -00000227, -00000228, -00000229, -0000022a, -0000022b, -0000022c, -0000022d, -0000022e, -0000022f, -00000230, -00000231, -00000232, -00000233, -00000234, -00000235, -00000236, -00000237, -00000238, -00000239, -0000023a, -0000023b, -0000023c, -0000023d, -0000023e, -0000023f, -00000240, -00000241, -00000242, -00000243, -00000244, -00000245, -00000246, -00000247, -00000248, -00000249, -0000024a, -0000024b, -0000024c, -0000024d, -0000024e, -0000024f, -00000250, -00000251, -00000252, -00000253, -00000254, -00000255, -00000256, -00000257, -00000258, -00000259, -0000025a, -0000025b, -0000025c, -0000025d, -0000025e, -0000025f, -00000260, -00000261, -00000262, -00000263, -00000264, -00000265, -00000266, -00000267, -00000268, -00000269, -0000026a, -0000026b, -0000026c, -0000026d, -0000026e, -0000026f, -00000270, -00000271, -00000272, -00000273, -00000274, -00000275, -00000276, -00000277, -00000278, -00000279, -0000027a, -0000027b, -0000027c, -0000027d, -0000027e, -0000027f, -00000280, -00000281, -00000282, -00000283, -00000284, -00000285, -00000286, -00000287, -00000288, -00000289, -0000028a, -0000028b, -0000028c, -0000028d, -0000028e, -0000028f, -00000290, -00000291, -00000292, -00000293, -00000294, -00000295, -00000296, -00000297, -00000298, -00000299, -0000029a, -0000029b, -0000029c, -0000029d, -0000029e, -0000029f, -000002a0, -000002a1, -000002a2, -000002a3, -000002a4, -000002a5, -000002a6, -000002a7, -000002a8, -000002a9, -000002aa, -000002ab, -000002ac, -000002ad, -000002ae, -000002af, -000002b0, -000002b1, -000002b2, -000002b3, -000002b4, -000002b5, -000002b6, -000002b7, -000002b8, -000002b9, -000002ba, -000002bb, -000002bc, -000002bd, -000002be, -000002bf, -000002c0, -000002c1, -000002c2, -000002c3, -000002c4, -000002c5, -000002c6, -000002c7, -000002c8, -000002c9, -000002ca, -000002cb, -000002cc, -000002cd, -000002ce, -000002cf, -000002d0, -000002d1, -000002d2, -000002d3, -000002d4, -000002d5, -000002d6, -000002d7, -000002d8, -000002d9, -000002da, -000002db, -000002dc, -000002dd, -000002de, -000002df, -000002e0, -000002e1, -000002e2, -000002e3, -000002e4, -000002e5, -000002e6, -000002e7, -000002e8, -000002e9, -000002ea, -000002eb, -000002ec, -000002ed, -000002ee, -000002ef, -000002f0, -000002f1, -000002f2, -000002f3, -000002f4, -000002f5, -000002f6, -000002f7, -000002f8, -000002f9, -000002fa, -000002fb, -000002fc, -000002fd, -000002fe, -000002ff, -00000300, -00000301, -00000302, -00000303, -00000304, -00000305, -00000306, -00000307, -00000308, -00000309, -0000030a, -0000030b, -0000030c, -0000030d, -0000030e, -0000030f, -00000310, -00000311, -00000312, -00000313, -00000314, -00000315, -00000316, -00000317, -00000318, -00000319, -0000031a, -0000031b, -0000031c, -0000031d, -0000031e, -0000031f, -00000320, -00000321, -00000322, -00000323, -00000324, -00000325, -00000326, -00000327, -00000328, -00000329, -0000032a, -0000032b, -0000032c, -0000032d, -0000032e, -0000032f, -00000330, -00000331, -00000332, -00000333, -00000334, -00000335, -00000336, -00000337, -00000338, -00000339, -0000033a, -0000033b, -0000033c, -0000033d, -0000033e, -0000033f, -00000340, -00000341, -00000342, -00000343, -00000344, -00000345, -00000346, -00000347, -00000348, -00000349, -0000034a, -0000034b, -0000034c, -0000034d, -0000034e, -0000034f, -00000350, -00000351, -00000352, -00000353, -00000354, -00000355, -00000356, -00000357, -00000358, -00000359, -0000035a, -0000035b, -0000035c, -0000035d, -0000035e, -0000035f, -00000360, -00000361, -00000362, -00000363, -00000364, -00000365, -00000366, -00000367, -00000368, -00000369, -0000036a, -0000036b, -0000036c, -0000036d, -0000036e, -0000036f, -00000370, -00000371, -00000372, -00000373, -00000374, -00000375, -00000376, -00000377, -00000378, -00000379, -0000037a, -0000037b, -0000037c, -0000037d, -0000037e, -0000037f, -00000380, -00000381, -00000382, -00000383, -00000384, -00000385, -00000386, -00000387, -00000388, -00000389, -0000038a, -0000038b, -0000038c, -0000038d, -0000038e, -0000038f, -00000390, -00000391, -00000392, -00000393, -00000394, -00000395, -00000396, -00000397, -00000398, -00000399, -0000039a, -0000039b, -0000039c, -0000039d, -0000039e, -0000039f, -000003a0, -000003a1, -000003a2, -000003a3, -000003a4, -000003a5, -000003a6, -000003a7, -000003a8, -000003a9, -000003aa, -000003ab, -000003ac, -000003ad, -000003ae, -000003af, -000003b0, -000003b1, -000003b2, -000003b3, -000003b4, -000003b5, -000003b6, -000003b7, -000003b8, -000003b9, -000003ba, -000003bb, -000003bc, -000003bd, -000003be, -000003bf, -000003c0, -000003c1, -000003c2, -000003c3, -000003c4, -000003c5, -000003c6, -000003c7, -000003c8, -000003c9, -000003ca, -000003cb, -000003cc, -000003cd, -000003ce, -000003cf, -000003d0, -000003d1, -000003d2, -000003d3, -000003d4, -000003d5, -000003d6, -000003d7, -000003d8, -000003d9, -000003da, -000003db, -000003dc, -000003dd, -000003de, -000003df, -000003e0, -000003e1, -000003e2, -000003e3, -000003e4, -000003e5, -000003e6, -000003e7, -000003e8, -000003e9, -000003ea, -000003eb, -000003ec, -000003ed, -000003ee, -000003ef, -000003f0, -000003f1, -000003f2, -000003f3, -000003f4, -000003f5, -000003f6, -000003f7, -000003f8, -000003f9, -000003fa, -000003fb, -000003fc, -000003fd, -000003fe, -000003ff, -00000400, -00000401, -00000402, -00000403, -00000404, -00000405, -00000406, -00000407, -00000408, -00000409, -0000040a, -0000040b, -0000040c, -0000040d, -0000040e, -0000040f, -00000410, -00000411, -00000412, -00000413, -00000414, -00000415, -00000416, -00000417, -00000418, -00000419, -0000041a, -0000041b, -0000041c, -0000041d, -0000041e, -0000041f, -00000420, -00000421, -00000422, -00000423, -00000424, -00000425, -00000426, -00000427, -00000428, -00000429, -0000042a, -0000042b, -0000042c, -0000042d, -0000042e, -0000042f, -00000430, -00000431, -00000432, -00000433, -00000434, -00000435, -00000436, -00000437, -00000438, -00000439, -0000043a, -0000043b, -0000043c, -0000043d, -0000043e, -0000043f, -00000440, -00000441, -00000442, -00000443, -00000444, -00000445, -00000446, -00000447, -00000448, -00000449, -0000044a, -0000044b, -0000044c, -0000044d, -0000044e, -0000044f, -00000450, -00000451, -00000452, -00000453, -00000454, -00000455, -00000456, -00000457, -00000458, -00000459, -0000045a, -0000045b, -0000045c, -0000045d, -0000045e, -0000045f, -00000460, -00000461, -00000462, -00000463, -00000464, -00000465, -00000466, -00000467, -00000468, -00000469, -0000046a, -0000046b, -0000046c, -0000046d, -0000046e, -0000046f, -00000470, -00000471, -00000472, -00000473, -00000474, -00000475, -00000476, -00000477, -00000478, -00000479, -0000047a, -0000047b, -0000047c, -0000047d, -0000047e, -0000047f, -00000480, -00000481, -00000482, -00000483, -00000484, -00000485, -00000486, -00000487, -00000488, -00000489, -0000048a, -0000048b, -0000048c, -0000048d, -0000048e, -0000048f, -00000490, -00000491, -00000492, -00000493, -00000494, -00000495, -00000496, -00000497, -00000498, -00000499, -0000049a, -0000049b, -0000049c, -0000049d, -0000049e, -0000049f, -000004a0, -000004a1, -000004a2, -000004a3, -000004a4, -000004a5, -000004a6, -000004a7, -000004a8, -000004a9, -000004aa, -000004ab, -000004ac, -000004ad, -000004ae, -000004af, -000004b0, -000004b1, -000004b2, -000004b3, -000004b4, -000004b5, -000004b6, -000004b7, -000004b8, -000004b9, -000004ba, -000004bb, -000004bc, -000004bd, -000004be, -000004bf, -000004c0, -000004c1, -000004c2, -000004c3, -000004c4, -000004c5, -000004c6, -000004c7, -000004c8, -000004c9, -000004ca, -000004cb, -000004cc, -000004cd, -000004ce, -000004cf, -000004d0, -000004d1, -000004d2, -000004d3, -000004d4, -000004d5, -000004d6, -000004d7, -000004d8, -000004d9, -000004da, -000004db, -000004dc, -000004dd, -000004de, -000004df, -000004e0, -000004e1, -000004e2, -000004e3, -000004e4, -000004e5, -000004e6, -000004e7, -000004e8, -000004e9, -000004ea, -000004eb, -000004ec, -000004ed, -000004ee, -000004ef, -000004f0, -000004f1, -000004f2, -000004f3, -000004f4, -000004f5, -000004f6, -000004f7, -000004f8, -000004f9, -000004fa, -000004fb, -000004fc, -000004fd, -000004fe, -000004ff, -00000500, -00000501, -00000502, -00000503, -00000504, -00000505, -00000506, -00000507, -00000508, -00000509, -0000050a, -0000050b, -0000050c, -0000050d, -0000050e, -0000050f, -00000510, -00000511, -00000512, -00000513, -00000514, -00000515, -00000516, -00000517, -00000518, -00000519, -0000051a, -0000051b, -0000051c, -0000051d, -0000051e, -0000051f, -00000520, -00000521, -00000522, -00000523, -00000524, -00000525, -00000526, -00000527, -00000528, -00000529, -0000052a, -0000052b, -0000052c, -0000052d, -0000052e, -0000052f, -00000530, -00000531, -00000532, -00000533, -00000534, -00000535, -00000536, -00000537, -00000538, -00000539, -0000053a, -0000053b, -0000053c, -0000053d, -0000053e, -0000053f, -00000540, -00000541, -00000542, -00000543, -00000544, -00000545, -00000546, -00000547, -00000548, -00000549, -0000054a, -0000054b, -0000054c, -0000054d, -0000054e, -0000054f, -00000550, -00000551, -00000552, -00000553, -00000554, -00000555, -00000556, -00000557, -00000558, -00000559, -0000055a, -0000055b, -0000055c, -0000055d, -0000055e, -0000055f, -00000560, -00000561, -00000562, -00000563, -00000564, -00000565, -00000566, -00000567, -00000568, -00000569, -0000056a, -0000056b, -0000056c, -0000056d, -0000056e, -0000056f, -00000570, -00000571, -00000572, -00000573, -00000574, -00000575, -00000576, -00000577, -00000578, -00000579, -0000057a, -0000057b, -0000057c, -0000057d, -0000057e, -0000057f, -00000580, -00000581, -00000582, -00000583, -00000584, -00000585, -00000586, -00000587, -00000588, -00000589, -0000058a, -0000058b, -0000058c, -0000058d, -0000058e, -0000058f, -00000590, -00000591, -00000592, -00000593, -00000594, -00000595, -00000596, -00000597, -00000598, -00000599, -0000059a, -0000059b, -0000059c, -0000059d, -0000059e, -0000059f, -000005a0, -000005a1, -000005a2, -000005a3, -000005a4, -000005a5, -000005a6, -000005a7, -000005a8, -000005a9, -000005aa, -000005ab, -000005ac, -000005ad, -000005ae, -000005af, -000005b0, -000005b1, -000005b2, -000005b3, -000005b4, -000005b5, -000005b6, -000005b7, -000005b8, -000005b9, -000005ba, -000005bb, -000005bc, -000005bd, -000005be, -000005bf, -000005c0, -000005c1, -000005c2, -000005c3, -000005c4, -000005c5, -000005c6, -000005c7, -000005c8, -000005c9, -000005ca, -000005cb, -000005cc, -000005cd, -000005ce, -000005cf, -000005d0, -000005d1, -000005d2, -000005d3, -000005d4, -000005d5, -000005d6, -000005d7, -000005d8, -000005d9, -000005da, -000005db, -000005dc, -000005dd, -000005de, -000005df, -000005e0, -000005e1, -000005e2, -000005e3, -000005e4, -000005e5, -000005e6, -000005e7, -000005e8, -000005e9, -000005ea, -000005eb, -000005ec, -000005ed, -000005ee, -000005ef, -000005f0, -000005f1, -000005f2, -000005f3, -000005f4, -000005f5, -000005f6, -000005f7, -000005f8, -000005f9, -000005fa, -000005fb, -000005fc, -000005fd, -000005fe, -000005ff, -00000600, -00000601, -00000602, -00000603, -00000604, -00000605, -00000606, -00000607, -00000608, -00000609, -0000060a, -0000060b, -0000060c, -0000060d, -0000060e, -0000060f, -00000610, -00000611, -00000612, -00000613, -00000614, -00000615, -00000616, -00000617, -00000618, -00000619, -0000061a, -0000061b, -0000061c, -0000061d, -0000061e, -0000061f, -00000620, -00000621, -00000622, -00000623, -00000624, -00000625, -00000626, -00000627, -00000628, -00000629, -0000062a, -0000062b, -0000062c, -0000062d, -0000062e, -0000062f, -00000630, -00000631, -00000632, -00000633, -00000634, -00000635, -00000636, -00000637, -00000638, -00000639, -0000063a, -0000063b, -0000063c, -0000063d, -0000063e, -0000063f, -00000640, -00000641, -00000642, -00000643, -00000644, -00000645, -00000646, -00000647, -00000648, -00000649, -0000064a, -0000064b, -0000064c, -0000064d, -0000064e, -0000064f, -00000650, -00000651, -00000652, -00000653, -00000654, -00000655, -00000656, -00000657, -00000658, -00000659, -0000065a, -0000065b, -0000065c, -0000065d, -0000065e, -0000065f, -00000660, -00000661, -00000662, -00000663, -00000664, -00000665, -00000666, -00000667, -00000668, -00000669, -0000066a, -0000066b, -0000066c, -0000066d, -0000066e, -0000066f, -00000670, -00000671, -00000672, -00000673, -00000674, -00000675, -00000676, -00000677, -00000678, -00000679, -0000067a, -0000067b, -0000067c, -0000067d, -0000067e, -0000067f, -00000680, -00000681, -00000682, -00000683, -00000684, -00000685, -00000686, -00000687, -00000688, -00000689, -0000068a, -0000068b, -0000068c, -0000068d, -0000068e, -0000068f, -00000690, -00000691, -00000692, -00000693, -00000694, -00000695, -00000696, -00000697, -00000698, -00000699, -0000069a, -0000069b, -0000069c, -0000069d, -0000069e, -0000069f, -000006a0, -000006a1, -000006a2, -000006a3, -000006a4, -000006a5, -000006a6, -000006a7, -000006a8, -000006a9, -000006aa, -000006ab, -000006ac, -000006ad, -000006ae, -000006af, -000006b0, -000006b1, -000006b2, -000006b3, -000006b4, -000006b5, -000006b6, -000006b7, -000006b8, -000006b9, -000006ba, -000006bb, -000006bc, -000006bd, -000006be, -000006bf, -000006c0, -000006c1, -000006c2, -000006c3, -000006c4, -000006c5, -000006c6, -000006c7, -000006c8, -000006c9, -000006ca, -000006cb, -000006cc, -000006cd, -000006ce, -000006cf, -000006d0, -000006d1, -000006d2, -000006d3, -000006d4, -000006d5, -000006d6, -000006d7, -000006d8, -000006d9, -000006da, -000006db, -000006dc, -000006dd, -000006de, -000006df, -000006e0, -000006e1, -000006e2, -000006e3, -000006e4, -000006e5, -000006e6, -000006e7, -000006e8, -000006e9, -000006ea, -000006eb, -000006ec, -000006ed, -000006ee, -000006ef, -000006f0, -000006f1, -000006f2, -000006f3, -000006f4, -000006f5, -000006f6, -000006f7, -000006f8, -000006f9, -000006fa, -000006fb, -000006fc, -000006fd, -000006fe, -000006ff, -00000700, -00000701, -00000702, -00000703, -00000704, -00000705, -00000706, -00000707, -00000708, -00000709, -0000070a, -0000070b, -0000070c, -0000070d, -0000070e, -0000070f, -00000710, -00000711, -00000712, -00000713, -00000714, -00000715, -00000716, -00000717, -00000718, -00000719, -0000071a, -0000071b, -0000071c, -0000071d, -0000071e, -0000071f, -00000720, -00000721, -00000722, -00000723, -00000724, -00000725, -00000726, -00000727, -00000728, -00000729, -0000072a, -0000072b, -0000072c, -0000072d, -0000072e, -0000072f, -00000730, -00000731, -00000732, -00000733, -00000734, -00000735, -00000736, -00000737, -00000738, -00000739, -0000073a, -0000073b, -0000073c, -0000073d, -0000073e, -0000073f, -00000740, -00000741, -00000742, -00000743, -00000744, -00000745, -00000746, -00000747, -00000748, -00000749, -0000074a, -0000074b, -0000074c, -0000074d, -0000074e, -0000074f, -00000750, -00000751, -00000752, -00000753, -00000754, -00000755, -00000756, -00000757, -00000758, -00000759, -0000075a, -0000075b, -0000075c, -0000075d, -0000075e, -0000075f, -00000760, -00000761, -00000762, -00000763, -00000764, -00000765, -00000766, -00000767, -00000768, -00000769, -0000076a, -0000076b, -0000076c, -0000076d, -0000076e, -0000076f, -00000770, -00000771, -00000772, -00000773, -00000774, -00000775, -00000776, -00000777, -00000778, -00000779, -0000077a, -0000077b, -0000077c, -0000077d, -0000077e, -0000077f, -00000780, -00000781, -00000782, -00000783, -00000784, -00000785, -00000786, -00000787, -00000788, -00000789, -0000078a, -0000078b, -0000078c, -0000078d, -0000078e, -0000078f, -00000790, -00000791, -00000792, -00000793, -00000794, -00000795, -00000796, -00000797, -00000798, -00000799, -0000079a, -0000079b, -0000079c, -0000079d, -0000079e, -0000079f, -000007a0, -000007a1, -000007a2, -000007a3, -000007a4, -000007a5, -000007a6, -000007a7, -000007a8, -000007a9, -000007aa, -000007ab, -000007ac, -000007ad, -000007ae, -000007af, -000007b0, -000007b1, -000007b2, -000007b3, -000007b4, -000007b5, -000007b6, -000007b7, -000007b8, -000007b9, -000007ba, -000007bb, -000007bc, -000007bd, -000007be, -000007bf, -000007c0, -000007c1, -000007c2, -000007c3, -000007c4, -000007c5, -000007c6, -000007c7, -000007c8, -000007c9, -000007ca, -000007cb, -000007cc, -000007cd, -000007ce, -000007cf, -000007d0, -000007d1, -000007d2, -000007d3, -000007d4, -000007d5, -000007d6, -000007d7, -000007d8, -000007d9, -000007da, -000007db, -000007dc, -000007dd, -000007de, -000007df, -000007e0, -000007e1, -000007e2, -000007e3, -000007e4, -000007e5, -000007e6, -000007e7, -000007e8, -000007e9, -000007ea, -000007eb, -000007ec, -000007ed, -000007ee, -000007ef, -000007f0, -000007f1, -000007f2, -000007f3, -000007f4, -000007f5, -000007f6, -000007f7, -000007f8, -000007f9, -000007fa, -000007fb, -000007fc, -000007fd, -000007fe, -000007ff, -00000800, -00000801, -00000802, -00000803, -00000804, -00000805, -00000806, -00000807, -00000808, -00000809, -0000080a, -0000080b, -0000080c, -0000080d, -0000080e, -0000080f, -00000810, -00000811, -00000812, -00000813, -00000814, -00000815, -00000816, -00000817, -00000818, -00000819, -0000081a, -0000081b, -0000081c, -0000081d, -0000081e, -0000081f, -00000820, -00000821, -00000822, -00000823, -00000824, -00000825, -00000826, -00000827, -00000828, -00000829, -0000082a, -0000082b, -0000082c, -0000082d, -0000082e, -0000082f, -00000830, -00000831, -00000832, -00000833, -00000834, -00000835, -00000836, -00000837, -00000838, -00000839, -0000083a, -0000083b, -0000083c, -0000083d, -0000083e, -0000083f, -00000840, -00000841, -00000842, -00000843, -00000844, -00000845, -00000846, -00000847, -00000848, -00000849, -0000084a, -0000084b, -0000084c, -0000084d, -0000084e, -0000084f, -00000850, -00000851, -00000852, -00000853, -00000854, -00000855, -00000856, -00000857, -00000858, -00000859, -0000085a, -0000085b, -0000085c, -0000085d, -0000085e, -0000085f, -00000860, -00000861, -00000862, -00000863, -00000864, -00000865, -00000866, -00000867, -00000868, -00000869, -0000086a, -0000086b, -0000086c, -0000086d, -0000086e, -0000086f, -00000870, -00000871, -00000872, -00000873, -00000874, -00000875, -00000876, -00000877, -00000878, -00000879, -0000087a, -0000087b, -0000087c, -0000087d, -0000087e, -0000087f, -00000880, -00000881, -00000882, -00000883, -00000884, -00000885, -00000886, -00000887, -00000888, -00000889, -0000088a, -0000088b, -0000088c, -0000088d, -0000088e, -0000088f, -00000890, -00000891, -00000892, -00000893, -00000894, -00000895, -00000896, -00000897, -00000898, -00000899, -0000089a, -0000089b, -0000089c, -0000089d, -0000089e, -0000089f, -000008a0, -000008a1, -000008a2, -000008a3, -000008a4, -000008a5, -000008a6, -000008a7, -000008a8, -000008a9, -000008aa, -000008ab, -000008ac, -000008ad, -000008ae, -000008af, -000008b0, -000008b1, -000008b2, -000008b3, -000008b4, -000008b5, -000008b6, -000008b7, -000008b8, -000008b9, -000008ba, -000008bb, -000008bc, -000008bd, -000008be, -000008bf, -000008c0, -000008c1, -000008c2, -000008c3, -000008c4, -000008c5, -000008c6, -000008c7, -000008c8, -000008c9, -000008ca, -000008cb, -000008cc, -000008cd, -000008ce, -000008cf, -000008d0, -000008d1, -000008d2, -000008d3, -000008d4, -000008d5, -000008d6, -000008d7, -000008d8, -000008d9, -000008da, -000008db, -000008dc, -000008dd, -000008de, -000008df, -000008e0, -000008e1, -000008e2, -000008e3, -000008e4, -000008e5, -000008e6, -000008e7, -000008e8, -000008e9, -000008ea, -000008eb, -000008ec, -000008ed, -000008ee, -000008ef, -000008f0, -000008f1, -000008f2, -000008f3, -000008f4, -000008f5, -000008f6, -000008f7, -000008f8, -000008f9, -000008fa, -000008fb, -000008fc, -000008fd, -000008fe, -000008ff, -00000900, -00000901, -00000902, -00000903, -00000904, -00000905, -00000906, -00000907, -00000908, -00000909, -0000090a, -0000090b, -0000090c, -0000090d, -0000090e, -0000090f, -00000910, -00000911, -00000912, -00000913, -00000914, -00000915, -00000916, -00000917, -00000918, -00000919, -0000091a, -0000091b, -0000091c, -0000091d, -0000091e, -0000091f, -00000920, -00000921, -00000922, -00000923, -00000924, -00000925, -00000926, -00000927, -00000928, -00000929, -0000092a, -0000092b, -0000092c, -0000092d, -0000092e, -0000092f, -00000930, -00000931, -00000932, -00000933, -00000934, -00000935, -00000936, -00000937, -00000938, -00000939, -0000093a, -0000093b, -0000093c, -0000093d, -0000093e, -0000093f, -00000940, -00000941, -00000942, -00000943, -00000944, -00000945, -00000946, -00000947, -00000948, -00000949, -0000094a, -0000094b, -0000094c, -0000094d, -0000094e, -0000094f, -00000950, -00000951, -00000952, -00000953, -00000954, -00000955, -00000956, -00000957, -00000958, -00000959, -0000095a, -0000095b, -0000095c, -0000095d, -0000095e, -0000095f, -00000960, -00000961, -00000962, -00000963, -00000964, -00000965, -00000966, -00000967, -00000968, -00000969, -0000096a, -0000096b, -0000096c, -0000096d, -0000096e, -0000096f, -00000970, -00000971, -00000972, -00000973, -00000974, -00000975, -00000976, -00000977, -00000978, -00000979, -0000097a, -0000097b, -0000097c, -0000097d, -0000097e, -0000097f, -00000980, -00000981, -00000982, -00000983, -00000984, -00000985, -00000986, -00000987, -00000988, -00000989, -0000098a, -0000098b, -0000098c, -0000098d, -0000098e, -0000098f, -00000990, -00000991, -00000992, -00000993, -00000994, -00000995, -00000996, -00000997, -00000998, -00000999, -0000099a, -0000099b, -0000099c, -0000099d, -0000099e, -0000099f, -000009a0, -000009a1, -000009a2, -000009a3, -000009a4, -000009a5, -000009a6, -000009a7, -000009a8, -000009a9, -000009aa, -000009ab, -000009ac, -000009ad, -000009ae, -000009af, -000009b0, -000009b1, -000009b2, -000009b3, -000009b4, -000009b5, -000009b6, -000009b7, -000009b8, -000009b9, -000009ba, -000009bb, -000009bc, -000009bd, -000009be, -000009bf, -000009c0, -000009c1, -000009c2, -000009c3, -000009c4, -000009c5, -000009c6, -000009c7, -000009c8, -000009c9, -000009ca, -000009cb, -000009cc, -000009cd, -000009ce, -000009cf, -000009d0, -000009d1, -000009d2, -000009d3, -000009d4, -000009d5, -000009d6, -000009d7, -000009d8, -000009d9, -000009da, -000009db, -000009dc, -000009dd, -000009de, -000009df, -000009e0, -000009e1, -000009e2, -000009e3, -000009e4, -000009e5, -000009e6, -000009e7, -000009e8, -000009e9, -000009ea, -000009eb, -000009ec, -000009ed, -000009ee, -000009ef, -000009f0, -000009f1, -000009f2, -000009f3, -000009f4, -000009f5, -000009f6, -000009f7, -000009f8, -000009f9, -000009fa, -000009fb, -000009fc, -000009fd, -000009fe, -000009ff, -00000a00, -00000a01, -00000a02, -00000a03, -00000a04, -00000a05, -00000a06, -00000a07, -00000a08, -00000a09, -00000a0a, -00000a0b, -00000a0c, -00000a0d, -00000a0e, -00000a0f, -00000a10, -00000a11, -00000a12, -00000a13, -00000a14, -00000a15, -00000a16, -00000a17, -00000a18, -00000a19, -00000a1a, -00000a1b, -00000a1c, -00000a1d, -00000a1e, -00000a1f, -00000a20, -00000a21, -00000a22, -00000a23, -00000a24, -00000a25, -00000a26, -00000a27, -00000a28, -00000a29, -00000a2a, -00000a2b, -00000a2c, -00000a2d, -00000a2e, -00000a2f, -00000a30, -00000a31, -00000a32, -00000a33, -00000a34, -00000a35, -00000a36, -00000a37, -00000a38, -00000a39, -00000a3a, -00000a3b, -00000a3c, -00000a3d, -00000a3e, -00000a3f, -00000a40, -00000a41, -00000a42, -00000a43, -00000a44, -00000a45, -00000a46, -00000a47, -00000a48, -00000a49, -00000a4a, -00000a4b, -00000a4c, -00000a4d, -00000a4e, -00000a4f, -00000a50, -00000a51, -00000a52, -00000a53, -00000a54, -00000a55, -00000a56, -00000a57, -00000a58, -00000a59, -00000a5a, -00000a5b, -00000a5c, -00000a5d, -00000a5e, -00000a5f, -00000a60, -00000a61, -00000a62, -00000a63, -00000a64, -00000a65, -00000a66, -00000a67, -00000a68, -00000a69, -00000a6a, -00000a6b, -00000a6c, -00000a6d, -00000a6e, -00000a6f, -00000a70, -00000a71, -00000a72, -00000a73, -00000a74, -00000a75, -00000a76, -00000a77, -00000a78, -00000a79, -00000a7a, -00000a7b, -00000a7c, -00000a7d, -00000a7e, -00000a7f, -00000a80, -00000a81, -00000a82, -00000a83, -00000a84, -00000a85, -00000a86, -00000a87, -00000a88, -00000a89, -00000a8a, -00000a8b, -00000a8c, -00000a8d, -00000a8e, -00000a8f, -00000a90, -00000a91, -00000a92, -00000a93, -00000a94, -00000a95, -00000a96, -00000a97, -00000a98, -00000a99, -00000a9a, -00000a9b, -00000a9c, -00000a9d, -00000a9e, -00000a9f, -00000aa0, -00000aa1, -00000aa2, -00000aa3, -00000aa4, -00000aa5, -00000aa6, -00000aa7, -00000aa8, -00000aa9, -00000aaa, -00000aab, -00000aac, -00000aad, -00000aae, -00000aaf, -00000ab0, -00000ab1, -00000ab2, -00000ab3, -00000ab4, -00000ab5, -00000ab6, -00000ab7, -00000ab8, -00000ab9, -00000aba, -00000abb, -00000abc, -00000abd, -00000abe, -00000abf, -00000ac0, -00000ac1, -00000ac2, -00000ac3, -00000ac4, -00000ac5, -00000ac6, -00000ac7, -00000ac8, -00000ac9, -00000aca, -00000acb, -00000acc, -00000acd, -00000ace, -00000acf, -00000ad0, -00000ad1, -00000ad2, -00000ad3, -00000ad4, -00000ad5, -00000ad6, -00000ad7, -00000ad8, -00000ad9, -00000ada, -00000adb, -00000adc, -00000add, -00000ade, -00000adf, -00000ae0, -00000ae1, -00000ae2, -00000ae3, -00000ae4, -00000ae5, -00000ae6, -00000ae7, -00000ae8, -00000ae9, -00000aea, -00000aeb, -00000aec, -00000aed, -00000aee, -00000aef, -00000af0, -00000af1, -00000af2, -00000af3, -00000af4, -00000af5, -00000af6, -00000af7, -00000af8, -00000af9, -00000afa, -00000afb, -00000afc, -00000afd, -00000afe, -00000aff, -00000b00, -00000b01, -00000b02, -00000b03, -00000b04, -00000b05, -00000b06, -00000b07, -00000b08, -00000b09, -00000b0a, -00000b0b, -00000b0c, -00000b0d, -00000b0e, -00000b0f, -00000b10, -00000b11, -00000b12, -00000b13, -00000b14, -00000b15, -00000b16, -00000b17, -00000b18, -00000b19, -00000b1a, -00000b1b, -00000b1c, -00000b1d, -00000b1e, -00000b1f, -00000b20, -00000b21, -00000b22, -00000b23, -00000b24, -00000b25, -00000b26, -00000b27, -00000b28, -00000b29, -00000b2a, -00000b2b, -00000b2c, -00000b2d, -00000b2e, -00000b2f, -00000b30, -00000b31, -00000b32, -00000b33, -00000b34, -00000b35, -00000b36, -00000b37, -00000b38, -00000b39, -00000b3a, -00000b3b, -00000b3c, -00000b3d, -00000b3e, -00000b3f, -00000b40, -00000b41, -00000b42, -00000b43, -00000b44, -00000b45, -00000b46, -00000b47, -00000b48, -00000b49, -00000b4a, -00000b4b, -00000b4c, -00000b4d, -00000b4e, -00000b4f, -00000b50, -00000b51, -00000b52, -00000b53, -00000b54, -00000b55, -00000b56, -00000b57, -00000b58, -00000b59, -00000b5a, -00000b5b, -00000b5c, -00000b5d, -00000b5e, -00000b5f, -00000b60, -00000b61, -00000b62, -00000b63, -00000b64, -00000b65, -00000b66, -00000b67, -00000b68, -00000b69, -00000b6a, -00000b6b, -00000b6c, -00000b6d, -00000b6e, -00000b6f, -00000b70, -00000b71, -00000b72, -00000b73, -00000b74, -00000b75, -00000b76, -00000b77, -00000b78, -00000b79, -00000b7a, -00000b7b, -00000b7c, -00000b7d, -00000b7e, -00000b7f, -00000b80, -00000b81, -00000b82, -00000b83, -00000b84, -00000b85, -00000b86, -00000b87, -00000b88, -00000b89, -00000b8a, -00000b8b, -00000b8c, -00000b8d, -00000b8e, -00000b8f, -00000b90, -00000b91, -00000b92, -00000b93, -00000b94, -00000b95, -00000b96, -00000b97, -00000b98, -00000b99, -00000b9a, -00000b9b, -00000b9c, -00000b9d, -00000b9e, -00000b9f, -00000ba0, -00000ba1, -00000ba2, -00000ba3, -00000ba4, -00000ba5, -00000ba6, -00000ba7, -00000ba8, -00000ba9, -00000baa, -00000bab, -00000bac, -00000bad, -00000bae, -00000baf, -00000bb0, -00000bb1, -00000bb2, -00000bb3, -00000bb4, -00000bb5, -00000bb6, -00000bb7, -00000bb8, -00000bb9, -00000bba, -00000bbb, -00000bbc, -00000bbd, -00000bbe, -00000bbf, -00000bc0, -00000bc1, -00000bc2, -00000bc3, -00000bc4, -00000bc5, -00000bc6, -00000bc7, -00000bc8, -00000bc9, -00000bca, -00000bcb, -00000bcc, -00000bcd, -00000bce, -00000bcf, -00000bd0, -00000bd1, -00000bd2, -00000bd3, -00000bd4, -00000bd5, -00000bd6, -00000bd7, -00000bd8, -00000bd9, -00000bda, -00000bdb, -00000bdc, -00000bdd, -00000bde, -00000bdf, -00000be0, -00000be1, -00000be2, -00000be3, -00000be4, -00000be5, -00000be6, -00000be7, -00000be8, -00000be9, -00000bea, -00000beb, -00000bec, -00000bed, -00000bee, -00000bef, -00000bf0, -00000bf1, -00000bf2, -00000bf3, -00000bf4, -00000bf5, -00000bf6, -00000bf7, -00000bf8, -00000bf9, -00000bfa, -00000bfb, -00000bfc, -00000bfd, -00000bfe, -00000bff, -00000c00, -00000c01, -00000c02, -00000c03, -00000c04, -00000c05, -00000c06, -00000c07, -00000c08, -00000c09, -00000c0a, -00000c0b, -00000c0c, -00000c0d, -00000c0e, -00000c0f, -00000c10, -00000c11, -00000c12, -00000c13, -00000c14, -00000c15, -00000c16, -00000c17, -00000c18, -00000c19, -00000c1a, -00000c1b, -00000c1c, -00000c1d, -00000c1e, -00000c1f, -00000c20, -00000c21, -00000c22, -00000c23, -00000c24, -00000c25, -00000c26, -00000c27, -00000c28, -00000c29, -00000c2a, -00000c2b, -00000c2c, -00000c2d, -00000c2e, -00000c2f, -00000c30, -00000c31, -00000c32, -00000c33, -00000c34, -00000c35, -00000c36, -00000c37, -00000c38, -00000c39, -00000c3a, -00000c3b, -00000c3c, -00000c3d, -00000c3e, -00000c3f, -00000c40, -00000c41, -00000c42, -00000c43, -00000c44, -00000c45, -00000c46, -00000c47, -00000c48, -00000c49, -00000c4a, -00000c4b, -00000c4c, -00000c4d, -00000c4e, -00000c4f, -00000c50, -00000c51, -00000c52, -00000c53, -00000c54, -00000c55, -00000c56, -00000c57, -00000c58, -00000c59, -00000c5a, -00000c5b, -00000c5c, -00000c5d, -00000c5e, -00000c5f, -00000c60, -00000c61, -00000c62, -00000c63, -00000c64, -00000c65, -00000c66, -00000c67, -00000c68, -00000c69, -00000c6a, -00000c6b, -00000c6c, -00000c6d, -00000c6e, -00000c6f, -00000c70, -00000c71, -00000c72, -00000c73, -00000c74, -00000c75, -00000c76, -00000c77, -00000c78, -00000c79, -00000c7a, -00000c7b, -00000c7c, -00000c7d, -00000c7e, -00000c7f, -00000c80, -00000c81, -00000c82, -00000c83, -00000c84, -00000c85, -00000c86, -00000c87, -00000c88, -00000c89, -00000c8a, -00000c8b, -00000c8c, -00000c8d, -00000c8e, -00000c8f, -00000c90, -00000c91, -00000c92, -00000c93, -00000c94, -00000c95, -00000c96, -00000c97, -00000c98, -00000c99, -00000c9a, -00000c9b, -00000c9c, -00000c9d, -00000c9e, -00000c9f, -00000ca0, -00000ca1, -00000ca2, -00000ca3, -00000ca4, -00000ca5, -00000ca6, -00000ca7, -00000ca8, -00000ca9, -00000caa, -00000cab, -00000cac, -00000cad, -00000cae, -00000caf, -00000cb0, -00000cb1, -00000cb2, -00000cb3, -00000cb4, -00000cb5, -00000cb6, -00000cb7, -00000cb8, -00000cb9, -00000cba, -00000cbb, -00000cbc, -00000cbd, -00000cbe, -00000cbf, -00000cc0, -00000cc1, -00000cc2, -00000cc3, -00000cc4, -00000cc5, -00000cc6, -00000cc7, -00000cc8, -00000cc9, -00000cca, -00000ccb, -00000ccc, -00000ccd, -00000cce, -00000ccf, -00000cd0, -00000cd1, -00000cd2, -00000cd3, -00000cd4, -00000cd5, -00000cd6, -00000cd7, -00000cd8, -00000cd9, -00000cda, -00000cdb, -00000cdc, -00000cdd, -00000cde, -00000cdf, -00000ce0, -00000ce1, -00000ce2, -00000ce3, -00000ce4, -00000ce5, -00000ce6, -00000ce7, -00000ce8, -00000ce9, -00000cea, -00000ceb, -00000cec, -00000ced, -00000cee, -00000cef, -00000cf0, -00000cf1, -00000cf2, -00000cf3, -00000cf4, -00000cf5, -00000cf6, -00000cf7, -00000cf8, -00000cf9, -00000cfa, -00000cfb, -00000cfc, -00000cfd, -00000cfe, -00000cff, -00000d00, -00000d01, -00000d02, -00000d03, -00000d04, -00000d05, -00000d06, -00000d07, -00000d08, -00000d09, -00000d0a, -00000d0b, -00000d0c, -00000d0d, -00000d0e, -00000d0f, -00000d10, -00000d11, -00000d12, -00000d13, -00000d14, -00000d15, -00000d16, -00000d17, -00000d18, -00000d19, -00000d1a, -00000d1b, -00000d1c, -00000d1d, -00000d1e, -00000d1f, -00000d20, -00000d21, -00000d22, -00000d23, -00000d24, -00000d25, -00000d26, -00000d27, -00000d28, -00000d29, -00000d2a, -00000d2b, -00000d2c, -00000d2d, -00000d2e, -00000d2f, -00000d30, -00000d31, -00000d32, -00000d33, -00000d34, -00000d35, -00000d36, -00000d37, -00000d38, -00000d39, -00000d3a, -00000d3b, -00000d3c, -00000d3d, -00000d3e, -00000d3f, -00000d40, -00000d41, -00000d42, -00000d43, -00000d44, -00000d45, -00000d46, -00000d47, -00000d48, -00000d49, -00000d4a, -00000d4b, -00000d4c, -00000d4d, -00000d4e, -00000d4f, -00000d50, -00000d51, -00000d52, -00000d53, -00000d54, -00000d55, -00000d56, -00000d57, -00000d58, -00000d59, -00000d5a, -00000d5b, -00000d5c, -00000d5d, -00000d5e, -00000d5f, -00000d60, -00000d61, -00000d62, -00000d63, -00000d64, -00000d65, -00000d66, -00000d67, -00000d68, -00000d69, -00000d6a, -00000d6b, -00000d6c, -00000d6d, -00000d6e, -00000d6f, -00000d70, -00000d71, -00000d72, -00000d73, -00000d74, -00000d75, -00000d76, -00000d77, -00000d78, -00000d79, -00000d7a, -00000d7b, -00000d7c, -00000d7d, -00000d7e, -00000d7f, -00000d80, -00000d81, -00000d82, -00000d83, -00000d84, -00000d85, -00000d86, -00000d87, -00000d88, -00000d89, -00000d8a, -00000d8b, -00000d8c, -00000d8d, -00000d8e, -00000d8f, -00000d90, -00000d91, -00000d92, -00000d93, -00000d94, -00000d95, -00000d96, -00000d97, -00000d98, -00000d99, -00000d9a, -00000d9b, -00000d9c, -00000d9d, -00000d9e, -00000d9f, -00000da0, -00000da1, -00000da2, -00000da3, -00000da4, -00000da5, -00000da6, -00000da7, -00000da8, -00000da9, -00000daa, -00000dab, -00000dac, -00000dad, -00000dae, -00000daf, -00000db0, -00000db1, -00000db2, -00000db3, -00000db4, -00000db5, -00000db6, -00000db7, -00000db8, -00000db9, -00000dba, -00000dbb, -00000dbc, -00000dbd, -00000dbe, -00000dbf, -00000dc0, -00000dc1, -00000dc2, -00000dc3, -00000dc4, -00000dc5, -00000dc6, -00000dc7, -00000dc8, -00000dc9, -00000dca, -00000dcb, -00000dcc, -00000dcd, -00000dce, -00000dcf, -00000dd0, -00000dd1, -00000dd2, -00000dd3, -00000dd4, -00000dd5, -00000dd6, -00000dd7, -00000dd8, -00000dd9, -00000dda, -00000ddb, -00000ddc, -00000ddd, -00000dde, -00000ddf, -00000de0, -00000de1, -00000de2, -00000de3, -00000de4, -00000de5, -00000de6, -00000de7, -00000de8, -00000de9, -00000dea, -00000deb, -00000dec, -00000ded, -00000dee, -00000def, -00000df0, -00000df1, -00000df2, -00000df3, -00000df4, -00000df5, -00000df6, -00000df7, -00000df8, -00000df9, -00000dfa, -00000dfb, -00000dfc, -00000dfd, -00000dfe, -00000dff, -00000e00, -00000e01, -00000e02, -00000e03, -00000e04, -00000e05, -00000e06, -00000e07, -00000e08, -00000e09, -00000e0a, -00000e0b, -00000e0c, -00000e0d, -00000e0e, -00000e0f, -00000e10, -00000e11, -00000e12, -00000e13, -00000e14, -00000e15, -00000e16, -00000e17, -00000e18, -00000e19, -00000e1a, -00000e1b, -00000e1c, -00000e1d, -00000e1e, -00000e1f, -00000e20, -00000e21, -00000e22, -00000e23, -00000e24, -00000e25, -00000e26, -00000e27, -00000e28, -00000e29, -00000e2a, -00000e2b, -00000e2c, -00000e2d, -00000e2e, -00000e2f, -00000e30, -00000e31, -00000e32, -00000e33, -00000e34, -00000e35, -00000e36, -00000e37, -00000e38, -00000e39, -00000e3a, -00000e3b, -00000e3c, -00000e3d, -00000e3e, -00000e3f, -00000e40, -00000e41, -00000e42, -00000e43, -00000e44, -00000e45, -00000e46, -00000e47, -00000e48, -00000e49, -00000e4a, -00000e4b, -00000e4c, -00000e4d, -00000e4e, -00000e4f, -00000e50, -00000e51, -00000e52, -00000e53, -00000e54, -00000e55, -00000e56, -00000e57, -00000e58, -00000e59, -00000e5a, -00000e5b, -00000e5c, -00000e5d, -00000e5e, -00000e5f, -00000e60, -00000e61, -00000e62, -00000e63, -00000e64, -00000e65, -00000e66, -00000e67, -00000e68, -00000e69, -00000e6a, -00000e6b, -00000e6c, -00000e6d, -00000e6e, -00000e6f, -00000e70, -00000e71, -00000e72, -00000e73, -00000e74, -00000e75, -00000e76, -00000e77, -00000e78, -00000e79, -00000e7a, -00000e7b, -00000e7c, -00000e7d, -00000e7e, -00000e7f, -00000e80, -00000e81, -00000e82, -00000e83, -00000e84, -00000e85, -00000e86, -00000e87, -00000e88, -00000e89, -00000e8a, -00000e8b, -00000e8c, -00000e8d, -00000e8e, -00000e8f, -00000e90, -00000e91, -00000e92, -00000e93, -00000e94, -00000e95, -00000e96, -00000e97, -00000e98, -00000e99, -00000e9a, -00000e9b, -00000e9c, -00000e9d, -00000e9e, -00000e9f, -00000ea0, -00000ea1, -00000ea2, -00000ea3, -00000ea4, -00000ea5, -00000ea6, -00000ea7, -00000ea8, -00000ea9, -00000eaa, -00000eab, -00000eac, -00000ead, -00000eae, -00000eaf, -00000eb0, -00000eb1, -00000eb2, -00000eb3, -00000eb4, -00000eb5, -00000eb6, -00000eb7, -00000eb8, -00000eb9, -00000eba, -00000ebb, -00000ebc, -00000ebd, -00000ebe, -00000ebf, -00000ec0, -00000ec1, -00000ec2, -00000ec3, -00000ec4, -00000ec5, -00000ec6, -00000ec7, -00000ec8, -00000ec9, -00000eca, -00000ecb, -00000ecc, -00000ecd, -00000ece, -00000ecf, -00000ed0, -00000ed1, -00000ed2, -00000ed3, -00000ed4, -00000ed5, -00000ed6, -00000ed7, -00000ed8, -00000ed9, -00000eda, -00000edb, -00000edc, -00000edd, -00000ede, -00000edf, -00000ee0, -00000ee1, -00000ee2, -00000ee3, -00000ee4, -00000ee5, -00000ee6, -00000ee7, -00000ee8, -00000ee9, -00000eea, -00000eeb, -00000eec, -00000eed, -00000eee, -00000eef, -00000ef0, -00000ef1, -00000ef2, -00000ef3, -00000ef4, -00000ef5, -00000ef6, -00000ef7, -00000ef8, -00000ef9, -00000efa, -00000efb, -00000efc, -00000efd, -00000efe, -00000eff, -00000f00, -00000f01, -00000f02, -00000f03, -00000f04, -00000f05, -00000f06, -00000f07, -00000f08, -00000f09, -00000f0a, -00000f0b, -00000f0c, -00000f0d, -00000f0e, -00000f0f, -00000f10, -00000f11, -00000f12, -00000f13, -00000f14, -00000f15, -00000f16, -00000f17, -00000f18, -00000f19, -00000f1a, -00000f1b, -00000f1c, -00000f1d, -00000f1e, -00000f1f, -00000f20, -00000f21, -00000f22, -00000f23, -00000f24, -00000f25, -00000f26, -00000f27, -00000f28, -00000f29, -00000f2a, -00000f2b, -00000f2c, -00000f2d, -00000f2e, -00000f2f, -00000f30, -00000f31, -00000f32, -00000f33, -00000f34, -00000f35, -00000f36, -00000f37, -00000f38, -00000f39, -00000f3a, -00000f3b, -00000f3c, -00000f3d, -00000f3e, -00000f3f, -00000f40, -00000f41, -00000f42, -00000f43, -00000f44, -00000f45, -00000f46, -00000f47, -00000f48, -00000f49, -00000f4a, -00000f4b, -00000f4c, -00000f4d, -00000f4e, -00000f4f, -00000f50, -00000f51, -00000f52, -00000f53, -00000f54, -00000f55, -00000f56, -00000f57, -00000f58, -00000f59, -00000f5a, -00000f5b, -00000f5c, -00000f5d, -00000f5e, -00000f5f, -00000f60, -00000f61, -00000f62, -00000f63, -00000f64, -00000f65, -00000f66, -00000f67, -00000f68, -00000f69, -00000f6a, -00000f6b, -00000f6c, -00000f6d, -00000f6e, -00000f6f, -00000f70, -00000f71, -00000f72, -00000f73, -00000f74, -00000f75, -00000f76, -00000f77, -00000f78, -00000f79, -00000f7a, -00000f7b, -00000f7c, -00000f7d, -00000f7e, -00000f7f, -00000f80, -00000f81, -00000f82, -00000f83, -00000f84, -00000f85, -00000f86, -00000f87, -00000f88, -00000f89, -00000f8a, -00000f8b, -00000f8c, -00000f8d, -00000f8e, -00000f8f, -00000f90, -00000f91, -00000f92, -00000f93, -00000f94, -00000f95, -00000f96, -00000f97, -00000f98, -00000f99, -00000f9a, -00000f9b, -00000f9c, -00000f9d, -00000f9e, -00000f9f, -00000fa0, -00000fa1, -00000fa2, -00000fa3, -00000fa4, -00000fa5, -00000fa6, -00000fa7, -00000fa8, -00000fa9, -00000faa, -00000fab, -00000fac, -00000fad, -00000fae, -00000faf, -00000fb0, -00000fb1, -00000fb2, -00000fb3, -00000fb4, -00000fb5, -00000fb6, -00000fb7, -00000fb8, -00000fb9, -00000fba, -00000fbb, -00000fbc, -00000fbd, -00000fbe, -00000fbf, -00000fc0, -00000fc1, -00000fc2, -00000fc3, -00000fc4, -00000fc5, -00000fc6, -00000fc7, -00000fc8, -00000fc9, -00000fca, -00000fcb, -00000fcc, -00000fcd, -00000fce, -00000fcf, -00000fd0, -00000fd1, -00000fd2, -00000fd3, -00000fd4, -00000fd5, -00000fd6, -00000fd7, -00000fd8, -00000fd9, -00000fda, -00000fdb, -00000fdc, -00000fdd, -00000fde, -00000fdf, -00000fe0, -00000fe1, -00000fe2, -00000fe3, -00000fe4, -00000fe5, -00000fe6, -00000fe7, -00000fe8, -00000fe9, -00000fea, -00000feb, -00000fec, -00000fed, -00000fee, -00000fef, -00000ff0, -00000ff1, -00000ff2, -00000ff3, -00000ff4, -00000ff5, -00000ff6, -00000ff7, -00000ff8, -00000ff9, -00000ffa, -00000ffb, -00000ffc, -00000ffd, -00000ffe, -00000fff; diff --git a/src/testbench/alu/makefile b/src/testbench/alu/makefile deleted file mode 100644 index 5a1146e..0000000 --- a/src/testbench/alu/makefile +++ /dev/null @@ -1,19 +0,0 @@ -HOME = ../.. -INC = ${HOME}/include - -sources += testbench.sv -sources += ${HOME}/Core/ALU.sv - -run: test.vcd - open test.vcd - -clean: - rm -f test.vcd test.out - -test.vcd: test.out - vvp test.out - -test.out: ${sources} - iverilog -I ${INC} -g2005-sv -Wall -o $@ $^ - -.PHONY: run clean diff --git a/src/testbench/alu/testbench.sv b/src/testbench/alu/testbench.sv deleted file mode 100644 index 67d631a..0000000 --- a/src/testbench/alu/testbench.sv +++ /dev/null @@ -1,82 +0,0 @@ -`include "defines.svh" - -module testbench(); - word_t a, b; - aluctrl_t aluctrl; - word_t aluout; - logic overflow; - - alu alu( - a, b, - aluctrl, - aluout, - overflow); - - initial begin - $dumpfile("test.vcd"); - $dumpvars(0, testbench); - end - - always begin - a = 32'h00000004; b = 32'hDEADBEEF; - aluctrl = 9'b100000000; #50; // SLL - aluctrl = 9'b100000001; #50; - aluctrl = 9'b010000000; #50; // SRL - aluctrl = 9'b010000001; #50; // SRA - a = 32'd123; b = 32'd456; - aluctrl = 9'b001000000; #50; // ADD - aluctrl = 9'b001000001; #50; // SUB - a = 32'hFFFFABCD; b = 32'h0000ABCD; - aluctrl = 9'b001000000; #50; // ADD - aluctrl = 9'b001000001; #50; // SUB - a = 32'h80000000; b = 32'h80000000; - aluctrl = 9'b001000000; #50; // ADD - aluctrl = 9'b001000001; #50; // SUB - a = 32'h7FFFABCD; b = 32'h0000ABCD; - aluctrl = 9'b001000000; #50; // ADD - aluctrl = 9'b001000001; #50; // SUB - a = 32'h8000ABCC; b = 32'h0000ABCD; - aluctrl = 9'b001000000; #50; // ADD - aluctrl = 9'b001000001; #50; // SUB - a = 32'h80000000; b = 32'h7FFFFFFF; - aluctrl = 9'b001000000; #50; // ADD - aluctrl = 9'b001000001; #50; // SUB - a = 32'hABCDABCD; b = 32'hFFABAB00; - aluctrl = 9'b000100000; #50; // AND - aluctrl = 9'b000100001; #50; - aluctrl = 9'b000010000; #50; // OR - aluctrl = 9'b000010001; #50; // NOR - aluctrl = 9'b000001000; #50; // XOR - aluctrl = 9'b000001001; #50; - a = 32'hDEADBEEF; b = 32'h0000ABCD; - aluctrl = 9'b000000101; #50; // SLT - a = 32'h0000ABCD; b = 32'hDEADBEEF; - aluctrl = 9'b000000101; #50; // SLT - a = 32'h0000ABCC; b = 32'h0000ABCD; - aluctrl = 9'b000000101; #50; // SLT - a = 32'h0000ABCD; b = 32'h0000ABCC; - aluctrl = 9'b000000101; #50; // SLT - a = 32'hDEADBEEE; b = 32'hDEADBEEF; - aluctrl = 9'b000000101; #50; // SLT - a = 32'hDEADBEEF; b = 32'hDEADBEEE; - aluctrl = 9'b000000101; #50; // SLT - a = 32'hDEADBEEF; b = 32'hDEADBEEF; - aluctrl = 9'b000000101; #50; // SLT - a = 32'hDEADBEEF; b = 32'h0000ABCD; - aluctrl = 9'b000000011; #50; // SLTU - a = 32'h0000ABCD; b = 32'hDEADBEEF; - aluctrl = 9'b000000011; #50; // SLTU - a = 32'h0000ABCC; b = 32'h0000ABCD; - aluctrl = 9'b000000011; #50; // SLTU - a = 32'h0000ABCD; b = 32'h0000ABCC; - aluctrl = 9'b000000011; #50; // SLTU - a = 32'hDEADBEEE; b = 32'hDEADBEEF; - aluctrl = 9'b000000011; #50; // SLTU - a = 32'hDEADBEEF; b = 32'hDEADBEEE; - aluctrl = 9'b000000011; #50; // SLTU - a = 32'hDEADBEEF; b = 32'hDEADBEEF; - aluctrl = 9'b000000011; #50; // SLTU - $finish; - end - -endmodule diff --git a/src/testbench/happy/DCData_bram.sv b/src/testbench/happy/DCData_bram.sv deleted file mode 100644 index 1b2d56a..0000000 --- a/src/testbench/happy/DCData_bram.sv +++ /dev/null @@ -1,13 +0,0 @@ -// Make Linter Happy - -`include "DCache.svh" -`include "sram.svh" - -module DCData_bram ( - input [`DC_TAGL-`DC_INDEXL-1:0] addra, - input clka, - input DCData_t dina, - output DCData_t douta, - input wea -); -endmodule diff --git a/src/testbench/happy/DCTag_bram.sv b/src/testbench/happy/DCTag_bram.sv deleted file mode 100644 index fce8fa9..0000000 --- a/src/testbench/happy/DCTag_bram.sv +++ /dev/null @@ -1,13 +0,0 @@ -// Make Linter Happy - -`include "ICache.svh" -`include "sram.svh" - -module DCTag_bram ( - input [`DC_TAGL-`DC_INDEXL-1:0] addra, - input clka, - input DCTag_t dina, - output DCTag_t douta, - input wea -); -endmodule diff --git a/src/testbench/happy/ICData_bram.sv b/src/testbench/happy/ICData_bram.sv deleted file mode 100644 index 62f1d71..0000000 --- a/src/testbench/happy/ICData_bram.sv +++ /dev/null @@ -1,13 +0,0 @@ -// Make Linter Happy - -`include "ICache.svh" -`include "sram.svh" - -module ICData_bram ( - input [`IC_TAGL-`IC_INDEXL-1:0] addra, - input clka, - input ICData_t dina, - output ICData_t douta, - input wea -); -endmodule diff --git a/src/testbench/happy/ICTag_bram.sv b/src/testbench/happy/ICTag_bram.sv deleted file mode 100644 index 9597ba2..0000000 --- a/src/testbench/happy/ICTag_bram.sv +++ /dev/null @@ -1,13 +0,0 @@ -// Make Linter Happy - -`include "ICache.svh" -`include "sram.svh" - -module ICTag_bram ( - input [`IC_TAGL-`IC_INDEXL-1:0] addra, - input clka, - input ICTag_t dina, - output ICTag_t douta, - input wea -); -endmodule diff --git a/src/testbench/happy/div_signed.sv b/src/testbench/happy/div_signed.sv deleted file mode 100644 index 86cf7e4..0000000 --- a/src/testbench/happy/div_signed.sv +++ /dev/null @@ -1,12 +0,0 @@ -// Make Linter Happy - -module div_signed ( - input aclk, - input s_axis_dividend_tvalid, - input [31:0] s_axis_dividend_tdata, - input s_axis_divisor_tvalid, - input [31:0] s_axis_divisor_tdata, - output m_axis_dout_tvalid, - output [63:0] m_axis_dout_tdata -); -endmodule diff --git a/src/testbench/happy/div_unsigned.sv b/src/testbench/happy/div_unsigned.sv deleted file mode 100644 index 625dd78..0000000 --- a/src/testbench/happy/div_unsigned.sv +++ /dev/null @@ -1,12 +0,0 @@ -// Make Linter Happy - -module div_unsigned ( - input aclk, - input s_axis_dividend_tvalid, - input [31:0] s_axis_dividend_tdata, - input s_axis_divisor_tvalid, - input [31:0] s_axis_divisor_tdata, - output m_axis_dout_tvalid, - output [63:0] m_axis_dout_tdata -); -endmodule diff --git a/src/testbench/happy/happy.sv b/src/testbench/happy/happy.sv deleted file mode 100644 index aa88faf..0000000 --- a/src/testbench/happy/happy.sv +++ /dev/null @@ -1,170 +0,0 @@ -// Make Linter Happy - -`define TESTBENCH - -`include "ICache.svh" -`include "DCache.svh" -`include "sram.svh" -`include "AXI.svh" - -module happy (); - logic clk, rst; - - wire [3 : 0] cpu_arid; - wire [ 31:0] cpu_araddr; - wire [3 : 0] cpu_arlen; - wire [2 : 0] cpu_arsize; - wire [1 : 0] cpu_arburst; - wire [1 : 0] cpu_arlock; - wire [3 : 0] cpu_arcache; - wire [2 : 0] cpu_arprot; - wire cpu_arvalid; - wire cpu_arready; - wire [3 : 0] cpu_rid; - wire [ 31:0] cpu_rdata; - wire [1 : 0] cpu_rresp; - wire cpu_rlast; - wire cpu_rvalid; - wire cpu_rready; - wire [3 : 0] cpu_awid; - wire [ 31:0] cpu_awaddr; - wire [3 : 0] cpu_awlen; - wire [2 : 0] cpu_awsize; - wire [1 : 0] cpu_awburst; - wire [1 : 0] cpu_awlock; - wire [3 : 0] cpu_awcache; - wire [2 : 0] cpu_awprot; - wire cpu_awvalid; - wire cpu_awready; - wire [3 : 0] cpu_wid; - wire [ 31:0] cpu_wdata; - wire [3 : 0] cpu_wstrb; - wire cpu_wlast; - wire cpu_wvalid; - wire cpu_wready; - wire [3 : 0] cpu_bid; - wire [1 : 0] cpu_bresp; - wire cpu_bvalid; - wire cpu_bready; - - ICache_i ic (); - DCache_i dc (); - sramro_i inst (); - sram_i data (); - SRAM_RO_AXI_i inst_axi (); - AXIRead_i fake_axi_read (); - AXIWrite_i fake_axi_write (); - SRAM_RO_AXI_i data_rdata (); - SRAM_W_AXI_i data_wdata (); - - logic vinA, vinB; - logic voutA, voutB; - logic enA, enB; - word_t inA, inB; - word_t pinA, pinB; - word_t outA, outB; - word_t poutA, poutB; - - assign fake_axi_read.AXIReadData.arready = cpu_arready; - assign fake_axi_read.AXIReadData.rid = cpu_rid; - assign fake_axi_read.AXIReadData.rdata = cpu_rdata; - assign fake_axi_read.AXIReadData.rresp = cpu_rresp; - assign fake_axi_read.AXIReadData.rlast = cpu_rlast; - assign fake_axi_read.AXIReadData.rvalid = cpu_rvalid; - - assign cpu_arid = fake_axi_read.AXIReadAddr.arid; - assign cpu_araddr = fake_axi_read.AXIReadAddr.araddr; - assign cpu_arlen = fake_axi_read.AXIReadAddr.arlen; - assign cpu_arsize = fake_axi_read.AXIReadAddr.arsize; - assign cpu_arburst = fake_axi_read.AXIReadAddr.arburst; - assign cpu_arvalid = fake_axi_read.AXIReadAddr.arvalid; - assign cpu_rready = fake_axi_read.AXIReadAddr.rready; - - assign fake_axi_write.AXIWriteData.awready = cpu_awready; - assign fake_axi_write.AXIWriteData.wready = cpu_wready; - assign fake_axi_write.AXIWriteData.bid = cpu_bid; - assign fake_axi_write.AXIWriteData.bresp = cpu_bresp; - assign fake_axi_write.AXIWriteData.bvalid = cpu_bvalid; - - assign cpu_awid = fake_axi_write.AXIWriteAddr.awid; - assign cpu_awaddr = fake_axi_write.AXIWriteAddr.awaddr; - assign cpu_awlen = fake_axi_write.AXIWriteAddr.awlen; - assign cpu_awsize = fake_axi_write.AXIWriteAddr.awsize; - assign cpu_awburst = fake_axi_write.AXIWriteAddr.awburst; - assign cpu_awlock = fake_axi_write.AXIWriteAddr.awlock; - assign cpu_awcache = fake_axi_write.AXIWriteAddr.awcache; - assign cpu_awprot = fake_axi_write.AXIWriteAddr.awprot; - assign cpu_awvalid = fake_axi_write.AXIWriteAddr.awvalid; - assign cpu_wid = fake_axi_write.AXIWriteAddr.wid; - assign cpu_wdata = fake_axi_write.AXIWriteAddr.wdata; - assign cpu_wstrb = fake_axi_write.AXIWriteAddr.wstrb; - assign cpu_wlast = fake_axi_write.AXIWriteAddr.wlast; - assign cpu_wvalid = fake_axi_write.AXIWriteAddr.wvalid; - assign cpu_bready = fake_axi_write.AXIWriteAddr.bready; - - AXI axi ( - .clk(clk), - .rst(rst), - .AXIRead(fake_axi_read.master), - .AXIWrite(fake_axi_write.master), - .inst(inst_axi.slave), - .rdata(data_rdata.slave), - .wdata(data_wdata.slave) - ); - - MMU mmu ( - .clk(clk), - .rst(rst), - .K0(3'b011), - .ic(ic.mmu), - .dc(dc.mmu), - .inst(inst.slave), - .data(data.slave), - .inst_axi(inst_axi.master), - .rdata_axi(data_rdata.master), - .wdata_axi(data_wdata.master) - ); - - ICache icache ( - .clk (clk), - .rst (rst), - .port(ic.cache) - ); - - DCache dcache ( - .clk (clk), - .rst (rst), - .port(dc.cache) - ); - - InstrQueue InstrQueue ( - .clk(clk), - .rst(rst), - - .vinA(vinA), - .inA (inA), - .pinA(pinA), - - .vinB(vinB), - .inB (inB), - .pinB(pinB), - - .enA (enA), - .voutA(voutA), - .outA (outA), - .poutA(poutA), - - .enB (enB), - .voutB(voutB), - .outB (outB), - .poutB(poutB), - - .valids() - ); - - Datapath dp ( - .fetch_i(inst.master), - .mem_i (data.master) - ); - -endmodule diff --git a/src/testbench/happy/mul_signed.sv b/src/testbench/happy/mul_signed.sv deleted file mode 100644 index 80e31c0..0000000 --- a/src/testbench/happy/mul_signed.sv +++ /dev/null @@ -1,9 +0,0 @@ -// Make Linter Happy - -module mul_signed ( - input CLK, - input [31:0] A, - input [31:0] B, - output [63:0] P -); -endmodule diff --git a/src/testbench/happy/mul_unsigned.sv b/src/testbench/happy/mul_unsigned.sv deleted file mode 100644 index 44cc10b..0000000 --- a/src/testbench/happy/mul_unsigned.sv +++ /dev/null @@ -1,9 +0,0 @@ -// Make Linter Happy - -module mul_unsigned ( - input CLK, - input [31:0] A, - input [31:0] B, - output [63:0] P -); -endmodule diff --git a/src/testbench/icache/.gitignore b/src/testbench/icache/.gitignore deleted file mode 100644 index a44109d..0000000 --- a/src/testbench/icache/.gitignore +++ /dev/null @@ -1 +0,0 @@ -coe \ No newline at end of file diff --git a/src/testbench/icache/coe.cpp b/src/testbench/icache/coe.cpp deleted file mode 100644 index eb13699..0000000 --- a/src/testbench/icache/coe.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include -using namespace std; -int main() -{ - cout << "memory_initialization_radix=16;" << endl; - cout << "memory_initialization_vector=" << endl; - for (int i = 0; i < 4096; i++) - cout << hex << setfill('0') << setw(8) - << i - << ((i == 4095) ? ";" : ",") - << endl; - return 0; -} \ No newline at end of file diff --git a/src/testbench/icache/test.sv b/src/testbench/icache/test.sv deleted file mode 100644 index 6a4f9b1..0000000 --- a/src/testbench/icache/test.sv +++ /dev/null @@ -1,178 +0,0 @@ -`timescale 1ns / 1ps - -`include "ICache.svh" -`include "sram.svh" - -module test (); - logic clk, rst; - - wire [31:0] araddr; - wire [1:0] arburst; - wire [3:0] arid; - wire [7:0] arlen; - wire arready; - wire [2:0] arsize; - wire arvalid; - wire [31:0] awaddr; - wire [1:0] awburst; - wire [3:0] awid; - wire [7:0] awlen; - wire awready; - wire [2:0] awsize; - wire awvalid; - wire [3:0] bid; - wire bready; - wire [1:0] bresp; - wire bvalid; - wire [31:0] rdata; - wire [3:0] rid; - wire rlast; - wire rready; - wire [1:0] rresp; - wire rvalid; - wire [31:0] wdata; - wire wready; - wire [3:0] wstrb; - wire wvalid; - - - blk_mem_gen_0 memory ( - .s_axi_araddr(araddr), - .s_axi_arburst(arburst), - .s_axi_arid(arid), - .s_axi_arlen(arlen), - .s_axi_arready(arready), - .s_axi_arsize(arsize), - .s_axi_arvalid(arvalid), - .s_axi_awaddr(awaddr), - .s_axi_awburst(awburst), - .s_axi_awid(awid), - .s_axi_awlen(awlen), - .s_axi_awready(awready), - .s_axi_awsize(awsize), - .s_axi_awvalid(awvalid), - .s_axi_bid(bid), - .s_axi_bready(bready), - .s_axi_bresp(bresp), - .s_axi_bvalid(bvalid), - .s_axi_rdata(rdata), - .s_axi_rid(rid), - .s_axi_rlast(rlast), - .s_axi_rready(rready), - .s_axi_rresp(rresp), - .s_axi_rvalid(rvalid), - .s_axi_wdata(wdata), - .s_axi_wlast(wlast), - .s_axi_wready(wready), - .s_axi_wstrb(wstrb), - .s_axi_wvalid(wvalid), - .s_aclk(clk), - .s_aresetn(~rst) - ); - - AXIRead_i fake_axi (); - sramro_i fake_sram (); - HandShake fake_hs (); - - wire [31:0] ICacheAddress; - wire ICacheLineOK; - wire [`IC_DATA_LENGTH-1:0] ICacheLine; - - ICache ic ( - .clk(clk), - .rst(rst), - .sram(fake_sram.slave), - .AXIReq(fake_hs.next), - .ICacheAddress(ICacheAddress), - .ICacheLineOK(ICacheLineOK), - .ICacheLine(ICacheLine) - ); - - AXI AXI ( - .clk(clk), - .rst(rst), - .AXIRead(fake_axi.master), - .ICReq(fake_hs.prev), - .ICacheAddress(ICacheAddress), - .ICacheLineOK(ICacheLineOK), - .ICacheLine(ICacheLine) - ); - - assign fake_axi.AXIReadData.arready = arready; - assign fake_axi.AXIReadData.rid = rid; - assign fake_axi.AXIReadData.rdata = rdata; - assign fake_axi.AXIReadData.rresp = rresp; - assign fake_axi.AXIReadData.rlast = rlast; - assign fake_axi.AXIReadData.rvalid = rvalid; - - assign arid = fake_axi.AXIReadAddr.arid; - assign araddr = fake_axi.AXIReadAddr.araddr; - assign arlen[3:0] = fake_axi.AXIReadAddr.arlen; - assign arlen[7:4] = 0; - assign arsize = fake_axi.AXIReadAddr.arsize; - assign arburst = fake_axi.AXIReadAddr.arburst; - assign arvalid = fake_axi.AXIReadAddr.arvalid; - assign rready = fake_axi.AXIReadAddr.rready; - - - - enum logic [1:0] { - IDLE, - REQ, - DONE - } - status, nextStatus; - - reg [29:0] addr, queue[$]; - reg cacheAddr; - reg [29:0] cacheAddrOffset = 'h2000_0000; - - assign fake_sram.addr = {addr, 2'b0}; - assign fake_sram.req = 1; - always @(posedge clk) begin - cacheAddr = ~cacheAddr; - - // prev pipeline - if (fake_sram.addr_ok) begin - if (cacheAddr) addr = addr < 4095 ? addr + cacheAddrOffset + 1 : cacheAddrOffset; - else addr = (addr - cacheAddrOffset) < 4095 ? (addr - cacheAddrOffset) + 1 : 0; - queue.push_back(addr); - end else addr = addr; - - // post pipeline - if (fake_sram.data_ok) begin - reg [11:0] front; - front = queue.pop_front(); - if (fake_sram.rdata0 != (front & 'hFFFF_FFFE) && fake_sram.rdata1 != (front & 'hFFFF_FFFE) + 1) begin - $display("ERROR OCCURED! addr=0x%8h, rdata0=0x%8h, rdata1=0x%8h", (front << 2), - fake_sram.rdata0, fake_sram.rdata1); - end - end - end - - initial begin - $dumpfile("dump.vcd"); - $dumpvars(); - - status = IDLE; - - cacheAddr = 1; - //addr = 'h2000_0000; - addr = 0; - queue.push_back(addr); - - - rst = 1; - #5; - rst = 0; - end - - initial begin - clk = 1; - forever begin - #10 clk = ~clk; - end - end - -endmodule - diff --git a/src/testbench/icache/tmp.coe b/src/testbench/icache/tmp.coe deleted file mode 100644 index 62f410f..0000000 --- a/src/testbench/icache/tmp.coe +++ /dev/null @@ -1,4098 +0,0 @@ -memory_initialization_radix=16; -memory_initialization_vector= -00000000, -00000001, -00000002, -00000003, -00000004, -00000005, -00000006, -00000007, -00000008, -00000009, -0000000a, -0000000b, -0000000c, -0000000d, -0000000e, -0000000f, -00000010, -00000011, -00000012, -00000013, -00000014, -00000015, -00000016, -00000017, -00000018, -00000019, -0000001a, -0000001b, -0000001c, -0000001d, -0000001e, -0000001f, -00000020, -00000021, -00000022, -00000023, -00000024, -00000025, -00000026, -00000027, -00000028, -00000029, -0000002a, -0000002b, -0000002c, -0000002d, -0000002e, -0000002f, -00000030, -00000031, -00000032, -00000033, -00000034, -00000035, -00000036, -00000037, -00000038, -00000039, -0000003a, -0000003b, -0000003c, -0000003d, -0000003e, -0000003f, -00000040, -00000041, -00000042, -00000043, -00000044, -00000045, -00000046, -00000047, -00000048, -00000049, -0000004a, -0000004b, -0000004c, -0000004d, -0000004e, -0000004f, -00000050, -00000051, -00000052, -00000053, -00000054, -00000055, -00000056, -00000057, -00000058, -00000059, -0000005a, -0000005b, -0000005c, -0000005d, -0000005e, -0000005f, -00000060, -00000061, -00000062, -00000063, -00000064, -00000065, -00000066, -00000067, -00000068, -00000069, -0000006a, -0000006b, -0000006c, -0000006d, -0000006e, -0000006f, -00000070, -00000071, -00000072, -00000073, -00000074, -00000075, -00000076, -00000077, -00000078, -00000079, -0000007a, -0000007b, -0000007c, -0000007d, -0000007e, -0000007f, -00000080, -00000081, -00000082, -00000083, -00000084, -00000085, -00000086, -00000087, -00000088, -00000089, -0000008a, -0000008b, -0000008c, -0000008d, -0000008e, -0000008f, -00000090, -00000091, -00000092, -00000093, -00000094, -00000095, -00000096, -00000097, -00000098, -00000099, -0000009a, -0000009b, -0000009c, -0000009d, -0000009e, -0000009f, -000000a0, -000000a1, -000000a2, -000000a3, -000000a4, -000000a5, -000000a6, -000000a7, -000000a8, -000000a9, -000000aa, -000000ab, -000000ac, -000000ad, -000000ae, -000000af, -000000b0, -000000b1, -000000b2, -000000b3, -000000b4, -000000b5, -000000b6, -000000b7, -000000b8, -000000b9, -000000ba, -000000bb, -000000bc, -000000bd, -000000be, -000000bf, -000000c0, -000000c1, -000000c2, -000000c3, -000000c4, -000000c5, -000000c6, -000000c7, -000000c8, -000000c9, -000000ca, -000000cb, -000000cc, -000000cd, -000000ce, -000000cf, -000000d0, -000000d1, -000000d2, -000000d3, -000000d4, -000000d5, -000000d6, -000000d7, -000000d8, -000000d9, -000000da, -000000db, -000000dc, -000000dd, -000000de, -000000df, -000000e0, -000000e1, -000000e2, -000000e3, -000000e4, -000000e5, -000000e6, -000000e7, -000000e8, -000000e9, -000000ea, -000000eb, -000000ec, -000000ed, -000000ee, -000000ef, -000000f0, -000000f1, -000000f2, -000000f3, -000000f4, -000000f5, -000000f6, -000000f7, -000000f8, -000000f9, -000000fa, -000000fb, -000000fc, -000000fd, -000000fe, -000000ff, -00000100, -00000101, -00000102, -00000103, -00000104, -00000105, -00000106, -00000107, -00000108, -00000109, -0000010a, -0000010b, -0000010c, -0000010d, -0000010e, -0000010f, -00000110, -00000111, -00000112, -00000113, -00000114, -00000115, -00000116, -00000117, -00000118, -00000119, -0000011a, -0000011b, -0000011c, -0000011d, -0000011e, -0000011f, -00000120, -00000121, -00000122, -00000123, -00000124, -00000125, -00000126, -00000127, -00000128, -00000129, -0000012a, -0000012b, -0000012c, -0000012d, -0000012e, -0000012f, -00000130, -00000131, -00000132, -00000133, -00000134, -00000135, -00000136, -00000137, -00000138, -00000139, -0000013a, -0000013b, -0000013c, -0000013d, -0000013e, -0000013f, -00000140, -00000141, -00000142, -00000143, -00000144, -00000145, -00000146, -00000147, -00000148, -00000149, -0000014a, -0000014b, -0000014c, -0000014d, -0000014e, -0000014f, -00000150, -00000151, -00000152, -00000153, -00000154, -00000155, -00000156, -00000157, -00000158, -00000159, -0000015a, -0000015b, -0000015c, -0000015d, -0000015e, -0000015f, -00000160, -00000161, -00000162, -00000163, -00000164, -00000165, -00000166, -00000167, -00000168, -00000169, -0000016a, -0000016b, -0000016c, -0000016d, -0000016e, -0000016f, -00000170, -00000171, -00000172, -00000173, -00000174, -00000175, -00000176, -00000177, -00000178, -00000179, -0000017a, -0000017b, -0000017c, -0000017d, -0000017e, -0000017f, -00000180, -00000181, -00000182, -00000183, -00000184, -00000185, -00000186, -00000187, -00000188, -00000189, -0000018a, -0000018b, -0000018c, -0000018d, -0000018e, -0000018f, -00000190, -00000191, -00000192, -00000193, -00000194, -00000195, -00000196, -00000197, -00000198, -00000199, -0000019a, -0000019b, -0000019c, -0000019d, -0000019e, -0000019f, -000001a0, -000001a1, -000001a2, -000001a3, -000001a4, -000001a5, -000001a6, -000001a7, -000001a8, -000001a9, -000001aa, -000001ab, -000001ac, -000001ad, -000001ae, -000001af, -000001b0, -000001b1, -000001b2, -000001b3, -000001b4, -000001b5, -000001b6, -000001b7, -000001b8, -000001b9, -000001ba, -000001bb, -000001bc, -000001bd, -000001be, -000001bf, -000001c0, -000001c1, -000001c2, -000001c3, -000001c4, -000001c5, -000001c6, -000001c7, -000001c8, -000001c9, -000001ca, -000001cb, -000001cc, -000001cd, -000001ce, -000001cf, -000001d0, -000001d1, -000001d2, -000001d3, -000001d4, -000001d5, -000001d6, -000001d7, -000001d8, -000001d9, -000001da, -000001db, -000001dc, -000001dd, -000001de, -000001df, -000001e0, -000001e1, -000001e2, -000001e3, -000001e4, -000001e5, -000001e6, -000001e7, -000001e8, -000001e9, -000001ea, -000001eb, -000001ec, -000001ed, -000001ee, -000001ef, -000001f0, -000001f1, -000001f2, -000001f3, -000001f4, -000001f5, -000001f6, -000001f7, -000001f8, -000001f9, -000001fa, -000001fb, -000001fc, -000001fd, -000001fe, -000001ff, -00000200, -00000201, -00000202, -00000203, -00000204, -00000205, -00000206, -00000207, -00000208, -00000209, -0000020a, -0000020b, -0000020c, -0000020d, -0000020e, -0000020f, -00000210, -00000211, -00000212, -00000213, -00000214, -00000215, -00000216, -00000217, -00000218, -00000219, -0000021a, -0000021b, -0000021c, -0000021d, -0000021e, -0000021f, -00000220, -00000221, -00000222, -00000223, -00000224, -00000225, -00000226, -00000227, -00000228, -00000229, -0000022a, -0000022b, -0000022c, -0000022d, -0000022e, -0000022f, -00000230, -00000231, -00000232, -00000233, -00000234, -00000235, -00000236, -00000237, -00000238, -00000239, -0000023a, -0000023b, -0000023c, -0000023d, -0000023e, -0000023f, -00000240, -00000241, -00000242, -00000243, -00000244, -00000245, -00000246, -00000247, -00000248, -00000249, -0000024a, -0000024b, -0000024c, -0000024d, -0000024e, -0000024f, -00000250, -00000251, -00000252, -00000253, -00000254, -00000255, -00000256, -00000257, -00000258, -00000259, -0000025a, -0000025b, -0000025c, -0000025d, -0000025e, -0000025f, -00000260, -00000261, -00000262, -00000263, -00000264, -00000265, -00000266, -00000267, -00000268, -00000269, -0000026a, -0000026b, -0000026c, -0000026d, -0000026e, -0000026f, -00000270, -00000271, -00000272, -00000273, -00000274, -00000275, -00000276, -00000277, -00000278, -00000279, -0000027a, -0000027b, -0000027c, -0000027d, -0000027e, -0000027f, -00000280, -00000281, -00000282, -00000283, -00000284, -00000285, -00000286, -00000287, -00000288, -00000289, -0000028a, -0000028b, -0000028c, -0000028d, -0000028e, -0000028f, -00000290, -00000291, -00000292, -00000293, -00000294, -00000295, -00000296, -00000297, -00000298, -00000299, -0000029a, -0000029b, -0000029c, -0000029d, -0000029e, -0000029f, -000002a0, -000002a1, -000002a2, -000002a3, -000002a4, -000002a5, -000002a6, -000002a7, -000002a8, -000002a9, -000002aa, -000002ab, -000002ac, -000002ad, -000002ae, -000002af, -000002b0, -000002b1, -000002b2, -000002b3, -000002b4, -000002b5, -000002b6, -000002b7, -000002b8, -000002b9, -000002ba, -000002bb, -000002bc, -000002bd, -000002be, -000002bf, -000002c0, -000002c1, -000002c2, -000002c3, -000002c4, -000002c5, -000002c6, -000002c7, -000002c8, -000002c9, -000002ca, -000002cb, -000002cc, -000002cd, -000002ce, -000002cf, -000002d0, -000002d1, -000002d2, -000002d3, -000002d4, -000002d5, -000002d6, -000002d7, -000002d8, -000002d9, -000002da, -000002db, -000002dc, -000002dd, -000002de, -000002df, -000002e0, -000002e1, -000002e2, -000002e3, -000002e4, -000002e5, -000002e6, -000002e7, -000002e8, -000002e9, -000002ea, -000002eb, -000002ec, -000002ed, -000002ee, -000002ef, -000002f0, -000002f1, -000002f2, -000002f3, -000002f4, -000002f5, -000002f6, -000002f7, -000002f8, -000002f9, -000002fa, -000002fb, -000002fc, -000002fd, -000002fe, -000002ff, -00000300, -00000301, -00000302, -00000303, -00000304, -00000305, -00000306, -00000307, -00000308, -00000309, -0000030a, -0000030b, -0000030c, -0000030d, -0000030e, -0000030f, -00000310, -00000311, -00000312, -00000313, -00000314, -00000315, -00000316, -00000317, -00000318, -00000319, -0000031a, -0000031b, -0000031c, -0000031d, -0000031e, -0000031f, -00000320, -00000321, -00000322, -00000323, -00000324, -00000325, -00000326, -00000327, -00000328, -00000329, -0000032a, -0000032b, -0000032c, -0000032d, -0000032e, -0000032f, -00000330, -00000331, -00000332, -00000333, -00000334, -00000335, -00000336, -00000337, -00000338, -00000339, -0000033a, -0000033b, -0000033c, -0000033d, -0000033e, -0000033f, -00000340, -00000341, -00000342, -00000343, -00000344, -00000345, -00000346, -00000347, -00000348, -00000349, -0000034a, -0000034b, -0000034c, -0000034d, -0000034e, -0000034f, -00000350, -00000351, -00000352, -00000353, -00000354, -00000355, -00000356, -00000357, -00000358, -00000359, -0000035a, -0000035b, -0000035c, -0000035d, -0000035e, -0000035f, -00000360, -00000361, -00000362, -00000363, -00000364, -00000365, -00000366, -00000367, -00000368, -00000369, -0000036a, -0000036b, -0000036c, -0000036d, -0000036e, -0000036f, -00000370, -00000371, -00000372, -00000373, -00000374, -00000375, -00000376, -00000377, -00000378, -00000379, -0000037a, -0000037b, -0000037c, -0000037d, -0000037e, -0000037f, -00000380, -00000381, -00000382, -00000383, -00000384, -00000385, -00000386, -00000387, -00000388, -00000389, -0000038a, -0000038b, -0000038c, -0000038d, -0000038e, -0000038f, -00000390, -00000391, -00000392, -00000393, -00000394, -00000395, -00000396, -00000397, -00000398, -00000399, -0000039a, -0000039b, -0000039c, -0000039d, -0000039e, -0000039f, -000003a0, -000003a1, -000003a2, -000003a3, -000003a4, -000003a5, -000003a6, -000003a7, -000003a8, -000003a9, -000003aa, -000003ab, -000003ac, -000003ad, -000003ae, -000003af, -000003b0, -000003b1, -000003b2, -000003b3, -000003b4, -000003b5, -000003b6, -000003b7, -000003b8, -000003b9, -000003ba, -000003bb, -000003bc, -000003bd, -000003be, -000003bf, -000003c0, -000003c1, -000003c2, -000003c3, -000003c4, -000003c5, -000003c6, -000003c7, -000003c8, -000003c9, -000003ca, -000003cb, -000003cc, -000003cd, -000003ce, -000003cf, -000003d0, -000003d1, -000003d2, -000003d3, -000003d4, -000003d5, -000003d6, -000003d7, -000003d8, -000003d9, -000003da, -000003db, -000003dc, -000003dd, -000003de, -000003df, -000003e0, -000003e1, -000003e2, -000003e3, -000003e4, -000003e5, -000003e6, -000003e7, -000003e8, -000003e9, -000003ea, -000003eb, -000003ec, -000003ed, -000003ee, -000003ef, -000003f0, -000003f1, -000003f2, -000003f3, -000003f4, -000003f5, -000003f6, -000003f7, -000003f8, -000003f9, -000003fa, -000003fb, -000003fc, -000003fd, -000003fe, -000003ff, -00000400, -00000401, -00000402, -00000403, -00000404, -00000405, -00000406, -00000407, -00000408, -00000409, -0000040a, -0000040b, -0000040c, -0000040d, -0000040e, -0000040f, -00000410, -00000411, -00000412, -00000413, -00000414, -00000415, -00000416, -00000417, -00000418, -00000419, -0000041a, -0000041b, -0000041c, -0000041d, -0000041e, -0000041f, -00000420, -00000421, -00000422, -00000423, -00000424, -00000425, -00000426, -00000427, -00000428, -00000429, -0000042a, -0000042b, -0000042c, -0000042d, -0000042e, -0000042f, -00000430, -00000431, -00000432, -00000433, -00000434, -00000435, -00000436, -00000437, -00000438, -00000439, -0000043a, -0000043b, -0000043c, -0000043d, -0000043e, -0000043f, -00000440, -00000441, -00000442, -00000443, -00000444, -00000445, -00000446, -00000447, -00000448, -00000449, -0000044a, -0000044b, -0000044c, -0000044d, -0000044e, -0000044f, -00000450, -00000451, -00000452, -00000453, -00000454, -00000455, -00000456, -00000457, -00000458, -00000459, -0000045a, -0000045b, -0000045c, -0000045d, -0000045e, -0000045f, -00000460, -00000461, -00000462, -00000463, -00000464, -00000465, -00000466, -00000467, -00000468, -00000469, -0000046a, -0000046b, -0000046c, -0000046d, -0000046e, -0000046f, -00000470, -00000471, -00000472, -00000473, -00000474, -00000475, -00000476, -00000477, -00000478, -00000479, -0000047a, -0000047b, -0000047c, -0000047d, -0000047e, -0000047f, -00000480, -00000481, -00000482, -00000483, -00000484, -00000485, -00000486, -00000487, -00000488, -00000489, -0000048a, -0000048b, -0000048c, -0000048d, -0000048e, -0000048f, -00000490, -00000491, -00000492, -00000493, -00000494, -00000495, -00000496, -00000497, -00000498, -00000499, -0000049a, -0000049b, -0000049c, -0000049d, -0000049e, -0000049f, -000004a0, -000004a1, -000004a2, -000004a3, -000004a4, -000004a5, -000004a6, -000004a7, -000004a8, -000004a9, -000004aa, -000004ab, -000004ac, -000004ad, -000004ae, -000004af, -000004b0, -000004b1, -000004b2, -000004b3, -000004b4, -000004b5, -000004b6, -000004b7, -000004b8, -000004b9, -000004ba, -000004bb, -000004bc, -000004bd, -000004be, -000004bf, -000004c0, -000004c1, -000004c2, -000004c3, -000004c4, -000004c5, -000004c6, -000004c7, -000004c8, -000004c9, -000004ca, -000004cb, -000004cc, -000004cd, -000004ce, -000004cf, -000004d0, -000004d1, -000004d2, -000004d3, -000004d4, -000004d5, -000004d6, -000004d7, -000004d8, -000004d9, -000004da, -000004db, -000004dc, -000004dd, -000004de, -000004df, -000004e0, -000004e1, -000004e2, -000004e3, -000004e4, -000004e5, -000004e6, -000004e7, -000004e8, -000004e9, -000004ea, -000004eb, -000004ec, -000004ed, -000004ee, -000004ef, -000004f0, -000004f1, -000004f2, -000004f3, -000004f4, -000004f5, -000004f6, -000004f7, -000004f8, -000004f9, -000004fa, -000004fb, -000004fc, -000004fd, -000004fe, -000004ff, -00000500, -00000501, -00000502, -00000503, -00000504, -00000505, -00000506, -00000507, -00000508, -00000509, -0000050a, -0000050b, -0000050c, -0000050d, -0000050e, -0000050f, -00000510, -00000511, -00000512, -00000513, -00000514, -00000515, -00000516, -00000517, -00000518, -00000519, -0000051a, -0000051b, -0000051c, -0000051d, -0000051e, -0000051f, -00000520, -00000521, -00000522, -00000523, -00000524, -00000525, -00000526, -00000527, -00000528, -00000529, -0000052a, -0000052b, -0000052c, -0000052d, -0000052e, -0000052f, -00000530, -00000531, -00000532, -00000533, -00000534, -00000535, -00000536, -00000537, -00000538, -00000539, -0000053a, -0000053b, -0000053c, -0000053d, -0000053e, -0000053f, -00000540, -00000541, -00000542, -00000543, -00000544, -00000545, -00000546, -00000547, -00000548, -00000549, -0000054a, -0000054b, -0000054c, -0000054d, -0000054e, -0000054f, -00000550, -00000551, -00000552, -00000553, -00000554, -00000555, -00000556, -00000557, -00000558, -00000559, -0000055a, -0000055b, -0000055c, -0000055d, -0000055e, -0000055f, -00000560, -00000561, -00000562, -00000563, -00000564, -00000565, -00000566, -00000567, -00000568, -00000569, -0000056a, -0000056b, -0000056c, -0000056d, -0000056e, -0000056f, -00000570, -00000571, -00000572, -00000573, -00000574, -00000575, -00000576, -00000577, -00000578, -00000579, -0000057a, -0000057b, -0000057c, -0000057d, -0000057e, -0000057f, -00000580, -00000581, -00000582, -00000583, -00000584, -00000585, -00000586, -00000587, -00000588, -00000589, -0000058a, -0000058b, -0000058c, -0000058d, -0000058e, -0000058f, -00000590, -00000591, -00000592, -00000593, -00000594, -00000595, -00000596, -00000597, -00000598, -00000599, -0000059a, -0000059b, -0000059c, -0000059d, -0000059e, -0000059f, -000005a0, -000005a1, -000005a2, -000005a3, -000005a4, -000005a5, -000005a6, -000005a7, -000005a8, -000005a9, -000005aa, -000005ab, -000005ac, -000005ad, -000005ae, -000005af, -000005b0, -000005b1, -000005b2, -000005b3, -000005b4, -000005b5, -000005b6, -000005b7, -000005b8, -000005b9, -000005ba, -000005bb, -000005bc, -000005bd, -000005be, -000005bf, -000005c0, -000005c1, -000005c2, -000005c3, -000005c4, -000005c5, -000005c6, -000005c7, -000005c8, -000005c9, -000005ca, -000005cb, -000005cc, -000005cd, -000005ce, -000005cf, -000005d0, -000005d1, -000005d2, -000005d3, -000005d4, -000005d5, -000005d6, -000005d7, -000005d8, -000005d9, -000005da, -000005db, -000005dc, -000005dd, -000005de, -000005df, -000005e0, -000005e1, -000005e2, -000005e3, -000005e4, -000005e5, -000005e6, -000005e7, -000005e8, -000005e9, -000005ea, -000005eb, -000005ec, -000005ed, -000005ee, -000005ef, -000005f0, -000005f1, -000005f2, -000005f3, -000005f4, -000005f5, -000005f6, -000005f7, -000005f8, -000005f9, -000005fa, -000005fb, -000005fc, -000005fd, -000005fe, -000005ff, -00000600, -00000601, -00000602, -00000603, -00000604, -00000605, -00000606, -00000607, -00000608, -00000609, -0000060a, -0000060b, -0000060c, -0000060d, -0000060e, -0000060f, -00000610, -00000611, -00000612, -00000613, -00000614, -00000615, -00000616, -00000617, -00000618, -00000619, -0000061a, -0000061b, -0000061c, -0000061d, -0000061e, -0000061f, -00000620, -00000621, -00000622, -00000623, -00000624, -00000625, -00000626, -00000627, -00000628, -00000629, -0000062a, -0000062b, -0000062c, -0000062d, -0000062e, -0000062f, -00000630, -00000631, -00000632, -00000633, -00000634, -00000635, -00000636, -00000637, -00000638, -00000639, -0000063a, -0000063b, -0000063c, -0000063d, -0000063e, -0000063f, -00000640, -00000641, -00000642, -00000643, -00000644, -00000645, -00000646, -00000647, -00000648, -00000649, -0000064a, -0000064b, -0000064c, -0000064d, -0000064e, -0000064f, -00000650, -00000651, -00000652, -00000653, -00000654, -00000655, -00000656, -00000657, -00000658, -00000659, -0000065a, -0000065b, -0000065c, -0000065d, -0000065e, -0000065f, -00000660, -00000661, -00000662, -00000663, -00000664, -00000665, -00000666, -00000667, -00000668, -00000669, -0000066a, -0000066b, -0000066c, -0000066d, -0000066e, -0000066f, -00000670, -00000671, -00000672, -00000673, -00000674, -00000675, -00000676, -00000677, -00000678, -00000679, -0000067a, -0000067b, -0000067c, -0000067d, -0000067e, -0000067f, -00000680, -00000681, -00000682, -00000683, -00000684, -00000685, -00000686, -00000687, -00000688, -00000689, -0000068a, -0000068b, -0000068c, -0000068d, -0000068e, -0000068f, -00000690, -00000691, -00000692, -00000693, -00000694, -00000695, -00000696, -00000697, -00000698, -00000699, -0000069a, -0000069b, -0000069c, -0000069d, -0000069e, -0000069f, -000006a0, -000006a1, -000006a2, -000006a3, -000006a4, -000006a5, -000006a6, -000006a7, -000006a8, -000006a9, -000006aa, -000006ab, -000006ac, -000006ad, -000006ae, -000006af, -000006b0, -000006b1, -000006b2, -000006b3, -000006b4, -000006b5, -000006b6, -000006b7, -000006b8, -000006b9, -000006ba, -000006bb, -000006bc, -000006bd, -000006be, -000006bf, -000006c0, -000006c1, -000006c2, -000006c3, -000006c4, -000006c5, -000006c6, -000006c7, -000006c8, -000006c9, -000006ca, -000006cb, -000006cc, -000006cd, -000006ce, -000006cf, -000006d0, -000006d1, -000006d2, -000006d3, -000006d4, -000006d5, -000006d6, -000006d7, -000006d8, -000006d9, -000006da, -000006db, -000006dc, -000006dd, -000006de, -000006df, -000006e0, -000006e1, -000006e2, -000006e3, -000006e4, -000006e5, -000006e6, -000006e7, -000006e8, -000006e9, -000006ea, -000006eb, -000006ec, -000006ed, -000006ee, -000006ef, -000006f0, -000006f1, -000006f2, -000006f3, -000006f4, -000006f5, -000006f6, -000006f7, -000006f8, -000006f9, -000006fa, -000006fb, -000006fc, -000006fd, -000006fe, -000006ff, -00000700, -00000701, -00000702, -00000703, -00000704, -00000705, -00000706, -00000707, -00000708, -00000709, -0000070a, -0000070b, -0000070c, -0000070d, -0000070e, -0000070f, -00000710, -00000711, -00000712, -00000713, -00000714, -00000715, -00000716, -00000717, -00000718, -00000719, -0000071a, -0000071b, -0000071c, -0000071d, -0000071e, -0000071f, -00000720, -00000721, -00000722, -00000723, -00000724, -00000725, -00000726, -00000727, -00000728, -00000729, -0000072a, -0000072b, -0000072c, -0000072d, -0000072e, -0000072f, -00000730, -00000731, -00000732, -00000733, -00000734, -00000735, -00000736, -00000737, -00000738, -00000739, -0000073a, -0000073b, -0000073c, -0000073d, -0000073e, -0000073f, -00000740, -00000741, -00000742, -00000743, -00000744, -00000745, -00000746, -00000747, -00000748, -00000749, -0000074a, -0000074b, -0000074c, -0000074d, -0000074e, -0000074f, -00000750, -00000751, -00000752, -00000753, -00000754, -00000755, -00000756, -00000757, -00000758, -00000759, -0000075a, -0000075b, -0000075c, -0000075d, -0000075e, -0000075f, -00000760, -00000761, -00000762, -00000763, -00000764, -00000765, -00000766, -00000767, -00000768, -00000769, -0000076a, -0000076b, -0000076c, -0000076d, -0000076e, -0000076f, -00000770, -00000771, -00000772, -00000773, -00000774, -00000775, -00000776, -00000777, -00000778, -00000779, -0000077a, -0000077b, -0000077c, -0000077d, -0000077e, -0000077f, -00000780, -00000781, -00000782, -00000783, -00000784, -00000785, -00000786, -00000787, -00000788, -00000789, -0000078a, -0000078b, -0000078c, -0000078d, -0000078e, -0000078f, -00000790, -00000791, -00000792, -00000793, -00000794, -00000795, -00000796, -00000797, -00000798, -00000799, -0000079a, -0000079b, -0000079c, -0000079d, -0000079e, -0000079f, -000007a0, -000007a1, -000007a2, -000007a3, -000007a4, -000007a5, -000007a6, -000007a7, -000007a8, -000007a9, -000007aa, -000007ab, -000007ac, -000007ad, -000007ae, -000007af, -000007b0, -000007b1, -000007b2, -000007b3, -000007b4, -000007b5, -000007b6, -000007b7, -000007b8, -000007b9, -000007ba, -000007bb, -000007bc, -000007bd, -000007be, -000007bf, -000007c0, -000007c1, -000007c2, -000007c3, -000007c4, -000007c5, -000007c6, -000007c7, -000007c8, -000007c9, -000007ca, -000007cb, -000007cc, -000007cd, -000007ce, -000007cf, -000007d0, -000007d1, -000007d2, -000007d3, -000007d4, -000007d5, -000007d6, -000007d7, -000007d8, -000007d9, -000007da, -000007db, -000007dc, -000007dd, -000007de, -000007df, -000007e0, -000007e1, -000007e2, -000007e3, -000007e4, -000007e5, -000007e6, -000007e7, -000007e8, -000007e9, -000007ea, -000007eb, -000007ec, -000007ed, -000007ee, -000007ef, -000007f0, -000007f1, -000007f2, -000007f3, -000007f4, -000007f5, -000007f6, -000007f7, -000007f8, -000007f9, -000007fa, -000007fb, -000007fc, -000007fd, -000007fe, -000007ff, -00000800, -00000801, -00000802, -00000803, -00000804, -00000805, -00000806, -00000807, -00000808, -00000809, -0000080a, -0000080b, -0000080c, -0000080d, -0000080e, -0000080f, -00000810, -00000811, -00000812, -00000813, -00000814, -00000815, -00000816, -00000817, -00000818, -00000819, -0000081a, -0000081b, -0000081c, -0000081d, -0000081e, -0000081f, -00000820, -00000821, -00000822, -00000823, -00000824, -00000825, -00000826, -00000827, -00000828, -00000829, -0000082a, -0000082b, -0000082c, -0000082d, -0000082e, -0000082f, -00000830, -00000831, -00000832, -00000833, -00000834, -00000835, -00000836, -00000837, -00000838, -00000839, -0000083a, -0000083b, -0000083c, -0000083d, -0000083e, -0000083f, -00000840, -00000841, -00000842, -00000843, -00000844, -00000845, -00000846, -00000847, -00000848, -00000849, -0000084a, -0000084b, -0000084c, -0000084d, -0000084e, -0000084f, -00000850, -00000851, -00000852, -00000853, -00000854, -00000855, -00000856, -00000857, -00000858, -00000859, -0000085a, -0000085b, -0000085c, -0000085d, -0000085e, -0000085f, -00000860, -00000861, -00000862, -00000863, -00000864, -00000865, -00000866, -00000867, -00000868, -00000869, -0000086a, -0000086b, -0000086c, -0000086d, -0000086e, -0000086f, -00000870, -00000871, -00000872, -00000873, -00000874, -00000875, -00000876, -00000877, -00000878, -00000879, -0000087a, -0000087b, -0000087c, -0000087d, -0000087e, -0000087f, -00000880, -00000881, -00000882, -00000883, -00000884, -00000885, -00000886, -00000887, -00000888, -00000889, -0000088a, -0000088b, -0000088c, -0000088d, -0000088e, -0000088f, -00000890, -00000891, -00000892, -00000893, -00000894, -00000895, -00000896, -00000897, -00000898, -00000899, -0000089a, -0000089b, -0000089c, -0000089d, -0000089e, -0000089f, -000008a0, -000008a1, -000008a2, -000008a3, -000008a4, -000008a5, -000008a6, -000008a7, -000008a8, -000008a9, -000008aa, -000008ab, -000008ac, -000008ad, -000008ae, -000008af, -000008b0, -000008b1, -000008b2, -000008b3, -000008b4, -000008b5, -000008b6, -000008b7, -000008b8, -000008b9, -000008ba, -000008bb, -000008bc, -000008bd, -000008be, -000008bf, -000008c0, -000008c1, -000008c2, -000008c3, -000008c4, -000008c5, -000008c6, -000008c7, -000008c8, -000008c9, -000008ca, -000008cb, -000008cc, -000008cd, -000008ce, -000008cf, -000008d0, -000008d1, -000008d2, -000008d3, -000008d4, -000008d5, -000008d6, -000008d7, -000008d8, -000008d9, -000008da, -000008db, -000008dc, -000008dd, -000008de, -000008df, -000008e0, -000008e1, -000008e2, -000008e3, -000008e4, -000008e5, -000008e6, -000008e7, -000008e8, -000008e9, -000008ea, -000008eb, -000008ec, -000008ed, -000008ee, -000008ef, -000008f0, -000008f1, -000008f2, -000008f3, -000008f4, -000008f5, -000008f6, -000008f7, -000008f8, -000008f9, -000008fa, -000008fb, -000008fc, -000008fd, -000008fe, -000008ff, -00000900, -00000901, -00000902, -00000903, -00000904, -00000905, -00000906, -00000907, -00000908, -00000909, -0000090a, -0000090b, -0000090c, -0000090d, -0000090e, -0000090f, -00000910, -00000911, -00000912, -00000913, -00000914, -00000915, -00000916, -00000917, -00000918, -00000919, -0000091a, -0000091b, -0000091c, -0000091d, -0000091e, -0000091f, -00000920, -00000921, -00000922, -00000923, -00000924, -00000925, -00000926, -00000927, -00000928, -00000929, -0000092a, -0000092b, -0000092c, -0000092d, -0000092e, -0000092f, -00000930, -00000931, -00000932, -00000933, -00000934, -00000935, -00000936, -00000937, -00000938, -00000939, -0000093a, -0000093b, -0000093c, -0000093d, -0000093e, -0000093f, -00000940, -00000941, -00000942, -00000943, -00000944, -00000945, -00000946, -00000947, -00000948, -00000949, -0000094a, -0000094b, -0000094c, -0000094d, -0000094e, -0000094f, -00000950, -00000951, -00000952, -00000953, -00000954, -00000955, -00000956, -00000957, -00000958, -00000959, -0000095a, -0000095b, -0000095c, -0000095d, -0000095e, -0000095f, -00000960, -00000961, -00000962, -00000963, -00000964, -00000965, -00000966, -00000967, -00000968, -00000969, -0000096a, -0000096b, -0000096c, -0000096d, -0000096e, -0000096f, -00000970, -00000971, -00000972, -00000973, -00000974, -00000975, -00000976, -00000977, -00000978, -00000979, -0000097a, -0000097b, -0000097c, -0000097d, -0000097e, -0000097f, -00000980, -00000981, -00000982, -00000983, -00000984, -00000985, -00000986, -00000987, -00000988, -00000989, -0000098a, -0000098b, -0000098c, -0000098d, -0000098e, -0000098f, -00000990, -00000991, -00000992, -00000993, -00000994, -00000995, -00000996, -00000997, -00000998, -00000999, -0000099a, -0000099b, -0000099c, -0000099d, -0000099e, -0000099f, -000009a0, -000009a1, -000009a2, -000009a3, -000009a4, -000009a5, -000009a6, -000009a7, -000009a8, -000009a9, -000009aa, -000009ab, -000009ac, -000009ad, -000009ae, -000009af, -000009b0, -000009b1, -000009b2, -000009b3, -000009b4, -000009b5, -000009b6, -000009b7, -000009b8, -000009b9, -000009ba, -000009bb, -000009bc, -000009bd, -000009be, -000009bf, -000009c0, -000009c1, -000009c2, -000009c3, -000009c4, -000009c5, -000009c6, -000009c7, -000009c8, -000009c9, -000009ca, -000009cb, -000009cc, -000009cd, -000009ce, -000009cf, -000009d0, -000009d1, -000009d2, -000009d3, -000009d4, -000009d5, -000009d6, -000009d7, -000009d8, -000009d9, -000009da, -000009db, -000009dc, -000009dd, -000009de, -000009df, -000009e0, -000009e1, -000009e2, -000009e3, -000009e4, -000009e5, -000009e6, -000009e7, -000009e8, -000009e9, -000009ea, -000009eb, -000009ec, -000009ed, -000009ee, -000009ef, -000009f0, -000009f1, -000009f2, -000009f3, -000009f4, -000009f5, -000009f6, -000009f7, -000009f8, -000009f9, -000009fa, -000009fb, -000009fc, -000009fd, -000009fe, -000009ff, -00000a00, -00000a01, -00000a02, -00000a03, -00000a04, -00000a05, -00000a06, -00000a07, -00000a08, -00000a09, -00000a0a, -00000a0b, -00000a0c, -00000a0d, -00000a0e, -00000a0f, -00000a10, -00000a11, -00000a12, -00000a13, -00000a14, -00000a15, -00000a16, -00000a17, -00000a18, -00000a19, -00000a1a, -00000a1b, -00000a1c, -00000a1d, -00000a1e, -00000a1f, -00000a20, -00000a21, -00000a22, -00000a23, -00000a24, -00000a25, -00000a26, -00000a27, -00000a28, -00000a29, -00000a2a, -00000a2b, -00000a2c, -00000a2d, -00000a2e, -00000a2f, -00000a30, -00000a31, -00000a32, -00000a33, -00000a34, -00000a35, -00000a36, -00000a37, -00000a38, -00000a39, -00000a3a, -00000a3b, -00000a3c, -00000a3d, -00000a3e, -00000a3f, -00000a40, -00000a41, -00000a42, -00000a43, -00000a44, -00000a45, -00000a46, -00000a47, -00000a48, -00000a49, -00000a4a, -00000a4b, -00000a4c, -00000a4d, -00000a4e, -00000a4f, -00000a50, -00000a51, -00000a52, -00000a53, -00000a54, -00000a55, -00000a56, -00000a57, -00000a58, -00000a59, -00000a5a, -00000a5b, -00000a5c, -00000a5d, -00000a5e, -00000a5f, -00000a60, -00000a61, -00000a62, -00000a63, -00000a64, -00000a65, -00000a66, -00000a67, -00000a68, -00000a69, -00000a6a, -00000a6b, -00000a6c, -00000a6d, -00000a6e, -00000a6f, -00000a70, -00000a71, -00000a72, -00000a73, -00000a74, -00000a75, -00000a76, -00000a77, -00000a78, -00000a79, -00000a7a, -00000a7b, -00000a7c, -00000a7d, -00000a7e, -00000a7f, -00000a80, -00000a81, -00000a82, -00000a83, -00000a84, -00000a85, -00000a86, -00000a87, -00000a88, -00000a89, -00000a8a, -00000a8b, -00000a8c, -00000a8d, -00000a8e, -00000a8f, -00000a90, -00000a91, -00000a92, -00000a93, -00000a94, -00000a95, -00000a96, -00000a97, -00000a98, -00000a99, -00000a9a, -00000a9b, -00000a9c, -00000a9d, -00000a9e, -00000a9f, -00000aa0, -00000aa1, -00000aa2, -00000aa3, -00000aa4, -00000aa5, -00000aa6, -00000aa7, -00000aa8, -00000aa9, -00000aaa, -00000aab, -00000aac, -00000aad, -00000aae, -00000aaf, -00000ab0, -00000ab1, -00000ab2, -00000ab3, -00000ab4, -00000ab5, -00000ab6, -00000ab7, -00000ab8, -00000ab9, -00000aba, -00000abb, -00000abc, -00000abd, -00000abe, -00000abf, -00000ac0, -00000ac1, -00000ac2, -00000ac3, -00000ac4, -00000ac5, -00000ac6, -00000ac7, -00000ac8, -00000ac9, -00000aca, -00000acb, -00000acc, -00000acd, -00000ace, -00000acf, -00000ad0, -00000ad1, -00000ad2, -00000ad3, -00000ad4, -00000ad5, -00000ad6, -00000ad7, -00000ad8, -00000ad9, -00000ada, -00000adb, -00000adc, -00000add, -00000ade, -00000adf, -00000ae0, -00000ae1, -00000ae2, -00000ae3, -00000ae4, -00000ae5, -00000ae6, -00000ae7, -00000ae8, -00000ae9, -00000aea, -00000aeb, -00000aec, -00000aed, -00000aee, -00000aef, -00000af0, -00000af1, -00000af2, -00000af3, -00000af4, -00000af5, -00000af6, -00000af7, -00000af8, -00000af9, -00000afa, -00000afb, -00000afc, -00000afd, -00000afe, -00000aff, -00000b00, -00000b01, -00000b02, -00000b03, -00000b04, -00000b05, -00000b06, -00000b07, -00000b08, -00000b09, -00000b0a, -00000b0b, -00000b0c, -00000b0d, -00000b0e, -00000b0f, -00000b10, -00000b11, -00000b12, -00000b13, -00000b14, -00000b15, -00000b16, -00000b17, -00000b18, -00000b19, -00000b1a, -00000b1b, -00000b1c, -00000b1d, -00000b1e, -00000b1f, -00000b20, -00000b21, -00000b22, -00000b23, -00000b24, -00000b25, -00000b26, -00000b27, -00000b28, -00000b29, -00000b2a, -00000b2b, -00000b2c, -00000b2d, -00000b2e, -00000b2f, -00000b30, -00000b31, -00000b32, -00000b33, -00000b34, -00000b35, -00000b36, -00000b37, -00000b38, -00000b39, -00000b3a, -00000b3b, -00000b3c, -00000b3d, -00000b3e, -00000b3f, -00000b40, -00000b41, -00000b42, -00000b43, -00000b44, -00000b45, -00000b46, -00000b47, -00000b48, -00000b49, -00000b4a, -00000b4b, -00000b4c, -00000b4d, -00000b4e, -00000b4f, -00000b50, -00000b51, -00000b52, -00000b53, -00000b54, -00000b55, -00000b56, -00000b57, -00000b58, -00000b59, -00000b5a, -00000b5b, -00000b5c, -00000b5d, -00000b5e, -00000b5f, -00000b60, -00000b61, -00000b62, -00000b63, -00000b64, -00000b65, -00000b66, -00000b67, -00000b68, -00000b69, -00000b6a, -00000b6b, -00000b6c, -00000b6d, -00000b6e, -00000b6f, -00000b70, -00000b71, -00000b72, -00000b73, -00000b74, -00000b75, -00000b76, -00000b77, -00000b78, -00000b79, -00000b7a, -00000b7b, -00000b7c, -00000b7d, -00000b7e, -00000b7f, -00000b80, -00000b81, -00000b82, -00000b83, -00000b84, -00000b85, -00000b86, -00000b87, -00000b88, -00000b89, -00000b8a, -00000b8b, -00000b8c, -00000b8d, -00000b8e, -00000b8f, -00000b90, -00000b91, -00000b92, -00000b93, -00000b94, -00000b95, -00000b96, -00000b97, -00000b98, -00000b99, -00000b9a, -00000b9b, -00000b9c, -00000b9d, -00000b9e, -00000b9f, -00000ba0, -00000ba1, -00000ba2, -00000ba3, -00000ba4, -00000ba5, -00000ba6, -00000ba7, -00000ba8, -00000ba9, -00000baa, -00000bab, -00000bac, -00000bad, -00000bae, -00000baf, -00000bb0, -00000bb1, -00000bb2, -00000bb3, -00000bb4, -00000bb5, -00000bb6, -00000bb7, -00000bb8, -00000bb9, -00000bba, -00000bbb, -00000bbc, -00000bbd, -00000bbe, -00000bbf, -00000bc0, -00000bc1, -00000bc2, -00000bc3, -00000bc4, -00000bc5, -00000bc6, -00000bc7, -00000bc8, -00000bc9, -00000bca, -00000bcb, -00000bcc, -00000bcd, -00000bce, -00000bcf, -00000bd0, -00000bd1, -00000bd2, -00000bd3, -00000bd4, -00000bd5, -00000bd6, -00000bd7, -00000bd8, -00000bd9, -00000bda, -00000bdb, -00000bdc, -00000bdd, -00000bde, -00000bdf, -00000be0, -00000be1, -00000be2, -00000be3, -00000be4, -00000be5, -00000be6, -00000be7, -00000be8, -00000be9, -00000bea, -00000beb, -00000bec, -00000bed, -00000bee, -00000bef, -00000bf0, -00000bf1, -00000bf2, -00000bf3, -00000bf4, -00000bf5, -00000bf6, -00000bf7, -00000bf8, -00000bf9, -00000bfa, -00000bfb, -00000bfc, -00000bfd, -00000bfe, -00000bff, -00000c00, -00000c01, -00000c02, -00000c03, -00000c04, -00000c05, -00000c06, -00000c07, -00000c08, -00000c09, -00000c0a, -00000c0b, -00000c0c, -00000c0d, -00000c0e, -00000c0f, -00000c10, -00000c11, -00000c12, -00000c13, -00000c14, -00000c15, -00000c16, -00000c17, -00000c18, -00000c19, -00000c1a, -00000c1b, -00000c1c, -00000c1d, -00000c1e, -00000c1f, -00000c20, -00000c21, -00000c22, -00000c23, -00000c24, -00000c25, -00000c26, -00000c27, -00000c28, -00000c29, -00000c2a, -00000c2b, -00000c2c, -00000c2d, -00000c2e, -00000c2f, -00000c30, -00000c31, -00000c32, -00000c33, -00000c34, -00000c35, -00000c36, -00000c37, -00000c38, -00000c39, -00000c3a, -00000c3b, -00000c3c, -00000c3d, -00000c3e, -00000c3f, -00000c40, -00000c41, -00000c42, -00000c43, -00000c44, -00000c45, -00000c46, -00000c47, -00000c48, -00000c49, -00000c4a, -00000c4b, -00000c4c, -00000c4d, -00000c4e, -00000c4f, -00000c50, -00000c51, -00000c52, -00000c53, -00000c54, -00000c55, -00000c56, -00000c57, -00000c58, -00000c59, -00000c5a, -00000c5b, -00000c5c, -00000c5d, -00000c5e, -00000c5f, -00000c60, -00000c61, -00000c62, -00000c63, -00000c64, -00000c65, -00000c66, -00000c67, -00000c68, -00000c69, -00000c6a, -00000c6b, -00000c6c, -00000c6d, -00000c6e, -00000c6f, -00000c70, -00000c71, -00000c72, -00000c73, -00000c74, -00000c75, -00000c76, -00000c77, -00000c78, -00000c79, -00000c7a, -00000c7b, -00000c7c, -00000c7d, -00000c7e, -00000c7f, -00000c80, -00000c81, -00000c82, -00000c83, -00000c84, -00000c85, -00000c86, -00000c87, -00000c88, -00000c89, -00000c8a, -00000c8b, -00000c8c, -00000c8d, -00000c8e, -00000c8f, -00000c90, -00000c91, -00000c92, -00000c93, -00000c94, -00000c95, -00000c96, -00000c97, -00000c98, -00000c99, -00000c9a, -00000c9b, -00000c9c, -00000c9d, -00000c9e, -00000c9f, -00000ca0, -00000ca1, -00000ca2, -00000ca3, -00000ca4, -00000ca5, -00000ca6, -00000ca7, -00000ca8, -00000ca9, -00000caa, -00000cab, -00000cac, -00000cad, -00000cae, -00000caf, -00000cb0, -00000cb1, -00000cb2, -00000cb3, -00000cb4, -00000cb5, -00000cb6, -00000cb7, -00000cb8, -00000cb9, -00000cba, -00000cbb, -00000cbc, -00000cbd, -00000cbe, -00000cbf, -00000cc0, -00000cc1, -00000cc2, -00000cc3, -00000cc4, -00000cc5, -00000cc6, -00000cc7, -00000cc8, -00000cc9, -00000cca, -00000ccb, -00000ccc, -00000ccd, -00000cce, -00000ccf, -00000cd0, -00000cd1, -00000cd2, -00000cd3, -00000cd4, -00000cd5, -00000cd6, -00000cd7, -00000cd8, -00000cd9, -00000cda, -00000cdb, -00000cdc, -00000cdd, -00000cde, -00000cdf, -00000ce0, -00000ce1, -00000ce2, -00000ce3, -00000ce4, -00000ce5, -00000ce6, -00000ce7, -00000ce8, -00000ce9, -00000cea, -00000ceb, -00000cec, -00000ced, -00000cee, -00000cef, -00000cf0, -00000cf1, -00000cf2, -00000cf3, -00000cf4, -00000cf5, -00000cf6, -00000cf7, -00000cf8, -00000cf9, -00000cfa, -00000cfb, -00000cfc, -00000cfd, -00000cfe, -00000cff, -00000d00, -00000d01, -00000d02, -00000d03, -00000d04, -00000d05, -00000d06, -00000d07, -00000d08, -00000d09, -00000d0a, -00000d0b, -00000d0c, -00000d0d, -00000d0e, -00000d0f, -00000d10, -00000d11, -00000d12, -00000d13, -00000d14, -00000d15, -00000d16, -00000d17, -00000d18, -00000d19, -00000d1a, -00000d1b, -00000d1c, -00000d1d, -00000d1e, -00000d1f, -00000d20, -00000d21, -00000d22, -00000d23, -00000d24, -00000d25, -00000d26, -00000d27, -00000d28, -00000d29, -00000d2a, -00000d2b, -00000d2c, -00000d2d, -00000d2e, -00000d2f, -00000d30, -00000d31, -00000d32, -00000d33, -00000d34, -00000d35, -00000d36, -00000d37, -00000d38, -00000d39, -00000d3a, -00000d3b, -00000d3c, -00000d3d, -00000d3e, -00000d3f, -00000d40, -00000d41, -00000d42, -00000d43, -00000d44, -00000d45, -00000d46, -00000d47, -00000d48, -00000d49, -00000d4a, -00000d4b, -00000d4c, -00000d4d, -00000d4e, -00000d4f, -00000d50, -00000d51, -00000d52, -00000d53, -00000d54, -00000d55, -00000d56, -00000d57, -00000d58, -00000d59, -00000d5a, -00000d5b, -00000d5c, -00000d5d, -00000d5e, -00000d5f, -00000d60, -00000d61, -00000d62, -00000d63, -00000d64, -00000d65, -00000d66, -00000d67, -00000d68, -00000d69, -00000d6a, -00000d6b, -00000d6c, -00000d6d, -00000d6e, -00000d6f, -00000d70, -00000d71, -00000d72, -00000d73, -00000d74, -00000d75, -00000d76, -00000d77, -00000d78, -00000d79, -00000d7a, -00000d7b, -00000d7c, -00000d7d, -00000d7e, -00000d7f, -00000d80, -00000d81, -00000d82, -00000d83, -00000d84, -00000d85, -00000d86, -00000d87, -00000d88, -00000d89, -00000d8a, -00000d8b, -00000d8c, -00000d8d, -00000d8e, -00000d8f, -00000d90, -00000d91, -00000d92, -00000d93, -00000d94, -00000d95, -00000d96, -00000d97, -00000d98, -00000d99, -00000d9a, -00000d9b, -00000d9c, -00000d9d, -00000d9e, -00000d9f, -00000da0, -00000da1, -00000da2, -00000da3, -00000da4, -00000da5, -00000da6, -00000da7, -00000da8, -00000da9, -00000daa, -00000dab, -00000dac, -00000dad, -00000dae, -00000daf, -00000db0, -00000db1, -00000db2, -00000db3, -00000db4, -00000db5, -00000db6, -00000db7, -00000db8, -00000db9, -00000dba, -00000dbb, -00000dbc, -00000dbd, -00000dbe, -00000dbf, -00000dc0, -00000dc1, -00000dc2, -00000dc3, -00000dc4, -00000dc5, -00000dc6, -00000dc7, -00000dc8, -00000dc9, -00000dca, -00000dcb, -00000dcc, -00000dcd, -00000dce, -00000dcf, -00000dd0, -00000dd1, -00000dd2, -00000dd3, -00000dd4, -00000dd5, -00000dd6, -00000dd7, -00000dd8, -00000dd9, -00000dda, -00000ddb, -00000ddc, -00000ddd, -00000dde, -00000ddf, -00000de0, -00000de1, -00000de2, -00000de3, -00000de4, -00000de5, -00000de6, -00000de7, -00000de8, -00000de9, -00000dea, -00000deb, -00000dec, -00000ded, -00000dee, -00000def, -00000df0, -00000df1, -00000df2, -00000df3, -00000df4, -00000df5, -00000df6, -00000df7, -00000df8, -00000df9, -00000dfa, -00000dfb, -00000dfc, -00000dfd, -00000dfe, -00000dff, -00000e00, -00000e01, -00000e02, -00000e03, -00000e04, -00000e05, -00000e06, -00000e07, -00000e08, -00000e09, -00000e0a, -00000e0b, -00000e0c, -00000e0d, -00000e0e, -00000e0f, -00000e10, -00000e11, -00000e12, -00000e13, -00000e14, -00000e15, -00000e16, -00000e17, -00000e18, -00000e19, -00000e1a, -00000e1b, -00000e1c, -00000e1d, -00000e1e, -00000e1f, -00000e20, -00000e21, -00000e22, -00000e23, -00000e24, -00000e25, -00000e26, -00000e27, -00000e28, -00000e29, -00000e2a, -00000e2b, -00000e2c, -00000e2d, -00000e2e, -00000e2f, -00000e30, -00000e31, -00000e32, -00000e33, -00000e34, -00000e35, -00000e36, -00000e37, -00000e38, -00000e39, -00000e3a, -00000e3b, -00000e3c, -00000e3d, -00000e3e, -00000e3f, -00000e40, -00000e41, -00000e42, -00000e43, -00000e44, -00000e45, -00000e46, -00000e47, -00000e48, -00000e49, -00000e4a, -00000e4b, -00000e4c, -00000e4d, -00000e4e, -00000e4f, -00000e50, -00000e51, -00000e52, -00000e53, -00000e54, -00000e55, -00000e56, -00000e57, -00000e58, -00000e59, -00000e5a, -00000e5b, -00000e5c, -00000e5d, -00000e5e, -00000e5f, -00000e60, -00000e61, -00000e62, -00000e63, -00000e64, -00000e65, -00000e66, -00000e67, -00000e68, -00000e69, -00000e6a, -00000e6b, -00000e6c, -00000e6d, -00000e6e, -00000e6f, -00000e70, -00000e71, -00000e72, -00000e73, -00000e74, -00000e75, -00000e76, -00000e77, -00000e78, -00000e79, -00000e7a, -00000e7b, -00000e7c, -00000e7d, -00000e7e, -00000e7f, -00000e80, -00000e81, -00000e82, -00000e83, -00000e84, -00000e85, -00000e86, -00000e87, -00000e88, -00000e89, -00000e8a, -00000e8b, -00000e8c, -00000e8d, -00000e8e, -00000e8f, -00000e90, -00000e91, -00000e92, -00000e93, -00000e94, -00000e95, -00000e96, -00000e97, -00000e98, -00000e99, -00000e9a, -00000e9b, -00000e9c, -00000e9d, -00000e9e, -00000e9f, -00000ea0, -00000ea1, -00000ea2, -00000ea3, -00000ea4, -00000ea5, -00000ea6, -00000ea7, -00000ea8, -00000ea9, -00000eaa, -00000eab, -00000eac, -00000ead, -00000eae, -00000eaf, -00000eb0, -00000eb1, -00000eb2, -00000eb3, -00000eb4, -00000eb5, -00000eb6, -00000eb7, -00000eb8, -00000eb9, -00000eba, -00000ebb, -00000ebc, -00000ebd, -00000ebe, -00000ebf, -00000ec0, -00000ec1, -00000ec2, -00000ec3, -00000ec4, -00000ec5, -00000ec6, -00000ec7, -00000ec8, -00000ec9, -00000eca, -00000ecb, -00000ecc, -00000ecd, -00000ece, -00000ecf, -00000ed0, -00000ed1, -00000ed2, -00000ed3, -00000ed4, -00000ed5, -00000ed6, -00000ed7, -00000ed8, -00000ed9, -00000eda, -00000edb, -00000edc, -00000edd, -00000ede, -00000edf, -00000ee0, -00000ee1, -00000ee2, -00000ee3, -00000ee4, -00000ee5, -00000ee6, -00000ee7, -00000ee8, -00000ee9, -00000eea, -00000eeb, -00000eec, -00000eed, -00000eee, -00000eef, -00000ef0, -00000ef1, -00000ef2, -00000ef3, -00000ef4, -00000ef5, -00000ef6, -00000ef7, -00000ef8, -00000ef9, -00000efa, -00000efb, -00000efc, -00000efd, -00000efe, -00000eff, -00000f00, -00000f01, -00000f02, -00000f03, -00000f04, -00000f05, -00000f06, -00000f07, -00000f08, -00000f09, -00000f0a, -00000f0b, -00000f0c, -00000f0d, -00000f0e, -00000f0f, -00000f10, -00000f11, -00000f12, -00000f13, -00000f14, -00000f15, -00000f16, -00000f17, -00000f18, -00000f19, -00000f1a, -00000f1b, -00000f1c, -00000f1d, -00000f1e, -00000f1f, -00000f20, -00000f21, -00000f22, -00000f23, -00000f24, -00000f25, -00000f26, -00000f27, -00000f28, -00000f29, -00000f2a, -00000f2b, -00000f2c, -00000f2d, -00000f2e, -00000f2f, -00000f30, -00000f31, -00000f32, -00000f33, -00000f34, -00000f35, -00000f36, -00000f37, -00000f38, -00000f39, -00000f3a, -00000f3b, -00000f3c, -00000f3d, -00000f3e, -00000f3f, -00000f40, -00000f41, -00000f42, -00000f43, -00000f44, -00000f45, -00000f46, -00000f47, -00000f48, -00000f49, -00000f4a, -00000f4b, -00000f4c, -00000f4d, -00000f4e, -00000f4f, -00000f50, -00000f51, -00000f52, -00000f53, -00000f54, -00000f55, -00000f56, -00000f57, -00000f58, -00000f59, -00000f5a, -00000f5b, -00000f5c, -00000f5d, -00000f5e, -00000f5f, -00000f60, -00000f61, -00000f62, -00000f63, -00000f64, -00000f65, -00000f66, -00000f67, -00000f68, -00000f69, -00000f6a, -00000f6b, -00000f6c, -00000f6d, -00000f6e, -00000f6f, -00000f70, -00000f71, -00000f72, -00000f73, -00000f74, -00000f75, -00000f76, -00000f77, -00000f78, -00000f79, -00000f7a, -00000f7b, -00000f7c, -00000f7d, -00000f7e, -00000f7f, -00000f80, -00000f81, -00000f82, -00000f83, -00000f84, -00000f85, -00000f86, -00000f87, -00000f88, -00000f89, -00000f8a, -00000f8b, -00000f8c, -00000f8d, -00000f8e, -00000f8f, -00000f90, -00000f91, -00000f92, -00000f93, -00000f94, -00000f95, -00000f96, -00000f97, -00000f98, -00000f99, -00000f9a, -00000f9b, -00000f9c, -00000f9d, -00000f9e, -00000f9f, -00000fa0, -00000fa1, -00000fa2, -00000fa3, -00000fa4, -00000fa5, -00000fa6, -00000fa7, -00000fa8, -00000fa9, -00000faa, -00000fab, -00000fac, -00000fad, -00000fae, -00000faf, -00000fb0, -00000fb1, -00000fb2, -00000fb3, -00000fb4, -00000fb5, -00000fb6, -00000fb7, -00000fb8, -00000fb9, -00000fba, -00000fbb, -00000fbc, -00000fbd, -00000fbe, -00000fbf, -00000fc0, -00000fc1, -00000fc2, -00000fc3, -00000fc4, -00000fc5, -00000fc6, -00000fc7, -00000fc8, -00000fc9, -00000fca, -00000fcb, -00000fcc, -00000fcd, -00000fce, -00000fcf, -00000fd0, -00000fd1, -00000fd2, -00000fd3, -00000fd4, -00000fd5, -00000fd6, -00000fd7, -00000fd8, -00000fd9, -00000fda, -00000fdb, -00000fdc, -00000fdd, -00000fde, -00000fdf, -00000fe0, -00000fe1, -00000fe2, -00000fe3, -00000fe4, -00000fe5, -00000fe6, -00000fe7, -00000fe8, -00000fe9, -00000fea, -00000feb, -00000fec, -00000fed, -00000fee, -00000fef, -00000ff0, -00000ff1, -00000ff2, -00000ff3, -00000ff4, -00000ff5, -00000ff6, -00000ff7, -00000ff8, -00000ff9, -00000ffa, -00000ffb, -00000ffc, -00000ffd, -00000ffe, -00000fff; diff --git a/src/testbench/instrqueue/testbench.sv b/src/testbench/instrqueue/testbench.sv deleted file mode 100644 index c297a32..0000000 --- a/src/testbench/instrqueue/testbench.sv +++ /dev/null @@ -1,113 +0,0 @@ -`include "defines.svh" - -`timescale 1ns / 1ps -module testbench_iq (); - logic clk, rst; - word_t in1; - word_t pin1; - word_t in2; - word_t pin2; - word_t out1; - word_t pout1; - word_t out2; - word_t pout2; - // InstrQueue iq ( - // clk, - // rst, - // fakehsi1.prev, - // in1, - // pin1, - // fakehsi2.prev, - // in2, - // pin2, - // fakehso1.next, - // out1, - // pout1, - // fakehso2.next, - // out2, - // pout2, - // clear - // ); - always begin - // clk = 1; rst = 1; fakehso1.allowin = 0; fakehso2.allowin = 0; - // fakehsi1.readygo = 1; fakehsi2.readygo = 1; clear = 0; - // in1 = 0; in2 = 0; pin1 = 0; pin2 = 0; #50; - // clk = 0; rst = 0; #50; - // clk = 1; - // in1 = 1; in2 = 2; pin1 = 1; pin2 = 2; #50; - // clk = 0; #50; - // clk = 1; - // in1 = 3; in2 = 4; pin1 = 3; pin2 = 4; clear = 1; #50; - // clk = 0; #50; - // clk = 1; clear = 0;fakehso1.allowin = 1; fakehso2.allowin = 1; - // in1 = 5; in2 = 6 ; pin1 = 5; pin2 = 6; #50; - // fakehsi1.readygo = 0; fakehsi2.readygo = 0; - // clk = 0; #50; clk = 1; #50; clk = 0; #50; clk = 1; #50; clk = 0; #50; - - // clk = 1; rst = 1; fakehso1.allowin = 0; fakehso2.allowin = 0; - // fakehsi1.readygo = 1; fakehsi2.readygo = 1; clear = 0; - // in1 = 0; in2 = 0; pin1 = 0; pin2 = 0; #50; - // clk = 0; rst = 0; #50; - // clk = 1; - // in1 = 1; in2 = 2; pin1 = 1; pin2 = 2; #50; - // clk = 0; #50; - // clk = 1; - // in1 = 3; in2 = 4; pin1 = 3; pin2 = 4; #50; - // clk = 0; #50; - // clk = 1; fakehso1.allowin = 1; fakehso2.allowin = 1; - // in1 = 5; in2 = 6; pin1 = 5; pin2 = 6; clear = 1; #50; - // fakehsi1.readygo = 0; fakehsi2.readygo = 0; - // clk = 0; #50; clear = 0; clk = 1; #50; clk = 0; #50; clk = 1; #50; clk = 0; #50; - // clk = 0; - // fakehsi1.readygo = 1; fakehsi2.readygo = 1; - // fakehso1.allowin = 0; fakehso2.allowin = 0; - // rst = 1; - // in1 = 0; in2 = 0; pin1 = 0; pin2 = 0; #5; - // clk = 1; #50; - // rst = 0; #5; - // clk = 0; #50; - // in1 = 1; in2 = 2; pin1 = 1; pin2 = 2; - // #5; - // clk = 1; - // #50; - // clk = 0; #50; - // in1 = 3; in2 = 4; pin1 = 3; pin2 = 4; #5; - // clk = 1; - // #50; - // clk = 0; #50; - // fakehso1.allowin = 1; fakehso2.allowin = 1; - // in1 = 5; in2 = 6; pin1 = 5; pin2 = 6; #5; - // clk = 1;#50; - // fakehsi1.readygo = 0; fakehsi2.readygo = 0; - // clk = 0; #50; clk = 1; #50; clk = 0; #50; clk = 1; #50; clk = 0; #50; - // clk = 1; rst = 1; fakehso1.allowin = 1; fakehso2.allowin = 1; - // fakehsi1.readygo = 1; fakehsi2.readygo = 1; - // in1 = 0; in2 = 0; pin1 = 0; pin2 = 0; #50; - // clk = 0; rst = 0; #50; - // clk = 1; - // in1 = 1; in2 = 2; pin1 = 1; pin2 = 2; #50; - // clk = 0; #50; - // clk = 1; - // in1 = 3; in2 = 4; pin1 = 3; pin2 = 4; #50; - // clk = 0; #50; - // clk = 1; - // in1 = 5; in2 = 6; pin1 = 5; pin2 = 6; #50; - // fakehsi1.readygo = 0; fakehsi2.readygo = 0; - // clk = 0; #50; clk = 1; #50; clk = 0; #50; clk = 1; #50; clk = 0; #50; - // clk = 1; rst = 1; fakehso1.allowin = 1; fakehso2.allowin = 0; - // fakehsi1.readygo = 1; fakehsi2.readygo = 1; - // in1 = 0; in2 = 0; pin1 = 0; pin2 = 0; #50; - // clk = 0; rst = 0; #50; - // clk = 1; - // in1 = 1; in2 = 2; pin1 = 1; pin2 = 2; #50; - // clk = 0; #50; - // clk = 1; - // in1 = 3; in2 = 4; pin1 = 3; pin2 = 4; #50; - // clk = 0; #50; - // clk = 1; - // in1 = 5; in2 = 6; pin1 = 5; pin2 = 6; fakehso2.allowin = 1; #50; - // fakehsi1.readygo = 0; fakehsi2.readygo = 0; - // clk = 0; #50; clk = 1; #50; clk = 0; #50; clk = 1; #50; clk = 0; #50; - $finish; - end -endmodule diff --git a/src/testbench/makefile b/src/testbench/makefile deleted file mode 100644 index 10b4a9a..0000000 --- a/src/testbench/makefile +++ /dev/null @@ -1,28 +0,0 @@ -HOME = .. -INC = ${HOME}/include - -# sources += testbench.v -# sources += clk_wiz.v -# sources += mem.v -# sources += ${HOME}/src/fpga_top.v -# sources += ${HOME}/src/bus.v -# sources += ${HOME}/src/multi_ch.v -sources += ${HOME}/src/seg7.sv -sources += ${HOME}/src/gadgets.sv -sources += ${HOME}/src/mips/gadgets.sv -sources += ${HOME}/src/mips/regfile.sv -sources += ${HOME}/src/mips/alu.sv - -run: test.vcd - open test.vcd - -clean: - rm -f test.vcd test.out - -test.vcd: test.out - vvp test.out - -test.out: ${sources} - iverilog -I ${INC} -g2005-sv -Wall -o $@ $^ - -.PHONY: run clean From f5abaa2881c85b9e39ddbd3ca11188ea933bee0f Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Tue, 24 Aug 2021 13:18:52 +0800 Subject: [PATCH 06/56] 1. CP0 add Random and Wired 2. TLB remove PageMask 3. CP0 remove PageMask 4. MMU state definitions moved --- .gitignore | 3 +- src/CP0/CP0.sv | 48 +++++++++++++------- src/MMU/MMU.sv | 108 ++++++++++++++++++++++++-------------------- src/MMU/TLB.sv | 70 +++++++++++++++------------- src/MyCPU.sv | 12 ++--- src/include/CP0.svh | 8 ++-- src/include/TLB.svh | 26 +++++++---- 7 files changed, 159 insertions(+), 116 deletions(-) diff --git a/.gitignore b/.gitignore index c3699a9..29972c4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ vivado.log vivado.jou .library_mapping.xml -.project \ No newline at end of file +.project +.settings \ No newline at end of file diff --git a/src/CP0/CP0.sv b/src/CP0/CP0.sv index b90fa61..a604771 100644 --- a/src/CP0/CP0.sv +++ b/src/CP0/CP0.sv @@ -26,18 +26,16 @@ module CP0 ( output logic [2:0] K0, output Index_t Index, output EntryHi_t EntryHi, - output PageMask_t PageMask, output EntryLo_t EntryLo1, output EntryLo_t EntryLo0, input EntryHi_t tlb_EntryHi, - input PageMask_t tlb_PageMask, input EntryLo_t tlb_EntryLo1, input EntryLo_t tlb_EntryLo0, input Index_t tlb_Index ); CP0_REGS_t rf_cp0; - reg count_lo; + logic count_lo; // int comb logic assign interrupt = (rf_cp0.Status.EXL == 1'b0) @@ -61,13 +59,24 @@ module CP0 ( assign rf_cp0.Status.zero2 = 6'b0; assign rf_cp0.Status.zero3 = 6'b0; assign rf_cp0.EntryHi.zero = 5'b0; - assign rf_cp0.PageMask.zero1 = 7'b0; - assign rf_cp0.PageMask.zero2 = 13'b0; + assign rf_cp0.Wired.zero = 29'b0; assign rf_cp0.EntryLo1.zero = 6'b0; assign rf_cp0.EntryLo0.zero = 6'b0; - assign rf_cp0.Index.zero = 29'b0; + assign rf_cp0.Random.zero = 29'b0; + assign rf_cp0.Index.zero = 28'b0; - assign rf_cp0.Config1 = 32'b0_000011_000_100_011_001_011_011_0000000; + // Vol III Figure 9-1 + // | 31 | 30...25 | 24...22 | 21...19 | 18...16 | + // | Config2 | MMU SIZE | iCache sets per way | iCache line size | iCache associativity | + // | 15...13 | 12...10 | 9...7 | + // | dCache sets per way | dCache line size | dCache associativity | + // | 6 | 5 | 4 | + // | Coprocessor 2 implemented | MD | Performance Counter registers | + // | 3 | 2 | + // | Watch registers implemented | Code compression implemented | + // | 1 | 0 | + // | EJTAG implemented | FPU implemented | + assign rf_cp0.Config1 = 32'b0_000111_000_100_011_001_011_011_0_0_0_0_0_0_0; assign rf_cp0.EBase.one = 1'b1; assign rf_cp0.EBase.zero1 = 1'b0; assign rf_cp0.EBase.zero2 = 2'b0; @@ -76,7 +85,6 @@ module CP0 ( always_ff @(posedge clk) if (rst) begin - // rf_cp0 = {504'b0, 8'b10000011, 105'b0, 1'b1, 117'b0, 1'b1, 288'b0}; rf_cp0.TagLo.Tag = 21'b0; rf_cp0.TagLo.D = 1'b0; rf_cp0.TagLo.V = 1'b0; @@ -95,7 +103,7 @@ module CP0 ( rf_cp0.EntryHi.ASID = 8'b0; rf_cp0.Count = 32'h0; rf_cp0.BadVAddr = 32'h0; - rf_cp0.PageMask.Mask = 12'b0; + rf_cp0.Wired.Wired = 3'b0; rf_cp0.EntryLo1.PFN = 20'b0; rf_cp0.EntryLo1.C = 3'b0; rf_cp0.EntryLo1.D = 1'b0; @@ -108,6 +116,7 @@ module CP0 ( rf_cp0.EntryLo0.G = 1'b0; rf_cp0.Index.P = 1'b0; rf_cp0.Index.Index = 2'b0; + rf_cp0.Random.Random = 3'b111; rf_cp0.EBase.EBase = 18'b0; @@ -160,8 +169,8 @@ module CP0 ( 9: rf_cp0.Count = wdata; 8: rf_cp0.BadVAddr = wdata; // 7: rf_cp0.HWREna = wdata; - // 6: rf_cp0.Wired = wdata; - 5: rf_cp0.PageMask.Mask = wdata[24:13]; + 6: rf_cp0.Wired = wdata[2:0]; + // 5: rf_cp0.PageMask.Mask = wdata[24:13]; // 4: rf_cp0.Context = wdata; 3: begin rf_cp0.EntryLo1.PFN = wdata[25:6]; @@ -179,7 +188,7 @@ module CP0 ( end // 1: rf_cp0.Random = wdata; 0: begin - rf_cp0.Index.Index = wdata[1:0]; + rf_cp0.Index.Index = wdata[2:0]; end default: begin end @@ -189,7 +198,7 @@ module CP0 ( if (tlbr) begin rf_cp0.EntryHi.VPN2 = tlb_EntryHi.VPN2; rf_cp0.EntryHi.ASID = tlb_EntryHi.ASID; - rf_cp0.PageMask.Mask = tlb_PageMask.Mask; + // rf_cp0.PageMask.Mask = tlb_PageMask.Mask; rf_cp0.EntryLo0.PFN = tlb_EntryLo0.PFN; rf_cp0.EntryLo0.C = tlb_EntryLo0.C; rf_cp0.EntryLo0.D = tlb_EntryLo0.D; @@ -201,11 +210,15 @@ module CP0 ( rf_cp0.EntryLo1.V = tlb_EntryLo1.V; rf_cp0.EntryLo1.G = tlb_EntryLo1.G; end + if (tlbp) begin rf_cp0.Index.P = tlb_Index.P; rf_cp0.Index.Index = tlb_Index.Index; end + rf_cp0.Random.Random = &rf_cp0.Random.Random ? rf_cp0.Wired.Wired + : rf_cp0.Random.Random + 1'b1; + if (rf_cp0.Count == rf_cp0.Compare) rf_cp0.Cause.TI = 1; if (exception.ERET) rf_cp0.Status.EXL = 1'b0; @@ -262,12 +275,13 @@ module CP0 ( 9: rdata = rf_cp0.Count; 8: rdata = rf_cp0.BadVAddr; // 7: rdata = rf_cp0.HWREna; - // 6: rdata = rf_cp0.Wired; - 5: rdata = rf_cp0.PageMask; + 6: rdata = rf_cp0.Wired; + // 5: rdata = rf_cp0.PageMask; + 5: rdata = 32'h0; // 4: rdata = rf_cp0.Context; 3: rdata = rf_cp0.EntryLo1; 2: rdata = rf_cp0.EntryLo0; - // 1: rdata = rf_cp0.Random; + 1: rdata = rf_cp0.Random; 0: rdata = rf_cp0.Index; default: rdata = 32'h0; endcase @@ -279,7 +293,7 @@ module CP0 ( assign K0 = rf_cp0.Config.K0; assign Index = rf_cp0.Index; assign EntryHi = rf_cp0.EntryHi; - assign PageMask = rf_cp0.PageMask; + // assign PageMask = rf_cp0.PageMask; assign EntryLo1 = rf_cp0.EntryLo1; assign EntryLo0 = rf_cp0.EntryLo0; diff --git a/src/MMU/MMU.sv b/src/MMU/MMU.sv index 4495540..2fc208c 100644 --- a/src/MMU/MMU.sv +++ b/src/MMU/MMU.sv @@ -25,11 +25,11 @@ module MMU ( input logic tlbp, // TLBP -> Write CP0 Index input Index_t c0_Index, // TLBR input EntryHi_t c0_EntryHi, // TLBWI + F/M(ASID) - input PageMask_t c0_PageMask, // TLBWI + // input PageMask_t c0_PageMask, // TLBWI input EntryLo_t c0_EntryLo1, // TLBWI input EntryLo_t c0_EntryLo0, // TLBWI output EntryHi_t EntryHi, // TLBR - output PageMask_t PageMask, // TLBR + // output PageMask_t PageMask, // TLBR output EntryLo_t EntryLo1, // TLBR output EntryLo_t EntryLo0, // TLBR output Index_t Index, // TLBP @@ -42,6 +42,49 @@ module MMU ( output logic dTLBModified ); + // ====================== + // ======== Defs ======== + // ====================== + + typedef enum bit [3:0] { + I_IDLE, + I_WA, + I_WD1, + I_WD2, + I_WD3, + I_WD4, + I_WD5, + I_WD6, + I_WD7, + I_WD8, + I_REFILL + } istate_t; + + typedef enum bit [2:0] { + DR_IDLE, + DR_WA, + DR_WD1, + DR_WD2, + DR_WD3, + DR_WD4, + DR_REFILL + } drstate_t; + + typedef enum bit [2:0] { + DW_IDLE, + DW_WD1, + DW_WD2, + DW_WD3, + DW_WD4, + DW_WB, + DW_WAITR + } dwstate_t; + + typedef enum bit { + DWA_IDLE, + DWA_WA + } dwastate_t; + // ====================== // ======== iVar ======== // ====================== @@ -62,19 +105,6 @@ module MMU ( // ======== iState Machine ======== // ================================ - typedef enum bit [3:0] { - I_IDLE, - I_WA, - I_WD1, - I_WD2, - I_WD3, - I_WD4, - I_WD5, - I_WD6, - I_WD7, - I_WD8, - I_REFILL - } istate_t; istate_t iState; istate_t iNextState; @@ -331,30 +361,10 @@ module MMU ( dWdata1 ); - // ================================ - // ========== dFunction ========== - // ================================ - - assign dVA = data.addr; - assign dValid1 = dReq1 & dHit1 & dMValid1 & (~data.wr | dDirty1); - - assign dTLBRefill = (drState == DR_IDLE) & dReq1 & ~dHit1; - assign dTLBInvalid = (drState == DR_IDLE) & dReq1 & ~dMValid1; - assign dTLBModified = (drState == DR_IDLE) & dReq1 & data.wr & ~dDirty1; - // ================================= // ======== drState Machine ======== // ================================= - typedef enum bit [2:0] { - DR_IDLE, - DR_WA, - DR_WD1, - DR_WD2, - DR_WD3, - DR_WD4, - DR_REFILL - } drstate_t; drstate_t drState; drstate_t drNextState; @@ -428,6 +438,17 @@ module MMU ( endcase end + // ================================ + // ========== dFunction ========== + // ================================ + + assign dVA = data.addr; + assign dValid1 = dReq1 & dHit1 & dMValid1 & (~data.wr | dDirty1); + + assign dTLBRefill = (drState == DR_IDLE) & dReq1 & ~dHit1; + assign dTLBInvalid = (drState == DR_IDLE) & dReq1 & ~dMValid1; + assign dTLBModified = (drState == DR_IDLE) & dReq1 & data.wr & ~dDirty1; + // ============================= // ======== drFlip-Flop ======== // ============================= @@ -489,15 +510,6 @@ module MMU ( // ======== dwState Machine ======== // ================================= - typedef enum bit [2:0] { - DW_IDLE, - DW_WD1, - DW_WD2, - DW_WD3, - DW_WD4, - DW_WB, - DW_WAITR - } dwstate_t; dwstate_t dwState; dwstate_t dwNextState; @@ -611,10 +623,6 @@ module MMU ( assign wdata_ok = (dwNextState == DW_IDLE) | (dwNextState == DW_WAITR); - typedef enum bit { - DWA_IDLE, - DWA_WA - } dwastate_t; dwastate_t dwaState; dwastate_t dwaNextState; @@ -682,12 +690,12 @@ module MMU ( .tlbp (tlbp), .c0_Index (c0_Index), .c0_EntryHi (c0_EntryHi), - .c0_PageMask(c0_PageMask), + // .c0_PageMask(c0_PageMask), .c0_EntryLo1(c0_EntryLo1), .c0_EntryLo0(c0_EntryLo0), .EntryHi (EntryHi), - .PageMask(PageMask), + // .PageMask(PageMask), .EntryLo1(EntryLo1), .EntryLo0(EntryLo0), .Index (Index), diff --git a/src/MMU/TLB.sv b/src/MMU/TLB.sv index 6c35cfe..b4b5ca7 100644 --- a/src/MMU/TLB.sv +++ b/src/MMU/TLB.sv @@ -1,3 +1,4 @@ +`include "defines.svh" `include "TLB.svh" module TLB ( @@ -11,12 +12,12 @@ module TLB ( input Index_t c0_Index, // TLBR input EntryHi_t c0_EntryHi, // TLBWI + F/M(ASID) - input PageMask_t c0_PageMask, // TLBWI + // input PageMask_t c0_PageMask, // TLBWI input EntryLo_t c0_EntryLo1, // TLBWI input EntryLo_t c0_EntryLo0, // TLBWI output EntryHi_t EntryHi, // TLBR - output PageMask_t PageMask, // TLBR + // output PageMask_t PageMask, // TLBR output EntryLo_t EntryLo1, // TLBR output EntryLo_t EntryLo0, // TLBR output Index_t Index, // TLBP @@ -51,30 +52,30 @@ module TLB ( Index_t Index0; - TLB_t [3:0] TLB_entries; + TLB_t [7:0] TLB_entries; TLB_t entry; - // CP0(TLBWI) EntryHi PageMask EntryLo0 EntryLo1 -> TLB[Index] + // CP0(TLBWI) EntryHi /*PageMask*/ EntryLo0 EntryLo1 -> TLB[Index] always_ff @(posedge clk) begin if (rst) begin - TLB_entries <= 360'b0; + TLB_entries <= 624'b0; end else if (tlbwi) TLB_entries[c0_Index.Index] <= {c0_EntryHi.VPN2, c0_EntryHi.ASID, - c0_PageMask.Mask, + // c0_PageMask.Mask, c0_EntryLo0.G & c0_EntryLo1.G, c0_EntryLo0.PFN, c0_EntryLo0.C, c0_EntryLo0.D, c0_EntryLo0.V, c0_EntryLo1.PFN, c0_EntryLo1.C, c0_EntryLo1.D, c0_EntryLo1.V}; end - // CP0(TLBR) Index -> EntryHi PageMask EntryLo0 EntryLo1 + // CP0(TLBR) Index -> EntryHi /*PageMask*/ EntryLo0 EntryLo1 assign entry = TLB_entries[c0_Index.Index]; assign EntryHi.zero = 5'b0; assign EntryHi.VPN2 = entry.VPN2; assign EntryHi.ASID = entry.ASID; - assign PageMask.zero1 = 7'b0; - assign PageMask.Mask = entry.PageMask; - assign PageMask.zero2 = 13'b0; + // assign PageMask.zero1 = 7'b0; + // assign PageMask.Mask = entry.PageMask; + // assign PageMask.zero2 = 13'b0; assign EntryLo0.zero = 6'b0; assign EntryLo0.PFN = entry.PFN0; @@ -192,7 +193,7 @@ endmodule module TLB_Lookup ( - input TLB_t [ 3:0] TLB_entries, + input TLB_t [ 7:0] TLB_entries, input logic [19:0] VPN, input logic [ 7:0] ASID, @@ -204,40 +205,47 @@ module TLB_Lookup ( output Index_t index ); - logic [3:0] hitWay; - for (genvar i = 0; i < 4; i++) - assign hitWay[i] = ((TLB_entries[i].VPN2 & ~{7'b0, TLB_entries[i].PageMask}) - == (VPN[19:1] & ~{7'b0, TLB_entries[i].PageMask})) + logic [7:0] hitWay; + for (genvar i = 0; i < 8; i++) + // assign hitWay[i] = ((TLB_entries[i].VPN2 & ~{7'b0, TLB_entries[i].PageMask}) + // == (VPN[19:1] & ~{7'b0, TLB_entries[i].PageMask})) + // & (TLB_entries[i].G | TLB_entries[i].ASID == ASID); + assign hitWay[i] = (TLB_entries[i].VPN2 == VPN[19:1]) & (TLB_entries[i].G | TLB_entries[i].ASID == ASID); // assume: hit is unique assign hit = |{hitWay}; assign index.P = ~hit; assign index.zero = 0; - onehot_bin4 index_decoder(hitWay, index.Index); + onehot_bin8 index_decoder(hitWay, index.Index); // always_comb for (int i = 0; i < 32; i++) index.Index |= hitWay[i] ? i : 0; TLB_t found; - assign found = (hitWay[ 0] ? TLB_entries[ 0] : 90'b0) - | (hitWay[ 1] ? TLB_entries[ 1] : 90'b0) - | (hitWay[ 2] ? TLB_entries[ 2] : 90'b0) - | (hitWay[ 3] ? TLB_entries[ 3] : 90'b0); + assign found = (hitWay[ 0] ? TLB_entries[ 0] : 78'b0) + | (hitWay[ 1] ? TLB_entries[ 1] : 78'b0) + | (hitWay[ 2] ? TLB_entries[ 2] : 78'b0) + | (hitWay[ 3] ? TLB_entries[ 3] : 78'b0) + | (hitWay[ 4] ? TLB_entries[ 4] : 78'b0) + | (hitWay[ 5] ? TLB_entries[ 5] : 78'b0) + | (hitWay[ 6] ? TLB_entries[ 6] : 78'b0) + | (hitWay[ 7] ? TLB_entries[ 7] : 78'b0); logic parity; - assign parity = |{ - VPN[12] & found.PageMask[10], - VPN[10] & ~found.PageMask[10] & found.PageMask[ 8], - VPN[ 8] & ~found.PageMask[ 8] & found.PageMask[ 6], - VPN[ 6] & ~found.PageMask[ 6] & found.PageMask[ 4], - VPN[ 4] & ~found.PageMask[ 4] & found.PageMask[ 2], - VPN[ 2] & ~found.PageMask[ 2] & found.PageMask[ 0], - VPN[ 0] & ~found.PageMask[ 0] - }; + // assign parity = |{ + // VPN[12] & found.PageMask[10], + // VPN[10] & ~found.PageMask[10] & found.PageMask[ 8], + // VPN[ 8] & ~found.PageMask[ 8] & found.PageMask[ 6], + // VPN[ 6] & ~found.PageMask[ 6] & found.PageMask[ 4], + // VPN[ 4] & ~found.PageMask[ 4] & found.PageMask[ 2], + // VPN[ 2] & ~found.PageMask[ 2] & found.PageMask[ 0], + // VPN[ 0] & ~found.PageMask[ 0] + // }; // assign parity = |{VPN & {7'b0, found.PageMask + 1'b1}}; + assign parity = VPN[0]; logic [19:0] PFN; assign {PFN, cached, dirty, valid} = parity ? {found.PFN1, found.C1[0], found.D1, found.V1} : {found.PFN0, found.C0[0], found.D0, found.V0}; - assign PPN = (VPN & {8'b0, found.PageMask}) | (PFN & ~{8'b0, found.PageMask}); - + // assign PPN = (VPN & {8'b0, found.PageMask}) | (PFN & ~{8'b0, found.PageMask}); + assign PPN = PFN; endmodule diff --git a/src/MyCPU.sv b/src/MyCPU.sv index 12fd74e..544c86e 100644 --- a/src/MyCPU.sv +++ b/src/MyCPU.sv @@ -93,11 +93,11 @@ module mycpu_top ( logic [2:0] K0; Index_t c0_Index; EntryHi_t c0_EntryHi; - PageMask_t c0_PageMask; + // PageMask_t c0_PageMask; EntryLo_t c0_EntryLo1; EntryLo_t c0_EntryLo0; EntryHi_t tlb_EntryHi; - PageMask_t tlb_PageMask; + // PageMask_t tlb_PageMask; EntryLo_t tlb_EntryLo1; EntryLo_t tlb_EntryLo0; Index_t tlb_Index; @@ -138,11 +138,11 @@ module mycpu_top ( .tlbp (tlb_tlbp), .c0_Index (c0_Index), .c0_EntryHi (c0_EntryHi), - .c0_PageMask (c0_PageMask), + // .c0_PageMask (c0_PageMask), .c0_EntryLo1 (c0_EntryLo1), .c0_EntryLo0 (c0_EntryLo0), .EntryHi (tlb_EntryHi), - .PageMask (tlb_PageMask), + // .PageMask (tlb_PageMask), .EntryLo1 (tlb_EntryLo1), .EntryLo0 (tlb_EntryLo0), .Index (tlb_Index), @@ -184,11 +184,11 @@ module mycpu_top ( .K0 (K0), .Index (c0_Index), .EntryHi (c0_EntryHi), - .PageMask (c0_PageMask), + // .PageMask (c0_PageMask), .EntryLo1 (c0_EntryLo1), .EntryLo0 (c0_EntryLo0), .tlb_EntryHi (tlb_EntryHi), - .tlb_PageMask(tlb_PageMask), + // .tlb_PageMask(tlb_PageMask), .tlb_EntryLo1(tlb_EntryLo1), .tlb_EntryLo0(tlb_EntryLo0), .tlb_Index (tlb_Index) diff --git a/src/include/CP0.svh b/src/include/CP0.svh index d6fefcf..89b8c2c 100644 --- a/src/include/CP0.svh +++ b/src/include/CP0.svh @@ -115,11 +115,13 @@ typedef struct packed { EntryHi_t EntryHi; word_t Count; word_t BadVAddr; - // HWREna, Wired, Context, - PageMask_t PageMask; + // HWREna + Wired_t Wired; + // Context, + // word_t PageMask; EntryLo_t EntryLo1; EntryLo_t EntryLo0; - //Random + Random_t Random; Index_t Index; // ==== sel1 ==== diff --git a/src/include/TLB.svh b/src/include/TLB.svh index 89d241a..e54dc45 100644 --- a/src/include/TLB.svh +++ b/src/include/TLB.svh @@ -7,11 +7,11 @@ typedef struct packed { logic [ 7:0] ASID; } EntryHi_t; -typedef struct packed { - logic [ 6:0] zero1; - logic [11:0] Mask; - logic [12:0] zero2; -} PageMask_t; +// typedef struct packed { +// logic [ 6:0] zero1; +// logic [11:0] Mask; +// logic [12:0] zero2; +// } PageMask_t; typedef struct packed { logic [ 5:0] zero; @@ -24,14 +24,24 @@ typedef struct packed { typedef struct packed { logic P; - logic [28:0] zero; - logic [ 1:0] Index; + logic [27:0] zero; + logic [ 2:0] Index; } Index_t; +typedef struct packed { + logic [28:0] zero; + logic [ 2:0] Wired; +} Wired_t; + +typedef struct packed { + logic [28:0] zero; + logic [ 2:0] Random; +} Random_t; + typedef struct packed { logic [18:0] VPN2; logic [ 7:0] ASID; - logic [11:0] PageMask; + // logic [11:0] PageMask; logic G; logic [19:0] PFN0; logic [ 2:0] C0; From ba546d1d5f9fadb8ed0c6c2e83e64b0f138fcae4 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Tue, 24 Aug 2021 16:23:57 +0800 Subject: [PATCH 07/56] add tlbwr datapath --- src/CP0/CP0.sv | 4 +- src/Core/Controller.sv | 1 + src/Core/Datapath.sv | 12 ++-- src/MMU/MMU.sv | 14 ++++- src/MMU/TLB.sv | 10 ++-- src/MyCPU.sv | 6 ++ src/include/defines.svh | 1 + tools/ctrl_maker.py | 2 +- tools/decoder.py | 1 + tools/mctrl1.txt | 125 ++++++++++++++++++++-------------------- 10 files changed, 99 insertions(+), 77 deletions(-) diff --git a/src/CP0/CP0.sv b/src/CP0/CP0.sv index a604771..920e761 100644 --- a/src/CP0/CP0.sv +++ b/src/CP0/CP0.sv @@ -24,6 +24,7 @@ module CP0 ( input logic tlbr, input logic tlbp, output logic [2:0] K0, + output Random_t Random, output Index_t Index, output EntryHi_t EntryHi, output EntryLo_t EntryLo1, @@ -216,7 +217,7 @@ module CP0 ( rf_cp0.Index.Index = tlb_Index.Index; end - rf_cp0.Random.Random = &rf_cp0.Random.Random ? rf_cp0.Wired.Wired + rf_cp0.Random.Random = &rf_cp0.Random.Random ? rf_cp0.Wired.Wired : rf_cp0.Random.Random + 1'b1; if (rf_cp0.Count == rf_cp0.Compare) rf_cp0.Cause.TI = 1; @@ -291,6 +292,7 @@ module CP0 ( assign EBase = rf_cp0.EBase[31:12]; assign K0 = rf_cp0.Config.K0; + assign Random = rf_cp0.Random; assign Index = rf_cp0.Index; assign EntryHi = rf_cp0.EntryHi; // assign PageMask = rf_cp0.PageMask; diff --git a/src/Core/Controller.sv b/src/Core/Controller.sv index 75feaa8..c4f6768 100644 --- a/src/Core/Controller.sv +++ b/src/Core/Controller.sv @@ -74,6 +74,7 @@ module Controller ( assign ctrl.MCtrl1.SZ = inst[27:26]; assign ctrl.MCtrl1.TLBR = inst[30] & ~inst[29] & inst[25] & ~inst[3] & ~inst[1]; assign ctrl.MCtrl1.TLBWI = inst[30] & ~inst[29] & inst[25] & ~inst[3] & inst[1]; + assign ctrl.MCtrl1.TLBWR = inst[30] & ~inst[29] & inst[25] & ~inst[3] & (inst[2] | ~inst[1]); assign ctrl.MCtrl1.TLBP = inst[30] & ~inst[4] & inst[3]; assign ctrl.WCtrl.RW = ctrl.RD != 5'b00000 & (~inst[30] & (~inst[29] & (inst[31] | ~inst[28] & (~inst[27] & (~inst[26] & (~inst[3] & (~inst[4] | ~inst[0]) | inst[3] & (inst[5] | ~inst[4] & ~inst[2] & inst[0])) | inst[26] & inst[20]) | inst[27] & inst[26])) | inst[29] & ~inst[31]) | inst[30] & (inst[29] | ~inst[25] & ~inst[23])); diff --git a/src/Core/Datapath.sv b/src/Core/Datapath.sv index f00ca90..44d0b58 100644 --- a/src/Core/Datapath.sv +++ b/src/Core/Datapath.sv @@ -14,6 +14,7 @@ module Datapath ( input logic dTLBInvalid, input logic dTLBModified, output logic tlb_tlbwi, + output logic tlb_tlbwr, output logic tlb_tlbp, output logic c0_tlbr, output logic c0_tlbp, @@ -489,8 +490,8 @@ module Datapath ( | D.IA.MCtrl0.C0W & D.IB.MCtrl1.TLBWI & D.IA.MCtrl0.C0D == C0_ENTRYHI | D.IA.MCtrl0.C0W & D.IB.MCtrl1.TLBWI & D.IA.MCtrl0.C0D == C0_ENTRYLO0 | D.IA.MCtrl0.C0W & D.IB.MCtrl1.TLBWI & D.IA.MCtrl0.C0D == C0_ENTRYLO1 - | D.IA.MCtrl0.C0W & D.IB.MCtrl1.TLBWI & D.IA.MCtrl0.C0D == C0_INDEX - | D.IA.MCtrl0.C0W & D.IB.MCtrl1.TLBWI & D.IA.MCtrl0.C0D == C0_PAGEMASK + | D.IA.MCtrl0.C0W & D.IB.MCtrl1.TLBWI & D.IA.MCtrl0.C0D == C0_INDEX & ~D.IB.MCtrl1.TLBWR + | D.IA.MCtrl0.C0W & D.IB.MCtrl1.TLBWI & D.IA.MCtrl0.C0D == C0_PAGEMASK // TODO: PageMask is always zero now | E.I0.MCtrl.C0W & D.IB.MCtrl1.TLBP & E.I0.MCtrl.C0D == C0_ENTRYHI | D.IA.MCtrl0.C0W & D.IB.MCtrl1.TLBP & D.IA.MCtrl0.C0D == C0_ENTRYHI | D.IA.MCtrl0.C0W & D.IB.MCtrl1.MR & D.IA.MCtrl0.C0D == C0_ENTRYHI @@ -500,7 +501,7 @@ module Datapath ( | D.IA.MCtrl1.TLBR & D.IB.WCtrl.RW & D.IB.MCtrl0.C0D == C0_ENTRYHI & D.IB.MCtrl0.RS0 == C0 | D.IA.MCtrl1.TLBR & D.IB.WCtrl.RW & D.IB.MCtrl0.C0D == C0_ENTRYLO0 & D.IB.MCtrl0.RS0 == C0 | D.IA.MCtrl1.TLBR & D.IB.WCtrl.RW & D.IB.MCtrl0.C0D == C0_ENTRYLO1 & D.IB.MCtrl0.RS0 == C0 - | D.IA.MCtrl1.TLBR & D.IB.WCtrl.RW & D.IB.MCtrl0.C0D == C0_PAGEMASK & D.IB.MCtrl0.RS0 == C0 + | D.IA.MCtrl1.TLBR & D.IB.WCtrl.RW & D.IB.MCtrl0.C0D == C0_PAGEMASK & D.IB.MCtrl0.RS0 == C0 // TODO: PageMask is always zero now | D.IA.MCtrl1.TLBP & D.IB.WCtrl.RW & D.IB.MCtrl0.C0D == C0_INDEX & D.IB.MCtrl0.RS0 == C0 // Hazards Related to Exceptions or Interrupts | D.IA.MCtrl0.C0W & D.IB.ERET & D.IA.MCtrl0.C0D == C0_EPC @@ -735,7 +736,7 @@ module Datapath ( E.en, E.I1.ECtrl ); - ffenrc #(8) E_I1_MCtrl_ff ( + ffenrc #(9) E_I1_MCtrl_ff ( clk, rst | rstM, D.I1.MCtrl, @@ -1023,7 +1024,7 @@ module Datapath ( M.en, M.I1.ALUOut ); - ffenrc #(8) M_I1_MCtrl_ff ( + ffenrc #(9) M_I1_MCtrl_ff ( clk, rst | rstM, E.I1.MCtrl, @@ -1148,6 +1149,7 @@ module Datapath ( // M.I1.MEM assign tlb_tlbwi = M.I1.MCtrl.TLBWI; + assign tlb_tlbwr = M.I1.MCtrl.TLBWR; assign c0_tlbr = M.I1.MCtrl.TLBR; assign c0_tlbp = M.I1.MCtrl.TLBP & M.en; assign mem_i.wr = M.I1.MCtrl.MWR; diff --git a/src/MMU/MMU.sv b/src/MMU/MMU.sv index 2fc208c..d49068f 100644 --- a/src/MMU/MMU.sv +++ b/src/MMU/MMU.sv @@ -22,8 +22,10 @@ module MMU ( // CP0 input logic [2:0] K0, input logic tlbwi, // TLBWI -> Write TLB + input logic tlbwr, // TLBWR -> Write TLB input logic tlbp, // TLBP -> Write CP0 Index - input Index_t c0_Index, // TLBR + input Random_t c0_Random, // TLBWR + input Index_t c0_Index, // TLBWI + TLBR input EntryHi_t c0_EntryHi, // TLBWI + F/M(ASID) // input PageMask_t c0_PageMask, // TLBWI input EntryLo_t c0_EntryLo1, // TLBWI @@ -681,14 +683,20 @@ module MMU ( // ========== VA -> PA ========== // ============================== + logic tlbw; + logic [2:0] c0_Index_u; + + assign tlbw = tlbwi | tlbwr; + assign c0_Index_u = tlbwr ? c0_Random[2:0] : c0_Index[2:0]; + TLB TLB ( .clk(clk), .rst(rst), .K0 (K0), - .tlbwi (tlbwi), + .tlbw (tlbw), .tlbp (tlbp), - .c0_Index (c0_Index), + .c0_Index (c0_Index_u), .c0_EntryHi (c0_EntryHi), // .c0_PageMask(c0_PageMask), .c0_EntryLo1(c0_EntryLo1), diff --git a/src/MMU/TLB.sv b/src/MMU/TLB.sv index b4b5ca7..dc5e696 100644 --- a/src/MMU/TLB.sv +++ b/src/MMU/TLB.sv @@ -7,9 +7,9 @@ module TLB ( // CP0 input logic [2:0] K0, - input logic tlbwi, // TLBWI + input logic tlbw, // TLBWI + TLBWR input logic tlbp, // TLBP - input Index_t c0_Index, // TLBR + input logic [2:0] c0_Index, // TLBWR + TLBWI + TLBR input EntryHi_t c0_EntryHi, // TLBWI + F/M(ASID) // input PageMask_t c0_PageMask, // TLBWI @@ -59,15 +59,15 @@ module TLB ( always_ff @(posedge clk) begin if (rst) begin TLB_entries <= 624'b0; - end else if (tlbwi) - TLB_entries[c0_Index.Index] <= {c0_EntryHi.VPN2, c0_EntryHi.ASID, + end else if (tlbw) + TLB_entries[c0_Index] <= {c0_EntryHi.VPN2, c0_EntryHi.ASID, // c0_PageMask.Mask, c0_EntryLo0.G & c0_EntryLo1.G, c0_EntryLo0.PFN, c0_EntryLo0.C, c0_EntryLo0.D, c0_EntryLo0.V, c0_EntryLo1.PFN, c0_EntryLo1.C, c0_EntryLo1.D, c0_EntryLo1.V}; end // CP0(TLBR) Index -> EntryHi /*PageMask*/ EntryLo0 EntryLo1 - assign entry = TLB_entries[c0_Index.Index]; + assign entry = TLB_entries[c0_Index]; assign EntryHi.zero = 5'b0; assign EntryHi.VPN2 = entry.VPN2; diff --git a/src/MyCPU.sv b/src/MyCPU.sv index 544c86e..12b839e 100644 --- a/src/MyCPU.sv +++ b/src/MyCPU.sv @@ -91,6 +91,7 @@ module mycpu_top ( logic C0_Bev; logic [19:0] C0_EBase; logic [2:0] K0; + Random_t c0_Random; Index_t c0_Index; EntryHi_t c0_EntryHi; // PageMask_t c0_PageMask; @@ -108,6 +109,7 @@ module mycpu_top ( logic dTLBInvalid; logic dTLBModified; logic tlb_tlbwi; + logic tlb_tlbwr; logic tlb_tlbp; logic c0_tlbr; logic c0_tlbp; @@ -135,7 +137,9 @@ module mycpu_top ( .wdata_axi (wdata_axi.master), .K0 (K0), .tlbwi (tlb_tlbwi), + .tlbwr (tlb_tlbwr), .tlbp (tlb_tlbp), + .c0_Random (c0_Random), .c0_Index (c0_Index), .c0_EntryHi (c0_EntryHi), // .c0_PageMask (c0_PageMask), @@ -182,6 +186,7 @@ module mycpu_top ( .tlbr (c0_tlbr), .tlbp (c0_tlbp), .K0 (K0), + .Random (c0_Random), .Index (c0_Index), .EntryHi (c0_EntryHi), // .PageMask (c0_PageMask), @@ -206,6 +211,7 @@ module mycpu_top ( .dTLBInvalid (dTLBInvalid), .dTLBModified(dTLBModified), .tlb_tlbwi (tlb_tlbwi), + .tlb_tlbwr (tlb_tlbwr), .tlb_tlbp (tlb_tlbp), .c0_tlbr (c0_tlbr), .c0_tlbp (c0_tlbp), diff --git a/src/include/defines.svh b/src/include/defines.svh index 41738ef..203a1f6 100644 --- a/src/include/defines.svh +++ b/src/include/defines.svh @@ -91,6 +91,7 @@ typedef struct packed { logic MX; logic [1:0] SZ; logic TLBWI; // critical + logic TLBWR; // critical logic TLBR; // critical logic TLBP; // critical } MCtrl1_t; diff --git a/tools/ctrl_maker.py b/tools/ctrl_maker.py index a670c42..1c42741 100644 --- a/tools/ctrl_maker.py +++ b/tools/ctrl_maker.py @@ -1,4 +1,4 @@ -with open('mctrl0.txt') as f: +with open('mctrl1.txt') as f: lines = f.readlines() title = lines[0].split() items = [x.split() for x in lines[1:]] diff --git a/tools/decoder.py b/tools/decoder.py index 2e7b314..6e84445 100644 --- a/tools/decoder.py +++ b/tools/decoder.py @@ -49,6 +49,7 @@ table = [ ('01000000100??????????00000000???', 'MTC0'), ('01000010000000000000000000000001', 'TLBR'), ('01000010000000000000000000000010', 'TLBWI'), + ('01000010000000000000000000000110', 'TLBWR'), ('01000010000000000000000000001000', 'TLBP'), ('01000010000000000000000000011000', 'ERET'), ('011100???????????????00000000010', 'MUL'), diff --git a/tools/mctrl1.txt b/tools/mctrl1.txt index 8bd9818..7a7242d 100644 --- a/tools/mctrl1.txt +++ b/tools/mctrl1.txt @@ -1,62 +1,63 @@ -////-------------------------------- TLBR TLBWI TLBP MR MWR MX -32'b00000000000???????????????000000 0 0 0 0 ? ? // SLL -32'b00000000000???????????????000010 0 0 0 0 ? ? // SRL -32'b00000000000???????????????000011 0 0 0 0 ? ? // SRA -32'b000000???????????????00000000100 0 0 0 0 ? ? // SLLV -32'b000000???????????????00000000110 0 0 0 0 ? ? // SRLV -32'b000000???????????????00000000111 0 0 0 0 ? ? // SRAV -32'b000000?????000000000000000001000 0 0 0 0 ? ? // JR -32'b000000?????00000?????00000001001 0 0 0 0 ? ? // JALR -32'b000000????????????????????001100 0 0 0 0 ? ? // SYSCALL -32'b000000????????????????????001101 0 0 0 0 ? ? // BREAK -32'b0000000000000000?????00000010000 0 0 0 ? ? ? // MFHI -32'b000000?????000000000000000010001 0 0 0 ? ? ? // MTHI -32'b0000000000000000?????00000010010 0 0 0 ? ? ? // MFLO -32'b000000?????000000000000000010011 0 0 0 ? ? ? // MTLO -32'b000000??????????0000000000011000 0 0 0 ? ? ? // MULT -32'b000000??????????0000000000011001 0 0 0 ? ? ? // MULTU -32'b000000??????????0000000000011010 0 0 0 ? ? ? // DIV -32'b000000??????????0000000000011011 0 0 0 ? ? ? // DIVU -32'b000000???????????????00000100000 0 0 0 0 ? ? // ADD -32'b000000???????????????00000100001 0 0 0 0 ? ? // ADDU -32'b000000???????????????00000100010 0 0 0 0 ? ? // SUB -32'b000000???????????????00000100011 0 0 0 0 ? ? // SUBU -32'b000000???????????????00000100100 0 0 0 0 ? ? // AND -32'b000000???????????????00000100101 0 0 0 0 ? ? // OR -32'b000000???????????????00000100110 0 0 0 0 ? ? // XOR -32'b000000???????????????00000100111 0 0 0 0 ? ? // NOR -32'b000000???????????????00000101010 0 0 0 0 ? ? // SLT -32'b000000???????????????00000101011 0 0 0 0 ? ? // SLTU -32'b000001?????00000???????????????? 0 0 0 0 ? ? // BLTZ -32'b000001?????10000???????????????? 0 0 0 0 ? ? // BLTZAL -32'b000001?????00001???????????????? 0 0 0 0 ? ? // BGEZ -32'b000001?????10001???????????????? 0 0 0 0 ? ? // BGEZAL -32'b000010?????????????????????????? 0 0 0 0 ? ? // J -32'b000011?????????????????????????? 0 0 0 0 ? ? // JAL -32'b000100?????????????????????????? 0 0 0 0 ? ? // BEQ -32'b000101?????????????????????????? 0 0 0 0 ? ? // BNE -32'b000110?????00000???????????????? 0 0 0 0 ? ? // BLEZ -32'b000111?????00000???????????????? 0 0 0 0 ? ? // BGTZ -32'b001000?????????????????????????? 0 0 0 0 ? ? // ADDI -32'b001001?????????????????????????? 0 0 0 0 ? ? // ADDIU -32'b001010?????????????????????????? 0 0 0 0 ? ? // SLTI -32'b001011?????????????????????????? 0 0 0 0 ? ? // SLTIU -32'b001100?????????????????????????? 0 0 0 0 ? ? // ANDI -32'b001101?????????????????????????? 0 0 0 0 ? ? // ORI -32'b001110?????????????????????????? 0 0 0 0 ? ? // XORI -32'b00111100000????????????????????? 0 0 0 0 ? ? // LUI -32'b01000000000??????????00000000??? 0 0 0 ? ? ? // MFC0 -32'b01000000100??????????00000000??? 0 0 0 ? ? ? // MTC0 -32'b01000010000000000000000000000001 1 0 0 0 ? ? // TLBR -32'b01000010000000000000000000000010 0 1 0 0 ? ? // TLBWI -32'b01000010000000000000000000001000 0 0 1 0 ? ? // TLBP -32'b01000010000000000000000000011000 0 0 0 0 ? ? // ERET -32'b011100???????????????00000000010 0 0 0 ? ? ? // MUL -32'b100000?????????????????????????? 0 0 0 1 0 1 // LB -32'b100001?????????????????????????? 0 0 0 1 0 1 // LH -32'b100011?????????????????????????? 0 0 0 1 0 1 // LW -32'b100100?????????????????????????? 0 0 0 1 0 0 // LBU -32'b100101?????????????????????????? 0 0 0 1 0 0 // LHU -32'b101000?????????????????????????? 0 0 0 1 1 ? // SB -32'b101001?????????????????????????? 0 0 0 1 1 ? // SH -32'b101011?????????????????????????? 0 0 0 1 1 ? // SW \ No newline at end of file +////-------------------------------- TLBR TLBWI TLBWR TLBP MR MWR MX +32'b00000000000???????????????000000 0 0 0 0 0 ? ? // SLL +32'b00000000000???????????????000010 0 0 0 0 0 ? ? // SRL +32'b00000000000???????????????000011 0 0 0 0 0 ? ? // SRA +32'b000000???????????????00000000100 0 0 0 0 0 ? ? // SLLV +32'b000000???????????????00000000110 0 0 0 0 0 ? ? // SRLV +32'b000000???????????????00000000111 0 0 0 0 0 ? ? // SRAV +32'b000000?????000000000000000001000 0 0 0 0 0 ? ? // JR +32'b000000?????00000?????00000001001 0 0 0 0 0 ? ? // JALR +32'b000000????????????????????001100 0 0 0 0 0 ? ? // SYSCALL +32'b000000????????????????????001101 0 0 0 0 0 ? ? // BREAK +32'b0000000000000000?????00000010000 0 0 0 0 ? ? ? // MFHI +32'b000000?????000000000000000010001 0 0 0 0 ? ? ? // MTHI +32'b0000000000000000?????00000010010 0 0 0 0 ? ? ? // MFLO +32'b000000?????000000000000000010011 0 0 0 0 ? ? ? // MTLO +32'b000000??????????0000000000011000 0 0 0 0 ? ? ? // MULT +32'b000000??????????0000000000011001 0 0 0 0 ? ? ? // MULTU +32'b000000??????????0000000000011010 0 0 0 0 ? ? ? // DIV +32'b000000??????????0000000000011011 0 0 0 0 ? ? ? // DIVU +32'b000000???????????????00000100000 0 0 0 0 0 ? ? // ADD +32'b000000???????????????00000100001 0 0 0 0 0 ? ? // ADDU +32'b000000???????????????00000100010 0 0 0 0 0 ? ? // SUB +32'b000000???????????????00000100011 0 0 0 0 0 ? ? // SUBU +32'b000000???????????????00000100100 0 0 0 0 0 ? ? // AND +32'b000000???????????????00000100101 0 0 0 0 0 ? ? // OR +32'b000000???????????????00000100110 0 0 0 0 0 ? ? // XOR +32'b000000???????????????00000100111 0 0 0 0 0 ? ? // NOR +32'b000000???????????????00000101010 0 0 0 0 0 ? ? // SLT +32'b000000???????????????00000101011 0 0 0 0 0 ? ? // SLTU +32'b000001?????00000???????????????? 0 0 0 0 0 ? ? // BLTZ +32'b000001?????10000???????????????? 0 0 0 0 0 ? ? // BLTZAL +32'b000001?????00001???????????????? 0 0 0 0 0 ? ? // BGEZ +32'b000001?????10001???????????????? 0 0 0 0 0 ? ? // BGEZAL +32'b000010?????????????????????????? 0 0 0 0 0 ? ? // J +32'b000011?????????????????????????? 0 0 0 0 0 ? ? // JAL +32'b000100?????????????????????????? 0 0 0 0 0 ? ? // BEQ +32'b000101?????????????????????????? 0 0 0 0 0 ? ? // BNE +32'b000110?????00000???????????????? 0 0 0 0 0 ? ? // BLEZ +32'b000111?????00000???????????????? 0 0 0 0 0 ? ? // BGTZ +32'b001000?????????????????????????? 0 0 0 0 0 ? ? // ADDI +32'b001001?????????????????????????? 0 0 0 0 0 ? ? // ADDIU +32'b001010?????????????????????????? 0 0 0 0 0 ? ? // SLTI +32'b001011?????????????????????????? 0 0 0 0 0 ? ? // SLTIU +32'b001100?????????????????????????? 0 0 0 0 0 ? ? // ANDI +32'b001101?????????????????????????? 0 0 0 0 0 ? ? // ORI +32'b001110?????????????????????????? 0 0 0 0 0 ? ? // XORI +32'b00111100000????????????????????? 0 0 0 0 0 ? ? // LUI +32'b01000000000??????????00000000??? 0 0 0 0 ? ? ? // MFC0 +32'b01000000100??????????00000000??? 0 0 0 0 ? ? ? // MTC0 +32'b01000010000000000000000000000001 1 0 1 0 0 ? ? // TLBR +32'b01000010000000000000000000000010 0 1 0 0 0 ? ? // TLBWI +32'b01000010000000000000000000000110 0 1 1 0 0 ? ? // TLBWR +32'b01000010000000000000000000001000 0 0 0 1 0 ? ? // TLBP +32'b01000010000000000000000000011000 0 0 0 0 0 ? ? // ERET +32'b011100???????????????00000000010 0 0 0 0 ? ? ? // MUL +32'b100000?????????????????????????? 0 0 0 0 1 0 1 // LB +32'b100001?????????????????????????? 0 0 0 0 1 0 1 // LH +32'b100011?????????????????????????? 0 0 0 0 1 0 1 // LW +32'b100100?????????????????????????? 0 0 0 0 1 0 0 // LBU +32'b100101?????????????????????????? 0 0 0 0 1 0 0 // LHU +32'b101000?????????????????????????? 0 0 0 0 1 1 ? // SB +32'b101001?????????????????????????? 0 0 0 0 1 1 ? // SH +32'b101011?????????????????????????? 0 0 0 0 1 1 ? // SW \ No newline at end of file From c49f7edb4fdf2851781b2d2b3010eefa1f86d099 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Tue, 24 Aug 2021 22:17:01 +0800 Subject: [PATCH 08/56] fix instr_valid for tlbwr --- resources/soc/vivado_xpr/soc_up.xdc | 3 --- src/Core/Gadgets.sv | 1 + 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/resources/soc/vivado_xpr/soc_up.xdc b/resources/soc/vivado_xpr/soc_up.xdc index 5f911f4..d4e156e 100644 --- a/resources/soc/vivado_xpr/soc_up.xdc +++ b/resources/soc/vivado_xpr/soc_up.xdc @@ -197,7 +197,4 @@ set_false_path -from [get_clocks clk_out1_clk_pll_33] -to [get_clocks mtxclk_0] set_false_path -from [get_clocks clk_out1_clk_pll_33] -to [get_clocks mtxclk_0] set_false_path -from [get_clocks -of_objects [get_pins mig_axi/u_mig_axi_32_mig/u_ddr3_infrastructure/gen_mmcm.mmcm_i/CLKFBOUT]] -to [get_clocks -of_objects [get_pins clk_pll_33/inst/plle2_adv_inst/CLKOUT0]] -set_false_path -from [get_clocks -of_objects [get_pins mig_axi/u_mig_axi_32_mig/u_ddr3_infrastructure/gen_mmcm.mmcm_i/CLKFBOUT]] -to [get_clocks -of_objects [get_pins clk_pll_33/inst/plle2_adv_inst/CLKOUT1]] - set_false_path -from [get_clocks -of_objects [get_pins clk_pll_33/inst/plle2_adv_inst/CLKOUT0]] -to [get_clocks -of_objects [get_pins mig_axi/u_mig_axi_32_mig/u_ddr3_infrastructure/gen_mmcm.mmcm_i/CLKFBOUT]] -set_false_path -from [get_clocks -of_objects [get_pins clk_pll_33/inst/plle2_adv_inst/CLKOUT1]] -to [get_clocks -of_objects [get_pins mig_axi/u_mig_axi_32_mig/u_ddr3_infrastructure/gen_mmcm.mmcm_i/CLKFBOUT]] diff --git a/src/Core/Gadgets.sv b/src/Core/Gadgets.sv index 88fee42..46ca425 100644 --- a/src/Core/Gadgets.sv +++ b/src/Core/Gadgets.sv @@ -69,6 +69,7 @@ module instr_valid ( 32'b01000000100??????????00000000???: valid = 1'b1; // MTC0 32'b01000010000000000000000000000001: valid = 1'b1; // TLBR 32'b01000010000000000000000000000010: valid = 1'b1; // TLBWI + 32'b01000010000000000000000000000110: valid = 1'b1; // TLBWR 32'b01000010000000000000000000001000: valid = 1'b1; // TLBP 32'b01000010000000000000000000011000: valid = 1'b1; // ERET 32'b011100???????????????00000000010: valid = 1'b1; // MUL From f1bc4b913cd3e9094be16400ee101ac0d89fa927 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Tue, 24 Aug 2021 23:54:52 +0800 Subject: [PATCH 09/56] fix bug in CP0 IP7 --- src/CP0/CP0.sv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CP0/CP0.sv b/src/CP0/CP0.sv index 920e761..02a5ad8 100644 --- a/src/CP0/CP0.sv +++ b/src/CP0/CP0.sv @@ -53,7 +53,7 @@ module CP0 ( assign rf_cp0.Config.MT = 3'b001; assign rf_cp0.Config.zero1 = 4'b0; assign rf_cp0.Cause.zero1 = 14'b0; - assign rf_cp0.Cause.IP[7:2] = ext_int; + assign rf_cp0.Cause.IP[7:2] = {rf_cp0.Cause.TI | ext_int[5], ext_int[4:0]}; assign rf_cp0.Cause.zero2 = 1'b0; assign rf_cp0.Cause.zero3 = 2'b00; assign rf_cp0.Status.zero1 = 9'b0; From 0cedd8b83b300f88a47f1342062d2c03f5e54a86 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Wed, 25 Aug 2021 11:21:58 +0800 Subject: [PATCH 10/56] add UM bit in CP0 --- src/CP0/CP0.sv | 5 ++++- src/include/CP0.svh | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/CP0/CP0.sv b/src/CP0/CP0.sv index 02a5ad8..f471e17 100644 --- a/src/CP0/CP0.sv +++ b/src/CP0/CP0.sv @@ -58,7 +58,8 @@ module CP0 ( assign rf_cp0.Cause.zero3 = 2'b00; assign rf_cp0.Status.zero1 = 9'b0; assign rf_cp0.Status.zero2 = 6'b0; - assign rf_cp0.Status.zero3 = 6'b0; + assign rf_cp0.Status.zero3 = 3'b0; + assign rf_cp0.Status.zero4 = 2'b0; assign rf_cp0.EntryHi.zero = 5'b0; assign rf_cp0.Wired.zero = 29'b0; assign rf_cp0.EntryLo1.zero = 6'b0; @@ -97,6 +98,7 @@ module CP0 ( rf_cp0.Cause.ExcCode = 5'b0; rf_cp0.Status.Bev = 1'b1; rf_cp0.Status.IM = 8'b0; + rf_cp0.Status.UM = 1'b0; rf_cp0.Status.EXL = 1'b0; rf_cp0.Status.IE = 1'b0; rf_cp0.Compare = 32'hFFFF_FFFF; @@ -156,6 +158,7 @@ module CP0 ( 12: begin rf_cp0.Status.Bev = wdata[22]; rf_cp0.Status.IM = wdata[15:8]; + rf_cp0.Status.UM = wdata[4]; rf_cp0.Status.EXL = wdata[1]; rf_cp0.Status.IE = wdata[0]; end diff --git a/src/include/CP0.svh b/src/include/CP0.svh index 89b8c2c..b5c7e9e 100644 --- a/src/include/CP0.svh +++ b/src/include/CP0.svh @@ -65,7 +65,9 @@ typedef struct packed { logic Bev; logic [5:0] zero2; logic [7:0] IM; - logic [5:0] zero3; + logic [2:0] zero3; + logic UM; + logic [1:0] zero4; logic EXL; logic IE; } CP0_REGS_STATUS_t; From 59302671880ad09b6a0ac4abf7b54a71a1379643 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Wed, 25 Aug 2021 16:18:52 +0800 Subject: [PATCH 11/56] access violation exception (Address Error) --- README.md | 55 ++++++++++++++++++++++++++++ src/CP0/CP0.sv | 7 ++-- src/Core/Datapath.sv | 69 ++++++++++++++++++++--------------- src/MMU/MMU.sv | 27 +++++++++----- src/MMU/TLB.sv | 10 +++++- src/MyCPU.sv | 85 ++++++++++++++++++++++++-------------------- 6 files changed, 175 insertions(+), 78 deletions(-) diff --git a/README.md b/README.md index 787a75d..0bb765d 100644 --- a/README.md +++ b/README.md @@ -26,3 +26,58 @@ Our awesome `MIPS` CPU written in `SystemVerilog` for Loongson Cup │ └── testbench <-- 测试脚本 └── tools <-- controller生成器 ``` + +## TODO & Notice + +- [ ] 特权模式 + - [x] `CP0`寄存器`Status.UM` :heavy_check_mark: + - [ ] 访存异常(考虑`in_kernel`状态切换带来的冒险) :hourglass: + - [ ] 特权指令异常 :clock3: +- [ ] 浮点运算单元 + - [ ] ~~做一个真的`FPU`~~ :x: + - [ ] 浮点运算指令报`Coprocessor Unusable`,同时`CP0`中新增`Cause.CE` :clock3: +- [ ] 新增指令 + +| Status | Instruction | Type | Tier | Comment | +| :------: | :---------: | :------: | :--: | :-------------------------------------- | +| :clock3: | `Cache` | `SYS` | 3 | | +| :clock3: | `PREF` | `SYS` | 1 | Treat as `NOP` | +| :clock3: | `SYNC` | `SYS` | 1 | Treat as `NOP` (We're strongly ordered) | +| :clock3: | `WAIT` | `SYS` | 3 | | +| :clock3: | `TEQ` | `SYS` | 2 | | +| :clock3: | `TEQI` | `SYS` | 2 | | +| :clock3: | `TGE` | `SYS` | 2 | | +| :clock3: | `TGEI` | `SYS` | 2 | | +| :clock3: | `TGEIU` | `SYS` | 2 | | +| :clock3: | `TGEU` | `SYS` | 2 | | +| :clock3: | `TLT` | `SYS` | 2 | | +| :clock3: | `TLTI` | `SYS` | 2 | | +| :clock3: | `TLTIU` | `SYS` | 2 | | +| :clock3: | `TLTU` | `SYS` | 2 | | +| :clock3: | `TNE` | `SYS` | 2 | | +| :clock3: | `TNEI` | `SYS` | 2 | | +| :clock3: | `CLO` | `ARITH` | 2 | `RT == RD` | +| :clock3: | `CLZ` | `ARITH` | 2 | `RT == RD` | +| :clock3: | `MADD` | `ARITH` | 2 | | +| :clock3: | `MADDU` | `ARITH` | 2 | | +| :clock3: | `MSUB` | `ARITH` | 2 | | +| :clock3: | `MSUBU` | `ARITH` | 2 | | +| :clock3: | `MOVN` | `ARITH` | 1 | | +| :clock3: | `MOVZ` | `ARITH` | 1 | | +| :clock3: | `LL` | `MEM` | 3 | | +| :clock3: | `LWL` | `MEM` | 1 | | +| :clock3: | `LWR` | `MEM` | 1 | | +| :clock3: | `SC` | `MEM` | 3 | | +| :clock3: | `SWL` | `MEM` | 1 | | +| :clock3: | `SWR` | `MEM` | 1 | | +| :clock3: | `MOVF` | `FP` | 2 | | +| :clock3: | `MOVT` | `FP` | 2 | | +| :clock3: | `BEQL` | `BRANCH` | 3 | | +| :clock3: | `BGEZALL` | `BRANCH` | 3 | | +| :clock3: | `BGEZL` | `BRANCH` | 3 | | +| :clock3: | `BGTZL` | `BRANCH` | 3 | | +| :clock3: | `BLEZL` | `BRANCH` | 3 | | +| :clock3: | `BLTZALL` | `BRANCH` | 3 | | +| :clock3: | `BLTZL` | `BRANCH` | 3 | | +| :clock3: | `BNEL` | `BRANCH` | 3 | | + diff --git a/src/CP0/CP0.sv b/src/CP0/CP0.sv index f471e17..bfe4991 100644 --- a/src/CP0/CP0.sv +++ b/src/CP0/CP0.sv @@ -17,13 +17,14 @@ module CP0 ( output logic [19:0] EBase, // int - input logic [5:0] ext_int, - output logic interrupt, + input logic [5:0] ext_int, + output logic interrupt, // MMU input logic tlbr, input logic tlbp, output logic [2:0] K0, + output logic in_kernel, output Random_t Random, output Index_t Index, output EntryHi_t EntryHi, @@ -302,4 +303,6 @@ module CP0 ( assign EntryLo1 = rf_cp0.EntryLo1; assign EntryLo0 = rf_cp0.EntryLo0; + assign in_kernel = ~rf_cp0.Status.UM | rf_cp0.Status.EXL; // currently no ERL + endmodule diff --git a/src/Core/Datapath.sv b/src/Core/Datapath.sv index 44d0b58..807a4d3 100644 --- a/src/Core/Datapath.sv +++ b/src/Core/Datapath.sv @@ -1,3 +1,4 @@ +`include "defines.svh" `include "sram.svh" `include "CP0.svh" @@ -10,9 +11,11 @@ module Datapath ( sram_i.master mem_i, input logic iTLBRefill, input logic iTLBInvalid, + input logic iAddressError, input logic dTLBRefill, input logic dTLBInvalid, input logic dTLBModified, + input logic dAddressError, output logic tlb_tlbwi, output logic tlb_tlbwr, output logic tlb_tlbp, @@ -74,8 +77,10 @@ module Datapath ( logic IQ_IA_TLBRefill; logic IQ_IA_TLBInvalid; + logic IQ_IA_AddressError; logic IQ_IB_TLBRefill; logic IQ_IB_TLBInvalid; + logic IQ_IB_AddressError; logic [3:0] IQ_valids; @@ -121,8 +126,10 @@ module Datapath ( logic D_IA_TLBRefill; logic D_IA_TLBInvalid; + logic D_IA_AddressError; logic D_IB_TLBRefill; logic D_IB_TLBInvalid; + logic D_IB_AddressError; logic D_IA_Hazard; logic D_IB_Hazard; @@ -305,29 +312,30 @@ module Datapath ( assign F.en = PF.pc[1:0] != 2'b00 & D_IA_can_dispatch | fetch_i.req & fetch_i.addr_ok; - assign F.ExcValid = F.pc[1:0] != 2'b00 | iTLBRefill | iTLBInvalid; + assign F.ExcValid = F.pc[1:0] != 2'b00 | iTLBRefill | iTLBInvalid | iAddressError; //---------------------------------------------------------------------------// // Instr Queue // //---------------------------------------------------------------------------// - Queue #(66) InstrQueue ( + Queue #(67) InstrQueue ( .clk(clk), .rst(rst | rstD | rstM), .vinA(fetch_i.data_ok | F.ExcValid), - .inA ({F.pc[2] ? fetch_i.rdata1 : fetch_i.rdata0, F.pc, iTLBRefill, iTLBInvalid}), + .inA ({F.pc[2] ? fetch_i.rdata1 : fetch_i.rdata0, F.pc, + iTLBRefill, iTLBInvalid, iAddressError}), .vinB(fetch_i.data_ok & ~F.pc[2]), - .inB ({fetch_i.rdata1, F.pc[31:3], 3'b100, 2'b00}), + .inB ({fetch_i.rdata1, F.pc[31:3], 3'b100, 3'b00}), .enA (D.en0), .voutA(IQ_IA_valid), - .outA ({IQ_IA_inst, IQ_IA_pc, IQ_IA_TLBRefill, IQ_IA_TLBInvalid}), + .outA ({IQ_IA_inst, IQ_IA_pc, IQ_IA_TLBRefill, IQ_IA_TLBInvalid, IQ_IA_AddressError}), .enB (D.en1), .voutB(IQ_IB_valid), - .outB ({IQ_IB_inst, IQ_IB_pc, IQ_IB_TLBRefill, IQ_IB_TLBInvalid}), + .outB ({IQ_IB_inst, IQ_IB_pc, IQ_IB_TLBRefill, IQ_IB_TLBInvalid, IQ_IB_AddressError}), .valids(IQ_valids) ); @@ -337,19 +345,21 @@ module Datapath ( //---------------------------------------------------------------------------// // D.FF - ffenr #(1 + 32 + 32 + 2) D_IA_ff ( + ffenr #(1 + 32 + 32 + 3) D_IA_ff ( clk, rst | rstM, - D.en1 ? {IQ_IA_valid & ~rstD, IQ_IA_pc, IQ_IA_inst, IQ_IA_TLBRefill, IQ_IA_TLBInvalid} : {D_IB_valid, D.IB_pc, D.IB_inst, D_IB_TLBRefill, D_IB_TLBInvalid}, + D.en1 ? {IQ_IA_valid & ~rstD, IQ_IA_pc, IQ_IA_inst, IQ_IA_TLBRefill, IQ_IA_TLBInvalid, IQ_IA_AddressError} + : {D_IB_valid, D.IB_pc, D.IB_inst, D_IB_TLBRefill, D_IB_TLBInvalid, D_IB_AddressError}, ~D_IA_valid | D_go & E.en, - {D_IA_valid, D.IA_pc, D.IA_inst, D_IA_TLBRefill, D_IA_TLBInvalid} + {D_IA_valid, D.IA_pc, D.IA_inst, D_IA_TLBRefill, D_IA_TLBInvalid, D_IA_AddressError} ); - ffenr #(1 + 32 + 32 + 2) D_IB_ff ( + ffenr #(1 + 32 + 32 + 3) D_IB_ff ( clk, rst | rstM, - D.en1 ? {IQ_IB_valid & ~rstD, IQ_IB_pc, IQ_IB_inst, IQ_IB_TLBRefill, IQ_IB_TLBInvalid} : {IQ_IA_valid & ~rstD, IQ_IA_pc, IQ_IA_inst, IQ_IA_TLBRefill, IQ_IA_TLBInvalid}, + D.en1 ? {IQ_IB_valid & ~rstD, IQ_IB_pc, IQ_IB_inst, IQ_IB_TLBRefill, IQ_IB_TLBInvalid, IQ_IB_AddressError} + : {IQ_IA_valid & ~rstD, IQ_IA_pc, IQ_IA_inst, IQ_IA_TLBRefill, IQ_IA_TLBInvalid, IQ_IA_AddressError}, D.en0, - {D_IB_valid, D.IB_pc, D.IB_inst, D_IB_TLBRefill, D_IB_TLBInvalid} + {D_IB_valid, D.IB_pc, D.IB_inst, D_IB_TLBRefill, D_IB_TLBInvalid, D_IB_AddressError} ); ffenr #(1) D_IA_Delay_ff ( @@ -425,25 +435,28 @@ module Datapath ( D_IB_iv ); - assign D.IA_ExcValid = D_IA_valid & (D.IA_pc[1:0] != 2'b00 | D_IA_TLBRefill | D_IA_TLBInvalid | ~D_IA_iv | D.IA.SYSCALL | D.IA.BREAK | D.IA.ERET); - assign D.IA_ERET = D_IA_valid & D.IA_pc[1:0] == 2'b00 & ~D_IA_TLBRefill & ~D_IA_TLBInvalid & D_IA_iv & D.IA.ERET; + // TODO: Merge "pc[1:0] != 2'b00" into AddressError + assign D.IA_ExcValid = D_IA_valid & (D.IA_pc[1:0] != 2'b00 | D_IA_TLBRefill | D_IA_TLBInvalid | D_IA_AddressError | ~D_IA_iv | D.IA.SYSCALL | D.IA.BREAK | D.IA.ERET); + assign D.IA_ERET = D_IA_valid & D.IA_pc[1:0] == 2'b00 & ~D_IA_TLBRefill & ~D_IA_TLBInvalid & ~D_IA_AddressError & D_IA_iv & D.IA.ERET; assign D.IA_REFILL = D_IA_valid & D.IB_pc[1:0] == 2'b00 & D_IA_TLBRefill; - assign D.IA_ExcCode = D.IA_pc[1:0] != 2'b00 ? `EXCCODE_ADEL - : D_IA_TLBRefill ? `EXCCODE_TLBL - : D_IA_TLBInvalid ? `EXCCODE_TLBL - : ~D_IA_iv ? `EXCCODE_RI - : D.IA_inst[0] ? `EXCCODE_BP : `EXCCODE_SYS; + assign D.IA_ExcCode = D.IA_pc[1:0] != 2'b00 | D_IA_AddressError ? `EXCCODE_ADEL + : D_IA_TLBRefill ? `EXCCODE_TLBL + : D_IA_TLBInvalid ? `EXCCODE_TLBL + : ~D_IA_iv ? `EXCCODE_RI + : D.IA_inst[0] ? `EXCCODE_BP + : `EXCCODE_SYS; - assign D.IB_ExcValid = D_IB_valid & (D.IB_pc[1:0] != 2'b00 | D_IB_TLBRefill | D_IB_TLBInvalid | ~D_IB_iv | D.IB.SYSCALL | D.IB.BREAK | D.IB.ERET | D.IB_Delay & D.IB.BJRJ); - assign D.IB_ERET = D_IB_valid & D.IB_pc[1:0] == 2'b00 & ~D_IB_TLBRefill & ~D_IB_TLBInvalid & D_IB_iv & D.IB.ERET & ~D.IB_Delay; + assign D.IB_ExcValid = D_IB_valid & (D.IB_pc[1:0] != 2'b00 | D_IB_TLBRefill | D_IB_TLBInvalid | D_IB_AddressError | ~D_IB_iv | D.IB.SYSCALL | D.IB.BREAK | D.IB.ERET | D.IB_Delay & D.IB.BJRJ); + assign D.IB_ERET = D_IB_valid & D.IB_pc[1:0] == 2'b00 & ~D_IB_TLBRefill & ~D_IB_TLBInvalid & ~D_IB_AddressError & D_IB_iv & D.IB.ERET & ~D.IB_Delay; assign D.IB_REFILL = D_IB_valid & D.IB_pc[1:0] == 2'b00 & D_IB_TLBRefill; - assign D.IB_ExcCode = D.IB_pc[1:0] != 2'b00 ? `EXCCODE_ADEL - : D_IB_TLBRefill ? `EXCCODE_TLBL - : D_IB_TLBInvalid ? `EXCCODE_TLBL - : ~D_IB_iv ? `EXCCODE_RI - : D.IB.ERET ? `EXCCODE_RI - : D.IB_Delay & D.IB.BJRJ ? `EXCCODE_RI - : D.IB_inst[0] ? `EXCCODE_BP : `EXCCODE_SYS; + assign D.IB_ExcCode = D.IB_pc[1:0] != 2'b00 | D_IB_AddressError ? `EXCCODE_ADEL + : D_IB_TLBRefill ? `EXCCODE_TLBL + : D_IB_TLBInvalid ? `EXCCODE_TLBL + : ~D_IB_iv ? `EXCCODE_RI + : D.IB.ERET ? `EXCCODE_RI + : D.IB_Delay & D.IB.BJRJ ? `EXCCODE_RI + : D.IB_inst[0] ? `EXCCODE_BP + : `EXCCODE_SYS; assign D.IB_Delay = D.IA.BJRJ; // D.Dispatch diff --git a/src/MMU/MMU.sv b/src/MMU/MMU.sv index d49068f..f2e8312 100644 --- a/src/MMU/MMU.sv +++ b/src/MMU/MMU.sv @@ -21,6 +21,7 @@ module MMU ( // CP0 input logic [2:0] K0, + input logic in_kernel, input logic tlbwi, // TLBWI -> Write TLB input logic tlbwr, // TLBWR -> Write TLB input logic tlbp, // TLBP -> Write CP0 Index @@ -39,9 +40,11 @@ module MMU ( // Exceptions output logic iTLBRefill, output logic iTLBInvalid, + output logic iAddressError, output logic dTLBRefill, output logic dTLBInvalid, - output logic dTLBModified + output logic dTLBModified, + output logic dAddressError ); // ====================== @@ -99,6 +102,7 @@ module MMU ( logic iCached1, iCached2; logic iMValid1; logic iValid1; + logic iUser1; word_t iPA1, iPA2; word_t iD1, iD2, iD3, iD4, iD5, iD6, iD7; @@ -253,7 +257,7 @@ module MMU ( // =============================== assign iVA = inst.addr; - assign iValid1 = iReq1 & iHit1 & iMValid1; + assign iValid1 = iReq1 & iHit1 & iMValid1 & (in_kernel | ~iUser1); assign inst.addr_ok = iEn; mux5 #(64) inst_rdata_mux ( @@ -285,8 +289,9 @@ module MMU ( assign inst_axi.len = (iEn2 ? iCached1 : iCached2) ? 4'b0111 : 4'b0001; assign inst_axi.size = 3'b010; - assign iTLBRefill = (iState == I_IDLE) & iReq1 & ~iHit1; - assign iTLBInvalid = (iState == I_IDLE) & iReq1 & ~iMValid1; + assign iTLBRefill = (iState == I_IDLE) & iReq1 & ~iHit1; + assign iTLBInvalid = (iState == I_IDLE) & iReq1 & ~iMValid1; + assign iAddressError = (iState == I_IDLE) & iReq1 & ~in_kernel & iUser1; // ====================== // ======== dVar ======== @@ -301,6 +306,7 @@ module MMU ( logic dDirty1; logic dMValid1; logic dValid1; + logic dUser1; word_t dPA1, dPA2; logic [1:0] dSize1; @@ -445,11 +451,12 @@ module MMU ( // ================================ assign dVA = data.addr; - assign dValid1 = dReq1 & dHit1 & dMValid1 & (~data.wr | dDirty1); + assign dValid1 = dReq1 & dHit1 & dMValid1 & (~data.wr | dDirty1) & (in_kernel | ~dUser1); - assign dTLBRefill = (drState == DR_IDLE) & dReq1 & ~dHit1; - assign dTLBInvalid = (drState == DR_IDLE) & dReq1 & ~dMValid1; - assign dTLBModified = (drState == DR_IDLE) & dReq1 & data.wr & ~dDirty1; + assign dTLBRefill = (drState == DR_IDLE) & dReq1 & ~dHit1; + assign dTLBInvalid = (drState == DR_IDLE) & dReq1 & ~dMValid1; + assign dTLBModified = (drState == DR_IDLE) & dReq1 & data.wr & ~dDirty1; + assign dAddressError = (drState == DR_IDLE) & dReq1 & ~in_kernel & dUser1; // ============================= // ======== drFlip-Flop ======== @@ -713,13 +720,15 @@ module MMU ( .iHit (iHit1), .iCached(iCached1), .iValid (iMValid1), + .iUser (iUser1), .dVAddr (dVA), .dPAddr (dPA1), .dHit (dHit1), .dCached(dCached1), .dDirty (dDirty1), - .dValid (dMValid1) + .dValid (dMValid1), + .dUser (dUser1) ); endmodule diff --git a/src/MMU/TLB.sv b/src/MMU/TLB.sv index dc5e696..4e0d349 100644 --- a/src/MMU/TLB.sv +++ b/src/MMU/TLB.sv @@ -28,13 +28,15 @@ module TLB ( output logic iHit, // TLB Refill output logic iCached, output logic iValid, // TLB Invalid + output logic iUser, // Privilege input word_t dVAddr, output word_t dPAddr, output logic dHit, // TLB Refill output logic dCached, output logic dDirty, // TLB Modified - output logic dValid // TLB Invalid + output logic dValid, // TLB Invalid + output logic dUser // Privilege ); word_t fVAddr, fVAddr1; @@ -143,18 +145,21 @@ module TLB ( iHit = fHit1; iCached = fCached1; iValid = fValid1; + iUser = ~fVAddr1[31]; end else if (fVAddr1 > 32'h9FFF_FFFF) begin // kseg1 uncached iPAddr = fVAddr1 & 32'h1FFF_FFFF; iHit = 1'b1; iCached = 1'b0; iValid = 1'b1; + iUser = 1'b0; end else begin // kseg0 -> CP0.K0 iPAddr = fVAddr1 & 32'h1FFF_FFFF; iHit = 1'b1; iCached = K0[0]; iValid = 1'b1; + iUser = 1'b0; end end @@ -172,6 +177,7 @@ module TLB ( dCached = mCached1; dDirty = mDirty1; dValid = mValid1; + dUser = ~mVAddr1[31]; end else if (mVAddr1 > 32'h9FFF_FFFF) begin // kseg1 uncached dPAddr = mVAddr1 & 32'h1FFF_FFFF; @@ -179,6 +185,7 @@ module TLB ( dCached = 1'b0; dDirty = 1'b1; dValid = 1'b1; + dUser = 1'b0; end else begin // kseg0 -> CP0.K0 dPAddr = mVAddr1 & 32'h1FFF_FFFF; @@ -186,6 +193,7 @@ module TLB ( dCached = K0[0]; dDirty = 1'b1; dValid = 1'b1; + dUser = 1'b0; end end diff --git a/src/MyCPU.sv b/src/MyCPU.sv index 12b839e..be4e5fb 100644 --- a/src/MyCPU.sv +++ b/src/MyCPU.sv @@ -90,7 +90,8 @@ module mycpu_top ( word_t C0_ERETPC; logic C0_Bev; logic [19:0] C0_EBase; - logic [2:0] K0; + logic [2:0] K0; + logic in_kernel; Random_t c0_Random; Index_t c0_Index; EntryHi_t c0_EntryHi; @@ -105,9 +106,11 @@ module mycpu_top ( logic iTLBRefill; logic iTLBInvalid; + logic iAddressError; logic dTLBRefill; logic dTLBInvalid; logic dTLBModified; + logic dAddressError; logic tlb_tlbwi; logic tlb_tlbwr; logic tlb_tlbp; @@ -126,35 +129,38 @@ module mycpu_top ( ); MMU mmu ( - .clk (aclk), - .rst (~aresetn), - .ic (icache.mmu), - .dc (dcache.mmu), - .inst (inst.slave), - .data (data.slave), - .inst_axi (inst_axi.master), - .rdata_axi (rdata_axi.master), - .wdata_axi (wdata_axi.master), - .K0 (K0), - .tlbwi (tlb_tlbwi), - .tlbwr (tlb_tlbwr), - .tlbp (tlb_tlbp), - .c0_Random (c0_Random), - .c0_Index (c0_Index), - .c0_EntryHi (c0_EntryHi), + .clk (aclk), + .rst (~aresetn), + .ic (icache.mmu), + .dc (dcache.mmu), + .inst (inst.slave), + .data (data.slave), + .inst_axi (inst_axi.master), + .rdata_axi (rdata_axi.master), + .wdata_axi (wdata_axi.master), + .K0 (K0), + .in_kernel (in_kernel), + .tlbwi (tlb_tlbwi), + .tlbwr (tlb_tlbwr), + .tlbp (tlb_tlbp), + .c0_Random (c0_Random), + .c0_Index (c0_Index), + .c0_EntryHi (c0_EntryHi), // .c0_PageMask (c0_PageMask), - .c0_EntryLo1 (c0_EntryLo1), - .c0_EntryLo0 (c0_EntryLo0), - .EntryHi (tlb_EntryHi), + .c0_EntryLo1 (c0_EntryLo1), + .c0_EntryLo0 (c0_EntryLo0), + .EntryHi (tlb_EntryHi), // .PageMask (tlb_PageMask), - .EntryLo1 (tlb_EntryLo1), - .EntryLo0 (tlb_EntryLo0), - .Index (tlb_Index), - .iTLBRefill (iTLBRefill), - .iTLBInvalid (iTLBInvalid), - .dTLBRefill (dTLBRefill), - .dTLBInvalid (dTLBInvalid), - .dTLBModified(dTLBModified) + .EntryLo1 (tlb_EntryLo1), + .EntryLo0 (tlb_EntryLo0), + .Index (tlb_Index), + .iTLBRefill (iTLBRefill), + .iTLBInvalid (iTLBInvalid), + .iAddressError(iAddressError), + .dTLBRefill (dTLBRefill), + .dTLBInvalid (dTLBInvalid), + .dTLBModified (dTLBModified), + .dAddressError(dAddressError) ); ICache ICache ( @@ -186,6 +192,7 @@ module mycpu_top ( .tlbr (c0_tlbr), .tlbp (c0_tlbp), .K0 (K0), + .in_kernel (in_kernel), .Random (c0_Random), .Index (c0_Index), .EntryHi (c0_EntryHi), @@ -205,16 +212,18 @@ module mycpu_top ( .fetch_i(inst.master), .mem_i (data.master), - .iTLBRefill (iTLBRefill), - .iTLBInvalid (iTLBInvalid), - .dTLBRefill (dTLBRefill), - .dTLBInvalid (dTLBInvalid), - .dTLBModified(dTLBModified), - .tlb_tlbwi (tlb_tlbwi), - .tlb_tlbwr (tlb_tlbwr), - .tlb_tlbp (tlb_tlbp), - .c0_tlbr (c0_tlbr), - .c0_tlbp (c0_tlbp), + .iTLBRefill (iTLBRefill), + .iTLBInvalid (iTLBInvalid), + .iAddressError(iAddressError), + .dTLBRefill (dTLBRefill), + .dTLBInvalid (dTLBInvalid), + .dTLBModified (dTLBModified), + .dAddressError(dAddressError), + .tlb_tlbwi (tlb_tlbwi), + .tlb_tlbwr (tlb_tlbwr), + .tlb_tlbp (tlb_tlbp), + .c0_tlbr (c0_tlbr), + .c0_tlbp (c0_tlbp), .C0_int (C0_int), .C0_addr (C0_addr), From 7241f834070bb0edc68b4e69fa67e46de01018ae Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Wed, 25 Aug 2021 17:20:51 +0800 Subject: [PATCH 12/56] 1. fix bug in address error detection 2. add LS address error handler --- src/Core/Datapath.sv | 10 ++++++---- src/MMU/MMU.sv | 8 ++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/Core/Datapath.sv b/src/Core/Datapath.sv index 807a4d3..63983df 100644 --- a/src/Core/Datapath.sv +++ b/src/Core/Datapath.sv @@ -197,6 +197,7 @@ module Datapath ( logic dTLBRefillB; logic dTLBInvalidB; logic dTLBModifiedB; + logic dAddressErrorB; EXCEPTION_t M_exception; logic M_exception_REFILL; @@ -1064,16 +1065,17 @@ module Datapath ( 1'b1, dTLBExcValid ); - buffer0 #(3) dTLBExc_buffer ( + buffer0 #(4) dExc_buffer ( clk, rst, - {dTLBRefill, dTLBInvalid, dTLBModified}, + {dTLBRefill, dTLBInvalid, dTLBModified, dAddressError}, dTLBExcValid, - {dTLBRefillB, dTLBInvalidB, dTLBModifiedB} + {dTLBRefillB, dTLBInvalidB, dTLBModifiedB, dAddressErrorB} ); - assign M_I1_NowExcValid = dTLBRefillB | dTLBInvalidB | dTLBModifiedB; + assign M_I1_NowExcValid = dTLBRefillB | dTLBInvalidB | dTLBModifiedB | dAddressErrorB; assign M.I1.ExcValid = M_I1_PrevExcValid | M_I1_NowExcValid; assign M.I1.REFILL = M_I1_PrevREFILL | dTLBRefillB; assign M.I1.ExcCode = M_I1_PrevExcValid ? M_I1_PrevExcCode + : dAddressErrorB ? `EXCCODE_ADEL : dTLBRefillB ? M.I1.MCtrl.MWR ? `EXCCODE_TLBS : `EXCCODE_TLBL : dTLBInvalidB ? M.I1.MCtrl.MWR ? `EXCCODE_TLBS : `EXCCODE_TLBL : `EXCCODE_MOD; diff --git a/src/MMU/MMU.sv b/src/MMU/MMU.sv index f2e8312..ead272c 100644 --- a/src/MMU/MMU.sv +++ b/src/MMU/MMU.sv @@ -257,7 +257,7 @@ module MMU ( // =============================== assign iVA = inst.addr; - assign iValid1 = iReq1 & iHit1 & iMValid1 & (in_kernel | ~iUser1); + assign iValid1 = iReq1 & iHit1 & iMValid1 & (in_kernel | iUser1); assign inst.addr_ok = iEn; mux5 #(64) inst_rdata_mux ( @@ -291,7 +291,7 @@ module MMU ( assign iTLBRefill = (iState == I_IDLE) & iReq1 & ~iHit1; assign iTLBInvalid = (iState == I_IDLE) & iReq1 & ~iMValid1; - assign iAddressError = (iState == I_IDLE) & iReq1 & ~in_kernel & iUser1; + assign iAddressError = (iState == I_IDLE) & iReq1 & ~in_kernel & ~iUser1; // ====================== // ======== dVar ======== @@ -451,12 +451,12 @@ module MMU ( // ================================ assign dVA = data.addr; - assign dValid1 = dReq1 & dHit1 & dMValid1 & (~data.wr | dDirty1) & (in_kernel | ~dUser1); + assign dValid1 = dReq1 & dHit1 & dMValid1 & (~data.wr | dDirty1) & (in_kernel | dUser1); assign dTLBRefill = (drState == DR_IDLE) & dReq1 & ~dHit1; assign dTLBInvalid = (drState == DR_IDLE) & dReq1 & ~dMValid1; assign dTLBModified = (drState == DR_IDLE) & dReq1 & data.wr & ~dDirty1; - assign dAddressError = (drState == DR_IDLE) & dReq1 & ~in_kernel & dUser1; + assign dAddressError = (drState == DR_IDLE) & dReq1 & ~in_kernel & ~dUser1; // ============================= // ======== drFlip-Flop ======== From 8d039f432777ae1e7dab57c84d254f1a07e62953 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Wed, 25 Aug 2021 20:59:32 +0800 Subject: [PATCH 13/56] handle CpU exception --- README.md | 4 +-- src/Core/Controller.sv | 15 +++++----- src/Core/Datapath.sv | 28 +++++++++++++----- src/MyCPU.sv | 1 + src/include/defines.svh | 4 +++ tools/ctrl_maker.py | 2 +- tools/decoder.py | 1 + tools/exc.txt | 10 +++++++ tools/privilege.txt | 63 +++++++++++++++++++++++++++++++++++++++++ 9 files changed, 111 insertions(+), 17 deletions(-) create mode 100644 tools/exc.txt create mode 100644 tools/privilege.txt diff --git a/README.md b/README.md index 0bb765d..50ec979 100644 --- a/README.md +++ b/README.md @@ -31,8 +31,8 @@ Our awesome `MIPS` CPU written in `SystemVerilog` for Loongson Cup - [ ] 特权模式 - [x] `CP0`寄存器`Status.UM` :heavy_check_mark: - - [ ] 访存异常(考虑`in_kernel`状态切换带来的冒险) :hourglass: - - [ ] 特权指令异常 :clock3: + - [x] 访存异常(考虑`in_kernel`状态切换带来的冒险) :heavy_check_mark: + - [ ] 特权指令异常 :hourglass: - [ ] 浮点运算单元 - [ ] ~~做一个真的`FPU`~~ :x: - [ ] 浮点运算指令报`Coprocessor Unusable`,同时`CP0`中新增`Cause.CE` :clock3: diff --git a/src/Core/Controller.sv b/src/Core/Controller.sv index c4f6768..d672375 100644 --- a/src/Core/Controller.sv +++ b/src/Core/Controller.sv @@ -29,15 +29,16 @@ module Controller ( ); assign ctrl.BJRJ = ~inst[29] & (~inst[31] & (~inst[30] & ~inst[5] & ~inst[4] & inst[3] & ~inst[2] | inst[28] | inst[26]) | inst[27] & ~inst[26]); - assign ctrl.B = ~inst[31] & ~inst[29] & (inst[28] | ~inst[27] & inst[26]); - assign ctrl.JR = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & ~inst[4] & inst[3] & ~inst[2]; - assign ctrl.J = ~inst[31] & ~inst[29] & ~inst[28] & inst[27]; - assign ctrl.BGO = ~inst[26] & (eq | inst[27] & ltz) | inst[26] & (~inst[27] & (~inst[28] & (inst[16] & ~ltz | ~inst[16] & ltz) | inst[28] & ~eq) | inst[27] & ~eq & ~ltz); + assign ctrl.B = ~inst[31] & ~inst[29] & (inst[28] | ~inst[27] & inst[26]); + assign ctrl.JR = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & ~inst[4] & inst[3] & ~inst[2]; + assign ctrl.J = ~inst[31] & ~inst[29] & ~inst[28] & inst[27]; + assign ctrl.BGO = ~inst[26] & (eq | inst[27] & ltz) | inst[26] & (~inst[27] & (~inst[28] & (inst[16] & ~ltz | ~inst[16] & ltz) | inst[28] & ~eq) | inst[27] & ~eq & ~ltz); + assign ctrl.PRV = inst[30] & ~inst[29]; assign ctrl.SYSCALL = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[3] & inst[2] & ~inst[0]; - assign ctrl.BREAK = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[3] & inst[2] & inst[0]; - assign ctrl.ERET = inst[30] & inst[4]; - assign ctrl.OFA = ~inst[31] & ~inst[28] & ~inst[27] & ~inst[26] & (~inst[30] & inst[5] & ~inst[3] & ~inst[2] & ~inst[0] | inst[29]); + assign ctrl.BREAK = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[3] & inst[2] & inst[0]; + assign ctrl.ERET = inst[30] & inst[4]; + assign ctrl.OFA = ~inst[31] & ~inst[28] & ~inst[27] & ~inst[26] & (~inst[30] & inst[5] & ~inst[3] & ~inst[2] & ~inst[0] | inst[29]); assign ctrl.ES = inst[31] | ~inst[30] & ~inst[28] & ~inst[27] & ~inst[26] & (inst[5] | inst[4] & inst[3] & ~inst[2] | ~inst[3] & inst[2]) | inst[29];; assign ctrl.ET = ~inst[31] & ~inst[27] & ~inst[26] & (~inst[30] & ~inst[29] & ~inst[28] & (inst[5] | (~inst[1] & (~inst[4] & ~inst[3] & ~inst[0] | inst[4] & inst[3]) | inst[1] & (~inst[4] | inst[3]))) | inst[30] & inst[29]); diff --git a/src/Core/Datapath.sv b/src/Core/Datapath.sv index 63983df..fa984d6 100644 --- a/src/Core/Datapath.sv +++ b/src/Core/Datapath.sv @@ -33,6 +33,7 @@ module Datapath ( input word_t C0_ERETPC, input logic C0_Bev, input logic [19:0] C0_EBase, + input logic C0_kernel, //debug interface output wire [31:0] debug_wb_pc, @@ -324,7 +325,7 @@ module Datapath ( .rst(rst | rstD | rstM), .vinA(fetch_i.data_ok | F.ExcValid), - .inA ({F.pc[2] ? fetch_i.rdata1 : fetch_i.rdata0, F.pc, + .inA ({F.pc[2] ? fetch_i.rdata1 : fetch_i.rdata0, F.pc, iTLBRefill, iTLBInvalid, iAddressError}), .vinB(fetch_i.data_ok & ~F.pc[2]), @@ -437,17 +438,29 @@ module Datapath ( ); // TODO: Merge "pc[1:0] != 2'b00" into AddressError - assign D.IA_ExcValid = D_IA_valid & (D.IA_pc[1:0] != 2'b00 | D_IA_TLBRefill | D_IA_TLBInvalid | D_IA_AddressError | ~D_IA_iv | D.IA.SYSCALL | D.IA.BREAK | D.IA.ERET); + assign D.IA_ExcValid = D_IA_valid & ( D.IA_pc[1:0] != 2'b00 + | ~D_IA_iv + | D_IA_TLBRefill | D_IA_TLBInvalid + | D_IA_AddressError + | D.IA.SYSCALL | D.IA.BREAK | D.IA.ERET + | D.IA.PRV & ~C0_kernel); assign D.IA_ERET = D_IA_valid & D.IA_pc[1:0] == 2'b00 & ~D_IA_TLBRefill & ~D_IA_TLBInvalid & ~D_IA_AddressError & D_IA_iv & D.IA.ERET; assign D.IA_REFILL = D_IA_valid & D.IB_pc[1:0] == 2'b00 & D_IA_TLBRefill; assign D.IA_ExcCode = D.IA_pc[1:0] != 2'b00 | D_IA_AddressError ? `EXCCODE_ADEL : D_IA_TLBRefill ? `EXCCODE_TLBL : D_IA_TLBInvalid ? `EXCCODE_TLBL : ~D_IA_iv ? `EXCCODE_RI - : D.IA_inst[0] ? `EXCCODE_BP - : `EXCCODE_SYS; + : ~D.IA_inst[30] & D.IA_inst[0] ? `EXCCODE_BP + : ~D.IA_inst[30] & ~D.IA_inst[0] ? `EXCCODE_SYS + : `EXCCODE_CPU; - assign D.IB_ExcValid = D_IB_valid & (D.IB_pc[1:0] != 2'b00 | D_IB_TLBRefill | D_IB_TLBInvalid | D_IB_AddressError | ~D_IB_iv | D.IB.SYSCALL | D.IB.BREAK | D.IB.ERET | D.IB_Delay & D.IB.BJRJ); + assign D.IB_ExcValid = D_IB_valid & ( D.IB_pc[1:0] != 2'b00 + | ~D_IB_iv + | D_IB_TLBRefill | D_IB_TLBInvalid + | D_IB_AddressError + | D.IB.SYSCALL | D.IB.BREAK | D.IB.ERET + | D.IB_Delay & D.IB.BJRJ + | D.IB.PRV & ~C0_kernel); assign D.IB_ERET = D_IB_valid & D.IB_pc[1:0] == 2'b00 & ~D_IB_TLBRefill & ~D_IB_TLBInvalid & ~D_IB_AddressError & D_IB_iv & D.IB.ERET & ~D.IB_Delay; assign D.IB_REFILL = D_IB_valid & D.IB_pc[1:0] == 2'b00 & D_IB_TLBRefill; assign D.IB_ExcCode = D.IB_pc[1:0] != 2'b00 | D_IB_AddressError ? `EXCCODE_ADEL @@ -456,8 +469,9 @@ module Datapath ( : ~D_IB_iv ? `EXCCODE_RI : D.IB.ERET ? `EXCCODE_RI : D.IB_Delay & D.IB.BJRJ ? `EXCCODE_RI - : D.IB_inst[0] ? `EXCCODE_BP - : `EXCCODE_SYS; + : ~D.IB_inst[30] & D.IB_inst[0] ? `EXCCODE_BP + : ~D.IB_inst[30] & ~D.IB_inst[0] ? `EXCCODE_SYS + : `EXCCODE_CPU; assign D.IB_Delay = D.IA.BJRJ; // D.Dispatch diff --git a/src/MyCPU.sv b/src/MyCPU.sv index be4e5fb..cbae4f5 100644 --- a/src/MyCPU.sv +++ b/src/MyCPU.sv @@ -235,6 +235,7 @@ module mycpu_top ( .C0_ERETPC (C0_ERETPC), .C0_Bev (C0_Bev), .C0_EBase (C0_EBase), + .C0_kernel (in_kernel), .debug_wb_pc (debug_wb_pc), .debug_wb_rf_wen (debug_wb_rf_wen), diff --git a/src/include/defines.svh b/src/include/defines.svh index 203a1f6..e3dc049 100644 --- a/src/include/defines.svh +++ b/src/include/defines.svh @@ -24,7 +24,9 @@ `define EXCCODE_SYS 5'h08 `define EXCCODE_BP 5'h09 `define EXCCODE_RI 5'h0A +`define EXCCODE_CPU 5'h0B `define EXCCODE_OV 5'h0C +`define EXCCODE_TR 5'h0D typedef logic [31:0] word_t; @@ -101,6 +103,8 @@ typedef struct packed { } WCtrl_t; typedef struct packed { + logic PRV; + logic SYSCALL; logic BREAK; logic ERET; diff --git a/tools/ctrl_maker.py b/tools/ctrl_maker.py index 1c42741..599f083 100644 --- a/tools/ctrl_maker.py +++ b/tools/ctrl_maker.py @@ -1,4 +1,4 @@ -with open('mctrl1.txt') as f: +with open('exc.txt') as f: lines = f.readlines() title = lines[0].split() items = [x.split() for x in lines[1:]] diff --git a/tools/decoder.py b/tools/decoder.py index 6e84445..d0feb03 100644 --- a/tools/decoder.py +++ b/tools/decoder.py @@ -127,6 +127,7 @@ for inst, name in table: ctrl['MCtrl1_MX'] = ~inst[28] ctrl['MCtrl1_TLBR'] = inst[30] & ~inst[29] & inst[25] & ~inst[3] & ~inst[1] ctrl['MCtrl1_TLBWI'] = inst[30] & ~inst[29] & inst[25] & ~inst[3] & inst[1] + ctrl['MCtrl1_TLBWR'] = inst[30] & ~inst[29] & inst[25] & ~inst[3] & (inst[2] | ~inst[1]) ctrl['MCtrl1_TLBP'] = inst[30] & ~inst[4] & inst[3] ctrl['WCtrl_RW'] = (~inst[30] & (~inst[29] & (inst[31] | ~inst[28] & (~inst[27] & (~inst[26] & (~inst[3] & (~inst[4] | ~inst[0]) | inst[3] & (inst[5] | ~inst[4] & ~inst[2] & inst[0])) | inst[26] & inst[20]) | inst[27] & inst[26])) | inst[29] & ~inst[31]) | inst[30] & ~inst[25] & ~inst[23]) diff --git a/tools/exc.txt b/tools/exc.txt new file mode 100644 index 0000000..2bf4a6c --- /dev/null +++ b/tools/exc.txt @@ -0,0 +1,10 @@ +////-------------------------------- BREAK SYSCALL +32'b000000????????????????????001100 0 1 // SYSCALL +32'b000000????????????????????001101 1 0 // BREAK +32'b01000010000000000000000000011000 0 0 // ERET +32'b01000000000??????????00000000??? 0 0 // MFC0 +32'b01000000100??????????00000000??? 0 0 // MTC0 +32'b01000010000000000000000000000001 0 0 // TLBR +32'b01000010000000000000000000000010 0 0 // TLBWI +32'b01000010000000000000000000000110 0 0 // TLBWR +32'b01000010000000000000000000001000 0 0 // TLBP \ No newline at end of file diff --git a/tools/privilege.txt b/tools/privilege.txt new file mode 100644 index 0000000..3c7a8fd --- /dev/null +++ b/tools/privilege.txt @@ -0,0 +1,63 @@ +////-------------------------------- PRV +32'b00000000000???????????????000000 0 // SLL +32'b00000000000???????????????000010 0 // SRL +32'b00000000000???????????????000011 0 // SRA +32'b000000???????????????00000000100 0 // SLLV +32'b000000???????????????00000000110 0 // SRLV +32'b000000???????????????00000000111 0 // SRAV +32'b000000?????000000000000000001000 0 // JR +32'b000000?????00000?????00000001001 0 // JALR +32'b000000????????????????????001100 0 // SYSCALL +32'b000000????????????????????001101 0 // BREAK +32'b0000000000000000?????00000010000 0 // MFHI +32'b000000?????000000000000000010001 0 // MTHI +32'b0000000000000000?????00000010010 0 // MFLO +32'b000000?????000000000000000010011 0 // MTLO +32'b000000??????????0000000000011000 0 // MULT +32'b000000??????????0000000000011001 0 // MULTU +32'b000000??????????0000000000011010 0 // DIV +32'b000000??????????0000000000011011 0 // DIVU +32'b000000???????????????00000100000 0 // ADD +32'b000000???????????????00000100001 0 // ADDU +32'b000000???????????????00000100010 0 // SUB +32'b000000???????????????00000100011 0 // SUBU +32'b000000???????????????00000100100 0 // AND +32'b000000???????????????00000100101 0 // OR +32'b000000???????????????00000100110 0 // XOR +32'b000000???????????????00000100111 0 // NOR +32'b000000???????????????00000101010 0 // SLT +32'b000000???????????????00000101011 0 // SLTU +32'b000001?????00000???????????????? 0 // BLTZ +32'b000001?????10000???????????????? 0 // BLTZAL +32'b000001?????00001???????????????? 0 // BGEZ +32'b000001?????10001???????????????? 0 // BGEZAL +32'b000010?????????????????????????? 0 // J +32'b000011?????????????????????????? 0 // JAL +32'b000100?????????????????????????? 0 // BEQ +32'b000101?????????????????????????? 0 // BNE +32'b000110?????00000???????????????? 0 // BLEZ +32'b000111?????00000???????????????? 0 // BGTZ +32'b001000?????????????????????????? 0 // ADDI +32'b001001?????????????????????????? 0 // ADDIU +32'b001010?????????????????????????? 0 // SLTI +32'b001011?????????????????????????? 0 // SLTIU +32'b001100?????????????????????????? 0 // ANDI +32'b001101?????????????????????????? 0 // ORI +32'b001110?????????????????????????? 0 // XORI +32'b00111100000????????????????????? 0 // LUI +32'b01000000000??????????00000000??? 1 // MFC0 +32'b01000000100??????????00000000??? 1 // MTC0 +32'b01000010000000000000000000000001 1 // TLBR +32'b01000010000000000000000000000010 1 // TLBWI +32'b01000010000000000000000000000110 1 // TLBWR +32'b01000010000000000000000000001000 1 // TLBP +32'b01000010000000000000000000011000 1 // ERET +32'b011100???????????????00000000010 0 // MUL +32'b100000?????????????????????????? 0 // LB +32'b100001?????????????????????????? 0 // LH +32'b100011?????????????????????????? 0 // LW +32'b100100?????????????????????????? 0 // LBU +32'b100101?????????????????????????? 0 // LHU +32'b101000?????????????????????????? 0 // SB +32'b101001?????????????????????????? 0 // SH +32'b101011?????????????????????????? 0 // SW \ No newline at end of file From 1a51af6827c0b4528579cd8b67802fda19da6bb2 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Wed, 25 Aug 2021 22:00:59 +0800 Subject: [PATCH 14/56] fix ADES --- README.md | 88 ++++++++++++++++++++++---------------------- src/Core/Datapath.sv | 2 +- 2 files changed, 45 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 50ec979..3ea8b89 100644 --- a/README.md +++ b/README.md @@ -29,55 +29,55 @@ Our awesome `MIPS` CPU written in `SystemVerilog` for Loongson Cup ## TODO & Notice -- [ ] 特权模式 +- [x] 特权模式 - [x] `CP0`寄存器`Status.UM` :heavy_check_mark: - [x] 访存异常(考虑`in_kernel`状态切换带来的冒险) :heavy_check_mark: - - [ ] 特权指令异常 :hourglass: + - [x] 特权指令异常 :heavy_check_mark: - [ ] 浮点运算单元 - [ ] ~~做一个真的`FPU`~~ :x: - [ ] 浮点运算指令报`Coprocessor Unusable`,同时`CP0`中新增`Cause.CE` :clock3: - [ ] 新增指令 -| Status | Instruction | Type | Tier | Comment | -| :------: | :---------: | :------: | :--: | :-------------------------------------- | -| :clock3: | `Cache` | `SYS` | 3 | | -| :clock3: | `PREF` | `SYS` | 1 | Treat as `NOP` | -| :clock3: | `SYNC` | `SYS` | 1 | Treat as `NOP` (We're strongly ordered) | -| :clock3: | `WAIT` | `SYS` | 3 | | -| :clock3: | `TEQ` | `SYS` | 2 | | -| :clock3: | `TEQI` | `SYS` | 2 | | -| :clock3: | `TGE` | `SYS` | 2 | | -| :clock3: | `TGEI` | `SYS` | 2 | | -| :clock3: | `TGEIU` | `SYS` | 2 | | -| :clock3: | `TGEU` | `SYS` | 2 | | -| :clock3: | `TLT` | `SYS` | 2 | | -| :clock3: | `TLTI` | `SYS` | 2 | | -| :clock3: | `TLTIU` | `SYS` | 2 | | -| :clock3: | `TLTU` | `SYS` | 2 | | -| :clock3: | `TNE` | `SYS` | 2 | | -| :clock3: | `TNEI` | `SYS` | 2 | | -| :clock3: | `CLO` | `ARITH` | 2 | `RT == RD` | -| :clock3: | `CLZ` | `ARITH` | 2 | `RT == RD` | -| :clock3: | `MADD` | `ARITH` | 2 | | -| :clock3: | `MADDU` | `ARITH` | 2 | | -| :clock3: | `MSUB` | `ARITH` | 2 | | -| :clock3: | `MSUBU` | `ARITH` | 2 | | -| :clock3: | `MOVN` | `ARITH` | 1 | | -| :clock3: | `MOVZ` | `ARITH` | 1 | | -| :clock3: | `LL` | `MEM` | 3 | | -| :clock3: | `LWL` | `MEM` | 1 | | -| :clock3: | `LWR` | `MEM` | 1 | | -| :clock3: | `SC` | `MEM` | 3 | | -| :clock3: | `SWL` | `MEM` | 1 | | -| :clock3: | `SWR` | `MEM` | 1 | | -| :clock3: | `MOVF` | `FP` | 2 | | -| :clock3: | `MOVT` | `FP` | 2 | | -| :clock3: | `BEQL` | `BRANCH` | 3 | | -| :clock3: | `BGEZALL` | `BRANCH` | 3 | | -| :clock3: | `BGEZL` | `BRANCH` | 3 | | -| :clock3: | `BGTZL` | `BRANCH` | 3 | | -| :clock3: | `BLEZL` | `BRANCH` | 3 | | -| :clock3: | `BLTZALL` | `BRANCH` | 3 | | -| :clock3: | `BLTZL` | `BRANCH` | 3 | | -| :clock3: | `BNEL` | `BRANCH` | 3 | | +| Status | Instruction | Type | Tier | Comment | +| :---------: | :---------: | :------: | :--: | :-------------------------------------- | +| :clock3: | `Cache` | `SYS` | 3 | | +| :clock3: | `PREF` | `SYS` | 1 | Treat as `NOP` | +| :clock3: | `SYNC` | `SYS` | 1 | Treat as `NOP` (We're strongly ordered) | +| :clock3: | `WAIT` | `SYS` | 3 | | +| :clock3: | `TEQ` | `SYS` | 2 | | +| :clock3: | `TEQI` | `SYS` | 2 | | +| :clock3: | `TGE` | `SYS` | 2 | | +| :clock3: | `TGEI` | `SYS` | 2 | | +| :clock3: | `TGEIU` | `SYS` | 2 | | +| :clock3: | `TGEU` | `SYS` | 2 | | +| :clock3: | `TLT` | `SYS` | 2 | | +| :clock3: | `TLTI` | `SYS` | 2 | | +| :clock3: | `TLTIU` | `SYS` | 2 | | +| :clock3: | `TLTU` | `SYS` | 2 | | +| :clock3: | `TNE` | `SYS` | 2 | | +| :clock3: | `TNEI` | `SYS` | 2 | | +| :clock3: | `CLO` | `ARITH` | 2 | `RT == RD` | +| :clock3: | `CLZ` | `ARITH` | 2 | `RT == RD` | +| :clock3: | `MADD` | `ARITH` | 2 | | +| :clock3: | `MADDU` | `ARITH` | 2 | | +| :clock3: | `MSUB` | `ARITH` | 2 | | +| :clock3: | `MSUBU` | `ARITH` | 2 | | +| :clock3: | `MOVN` | `ARITH` | 1 | | +| :clock3: | `MOVZ` | `ARITH` | 1 | | +| :clock3: | `LL` | `MEM` | 3 | | +| :hourglass: | `LWL` | `MEM` | 1 | | +| :hour | `LWR` | `MEM` | 1 | | +| :clock3: | `SC` | `MEM` | 3 | | +| :hourglass: | `SWL` | `MEM` | 1 | | +| :hourglass: | `SWR` | `MEM` | 1 | | +| :clock3: | `MOVF` | `FP` | 2 | | +| :clock3: | `MOVT` | `FP` | 2 | | +| :clock3: | `BEQL` | `BRANCH` | 3 | | +| :clock3: | `BGEZALL` | `BRANCH` | 3 | | +| :clock3: | `BGEZL` | `BRANCH` | 3 | | +| :clock3: | `BGTZL` | `BRANCH` | 3 | | +| :clock3: | `BLEZL` | `BRANCH` | 3 | | +| :clock3: | `BLTZALL` | `BRANCH` | 3 | | +| :clock3: | `BLTZL` | `BRANCH` | 3 | | +| :clock3: | `BNEL` | `BRANCH` | 3 | | diff --git a/src/Core/Datapath.sv b/src/Core/Datapath.sv index fa984d6..c918bb4 100644 --- a/src/Core/Datapath.sv +++ b/src/Core/Datapath.sv @@ -1089,7 +1089,7 @@ module Datapath ( assign M.I1.ExcValid = M_I1_PrevExcValid | M_I1_NowExcValid; assign M.I1.REFILL = M_I1_PrevREFILL | dTLBRefillB; assign M.I1.ExcCode = M_I1_PrevExcValid ? M_I1_PrevExcCode - : dAddressErrorB ? `EXCCODE_ADEL + : dAddressErrorB ? M.I1.MCtrl.MWR ? `EXCCODE_ADES : `EXCCODE_ADES : dTLBRefillB ? M.I1.MCtrl.MWR ? `EXCCODE_TLBS : `EXCCODE_TLBL : dTLBInvalidB ? M.I1.MCtrl.MWR ? `EXCCODE_TLBS : `EXCCODE_TLBL : `EXCCODE_MOD; From 1ad35234dc1d56291dcf760919a3696e86436e0c Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Thu, 26 Aug 2021 17:04:09 +0800 Subject: [PATCH 15/56] txt add tlbwr --- tools/ectrl.txt | 1 + tools/global.txt | 1 + tools/mctrl0.txt | 1 + tools/pcs.txt | 1 + tools/wctrl.txt | 1 + 5 files changed, 5 insertions(+) diff --git a/tools/ectrl.txt b/tools/ectrl.txt index 80aa62a..dd650d4 100644 --- a/tools/ectrl.txt +++ b/tools/ectrl.txt @@ -49,6 +49,7 @@ 32'b01000000100??????????00000000??? ? ? ? ? ? ? ? ? ? ? ? // MTC0 32'b01000010000000000000000000000001 ? ? ? ? ? ? ? ? ? ? ? // TLBR 32'b01000010000000000000000000000010 ? ? ? ? ? ? ? ? ? ? ? // TLBWI +32'b01000010000000000000000000000110 ? ? ? ? ? ? ? ? ? ? ? // TLBWR 32'b01000010000000000000000000001000 ? ? ? ? ? ? ? ? ? ? ? // TLBP 32'b01000010000000000000000000011000 ? ? ? ? ? ? ? ? ? ? ? // ERET 32'b011100???????????????00000000010 ? ? ? ? ? ? ? ? ? ? ? // MUL diff --git a/tools/global.txt b/tools/global.txt index e9cae6d..d453204 100644 --- a/tools/global.txt +++ b/tools/global.txt @@ -49,6 +49,7 @@ 32'b01000000100??????????00000000??? 0 0 0 0 0 0 0 0 1 0 // MTC0 32'b01000010000000000000000000000001 0 0 0 0 0 0 0 0 0 1 // TLBR 32'b01000010000000000000000000000010 0 0 0 0 0 0 0 0 0 1 // TLBWI +32'b01000010000000000000000000000110 0 0 0 0 0 0 0 0 0 1 // TLBWR 32'b01000010000000000000000000001000 0 0 0 0 0 0 0 0 0 1 // TLBP 32'b01000010000000000000000000011000 0 0 1 0 0 0 0 0 1 1 // ERET 32'b011100???????????????00000000010 0 0 0 0 1 1 0 0 1 0 // MUL diff --git a/tools/mctrl0.txt b/tools/mctrl0.txt index de0017c..f8012f1 100644 --- a/tools/mctrl0.txt +++ b/tools/mctrl0.txt @@ -49,6 +49,7 @@ 32'b01000000100??????????00000000??? 0 0 ? 0 ? ? 1 ? ? ? ? // MTC0 32'b01000010000000000000000000000001 ? ? ? 0 ? ? 0 ? ? ? ? // TLBR 32'b01000010000000000000000000000010 ? ? ? 0 ? ? 0 ? ? ? ? // TLBWI +32'b01000010000000000000000000000110 ? ? ? 0 ? ? 0 ? ? ? ? // TLBWR 32'b01000010000000000000000000001000 ? ? ? 0 ? ? 0 ? ? ? ? // TLBP 32'b01000010000000000000000000011000 0 0 ? 0 ? ? 0 ? ? ? ? // ERET 32'b011100???????????????00000000010 0 0 MUL? 1 0 ? 0 MUL 0 1 0 // MUL diff --git a/tools/pcs.txt b/tools/pcs.txt index 03b40da..5eb2654 100644 --- a/tools/pcs.txt +++ b/tools/pcs.txt @@ -49,6 +49,7 @@ 32'b01000000100??????????00000000??? 0 0 0 0 // MTC0 32'b01000010000000000000000000000001 0 0 0 0 // TLBR 32'b01000010000000000000000000000010 0 0 0 0 // TLBWI +32'b01000010000000000000000000000110 0 0 0 0 // TLBWR 32'b01000010000000000000000000001000 0 0 0 0 // TLBP 32'b01000010000000000000000000011000 0 0 0 0 // ERET 32'b011100???????????????00000000010 0 0 0 0 // MUL diff --git a/tools/wctrl.txt b/tools/wctrl.txt index 48c4fd3..6bc82ad 100644 --- a/tools/wctrl.txt +++ b/tools/wctrl.txt @@ -49,6 +49,7 @@ 32'b01000000100??????????00000000??? 0 ? ? ? // MTC0 32'b01000010000000000000000000000001 0 ? ? ? // TLBR 32'b01000010000000000000000000000010 0 ? ? ? // TLBWI +32'b01000010000000000000000000000110 0 ? ? ? // TLBWR 32'b01000010000000000000000000001000 0 ? ? ? // TLBP 32'b01000010000000000000000000011000 0 ? ? ? // ERET 32'b011100???????????????00000000010 1 RD 0 0 // MUL From 54c6794a7733fd885df356eb2b39b90323f4301c Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Thu, 26 Aug 2021 18:32:55 +0800 Subject: [PATCH 16/56] add LWL and LWR --- src/Core/Controller.sv | 3 +- src/Core/Datapath.sv | 42 ++++++++++--- src/Core/Gadgets.sv | 2 + src/include/defines.svh | 7 +++ tools/ctrl_maker.py | 2 +- tools/decoder.py | 7 ++- tools/ectrl.txt | 2 + tools/global.txt | 2 + tools/mctrl0.txt | 2 + tools/mctrl1.txt | 128 ++++++++++++++++++++-------------------- tools/pcs.txt | 2 + tools/privilege.txt | 2 + tools/wctrl.txt | 2 + 13 files changed, 130 insertions(+), 73 deletions(-) diff --git a/src/Core/Controller.sv b/src/Core/Controller.sv index d672375..a1c5ca6 100644 --- a/src/Core/Controller.sv +++ b/src/Core/Controller.sv @@ -28,7 +28,7 @@ module Controller ( imm ); - assign ctrl.BJRJ = ~inst[29] & (~inst[31] & (~inst[30] & ~inst[5] & ~inst[4] & inst[3] & ~inst[2] | inst[28] | inst[26]) | inst[27] & ~inst[26]); + assign ctrl.BJRJ = (~inst[27] & (~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[5] & ~inst[4] & inst[3] & ~inst[2] | ~inst[31] & ~inst[29] & inst[28]) | inst[27] & ~inst[31] & ~inst[29]) & ~inst[26] | ~inst[31] & ~inst[29] & inst[26]; assign ctrl.B = ~inst[31] & ~inst[29] & (inst[28] | ~inst[27] & inst[26]); assign ctrl.JR = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & ~inst[4] & inst[3] & ~inst[2]; assign ctrl.J = ~inst[31] & ~inst[29] & ~inst[28] & inst[27]; @@ -72,6 +72,7 @@ module Controller ( assign ctrl.MCtrl1.MR = inst[31]; assign ctrl.MCtrl1.MWR = inst[29]; assign ctrl.MCtrl1.MX = ~inst[28]; + assign ctrl.MCtrl1.ALR = ALR_t'({inst[28] & inst[27], ~inst[28] & inst[27] & ~inst[26]}); assign ctrl.MCtrl1.SZ = inst[27:26]; assign ctrl.MCtrl1.TLBR = inst[30] & ~inst[29] & inst[25] & ~inst[3] & ~inst[1]; assign ctrl.MCtrl1.TLBWI = inst[30] & ~inst[29] & inst[25] & ~inst[3] & inst[1]; diff --git a/src/Core/Datapath.sv b/src/Core/Datapath.sv index c918bb4..4add86f 100644 --- a/src/Core/Datapath.sv +++ b/src/Core/Datapath.sv @@ -206,6 +206,9 @@ module Datapath ( logic [15:0] M_I1_Half; word_t M_I1_ByteX; word_t M_I1_HalfX; + word_t M_I1_MDataA; + word_t M_I1_MDataUL; + word_t M_I1_MDataUR; word_t M_I1_MData; logic M_I0_DIV_valid; @@ -437,7 +440,7 @@ module Datapath ( D_IB_iv ); - // TODO: Merge "pc[1:0] != 2'b00" into AddressError + // INFO: Merge "pc[1:0] != 2'b00" into AddressError assign D.IA_ExcValid = D_IA_valid & ( D.IA_pc[1:0] != 2'b00 | ~D_IA_iv | D_IA_TLBRefill | D_IA_TLBInvalid @@ -512,6 +515,8 @@ module Datapath ( | D.IA.WCtrl.RW & D.IB.RT == D.IA.RD & D.IB.MCtrl0.C0W & ~D.IA.DP0 // Not Arith -> Store | D.IA.WCtrl.RW & D.IB.RT == D.IA.RD & D.IB.MCtrl1.MWR & ~D.IA.DP1 + // Not Arith -> LWL/LWR + | D.IA.WCtrl.RW & D.IB.RT == D.IA.RD & |D.IB.MCtrl1.ALR & ~D.IA.DP1 // CP0 Execution Hazards // Hazards Related to the TLB | D.IA.MCtrl0.C0W & D.IB.MCtrl1.TLBR & D.IA.MCtrl0.C0D == C0_INDEX @@ -519,7 +524,7 @@ module Datapath ( | D.IA.MCtrl0.C0W & D.IB.MCtrl1.TLBWI & D.IA.MCtrl0.C0D == C0_ENTRYLO0 | D.IA.MCtrl0.C0W & D.IB.MCtrl1.TLBWI & D.IA.MCtrl0.C0D == C0_ENTRYLO1 | D.IA.MCtrl0.C0W & D.IB.MCtrl1.TLBWI & D.IA.MCtrl0.C0D == C0_INDEX & ~D.IB.MCtrl1.TLBWR - | D.IA.MCtrl0.C0W & D.IB.MCtrl1.TLBWI & D.IA.MCtrl0.C0D == C0_PAGEMASK // TODO: PageMask is always zero now + // | D.IA.MCtrl0.C0W & D.IB.MCtrl1.TLBWI & D.IA.MCtrl0.C0D == C0_PAGEMASK | E.I0.MCtrl.C0W & D.IB.MCtrl1.TLBP & E.I0.MCtrl.C0D == C0_ENTRYHI | D.IA.MCtrl0.C0W & D.IB.MCtrl1.TLBP & D.IA.MCtrl0.C0D == C0_ENTRYHI | D.IA.MCtrl0.C0W & D.IB.MCtrl1.MR & D.IA.MCtrl0.C0D == C0_ENTRYHI @@ -529,7 +534,7 @@ module Datapath ( | D.IA.MCtrl1.TLBR & D.IB.WCtrl.RW & D.IB.MCtrl0.C0D == C0_ENTRYHI & D.IB.MCtrl0.RS0 == C0 | D.IA.MCtrl1.TLBR & D.IB.WCtrl.RW & D.IB.MCtrl0.C0D == C0_ENTRYLO0 & D.IB.MCtrl0.RS0 == C0 | D.IA.MCtrl1.TLBR & D.IB.WCtrl.RW & D.IB.MCtrl0.C0D == C0_ENTRYLO1 & D.IB.MCtrl0.RS0 == C0 - | D.IA.MCtrl1.TLBR & D.IB.WCtrl.RW & D.IB.MCtrl0.C0D == C0_PAGEMASK & D.IB.MCtrl0.RS0 == C0 // TODO: PageMask is always zero now + // | D.IA.MCtrl1.TLBR & D.IB.WCtrl.RW & D.IB.MCtrl0.C0D == C0_PAGEMASK & D.IB.MCtrl0.RS0 == C0 | D.IA.MCtrl1.TLBP & D.IB.WCtrl.RW & D.IB.MCtrl0.C0D == C0_INDEX & D.IB.MCtrl0.RS0 == C0 // Hazards Related to Exceptions or Interrupts | D.IA.MCtrl0.C0W & D.IB.ERET & D.IA.MCtrl0.C0D == C0_EPC @@ -764,7 +769,7 @@ module Datapath ( E.en, E.I1.ECtrl ); - ffenrc #(9) E_I1_MCtrl_ff ( + ffenrc #(11) E_I1_MCtrl_ff ( clk, rst | rstM, D.I1.MCtrl, @@ -897,7 +902,7 @@ module Datapath ( ); assign tlb_tlbp = E.I1.MCtrl.TLBP; - assign mem_i.req = E.I1.MCtrl.MR & E_I1_goWithoutOF & M.en & ~rstM; + assign mem_i.req = E.I1.MCtrl.MR & E_I1_goWithoutOF & M.en & ~rstM; assign mem_i.addr = E_I1_ForwardS + E.I1.imm; assign mem_i.size = {E.I1.MCtrl.SZ[1], E.I1.MCtrl.SZ[0] & ~E.I1.MCtrl.SZ[1]}; // assign mem_i.addr = E.I1.ALUOut; @@ -1052,7 +1057,7 @@ module Datapath ( M.en, M.I1.ALUOut ); - ffenrc #(9) M_I1_MCtrl_ff ( + ffenrc #(11) M_I1_MCtrl_ff ( clk, rst | rstM, E.I1.MCtrl, @@ -1214,11 +1219,34 @@ module Datapath ( M.I1.MCtrl.MX, M_I1_HalfX ); - mux3 #(32) M_I1_MData_mux ( + mux3 #(32) M_I1_MDataA_mux ( M_I1_ByteX, M_I1_HalfX, M_I1_DataR, M.I1.MCtrl.SZ, + M_I1_MDataA + ); + mux4 #(32) M_I1_MDataUL_mux ( + {M_I1_DataR[ 7:0], M_I1_ForwardT[23:0]}, + {M_I1_DataR[15:0], M_I1_ForwardT[15:0]}, + {M_I1_DataR[23:0], M_I1_ForwardT[ 7:0]}, + M_I1_DataR, + M.I1.ALUOut[1:0], + M_I1_MDataUL + ); + mux4 #(32) M_I1_MDataUR_mux ( + M_I1_DataR, + {M_I1_ForwardT[31:24], M_I1_DataR[31: 8]}, + {M_I1_ForwardT[31:16], M_I1_DataR[31:16]}, + {M_I1_ForwardT[31: 8], M_I1_DataR[31:24]}, + M.I1.ALUOut[1:0], + M_I1_MDataUR + ); + mux3 #(32) M_I1_MData_mux ( + M_I1_MDataA, + M_I1_MDataUL, + M_I1_MDataUR, + M.I1.MCtrl.ALR, M_I1_MData ); mux2 #(32) M_I1_DataRW_mux ( diff --git a/src/Core/Gadgets.sv b/src/Core/Gadgets.sv index 46ca425..3c00eee 100644 --- a/src/Core/Gadgets.sv +++ b/src/Core/Gadgets.sv @@ -75,9 +75,11 @@ module instr_valid ( 32'b011100???????????????00000000010: valid = 1'b1; // MUL 32'b100000??????????????????????????: valid = 1'b1; // LB 32'b100001??????????????????????????: valid = 1'b1; // LH + 32'b100010??????????????????????????: valid = 1'b1; // LWL 32'b100011??????????????????????????: valid = 1'b1; // LW 32'b100100??????????????????????????: valid = 1'b1; // LBU 32'b100101??????????????????????????: valid = 1'b1; // LHU + 32'b100110??????????????????????????: valid = 1'b1; // LWR 32'b101000??????????????????????????: valid = 1'b1; // SB 32'b101001??????????????????????????: valid = 1'b1; // SH 32'b101011??????????????????????????: valid = 1'b1; // SW diff --git a/src/include/defines.svh b/src/include/defines.svh index e3dc049..62e7764 100644 --- a/src/include/defines.svh +++ b/src/include/defines.svh @@ -71,6 +71,12 @@ typedef enum logic [2:0] { DIVU = 3'b111 } HLS_t; +typedef enum logic [1:0] { + ALIGN = 2'b00, + ULEFT = 2'b01, + URIGHT = 2'b10 +} ALR_t; + typedef struct packed { SA_t SA; SB_t SB; @@ -91,6 +97,7 @@ typedef struct packed { logic MR; // critical logic MWR; // critical logic MX; + ALR_t ALR; // critical logic [1:0] SZ; logic TLBWI; // critical logic TLBWR; // critical diff --git a/tools/ctrl_maker.py b/tools/ctrl_maker.py index 599f083..1c42741 100644 --- a/tools/ctrl_maker.py +++ b/tools/ctrl_maker.py @@ -1,4 +1,4 @@ -with open('exc.txt') as f: +with open('mctrl1.txt') as f: lines = f.readlines() title = lines[0].split() items = [x.split() for x in lines[1:]] diff --git a/tools/decoder.py b/tools/decoder.py index d0feb03..b30a8a9 100644 --- a/tools/decoder.py +++ b/tools/decoder.py @@ -55,9 +55,11 @@ table = [ ('011100???????????????00000000010', 'MUL'), ('100000??????????????????????????', 'LB'), ('100001??????????????????????????', 'LH'), + ('100010??????????????????????????', 'LWL'), ('100011??????????????????????????', 'LW'), ('100100??????????????????????????', 'LBU'), ('100101??????????????????????????', 'LHU'), + ('100110??????????????????????????', 'LWR'), ('101000??????????????????????????', 'SB'), ('101001??????????????????????????', 'SH'), ('101011??????????????????????????', 'SW'), @@ -84,11 +86,13 @@ for inst, name in table: # print('=====', name, '=====') ctrl = {} - ctrl['BJRJ'] = ~inst[29] & (~inst[31] & (~inst[30] & ~inst[5] & ~inst[4] & inst[3] & ~inst[2] | inst[28] | inst[26]) | inst[27] & ~inst[26]) + ctrl['BJRJ'] = (~inst[27] & (~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[5] & ~inst[4] & inst[3] & ~inst[2] | ~inst[31] & ~inst[29] & inst[28]) | inst[27] & ~inst[31] & ~inst[29]) & ~inst[26] | ~inst[31] & ~inst[29] & inst[26] ctrl['B'] = ~inst[31] & ~inst[29] & (inst[28] | ~inst[27] & inst[26]) ctrl['JR'] = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & ~inst[4] & inst[3] & ~inst[2] ctrl['J'] = ~inst[31] & ~inst[29] & ~inst[28] & inst[27] + ctrl['PRV'] = inst[30] & ~inst[29]; + ctrl['SYSCALL'] = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[3] & inst[2] & ~inst[0] ctrl['BREAK'] = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[3] & inst[2] & inst[0] ctrl['ERET'] = inst[30] & inst[4] @@ -125,6 +129,7 @@ for inst, name in table: ctrl['MCtrl1_MR'] = inst[31] ctrl['MCtrl1_MWR'] = inst[29] ctrl['MCtrl1_MX'] = ~inst[28] + ctrl['MCtrl1_ALR'] = (inst[28] & inst[27], ~inst[28] & inst[27] & ~inst[26]) ctrl['MCtrl1_TLBR'] = inst[30] & ~inst[29] & inst[25] & ~inst[3] & ~inst[1] ctrl['MCtrl1_TLBWI'] = inst[30] & ~inst[29] & inst[25] & ~inst[3] & inst[1] ctrl['MCtrl1_TLBWR'] = inst[30] & ~inst[29] & inst[25] & ~inst[3] & (inst[2] | ~inst[1]) diff --git a/tools/ectrl.txt b/tools/ectrl.txt index dd650d4..acdb3b0 100644 --- a/tools/ectrl.txt +++ b/tools/ectrl.txt @@ -55,9 +55,11 @@ 32'b011100???????????????00000000010 ? ? ? ? ? ? ? ? ? ? ? // MUL 32'b100000?????????????????????????? ADD 0 RS 1 1 IMM 1 ? IX 0 1 // LB 32'b100001?????????????????????????? ADD 0 RS 1 1 IMM 1 ? IX 0 1 // LH +32'h100010?????????????????????????? ADD 0 RS 1 1 IMM 1 ? IX 0 1 // LWL 32'b100011?????????????????????????? ADD 0 RS 1 1 IMM 1 ? IX 0 1 // LW 32'b100100?????????????????????????? ADD 0 RS 1 1 IMM 1 ? IX 0 1 // LBU 32'b100101?????????????????????????? ADD 0 RS 1 1 IMM 1 ? IX 0 1 // LHU +32'h100110?????????????????????????? ADD 0 RS 1 1 IMM 1 ? IX 0 1 // LWR 32'b101000?????????????????????????? ADD 0 RS 1 1 IMM 1 ? IX 0 1 // SB 32'b101001?????????????????????????? ADD 0 RS 1 1 IMM 1 ? IX 0 1 // SH 32'b101011?????????????????????????? ADD 0 RS 1 1 IMM 1 ? IX 0 1 // SW \ No newline at end of file diff --git a/tools/global.txt b/tools/global.txt index d453204..297136a 100644 --- a/tools/global.txt +++ b/tools/global.txt @@ -55,9 +55,11 @@ 32'b011100???????????????00000000010 0 0 0 0 1 1 0 0 1 0 // MUL 32'b100000?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // LB 32'b100001?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // LH +32'h100010?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // LWL 32'b100011?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // LW 32'b100100?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // LBU 32'b100101?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // LHU +32'h100110?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // LWR 32'b101000?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // SB 32'b101001?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // SH 32'b101011?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // SW \ No newline at end of file diff --git a/tools/mctrl0.txt b/tools/mctrl0.txt index f8012f1..0707927 100644 --- a/tools/mctrl0.txt +++ b/tools/mctrl0.txt @@ -55,9 +55,11 @@ 32'b011100???????????????00000000010 0 0 MUL? 1 0 ? 0 MUL 0 1 0 // MUL 32'b100000?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // LB 32'b100001?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // LH +32'h100010?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // LWL 32'b100011?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // LW 32'b100100?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // LBU 32'b100101?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // LHU +32'h100110?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // LWR 32'b101000?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // SB 32'b101001?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // SH 32'b101011?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // SW \ No newline at end of file diff --git a/tools/mctrl1.txt b/tools/mctrl1.txt index 7a7242d..1ef8cc9 100644 --- a/tools/mctrl1.txt +++ b/tools/mctrl1.txt @@ -1,63 +1,65 @@ -////-------------------------------- TLBR TLBWI TLBWR TLBP MR MWR MX -32'b00000000000???????????????000000 0 0 0 0 0 ? ? // SLL -32'b00000000000???????????????000010 0 0 0 0 0 ? ? // SRL -32'b00000000000???????????????000011 0 0 0 0 0 ? ? // SRA -32'b000000???????????????00000000100 0 0 0 0 0 ? ? // SLLV -32'b000000???????????????00000000110 0 0 0 0 0 ? ? // SRLV -32'b000000???????????????00000000111 0 0 0 0 0 ? ? // SRAV -32'b000000?????000000000000000001000 0 0 0 0 0 ? ? // JR -32'b000000?????00000?????00000001001 0 0 0 0 0 ? ? // JALR -32'b000000????????????????????001100 0 0 0 0 0 ? ? // SYSCALL -32'b000000????????????????????001101 0 0 0 0 0 ? ? // BREAK -32'b0000000000000000?????00000010000 0 0 0 0 ? ? ? // MFHI -32'b000000?????000000000000000010001 0 0 0 0 ? ? ? // MTHI -32'b0000000000000000?????00000010010 0 0 0 0 ? ? ? // MFLO -32'b000000?????000000000000000010011 0 0 0 0 ? ? ? // MTLO -32'b000000??????????0000000000011000 0 0 0 0 ? ? ? // MULT -32'b000000??????????0000000000011001 0 0 0 0 ? ? ? // MULTU -32'b000000??????????0000000000011010 0 0 0 0 ? ? ? // DIV -32'b000000??????????0000000000011011 0 0 0 0 ? ? ? // DIVU -32'b000000???????????????00000100000 0 0 0 0 0 ? ? // ADD -32'b000000???????????????00000100001 0 0 0 0 0 ? ? // ADDU -32'b000000???????????????00000100010 0 0 0 0 0 ? ? // SUB -32'b000000???????????????00000100011 0 0 0 0 0 ? ? // SUBU -32'b000000???????????????00000100100 0 0 0 0 0 ? ? // AND -32'b000000???????????????00000100101 0 0 0 0 0 ? ? // OR -32'b000000???????????????00000100110 0 0 0 0 0 ? ? // XOR -32'b000000???????????????00000100111 0 0 0 0 0 ? ? // NOR -32'b000000???????????????00000101010 0 0 0 0 0 ? ? // SLT -32'b000000???????????????00000101011 0 0 0 0 0 ? ? // SLTU -32'b000001?????00000???????????????? 0 0 0 0 0 ? ? // BLTZ -32'b000001?????10000???????????????? 0 0 0 0 0 ? ? // BLTZAL -32'b000001?????00001???????????????? 0 0 0 0 0 ? ? // BGEZ -32'b000001?????10001???????????????? 0 0 0 0 0 ? ? // BGEZAL -32'b000010?????????????????????????? 0 0 0 0 0 ? ? // J -32'b000011?????????????????????????? 0 0 0 0 0 ? ? // JAL -32'b000100?????????????????????????? 0 0 0 0 0 ? ? // BEQ -32'b000101?????????????????????????? 0 0 0 0 0 ? ? // BNE -32'b000110?????00000???????????????? 0 0 0 0 0 ? ? // BLEZ -32'b000111?????00000???????????????? 0 0 0 0 0 ? ? // BGTZ -32'b001000?????????????????????????? 0 0 0 0 0 ? ? // ADDI -32'b001001?????????????????????????? 0 0 0 0 0 ? ? // ADDIU -32'b001010?????????????????????????? 0 0 0 0 0 ? ? // SLTI -32'b001011?????????????????????????? 0 0 0 0 0 ? ? // SLTIU -32'b001100?????????????????????????? 0 0 0 0 0 ? ? // ANDI -32'b001101?????????????????????????? 0 0 0 0 0 ? ? // ORI -32'b001110?????????????????????????? 0 0 0 0 0 ? ? // XORI -32'b00111100000????????????????????? 0 0 0 0 0 ? ? // LUI -32'b01000000000??????????00000000??? 0 0 0 0 ? ? ? // MFC0 -32'b01000000100??????????00000000??? 0 0 0 0 ? ? ? // MTC0 -32'b01000010000000000000000000000001 1 0 1 0 0 ? ? // TLBR -32'b01000010000000000000000000000010 0 1 0 0 0 ? ? // TLBWI -32'b01000010000000000000000000000110 0 1 1 0 0 ? ? // TLBWR -32'b01000010000000000000000000001000 0 0 0 1 0 ? ? // TLBP -32'b01000010000000000000000000011000 0 0 0 0 0 ? ? // ERET -32'b011100???????????????00000000010 0 0 0 0 ? ? ? // MUL -32'b100000?????????????????????????? 0 0 0 0 1 0 1 // LB -32'b100001?????????????????????????? 0 0 0 0 1 0 1 // LH -32'b100011?????????????????????????? 0 0 0 0 1 0 1 // LW -32'b100100?????????????????????????? 0 0 0 0 1 0 0 // LBU -32'b100101?????????????????????????? 0 0 0 0 1 0 0 // LHU -32'b101000?????????????????????????? 0 0 0 0 1 1 ? // SB -32'b101001?????????????????????????? 0 0 0 0 1 1 ? // SH -32'b101011?????????????????????????? 0 0 0 0 1 1 ? // SW \ No newline at end of file +////-------------------------------- TLBR TLBWI TLBWR TLBP MR MWR MX ALR ALR1 ALR0 +32'b00000000000???????????????000000 0 0 0 0 0 ? ? ? ? ? // SLL +32'b00000000000???????????????000010 0 0 0 0 0 ? ? ? ? ? // SRL +32'b00000000000???????????????000011 0 0 0 0 0 ? ? ? ? ? // SRA +32'b000000???????????????00000000100 0 0 0 0 0 ? ? ? ? ? // SLLV +32'b000000???????????????00000000110 0 0 0 0 0 ? ? ? ? ? // SRLV +32'b000000???????????????00000000111 0 0 0 0 0 ? ? ? ? ? // SRAV +32'b000000?????000000000000000001000 0 0 0 0 0 ? ? ? ? ? // JR +32'b000000?????00000?????00000001001 0 0 0 0 0 ? ? ? ? ? // JALR +32'b000000????????????????????001100 0 0 0 0 0 ? ? ? ? ? // SYSCALL +32'b000000????????????????????001101 0 0 0 0 0 ? ? ? ? ? // BREAK +32'b0000000000000000?????00000010000 0 0 0 0 ? ? ? ? ? ? // MFHI +32'b000000?????000000000000000010001 0 0 0 0 ? ? ? ? ? ? // MTHI +32'b0000000000000000?????00000010010 0 0 0 0 ? ? ? ? ? ? // MFLO +32'b000000?????000000000000000010011 0 0 0 0 ? ? ? ? ? ? // MTLO +32'b000000??????????0000000000011000 0 0 0 0 ? ? ? ? ? ? // MULT +32'b000000??????????0000000000011001 0 0 0 0 ? ? ? ? ? ? // MULTU +32'b000000??????????0000000000011010 0 0 0 0 ? ? ? ? ? ? // DIV +32'b000000??????????0000000000011011 0 0 0 0 ? ? ? ? ? ? // DIVU +32'b000000???????????????00000100000 0 0 0 0 0 ? ? ? ? ? // ADD +32'b000000???????????????00000100001 0 0 0 0 0 ? ? ? ? ? // ADDU +32'b000000???????????????00000100010 0 0 0 0 0 ? ? ? ? ? // SUB +32'b000000???????????????00000100011 0 0 0 0 0 ? ? ? ? ? // SUBU +32'b000000???????????????00000100100 0 0 0 0 0 ? ? ? ? ? // AND +32'b000000???????????????00000100101 0 0 0 0 0 ? ? ? ? ? // OR +32'b000000???????????????00000100110 0 0 0 0 0 ? ? ? ? ? // XOR +32'b000000???????????????00000100111 0 0 0 0 0 ? ? ? ? ? // NOR +32'b000000???????????????00000101010 0 0 0 0 0 ? ? ? ? ? // SLT +32'b000000???????????????00000101011 0 0 0 0 0 ? ? ? ? ? // SLTU +32'b000001?????00000???????????????? 0 0 0 0 0 ? ? ? ? ? // BLTZ +32'b000001?????10000???????????????? 0 0 0 0 0 ? ? ? ? ? // BLTZAL +32'b000001?????00001???????????????? 0 0 0 0 0 ? ? ? ? ? // BGEZ +32'b000001?????10001???????????????? 0 0 0 0 0 ? ? ? ? ? // BGEZAL +32'b000010?????????????????????????? 0 0 0 0 0 ? ? ? ? ? // J +32'b000011?????????????????????????? 0 0 0 0 0 ? ? ? ? ? // JAL +32'b000100?????????????????????????? 0 0 0 0 0 ? ? ? ? ? // BEQ +32'b000101?????????????????????????? 0 0 0 0 0 ? ? ? ? ? // BNE +32'b000110?????00000???????????????? 0 0 0 0 0 ? ? ? ? ? // BLEZ +32'b000111?????00000???????????????? 0 0 0 0 0 ? ? ? ? ? // BGTZ +32'b001000?????????????????????????? 0 0 0 0 0 ? ? ? ? ? // ADDI +32'b001001?????????????????????????? 0 0 0 0 0 ? ? ? ? ? // ADDIU +32'b001010?????????????????????????? 0 0 0 0 0 ? ? ? ? ? // SLTI +32'b001011?????????????????????????? 0 0 0 0 0 ? ? ? ? ? // SLTIU +32'b001100?????????????????????????? 0 0 0 0 0 ? ? ? ? ? // ANDI +32'b001101?????????????????????????? 0 0 0 0 0 ? ? ? ? ? // ORI +32'b001110?????????????????????????? 0 0 0 0 0 ? ? ? ? ? // XORI +32'b00111100000????????????????????? 0 0 0 0 0 ? ? ? ? ? // LUI +32'b01000000000??????????00000000??? 0 0 0 0 ? ? ? ? ? ? // MFC0 +32'b01000000100??????????00000000??? 0 0 0 0 ? ? ? ? ? ? // MTC0 +32'b01000010000000000000000000000001 1 0 1 0 0 ? ? ? ? ? // TLBR +32'b01000010000000000000000000000010 0 1 0 0 0 ? ? ? ? ? // TLBWI +32'b01000010000000000000000000000110 0 1 1 0 0 ? ? ? ? ? // TLBWR +32'b01000010000000000000000000001000 0 0 0 1 0 ? ? ? ? ? // TLBP +32'b01000010000000000000000000011000 0 0 0 0 0 ? ? ? ? ? // ERET +32'b011100???????????????00000000010 0 0 0 0 ? ? ? ? ? ? // MUL +32'b100000?????????????????????????? 0 0 0 0 1 0 1 ALIGN 0 0 // LB +32'b100001?????????????????????????? 0 0 0 0 1 0 1 ALIGN 0 0 // LH +32'h100010?????????????????????????? 0 0 0 0 1 0 ? ULEFT 0 1 // LWL +32'b100011?????????????????????????? 0 0 0 0 1 0 ? ALIGN 0 0 // LW +32'b100100?????????????????????????? 0 0 0 0 1 0 0 ALIGN 0 0 // LBU +32'b100101?????????????????????????? 0 0 0 0 1 0 0 ALIGN 0 0 // LHU +32'h100110?????????????????????????? 0 0 0 0 1 0 ? URIGHT 1 0 // LWR +32'b101000?????????????????????????? 0 0 0 0 1 1 ? ? ? ? // SB +32'b101001?????????????????????????? 0 0 0 0 1 1 ? ? ? ? // SH +32'b101011?????????????????????????? 0 0 0 0 1 1 ? ? ? ? // SW \ No newline at end of file diff --git a/tools/pcs.txt b/tools/pcs.txt index 5eb2654..0841b8f 100644 --- a/tools/pcs.txt +++ b/tools/pcs.txt @@ -55,9 +55,11 @@ 32'b011100???????????????00000000010 0 0 0 0 // MUL 32'b100000?????????????????????????? 0 0 0 0 // LB 32'b100001?????????????????????????? 0 0 0 0 // LH +32'h100010?????????????????????????? 0 0 0 0 // LWL 32'b100011?????????????????????????? 0 0 0 0 // LW 32'b100100?????????????????????????? 0 0 0 0 // LBU 32'b100101?????????????????????????? 0 0 0 0 // LHU +32'h100110?????????????????????????? 0 0 0 0 // LWR 32'b101000?????????????????????????? 0 0 0 0 // SB 32'b101001?????????????????????????? 0 0 0 0 // SH 32'b101011?????????????????????????? 0 0 0 0 // SW \ No newline at end of file diff --git a/tools/privilege.txt b/tools/privilege.txt index 3c7a8fd..e760b42 100644 --- a/tools/privilege.txt +++ b/tools/privilege.txt @@ -55,9 +55,11 @@ 32'b011100???????????????00000000010 0 // MUL 32'b100000?????????????????????????? 0 // LB 32'b100001?????????????????????????? 0 // LH +32'h100010?????????????????????????? 0 // LWL 32'b100011?????????????????????????? 0 // LW 32'b100100?????????????????????????? 0 // LBU 32'b100101?????????????????????????? 0 // LHU +32'h100110?????????????????????????? 0 // LWR 32'b101000?????????????????????????? 0 // SB 32'b101001?????????????????????????? 0 // SH 32'b101011?????????????????????????? 0 // SW \ No newline at end of file diff --git a/tools/wctrl.txt b/tools/wctrl.txt index 6bc82ad..024214c 100644 --- a/tools/wctrl.txt +++ b/tools/wctrl.txt @@ -55,9 +55,11 @@ 32'b011100???????????????00000000010 1 RD 0 0 // MUL 32'b100000?????????????????????????? 1 RT 1 ? // LB 32'b100001?????????????????????????? 1 RT 1 ? // LH +32'h100010?????????????????????????? 1 RT 1 ? // LWL 32'b100011?????????????????????????? 1 RT 1 ? // LW 32'b100100?????????????????????????? 1 RT 1 ? // LBU 32'b100101?????????????????????????? 1 RT 1 ? // LHU +32'h100110?????????????????????????? 1 RT 1 ? // LWR 32'b101000?????????????????????????? 0 ? ? ? // SB 32'b101001?????????????????????????? 0 ? ? ? // SH 32'b101011?????????????????????????? 0 ? ? ? // SW \ No newline at end of file From 62b8efb8e3d3c60f50945dbfcb24f25f5a559927 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Fri, 27 Aug 2021 22:25:42 +0800 Subject: [PATCH 17/56] lwl/lwr: fix bug in addr and strberror --- resources/2021/soc_axi_func/testbench/tb2.sv | 2 +- src/Core/Datapath.sv | 4 +++- src/Core/Gadgets.sv | 5 ++++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/resources/2021/soc_axi_func/testbench/tb2.sv b/resources/2021/soc_axi_func/testbench/tb2.sv index 0c10b59..8da2dae 100644 --- a/resources/2021/soc_axi_func/testbench/tb2.sv +++ b/resources/2021/soc_axi_func/testbench/tb2.sv @@ -43,7 +43,7 @@ module tb2_top (); end end - soc_axi_lite_top2 #( + soc_axi_lite_top #( .SIMULATION(1'b1) ) soc_lite ( .resetn(resetn), diff --git a/src/Core/Datapath.sv b/src/Core/Datapath.sv index 4add86f..8f16742 100644 --- a/src/Core/Datapath.sv +++ b/src/Core/Datapath.sv @@ -155,6 +155,7 @@ module Datapath ( word_t E_I1_A; word_t E_I1_B; + word_t E_I1_ADDR; logic E_I1_Overflow; logic E_I1_STRBERROR; logic E_I1_NowExcValid; @@ -903,7 +904,8 @@ module Datapath ( assign tlb_tlbp = E.I1.MCtrl.TLBP; assign mem_i.req = E.I1.MCtrl.MR & E_I1_goWithoutOF & M.en & ~rstM; - assign mem_i.addr = E_I1_ForwardS + E.I1.imm; + assign E_I1_ADDR = E_I1_ForwardS + E.I1.imm; + assign mem_i.addr = |E.I1.MCtrl.ALR ? {E_I1_ADDR[31:2], 2'b0} : E_I1_ADDR; assign mem_i.size = {E.I1.MCtrl.SZ[1], E.I1.MCtrl.SZ[0] & ~E.I1.MCtrl.SZ[1]}; // assign mem_i.addr = E.I1.ALUOut; diff --git a/src/Core/Gadgets.sv b/src/Core/Gadgets.sv index 3c00eee..69acbca 100644 --- a/src/Core/Gadgets.sv +++ b/src/Core/Gadgets.sv @@ -102,9 +102,12 @@ module memerror ( always_comb casez (size) - 2'b1?: begin + 2'b11: begin error = (addr != 2'b00); end + 2'b10: begin + error = 1'b0; + end 2'b01: begin error = (addr[0] != 1'b0); end From 1f94aebd9de7a25b15db28c6d5cc1a2f05092205 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Sun, 29 Aug 2021 16:47:34 +0800 Subject: [PATCH 18/56] update control signals for swl/swr --- src/Core/Gadgets.sv | 2 ++ tools/decoder.py | 4 +++- tools/ectrl.txt | 4 +++- tools/global.txt | 4 +++- tools/mctrl0.txt | 4 +++- tools/mctrl1.txt | 8 +++++--- tools/pcs.txt | 4 +++- tools/privilege.txt | 4 +++- tools/wctrl.txt | 4 +++- 9 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/Core/Gadgets.sv b/src/Core/Gadgets.sv index 69acbca..610d24c 100644 --- a/src/Core/Gadgets.sv +++ b/src/Core/Gadgets.sv @@ -82,7 +82,9 @@ module instr_valid ( 32'b100110??????????????????????????: valid = 1'b1; // LWR 32'b101000??????????????????????????: valid = 1'b1; // SB 32'b101001??????????????????????????: valid = 1'b1; // SH + 32'b101010??????????????????????????: valid = 1'b1; // SWL 32'b101011??????????????????????????: valid = 1'b1; // SW + 32'b101110??????????????????????????: valid = 1'b1; // SWR // 32'b101111?????00000????????????????: valid = 1'b1; // I-Cache Index Invalid // 32'b101111?????01000????????????????: valid = 1'b1; // I-Cache Index Store Tag // 32'b101111?????10000????????????????: valid = 1'b1; // I-Cache Hit Invalid diff --git a/tools/decoder.py b/tools/decoder.py index b30a8a9..b6d03d9 100644 --- a/tools/decoder.py +++ b/tools/decoder.py @@ -62,7 +62,9 @@ table = [ ('100110??????????????????????????', 'LWR'), ('101000??????????????????????????', 'SB'), ('101001??????????????????????????', 'SH'), + ('101010??????????????????????????', 'SWL'), ('101011??????????????????????????', 'SW'), + ('101110??????????????????????????', 'SWR'), ] class Boolean: @@ -83,7 +85,7 @@ class Boolean: for inst, name in table: inst = list(Boolean(x) for x in inst[::-1]) - # print('=====', name, '=====') + print('=====', name, '=====') ctrl = {} ctrl['BJRJ'] = (~inst[27] & (~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[5] & ~inst[4] & inst[3] & ~inst[2] | ~inst[31] & ~inst[29] & inst[28]) | inst[27] & ~inst[31] & ~inst[29]) & ~inst[26] | ~inst[31] & ~inst[29] & inst[26] diff --git a/tools/ectrl.txt b/tools/ectrl.txt index acdb3b0..a5e0ac7 100644 --- a/tools/ectrl.txt +++ b/tools/ectrl.txt @@ -62,4 +62,6 @@ 32'h100110?????????????????????????? ADD 0 RS 1 1 IMM 1 ? IX 0 1 // LWR 32'b101000?????????????????????????? ADD 0 RS 1 1 IMM 1 ? IX 0 1 // SB 32'b101001?????????????????????????? ADD 0 RS 1 1 IMM 1 ? IX 0 1 // SH -32'b101011?????????????????????????? ADD 0 RS 1 1 IMM 1 ? IX 0 1 // SW \ No newline at end of file +32'b101010?????????????????????????? ADD 0 RS 1 1 IMM 1 ? IX 0 1 // SWL +32'b101011?????????????????????????? ADD 0 RS 1 1 IMM 1 ? IX 0 1 // SW +32'b101110?????????????????????????? ADD 0 RS 1 1 IMM 1 ? IX 0 1 // SWR \ No newline at end of file diff --git a/tools/global.txt b/tools/global.txt index 297136a..78a93e7 100644 --- a/tools/global.txt +++ b/tools/global.txt @@ -62,4 +62,6 @@ 32'h100110?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // LWR 32'b101000?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // SB 32'b101001?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // SH -32'b101011?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // SW \ No newline at end of file +32'b101010?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // SWL +32'b101011?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // SW +32'b101110?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // SWR \ No newline at end of file diff --git a/tools/mctrl0.txt b/tools/mctrl0.txt index 0707927..b4a4cba 100644 --- a/tools/mctrl0.txt +++ b/tools/mctrl0.txt @@ -62,4 +62,6 @@ 32'h100110?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // LWR 32'b101000?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // SB 32'b101001?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // SH -32'b101011?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // SW \ No newline at end of file +32'b101010?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // SWL +32'b101011?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // SW +32'b101110?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // SWR \ No newline at end of file diff --git a/tools/mctrl1.txt b/tools/mctrl1.txt index 1ef8cc9..12cf383 100644 --- a/tools/mctrl1.txt +++ b/tools/mctrl1.txt @@ -60,6 +60,8 @@ 32'b100100?????????????????????????? 0 0 0 0 1 0 0 ALIGN 0 0 // LBU 32'b100101?????????????????????????? 0 0 0 0 1 0 0 ALIGN 0 0 // LHU 32'h100110?????????????????????????? 0 0 0 0 1 0 ? URIGHT 1 0 // LWR -32'b101000?????????????????????????? 0 0 0 0 1 1 ? ? ? ? // SB -32'b101001?????????????????????????? 0 0 0 0 1 1 ? ? ? ? // SH -32'b101011?????????????????????????? 0 0 0 0 1 1 ? ? ? ? // SW \ No newline at end of file +32'b101000?????????????????????????? 0 0 0 0 1 1 ? ALIGN ? ? // SB +32'b101001?????????????????????????? 0 0 0 0 1 1 ? ALIGN ? ? // SH +32'b101010?????????????????????????? 0 0 0 0 1 1 ? ULEFT ? ? // SWL +32'b101011?????????????????????????? 0 0 0 0 1 1 ? ALIGN ? ? // SW +32'b101110?????????????????????????? 0 0 0 0 1 1 ? URIGHT ? ? // SWR \ No newline at end of file diff --git a/tools/pcs.txt b/tools/pcs.txt index 0841b8f..a668c6d 100644 --- a/tools/pcs.txt +++ b/tools/pcs.txt @@ -62,4 +62,6 @@ 32'h100110?????????????????????????? 0 0 0 0 // LWR 32'b101000?????????????????????????? 0 0 0 0 // SB 32'b101001?????????????????????????? 0 0 0 0 // SH -32'b101011?????????????????????????? 0 0 0 0 // SW \ No newline at end of file +32'b101010?????????????????????????? 0 0 0 0 // SWL +32'b101011?????????????????????????? 0 0 0 0 // SW +32'b101110?????????????????????????? 0 0 0 0 // SWR \ No newline at end of file diff --git a/tools/privilege.txt b/tools/privilege.txt index e760b42..846fafc 100644 --- a/tools/privilege.txt +++ b/tools/privilege.txt @@ -62,4 +62,6 @@ 32'h100110?????????????????????????? 0 // LWR 32'b101000?????????????????????????? 0 // SB 32'b101001?????????????????????????? 0 // SH -32'b101011?????????????????????????? 0 // SW \ No newline at end of file +32'b101010?????????????????????????? 0 // SWL +32'b101011?????????????????????????? 0 // SW +32'b101110?????????????????????????? 0 // SWR \ No newline at end of file diff --git a/tools/wctrl.txt b/tools/wctrl.txt index 024214c..d61bce8 100644 --- a/tools/wctrl.txt +++ b/tools/wctrl.txt @@ -62,4 +62,6 @@ 32'h100110?????????????????????????? 1 RT 1 ? // LWR 32'b101000?????????????????????????? 0 ? ? ? // SB 32'b101001?????????????????????????? 0 ? ? ? // SH -32'b101011?????????????????????????? 0 ? ? ? // SW \ No newline at end of file +32'b101010?????????????????????????? 0 ? ? ? // SWL +32'b101011?????????????????????????? 0 ? ? ? // SW +32'b101110?????????????????????????? 0 ? ? ? // SWR \ No newline at end of file From 6cc760be79051dd414175abda9d918a607302fc2 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Sun, 29 Aug 2021 17:14:47 +0800 Subject: [PATCH 19/56] SWL/SWR: update Datapath.sv and Gadgets.sv --- README.md | 100 +++++++++++++++++++------------------------ src/Core/Datapath.sv | 11 ++--- src/Core/Gadgets.sv | 13 +++++- 3 files changed, 62 insertions(+), 62 deletions(-) diff --git a/README.md b/README.md index 3ea8b89..3e8db1e 100644 --- a/README.md +++ b/README.md @@ -6,15 +6,6 @@ Our awesome `MIPS` CPU written in `SystemVerilog` for Loongson Cup ``` . ├── resources <-- 资源包 -│ └── 2021 <-- 2021年资源包 -│ ├── cpu132_gettrace <-- 性能测试基准(gs132) -│ ├── soc_axi_func <-- AXI功能测试 -│ ├── soc_axi_perf <-- AXI性能测试 -│ ├── soc_axi_system <-- AXI系统测试 -│ └── soft <-- 测试用程序 -│ ├── func <-- 功能测试 -│ ├── memory_game <-- 记忆游戏 -│ └── perf_func <-- 性能测试 ├── src <-- CPU设计代码 │ ├── AXI <-- AXI总线交互 │ ├── Cache <-- Cache @@ -22,12 +13,11 @@ Our awesome `MIPS` CPU written in `SystemVerilog` for Loongson Cup │ ├── CP0 <-- CP0协处理器 │ ├── include <-- 头文件 │ ├── IP <-- 用到的IP -│ ├── MMU <-- 地址转换单元 -│ └── testbench <-- 测试脚本 -└── tools <-- controller生成器 +│ └── MMU <-- 地址转换单元 +└── tools <-- 控制信号生成器 ``` -## TODO & Notice +## Progress - [x] 特权模式 - [x] `CP0`寄存器`Status.UM` :heavy_check_mark: @@ -38,46 +28,46 @@ Our awesome `MIPS` CPU written in `SystemVerilog` for Loongson Cup - [ ] 浮点运算指令报`Coprocessor Unusable`,同时`CP0`中新增`Cause.CE` :clock3: - [ ] 新增指令 -| Status | Instruction | Type | Tier | Comment | -| :---------: | :---------: | :------: | :--: | :-------------------------------------- | -| :clock3: | `Cache` | `SYS` | 3 | | -| :clock3: | `PREF` | `SYS` | 1 | Treat as `NOP` | -| :clock3: | `SYNC` | `SYS` | 1 | Treat as `NOP` (We're strongly ordered) | -| :clock3: | `WAIT` | `SYS` | 3 | | -| :clock3: | `TEQ` | `SYS` | 2 | | -| :clock3: | `TEQI` | `SYS` | 2 | | -| :clock3: | `TGE` | `SYS` | 2 | | -| :clock3: | `TGEI` | `SYS` | 2 | | -| :clock3: | `TGEIU` | `SYS` | 2 | | -| :clock3: | `TGEU` | `SYS` | 2 | | -| :clock3: | `TLT` | `SYS` | 2 | | -| :clock3: | `TLTI` | `SYS` | 2 | | -| :clock3: | `TLTIU` | `SYS` | 2 | | -| :clock3: | `TLTU` | `SYS` | 2 | | -| :clock3: | `TNE` | `SYS` | 2 | | -| :clock3: | `TNEI` | `SYS` | 2 | | -| :clock3: | `CLO` | `ARITH` | 2 | `RT == RD` | -| :clock3: | `CLZ` | `ARITH` | 2 | `RT == RD` | -| :clock3: | `MADD` | `ARITH` | 2 | | -| :clock3: | `MADDU` | `ARITH` | 2 | | -| :clock3: | `MSUB` | `ARITH` | 2 | | -| :clock3: | `MSUBU` | `ARITH` | 2 | | -| :clock3: | `MOVN` | `ARITH` | 1 | | -| :clock3: | `MOVZ` | `ARITH` | 1 | | -| :clock3: | `LL` | `MEM` | 3 | | -| :hourglass: | `LWL` | `MEM` | 1 | | -| :hour | `LWR` | `MEM` | 1 | | -| :clock3: | `SC` | `MEM` | 3 | | -| :hourglass: | `SWL` | `MEM` | 1 | | -| :hourglass: | `SWR` | `MEM` | 1 | | -| :clock3: | `MOVF` | `FP` | 2 | | -| :clock3: | `MOVT` | `FP` | 2 | | -| :clock3: | `BEQL` | `BRANCH` | 3 | | -| :clock3: | `BGEZALL` | `BRANCH` | 3 | | -| :clock3: | `BGEZL` | `BRANCH` | 3 | | -| :clock3: | `BGTZL` | `BRANCH` | 3 | | -| :clock3: | `BLEZL` | `BRANCH` | 3 | | -| :clock3: | `BLTZALL` | `BRANCH` | 3 | | -| :clock3: | `BLTZL` | `BRANCH` | 3 | | -| :clock3: | `BNEL` | `BRANCH` | 3 | | +| Status | Instruction | Type | Tier | Comment | +| :----------------: | :---------: | :------: | :--: | :-------------------------------------- | +| :clock3: | `Cache` | `SYS` | 2 | | +| :clock3: | `PREF` | `SYS` | 1 | Treat as `NOP` | +| :clock3: | `SYNC` | `SYS` | 1 | Treat as `NOP` (We're strongly ordered) | +| :clock3: | `WAIT` | `SYS` | 3 | | +| :clock3: | `TEQ` | `SYS` | 2 | | +| :clock3: | `TEQI` | `SYS` | 2 | | +| :clock3: | `TGE` | `SYS` | 2 | | +| :clock3: | `TGEI` | `SYS` | 2 | | +| :clock3: | `TGEIU` | `SYS` | 2 | | +| :clock3: | `TGEU` | `SYS` | 2 | | +| :clock3: | `TLT` | `SYS` | 2 | | +| :clock3: | `TLTI` | `SYS` | 2 | | +| :clock3: | `TLTIU` | `SYS` | 2 | | +| :clock3: | `TLTU` | `SYS` | 2 | | +| :clock3: | `TNE` | `SYS` | 2 | | +| :clock3: | `TNEI` | `SYS` | 2 | | +| :clock3: | `CLO` | `ARITH` | 2 | `RT == RD` | +| :clock3: | `CLZ` | `ARITH` | 2 | `RT == RD` | +| :clock3: | `MADD` | `ARITH` | 2 | | +| :clock3: | `MADDU` | `ARITH` | 2 | | +| :clock3: | `MSUB` | `ARITH` | 2 | | +| :clock3: | `MSUBU` | `ARITH` | 2 | | +| :clock3: | `MOVN` | `ARITH` | 1 | | +| :clock3: | `MOVZ` | `ARITH` | 1 | | +| :clock3: | `LL` | `MEM` | 3 | | +| :heavy_check_mark: | `LWL` | `MEM` | 1 | 需要补充测试 | +| :heavy_check_mark: | `LWR` | `MEM` | 1 | 需要补充测试 | +| :clock3: | `SC` | `MEM` | 3 | | +| :hourglass: | `SWL` | `MEM` | 1 | | +| :hourglass: | `SWR` | `MEM` | 1 | | +| :clock3: | `MOVF` | `FP` | 2 | | +| :clock3: | `MOVT` | `FP` | 2 | | +| :clock3: | `BEQL` | `BRANCH` | 3 | | +| :clock3: | `BGEZALL` | `BRANCH` | 3 | | +| :clock3: | `BGEZL` | `BRANCH` | 3 | | +| :clock3: | `BGTZL` | `BRANCH` | 3 | | +| :clock3: | `BLEZL` | `BRANCH` | 3 | | +| :clock3: | `BLTZALL` | `BRANCH` | 3 | | +| :clock3: | `BLTZL` | `BRANCH` | 3 | | +| :clock3: | `BNEL` | `BRANCH` | 3 | | diff --git a/src/Core/Datapath.sv b/src/Core/Datapath.sv index 8f16742..79ec92e 100644 --- a/src/Core/Datapath.sv +++ b/src/Core/Datapath.sv @@ -1190,11 +1190,12 @@ module Datapath ( assign c0_tlbp = M.I1.MCtrl.TLBP & M.en; assign mem_i.wr = M.I1.MCtrl.MWR; memoutput M_I1_memoutput ( - M.I1.ALUOut[1:0], - M_I1_ForwardT, - M.I1.MCtrl.SZ, - mem_i.wdata, - mem_i.wstrb + .addr (M.I1.ALUOut[1:0]), + .data (M_I1_ForwardT), + .size (M.I1.MCtrl.SZ), + .alr (M.I1.MCtrl.ALR), + .wdata(mem_i.wdata), + .wstrb(mem_i.wstrb) ); mux4 #(8) M_I1_Byte_mux ( diff --git a/src/Core/Gadgets.sv b/src/Core/Gadgets.sv index 610d24c..53875f3 100644 --- a/src/Core/Gadgets.sv +++ b/src/Core/Gadgets.sv @@ -123,16 +123,25 @@ module memoutput ( input logic [1:0] addr, input word_t data, input logic [1:0] size, + input ALR_t alr, output word_t wdata, output logic [3:0] wstrb ); - always_comb casez (size) - 2'b1?: begin + 2'b11: begin wdata = data; wstrb = 4'b1111; end + 2'b10: begin + wdata = data; + case (addr) + 2'b11: begin wstrb = alr[0] ? 4'b1111 : 4'b1000; end + 2'b10: begin wstrb = alr[0] ? 4'b0111 : 4'b1100; end + 2'b01: begin wstrb = alr[0] ? 4'b0011 : 4'b1110; end + 2'b00: begin wstrb = alr[0] ? 4'b0001 : 4'b1111; end + endcase + end 2'b01: begin wdata = {2{data[15:0]}}; wstrb = addr[1] ? 4'b1100 : 4'b0011; From cf9d3e8ed027ed28b419a84980d75ad10bd0e55f Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Sun, 29 Aug 2021 20:16:57 +0800 Subject: [PATCH 20/56] fix bug in SWR --- README.md | 26 +++++++++++++------------- src/Core/Gadgets.sv | 25 +++++++++++++++++++++---- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 3e8db1e..99a38cb 100644 --- a/README.md +++ b/README.md @@ -31,9 +31,9 @@ Our awesome `MIPS` CPU written in `SystemVerilog` for Loongson Cup | Status | Instruction | Type | Tier | Comment | | :----------------: | :---------: | :------: | :--: | :-------------------------------------- | | :clock3: | `Cache` | `SYS` | 2 | | -| :clock3: | `PREF` | `SYS` | 1 | Treat as `NOP` | -| :clock3: | `SYNC` | `SYS` | 1 | Treat as `NOP` (We're strongly ordered) | -| :clock3: | `WAIT` | `SYS` | 3 | | +| :hourglass: | `PREF` | `SYS` | 1 | Treat as `NOP` | +| :hourglass: | `SYNC` | `SYS` | 1 | Treat as `NOP` (We're strongly ordered) | +| :clock3: | `WAIT` | `SYS` | 2 | | | :clock3: | `TEQ` | `SYS` | 2 | | | :clock3: | `TEQI` | `SYS` | 2 | | | :clock3: | `TGE` | `SYS` | 2 | | @@ -52,16 +52,16 @@ Our awesome `MIPS` CPU written in `SystemVerilog` for Loongson Cup | :clock3: | `MADDU` | `ARITH` | 2 | | | :clock3: | `MSUB` | `ARITH` | 2 | | | :clock3: | `MSUBU` | `ARITH` | 2 | | -| :clock3: | `MOVN` | `ARITH` | 1 | | -| :clock3: | `MOVZ` | `ARITH` | 1 | | -| :clock3: | `LL` | `MEM` | 3 | | -| :heavy_check_mark: | `LWL` | `MEM` | 1 | 需要补充测试 | -| :heavy_check_mark: | `LWR` | `MEM` | 1 | 需要补充测试 | -| :clock3: | `SC` | `MEM` | 3 | | -| :hourglass: | `SWL` | `MEM` | 1 | | -| :hourglass: | `SWR` | `MEM` | 1 | | -| :clock3: | `MOVF` | `FP` | 2 | | -| :clock3: | `MOVT` | `FP` | 2 | | +| :clock3: | `MOVN` | `ARITH` | 2 | | +| :clock3: | `MOVZ` | `ARITH` | 2 | | +| :hourglass: | `LL` | `MEM` | 1 | Treat as `LW` | +| :heavy_check_mark: | `LWL` | `MEM` | 1 | | +| :heavy_check_mark: | `LWR` | `MEM` | 1 | | +| :hourglass: | `SC` | `MEM` | 1 | Treat as `SW` | +| :heavy_check_mark: | `SWL` | `MEM` | 1 | | +| :heavy_check_mark: | `SWR` | `MEM` | 1 | | +| :clock3: | `MOVF` | `FP` | 3 | | +| :clock3: | `MOVT` | `FP` | 3 | | | :clock3: | `BEQL` | `BRANCH` | 3 | | | :clock3: | `BGEZALL` | `BRANCH` | 3 | | | :clock3: | `BGEZL` | `BRANCH` | 3 | | diff --git a/src/Core/Gadgets.sv b/src/Core/Gadgets.sv index 53875f3..9f6623d 100644 --- a/src/Core/Gadgets.sv +++ b/src/Core/Gadgets.sv @@ -127,6 +127,7 @@ module memoutput ( output word_t wdata, output logic [3:0] wstrb ); + // TODO: wdata fill zero or replica always_comb casez (size) 2'b11: begin @@ -136,10 +137,26 @@ module memoutput ( 2'b10: begin wdata = data; case (addr) - 2'b11: begin wstrb = alr[0] ? 4'b1111 : 4'b1000; end - 2'b10: begin wstrb = alr[0] ? 4'b0111 : 4'b1100; end - 2'b01: begin wstrb = alr[0] ? 4'b0011 : 4'b1110; end - 2'b00: begin wstrb = alr[0] ? 4'b0001 : 4'b1111; end + 2'b11: begin + wstrb = alr[0] ? 4'b1111 : 4'b1000; + wdata = alr[0] ? data + : {data[7:0], data[31:8]}; + end + 2'b10: begin + wstrb = alr[0] ? 4'b0111 : 4'b1100; + wdata = alr[0] ? {data[7:0], data[31:8]} + : {data[15:0], data[31:16]}; + end + 2'b01: begin + wstrb = alr[0] ? 4'b0011 : 4'b1110; + wdata = alr[0] ? {data[15:0], data[31:16]} + : {data[23:0], data[31:24]}; + end + 2'b00: begin + wstrb = alr[0] ? 4'b0001 : 4'b1111; + wdata = alr[0] ? {data[23:0], data[31:24]} + : data; + end endcase end 2'b01: begin From eea7b6bbda943ca42493e7745221406572613a3d Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Sun, 29 Aug 2021 20:17:42 +0800 Subject: [PATCH 21/56] add lwl lwr swl swr test cases --- resources/2021/soc_axi_func/testbench/tb2.sv | 19 ++++---- resources/2021/soft/func/inst/inst_test.h | 46 ++++++++++++++++++++ resources/2021/soft/func/inst/n90_lwl.S | 41 +++++++++++++++++ resources/2021/soft/func/inst/n91_lwr.S | 41 +++++++++++++++++ resources/2021/soft/func/inst/n92_swl.S | 41 +++++++++++++++++ resources/2021/soft/func/inst/n93_swr.S | 41 +++++++++++++++++ resources/2021/soft/func/start.S | 18 +++++++- tools/mctrl1.txt | 12 ++--- 8 files changed, 243 insertions(+), 16 deletions(-) create mode 100644 resources/2021/soft/func/inst/n90_lwl.S create mode 100644 resources/2021/soft/func/inst/n91_lwr.S create mode 100644 resources/2021/soft/func/inst/n92_swl.S create mode 100644 resources/2021/soft/func/inst/n93_swr.S diff --git a/resources/2021/soc_axi_func/testbench/tb2.sv b/resources/2021/soc_axi_func/testbench/tb2.sv index 8da2dae..b9b8677 100644 --- a/resources/2021/soc_axi_func/testbench/tb2.sv +++ b/resources/2021/soc_axi_func/testbench/tb2.sv @@ -4,6 +4,7 @@ `define TRACE_REF_FILE "../../../../../../../cpu132_gettrace/golden_trace.txt" `define CONFREG_NUM_REG soc_lite.u_confreg.num_data `define CONFREG_OPEN_TRACE soc_lite.u_confreg.open_trace +//`define CONFREG_OPEN_TRACE 1'b0 `define CONFREG_NUM_MONITOR soc_lite.u_confreg.num_monitor `define CONFREG_UART_DISPLAY soc_lite.u_confreg.write_uart_valid `define CONFREG_UART_DATA soc_lite.u_confreg.write_uart_data @@ -84,11 +85,11 @@ module tb2_top (); assign debug_wb_rf_wen = soc_lite.debug_wb_rf_wen; assign debug_wb_rf_wnum = soc_lite.debug_wb_rf_wnum; assign debug_wb_rf_wdata = soc_lite.debug_wb_rf_wdata; - assign debug_wb1_pc = soc_lite.debug_wb1_pc; - assign debug_wb1_rf_wen = soc_lite.debug_wb1_rf_wen; - assign debug_wb1_rf_wnum = soc_lite.debug_wb1_rf_wnum; - assign debug_wb1_rf_wdata = soc_lite.debug_wb1_rf_wdata; - assign debug_wb_pc_A = soc_lite.debug_wb_pc_A; + assign debug_wb1_pc = soc_lite.u_cpu.debug_wb1_pc; + assign debug_wb1_rf_wen = soc_lite.u_cpu.debug_wb1_rf_wen; + assign debug_wb1_rf_wnum = soc_lite.u_cpu.debug_wb1_rf_wnum; + assign debug_wb1_rf_wdata = soc_lite.u_cpu.debug_wb1_rf_wdata; + assign debug_wb_pc_A = soc_lite.u_cpu.debug_wb_pc_A; // open the trace file; integer trace_ref; @@ -145,7 +146,7 @@ module tb2_top (); #2; if (!resetn) begin debug_wb_err <= 1'b0; - end else if (!debug_end && `CONFREG_OPEN_TRACE) begin + end else if (!debug_end) begin if (debug_wb_pc_A) begin dbg_0_rf_wen <= debug_wb1_rf_wen; dbg_0_pc <= debug_wb1_pc; @@ -177,7 +178,7 @@ module tb2_top (); dbg_1_pc, dbg_1_rf_wnum, dbg_1_rf_wdata, |dbg_1_rf_wen); end - if (|dbg_0_rf_wen && dbg_0_rf_wnum != 5'd0) begin + if (|dbg_0_rf_wen && dbg_0_rf_wnum != 5'd0 && `CONFREG_OPEN_TRACE) begin if ( (dbg_0_pc !== ref_trace[0].ref_wb_pc ) || (dbg_0_rf_wnum !== ref_trace[0].ref_wb_rf_wnum ) || (dbg_0_rf_wdata !== ref_trace[0].ref_wb_rf_wdata) @@ -198,7 +199,7 @@ module tb2_top (); $finish; end else ref_trace.pop_front(); end - if (|dbg_1_rf_wen && dbg_1_rf_wnum != 5'd0) begin + if (|dbg_1_rf_wen && dbg_1_rf_wnum != 5'd0 && `CONFREG_OPEN_TRACE) begin if ( (dbg_1_pc !== ref_trace[0].ref_wb_pc ) || (dbg_1_rf_wnum !== ref_trace[0].ref_wb_rf_wnum ) || (dbg_1_rf_wdata !== ref_trace[0].ref_wb_rf_wdata) @@ -266,7 +267,7 @@ module tb2_top (); end end - //妯℃嫙涓插彛鎵撳嵃 + // Uart Display logic uart_display; logic [7:0] uart_data; assign uart_display = `CONFREG_UART_DISPLAY; diff --git a/resources/2021/soft/func/inst/inst_test.h b/resources/2021/soft/func/inst/inst_test.h index 2fb3916..64c19b2 100644 --- a/resources/2021/soft/func/inst/inst_test.h +++ b/resources/2021/soft/func/inst/inst_test.h @@ -1290,3 +1290,49 @@ mtc0 v1, c0_cause; \ 1: b 1b; \ nop + +/*90*/ +#define TEST_LWL(data, base_addr, offset, offset_align, ref, confuse) \ + LI(t1, data); \ + LI(t0, base_addr); \ + LI(v1, ref); \ + LI(v0, confuse); \ + sw t1, offset_align(t0); \ + lwl v0, offset(t0); \ + bne v0, v1, inst_error; \ + nop + +/*91*/ +#define TEST_LWR(data, base_addr, offset, offset_align, ref, confuse) \ + LI(t1, data); \ + LI(t0, base_addr); \ + LI(v1, ref); \ + LI(v0, confuse); \ + sw t1, offset_align(t0); \ + lwr v0, offset(t0); \ + bne v0, v1, inst_error; \ + nop + +/*92*/ +#define TEST_SWL(data, base_addr, offset, offset_align, ref, confuse) \ + LI(t1, data); \ + LI(t0, base_addr); \ + LI(v0, confuse); \ + LI(v1, ref); \ + sw v0, offset_align(t0); \ + swl t1, offset(t0); \ + lw v0, offset_align(t0); \ + bne v0, v1, inst_error; \ + nop + +/*93*/ +#define TEST_SWR(data, base_addr, offset, offset_align, ref, confuse) \ + LI(t1, data); \ + LI(t0, base_addr); \ + LI(v0, confuse); \ + LI(v1, ref); \ + sw v0, offset_align(t0); \ + swr t1, offset(t0); \ + lw v0, offset_align(t0); \ + bne v0, v1, inst_error; \ + nop diff --git a/resources/2021/soft/func/inst/n90_lwl.S b/resources/2021/soft/func/inst/n90_lwl.S new file mode 100644 index 0000000..de4198f --- /dev/null +++ b/resources/2021/soft/func/inst/n90_lwl.S @@ -0,0 +1,41 @@ +#include +#include +#include + +LEAF(n90_lwl_test) + .set noreorder + addiu s0, s0 ,1 + li s2, 0x0 +###test inst + TEST_LWL(0xc822c7e8, 0x800d34c0, 0x000066a8, 0x000066a8, 0xE8B6C7D8, 0xA5B6C7D8) + TEST_LWL(0xc822c7e8, 0x800d34c0, 0x000066a9, 0x000066a8, 0xC7E8C7D8, 0xA5B6C7D8) + TEST_LWL(0xc822c7e8, 0x800d34c0, 0x000066aA, 0x000066a8, 0x22C7E8D8, 0xA5B6C7D8) + TEST_LWL(0xc822c7e8, 0x800d34c0, 0x000066aB, 0x000066a8, 0xC822C7E8, 0xA5B6C7D8) + + TEST_LWL(0x71737c10, 0x800df660, 0x000002e4, 0x000002e4, 0x10B6C7D8, 0xA5B6C7D8) + TEST_LWL(0x71737c10, 0x800df660, 0x000002e5, 0x000002e4, 0x7C10C7D8, 0xA5B6C7D8) + TEST_LWL(0x71737c10, 0x800df660, 0x000002e6, 0x000002e4, 0x737C10D8, 0xA5B6C7D8) + TEST_LWL(0x71737c10, 0x800df660, 0x000002e7, 0x000002e4, 0x71737C10, 0xA5B6C7D8) + + TEST_LWL(0x03682420, 0x800d24e4, 0x00001680, 0x00001680, 0x20B6C7D8, 0xA5B6C7D8) + TEST_LWL(0x03682420, 0x800d24e4, 0x00001681, 0x00001680, 0x2420C7D8, 0xA5B6C7D8) + TEST_LWL(0x03682420, 0x800d24e4, 0x00001682, 0x00001680, 0x682420D8, 0xA5B6C7D8) + TEST_LWL(0x03682420, 0x800d24e4, 0x00001683, 0x00001680, 0x03682420, 0xA5B6C7D8) + + TEST_LWL(0x6f59f5d3, 0x800dabdc, 0x000001b0, 0x000001b0, 0xd3B6C7D8, 0xA5B6C7D8) + TEST_LWL(0x6f59f5d3, 0x800dabdc, 0x000001b1, 0x000001b0, 0xf5d3C7D8, 0xA5B6C7D8) + TEST_LWL(0x6f59f5d3, 0x800dabdc, 0x000001b2, 0x000001b0, 0x59f5d3D8, 0xA5B6C7D8) + TEST_LWL(0x6f59f5d3, 0x800dabdc, 0x000001b3, 0x000001b0, 0x6f59f5d3, 0xA5B6C7D8) +###detect exception + bne s2, zero, inst_error + nop +###score ++ + addiu s3, s3, 1 +###output (s0<<24)|s3 +inst_error: + sll t1, s0, 24 + or t0, t1, s3 + sw t0, 0(s1) + jr ra + nop +END(n90_lwl_test) diff --git a/resources/2021/soft/func/inst/n91_lwr.S b/resources/2021/soft/func/inst/n91_lwr.S new file mode 100644 index 0000000..15b2597 --- /dev/null +++ b/resources/2021/soft/func/inst/n91_lwr.S @@ -0,0 +1,41 @@ +#include +#include +#include + +LEAF(n91_lwr_test) + .set noreorder + addiu s0, s0 ,1 + li s2, 0x0 +###test inst + TEST_LWR(0xc822c7e8, 0x800d34c0, 0x000066a8, 0x000066a8, 0xc822c7e8, 0xA5B6C7D8) + TEST_LWR(0xc822c7e8, 0x800d34c0, 0x000066a9, 0x000066a8, 0xA5c822c7, 0xA5B6C7D8) + TEST_LWR(0xc822c7e8, 0x800d34c0, 0x000066aA, 0x000066a8, 0xA5B6c822, 0xA5B6C7D8) + TEST_LWR(0xc822c7e8, 0x800d34c0, 0x000066aB, 0x000066a8, 0xA5B6C7c8, 0xA5B6C7D8) + + TEST_LWR(0x71737c10, 0x800df660, 0x000002e4, 0x000002e4, 0x71737c10, 0xA5B6C7D8) + TEST_LWR(0x71737c10, 0x800df660, 0x000002e5, 0x000002e4, 0xA571737c, 0xA5B6C7D8) + TEST_LWR(0x71737c10, 0x800df660, 0x000002e6, 0x000002e4, 0xA5B67173, 0xA5B6C7D8) + TEST_LWR(0x71737c10, 0x800df660, 0x000002e7, 0x000002e4, 0xA5B6C771, 0xA5B6C7D8) + + TEST_LWR(0x03682420, 0x800d24e4, 0x00001680, 0x00001680, 0x03682420, 0xA5B6C7D8) + TEST_LWR(0x03682420, 0x800d24e4, 0x00001681, 0x00001680, 0xA5036824, 0xA5B6C7D8) + TEST_LWR(0x03682420, 0x800d24e4, 0x00001682, 0x00001680, 0xA5B60368, 0xA5B6C7D8) + TEST_LWR(0x03682420, 0x800d24e4, 0x00001683, 0x00001680, 0xA5B6C703, 0xA5B6C7D8) + + TEST_LWR(0x6f59f5d3, 0x800dabdc, 0x000001b0, 0x000001b0, 0x6f59f5d3, 0xA5B6C7D8) + TEST_LWR(0x6f59f5d3, 0x800dabdc, 0x000001b1, 0x000001b0, 0xA56f59f5, 0xA5B6C7D8) + TEST_LWR(0x6f59f5d3, 0x800dabdc, 0x000001b2, 0x000001b0, 0xA5B66f59, 0xA5B6C7D8) + TEST_LWR(0x6f59f5d3, 0x800dabdc, 0x000001b3, 0x000001b0, 0xA5B6C76f, 0xA5B6C7D8) +###detect exception + bne s2, zero, inst_error + nop +###score ++ + addiu s3, s3, 1 +###output (s0<<24)|s3 +inst_error: + sll t1, s0, 24 + or t0, t1, s3 + sw t0, 0(s1) + jr ra + nop +END(n91_lwr_test) diff --git a/resources/2021/soft/func/inst/n92_swl.S b/resources/2021/soft/func/inst/n92_swl.S new file mode 100644 index 0000000..19723b9 --- /dev/null +++ b/resources/2021/soft/func/inst/n92_swl.S @@ -0,0 +1,41 @@ +#include +#include +#include + +LEAF(n92_swl_test) + .set noreorder + addiu s0, s0 ,1 + li s2, 0x0 +###test inst + TEST_SWL(0xc822c7e8, 0x800d34c0, 0x000066a8, 0x000066a8, 0xA5B6C7c8, 0xA5B6C7D8) + TEST_SWL(0xc822c7e8, 0x800d34c0, 0x000066a9, 0x000066a8, 0xA5B6c822, 0xA5B6C7D8) + TEST_SWL(0xc822c7e8, 0x800d34c0, 0x000066aA, 0x000066a8, 0xA5c822c7, 0xA5B6C7D8) + TEST_SWL(0xc822c7e8, 0x800d34c0, 0x000066aB, 0x000066a8, 0xc822c7e8, 0xA5B6C7D8) + + TEST_SWL(0x71737c10, 0x800df660, 0x000002e4, 0x000002e4, 0xA5B6C771, 0xA5B6C7D8) + TEST_SWL(0x71737c10, 0x800df660, 0x000002e5, 0x000002e4, 0xA5B67173, 0xA5B6C7D8) + TEST_SWL(0x71737c10, 0x800df660, 0x000002e6, 0x000002e4, 0xA571737c, 0xA5B6C7D8) + TEST_SWL(0x71737c10, 0x800df660, 0x000002e7, 0x000002e4, 0x71737c10, 0xA5B6C7D8) + + TEST_SWL(0x03682420, 0x800d24e4, 0x00001680, 0x00001680, 0xA5B6C703, 0xA5B6C7D8) + TEST_SWL(0x03682420, 0x800d24e4, 0x00001681, 0x00001680, 0xA5B60368, 0xA5B6C7D8) + TEST_SWL(0x03682420, 0x800d24e4, 0x00001682, 0x00001680, 0xA5036824, 0xA5B6C7D8) + TEST_SWL(0x03682420, 0x800d24e4, 0x00001683, 0x00001680, 0x03682420, 0xA5B6C7D8) + + TEST_SWL(0x6f59f5d3, 0x800dabdc, 0x000001b0, 0x000001b0, 0xA5B6C76f, 0xA5B6C7D8) + TEST_SWL(0x6f59f5d3, 0x800dabdc, 0x000001b1, 0x000001b0, 0xA5B66f59, 0xA5B6C7D8) + TEST_SWL(0x6f59f5d3, 0x800dabdc, 0x000001b2, 0x000001b0, 0xA56f59f5, 0xA5B6C7D8) + TEST_SWL(0x6f59f5d3, 0x800dabdc, 0x000001b3, 0x000001b0, 0x6f59f5d3, 0xA5B6C7D8) +###detect exception + bne s2, zero, inst_error + nop +###score ++ + addiu s3, s3, 1 +###output (s0<<24)|s3 +inst_error: + sll t1, s0, 24 + or t0, t1, s3 + sw t0, 0(s1) + jr ra + nop +END(n92_swl_test) diff --git a/resources/2021/soft/func/inst/n93_swr.S b/resources/2021/soft/func/inst/n93_swr.S new file mode 100644 index 0000000..29c1216 --- /dev/null +++ b/resources/2021/soft/func/inst/n93_swr.S @@ -0,0 +1,41 @@ +#include +#include +#include + +LEAF(n93_swr_test) + .set noreorder + addiu s0, s0 ,1 + li s2, 0x0 +###test inst + TEST_SWR(0xc822c7e8, 0x800d34c0, 0x000066a8, 0x000066a8, 0xc822c7e8, 0xA5B6C7D8) + TEST_SWR(0xc822c7e8, 0x800d34c0, 0x000066a9, 0x000066a8, 0x22c7e8D8, 0xA5B6C7D8) + TEST_SWR(0xc822c7e8, 0x800d34c0, 0x000066aA, 0x000066a8, 0xc7e8C7D8, 0xA5B6C7D8) + TEST_SWR(0xc822c7e8, 0x800d34c0, 0x000066aB, 0x000066a8, 0xe8B6C7D8, 0xA5B6C7D8) + + TEST_SWR(0x71737c10, 0x800df660, 0x000002e4, 0x000002e4, 0x71737c10, 0xA5B6C7D8) + TEST_SWR(0x71737c10, 0x800df660, 0x000002e5, 0x000002e4, 0x737c10D8, 0xA5B6C7D8) + TEST_SWR(0x71737c10, 0x800df660, 0x000002e6, 0x000002e4, 0x7c10C7D8, 0xA5B6C7D8) + TEST_SWR(0x71737c10, 0x800df660, 0x000002e7, 0x000002e4, 0x10B6C7D8, 0xA5B6C7D8) + + TEST_SWR(0x03682420, 0x800d24e4, 0x00001680, 0x00001680, 0x03682420, 0xA5B6C7D8) + TEST_SWR(0x03682420, 0x800d24e4, 0x00001681, 0x00001680, 0x682420D8, 0xA5B6C7D8) + TEST_SWR(0x03682420, 0x800d24e4, 0x00001682, 0x00001680, 0x2420C7D8, 0xA5B6C7D8) + TEST_SWR(0x03682420, 0x800d24e4, 0x00001683, 0x00001680, 0x20B6C7D8, 0xA5B6C7D8) + + TEST_SWR(0x6f59f5d3, 0x800dabdc, 0x000001b0, 0x000001b0, 0x6f59f5d3, 0xA5B6C7D8) + TEST_SWR(0x6f59f5d3, 0x800dabdc, 0x000001b1, 0x000001b0, 0x59f5d3D8, 0xA5B6C7D8) + TEST_SWR(0x6f59f5d3, 0x800dabdc, 0x000001b2, 0x000001b0, 0xf5d3C7D8, 0xA5B6C7D8) + TEST_SWR(0x6f59f5d3, 0x800dabdc, 0x000001b3, 0x000001b0, 0xd3B6C7D8, 0xA5B6C7D8) +###detect exception + bne s2, zero, inst_error + nop +###score ++ + addiu s3, s3, 1 +###output (s0<<24)|s3 +inst_error: + sll t1, s0, 24 + or t0, t1, s3 + sw t0, 0(s1) + jr ra + nop +END(n93_swr_test) diff --git a/resources/2021/soft/func/start.S b/resources/2021/soft/func/start.S index eb0f3c4..ab61cc9 100644 --- a/resources/2021/soft/func/start.S +++ b/resources/2021/soft/func/start.S @@ -2,7 +2,7 @@ #include #include -#define TEST_NUM 89 +#define TEST_NUM 93 ##s0, number @@ -651,6 +651,22 @@ kseg0_kseg1: nop jal wait_1s nop + jal n90_lwl_test + nop + jal wait_1s + nop + jal n91_lwr_test + nop + jal wait_1s + nop + jal n92_swl_test + nop + jal wait_1s + nop + jal n93_swr_test + nop + jal wait_1s + nop ###check io access LI (a0, IO_SIMU_ADDR) LI (t0, 0x1234) diff --git a/tools/mctrl1.txt b/tools/mctrl1.txt index 12cf383..8e26d0a 100644 --- a/tools/mctrl1.txt +++ b/tools/mctrl1.txt @@ -59,9 +59,9 @@ 32'b100011?????????????????????????? 0 0 0 0 1 0 ? ALIGN 0 0 // LW 32'b100100?????????????????????????? 0 0 0 0 1 0 0 ALIGN 0 0 // LBU 32'b100101?????????????????????????? 0 0 0 0 1 0 0 ALIGN 0 0 // LHU -32'h100110?????????????????????????? 0 0 0 0 1 0 ? URIGHT 1 0 // LWR -32'b101000?????????????????????????? 0 0 0 0 1 1 ? ALIGN ? ? // SB -32'b101001?????????????????????????? 0 0 0 0 1 1 ? ALIGN ? ? // SH -32'b101010?????????????????????????? 0 0 0 0 1 1 ? ULEFT ? ? // SWL -32'b101011?????????????????????????? 0 0 0 0 1 1 ? ALIGN ? ? // SW -32'b101110?????????????????????????? 0 0 0 0 1 1 ? URIGHT ? ? // SWR \ No newline at end of file +32'h100110?????????????????????????? 0 0 0 0 1 0 ? URIGHT 1 ? // LWR +32'b101000?????????????????????????? 0 0 0 0 1 1 ? ALIGN 0 0 // SB +32'b101001?????????????????????????? 0 0 0 0 1 1 ? ALIGN 0 0 // SH +32'b101010?????????????????????????? 0 0 0 0 1 1 ? ULEFT 0 1 // SWL +32'b101011?????????????????????????? 0 0 0 0 1 1 ? ALIGN 0 0 // SW +32'b101110?????????????????????????? 0 0 0 0 1 1 ? URIGHT 1 ? // SWR \ No newline at end of file From 0b872c9b7c46fd38577b81be55a29854d5cb568f Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Mon, 30 Aug 2021 13:11:40 +0800 Subject: [PATCH 22/56] add sync pref as nop --- src/Core/Controller.sv | 31 +++++++++++++++---------------- tools/ctrl_maker.py | 2 +- tools/decoder.py | 42 ++++++++++++++++++++++-------------------- tools/ectrl.txt | 4 +++- tools/global.txt | 4 +++- tools/mctrl0.txt | 4 +++- tools/mctrl1.txt | 4 +++- tools/pcs.txt | 4 +++- tools/privilege.txt | 4 +++- tools/wctrl.txt | 4 +++- 10 files changed, 59 insertions(+), 44 deletions(-) diff --git a/src/Core/Controller.sv b/src/Core/Controller.sv index a1c5ca6..221b10c 100644 --- a/src/Core/Controller.sv +++ b/src/Core/Controller.sv @@ -15,7 +15,7 @@ module Controller ( inst[15:11], 5'b11111, ctrl.RT, - {~inst[29] & (inst[31] | inst[30]) | inst[29] & ~inst[30], inst[26]}, + {~inst[29] & inst[30] | inst[29] & ~inst[30] | inst[31], inst[26]}, ctrl.RD ); @@ -34,18 +34,18 @@ module Controller ( assign ctrl.J = ~inst[31] & ~inst[29] & ~inst[28] & inst[27]; assign ctrl.BGO = ~inst[26] & (eq | inst[27] & ltz) | inst[26] & (~inst[27] & (~inst[28] & (inst[16] & ~ltz | ~inst[16] & ltz) | inst[28] & ~eq) | inst[27] & ~eq & ~ltz); - assign ctrl.PRV = inst[30] & ~inst[29]; + assign ctrl.PRV = ~inst[31] & inst[30] & ~inst[29]; assign ctrl.SYSCALL = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[3] & inst[2] & ~inst[0]; - assign ctrl.BREAK = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[3] & inst[2] & inst[0]; - assign ctrl.ERET = inst[30] & inst[4]; + assign ctrl.BREAK = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[3] & inst[2] & ~inst[1] & inst[0]; + assign ctrl.ERET = ~inst[31] & inst[30] & inst[4]; assign ctrl.OFA = ~inst[31] & ~inst[28] & ~inst[27] & ~inst[26] & (~inst[30] & inst[5] & ~inst[3] & ~inst[2] & ~inst[0] | inst[29]); - assign ctrl.ES = inst[31] | ~inst[30] & ~inst[28] & ~inst[27] & ~inst[26] & (inst[5] | inst[4] & inst[3] & ~inst[2] | ~inst[3] & inst[2]) | inst[29];; - assign ctrl.ET = ~inst[31] & ~inst[27] & ~inst[26] & (~inst[30] & ~inst[29] & ~inst[28] & (inst[5] | (~inst[1] & (~inst[4] & ~inst[3] & ~inst[0] | inst[4] & inst[3]) | inst[1] & (~inst[4] | inst[3]))) | inst[30] & inst[29]); - assign ctrl.DS = ~inst[31] & ~inst[29] & (inst[28] | ~inst[27] & (~inst[30] & ~inst[5] & ~inst[4] & inst[3] & ~inst[2] | inst[26])); + assign ctrl.ES = (~inst[30] & (~inst[28] & ~inst[27] & ~inst[26] & ((inst[4] & inst[3] & ~inst[2] | ~inst[3] & inst[2]) | inst[5]) | inst[31]) | inst[29]); + assign ctrl.ET = ~inst[27] & ~inst[26] & (~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & (~inst[1] & (~inst[0] & (~inst[3] & ~inst[4] | inst[3] & inst[4]) | inst[4] & inst[3] & inst[0]) | inst[1] & (~inst[4] | inst[3]) | inst[5]) | inst[30] & inst[29]); + assign ctrl.DS = ~inst[26] & (~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[5] & ~inst[4] & inst[3] & ~inst[2] | ~inst[31] & ~inst[29] & inst[28]) | ~inst[31] & ~inst[29] & (inst[28] | ~inst[27]) & inst[26]; assign ctrl.DT = ~inst[31] & ~inst[29] & inst[28] & ~inst[27]; - assign ctrl.DP0 = ~inst[31] & (~inst[30] | inst[29] | ~inst[25] | inst[4]); + assign ctrl.DP0 = ~inst[31] & (~inst[30] | inst[29] | ~inst[25] | inst[4]) | inst[31] & inst[30]; assign ctrl.DP1 = inst[26] | (~inst[30] & (inst[31] | inst[29] | inst[28] | inst[27] | ~inst[4]) | inst[30] & (~inst[29] & inst[25] | inst[3])); assign ctrl.ECtrl.OP.f_sl = ~inst[31] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & ~inst[3] & ~inst[1]; @@ -65,21 +65,20 @@ module Controller ( assign ctrl.MCtrl0.LW = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (inst[3] | inst[1] & inst[0]); assign ctrl.MCtrl0.HLS = HLS_t'({~inst[27] & ~inst[26] & (~inst[30] & ~inst[31] & ~inst[29] & ~inst[28] & inst[4] & inst[3] | inst[30] & inst[29]), ~inst[30] & inst[1], inst[0]}); assign ctrl.MCtrl0.C0D = inst[15:11]; - assign ctrl.MCtrl0.C0W = inst[30] & ~inst[29] & inst[23] & ~inst[3]; + assign ctrl.MCtrl0.C0W = ~inst[31] & inst[30] & ~inst[29] & inst[23] & ~inst[3]; assign ctrl.MCtrl0.SEL = inst[2:0]; assign ctrl.MCtrl0.RS0 = RS0_t'({~inst[30] & (inst[29] | inst[26] | ~inst[4]), inst[30], ~inst[29] & (inst[30] | ~inst[1])}); - assign ctrl.MCtrl1.MR = inst[31]; + assign ctrl.MCtrl1.MR = inst[31] & ~inst[30]; assign ctrl.MCtrl1.MWR = inst[29]; assign ctrl.MCtrl1.MX = ~inst[28]; assign ctrl.MCtrl1.ALR = ALR_t'({inst[28] & inst[27], ~inst[28] & inst[27] & ~inst[26]}); assign ctrl.MCtrl1.SZ = inst[27:26]; - assign ctrl.MCtrl1.TLBR = inst[30] & ~inst[29] & inst[25] & ~inst[3] & ~inst[1]; - assign ctrl.MCtrl1.TLBWI = inst[30] & ~inst[29] & inst[25] & ~inst[3] & inst[1]; - assign ctrl.MCtrl1.TLBWR = inst[30] & ~inst[29] & inst[25] & ~inst[3] & (inst[2] | ~inst[1]); - assign ctrl.MCtrl1.TLBP = inst[30] & ~inst[4] & inst[3]; + assign ctrl.MCtrl1.TLBR = ~inst[31] & inst[30] & ~inst[29] & inst[25] & ~inst[3] & ~inst[1]; + assign ctrl.MCtrl1.TLBWI = ~inst[31] & inst[30] & ~inst[29] & inst[25] & ~inst[3] & inst[1]; + assign ctrl.MCtrl1.TLBWR = ~inst[31] & inst[30] & ~inst[29] & inst[25] & ~inst[3] & (inst[2] | ~inst[1]); + assign ctrl.MCtrl1.TLBP = ~inst[31] & inst[30] & ~inst[4] & inst[3]; - assign ctrl.WCtrl.RW = ctrl.RD != 5'b00000 & (~inst[30] & (~inst[29] & (inst[31] | ~inst[28] & (~inst[27] & (~inst[26] & (~inst[3] & (~inst[4] | ~inst[0]) | inst[3] & (inst[5] | ~inst[4] & ~inst[2] & inst[0])) | inst[26] & inst[20]) | inst[27] & inst[26])) | inst[29] & ~inst[31]) | inst[30] & (inst[29] | ~inst[25] & ~inst[23])); - // assign ctrl.WCtrl.RW = ctrl.RD != 5'b00000 & (~inst[30] & (~inst[29] & (inst[31] | ~inst[28] & (~inst[27] & (~inst[26] & (~inst[3] & (~inst[4] | ~inst[0]) | inst[3] & (inst[5] | ~inst[4] & ~inst[2] & inst[0])) | inst[26] & inst[20]) | inst[27] & inst[26])) | inst[29] & ~inst[31]) | inst[30] & ~inst[25] & ~inst[23]); + assign ctrl.WCtrl.RW = ctrl.RD != 5'b00000 & (~inst[30] & (~inst[27] & (~inst[26] & (~inst[31] & (~inst[28] & (~inst[3] & (~inst[4] | ~inst[0]) | inst[3] & (~inst[4] & ~inst[2] & inst[0] | inst[5])) | inst[29]) | inst[31] & ~inst[29]) | inst[26] & (~inst[28] & (~inst[31] & (inst[29] | inst[20]) | inst[31] & ~inst[29]) | inst[28] & (~inst[31] & inst[29] | inst[31]))) | inst[27] & (~inst[26] & (~inst[31] & inst[29] | inst[31] & ~inst[29]) | inst[26] & (~inst[31] & (~inst[28] | inst[29]) | inst[31] & ~inst[29]))) | inst[30] & (~inst[31] & ~inst[25] & ~inst[23] | inst[29])); endmodule diff --git a/tools/ctrl_maker.py b/tools/ctrl_maker.py index 1c42741..c7fd510 100644 --- a/tools/ctrl_maker.py +++ b/tools/ctrl_maker.py @@ -1,4 +1,4 @@ -with open('mctrl1.txt') as f: +with open('wctrl.txt') as f: lines = f.readlines() title = lines[0].split() items = [x.split() for x in lines[1:]] diff --git a/tools/decoder.py b/tools/decoder.py index b6d03d9..d0afbfc 100644 --- a/tools/decoder.py +++ b/tools/decoder.py @@ -1,4 +1,5 @@ table = [ + ('000000000000000000000?????001111', 'SYNC'), ('00000000000???????????????000000', 'SLL'), ('00000000000???????????????000010', 'SRL'), ('00000000000???????????????000011', 'SRA'), @@ -65,6 +66,7 @@ table = [ ('101010??????????????????????????', 'SWL'), ('101011??????????????????????????', 'SW'), ('101110??????????????????????????', 'SWR'), + ('110011??????????????????????????', 'PREF'), ] class Boolean: @@ -89,23 +91,23 @@ for inst, name in table: ctrl = {} ctrl['BJRJ'] = (~inst[27] & (~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[5] & ~inst[4] & inst[3] & ~inst[2] | ~inst[31] & ~inst[29] & inst[28]) | inst[27] & ~inst[31] & ~inst[29]) & ~inst[26] | ~inst[31] & ~inst[29] & inst[26] - ctrl['B'] = ~inst[31] & ~inst[29] & (inst[28] | ~inst[27] & inst[26]) - ctrl['JR'] = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & ~inst[4] & inst[3] & ~inst[2] - ctrl['J'] = ~inst[31] & ~inst[29] & ~inst[28] & inst[27] + ctrl['B'] = ~inst[31] & ~inst[29] & (inst[28] | ~inst[27] & inst[26]) + ctrl['JR'] = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & ~inst[4] & inst[3] & ~inst[2] + ctrl['J'] = ~inst[31] & ~inst[29] & ~inst[28] & inst[27] - ctrl['PRV'] = inst[30] & ~inst[29]; + ctrl['PRV'] = ~inst[31] & inst[30] & ~inst[29] ctrl['SYSCALL'] = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[3] & inst[2] & ~inst[0] - ctrl['BREAK'] = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[3] & inst[2] & inst[0] - ctrl['ERET'] = inst[30] & inst[4] - ctrl['OFA'] = ~inst[31] & ~inst[28] & ~inst[27] & ~inst[26] & (~inst[30] & inst[5] & ~inst[3] & ~inst[2] & ~inst[0] | inst[29]) + ctrl['BREAK'] = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[3] & inst[2] & ~inst[1] & inst[0] + ctrl['ERET'] = ~inst[31] & inst[30] & inst[4] + ctrl['OFA'] = ~inst[31] & ~inst[28] & ~inst[27] & ~inst[26] & (~inst[30] & inst[5] & ~inst[3] & ~inst[2] & ~inst[0] | inst[29]) - ctrl['ES'] = inst[31] | ~inst[30] & ~inst[28] & ~inst[27] & ~inst[26] & (inst[5] | inst[4] & inst[3] & ~inst[2] | ~inst[3] & inst[2]) | inst[29] - ctrl['ET'] = ~inst[31] & ~inst[27] & ~inst[26] & (~inst[30] & ~inst[29] & ~inst[28] & (inst[5] | (~inst[1] & (~inst[4] & ~inst[3] & ~inst[0] | inst[4] & inst[3]) | inst[1] & (~inst[4] | inst[3]))) | inst[30] & inst[29]) - ctrl['DS'] = ~inst[31] & ~inst[29] & (inst[28] | ~inst[27] & (~inst[30] & ~inst[5] & ~inst[4] & inst[3] & ~inst[2] | inst[26])) + ctrl['ES'] = (~inst[30] & (~inst[28] & ~inst[27] & ~inst[26] & ((inst[4] & inst[3] & ~inst[2] | ~inst[3] & inst[2]) | inst[5]) | inst[31]) | inst[29]) + ctrl['ET'] = ~inst[27] & ~inst[26] & (~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & (~inst[1] & (~inst[0] & (~inst[3] & ~inst[4] | inst[3] & inst[4]) | inst[4] & inst[3] & inst[0]) | inst[1] & (~inst[4] | inst[3]) | inst[5]) | inst[30] & inst[29]) + ctrl['DS'] = ~inst[26] & (~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[5] & ~inst[4] & inst[3] & ~inst[2] | ~inst[31] & ~inst[29] & inst[28]) | ~inst[31] & ~inst[29] & (inst[28] | ~inst[27]) & inst[26] ctrl['DT'] = ~inst[31] & ~inst[29] & inst[28] & ~inst[27] - ctrl['DP0'] = ~inst[31] & (~inst[30] | inst[29] | ~inst[25] | inst[4]) + ctrl['DP0'] = ~inst[31] & (~inst[30] | inst[29] | ~inst[25] | inst[4]) | inst[31] & inst[30] ctrl['DP1'] = inst[26] | (~inst[30] & (inst[31] | inst[29] | inst[28] | inst[27] | ~inst[4]) | inst[30] & (~inst[29] & inst[25] | inst[3])) ctrl['ECtrl_OP_f_sl'] = ~inst[31] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & ~inst[3] & ~inst[1] @@ -120,23 +122,23 @@ for inst, name in table: ctrl['ECtrl_SA'] = (inst[31] | inst[29] | ~inst[26] & (inst[5] | inst[2]), inst[31] | (~inst[28] & (inst[29] | inst[26] | inst[5] | inst[3] | inst[2]) | inst[28] & (~inst[27] | ~inst[26]))) ctrl['ECtrl_SB'] = (inst[31] | inst[29], inst[26] | ~inst[5] & inst[3]) - ctrl['imm'] = (inst[28] & inst[27] & inst[26], inst[31] | ~inst[28]) + ctrl['imm'] = (inst[28] & inst[27] & inst[26], inst[31] | ~inst[28]) ctrl['MCtrl0_HW'] = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (inst[3] | ~inst[1] & inst[0]) ctrl['MCtrl0_LW'] = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (inst[3] | inst[1] & inst[0]) ctrl['MCtrl0_HLS'] = (~inst[27] & ~inst[26] & (~inst[30] & ~inst[31] & ~inst[29] & ~inst[28] & inst[4] & inst[3] | inst[30] & inst[29]), ~inst[30] & inst[1], inst[0]) - ctrl['MCtrl0_C0W'] = inst[30] & ~inst[29] & inst[23] & ~inst[3] + ctrl['MCtrl0_C0W'] = ~inst[31] & inst[30] & ~inst[29] & inst[23] & ~inst[3] ctrl['MCtrl0_RS0'] = (ctrl['DP1'], inst[30], ~inst[29] & (inst[30] | ~inst[1])) - ctrl['MCtrl1_MR'] = inst[31] + ctrl['MCtrl1_MR'] = inst[31] & ~inst[30] ctrl['MCtrl1_MWR'] = inst[29] ctrl['MCtrl1_MX'] = ~inst[28] ctrl['MCtrl1_ALR'] = (inst[28] & inst[27], ~inst[28] & inst[27] & ~inst[26]) - ctrl['MCtrl1_TLBR'] = inst[30] & ~inst[29] & inst[25] & ~inst[3] & ~inst[1] - ctrl['MCtrl1_TLBWI'] = inst[30] & ~inst[29] & inst[25] & ~inst[3] & inst[1] - ctrl['MCtrl1_TLBWR'] = inst[30] & ~inst[29] & inst[25] & ~inst[3] & (inst[2] | ~inst[1]) - ctrl['MCtrl1_TLBP'] = inst[30] & ~inst[4] & inst[3] + ctrl['MCtrl1_TLBR'] = ~inst[31] & inst[30] & ~inst[29] & inst[25] & ~inst[3] & ~inst[1] + ctrl['MCtrl1_TLBWI'] = ~inst[31] & inst[30] & ~inst[29] & inst[25] & ~inst[3] & inst[1] + ctrl['MCtrl1_TLBWR'] = ~inst[31] & inst[30] & ~inst[29] & inst[25] & ~inst[3] & (inst[2] | ~inst[1]) + ctrl['MCtrl1_TLBP'] = ~inst[31] & inst[30] & ~inst[4] & inst[3] - ctrl['WCtrl_RW'] = (~inst[30] & (~inst[29] & (inst[31] | ~inst[28] & (~inst[27] & (~inst[26] & (~inst[3] & (~inst[4] | ~inst[0]) | inst[3] & (inst[5] | ~inst[4] & ~inst[2] & inst[0])) | inst[26] & inst[20]) | inst[27] & inst[26])) | inst[29] & ~inst[31]) | inst[30] & ~inst[25] & ~inst[23]) - ctrl['RD'] = (~inst[29] & (inst[31] | inst[30]) | inst[29] & ~inst[30], inst[26]) + ctrl['WCtrl_RW'] = (~inst[30] & (~inst[27] & (~inst[26] & (~inst[31] & (~inst[28] & (~inst[3] & (~inst[4] | ~inst[0]) | inst[3] & (~inst[4] & ~inst[2] & inst[0] | inst[5])) | inst[29]) | inst[31] & ~inst[29]) | inst[26] & (~inst[28] & (~inst[31] & (inst[29] | inst[20]) | inst[31] & ~inst[29]) | inst[28] & (~inst[31] & inst[29] | inst[31]))) | inst[27] & (~inst[26] & (~inst[31] & inst[29] | inst[31] & ~inst[29]) | inst[26] & (~inst[31] & (~inst[28] | inst[29]) | inst[31] & ~inst[29]))) | inst[30] & (~inst[31] & ~inst[25] & ~inst[23] | inst[29])) + ctrl['RD'] = (~inst[29] & inst[30] | inst[29] & ~inst[30] | inst[31], inst[26]) print(ctrl) diff --git a/tools/ectrl.txt b/tools/ectrl.txt index a5e0ac7..2c82575 100644 --- a/tools/ectrl.txt +++ b/tools/ectrl.txt @@ -1,4 +1,5 @@ ////-------------------------------- OP ALT SA SA1 SA0 SB SB1 SB0 IMM IMM1 IMM0 +32'b000000000000000000000?????001111 ? ? ? ? ? ? ? ? ? ? ? // SYNC (NOP) 32'b00000000000???????????????000000 SL ? SA 0 0 RT 0 0 ? ? ? // SLL 32'b00000000000???????????????000010 SR 0 SA 0 0 RT 0 0 ? ? ? // SRL 32'b00000000000???????????????000011 SR 1 SA 0 0 RT 0 0 ? ? ? // SRA @@ -64,4 +65,5 @@ 32'b101001?????????????????????????? ADD 0 RS 1 1 IMM 1 ? IX 0 1 // SH 32'b101010?????????????????????????? ADD 0 RS 1 1 IMM 1 ? IX 0 1 // SWL 32'b101011?????????????????????????? ADD 0 RS 1 1 IMM 1 ? IX 0 1 // SW -32'b101110?????????????????????????? ADD 0 RS 1 1 IMM 1 ? IX 0 1 // SWR \ No newline at end of file +32'b101110?????????????????????????? ADD 0 RS 1 1 IMM 1 ? IX 0 1 // SWR +32'b110011?????????????????????????? ? ? ? ? ? ? ? ? ? ? ? // PREF \ No newline at end of file diff --git a/tools/global.txt b/tools/global.txt index 78a93e7..88e36be 100644 --- a/tools/global.txt +++ b/tools/global.txt @@ -1,4 +1,5 @@ ////-------------------------------- SYSCALL BREAK ERET OFA ES ET DS DT DP0 DP1 +32'b000000000000000000000?????001111 0 0 0 0 ? ? ? ? 1 1 // SYNC (NOP) 32'b00000000000???????????????000000 0 0 0 0 0 1 0 0 1 1 // SLL 32'b00000000000???????????????000010 0 0 0 0 0 1 0 0 1 1 // SRL 32'b00000000000???????????????000011 0 0 0 0 0 1 0 0 1 1 // SRA @@ -64,4 +65,5 @@ 32'b101001?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // SH 32'b101010?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // SWL 32'b101011?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // SW -32'b101110?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // SWR \ No newline at end of file +32'b101110?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // SWR +32'b110011?????????????????????????? 0 0 0 0 0 0 0 0 1 1 // PREF (NOP) \ No newline at end of file diff --git a/tools/mctrl0.txt b/tools/mctrl0.txt index b4a4cba..0329b2b 100644 --- a/tools/mctrl0.txt +++ b/tools/mctrl0.txt @@ -1,4 +1,5 @@ ////-------------------------------- HW LW HLS HLS2 HLS1 HLS0 C0W RS0 RS02 RS01 RS00 +32'b000000000000000000000?????001111 0 0 ? 0 ? ? 0 ? ? ? ? // SYNC (NOP) 32'b00000000000???????????????000000 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLL 32'b00000000000???????????????000010 0 0 ? 0 ? ? 0 ALU 1 ? ? // SRL 32'b00000000000???????????????000011 0 0 ? 0 ? ? 0 ALU 1 ? ? // SRA @@ -64,4 +65,5 @@ 32'b101001?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // SH 32'b101010?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // SWL 32'b101011?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // SW -32'b101110?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // SWR \ No newline at end of file +32'b101110?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // SWR +32'b110011?????????????????????????? 0 0 ? 0 ? ? 0 ? ? ? ? // PREF (NOP) \ No newline at end of file diff --git a/tools/mctrl1.txt b/tools/mctrl1.txt index 8e26d0a..c72db3b 100644 --- a/tools/mctrl1.txt +++ b/tools/mctrl1.txt @@ -1,4 +1,5 @@ ////-------------------------------- TLBR TLBWI TLBWR TLBP MR MWR MX ALR ALR1 ALR0 +32'b000000000000000000000?????001111 0 0 0 0 0 ? ? ? ? ? // SYNC (NOP) 32'b00000000000???????????????000000 0 0 0 0 0 ? ? ? ? ? // SLL 32'b00000000000???????????????000010 0 0 0 0 0 ? ? ? ? ? // SRL 32'b00000000000???????????????000011 0 0 0 0 0 ? ? ? ? ? // SRA @@ -64,4 +65,5 @@ 32'b101001?????????????????????????? 0 0 0 0 1 1 ? ALIGN 0 0 // SH 32'b101010?????????????????????????? 0 0 0 0 1 1 ? ULEFT 0 1 // SWL 32'b101011?????????????????????????? 0 0 0 0 1 1 ? ALIGN 0 0 // SW -32'b101110?????????????????????????? 0 0 0 0 1 1 ? URIGHT 1 ? // SWR \ No newline at end of file +32'b101110?????????????????????????? 0 0 0 0 1 1 ? URIGHT 1 ? // SWR +32'b110011?????????????????????????? 0 0 0 0 0 ? ? ? ? ? // PREF (NOP) \ No newline at end of file diff --git a/tools/pcs.txt b/tools/pcs.txt index a668c6d..52af898 100644 --- a/tools/pcs.txt +++ b/tools/pcs.txt @@ -1,4 +1,5 @@ ////-------------------------------- BJRJ B JR J +32'b000000000000000000000?????001111 0 0 0 0 // SYNC (NOP) 32'b00000000000???????????????000000 0 0 0 0 // SLL 32'b00000000000???????????????000010 0 0 0 0 // SRL 32'b00000000000???????????????000011 0 0 0 0 // SRA @@ -64,4 +65,5 @@ 32'b101001?????????????????????????? 0 0 0 0 // SH 32'b101010?????????????????????????? 0 0 0 0 // SWL 32'b101011?????????????????????????? 0 0 0 0 // SW -32'b101110?????????????????????????? 0 0 0 0 // SWR \ No newline at end of file +32'b101110?????????????????????????? 0 0 0 0 // SWR +32'b110011?????????????????????????? 0 0 0 0 // PREF (NOP) \ No newline at end of file diff --git a/tools/privilege.txt b/tools/privilege.txt index 846fafc..175cc37 100644 --- a/tools/privilege.txt +++ b/tools/privilege.txt @@ -1,4 +1,5 @@ ////-------------------------------- PRV +32'b000000000000000000000?????001111 0 // SYNC (NOP) 32'b00000000000???????????????000000 0 // SLL 32'b00000000000???????????????000010 0 // SRL 32'b00000000000???????????????000011 0 // SRA @@ -64,4 +65,5 @@ 32'b101001?????????????????????????? 0 // SH 32'b101010?????????????????????????? 0 // SWL 32'b101011?????????????????????????? 0 // SW -32'b101110?????????????????????????? 0 // SWR \ No newline at end of file +32'b101110?????????????????????????? 0 // SWR +32'b110011?????????????????????????? 0 // PREF (NOP) \ No newline at end of file diff --git a/tools/wctrl.txt b/tools/wctrl.txt index d61bce8..cd04dd5 100644 --- a/tools/wctrl.txt +++ b/tools/wctrl.txt @@ -1,4 +1,5 @@ ////-------------------------------- RW RD RD1 RD0 +32'b000000000000000000000?????001111 0 ? ? ? // SYNC (NOP) 32'b00000000000???????????????000000 1 RD 0 0 // SLL 32'b00000000000???????????????000010 1 RD 0 0 // SRL 32'b00000000000???????????????000011 1 RD 0 0 // SRA @@ -64,4 +65,5 @@ 32'b101001?????????????????????????? 0 ? ? ? // SH 32'b101010?????????????????????????? 0 ? ? ? // SWL 32'b101011?????????????????????????? 0 ? ? ? // SW -32'b101110?????????????????????????? 0 ? ? ? // SWR \ No newline at end of file +32'b101110?????????????????????????? 0 ? ? ? // SWR +32'b110011?????????????????????????? 0 ? ? ? // PREF (NOP) \ No newline at end of file From 94ab6939717c9c562eea9de9623ac614928c3bac Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Mon, 30 Aug 2021 14:23:04 +0800 Subject: [PATCH 23/56] update gadgets --- .../soft/func/inst/n94_perf_sync_as_nop.S | 31 +++++++++++++++++++ resources/2021/soft/func/start.S | 18 ++++++----- src/Core/Gadgets.sv | 2 ++ 3 files changed, 44 insertions(+), 7 deletions(-) create mode 100644 resources/2021/soft/func/inst/n94_perf_sync_as_nop.S diff --git a/resources/2021/soft/func/inst/n94_perf_sync_as_nop.S b/resources/2021/soft/func/inst/n94_perf_sync_as_nop.S new file mode 100644 index 0000000..a44e776 --- /dev/null +++ b/resources/2021/soft/func/inst/n94_perf_sync_as_nop.S @@ -0,0 +1,31 @@ +#include +#include +#include + +LEAF(n94_perf_sync_nop_test) + .set noreorder + addiu s0, s0 ,1 + li s2, 0x0 +###test inst + addiu t0, zero, 0x12 + addiu t1, zero, 0x12 + addiu v0, zero, 0x34 + addiu v1, zero, 0x34 + .word 0xCD02F0F0 + .word 0x54F + bne t0, t1, inst_error + bne v0, v1, inst_error + +###detect exception + bne s2, zero, inst_error + nop +###score ++ + addiu s3, s3, 1 +###output (s0<<24)|s3 +inst_error: + sll t1, s0, 24 + or t0, t1, s3 + sw t0, 0(s1) + jr ra + nop +END(n94_perf_sync_nop_test) diff --git a/resources/2021/soft/func/start.S b/resources/2021/soft/func/start.S index ab61cc9..a284e4f 100644 --- a/resources/2021/soft/func/start.S +++ b/resources/2021/soft/func/start.S @@ -2,7 +2,7 @@ #include #include -#define TEST_NUM 93 +#define TEST_NUM 94 ##s0, number @@ -293,12 +293,6 @@ inst_test: nop jal wait_1s nop - - la t9, kseg0_kseg1 ##### - jr t9 #kseg0 -> kseg1 - nop ##### - -kseg0_kseg1: jal n2_addu_test #addu nop jal wait_1s @@ -667,6 +661,16 @@ kseg0_kseg1: nop jal wait_1s nop + jal n94_perf_sync_nop_test + nop + jal wait_1s + nop + + la t9, kseg0_kseg1 ##### + jr t9 #kseg0 -> kseg1 + nop ##### +kseg0_kseg1: + ###check io access LI (a0, IO_SIMU_ADDR) LI (t0, 0x1234) diff --git a/src/Core/Gadgets.sv b/src/Core/Gadgets.sv index 9f6623d..9c22bba 100644 --- a/src/Core/Gadgets.sv +++ b/src/Core/Gadgets.sv @@ -19,6 +19,7 @@ module instr_valid ( always_comb casez (instr) + 32'b000000000000000000000?????001111: valid = 1'b1; // SYNC (NOP) 32'b00000000000???????????????000000: valid = 1'b1; // SLL 32'b00000000000???????????????000010: valid = 1'b1; // SRL 32'b00000000000???????????????000011: valid = 1'b1; // SRA @@ -85,6 +86,7 @@ module instr_valid ( 32'b101010??????????????????????????: valid = 1'b1; // SWL 32'b101011??????????????????????????: valid = 1'b1; // SW 32'b101110??????????????????????????: valid = 1'b1; // SWR + 32'b110011??????????????????????????: valid = 1'b1; // PREF (NOP) // 32'b101111?????00000????????????????: valid = 1'b1; // I-Cache Index Invalid // 32'b101111?????01000????????????????: valid = 1'b1; // I-Cache Index Store Tag // 32'b101111?????10000????????????????: valid = 1'b1; // I-Cache Hit Invalid From 2f22688acaae8e820581862f344804b8aff8bced Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Mon, 30 Aug 2021 15:59:21 +0800 Subject: [PATCH 24/56] update README.md and fix bug in inst test --- README.md | 38 +++++++++---------- .../soft/func/inst/n94_perf_sync_as_nop.S | 2 + resources/2021/soft/func/start.S | 13 ++++--- 3 files changed, 28 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 99a38cb..35e6a7e 100644 --- a/README.md +++ b/README.md @@ -30,9 +30,9 @@ Our awesome `MIPS` CPU written in `SystemVerilog` for Loongson Cup | Status | Instruction | Type | Tier | Comment | | :----------------: | :---------: | :------: | :--: | :-------------------------------------- | -| :clock3: | `Cache` | `SYS` | 2 | | -| :hourglass: | `PREF` | `SYS` | 1 | Treat as `NOP` | -| :hourglass: | `SYNC` | `SYS` | 1 | Treat as `NOP` (We're strongly ordered) | +| :hourglass: | `Cache` | `SYS` | 2 | | +| :heavy_check_mark: | `PREF` | `SYS` | 1 | Treat as `NOP` | +| :heavy_check_mark: | `SYNC` | `SYS` | 1 | Treat as `NOP` (We're strongly ordered) | | :clock3: | `WAIT` | `SYS` | 2 | | | :clock3: | `TEQ` | `SYS` | 2 | | | :clock3: | `TEQI` | `SYS` | 2 | | @@ -48,26 +48,26 @@ Our awesome `MIPS` CPU written in `SystemVerilog` for Loongson Cup | :clock3: | `TNEI` | `SYS` | 2 | | | :clock3: | `CLO` | `ARITH` | 2 | `RT == RD` | | :clock3: | `CLZ` | `ARITH` | 2 | `RT == RD` | -| :clock3: | `MADD` | `ARITH` | 2 | | -| :clock3: | `MADDU` | `ARITH` | 2 | | -| :clock3: | `MSUB` | `ARITH` | 2 | | -| :clock3: | `MSUBU` | `ARITH` | 2 | | -| :clock3: | `MOVN` | `ARITH` | 2 | | -| :clock3: | `MOVZ` | `ARITH` | 2 | | -| :hourglass: | `LL` | `MEM` | 1 | Treat as `LW` | +| :hourglass: | `MADD` | `ARITH` | 2 | 使用`IP` | +| :hourglass: | `MADDU` | `ARITH` | 2 | 使用`IP` | +| :hourglass: | `MSUB` | `ARITH` | 2 | 使用`IP` | +| :hourglass: | `MSUBU` | `ARITH` | 2 | 使用`IP` | +| :hourglass: | `MOVN` | `ARITH` | 2 | `D`阶段阻塞 | +| :hourglass: | `MOVZ` | `ARITH` | 2 | `D`阶段阻塞 | +| :x: | `LL` | `MEM` | 3 | 修改内核去除相关指令 | | :heavy_check_mark: | `LWL` | `MEM` | 1 | | | :heavy_check_mark: | `LWR` | `MEM` | 1 | | -| :hourglass: | `SC` | `MEM` | 1 | Treat as `SW` | +| :x: | `SC` | `MEM` | 3 | 修改内核去除相关指令 | | :heavy_check_mark: | `SWL` | `MEM` | 1 | | | :heavy_check_mark: | `SWR` | `MEM` | 1 | | | :clock3: | `MOVF` | `FP` | 3 | | | :clock3: | `MOVT` | `FP` | 3 | | -| :clock3: | `BEQL` | `BRANCH` | 3 | | -| :clock3: | `BGEZALL` | `BRANCH` | 3 | | -| :clock3: | `BGEZL` | `BRANCH` | 3 | | -| :clock3: | `BGTZL` | `BRANCH` | 3 | | -| :clock3: | `BLEZL` | `BRANCH` | 3 | | -| :clock3: | `BLTZALL` | `BRANCH` | 3 | | -| :clock3: | `BLTZL` | `BRANCH` | 3 | | -| :clock3: | `BNEL` | `BRANCH` | 3 | | +| :x: | `BEQL` | `BRANCH` | 3 | 修改编译指令 | +| :x: | `BGEZALL` | `BRANCH` | 3 | 修改编译指令 | +| :x: | `BGEZL` | `BRANCH` | 3 | 修改编译指令 | +| :x: | `BGTZL` | `BRANCH` | 3 | 修改编译指令 | +| :x: | `BLEZL` | `BRANCH` | 3 | 修改编译指令 | +| :x: | `BLTZALL` | `BRANCH` | 3 | 修改编译指令 | +| :x: | `BLTZL` | `BRANCH` | 3 | 修改编译指令 | +| :x: | `BNEL` | `BRANCH` | 3 | 修改编译指令 | diff --git a/resources/2021/soft/func/inst/n94_perf_sync_as_nop.S b/resources/2021/soft/func/inst/n94_perf_sync_as_nop.S index a44e776..3270bb6 100644 --- a/resources/2021/soft/func/inst/n94_perf_sync_as_nop.S +++ b/resources/2021/soft/func/inst/n94_perf_sync_as_nop.S @@ -14,7 +14,9 @@ LEAF(n94_perf_sync_nop_test) .word 0xCD02F0F0 .word 0x54F bne t0, t1, inst_error + nop bne v0, v1, inst_error + nop ###detect exception bne s2, zero, inst_error diff --git a/resources/2021/soft/func/start.S b/resources/2021/soft/func/start.S index a284e4f..5ff7268 100644 --- a/resources/2021/soft/func/start.S +++ b/resources/2021/soft/func/start.S @@ -293,6 +293,12 @@ inst_test: nop jal wait_1s nop + + la t9, kseg0_kseg1 ##### + jr t9 #kseg0 -> kseg1 + nop ##### +kseg0_kseg1: + jal n2_addu_test #addu nop jal wait_1s @@ -664,12 +670,7 @@ inst_test: jal n94_perf_sync_nop_test nop jal wait_1s - nop - - la t9, kseg0_kseg1 ##### - jr t9 #kseg0 -> kseg1 - nop ##### -kseg0_kseg1: + nop ###check io access LI (a0, IO_SIMU_ADDR) From 9be23101776a5491c963c772b98fea14208d2cb8 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Tue, 31 Aug 2021 18:29:27 +0800 Subject: [PATCH 25/56] add MADD, MADDU, MSUB, MSUBU --- README.md | 8 ++++---- src/Core/Controller.sv | 7 ++++--- src/Core/Datapath.sv | 42 ++++++++++++++++++++++++++++++++--------- src/Gadgets.sv | 4 ++-- src/include/defines.svh | 7 +++++++ 5 files changed, 50 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 35e6a7e..3c50458 100644 --- a/README.md +++ b/README.md @@ -48,10 +48,10 @@ Our awesome `MIPS` CPU written in `SystemVerilog` for Loongson Cup | :clock3: | `TNEI` | `SYS` | 2 | | | :clock3: | `CLO` | `ARITH` | 2 | `RT == RD` | | :clock3: | `CLZ` | `ARITH` | 2 | `RT == RD` | -| :hourglass: | `MADD` | `ARITH` | 2 | 使用`IP` | -| :hourglass: | `MADDU` | `ARITH` | 2 | 使用`IP` | -| :hourglass: | `MSUB` | `ARITH` | 2 | 使用`IP` | -| :hourglass: | `MSUBU` | `ARITH` | 2 | 使用`IP` | +| :hourglass: | `MADD` | `ARITH` | 2 | `M`阶段加一个流水级 | +| :hourglass: | `MADDU` | `ARITH` | 2 | `M`阶段加一个流水级 | +| :hourglass: | `MSUB` | `ARITH` | 2 | `M`阶段加一个流水级 | +| :hourglass: | `MSUBU` | `ARITH` | 2 | `M`阶段加一个流水级 | | :hourglass: | `MOVN` | `ARITH` | 2 | `D`阶段阻塞 | | :hourglass: | `MOVZ` | `ARITH` | 2 | `D`阶段阻塞 | | :x: | `LL` | `MEM` | 3 | 修改内核去除相关指令 | diff --git a/src/Core/Controller.sv b/src/Core/Controller.sv index 221b10c..97edd9b 100644 --- a/src/Core/Controller.sv +++ b/src/Core/Controller.sv @@ -61,9 +61,10 @@ module Controller ( assign ctrl.ECtrl.SA = SA_t'({inst[31] | inst[29] | ~inst[26] & (inst[5] | inst[2]), inst[31] | (~inst[28] & (inst[29] | inst[26] | inst[5] | inst[3] | inst[2]) | inst[28] & (~inst[27] | ~inst[26]))}); assign ctrl.ECtrl.SB = SB_t'({inst[31] | inst[29], inst[26] | ~inst[5] & inst[3]}); - assign ctrl.MCtrl0.HW = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (inst[3] | ~inst[1] & inst[0]); - assign ctrl.MCtrl0.LW = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (inst[3] | inst[1] & inst[0]); + assign ctrl.MCtrl0.HW = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (~inst[1] & inst[0] | inst[3]) | inst[30] & inst[29] & ~inst[1]; + assign ctrl.MCtrl0.LW = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (inst[1] & inst[0] | inst[3]) | inst[30] & inst[29] & ~inst[1]; assign ctrl.MCtrl0.HLS = HLS_t'({~inst[27] & ~inst[26] & (~inst[30] & ~inst[31] & ~inst[29] & ~inst[28] & inst[4] & inst[3] | inst[30] & inst[29]), ~inst[30] & inst[1], inst[0]}); + assign ctrl.MCtrl0.MAS = MAS_t'({inst[2], ~inst[2] & ~inst[1]}); assign ctrl.MCtrl0.C0D = inst[15:11]; assign ctrl.MCtrl0.C0W = ~inst[31] & inst[30] & ~inst[29] & inst[23] & ~inst[3]; assign ctrl.MCtrl0.SEL = inst[2:0]; @@ -79,6 +80,6 @@ module Controller ( assign ctrl.MCtrl1.TLBWR = ~inst[31] & inst[30] & ~inst[29] & inst[25] & ~inst[3] & (inst[2] | ~inst[1]); assign ctrl.MCtrl1.TLBP = ~inst[31] & inst[30] & ~inst[4] & inst[3]; - assign ctrl.WCtrl.RW = ctrl.RD != 5'b00000 & (~inst[30] & (~inst[27] & (~inst[26] & (~inst[31] & (~inst[28] & (~inst[3] & (~inst[4] | ~inst[0]) | inst[3] & (~inst[4] & ~inst[2] & inst[0] | inst[5])) | inst[29]) | inst[31] & ~inst[29]) | inst[26] & (~inst[28] & (~inst[31] & (inst[29] | inst[20]) | inst[31] & ~inst[29]) | inst[28] & (~inst[31] & inst[29] | inst[31]))) | inst[27] & (~inst[26] & (~inst[31] & inst[29] | inst[31] & ~inst[29]) | inst[26] & (~inst[31] & (~inst[28] | inst[29]) | inst[31] & ~inst[29]))) | inst[30] & (~inst[31] & ~inst[25] & ~inst[23] | inst[29])); + assign ctrl.WCtrl.RW = ctrl.RD != 5'b00000 & (~inst[30] & (~inst[27] & (~inst[26] & (~inst[31] & (~inst[28] & (~inst[3] & (~inst[4] | ~inst[0]) | inst[3] & (~inst[4] & ~inst[2] & inst[0] | inst[5])) | inst[29]) | inst[31] & ~inst[29]) | inst[26] & (~inst[31] & (~inst[28] & inst[20] | inst[29]) | inst[31] & ~inst[29])) | inst[27] & (~inst[26] & (~inst[31] & inst[29] | inst[31] & ~inst[29]) | inst[26] & (~inst[31] & (~inst[28] | inst[29]) | inst[31] & ~inst[29]))) | inst[30] & ~inst[31] & ~inst[3] & (~inst[29] & ~inst[25] & ~inst[23] | inst[29] & inst[1])); endmodule diff --git a/src/Core/Datapath.sv b/src/Core/Datapath.sv index 79ec92e..744d332 100644 --- a/src/Core/Datapath.sv +++ b/src/Core/Datapath.sv @@ -233,6 +233,16 @@ module Datapath ( word_t M_I0_MULTUH; word_t M_I0_MULTUL; + word_t M_I0_MULTHF; + word_t M_I0_MULTLF; + word_t M_I0_MULTUHF; + + logic M_I0_MAS_bvalid; + word_t M_I0_MASH; + word_t M_I0_MASL; + word_t M_I0_MUASH; + word_t M_I0_MUASL; + logic M_I0_MULT_bvalid; word_t M_I0_MULTLB; word_t M_I0_MULTHB; @@ -707,7 +717,7 @@ module Datapath ( E.en, E.I0.ECtrl ); - ffenrc #(17) E_I0_MCtrl_ff ( + ffenrc #(19) E_I0_MCtrl_ff ( clk, rst | rstM, D.I0.MCtrl, @@ -1004,7 +1014,7 @@ module Datapath ( M.en, M.I0.ALUOut ); - ffenrc #(17) M_I0_MCtrl_ff ( + ffenrc #(19) M_I0_MCtrl_ff ( clk, rst | rstM, E.I0.MCtrl, @@ -1086,7 +1096,7 @@ module Datapath ( 1'b1, dTLBExcValid ); - buffer0 #(4) dExc_buffer ( + myBuffer0 #(4) dExc_buffer ( clk, rst, {dTLBRefill, dTLBInvalid, dTLBModified, dAddressError}, dTLBExcValid, @@ -1119,17 +1129,31 @@ module Datapath ( }; // M.I0.MUL - buffer #(96) M_I0_MULT_buffer ( + ffenr #(97) M_I0_MAS_ff ( + clk,rst, + {M_I0_MULTL, M_I0_MULTH, M_I0_MULTUH, M_I0_MULT_CNTR[0]}, + 1'b1, + {M_I0_MULTLF, M_I0_MULTHF, M_I0_MULTUHF, M_I0_MAS_bvalid} + ); + + // TODO: Optimize ME + assign {M_I0_MUASH, M_I0_MUASL} = M.I0.MCtrl.MAS[0] ? {M_I0_MULTUHF, M_I0_MULTLF} + {HI, LO} + : {M_I0_MULTUHF, M_I0_MULTLF} - {HI, LO}; + assign {M_I0_MASH, M_I0_MASL} = M.I0.MCtrl.MAS[0] ? $signed({M_I0_MULTHF, M_I0_MULTLF}) + $signed({HI, LO}) + : $signed({M_I0_MULTHF, M_I0_MULTLF}) - $signed({HI, LO}); + + myBuffer #(96) M_I0_MULT_buffer ( clk, rst, - M_I0_MULT_CNTR[0], - {M_I0_MULTL, M_I0_MULTH, M_I0_MULTUH}, + M_I0_MULT_CNTR[0] & M.I0.MCtrl.MAS == 2'b00 | M_I0_MAS_bvalid & |M.I0.MCtrl.MAS, + M.I0.MCtrl.MAS == 2'b00 ? {M_I0_MULTL, M_I0_MULTH, M_I0_MULTUH} + : {M_I0_MASL, M_I0_MASH, M_I0_MUASH}, M.en, M_I0_MULT_bvalid, {M_I0_MULTLB, M_I0_MULTHB, M_I0_MULTUHB} ); // M.I0.DIV - buffer #(64) M_I0_DIV_buffer ( + myBuffer #(64) M_I0_DIV_buffer ( clk, rst, M_I0_DIV_valid, {M_I0_DIVL, M_I0_DIVH}, @@ -1137,7 +1161,7 @@ module Datapath ( M_I0_DIV_bvalid, {M_I0_DIVLB, M_I0_DIVHB} ); - buffer #(64) M_I0_DIVU_buffer ( + myBuffer #(64) M_I0_DIVU_buffer ( clk, rst, M_I0_DIVU_valid, {M_I0_DIVUL, M_I0_DIVUH}, @@ -1259,7 +1283,7 @@ module Datapath ( M.I1.RDataW ); - buffer #(32) M_I1_DataR_buffer ( + myBuffer #(32) M_I1_DataR_buffer ( clk, rst, mem_i.data_ok, mem_i.rdata, diff --git a/src/Gadgets.sv b/src/Gadgets.sv index b6c9e01..33f7da0 100644 --- a/src/Gadgets.sv +++ b/src/Gadgets.sv @@ -206,7 +206,7 @@ module extender #( endmodule -module buffer0 #( +module myBuffer0 #( parameter WIDTH = 8 ) ( input clk, @@ -229,7 +229,7 @@ module buffer0 #( assign bdata = en ? data : data1; endmodule -module buffer #( +module myBuffer #( parameter WIDTH = 8 ) ( input clk, diff --git a/src/include/defines.svh b/src/include/defines.svh index 62e7764..5985709 100644 --- a/src/include/defines.svh +++ b/src/include/defines.svh @@ -71,6 +71,12 @@ typedef enum logic [2:0] { DIVU = 3'b111 } HLS_t; +typedef enum logic [1:0] { + PASST = 2'b00, // Pass through + MADD = 2'b01, // MULT and ADD + MSUB = 2'b10 // MULT and SUB +} MAS_t; + typedef enum logic [1:0] { ALIGN = 2'b00, ULEFT = 2'b01, @@ -91,6 +97,7 @@ typedef struct packed { logic [2:0] SEL; logic C0W; // critical HLS_t HLS; + MAS_t MAS; } MCtrl0_t; typedef struct packed { From 966b7b62237dd67e1d9088d60d68718f0e13dc32 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Tue, 31 Aug 2021 18:30:03 +0800 Subject: [PATCH 26/56] add control signals --- tools/decoder.py | 143 +++++++++++++++++++++++--------------------- tools/ectrl.txt | 4 ++ tools/global.txt | 4 ++ tools/mctrl0.txt | 142 ++++++++++++++++++++++--------------------- tools/mctrl1.txt | 4 ++ tools/pcs.txt | 4 ++ tools/privilege.txt | 4 ++ tools/wctrl.txt | 4 ++ 8 files changed, 171 insertions(+), 138 deletions(-) diff --git a/tools/decoder.py b/tools/decoder.py index d0afbfc..e8576cc 100644 --- a/tools/decoder.py +++ b/tools/decoder.py @@ -1,72 +1,76 @@ table = [ - ('000000000000000000000?????001111', 'SYNC'), - ('00000000000???????????????000000', 'SLL'), - ('00000000000???????????????000010', 'SRL'), - ('00000000000???????????????000011', 'SRA'), - ('000000???????????????00000000100', 'SLLV'), - ('000000???????????????00000000110', 'SRLV'), - ('000000???????????????00000000111', 'SRAV'), - ('000000?????000000000000000001000', 'JR'), - ('000000?????00000?????00000001001', 'JALR'), - ('000000????????????????????001100', 'SYSCALL'), - ('000000????????????????????001101', 'BREAK'), - ('0000000000000000?????00000010000', 'MFHI'), - ('000000?????000000000000000010001', 'MTHI'), - ('0000000000000000?????00000010010', 'MFLO'), - ('000000?????000000000000000010011', 'MTLO'), + # ('000000000000000000000?????001111', 'SYNC'), + # ('00000000000???????????????000000', 'SLL'), + # ('00000000000???????????????000010', 'SRL'), + # ('00000000000???????????????000011', 'SRA'), + # ('000000???????????????00000000100', 'SLLV'), + # ('000000???????????????00000000110', 'SRLV'), + # ('000000???????????????00000000111', 'SRAV'), + # ('000000?????000000000000000001000', 'JR'), + # ('000000?????00000?????00000001001', 'JALR'), + # ('000000????????????????????001100', 'SYSCALL'), + # ('000000????????????????????001101', 'BREAK'), + # ('0000000000000000?????00000010000', 'MFHI'), + # ('000000?????000000000000000010001', 'MTHI'), + # ('0000000000000000?????00000010010', 'MFLO'), + # ('000000?????000000000000000010011', 'MTLO'), ('000000??????????0000000000011000', 'MULT'), ('000000??????????0000000000011001', 'MULTU'), - ('000000??????????0000000000011010', 'DIV'), - ('000000??????????0000000000011011', 'DIVU'), - ('000000???????????????00000100000', 'ADD'), - ('000000???????????????00000100001', 'ADDU'), - ('000000???????????????00000100010', 'SUB'), - ('000000???????????????00000100011', 'SUBU'), - ('000000???????????????00000100100', 'AND'), - ('000000???????????????00000100101', 'OR'), - ('000000???????????????00000100110', 'XOR'), - ('000000???????????????00000100111', 'NOR'), - ('000000???????????????00000101010', 'SLT'), - ('000000???????????????00000101011', 'SLTU'), - ('000001?????00000????????????????', 'BLTZ'), - ('000001?????10000????????????????', 'BLTZAL'), - ('000001?????00001????????????????', 'BGEZ'), - ('000001?????10001????????????????', 'BGEZAL'), - ('000010??????????????????????????', 'J'), - ('000011??????????????????????????', 'JAL'), - ('000100??????????????????????????', 'BEQ'), - ('000101??????????????????????????', 'BNE'), - ('000110?????00000????????????????', 'BLEZ'), - ('000111?????00000????????????????', 'BGTZ'), - ('001000??????????????????????????', 'ADDI'), - ('001001??????????????????????????', 'ADDIU'), - ('001010??????????????????????????', 'SLTI'), - ('001011??????????????????????????', 'SLTIU'), - ('001100??????????????????????????', 'ANDI'), - ('001101??????????????????????????', 'ORI'), - ('001110??????????????????????????', 'XORI'), - ('00111100000?????????????????????', 'LUI'), - ('01000000000??????????00000000???', 'MFC0'), - ('01000000100??????????00000000???', 'MTC0'), - ('01000010000000000000000000000001', 'TLBR'), - ('01000010000000000000000000000010', 'TLBWI'), - ('01000010000000000000000000000110', 'TLBWR'), - ('01000010000000000000000000001000', 'TLBP'), - ('01000010000000000000000000011000', 'ERET'), - ('011100???????????????00000000010', 'MUL'), - ('100000??????????????????????????', 'LB'), - ('100001??????????????????????????', 'LH'), - ('100010??????????????????????????', 'LWL'), - ('100011??????????????????????????', 'LW'), - ('100100??????????????????????????', 'LBU'), - ('100101??????????????????????????', 'LHU'), - ('100110??????????????????????????', 'LWR'), - ('101000??????????????????????????', 'SB'), - ('101001??????????????????????????', 'SH'), - ('101010??????????????????????????', 'SWL'), - ('101011??????????????????????????', 'SW'), - ('101110??????????????????????????', 'SWR'), - ('110011??????????????????????????', 'PREF'), + # ('000000??????????0000000000011010', 'DIV'), + # ('000000??????????0000000000011011', 'DIVU'), + # ('000000???????????????00000100000', 'ADD'), + # ('000000???????????????00000100001', 'ADDU'), + # ('000000???????????????00000100010', 'SUB'), + # ('000000???????????????00000100011', 'SUBU'), + # ('000000???????????????00000100100', 'AND'), + # ('000000???????????????00000100101', 'OR'), + # ('000000???????????????00000100110', 'XOR'), + # ('000000???????????????00000100111', 'NOR'), + # ('000000???????????????00000101010', 'SLT'), + # ('000000???????????????00000101011', 'SLTU'), + # ('000001?????00000????????????????', 'BLTZ'), + # ('000001?????10000????????????????', 'BLTZAL'), + # ('000001?????00001????????????????', 'BGEZ'), + # ('000001?????10001????????????????', 'BGEZAL'), + # ('000010??????????????????????????', 'J'), + # ('000011??????????????????????????', 'JAL'), + # ('000100??????????????????????????', 'BEQ'), + # ('000101??????????????????????????', 'BNE'), + # ('000110?????00000????????????????', 'BLEZ'), + # ('000111?????00000????????????????', 'BGTZ'), + # ('001000??????????????????????????', 'ADDI'), + # ('001001??????????????????????????', 'ADDIU'), + # ('001010??????????????????????????', 'SLTI'), + # ('001011??????????????????????????', 'SLTIU'), + # ('001100??????????????????????????', 'ANDI'), + # ('001101??????????????????????????', 'ORI'), + # ('001110??????????????????????????', 'XORI'), + # ('00111100000?????????????????????', 'LUI'), + # ('01000000000??????????00000000???', 'MFC0'), + # ('01000000100??????????00000000???', 'MTC0'), + # ('01000010000000000000000000000001', 'TLBR'), + # ('01000010000000000000000000000010', 'TLBWI'), + # ('01000010000000000000000000000110', 'TLBWR'), + # ('01000010000000000000000000001000', 'TLBP'), + # ('01000010000000000000000000011000', 'ERET'), + ('011100??????????0000000000000000', 'MADD'), + ('011100??????????0000000000000001', 'MADDU'), + ('011100??????????0000000000000100', 'MSUB'), + ('011100??????????0000000000000101', 'MSUBU'), + # ('011100???????????????00000000010', 'MUL'), + # ('100000??????????????????????????', 'LB'), + # ('100001??????????????????????????', 'LH'), + # ('100010??????????????????????????', 'LWL'), + # ('100011??????????????????????????', 'LW'), + # ('100100??????????????????????????', 'LBU'), + # ('100101??????????????????????????', 'LHU'), + # ('100110??????????????????????????', 'LWR'), + # ('101000??????????????????????????', 'SB'), + # ('101001??????????????????????????', 'SH'), + # ('101010??????????????????????????', 'SWL'), + # ('101011??????????????????????????', 'SW'), + # ('101110??????????????????????????', 'SWR'), + # ('110011??????????????????????????', 'PREF'), ] class Boolean: @@ -124,9 +128,10 @@ for inst, name in table: ctrl['ECtrl_SB'] = (inst[31] | inst[29], inst[26] | ~inst[5] & inst[3]) ctrl['imm'] = (inst[28] & inst[27] & inst[26], inst[31] | ~inst[28]) - ctrl['MCtrl0_HW'] = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (inst[3] | ~inst[1] & inst[0]) - ctrl['MCtrl0_LW'] = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (inst[3] | inst[1] & inst[0]) + ctrl['MCtrl0_HW'] = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (~inst[1] & inst[0] | inst[3]) | inst[30] & inst[29] & ~inst[1] + ctrl['MCtrl0_LW'] = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (inst[1] & inst[0] | inst[3]) | inst[30] & inst[29] & ~inst[1] ctrl['MCtrl0_HLS'] = (~inst[27] & ~inst[26] & (~inst[30] & ~inst[31] & ~inst[29] & ~inst[28] & inst[4] & inst[3] | inst[30] & inst[29]), ~inst[30] & inst[1], inst[0]) + ctrl['MCtrl0_MAS'] = (inst[2], ~inst[2] & ~inst[1]) ctrl['MCtrl0_C0W'] = ~inst[31] & inst[30] & ~inst[29] & inst[23] & ~inst[3] ctrl['MCtrl0_RS0'] = (ctrl['DP1'], inst[30], ~inst[29] & (inst[30] | ~inst[1])) @@ -139,6 +144,6 @@ for inst, name in table: ctrl['MCtrl1_TLBWR'] = ~inst[31] & inst[30] & ~inst[29] & inst[25] & ~inst[3] & (inst[2] | ~inst[1]) ctrl['MCtrl1_TLBP'] = ~inst[31] & inst[30] & ~inst[4] & inst[3] - ctrl['WCtrl_RW'] = (~inst[30] & (~inst[27] & (~inst[26] & (~inst[31] & (~inst[28] & (~inst[3] & (~inst[4] | ~inst[0]) | inst[3] & (~inst[4] & ~inst[2] & inst[0] | inst[5])) | inst[29]) | inst[31] & ~inst[29]) | inst[26] & (~inst[28] & (~inst[31] & (inst[29] | inst[20]) | inst[31] & ~inst[29]) | inst[28] & (~inst[31] & inst[29] | inst[31]))) | inst[27] & (~inst[26] & (~inst[31] & inst[29] | inst[31] & ~inst[29]) | inst[26] & (~inst[31] & (~inst[28] | inst[29]) | inst[31] & ~inst[29]))) | inst[30] & (~inst[31] & ~inst[25] & ~inst[23] | inst[29])) + ctrl['WCtrl_RW'] = ~inst[30] & (~inst[27] & (~inst[26] & (~inst[31] & (~inst[28] & (~inst[3] & (~inst[4] | ~inst[0]) | inst[3] & (~inst[4] & ~inst[2] & inst[0] | inst[5])) | inst[29]) | inst[31] & ~inst[29]) | inst[26] & (~inst[31] & (~inst[28] & inst[20] | inst[29]) | inst[31] & ~inst[29])) | inst[27] & (~inst[26] & (~inst[31] & inst[29] | inst[31] & ~inst[29]) | inst[26] & (~inst[31] & (~inst[28] | inst[29]) | inst[31] & ~inst[29]))) | inst[30] & ~inst[31] & ~inst[3] & (~inst[29] & ~inst[25] & ~inst[23] | inst[29] & inst[1]) ctrl['RD'] = (~inst[29] & inst[30] | inst[29] & ~inst[30] | inst[31], inst[26]) print(ctrl) diff --git a/tools/ectrl.txt b/tools/ectrl.txt index 2c82575..7a0a2c1 100644 --- a/tools/ectrl.txt +++ b/tools/ectrl.txt @@ -53,6 +53,10 @@ 32'b01000010000000000000000000000110 ? ? ? ? ? ? ? ? ? ? ? // TLBWR 32'b01000010000000000000000000001000 ? ? ? ? ? ? ? ? ? ? ? // TLBP 32'b01000010000000000000000000011000 ? ? ? ? ? ? ? ? ? ? ? // ERET +32'b011100??????????0000000000000000 ? ? ? ? ? ? ? ? ? ? ? // MADD +32'b011100??????????0000000000000001 ? ? ? ? ? ? ? ? ? ? ? // MADDU +32'b011100??????????0000000000000100 ? ? ? ? ? ? ? ? ? ? ? // MSUB +32'b011100??????????0000000000000101 ? ? ? ? ? ? ? ? ? ? ? // MSUBU 32'b011100???????????????00000000010 ? ? ? ? ? ? ? ? ? ? ? // MUL 32'b100000?????????????????????????? ADD 0 RS 1 1 IMM 1 ? IX 0 1 // LB 32'b100001?????????????????????????? ADD 0 RS 1 1 IMM 1 ? IX 0 1 // LH diff --git a/tools/global.txt b/tools/global.txt index 88e36be..45e1458 100644 --- a/tools/global.txt +++ b/tools/global.txt @@ -53,6 +53,10 @@ 32'b01000010000000000000000000000110 0 0 0 0 0 0 0 0 0 1 // TLBWR 32'b01000010000000000000000000001000 0 0 0 0 0 0 0 0 0 1 // TLBP 32'b01000010000000000000000000011000 0 0 1 0 0 0 0 0 1 1 // ERET +32'b011100??????????0000000000000000 0 0 0 0 1 1 0 0 1 0 // MADD +32'b011100??????????0000000000000001 0 0 0 0 1 1 0 0 1 0 // MADDU +32'b011100??????????0000000000000100 0 0 0 0 1 1 0 0 1 0 // MSUB +32'b011100??????????0000000000000101 0 0 0 0 1 1 0 0 1 0 // MSUBU 32'b011100???????????????00000000010 0 0 0 0 1 1 0 0 1 0 // MUL 32'b100000?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // LB 32'b100001?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // LH diff --git a/tools/mctrl0.txt b/tools/mctrl0.txt index 0329b2b..af23ad6 100644 --- a/tools/mctrl0.txt +++ b/tools/mctrl0.txt @@ -1,69 +1,73 @@ -////-------------------------------- HW LW HLS HLS2 HLS1 HLS0 C0W RS0 RS02 RS01 RS00 -32'b000000000000000000000?????001111 0 0 ? 0 ? ? 0 ? ? ? ? // SYNC (NOP) -32'b00000000000???????????????000000 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLL -32'b00000000000???????????????000010 0 0 ? 0 ? ? 0 ALU 1 ? ? // SRL -32'b00000000000???????????????000011 0 0 ? 0 ? ? 0 ALU 1 ? ? // SRA -32'b000000???????????????00000000100 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLLV -32'b000000???????????????00000000110 0 0 ? 0 ? ? 0 ALU 1 ? ? // SRLV -32'b000000???????????????00000000111 0 0 ? 0 ? ? 0 ALU 1 ? ? // SRAV -32'b000000?????000000000000000001000 0 0 ? 0 ? ? 0 ? ? ? ? // JR -32'b000000?????00000?????00000001001 0 0 ? 0 ? ? 0 ALU 1 ? ? // JALR -32'b000000????????????????????001100 0 0 ? 0 ? ? 0 ? ? ? ? // SYSCALL -32'b000000????????????????????001101 0 0 ? 0 ? ? 0 ? ? ? ? // BREAK -32'b0000000000000000?????00000010000 0 0 ? 0 ? ? 0 HI 0 0 1 // MFHI -32'b000000?????000000000000000010001 1 0 RS 0 ? ? 0 ? ? ? ? // MTHI -32'b0000000000000000?????00000010010 0 0 ? 0 ? ? 0 LO 0 0 0 // MFLO -32'b000000?????000000000000000010011 0 1 RS 0 ? ? 0 ? ? ? ? // MTLO -32'b000000??????????0000000000011000 1 1 MULT 1 0 0 0 ? ? ? ? // MULT -32'b000000??????????0000000000011001 1 1 MULTU 1 0 1 0 ? ? ? ? // MULTU -32'b000000??????????0000000000011010 1 1 DIV 1 1 0 0 ? ? ? ? // DIV -32'b000000??????????0000000000011011 1 1 DIVU 1 1 1 0 ? ? ? ? // DIVU -32'b000000???????????????00000100000 0 0 ? 0 ? ? 0 ALU 1 ? ? // ADD -32'b000000???????????????00000100001 0 0 ? 0 ? ? 0 ALU 1 ? ? // ADDU -32'b000000???????????????00000100010 0 0 ? 0 ? ? 0 ALU 1 ? ? // SUB -32'b000000???????????????00000100011 0 0 ? 0 ? ? 0 ALU 1 ? ? // SUBU -32'b000000???????????????00000100100 0 0 ? 0 ? ? 0 ALU 1 ? ? // AND -32'b000000???????????????00000100101 0 0 ? 0 ? ? 0 ALU 1 ? ? // OR -32'b000000???????????????00000100110 0 0 ? 0 ? ? 0 ALU 1 ? ? // XOR -32'b000000???????????????00000100111 0 0 ? 0 ? ? 0 ALU 1 ? ? // NOR -32'b000000???????????????00000101010 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLT -32'b000000???????????????00000101011 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLTU -32'b000001?????00000???????????????? 0 0 ? 0 ? ? 0 ? ? ? ? // BLTZ -32'b000001?????10000???????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // BLTZAL -32'b000001?????00001???????????????? 0 0 ? 0 ? ? 0 ? ? ? ? // BGEZ -32'b000001?????10001???????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // BGEZAL -32'b000010?????????????????????????? 0 0 ? 0 ? ? 0 ? ? ? ? // J -32'b000011?????????????????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // JAL -32'b000100?????????????????????????? 0 0 ? 0 ? ? 0 ? ? ? ? // BEQ -32'b000101?????????????????????????? 0 0 ? 0 ? ? 0 ? ? ? ? // BNE -32'b000110?????00000???????????????? 0 0 ? 0 ? ? 0 ? ? ? ? // BLEZ -32'b000111?????00000???????????????? 0 0 ? 0 ? ? 0 ? ? ? ? // BGTZ -32'b001000?????????????????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // ADDI -32'b001001?????????????????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // ADDIU -32'b001010?????????????????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLTI -32'b001011?????????????????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // SLTIU -32'b001100?????????????????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // ANDI -32'b001101?????????????????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // ORI -32'b001110?????????????????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // XORI -32'b00111100000????????????????????? 0 0 ? 0 ? ? 0 ALU 1 ? ? // LUI -32'b01000000000??????????00000000??? 0 0 ? 0 ? ? 0 C0 0 1 1 // MFC0 -32'b01000000100??????????00000000??? 0 0 ? 0 ? ? 1 ? ? ? ? // MTC0 -32'b01000010000000000000000000000001 ? ? ? 0 ? ? 0 ? ? ? ? // TLBR -32'b01000010000000000000000000000010 ? ? ? 0 ? ? 0 ? ? ? ? // TLBWI -32'b01000010000000000000000000000110 ? ? ? 0 ? ? 0 ? ? ? ? // TLBWR -32'b01000010000000000000000000001000 ? ? ? 0 ? ? 0 ? ? ? ? // TLBP -32'b01000010000000000000000000011000 0 0 ? 0 ? ? 0 ? ? ? ? // ERET -32'b011100???????????????00000000010 0 0 MUL? 1 0 ? 0 MUL 0 1 0 // MUL -32'b100000?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // LB -32'b100001?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // LH -32'h100010?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // LWL -32'b100011?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // LW -32'b100100?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // LBU -32'b100101?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // LHU -32'h100110?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // LWR -32'b101000?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // SB -32'b101001?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // SH -32'b101010?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // SWL -32'b101011?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // SW -32'b101110?????????????????????????? ? ? ? 0 ? ? 0 ? ? ? ? // SWR -32'b110011?????????????????????????? 0 0 ? 0 ? ? 0 ? ? ? ? // PREF (NOP) \ No newline at end of file +////-------------------------------- HW LW HLS HLS2 HLS1 HLS0 MAS MAS1 MAS0 C0W RS0 RS02 RS01 RS00 +32'b000000000000000000000?????001111 0 0 ? 0 ? ? ? ? ? 0 ? ? ? ? // SYNC (NOP) +32'b00000000000???????????????000000 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // SLL +32'b00000000000???????????????000010 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // SRL +32'b00000000000???????????????000011 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // SRA +32'b000000???????????????00000000100 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // SLLV +32'b000000???????????????00000000110 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // SRLV +32'b000000???????????????00000000111 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // SRAV +32'b000000?????000000000000000001000 0 0 ? 0 ? ? ? ? ? 0 ? ? ? ? // JR +32'b000000?????00000?????00000001001 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // JALR +32'b000000????????????????????001100 0 0 ? 0 ? ? ? ? ? 0 ? ? ? ? // SYSCALL +32'b000000????????????????????001101 0 0 ? 0 ? ? ? ? ? 0 ? ? ? ? // BREAK +32'b0000000000000000?????00000010000 0 0 ? 0 ? ? ? ? ? 0 HI 0 0 1 // MFHI +32'b000000?????000000000000000010001 1 0 RS 0 ? ? ? ? ? 0 ? ? ? ? // MTHI +32'b0000000000000000?????00000010010 0 0 ? 0 ? ? ? ? ? 0 LO 0 0 0 // MFLO +32'b000000?????000000000000000010011 0 1 RS 0 ? ? ? ? ? 0 ? ? ? ? // MTLO +32'b000000??????????0000000000011000 1 1 MULT 1 0 0 PASST ? ? 0 ? ? ? ? // MULT +32'b000000??????????0000000000011001 1 1 MULTU 1 0 1 PASST ? ? 0 ? ? ? ? // MULTU +32'b000000??????????0000000000011010 1 1 DIV 1 1 0 ? ? ? 0 ? ? ? ? // DIV +32'b000000??????????0000000000011011 1 1 DIVU 1 1 1 ? ? ? 0 ? ? ? ? // DIVU +32'b000000???????????????00000100000 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // ADD +32'b000000???????????????00000100001 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // ADDU +32'b000000???????????????00000100010 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // SUB +32'b000000???????????????00000100011 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // SUBU +32'b000000???????????????00000100100 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // AND +32'b000000???????????????00000100101 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // OR +32'b000000???????????????00000100110 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // XOR +32'b000000???????????????00000100111 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // NOR +32'b000000???????????????00000101010 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // SLT +32'b000000???????????????00000101011 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // SLTU +32'b000001?????00000???????????????? 0 0 ? 0 ? ? ? ? ? 0 ? ? ? ? // BLTZ +32'b000001?????10000???????????????? 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // BLTZAL +32'b000001?????00001???????????????? 0 0 ? 0 ? ? ? ? ? 0 ? ? ? ? // BGEZ +32'b000001?????10001???????????????? 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // BGEZAL +32'b000010?????????????????????????? 0 0 ? 0 ? ? ? ? ? 0 ? ? ? ? // J +32'b000011?????????????????????????? 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // JAL +32'b000100?????????????????????????? 0 0 ? 0 ? ? ? ? ? 0 ? ? ? ? // BEQ +32'b000101?????????????????????????? 0 0 ? 0 ? ? ? ? ? 0 ? ? ? ? // BNE +32'b000110?????00000???????????????? 0 0 ? 0 ? ? ? ? ? 0 ? ? ? ? // BLEZ +32'b000111?????00000???????????????? 0 0 ? 0 ? ? ? ? ? 0 ? ? ? ? // BGTZ +32'b001000?????????????????????????? 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // ADDI +32'b001001?????????????????????????? 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // ADDIU +32'b001010?????????????????????????? 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // SLTI +32'b001011?????????????????????????? 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // SLTIU +32'b001100?????????????????????????? 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // ANDI +32'b001101?????????????????????????? 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // ORI +32'b001110?????????????????????????? 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // XORI +32'b00111100000????????????????????? 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // LUI +32'b01000000000??????????00000000??? 0 0 ? 0 ? ? ? ? ? 0 C0 0 1 1 // MFC0 +32'b01000000100??????????00000000??? 0 0 ? 0 ? ? ? ? ? 1 ? ? ? ? // MTC0 +32'b01000010000000000000000000000001 ? ? ? 0 ? ? ? ? ? 0 ? ? ? ? // TLBR +32'b01000010000000000000000000000010 ? ? ? 0 ? ? ? ? ? 0 ? ? ? ? // TLBWI +32'b01000010000000000000000000000110 ? ? ? 0 ? ? ? ? ? 0 ? ? ? ? // TLBWR +32'b01000010000000000000000000001000 ? ? ? 0 ? ? ? ? ? 0 ? ? ? ? // TLBP +32'b01000010000000000000000000011000 0 0 ? 0 ? ? ? ? ? 0 ? ? ? ? // ERET +32'b011100??????????0000000000000000 1 1 MULT 1 0 0 MADD 0 1 0 ? ? ? ? // MADD +32'b011100??????????0000000000000001 1 1 MULTU 1 0 1 MADD 0 1 0 ? ? ? ? // MADDU +32'b011100??????????0000000000000100 1 1 MULT 1 0 0 MSUB 1 0 0 ? ? ? ? // MSUB +32'b011100??????????0000000000000101 1 1 MULTU 1 0 1 MSUB 1 0 0 ? ? ? ? // MSUBU +32'b011100???????????????00000000010 0 0 MUL? 1 0 ? PASST 0 0 0 MUL 0 1 0 // MUL +32'b100000?????????????????????????? ? ? ? 0 ? ? ? ? ? 0 ? ? ? ? // LB +32'b100001?????????????????????????? ? ? ? 0 ? ? ? ? ? 0 ? ? ? ? // LH +32'h100010?????????????????????????? ? ? ? 0 ? ? ? ? ? 0 ? ? ? ? // LWL +32'b100011?????????????????????????? ? ? ? 0 ? ? ? ? ? 0 ? ? ? ? // LW +32'b100100?????????????????????????? ? ? ? 0 ? ? ? ? ? 0 ? ? ? ? // LBU +32'b100101?????????????????????????? ? ? ? 0 ? ? ? ? ? 0 ? ? ? ? // LHU +32'h100110?????????????????????????? ? ? ? 0 ? ? ? ? ? 0 ? ? ? ? // LWR +32'b101000?????????????????????????? ? ? ? 0 ? ? ? ? ? 0 ? ? ? ? // SB +32'b101001?????????????????????????? ? ? ? 0 ? ? ? ? ? 0 ? ? ? ? // SH +32'b101010?????????????????????????? ? ? ? 0 ? ? ? ? ? 0 ? ? ? ? // SWL +32'b101011?????????????????????????? ? ? ? 0 ? ? ? ? ? 0 ? ? ? ? // SW +32'b101110?????????????????????????? ? ? ? 0 ? ? ? ? ? 0 ? ? ? ? // SWR +32'b110011?????????????????????????? 0 0 ? 0 ? ? ? ? ? 0 ? ? ? ? // PREF (NOP) \ No newline at end of file diff --git a/tools/mctrl1.txt b/tools/mctrl1.txt index c72db3b..d6bf7c0 100644 --- a/tools/mctrl1.txt +++ b/tools/mctrl1.txt @@ -53,6 +53,10 @@ 32'b01000010000000000000000000000110 0 1 1 0 0 ? ? ? ? ? // TLBWR 32'b01000010000000000000000000001000 0 0 0 1 0 ? ? ? ? ? // TLBP 32'b01000010000000000000000000011000 0 0 0 0 0 ? ? ? ? ? // ERET +32'b011100??????????0000000000000000 0 0 0 0 ? ? ? ? ? ? // MADD +32'b011100??????????0000000000000001 0 0 0 0 ? ? ? ? ? ? // MADDU +32'b011100??????????0000000000000100 0 0 0 0 ? ? ? ? ? ? // MSUB +32'b011100??????????0000000000000101 0 0 0 0 ? ? ? ? ? ? // MSUBU 32'b011100???????????????00000000010 0 0 0 0 ? ? ? ? ? ? // MUL 32'b100000?????????????????????????? 0 0 0 0 1 0 1 ALIGN 0 0 // LB 32'b100001?????????????????????????? 0 0 0 0 1 0 1 ALIGN 0 0 // LH diff --git a/tools/pcs.txt b/tools/pcs.txt index 52af898..3710696 100644 --- a/tools/pcs.txt +++ b/tools/pcs.txt @@ -53,6 +53,10 @@ 32'b01000010000000000000000000000110 0 0 0 0 // TLBWR 32'b01000010000000000000000000001000 0 0 0 0 // TLBP 32'b01000010000000000000000000011000 0 0 0 0 // ERET +32'b011100??????????0000000000000000 0 0 0 0 // MADD +32'b011100??????????0000000000000001 0 0 0 0 // MADDU +32'b011100??????????0000000000000100 0 0 0 0 // MSUB +32'b011100??????????0000000000000101 0 0 0 0 // MSUBU 32'b011100???????????????00000000010 0 0 0 0 // MUL 32'b100000?????????????????????????? 0 0 0 0 // LB 32'b100001?????????????????????????? 0 0 0 0 // LH diff --git a/tools/privilege.txt b/tools/privilege.txt index 175cc37..f08198f 100644 --- a/tools/privilege.txt +++ b/tools/privilege.txt @@ -53,6 +53,10 @@ 32'b01000010000000000000000000000110 1 // TLBWR 32'b01000010000000000000000000001000 1 // TLBP 32'b01000010000000000000000000011000 1 // ERET +32'b011100??????????0000000000000000 0 // MADD +32'b011100??????????0000000000000001 0 // MADDU +32'b011100??????????0000000000000100 0 // MSUB +32'b011100??????????0000000000000101 0 // MSUBU 32'b011100???????????????00000000010 0 // MUL 32'b100000?????????????????????????? 0 // LB 32'b100001?????????????????????????? 0 // LH diff --git a/tools/wctrl.txt b/tools/wctrl.txt index cd04dd5..e375799 100644 --- a/tools/wctrl.txt +++ b/tools/wctrl.txt @@ -53,6 +53,10 @@ 32'b01000010000000000000000000000110 0 ? ? ? // TLBWR 32'b01000010000000000000000000001000 0 ? ? ? // TLBP 32'b01000010000000000000000000011000 0 ? ? ? // ERET +32'b011100??????????0000000000000000 0 ? ? ? // MADD +32'b011100??????????0000000000000001 0 ? ? ? // MADDU +32'b011100??????????0000000000000100 0 ? ? ? // MSUB +32'b011100??????????0000000000000101 0 ? ? ? // MSUBU 32'b011100???????????????00000000010 1 RD 0 0 // MUL 32'b100000?????????????????????????? 1 RT 1 ? // LB 32'b100001?????????????????????????? 1 RT 1 ? // LH From 0269228c3c927b95656ec59c40f25d08ce16b614 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Tue, 31 Aug 2021 19:32:39 +0800 Subject: [PATCH 27/56] add test --- resources/2021/soft/func/Makefile | 2 +- resources/2021/soft/func/inst/inst_test.h | 101 ++++++++ resources/2021/soft/func/inst/n95_madd.S | 284 ++++++++++++++++++++++ resources/2021/soft/func/inst/n96_maddu.S | 266 ++++++++++++++++++++ resources/2021/soft/func/inst/n97_msub.S | 224 +++++++++++++++++ resources/2021/soft/func/start.S | 14 +- 6 files changed, 889 insertions(+), 2 deletions(-) create mode 100644 resources/2021/soft/func/inst/n95_madd.S create mode 100644 resources/2021/soft/func/inst/n96_maddu.S create mode 100644 resources/2021/soft/func/inst/n97_msub.S diff --git a/resources/2021/soft/func/Makefile b/resources/2021/soft/func/Makefile index 0b5296a..b5e640d 100644 --- a/resources/2021/soft/func/Makefile +++ b/resources/2021/soft/func/Makefile @@ -1,7 +1,7 @@ TOPDIR=$(shell pwd) #export LD_PRELOAD = -CFLAGS := -D_KERNEL -fno-builtin -mips1 -DMEMSTART=0x80000000 -DMEMSIZE=0x04000 -DCPU_COUNT_PER_US=1000 -I $(TOPDIR)/include +CFLAGS := -D_KERNEL -fno-builtin -mips32r2 -DMEMSTART=0x80000000 -DMEMSIZE=0x04000 -DCPU_COUNT_PER_US=1000 -I $(TOPDIR)/include CFLAGS += -fno-reorder-blocks -fno-reorder-functions -msoft-float OBJDIR = ./obj diff --git a/resources/2021/soft/func/inst/inst_test.h b/resources/2021/soft/func/inst/inst_test.h index 64c19b2..ccc857b 100644 --- a/resources/2021/soft/func/inst/inst_test.h +++ b/resources/2021/soft/func/inst/inst_test.h @@ -1336,3 +1336,104 @@ lw v0, offset_align(t0); \ bne v0, v1, inst_error; \ nop + +/*95*/ +#define TEST_MADD_HL(in_a, in_b, raw_hi, raw_lo, ref_lo, ref_hi) \ + li t0, in_a; \ + li t1, in_b; \ + li a0, raw_hi; \ + li a1, raw_lo; \ + mthi a0; \ + mtlo a1; \ + madd t0, t1; \ + mflo s5; \ + mfhi s6; \ + li v0, ref_lo; \ + li v1, ref_hi; \ + bne v0, s5, inst_error; \ + nop; \ + bne v1, s6, inst_error; \ + nop + +#define TEST_MADD(in_a, in_b, ref_lo, ref_hi) \ + li t0, in_a; \ + li t1, in_b; \ + mthi zero; \ + mtlo zero; \ + madd t0, t1; \ + mflo s5; \ + mfhi s6; \ + li v0, ref_lo; \ + li v1, ref_hi; \ + bne v0, s5, inst_error; \ + nop; \ + bne v1, s6, inst_error; \ + nop + +/*96*/ +#define TEST_MADDU_HL(in_a, in_b, raw_hi, raw_lo, ref_lo, ref_hi) \ + li t0, in_a; \ + li t1, in_b; \ + li a0, raw_hi; \ + li a1, raw_lo; \ + mthi a0; \ + mtlo a1; \ + maddu t0, t1; \ + mflo s5; \ + mfhi s6; \ + li v0, ref_lo; \ + li v1, ref_hi; \ + bne v0, s5, inst_error; \ + nop; \ + bne v1, s6, inst_error; \ + nop + +#define TEST_MADDU(in_a, in_b, ref_lo, ref_hi) \ + li t0, in_a; \ + li t1, in_b; \ + mthi zero; \ + mtlo zero; \ + maddu t0, t1; \ + mflo s5; \ + mfhi s6; \ + li v0, ref_lo; \ + li v1, ref_hi; \ + bne v0, s5, inst_error; \ + nop; \ + bne v1, s6, inst_error; \ + nop + +/*97 98*/ +#define TEST_MSUB_HL(in_a, in_b, raw_hi, raw_lo, ref_lo, ref_hi) \ + li t0, in_a; \ + li t1, in_b; \ + li a0, raw_hi; \ + li a1, raw_lo; \ + mthi a0; \ + mtlo a1; \ + msub t0, t1; \ + mflo s5; \ + mfhi s6; \ + li v0, ref_lo; \ + li v1, ref_hi; \ + bne v0, s5, inst_error; \ + nop; \ + bne v1, s6, inst_error; \ + nop + +#define TEST_MSUBU_HL(in_a, in_b, raw_hi, raw_lo, ref_lo, ref_hi) \ + li t0, in_a; \ + li t1, in_b; \ + li a0, raw_hi; \ + li a1, raw_lo; \ + mthi a0; \ + mtlo a1; \ + msubu t0, t1; \ + mflo s5; \ + mfhi s6; \ + li v0, ref_lo; \ + li v1, ref_hi; \ + bne v0, s5, inst_error; \ + nop; \ + bne v1, s6, inst_error; \ + nop diff --git a/resources/2021/soft/func/inst/n95_madd.S b/resources/2021/soft/func/inst/n95_madd.S new file mode 100644 index 0000000..d4d31b7 --- /dev/null +++ b/resources/2021/soft/func/inst/n95_madd.S @@ -0,0 +1,284 @@ +#include +#include +#include + +LEAF(n95_madd_test) + .set noreorder + addiu s0, s0 ,1 + li s2, 0x0 +###test inst + TEST_MADD(0x45b90738, 0xd70d64f0, 0x0a20a480, 0xf4d903bb) + TEST_MADD(0x99a451b0, 0xbe3d9998, 0x8552b080, 0x1a4b01ae) + TEST_MADD(0x85931c58, 0xfb710fb5, 0xda843238, 0x022e0ede) + TEST_MADD(0x650e4043, 0x64c17218, 0x7076dc48, 0x27c5ede2) + TEST_MADD(0xa00c6c50, 0x8e9df080, 0x78d12800, 0x2a7f453e) + TEST_MADD(0x99c874b6, 0xd7ce83e0, 0xe7934140, 0x100c6ff4) + TEST_MADD(0x1c62f360, 0x34580400, 0xb4cd8000, 0x05cddbe4) + TEST_MADD(0x99b80b00, 0x6c463000, 0x84100000, 0xd4bd99c9) + TEST_MADD(0xdc823390, 0x5208f838, 0x1aeec780, 0xf4a0762c) + TEST_MADD(0xe53080d8, 0x848a9c5a, 0xf600ebf0, 0x0cedfd5c) + TEST_MADD(0x7f2163d8, 0xab5bba80, 0x9904dc00, 0xd5f77755) + TEST_MADD(0xea7b88c0, 0x23eed510, 0xd3004c00, 0xfcfad0a2) + TEST_MADD(0x7389b4fd, 0xea063940, 0x0ba79440, 0xf614f983) + TEST_MADD(0xbcdf9b20, 0xc1451978, 0x4e96d700, 0x1072da6a) + TEST_MADD(0xdcacfd50, 0x809d0a80, 0x7273c800, 0x1193d5fc) + TEST_MADD(0x55ed3100, 0xbe5ba9f2, 0x3a915200, 0xe9f79db9) + TEST_MADD(0xcedb5fd8, 0xe1793b60, 0x4672b900, 0x05dc29af) + TEST_MADD(0x9d32f1b0, 0xbb2016b8, 0x2362d680, 0x1a94e275) + TEST_MADD(0x7091ae43, 0xdb390460, 0x9b456520, 0xefd4042c) + TEST_MADD(0x549bf440, 0xd1dc9f40, 0x2ab0d000, 0xf0c048d0) + TEST_MADD(0x63b241cc, 0x48aefe14, 0xbfdd8bf0, 0x1c4e489c) + TEST_MADD(0x4c925040, 0x0855d2c8, 0x7d633200, 0x027e3e22) + TEST_MADD(0xdb2dfd2c, 0x6c0e9f09, 0xad443a8c, 0xf0754c72) + TEST_MADD(0xdfdc9250, 0xbf1f15c3, 0x04b402f0, 0x082517d4) + TEST_MADD(0x1b339b35, 0x98c14bc0, 0x0021eec0, 0xf50792e7) + TEST_MADD(0xc8618b98, 0x69452a40, 0x1141d600, 0xe920fb5e) + TEST_MADD(0x2aea0580, 0x7f50d684, 0xf943d600, 0x1557a5d1) + TEST_MADD(0x5c69f5ec, 0x9ee23bd2, 0xfcf11f98, 0xdcf11afe) + TEST_MADD(0xb7b66b40, 0x8b50c179, 0xa013f140, 0x20f2d35b) + TEST_MADD(0x514e33b6, 0x7dc39988, 0x30153eb0, 0x27f14e94) + TEST_MADD(0x27c24e12, 0xbc0e6874, 0x70beb028, 0xf572a01c) + TEST_MADD(0xe7e6eddc, 0x13a7cad0, 0x21d4dac0, 0xfe265835) + TEST_MADD(0xa85111c0, 0xa29d50f0, 0x844ca400, 0x1ffc597a) + TEST_MADD(0x73d52eb8, 0x142ba310, 0x32fa1380, 0x0920663d) + TEST_MADD(0x41156884, 0x794c5fb2, 0x9ddba7c8, 0x1ed68915) + TEST_MADD(0xa8774820, 0xb2cf0480, 0xaaa49000, 0x1a64deef) + TEST_MADD(0xb69bcb80, 0x88d55520, 0xdf8af000, 0x2229cfd4) + TEST_MADD(0xe84175d8, 0x94048f1c, 0xaf5c8ba0, 0x0a03f608) + TEST_MADD(0x6fdedbd8, 0x67dd7f60, 0x341a9900, 0x2d637581) + TEST_MADD(0xa2319526, 0xd5f88700, 0x40770a00, 0x0f669a83) + TEST_MADD(0x61f8b9bc, 0x146e6d38, 0xd445ad20, 0x07d1b12e) + TEST_MADD(0xb9002828, 0x0310a1b9, 0xc4de2ce8, 0xff2663a0) + TEST_MADD(0xb4418f47, 0x943f129c, 0xc27f4d44, 0x1fe1ae2e) + TEST_MADD(0xd7011f8c, 0x70d8ea80, 0x6585be00, 0xededc132) + TEST_MADD(0x058b9998, 0x55395538, 0x3b611140, 0x01d897ed) + TEST_MADD(0xc13b7fc0, 0xda192fbb, 0x0caa9140, 0x094afe25) + TEST_MADD(0x776d24b0, 0x66f0a9a4, 0x1423b0c0, 0x3005c214) + TEST_MADD(0x6c6ae338, 0x5c4abc80, 0x827ebc00, 0x27161062) + TEST_MADD(0x9dc090e0, 0xb6324980, 0x55585000, 0x1c530986) + TEST_MADD(0x86d609de, 0xcd4bcb2e, 0x9e52cfe4, 0x17ff7c93) + TEST_MADD(0x1400c7dc, 0x466a6d5e, 0x967a0ec8, 0x05808784) + TEST_MADD(0xa2d88860, 0x26423686, 0x52dba240, 0xf2140c3a) + TEST_MADD(0x6770770a, 0x812cbe10, 0x6f18dca0, 0xccc14912) + TEST_MADD(0x95627048, 0xc1bae8ca, 0xf1bdd8d0, 0x19eeeef0) + TEST_MADD(0x1dbadda0, 0x5d2b0f50, 0x9741a200, 0x0ad1e2ad) + TEST_MADD(0xc7cf4f96, 0x7dd33820, 0x29f4c2c0, 0xe461dd69) + TEST_MADD(0xa1d8f960, 0xb83e3183, 0xbf02fc20, 0x1a641a33) + TEST_MADD(0xcc2c955e, 0x63c2877e, 0x8bf21644, 0xebcddc1e) + TEST_MADD(0xd2d44530, 0x602b39e6, 0x4d2dd920, 0xef07f962) + TEST_MADD(0x886c3ad7, 0xe011a4c0, 0xaf24dd40, 0x0eea3ae0) + TEST_MADD(0x0c45d0c8, 0x830e02fb, 0x57054418, 0xfa029504) + TEST_MADD(0x49979c44, 0x298742f0, 0x604807c0, 0x0bf02a38) + TEST_MADD(0x2037c800, 0xfb355f34, 0xa68ca000, 0xff65a09f) + TEST_MADD(0x21e68aeb, 0xc1cc4ec0, 0x897fca40, 0xf7c351f4) + TEST_MADD(0xe2c488b8, 0x8ed6a9d8, 0x6de4d340, 0x0cebf803) + TEST_MADD(0x0622c000, 0x849e669e, 0x21f28000, 0xfd0af6e8) + TEST_MADD(0xfe11325e, 0x5a980480, 0x4132a700, 0xff50e5e2) + TEST_MADD(0xb582a660, 0x27161c30, 0x3ef1b200, 0xf4a0785f) + TEST_MADD(0xde436ee0, 0x0b8fd2ea, 0x09b718c0, 0xfe79f1a3) + TEST_MADD(0x3ca5ebcc, 0x7fca89b0, 0xc03a4840, 0x1e464b84) + TEST_MADD(0xed8ac2a2, 0x8e11d628, 0xe523d550, 0x0836ec19) + TEST_MADD(0xee62ac9c, 0x446aed90, 0x59e583c0, 0xfb4ada5c) + TEST_MADD(0xa5a41fa0, 0x901ecf7a, 0x5a897240, 0x277d522a) + TEST_MADD(0x1665a95c, 0x01fa0f1c, 0x27e2ea10, 0x002c4643) + TEST_MADD(0xf760c288, 0x024d9a70, 0x0242eb80, 0xffec246c) + TEST_MADD(0xb91b1700, 0xff6a7770, 0x198b1000, 0x0029690d) + TEST_MADD(0x38a15d4c, 0x4d378f48, 0xf7d3b160, 0x1114d36c) + TEST_MADD(0xe1d0a988, 0x29062820, 0x95c27100, 0xfb29b14f) + TEST_MADD(0xb657c3ec, 0x42373c21, 0x02ef916c, 0xecf2bc11) + TEST_MADD(0x8cd72e00, 0x0657e392, 0xc2823c00, 0xfd2581d5) + TEST_MADD(0xcffca4a4, 0xf52aba30, 0x85e606c0, 0x02082174) + TEST_MADD(0xd823b826, 0xed601012, 0xaa4552ac, 0x02e66439) + TEST_MADD(0x306f7f24, 0x6384a554, 0x3c17ebd0, 0x12d436f0) + TEST_MADD(0x0c59e770, 0x3e387808, 0x47cbbb80, 0x03007f82) + TEST_MADD(0xc1dd451c, 0xe125f520, 0x97d86f80, 0x077cfe1d) + TEST_MADD(0xef4e68d4, 0x9ff2ad9b, 0xa5b8bc5c, 0x06437714) + TEST_MADD(0x7ef6ec24, 0xb177da10, 0xdd416a40, 0xd90d3e0e) + TEST_MADD(0x6fb25f72, 0x791ebb10, 0x583a3d20, 0x34d8b7a2) + TEST_MADD(0x58101600, 0xd3840640, 0xbc898000, 0xf0b29693) + TEST_MADD(0x07affc60, 0x5ea8d5b0, 0x94f96200, 0x02d7b093) + TEST_MADD(0xf952c740, 0x73978b1c, 0x7dfd8b00, 0xfcfc3bb4) + TEST_MADD(0x8f689828, 0x91565574, 0x7b5a3a20, 0x30abad94) + TEST_MADD(0x914d8000, 0xba3b44b8, 0x85b40000, 0x1e2b2e25) + TEST_MADD(0x4d2e3cf5, 0x70e9d5e8, 0x159c1708, 0x220aba3e) + TEST_MADD(0xb037ad58, 0x11952040, 0xbfce5600, 0xfa8538dd) + TEST_MADD(0xa4246038, 0x111ad568, 0x7085aec0, 0xf9dcc982) + TEST_MADD(0xef964a3a, 0xd18d5d08, 0x519b63d0, 0x02fa582f) + TEST_MADD(0xa4a7728e, 0x97843fdc, 0x884f6408, 0x25482191) + TEST_MADD(0xdf30b100, 0x250933f8, 0x236e7800, 0xfb40dba2) + TEST_MADD(0x1d5818a4, 0xe5093304, 0x940d0e90, 0xfce8c358) + TEST_MADD(0x15122298, 0xcbbb9870, 0xc9816280, 0xfbb2afa1) + TEST_MADD(0x88ca117e, 0x0e125f90, 0x0d0398e0, 0xf9727eaa) + TEST_MADD(0xdf4ef397, 0xda63b6b6, 0xacb3875a, 0x04cd8c0a) + TEST_MADD(0x6683ae60, 0x63fc1988, 0x187c0300, 0x2809e048) + TEST_MADD(0xe6a56cae, 0xd0003efb, 0x9483b29a, 0x04c0f562) + TEST_MADD(0x7d58aade, 0x5b2167ac, 0xd4f01f28, 0x2c9edfed) + TEST_MADD(0x61118bd0, 0x9e016e14, 0x0b424c40, 0xdad7d349) + TEST_MADD(0x7fdd22be, 0xfdcc9fee, 0xad924ea4, 0xfee69cb0) + TEST_MADD(0x70e273a0, 0xd87fc19c, 0xdf8a1580, 0xee94f3a5) + TEST_MADD(0x3940dad6, 0xa37c292b, 0x429907f2, 0xeb4f351f) + TEST_MADD(0xba7ab435, 0x2322d7d0, 0xbf14ee10, 0xf6755053) + TEST_MADD(0x0b238760, 0x2bff2a02, 0xe31ccec0, 0x01ea11f4) + TEST_MADD(0xaa6a9390, 0x8d3ab108, 0xc1fb2c80, 0x265e80ac) + TEST_MADD(0xe3667224, 0xbf514d80, 0x7cf1e600, 0x0739e7c6) + TEST_MADD(0x53b1b42e, 0x7c608578, 0x67285b90, 0x28a9a18c) + TEST_MADD(0x8241ddf4, 0x4a8d0e90, 0xa6943140, 0xdb61c148) + TEST_MADD(0x7cdcd5cf, 0xe584065f, 0xecb231d1, 0xf3151a6c) + TEST_MADD(0x50445224, 0xb34e8c5c, 0x687134f0, 0xe7f4141e) + TEST_MADD(0x436d75a7, 0x2cb9b728, 0x81e3c318, 0x0bc7ba90) + TEST_MADD(0xdb906f30, 0x0eafa7d0, 0x3fb2a700, 0xfde8e5ee) + TEST_MADD(0x5aa5b57e, 0xeb138c80, 0x1475a700, 0xf8975429) + TEST_MADD(0xbc61fc9c, 0x2c0b0f78, 0xb66f8d20, 0xf45deb8a) + TEST_MADD(0x8b3566b7, 0x2b021ecc, 0xbb054bd4, 0xec61009e) + TEST_MADD(0x666e54e8, 0xed91452c, 0x37411fe0, 0xf89fefde) + TEST_MADD(0xc6e59380, 0xfa935180, 0xc8f54000, 0x0135c230) + TEST_MADD(0xd921e0b0, 0x1f7d65c0, 0x3cfdf400, 0xfb38104d) + TEST_MADD(0x7b8db2e2, 0x84d37b50, 0xa9807ca0, 0xc48d6ea8) + TEST_MADD(0xf89e1b58, 0x26be32a0, 0x9f784700, 0xfee1fbf1) + TEST_MADD(0x524aa0a6, 0x0b334594, 0xd3839df8, 0x0399b022) + TEST_MADD(0xa3be10e8, 0x18dbc860, 0x1af39700, 0xf70a9cf8) + TEST_MADD(0x073cf5be, 0x4fbf4882, 0xccd43a7c, 0x0241385d) + TEST_MADD(0x91db7100, 0x1f78ebb0, 0xaf98b000, 0xf2758c24) + TEST_MADD(0xc49e36d8, 0x2044fa90, 0xabedc980, 0xf883c6c2) + TEST_MADD(0xaf4ab2b8, 0xf0086f40, 0x4bea7600, 0x0508ac17) + TEST_MADD(0xc72f0de2, 0x407a26e0, 0x62efb1c0, 0xf1b0a744) + TEST_MADD(0x95d26876, 0x9aaece1c, 0xaf4660e8, 0x2a05a9e7) + TEST_MADD(0x72e2ec10, 0xb9098e00, 0xbb80e000, 0xe0275a3b) + TEST_MADD(0xdeb27a9c, 0x506c0849, 0x8e89d67c, 0xf589b888) + TEST_MADD(0x530194f0, 0x00000000, 0x00000000, 0x00000000) + TEST_MADD(0x5a1a4f60, 0x00000000, 0x00000000, 0x00000000) + TEST_MADD(0x5cc4e136, 0x00000000, 0x00000000, 0x00000000) + TEST_MADD(0xab7a14c0, 0x00000000, 0x00000000, 0x00000000) + TEST_MADD(0x44d126d0, 0x00000000, 0x00000000, 0x00000000) + TEST_MADD(0x0f114ff0, 0x00000000, 0x00000000, 0x00000000) + TEST_MADD(0x60bfe48e, 0x00000000, 0x00000000, 0x00000000) + TEST_MADD(0x102ceba0, 0x00000000, 0x00000000, 0x00000000) + TEST_MADD(0x7b21e54d, 0x00000000, 0x00000000, 0x00000000) + TEST_MADD(0x5d72f954, 0x00000000, 0x00000000, 0x00000000) + TEST_MADD(0x2699b2d4, 0x00000000, 0x00000000, 0x00000000) + TEST_MADD(0x66b6dc30, 0x00000000, 0x00000000, 0x00000000) + TEST_MADD(0x00000000, 0x4ae569a0, 0x00000000, 0x00000000) + TEST_MADD(0x00000000, 0x2582c9c0, 0x00000000, 0x00000000) + TEST_MADD(0x00000000, 0xa2f01d2e, 0x00000000, 0x00000000) + TEST_MADD(0x00000000, 0x2c5300d7, 0x00000000, 0x00000000) + TEST_MADD(0x00000000, 0x7a95fab0, 0x00000000, 0x00000000) + TEST_MADD(0x00000000, 0xf415d1b4, 0x00000000, 0x00000000) + TEST_MADD(0x00000000, 0x0caf7d5c, 0x00000000, 0x00000000) + TEST_MADD(0x00000000, 0xae15e524, 0x00000000, 0x00000000) + TEST_MADD(0x00000000, 0x00000000, 0x00000000, 0x00000000) + + TEST_MADD_HL(0x3ffa9606, 0x2ec9a237, 0x4f85ec7, 0x49b98207, 0x10a9ca06, 0x7a358951) + TEST_MADD_HL(0x2a484469, 0x49cd5c37, 0x3fa82db5, 0x183a608f, 0x4bd8b450, 0xdf6bcf1e) + TEST_MADD_HL(0x7710d9e, 0x50e34fd8, 0x60c5acb, 0x2a7aa93b, 0x8664a9d, 0xc82be88b) + TEST_MADD_HL(0x21af30ae, 0x1ca02d03, 0x685858bd, 0x4ccefd25, 0x6c1c957a, 0xf22b252f) + TEST_MADD_HL(0x66e1d799, 0x15e2a286, 0x549dd00, 0x192b8658, 0xe157860, 0xbfe3326e) + TEST_MADD_HL(0x2cdf6375, 0x46894689, 0x4b567cb6, 0x4c91a38e, 0x57b3a1d1, 0x9cecdb2b) + TEST_MADD_HL(0x384ff312, 0x4d113d2d, 0x2f3bf51a, 0x6cde72ab, 0x402fcbfa, 0xee0976d5) + TEST_MADD_HL(0x4f8f28d6, 0x700964be, 0x6d5d7152, 0x7ebc2a16, 0x902efe87, 0x867610ea) + TEST_MADD_HL(0x7268c53b, 0x4e97d2f6, 0x423151f2, 0x77039cdb, 0x6551181e, 0xa948898d) + TEST_MADD_HL(0x34a1dac8, 0x731edd3, 0x2191539d, 0x14aaaf82, 0x230c0478, 0xa5e52a5a) + TEST_MADD_HL(0x38a93df0, 0x780fdf0d, 0x69ee8549, 0x760b12a2, 0x84815d9a, 0xe4a747d2) + TEST_MADD_HL(0x4dc97219, 0x55706f51, 0x1b0139ac, 0x55296e02, 0x34f74683, 0x824f5eeb) + TEST_MADD_HL(0x4b344740, 0x460cfbd0, 0x6f65df3a, 0x2aa79291, 0x83f9fb22, 0x5dfd3691) + TEST_MADD_HL(0x57b9e34c, 0x2b18f00b, 0x75bbcb52, 0x18cab68, 0x8480902f, 0x1ec0afac) + TEST_MADD_HL(0x658790b5, 0x4a97352d, 0x5ce17a3b, 0x2aa4a63e, 0x7a76a21c, 0xc1318f0f) + TEST_MADD_HL(0x6b8988a4, 0x27b50c98, 0x68e046e4, 0x58074456, 0x798e483d, 0x3c0c15b6) + TEST_MADD_HL(0x28d1c4d1, 0x1d0057d6, 0x6bb9e389, 0x494e5c23, 0x7059b4d6, 0x5f8be9d9) + TEST_MADD_HL(0x587bb637, 0x834133, 0x7600c26c, 0x5f1dd4c0, 0x762e2043, 0xa72c18b5) + TEST_MADD_HL(0x2b68665a, 0x4893d96a, 0x125d7428, 0x14877c51, 0x1eabe2c1, 0xa2322795) + TEST_MADD_HL(0xb5c1cf2, 0x1b2da090, 0x4748e98a, 0x75ee72e4, 0x487da6e9, 0x85ffb04) + TEST_MADD_HL(0xcdcf4d3, 0x5a3d34b1, 0x75173633, 0x14005110, 0x799ff791, 0x5ec772f3) + TEST_MADD_HL(0x6371ed7e, 0x6c616d5e, 0x40cb334f, 0x205fd567, 0x6ae51c27, 0x4b11afab) + TEST_MADD_HL(0x1ee83aa2, 0x3f599121, 0x37a988e2, 0x74ab081a, 0x3f4f7f92, 0x3a2258fc) + TEST_MADD_HL(0x2b224e5a, 0x42474ca6, 0x7a1b42a8, 0x1e1a36ee, 0x85461e49, 0x3491bd4a) + TEST_MADD_HL(0x6971661b, 0xed01afa, 0x3fd96431, 0xe2b4d80, 0x45f34f05, 0xfb37c1de) + TEST_MADD_HL(0x7aa889a, 0x3232730c, 0x5b5cb929, 0x7b926513, 0x5cdd8a98, 0x3501fa4b) + TEST_MADD_HL(0x521db924, 0x45955f95, 0x47055a30, 0x7bfc519f, 0x5d57470c, 0xc4f16f93) + TEST_MADD_HL(0x1e57cdc0, 0x3e302706, 0x457bbe9e, 0x356fcb3e, 0x4cdab789, 0x5fd6ddbe) + TEST_MADD_HL(0x453e578b, 0x296c5885, 0x70ec10da, 0xdef7d87, 0x7c205b1d, 0xa70ec0be) + TEST_MADD_HL(0x1f0789c7, 0x772750f, 0x54fbf440, 0x27b6cf32, 0x55e30890, 0x36bdd4db) + TEST_MADD_HL(0x28c2bf37, 0x3eb5b830, 0x4f997d14, 0x653227e4, 0x59959668, 0x87088a34) + TEST_MADD_HL(0x3ff09fd3, 0x7f40c729, 0xf11ce77, 0x58f3e39a, 0x2eda5ba7, 0x447a8165) + TEST_MADD_HL(0x7a8ee4fa, 0x7fad66c1, 0x322337be, 0x19f196bf, 0x6f431f18, 0x31d9d339) + TEST_MADD_HL(0x7ec260f7, 0x34621f16, 0x55bda8f, 0x67fc7485, 0x1f4bec0f, 0x20fcb2bf) + TEST_MADD_HL(0x464d0d26, 0x3ea0a65e, 0x57d155b0, 0x1917b2b4, 0x69041cb7, 0x4ba92aa8) + TEST_MADD_HL(0x69ffdb6a, 0x1103fa4b, 0x41e22644, 0x2b05c73b, 0x48edc978, 0xb17e9349) + TEST_MADD_HL(0x494cbe3, 0x7ff21fe4, 0x1e553b8e, 0x63afc33, 0x209f61ee, 0x79070f5f) + TEST_MADD_HL(0x1f515041, 0x60734879, 0x928cbbb, 0x2046748c, 0x14f56438, 0x397aab45) + TEST_MADD_HL(0x33586380, 0x39e493af, 0x6452f37d, 0x3d654dfd, 0x6fef79fc, 0x35f3d27d) + TEST_MADD_HL(0x42e048bc, 0x2ef92fa8, 0x6db210c7, 0x596094f7, 0x79f77672, 0xf0c6d457) + TEST_MADD_HL(0x5b773b03, 0x771e9c22, 0xce24ba6, 0x6ee43f56, 0x3771a7d6, 0x8c09e9bc) + TEST_MADD_HL(0x7b0030d9, 0x2f5d4582, 0x76136f99, 0x6d8732c9, 0x8cd54908, 0x869f7dfb) + TEST_MADD_HL(0x1576a666, 0x4225125c, 0x6276ce2f, 0x4dded742, 0x680280c5, 0xb4f3cfea) + TEST_MADD_HL(0x51e52cc5, 0x1c1eac43, 0x2fcfd730, 0x74ac61e, 0x38ceb80c, 0x3b6fd9ad) + TEST_MADD_HL(0xd63d3c, 0x3c8dc70b, 0x45e03303, 0x6a1aaf64, 0x4612e003, 0xc6f4f4f8) + TEST_MADD_HL(0x3d04a2b3, 0x1efe47fc, 0x4333b47d, 0x60e23ca, 0x4a96db4f, 0xc757f0fe) + TEST_MADD_HL(0x6ac8e244, 0x5111ef21, 0x7617b3a, 0x6ac0b700, 0x293285e8, 0x44675dc4) + TEST_MADD_HL(0x7d7e66ff, 0x3ca4b10e, 0x410ab06c, 0x38ae81db, 0x5ec50c55, 0x3a2a72cd) + TEST_MADD_HL(0x7986f836, 0x204afbb8, 0x53b458b1, 0x76c68901, 0x6308d03a, 0xa4c1e1d1) + TEST_MADD_HL(0x3b8aff19, 0x7690a3b, 0x70480e48, 0x519504e4, 0x720149a5, 0xc8d5c9a7) + TEST_MADD_HL(0x5970628c, 0x23f253dc, 0x2f669193, 0x67d82f66, 0x3bf59896, 0xb843b6) + TEST_MADD_HL(0x62a37156, 0x688bf56c, 0x28da9632, 0x7b36f4ae, 0x5122e98b, 0xfd5412f6) + TEST_MADD_HL(0x1d6c7ee8, 0x17242ebe, 0x3e27a206, 0x2e3be9ab, 0x40d08a0e, 0x342fc9db) + TEST_MADD_HL(0x2f233874, 0x48f65d8c, 0x43084058, 0x3090409f, 0x5077854a, 0xa2cd440f) + TEST_MADD_HL(0x18b105e, 0x7a4eeaac, 0x7310cd6c, 0x6a9a07f9, 0x73cd8d02, 0x59a2f321) + TEST_MADD_HL(0x25e35403, 0x47ee0bfd, 0x50552c62, 0x56773971, 0x5afa73cd, 0x7c876168) + TEST_MADD_HL(0x67aef435, 0x788bb051, 0x65bd08fd, 0x46b41b5f, 0x968f9edd, 0xcdbad024) + TEST_MADD_HL(0x22e4dc4d, 0x7facb0bc, 0x4e2baddc, 0x5607716c, 0x5f92c101, 0x844a29f8) + TEST_MADD_HL(0x2f3e84a9, 0x603a9790, 0x3e11105b, 0x7334dfab, 0x4fd3523d, 0x54e92dbb) + TEST_MADD_HL(0x25a8bf94, 0x223ec179, 0x7430048f, 0x6d8da55e, 0x7939a955, 0x8096c652) + TEST_MADD_HL(0x20628e96, 0x424891e9, 0x2cfcebf6, 0x15335ae7, 0x355f82e6, 0x27da176d) + TEST_MADD_HL(0x6e69a55e, 0x332e77d3, 0x5c510119, 0x7679ae46, 0x726417b5, 0x44facc0) + TEST_MADD_HL(0xeb9c8ab, 0x339bbb12, 0x28b0c362, 0x3695ef65, 0x2ba8bb9b, 0x85c3f46b) + TEST_MADD_HL(0x7d0b9c64, 0x45820225, 0x753834fa, 0x6e626136, 0x972bd712, 0xf710c3aa) + TEST_MADD_HL(0x9e615f8, 0xd0546c8, 0x6d7de141, 0x551b140e, 0x6dfec49a, 0xb60dce) + TEST_MADD_HL(0x15a53409, 0x3aa005a0, 0x16729b72, 0x5d2c4093, 0x1b6790f6, 0xae10f333) + TEST_MADD_HL(0x5d764422, 0x40d671f8, 0x7e4cc0b1, 0x25eb8cbc, 0x95f89c32, 0x58fc8fac) + TEST_MADD_HL(0x14345e1a, 0x3400927c, 0x7e3c4a3, 0x19f39e23, 0xbfe7350, 0x8fc06bb) + TEST_MADD_HL(0x431b6455, 0x76c26e15, 0x7ecc8946, 0x4661c588, 0x9dee2122, 0xc3278681) + TEST_MADD_HL(0x28d5005f, 0xa6864e1, 0x570cc176, 0x79d338e0, 0x58b5ba19, 0x6dc5a85f) + TEST_MADD_HL(0x2bb06474, 0x13c232f5, 0x2be48281, 0x2933779, 0x2f43be54, 0x1ea027d) + TEST_MADD_HL(0x66851d6b, 0x4f96265f, 0x27efb289, 0x588f6b87, 0x47cee7fa, 0x6805383c) + TEST_MADD_HL(0x6642506b, 0x593a2d0a, 0x3eb658ad, 0x45869592, 0x625aa3a6, 0x577e88c0) + TEST_MADD_HL(0x3be1d1aa, 0x255733c3, 0x349adebd, 0x59affc21, 0x3d56e7e4, 0xc63d8e9f) + TEST_MADD_HL(0x16aa3ce5, 0x44ae086c, 0x8dee349, 0x414af426, 0xef383ea, 0x5aa9ccc2) + TEST_MADD_HL(0x754a9f3, 0x21bac617, 0x38634d12, 0x3b01dd94, 0x395a902a, 0x2c9d1469) + TEST_MADD_HL(0x17eff7d8, 0x6eb296fa, 0x1aa3da71, 0xbb98100, 0x24fda9e8, 0x2b7a19f0) + TEST_MADD_HL(0x2a058b26, 0x472f997c, 0x1303a677, 0x31a66c51, 0x1eb30044, 0xf27988b9) + TEST_MADD_HL(0x628582af, 0x315cb320, 0x5a40959b, 0x1ae2df0e, 0x6d3fd089, 0x3bd791ee) + TEST_MADD_HL(0xce49f7f, 0x404b91e, 0x58bffef3, 0xe782829, 0x58f3ce56, 0x4281a00b) + TEST_MADD_HL(0x3bdee326, 0x26603511, 0x7aecbc33, 0x515714ee, 0x83e651e9, 0x426b0874) + TEST_MADD_HL(0x57eba2c1, 0x65878679, 0x1aa9c58b, 0x6594d212, 0x3d884833, 0x43ecc54b) + TEST_MADD_HL(0x31704326, 0x4f8780f1, 0x724f5c1b, 0x6f62c32c, 0x81ab2bee, 0x3eaef9f2) + TEST_MADD_HL(0x7ef027ff, 0x6df84a6b, 0x29178f14, 0x5685062e, 0x5f9eeda9, 0x227d73c3) + TEST_MADD_HL(0x2065af1b, 0x58cfeda5, 0x2b08f712, 0x67643fbd, 0x36463b8f, 0x4adf1b24) + TEST_MADD_HL(0x77af1e48, 0x5c94dff4, 0x39c063fc, 0x42840a8c, 0x6508eccf, 0x426d9f2c) + TEST_MADD_HL(0x7b28ac0a, 0x520ec0ca, 0x12f1355f, 0x7d22570a, 0x3a6b5573, 0xc8cd96ee) + TEST_MADD_HL(0x401610e1, 0x4449fc8c, 0x6830f3d4, 0x57d7f884, 0x794955d3, 0xb0afaf90) + TEST_MADD_HL(0x27c8f73c, 0x5bc4c900, 0x50df921f, 0x5c205ee1, 0x5f22971b, 0xc42e7ae1) + TEST_MADD_HL(0x73d355a1, 0x7c06d299, 0x5305fe9f, 0x46959a40, 0x8b237255, 0xd9e7d979) + TEST_MADD_HL(0x660269ef, 0x348cdd06, 0x6c065cc1, 0xb3c33c, 0x80f6fba9, 0xf4e991d6) + TEST_MADD_HL(0x53caf6fd, 0x400c0314, 0x30b8dd46, 0x6232ccc5, 0x45af898b, 0x22cf0f89) + TEST_MADD_HL(0x7b663c4c, 0x70ed71ea, 0x741c60bf, 0x65f29626, 0xaa8b8faf, 0x645f3f9e) + TEST_MADD_HL(0x21a8e4b, 0x8bb61df, 0x3e9135f8, 0x66e5d0c8, 0x3ea3949e, 0x94bb2f1d) + TEST_MADD_HL(0x14d0eaa9, 0x4ae67521, 0x4afe1086, 0x7cfa7e07, 0x51153194, 0x54fdfad0) + TEST_MADD_HL(0x313ccf02, 0x259a6aee, 0x5293de2b, 0xe9d678, 0x59cf5b3b, 0xc65d1e54) + TEST_MADD_HL(0x4bd68daf, 0x716f6457, 0x38884eb9, 0x26e74b9f, 0x5a230304, 0x6a0ace18) + TEST_MADD_HL(0x68d50008, 0x324b867, 0x687e8657, 0x48ab311c, 0x69c80ece, 0xa783f454) + TEST_MADD_HL(0x6d360b8a, 0xb7c4550, 0x7d4325e7, 0xf0e383e, 0x82297c25, 0x45e6055e) + TEST_MADD_HL(0x1f1d19b9, 0x1c91739d, 0x146ee94b, 0x1f99220c, 0x17e7c5a4, 0x14c90381) + + +###detect exception + bne s2, zero, inst_error + nop +###score ++ + addiu s3, s3, 1 +###output (s0<<24)|s3 +inst_error: + sll t1, s0, 24 + or t0, t1, s3 + sw t0, 0(s1) + jr ra + nop +END(n95_madd_test) diff --git a/resources/2021/soft/func/inst/n96_maddu.S b/resources/2021/soft/func/inst/n96_maddu.S new file mode 100644 index 0000000..68edf84 --- /dev/null +++ b/resources/2021/soft/func/inst/n96_maddu.S @@ -0,0 +1,266 @@ +#include +#include +#include + +LEAF(n96_maddu_test) + .set noreorder + addiu s0, s0 ,1 + li s2, 0x0 +###test inst + TEST_MADDU(0x99c9a500, 0x6c1a1b60, 0xb204e000, 0x40f0c088) + TEST_MADDU(0xee026dc0, 0xd85e0aec, 0xcf06ad00, 0xc9297ba5) + TEST_MADDU(0xa49b33d4, 0x894d6a78, 0x76fa1360, 0x5848d5e0) + TEST_MADDU(0xd16d0152, 0xbcd4f694, 0x22318f68, 0x9a7a44f5) + TEST_MADDU(0x9880cf50, 0xd7e33d18, 0x01697f80, 0x809b8cb9) + TEST_MADDU(0x686decfc, 0x2bb09c9f, 0x19efc084, 0x11d28245) + TEST_MADDU(0x290ca739, 0xc1cc4ec0, 0xdedcc8c0, 0x1f134cc7) + TEST_MADDU(0x1d1eb998, 0xd5b8328e, 0x048aa250, 0x184f8441) + TEST_MADDU(0x79b7d394, 0x0ba99ece, 0x6f359918, 0x058b8bf3) + TEST_MADDU(0x0d7f9488, 0x3647ab9c, 0x53ad5ae0, 0x02dcb0c3) + TEST_MADDU(0x3196de58, 0x4c28d54e, 0x80b6f6d0, 0x0ec0b2e6) + TEST_MADDU(0x473a0e0a, 0xe0925338, 0x28f45030, 0x3e7b828c) + TEST_MADDU(0x3721c560, 0xe7f35d08, 0xf7e20b00, 0x31f3e230) + TEST_MADDU(0x536cd050, 0x675dc658, 0xb3957b80, 0x21af56fa) + TEST_MADDU(0x2310a2f4, 0x07cd8030, 0x0dfc8dc0, 0x01119a56) + TEST_MADDU(0xc2fd5307, 0x034a3375, 0xaa575733, 0x02817c64) + TEST_MADDU(0x79fba360, 0xcc308ea8, 0xc3c27700, 0x614ba958) + TEST_MADDU(0x3f1c7b7a, 0x89f4a9ff, 0xa52a8886, 0x22028f22) + TEST_MADDU(0x6451cbd8, 0x85dc2080, 0xc800ec00, 0x3474c1ee) + TEST_MADDU(0x8885fb40, 0x65a9fc18, 0xcd228e00, 0x36378303) + TEST_MADDU(0x71f5e890, 0x1c7fba40, 0x47e2c400, 0x0cafc157) + TEST_MADDU(0x527b08db, 0xc4c2d838, 0x3c58b7e8, 0x3f64f9ae) + TEST_MADDU(0xd2d00316, 0x5ce48028, 0x99a37b70, 0x4c7eebe7) + TEST_MADDU(0xa47ba800, 0x83d06930, 0x0f178000, 0x54b12f06) + TEST_MADDU(0xcb3eee22, 0x59a7fa20, 0x0698f840, 0x472e3d6c) + TEST_MADDU(0x4092ce98, 0xef2cbae3, 0x5667a0c8, 0x3c54573f) + TEST_MADDU(0x76a3d520, 0x0219a7f1, 0xa0638320, 0x00f92b7e) + TEST_MADDU(0x4dba87a0, 0xabfd53c0, 0xaefe9800, 0x3438835d) + TEST_MADDU(0xb21ddb80, 0x86c4337c, 0x4730d200, 0x5dc42393) + TEST_MADDU(0x24bf43c2, 0x5ebb156c, 0xebf57fd8, 0x0d9915aa) + TEST_MADDU(0x88933830, 0x9b18625e, 0xd61101a0, 0x52be254c) + TEST_MADDU(0x3bd6f96c, 0x1c413041, 0xa4c5946c, 0x069ac024) + TEST_MADDU(0x0b093c0a, 0xf967e2ce, 0xea75240c, 0x0ac075e3) + TEST_MADDU(0xf0e46398, 0x95dbf923, 0xbf2075c8, 0x8d03ebc7) + TEST_MADDU(0x109f0e5c, 0xc6bd4b78, 0x25afaf20, 0x0ce74f6f) + TEST_MADDU(0x23a1f870, 0x88a80670, 0xec2f5100, 0x13056f2b) + TEST_MADDU(0x383bf8e0, 0x78e11c9e, 0x011c1a40, 0x1a8d8fa8) + TEST_MADDU(0x7a249e47, 0xde35e25c, 0x8f968f84, 0x6a0576d6) + TEST_MADDU(0x9bbd1a87, 0x87bced28, 0x133f2018, 0x5293a823) + TEST_MADDU(0x58b0b4c2, 0x4b2eaf04, 0x7f2f7108, 0x1a0bf157) + TEST_MADDU(0xabb5baa8, 0xe59a0d6c, 0x3c3546e0, 0x9a00e44b) + TEST_MADDU(0xef331cb8, 0xb5a98f8c, 0x6a767ca0, 0xa9bd922c) + TEST_MADDU(0xfbd21f10, 0xe381c1fc, 0x2351a3c0, 0xdfcaf53e) + TEST_MADDU(0x0e437d14, 0xf76494cd, 0x982ab904, 0x0dc8b855) + TEST_MADDU(0x36f97280, 0xd2dc44ac, 0x9802ee00, 0x2d47ed0a) + TEST_MADDU(0xc0196848, 0x23e672e2, 0x6f8e1f90, 0x1af0664a) + TEST_MADDU(0xad0af755, 0x46ab8a3c, 0xebacc9ec, 0x2fc4f364) + TEST_MADDU(0x78c438e8, 0xb59296e0, 0x2159bb00, 0x55a7e351) + TEST_MADDU(0x95417ec8, 0xcdef10ec, 0x35056060, 0x7810d489) + TEST_MADDU(0xabd42ba4, 0x9f4dfd40, 0xa07ffd00, 0x6aed1fe7) + TEST_MADDU(0x9c767890, 0x13f10784, 0x19f21a40, 0x0c301b12) + TEST_MADDU(0x337174a4, 0x53b2a442, 0x38012248, 0x10d1aeb6) + TEST_MADDU(0x8bbc4c00, 0x4f9ed450, 0x81c7c000, 0x2b75cd8e) + TEST_MADDU(0x98e39c2e, 0xdb32e0b0, 0x201f9fa0, 0x82e91940) + TEST_MADDU(0x6b08ed68, 0x1ec93800, 0x8a96c000, 0x0cdf2d3e) + TEST_MADDU(0xdedaacc4, 0x652203d0, 0xe7baab40, 0x5809e285) + TEST_MADDU(0xa7151a96, 0x4efab6b6, 0x74638aa4, 0x338c0ff5) + TEST_MADDU(0xb11df5a0, 0x7312ec50, 0x1d0c4200, 0x4f9d8cf1) + TEST_MADDU(0x800e4cb0, 0x39de6540, 0x58749c00, 0x1cf26e1f) + TEST_MADDU(0x6ba01e66, 0x6141f7c8, 0xf05229b0, 0x28e36757) + TEST_MADDU(0x05c01d30, 0x51b5330e, 0x694228a0, 0x01d5db36) + TEST_MADDU(0x7b685660, 0x557152ba, 0x15d981c0, 0x2930459d) + TEST_MADDU(0x4396b2d6, 0x7d40f2c4, 0x67ef37d8, 0x2111bb17) + TEST_MADDU(0xa33d54b2, 0x1ff7f310, 0xb0f84120, 0x1462886b) + TEST_MADDU(0x827d4976, 0x46c7d260, 0x13f85840, 0x24141cb6) + TEST_MADDU(0xb2c46680, 0x2106dc9b, 0xec000f80, 0x17101bdd) + TEST_MADDU(0x61e8744c, 0xf0485710, 0x136d18c0, 0x5be597b4) + TEST_MADDU(0x510523c0, 0xc4eef4ec, 0xd34ff500, 0x3e538fa9) + TEST_MADDU(0x6cab5300, 0x24d47fd0, 0x05607000, 0x0fa24bce) + TEST_MADDU(0x113f38b0, 0x960f0fb8, 0x8c130e80, 0x0a1c0efa) + TEST_MADDU(0xa4cd966c, 0x8946015e, 0x3e9ba7a8, 0x585f1698) + TEST_MADDU(0x997ab490, 0x8318fc14, 0x64d3db40, 0x4e98c507) + TEST_MADDU(0x3bf04cfc, 0x4303bb23, 0x950a9a74, 0x0fb0c3c7) + TEST_MADDU(0xf58f5fa3, 0x6095f500, 0x0065ff00, 0x5ca59b52) + TEST_MADDU(0xabaa4e80, 0x370ea7f2, 0x2b33b500, 0x24eb6acc) + TEST_MADDU(0x3a8cff75, 0xc7c89600, 0x24168e00, 0x2db17b0a) + TEST_MADDU(0x6952957c, 0x9f95ba00, 0x05c81800, 0x41a7e46f) + TEST_MADDU(0xf003fcc0, 0x6bf9ab92, 0xa2da6580, 0x653bbf60) + TEST_MADDU(0x948df508, 0x9aa84872, 0xb1615d90, 0x59bf0c99) + TEST_MADDU(0xe14aa0c0, 0xf0d16230, 0x0c47a400, 0xd3ee3b0a) + TEST_MADDU(0xb1d8a680, 0x99f2fdf0, 0xbca89800, 0x6af34ab9) + TEST_MADDU(0x06d53ad0, 0x6289382a, 0xdd292620, 0x02a14a1f) + TEST_MADDU(0xb406d184, 0xce15399c, 0xa0a21070, 0x90ec69aa) + TEST_MADDU(0xff4c6260, 0xf71b2a00, 0x8843c000, 0xf66dc9db) + TEST_MADDU(0x02f13cac, 0xea42d2c0, 0xf50a9900, 0x02b14612) + TEST_MADDU(0x7fb89370, 0x6495a978, 0x480a0c80, 0x322ec492) + TEST_MADDU(0xdb044c80, 0x5bb448cc, 0x06f0f600, 0x4e74c47f) + TEST_MADDU(0xa90dec6c, 0xf03cd014, 0x2e7e3870, 0x9ea53651) + TEST_MADDU(0x72b3e604, 0x3ccf167e, 0xd78b8df8, 0x1b3ef373) + TEST_MADDU(0xf181714c, 0xe0304af4, 0x585ff470, 0xd37ed21d) + TEST_MADDU(0x7a1bddc0, 0x5b74305c, 0xd697b100, 0x2b9f5384) + TEST_MADDU(0x53901b70, 0x582d6690, 0xbeae0f00, 0x1cc85b3d) + TEST_MADDU(0x1abfafc4, 0x4c4d5a00, 0x71bee800, 0x07f8fd3d) + TEST_MADDU(0xc401c3d9, 0x644283da, 0x12aad1ca, 0x4cc39de9) + TEST_MADDU(0xc3d92a7c, 0x10f8e302, 0x007e48f8, 0x0cfbfab4) + TEST_MADDU(0x58474c02, 0x9f6992fe, 0xaae88dfc, 0x36f8b023) + TEST_MADDU(0xbb0f6845, 0x164774b0, 0x6ef9f370, 0x1047897f) + TEST_MADDU(0x3a0547ba, 0x97b4583e, 0x02b74f0c, 0x2261fd05) + TEST_MADDU(0xc418111b, 0xf49130d0, 0x430df5f0, 0xbb562753) + TEST_MADDU(0x696fdee5, 0x716028d0, 0xd098e210, 0x2eb1fc25) + TEST_MADDU(0x6b09a660, 0xe6f17192, 0x2e5142c0, 0x608f9f0c) + TEST_MADDU(0xe52e58ea, 0xc1a21800, 0x0669f000, 0xad590dd9) + TEST_MADDU(0x1060c3f6, 0x0eede718, 0xb8a35910, 0x00f48315) + TEST_MADDU(0xdf061f84, 0xd9f51b0d, 0x05f685b4, 0xbde1b924) + TEST_MADDU(0x2ef301f4, 0x5f1a8bd0, 0xd6491240, 0x11710c0b) + TEST_MADDU(0x46c24000, 0x73818980, 0x95600000, 0x1fed10a3) + TEST_MADDU(0x257e27d0, 0x1dcebf84, 0x0e20b740, 0x045d9213) + TEST_MADDU(0xa94202b9, 0x78c54868, 0x23f22328, 0x4fd960f2) + TEST_MADDU(0x2981ba00, 0xfa88781d, 0x52e21200, 0x289ed008) + TEST_MADDU(0x3ee64b08, 0x5534a83a, 0x470a3fd0, 0x14ef6706) + TEST_MADDU(0x9178bce0, 0x6bd37980, 0x1a445000, 0x3d45a280) + TEST_MADDU(0x0bcfbae8, 0xe12afb00, 0x3e517800, 0x0a638eef) + TEST_MADDU(0xeea80fda, 0x99dd6bd0, 0x205eff20, 0x8f70dd11) + TEST_MADDU(0xcd7ccc40, 0x79ffffca, 0x27acea80, 0x61ed792b) + TEST_MADDU(0xf0d9a3fc, 0xbd1da000, 0xa6098000, 0xb1ec8d40) + TEST_MADDU(0x575f3e98, 0x71669498, 0xf94d0a40, 0x26b40d4a) + TEST_MADDU(0x1cc38b14, 0x5973913a, 0xb40fd688, 0x0a0cf782) + TEST_MADDU(0x89c6f81f, 0xa2802db0, 0x5fe80850, 0x5774e516) + TEST_MADDU(0x455a3838, 0x847ad600, 0x15aed000, 0x23e3cbf5) + TEST_MADDU(0x3dfb93e4, 0x4f109ba8, 0x99e419a0, 0x1324a80c) + TEST_MADDU(0x7a51a910, 0x2038e3d6, 0xa4ac8360, 0x0f6563db) + TEST_MADDU(0xa0042132, 0x78d9f754, 0x10c42268, 0x4b8a2da8) + TEST_MADDU(0x194f7a4e, 0xc9fad040, 0x9569f380, 0x13f8333b) + TEST_MADDU(0x28e55f80, 0xa3d2a69c, 0x7eb33200, 0x1a2bb294) + TEST_MADDU(0xbcc4d7a8, 0x923c7e90, 0x6c3dfe80, 0x6bd4de73) + TEST_MADDU(0x9f32e060, 0x3178e100, 0x44346000, 0x1ec3e8b7) + TEST_MADDU(0xe9b87330, 0x372b4f78, 0x2311ce80, 0x325e2b48) + TEST_MADDU(0x10483e78, 0xefa70d6a, 0x315df5b0, 0x0f3e124d) + TEST_MADDU(0x6285d9a4, 0x48238818, 0x39978760, 0x1bc351e3) + TEST_MADDU(0x8ee83024, 0x2a47e0d0, 0x88c29d40, 0x179a37ca) + TEST_MADDU(0x4f1eb000, 0x22e9e3b4, 0x07a3c000, 0x0aca5cae) + TEST_MADDU(0x57aea34c, 0x00000000, 0x00000000, 0x00000000) + TEST_MADDU(0x04dbdd80, 0x00000000, 0x00000000, 0x00000000) + TEST_MADDU(0x79d5a6b7, 0x00000000, 0x00000000, 0x00000000) + TEST_MADDU(0x9ad90f8c, 0x00000000, 0x00000000, 0x00000000) + TEST_MADDU(0x8237f918, 0x00000000, 0x00000000, 0x00000000) + TEST_MADDU(0xc5ecadb0, 0x00000000, 0x00000000, 0x00000000) + TEST_MADDU(0x00000000, 0xcec8f500, 0x00000000, 0x00000000) + TEST_MADDU(0x00000000, 0x0fed823c, 0x00000000, 0x00000000) + TEST_MADDU(0x00000000, 0x3ac7f7a0, 0x00000000, 0x00000000) + TEST_MADDU(0x00000000, 0x04e4cfaa, 0x00000000, 0x00000000) + TEST_MADDU(0x00000000, 0x00000000, 0x00000000, 0x00000000) + + TEST_MADDU_HL(0x12471494, 0x379b6b90, 0x78df9403, 0x392aaef2, 0x7cd7f226, 0x785c1e32) + TEST_MADDU_HL(0x3ef010c5, 0x2f8f1eae, 0x18770af3, 0x4d255c49, 0x24284dab, 0xbf52d82f) + TEST_MADDU_HL(0x77e28abd, 0x4d0e7770, 0xabab929, 0x2c7b1271, 0x2ed0a336, 0x5d6ba021) + TEST_MADDU_HL(0x8e92fd5, 0x74b77414, 0x58f4a911, 0x361e7d54, 0x5d04b579, 0x4745bdf8) + TEST_MADDU_HL(0x1938de8f, 0x2fcdfcef, 0x3a17226c, 0x24c75b61, 0x3eccdebe, 0x2576e6e2) + TEST_MADDU_HL(0x5c91e035, 0x4091b48d, 0x2817d7b7, 0x3792ce3d, 0x3f70ffae, 0x3958f6e) + TEST_MADDU_HL(0x573f7e82, 0x4fed6eea, 0x404f0930, 0x20633813, 0x5b8c8ccf, 0x6522b6e7) + TEST_MADDU_HL(0x537ce400, 0x163644aa, 0x4541154f, 0x27e902a8, 0x4c7f83a3, 0xdd686aa8) + TEST_MADDU_HL(0x53eba1ab, 0xfb1d143, 0x53dcf5d6, 0x54f90b0, 0x59020ed3, 0x27327b71) + TEST_MADDU_HL(0x54ec98ab, 0x1f72de78, 0x2e8f1c0e, 0x645eaad0, 0x38fdddb4, 0x10d084f8) + TEST_MADDU_HL(0x64e7801c, 0x30a1c24e, 0x2e5d7df4, 0x50c6d1e3, 0x4188a827, 0x5001126b) + TEST_MADDU_HL(0x1734f792, 0x187d1fdd, 0x3a3cab8d, 0x332f3d34, 0x3c74fa83, 0x382da43e) + TEST_MADDU_HL(0x2202d172, 0x4f47beea, 0x18179d0b, 0x714d13a9, 0x22a003d2, 0xe3f121dd) + TEST_MADDU_HL(0x4409b00c, 0x3375bc8d, 0x4213d30, 0x1b11828, 0x11ce75cc, 0x71cbdec4) + TEST_MADDU_HL(0x7f1ebb87, 0x6cd177f7, 0x794fff0, 0x17c03916, 0x3d9dfab6, 0x14c9e957) + TEST_MADDU_HL(0x5312265f, 0x2fe293e5, 0x3df07825, 0x6d7699f0, 0x4d7a5334, 0x799979eb) + TEST_MADDU_HL(0x42858c2d, 0x398180c, 0x32656077, 0x5608d077, 0x335476a6, 0xbb279a93) + TEST_MADDU_HL(0x726303f8, 0x29897956, 0x6bc6808, 0x35d3f0c9, 0x194bb0df, 0x47af7e19) + TEST_MADDU_HL(0x67cae968, 0x626332ea, 0x54f99455, 0x10e95eb1, 0x7cdd79cb, 0xa53107c1) + TEST_MADDU_HL(0x362afffe, 0x63ead9ec, 0x3bf55225, 0x566922fc, 0x5119a48e, 0xf1376f24) + TEST_MADDU_HL(0x2f4cc800, 0x2f02ab39, 0xf927a1, 0x7c8f399f, 0x9a8be95, 0xde3fc19f) + TEST_MADDU_HL(0x5e2d7f32, 0x6d2e702d, 0x184ea6c4, 0x2c0f1141, 0x40791b5d, 0xc6b04d0b) + TEST_MADDU_HL(0x1af9ad13, 0x41addf35, 0x5b06075c, 0x49c6a4e0, 0x61f1be8d, 0x261206cf) + TEST_MADDU_HL(0x7d54070f, 0xdf9030e, 0x36c49e47, 0x84a51d8, 0x3d9bcadc, 0x7f8ee1aa) + TEST_MADDU_HL(0x6e969fa5, 0x64a25d41, 0x7a60238, 0x982d1f0, 0x331efc2e, 0x502a4bd5) + TEST_MADDU_HL(0x63c92e9f, 0x14f2fb1, 0x3da5c978, 0x1d55b849, 0x3e287053, 0xd0f2538) + TEST_MADDU_HL(0x22a7c873, 0x3e159587, 0x2d7da400, 0x27139ff7, 0x35e5328d, 0x60a8439c) + TEST_MADDU_HL(0x32cd765e, 0x6580bcf8, 0x4a0760aa, 0x38d100aa, 0x5e2bfc98, 0x97c8b3ba) + TEST_MADDU_HL(0x5a5eecdf, 0x26602a06, 0x5eb12341, 0x2081d6df, 0x6c3d2cd8, 0xbf37fa19) + TEST_MADDU_HL(0x722bd92f, 0x3dfedef1, 0x646bfda8, 0x2af105bc, 0x80121b57, 0x5c313cfb) + TEST_MADDU_HL(0x3c6d1d10, 0x4727c095, 0x11cf88b8, 0x6a7b283f, 0x229b2ddc, 0x4939128f) + TEST_MADDU_HL(0x222ee50b, 0x38a2c266, 0x2562ca8e, 0x52666c0, 0x2cf2c84a, 0x865dff22) + TEST_MADDU_HL(0x2d2b6408, 0x55061a6a, 0x673584df, 0x70bafdcb, 0x763600c3, 0x8d0b391b) + TEST_MADDU_HL(0x13c5f68c, 0x17477da3, 0x1099d39d, 0x20d1a05f, 0x1266225f, 0x5613f783) + TEST_MADDU_HL(0x7e14167e, 0x45cfb8e6, 0x60df292c, 0x227b24ed, 0x8340e089, 0xfe93ea21) + TEST_MADDU_HL(0x358434c3, 0x5211bc64, 0x54ae6a01, 0x528b95a9, 0x65d67811, 0x47e265d5) + TEST_MADDU_HL(0x6ccd0172, 0x426f80a6, 0x458b71a3, 0x38fd3c5, 0x61c7af93, 0x15a5c3b1) + TEST_MADDU_HL(0x43a8d72a, 0x6c91404e, 0x7cfe1c95, 0x25020099, 0x99afbafb, 0x8f080f65) + TEST_MADDU_HL(0x1bf9daeb, 0x7ee36dea, 0x70a573fd, 0x630aca9d, 0x7e83484d, 0x2003f46b) + TEST_MADDU_HL(0x832cc93, 0x56e53456, 0x1fd1a8f, 0x68ded0dd, 0x4c58266, 0xdcfc663f) + TEST_MADDU_HL(0x2034359f, 0x31b9e802, 0x68bedd10, 0x5023f5ab, 0x6f003e3e, 0x100b78e9) + TEST_MADDU_HL(0x7fc21ad1, 0x151115d, 0x4dbd9b8e, 0x4f1e03ff, 0x4e65d2bd, 0xe98aa2ec) + TEST_MADDU_HL(0x5e65cb18, 0x283a27db, 0x52cb975f, 0x6396cdec, 0x61a0f0dd, 0x6a0c3374) + TEST_MADDU_HL(0x583786cf, 0xf1f0084, 0x6b70eee5, 0x7895807e, 0x70a6deb2, 0x6948033a) + TEST_MADDU_HL(0x56b5fb8, 0x4e7ba185, 0x16eac59d, 0x6f9497d0, 0x18941ac9, 0xd4f80a68) + TEST_MADDU_HL(0x4961ee1e, 0x4a1eb631, 0x198eded6, 0x7b90e68b, 0x2ecdfb5e, 0xba1cce49) + TEST_MADDU_HL(0x5894328e, 0x75dd0b43, 0x2069cba8, 0x3bc64fb0, 0x49320298, 0x5351a4da) + TEST_MADDU_HL(0x728b8d15, 0x5c4ab78b, 0x1aac3796, 0x49073512, 0x43f7ccc0, 0x90b8d279) + TEST_MADDU_HL(0x28b6e197, 0x1e01ef43, 0x4ce12d8c, 0x42ed0346, 0x51a6eac0, 0x3afd06cb) + TEST_MADDU_HL(0x3874288c, 0x122db66d, 0x33212911, 0x206fc0e6, 0x37236890, 0xb7548c82) + TEST_MADDU_HL(0x120f8aec, 0x7b5abf8e, 0x3ee29ad6, 0x87cff8a, 0x4796798f, 0xe0ba2272) + TEST_MADDU_HL(0x4a08faac, 0x62df3d6, 0x25cc7244, 0x27c8aca4, 0x2795f23c, 0xa9777c6c) + TEST_MADDU_HL(0x4f74c4b, 0x3236eb26, 0x57a027d7, 0x1d9184a1, 0x58998577, 0x9b21b0c3) + TEST_MADDU_HL(0x1264d6cf, 0x72e85402, 0x4e08deac, 0x7917b95d, 0x564a77c0, 0x8df552fb) + TEST_MADDU_HL(0x7b700bb9, 0x43d37782, 0x6b86b521, 0x3263852c, 0x8c3aff2c, 0xb37781e) + TEST_MADDU_HL(0x7fc49c47, 0x6bf6e60d, 0x1d5654ce, 0x787ffdaa, 0x5338bbdf, 0x731db745) + TEST_MADDU_HL(0x727c1efd, 0x56629161, 0xec00a1d, 0x85e0f29, 0x3561d10d, 0x91cd1a06) + TEST_MADDU_HL(0x1791cb08, 0x348db590, 0x6cb7d333, 0x54bc9437, 0x718e7c75, 0x1eb370b7) + TEST_MADDU_HL(0x2a2de535, 0x7e449852, 0x48cfb6c6, 0x787ff654, 0x5d9d9ae0, 0x335ed94e) + TEST_MADDU_HL(0x5b703fe, 0x23b6562d, 0xf73cd15, 0x7e056a8d, 0x103fe4aa, 0x8b1c7233) + TEST_MADDU_HL(0x419372dd, 0x474636f0, 0x4b5b31f9, 0xe254444, 0x5d9d1338, 0x56099174) + TEST_MADDU_HL(0x55590837, 0x714f617a, 0x6526c9f5, 0x25290fe7, 0x8aed8d8e, 0x5dacd11d) + TEST_MADDU_HL(0x11d452d2, 0x5dc96306, 0x36f40328, 0x3dbd2330, 0x3d7c2bd9, 0x15a04a1c) + TEST_MADDU_HL(0x64bdfb59, 0x2526dc27, 0x63f80739, 0x4389e817, 0x7296c763, 0xcb1aea6) + TEST_MADDU_HL(0x73c7b598, 0x7d0e8612, 0xb1905b9, 0x19be878b, 0x43a81af2, 0xed26dc3b) + TEST_MADDU_HL(0x70106dc8, 0x15e9c436, 0x5bfc723e, 0x3d564b2e, 0x65942017, 0xc7e2935e) + TEST_MADDU_HL(0x2ffc1617, 0x1876039f, 0x64537768, 0x4f284c48, 0x68e9385a, 0x67964991) + TEST_MADDU_HL(0x2387e16c, 0x602ab641, 0x958a59e, 0x10704785, 0x16b187bd, 0x2beb4bf1) + TEST_MADDU_HL(0x1e8586bf, 0xa4d6eef, 0x2182206f, 0x40dc1c53, 0x22bc9316, 0x1cddfaa4) + TEST_MADDU_HL(0x44fc51b9, 0x63a1962e, 0x2bf716be, 0x15df8c65, 0x46d03580, 0x4371a1a3) + TEST_MADDU_HL(0x3fb7edba, 0x5fd69523, 0x248e8661, 0x14f87093, 0x3c693078, 0x97f73301) + TEST_MADDU_HL(0x703af3cb, 0x2101828c, 0x4fb13065, 0x31f67ec9, 0x5e297348, 0xa0cbe7cd) + TEST_MADDU_HL(0x755a3bd5, 0x2a76632b, 0x59f4d40a, 0x5412aa44, 0x6d6be6e8, 0x758c160b) + TEST_MADDU_HL(0x586ac1a0, 0x386489b0, 0x23f6825e, 0x494270c4, 0x377095fa, 0xd6c62ec4) + TEST_MADDU_HL(0x41a7f92f, 0x1c54ccd8, 0x6c70e33c, 0x45a42e24, 0x73b50224, 0x6d5be1cc) + TEST_MADDU_HL(0x2be97eb, 0x6ddd2844, 0x5db2156a, 0x3b0870e1, 0x5edf9b10, 0xf244834d) + TEST_MADDU_HL(0x7990b391, 0x42500c88, 0x68b7dfc, 0x7c9609c7, 0x2608cf73, 0x59303acf) + TEST_MADDU_HL(0x3146b2c6, 0x1bcc90f0, 0x6d05d919, 0x20f06d30, 0x725fae30, 0x6f8f66d0) + TEST_MADDU_HL(0x2ec0e51f, 0x4e8280d3, 0x1726e300, 0x50832916, 0x257d7e4b, 0x17cd81a3) + TEST_MADDU_HL(0x38868439, 0x3a55de43, 0x3b70c619, 0x23e9b82c, 0x485235cb, 0x66b4c117) + TEST_MADDU_HL(0xd433aa8, 0x52c57991, 0x1a8e335c, 0x2c91cedb, 0x1ed7f72e, 0x69a77003) + TEST_MADDU_HL(0x489a374a, 0x605fb3de, 0x6dda7d35, 0x37753a1d, 0x892f762e, 0x464fea49) + TEST_MADDU_HL(0x3f628b6c, 0x761bb04c, 0x708c911b, 0x28d7bc8c, 0x8dcad86a, 0x3657609c) + TEST_MADDU_HL(0x423497e5, 0x37447a5c, 0x18439c51, 0x2754cf4f, 0x268e9e90, 0x8e72879b) + TEST_MADDU_HL(0x41fca361, 0x125b6e14, 0x6bc59386, 0x7e80280f, 0x7080e831, 0x19eb99a3) + TEST_MADDU_HL(0x63ba79fa, 0x209f18a3, 0x4b5eaa2e, 0x561f08cf, 0x5813f3d8, 0x539022fd) + TEST_MADDU_HL(0x766e8ce0, 0x6aa4a286, 0x55ff1bd, 0x55506fe0, 0x36b5e214, 0x47d3ed20) + TEST_MADDU_HL(0x5f8a7973, 0x2eb8856, 0x287eafaa, 0x5c24d924, 0x2995ab9c, 0x67bfbdc6) + TEST_MADDU_HL(0x502b6eeb, 0xe96c1a4, 0x3f2dce4a, 0x657645ee, 0x43bf6472, 0x579a7f7a) + TEST_MADDU_HL(0x1dc9c803, 0x26fab530, 0x628ac580, 0x2e463b4b, 0x6713e553, 0x3373dadb) + TEST_MADDU_HL(0x5ea3b996, 0x443e2edb, 0x5de4209e, 0x33232e1b, 0x771e9ae3, 0x5edfe56d) + TEST_MADDU_HL(0x2e827fcb, 0x349e83c3, 0x643d3f7f, 0x2fb68e18, 0x6dcc8def, 0x7fccc6b9) + TEST_MADDU_HL(0x1700168f, 0x742fac6, 0x78b09b15, 0x2619824b, 0x7957a040, 0xc0109ae5) + TEST_MADDU_HL(0x32aba435, 0x2500245a, 0x3cfc8389, 0x593c2e07, 0x444f5976, 0xf5ab5ca9) + TEST_MADDU_HL(0x9582e69, 0x5af34557, 0xda02fc5, 0x87f0bee, 0x10f21151, 0xf1a41e9d) + TEST_MADDU_HL(0x416b8be0, 0x70358eb, 0x2a096b00, 0x2ab2b7f1, 0x2bd436ce, 0xf4211e91) + TEST_MADDU_HL(0xec4333c, 0x20190b40, 0xadd6d5e, 0x7ae04bb, 0xcb76594, 0xa7ca67bb) + TEST_MADDU_HL(0xe7ed76, 0x3b08e3f3, 0x327b073, 0xdd87b91, 0x35d2c3b, 0x2f3e8493) + TEST_MADDU_HL(0x7d5c8736, 0x3124c2ec, 0x569e03b3, 0x66c7adf2, 0x6eaeba0b, 0x70233fba) + TEST_MADDU_HL(0x3f7a2a21, 0x6857f494, 0x293edd6d, 0x1db19b2, 0x431e4db3, 0xddd9e8c6) + +###detect exception + bne s2, zero, inst_error + nop +###score ++ + addiu s3, s3, 1 +###output (s0<<24)|s3 +inst_error: + sll t1, s0, 24 + or t0, t1, s3 + sw t0, 0(s1) + jr ra + nop +END(n96_maddu_test) diff --git a/resources/2021/soft/func/inst/n97_msub.S b/resources/2021/soft/func/inst/n97_msub.S new file mode 100644 index 0000000..deb02c5 --- /dev/null +++ b/resources/2021/soft/func/inst/n97_msub.S @@ -0,0 +1,224 @@ +#include +#include +#include + +LEAF(n97_msub_msubu_test) + .set noreorder + addiu s0, s0 ,1 + li s2, 0x0 +###test inst + TEST_MSUB_HL(0x653ad29b, 0x76d69606, 0x5b51b550, 0x52f1d93e, 0x2c53bdbd, 0xfc98179c) + TEST_MSUB_HL(0x3987c8e8, 0x66c6efd3, 0x59ceb551, 0x7a864962, 0x42b5e65a, 0x779b1a2a) + TEST_MSUB_HL(0x14f0afe7, 0x7926ed46, 0x568b2f1f, 0x3c78e0a9, 0x4ca23cd8, 0x6485ec7f) + TEST_MSUB_HL(0x4984d062, 0x5931b20e, 0x11606a6c, 0x7111bde6, 0xf7c2f86c, 0x1e28348a) + TEST_MSUB_HL(0x50f6207e, 0x6a5c6e62, 0x64672756, 0x5a596e84, 0x42c40285, 0xc0e2da48) + TEST_MSUB_HL(0xfda3c90, 0x76279850, 0x79cdf16c, 0x767db788, 0x727ce5d4, 0x54654a88) + TEST_MSUB_HL(0xdb09d5a, 0x2ac7bcf5, 0x7a9451f9, 0x78c8a150, 0x784aa9c3, 0x963df22e) + TEST_MSUB_HL(0x728e6edb, 0x76807fba, 0x3adace5c, 0x6ecab994, 0x5d3a6e4, 0x2acf8976) + TEST_MSUB_HL(0x99e9252, 0x148751eb, 0x4a3a802a, 0x67d355be, 0x49750708, 0xd5b91278) + TEST_MSUB_HL(0x6224e178, 0x5586312e, 0x303e4c81, 0x443dd148, 0xf749b7b, 0xb5a555b8) + TEST_MSUB_HL(0x7a6baf0e, 0x8e87ba3, 0x5a071dee, 0x2b3b571d, 0x55c493bf, 0x66df2733) + TEST_MSUB_HL(0xc256d9a, 0x5738e5a0, 0x2ce6e069, 0x47819e95, 0x28c37514, 0xe5625c55) + TEST_MSUB_HL(0x39cac749, 0x634a9310, 0x526e5452, 0x10d6e2dc, 0x3c041370, 0x2da1834c) + TEST_MSUB_HL(0x5d3389cf, 0x6a34e320, 0x589ca9d8, 0x3a5ab22f, 0x31f211a0, 0x2caaeb4f) + TEST_MSUB_HL(0x75c59150, 0x6214f602, 0x78496e33, 0x41923aa7, 0x4b2a27f6, 0x82243807) + TEST_MSUB_HL(0x56eddf, 0x66227f6d, 0x1ab8ec52, 0x5bdbac93, 0x1a963dd4, 0xa538c3a0) + TEST_MSUB_HL(0x50fb7a05, 0x5e615275, 0x6e464e5, 0x232e7fc7, 0xe90944b8, 0x8145217e) + TEST_MSUB_HL(0xf93166b, 0x5ba0258e, 0x42a9f4cf, 0x1822b6a6, 0x3d16eda0, 0x266ed04c) + TEST_MSUB_HL(0x4a179c16, 0xe04c7e1, 0x104509d, 0x517abd82, 0xfcf5a3dc, 0x340d742c) + TEST_MSUB_HL(0x4b7085c5, 0x3f6dac3a, 0x55d95ff7, 0x58d2b049, 0x43285d62, 0x379305a7) + TEST_MSUB_HL(0xaa0737d, 0xd1ccee, 0xd1821db, 0x26682a2b, 0xd0f6c5b, 0x20282ff5) + TEST_MSUB_HL(0x5e79fdc2, 0x585a72bc, 0x4519fc38, 0x233464ca, 0x247eabc2, 0x8869a652) + TEST_MSUB_HL(0x7a163fc0, 0x318dab3c, 0x10e7f9e9, 0x22abeda6, 0xf94627ca, 0xcc1fbca6) + TEST_MSUB_HL(0x38f77743, 0xa993245, 0x393419ea, 0x20eef786, 0x36d8582b, 0x8be5bc77) + TEST_MSUB_HL(0x40e3b1dc, 0x46c2107f, 0xea90ada, 0x5dcbe66e, 0xfcb9977d, 0x100ea4a) + TEST_MSUB_HL(0x2083372e, 0x540e61d0, 0x219bafdf, 0x1e220360, 0x16eece2a, 0xdf18c000) + TEST_MSUB_HL(0x10dc9660, 0x1a9ebbe2, 0x2029d751, 0x70394df6, 0x1e68fb86, 0xdc646d36) + TEST_MSUB_HL(0x3f2bab7a, 0x2189e5ca, 0xfdf7cdf, 0x1da7c42, 0x798d4b1, 0x9ab70bfe) + TEST_MSUB_HL(0x132b903, 0x31b31493, 0x333751c8, 0x7f6484af, 0x32fbc5ce, 0xe8b70bf6) + TEST_MSUB_HL(0x2ea407c2, 0x6039ca33, 0x431238b7, 0x76df3194, 0x318a2e72, 0x43e091ee) + TEST_MSUB_HL(0x266735f5, 0x15810e2f, 0x65a013b6, 0x193493d8, 0x62664026, 0x1dd945dd) + TEST_MSUB_HL(0x3ebf076b, 0x3df77bc6, 0x2bfbe446, 0x54ff7411, 0x1ccbb6db, 0x5d724e4f) + TEST_MSUB_HL(0x379f61f8, 0x3045bae1, 0x3ee8bffb, 0x787a637c, 0x346bb70c, 0xe05f1884) + TEST_MSUB_HL(0x13a6cc29, 0x724e1160, 0x794b93ed, 0x77b0d737, 0x70854edb, 0x8f178ed7) + TEST_MSUB_HL(0x517e6dc8, 0x3588e50f, 0x70295555, 0x5e03fbe5, 0x5f1e9485, 0xc527a52d) + TEST_MSUB_HL(0x35e24b2b, 0x4a799cce, 0x268a9b78, 0x227c4d9a, 0x16dd98c6, 0xeb429d00) + TEST_MSUB_HL(0x5d6e4b1, 0x5750659b, 0x60bac54f, 0x102f1dee, 0x5ebce81e, 0x2088d1c3) + TEST_MSUB_HL(0x5eb9b65a, 0x71be78da, 0x1289b0e1, 0x710205f1, 0xe8733cd6, 0xa8968d4d) + TEST_MSUB_HL(0x205ac6e5, 0x12b5fef9, 0x451989ec, 0x842c49d, 0x42bc2787, 0xc4b719e0) + TEST_MSUB_HL(0x6ac18ba0, 0x3b5abbbe, 0x57ccb937, 0x5f5cc852, 0x3f0c47b3, 0xcc794792) + TEST_MSUB_HL(0x3a36817e, 0x22597664, 0x2c8aac8c, 0x78ffa473, 0x24bb177a, 0xdb36fb3b) + TEST_MSUB_HL(0x94b1c2b, 0x3b3ea0bf, 0x12a7cd47, 0xf30dadb, 0x108137c2, 0x7321f6c6) + TEST_MSUB_HL(0x56875266, 0x175c77f2, 0x198804be, 0x2f1717b8, 0x11a29b2a, 0xb535c94c) + TEST_MSUB_HL(0x2702cb64, 0xbb5890e, 0x42108d7d, 0x2fadba9d, 0x4047c4e3, 0x74fa1725) + TEST_MSUB_HL(0x3874fcbf, 0x7d835901, 0x6efed5c6, 0x3fe383ec, 0x5350bede, 0xc2d3202d) + TEST_MSUB_HL(0x7eab14ba, 0x4ca58c1c, 0x17411ed4, 0x1b9f93a1, 0xf1546b15, 0x1db19749) + TEST_MSUB_HL(0x4fecfc46, 0x2da1f64, 0x38fdf5dc, 0x769d96ee, 0x381a0248, 0x2be29196) + TEST_MSUB_HL(0x5d5c942a, 0x58e756b6, 0x4929959e, 0x778d7b31, 0x28bd6486, 0xdc100955) + TEST_MSUB_HL(0xe7f0a4f, 0x5a105b19, 0x6ea8d02b, 0x447f4f13, 0x698f3972, 0x467d385c) + TEST_MSUB_HL(0x11a03f16, 0x257a6bcb, 0x2751e1a2, 0x6ed73676, 0x24bd4aba, 0x3beafe04) + TEST_MSUB_HL(0x55a90dfa, 0x4c02effd, 0x5f21c632, 0x3aa3e07b, 0x45b29a6c, 0x6a90aa69) + TEST_MSUB_HL(0x1acb778, 0x5ea82ac5, 0x6bd190d4, 0x2b77e448, 0x6b330bd6, 0x14b504f0) + TEST_MSUB_HL(0x4751f808, 0x648f4128, 0x559f2d46, 0x1c3d4f8d, 0x399b3f72, 0x7afc864d) + TEST_MSUB_HL(0x615bb121, 0x4fbf8adb, 0x14100a0d, 0x495197af, 0xf5bbe62c, 0x3bc64674) + TEST_MSUB_HL(0x1c1f4bba, 0x78351f3c, 0x403701a3, 0x77fe7efa, 0x3302803b, 0x38fb3962) + TEST_MSUB_HL(0x79bbf352, 0x75447a98, 0x71880850, 0x668b8ac6, 0x39c491e3, 0x7135fe16) + TEST_MSUB_HL(0x5acfbaf1, 0x3e4e5927, 0x799a678, 0x2994acad, 0xf17f8c46, 0xc88368f6) + TEST_MSUB_HL(0xbc49373, 0x486dc63, 0xf151e23, 0x812fba8, 0xedfd8ce, 0x9225222f) + TEST_MSUB_HL(0x65308927, 0x3ee9bbb, 0x3e373e5b, 0x4bcd1e4a, 0x3ca95c12, 0x70c51cd) + TEST_MSUB_HL(0x3f71a8a1, 0x42736c2, 0x6c599e03, 0xdaf4590, 0x6b521f7d, 0xcb74858e) + TEST_MSUB_HL(0x5289ee2f, 0x383464a7, 0x76df1e4a, 0x636ae025, 0x64c00db8, 0xda237c) + TEST_MSUB_HL(0x425f8b2d, 0x3a578387, 0x203f4da5, 0x42fec3ec, 0x111ef78a, 0xe0195831) + TEST_MSUB_HL(0x6faadcab, 0x6e45ca23, 0x33ec63a, 0x227836a3, 0xd324ea2f, 0x17e61d42) + TEST_MSUB_HL(0x6831ece9, 0x7b34c54c, 0x43852e7a, 0x75ffcf9b, 0x115fb735, 0x98a2d6f) + TEST_MSUB_HL(0x61ce863f, 0x366c2195, 0x648a151, 0x520cc94, 0xf17dc10a, 0x8c0a8ae9) + TEST_MSUB_HL(0x55e8b3f1, 0x7ea15962, 0x7357c60a, 0x2aaa6c8d, 0x48d91821, 0x9875c14b) + TEST_MSUB_HL(0x43f4295, 0x50bbf92e, 0x27756bcc, 0x1a733a06, 0x261e88a5, 0x9c7b5640) + TEST_MSUB_HL(0x1c960182, 0x26dc410c, 0x694482fb, 0xfb8544b, 0x64eda695, 0xa964033) + TEST_MSUB_HL(0x2b4971f0, 0x149db311, 0x59ddf03b, 0x218d37af, 0x56618902, 0x46d1d6bf) + TEST_MSUB_HL(0x3b0a871f, 0x349f63af, 0x5704d894, 0x7a60c78, 0x4ae1f29a, 0x60f1b147) + TEST_MSUB_HL(0x644bbdb6, 0x21622dea, 0x1fd20c13, 0x1b2375b3, 0x12bdd1a3, 0x7e30f57) + TEST_MSUB_HL(0x44a3b8d2, 0x65075d53, 0x5d4be302, 0x268c2fcc, 0x42355197, 0x8394f9b6) + TEST_MSUB_HL(0x15b56e80, 0x52d7302c, 0x2a512948, 0x205dc36f, 0x234acc6d, 0x92f6c56f) + TEST_MSUB_HL(0x3cfc3229, 0x6edcfb63, 0x134d198, 0x5456c5d6, 0xe6cbcf6c, 0xc0652cfb) + TEST_MSUB_HL(0x57c37528, 0x45594144, 0x1bd3706b, 0x60408149, 0x40d2883, 0xecae3aa9) + TEST_MSUB_HL(0x1e3ff749, 0x176f6a52, 0x67df7b55, 0x5a8e5abd, 0x651a91d1, 0x6605eb5b) + TEST_MSUB_HL(0x6fcfff73, 0x72c4e565, 0x1234ccab, 0x8f9f091, 0xe0142d79, 0x125c4932) + TEST_MSUB_HL(0x796fcd66, 0x6b2ac2e2, 0x6972c893, 0x7568ed6a, 0x369cc4f0, 0x32524d5e) + TEST_MSUB_HL(0x4624f99d, 0x5c99a05c, 0x74e0f718, 0x5893c0e5, 0x5b81955a, 0x6c72ec79) + TEST_MSUB_HL(0x20527488, 0x27d29c11, 0x40f554fa, 0x2556d4d7, 0x3bee2de1, 0x714a37cf) + TEST_MSUB_HL(0x40183803, 0x1b6730aa, 0x481e2f1e, 0x2134cb82, 0x4141cb48, 0x2c6a0984) + TEST_MSUB_HL(0x13a6f2d8, 0x72906018, 0x33826fda, 0x113fb8f4, 0x2ab7026c, 0xd507f4b4) + TEST_MSUB_HL(0x1bf51ef, 0x1fd42fa0, 0xd76f6b0, 0x6028135, 0xd3f5901, 0x3786ad5) + TEST_MSUB_HL(0x7bf4113b, 0x434441f8, 0x2dc09077, 0x2a65f8ce, 0xd2ea32f, 0x18e94ca6) + TEST_MSUB_HL(0x592614c8, 0x137fd912, 0x53371898, 0x2ef22783, 0x4c6cbf91, 0x7b6f2973) + TEST_MSUB_HL(0x53f095ba, 0x517883fa, 0x62fc7b4f, 0x38814c85, 0x4845d7e3, 0x19c0e6e1) + TEST_MSUB_HL(0x5e2bb3a9, 0x4dc7194c, 0x58f65813, 0x40aad98d, 0x3c59f5c2, 0x89c70261) + TEST_MSUB_HL(0x2205800a, 0x345e5465, 0x55b3823c, 0x1e0d918c, 0x4ebddafd, 0xd832c59a) + TEST_MSUB_HL(0x166854c3, 0x6fab94d9, 0x7546f3b0, 0x7616ed31, 0x6b80b237, 0xfb6557e6) + TEST_MSUB_HL(0x57f627a, 0x12505315, 0x5c2192a1, 0x5ccc386c, 0x5bbce41d, 0x424b966a) + TEST_MSUB_HL(0x24b0cae1, 0x379092cc, 0x15c677c0, 0x763f7c39, 0xdcfc3ad, 0xf0197eed) + TEST_MSUB_HL(0x5f5dff14, 0xd8d5906, 0x40982019, 0x125ed2bc, 0x3b8bb235, 0xa678e444) + TEST_MSUB_HL(0x5465f427, 0x46661c55, 0x48551eb2, 0x5d2c9294, 0x311f93f9, 0x3f143da1) + TEST_MSUB_HL(0x252f972e, 0x657c73a9, 0x7c50ca0, 0x5a086a41, 0xf9073221, 0xc6bf2e3) + TEST_MSUB_HL(0x2cdf19d4, 0x4bbc33c5, 0x3a0bfe68, 0x595c77b4, 0x2cc5a4ed, 0x4bd85b90) + TEST_MSUB_HL(0x38c447b3, 0x79221c10, 0x19202fa0, 0x7f70e60a, 0xfe43d972, 0x5a8ed6da) + TEST_MSUB_HL(0x66312aca, 0x219006e8, 0x2b5667ca, 0x3697403c, 0x1df092dc, 0x5767bd2c) + TEST_MSUB_HL(0x11c2e197, 0x1180b6e3, 0x3c8638aa, 0x1ac1d8a8, 0x3b4f598d, 0xfc1275c3) + TEST_MSUB_HL(0x5d5604b2, 0x71ca081f, 0x22110abe, 0x6b678ad1, 0xf89469d6, 0x27636943) + TEST_MSUB_HL(0x16ec7337, 0x13fa64bb, 0x6b43a44b, 0x25ea90c3, 0x6979abd0, 0x717aeb96) + + TEST_MSUBU_HL(0x28b7857, 0x52f377bb, 0x52a991ac, 0x31edc0a, 0x51d6798c, 0x39b8837d) + TEST_MSUBU_HL(0x2585bac6, 0x2ae1664c, 0x5744da28, 0x34554896, 0x50fbdffc, 0x2430f1ce) + TEST_MSUBU_HL(0x2f502115, 0x58b32ea9, 0x293d200e, 0xbb23f14, 0x18d87708, 0x102ba237) + TEST_MSUBU_HL(0x30cd1df9, 0x530bb814, 0x2556f4f, 0x637a5774, 0xf280b2b0, 0x21360800) + TEST_MSUBU_HL(0x3ce24838, 0xb3e1428, 0x3953ce99, 0x339e4b63, 0x36a751e6, 0x1d0ea2a3) + TEST_MSUBU_HL(0x37e2e8ba, 0x698bdc10, 0x2a61e22b, 0x791c24c, 0x13574877, 0xe2655eac) + TEST_MSUBU_HL(0x43b0ca6f, 0x49f08ea, 0x67dfb494, 0x72b03402, 0x66a6e441, 0x95d2b28c) + TEST_MSUBU_HL(0x1481d106, 0x5ca3ce47, 0x5c87fa3, 0x6faa9c52, 0xfe5cb957, 0xaa4cfa8) + TEST_MSUBU_HL(0x694ff0f, 0x68c0e153, 0x3cf3217b, 0x4dccb382, 0x3a41a452, 0xd411d2a5) + TEST_MSUBU_HL(0x31296ac0, 0xad383b0, 0x52638767, 0x49a447fa, 0x504f4ace, 0xcf4aa3fa) + TEST_MSUBU_HL(0x2ede55a4, 0x13c5f6bf, 0xca12569, 0x49215ccc, 0x90266c9, 0x97bfdf70) + TEST_MSUBU_HL(0x4f7331f2, 0x56a0250b, 0x2877adeb, 0x785f1406, 0xd9547a5, 0xe4f3f4a0) + TEST_MSUBU_HL(0x5aad27f5, 0x155a6eaa, 0x12fc0f7c, 0x27850adb, 0xb6bd322, 0x643b3c29) + TEST_MSUBU_HL(0x101d8532, 0x67aa7390, 0x65a5462d, 0x17503521, 0x5f1eaab5, 0x32abd301) + TEST_MSUBU_HL(0x4b7389ca, 0x78a8d914, 0x27d25cd6, 0x20c36e74, 0x4427072, 0x2f6070ac) + TEST_MSUBU_HL(0x47975c65, 0x5ca693b1, 0xc7a7f91, 0x7ed53914, 0xf29184e9, 0xdfa2583f) + TEST_MSUBU_HL(0x494ac7c6, 0x41f22d66, 0x63d80c75, 0x25b43642, 0x50f6ba0b, 0xad9ecf5e) + TEST_MSUBU_HL(0x2662a7e8, 0x30737970, 0x6c876ff3, 0x6f134511, 0x65439ff1, 0x15552791) + TEST_MSUBU_HL(0x73bbea04, 0x4a30ae51, 0x7420108b, 0x7898d2f6, 0x5295bcdc, 0x18550fb2) + TEST_MSUBU_HL(0x4d165b1c, 0x78b35570, 0x34597457, 0x525f6854, 0x1000f946, 0x57c34014) + TEST_MSUBU_HL(0x553f8cfc, 0x715342e4, 0x6690c118, 0x73b6df54, 0x40d3f9fc, 0x331056e4) + TEST_MSUBU_HL(0x5fb68b1, 0x165e92e9, 0xa1c8809, 0x50fb43de, 0x996b74a, 0xd67608c5) + TEST_MSUBU_HL(0x1d1d543a, 0x190811e5, 0x66efe18, 0x37534535, 0x39635ea, 0xedaf1353) + TEST_MSUBU_HL(0x4612e9db, 0x5817bf5e, 0x417bb9d8, 0x674a2ab1, 0x295eb960, 0x4530e747) + TEST_MSUBU_HL(0x53e4b754, 0x1d2df28e, 0x3d57f031, 0x6e85dafd, 0x33c7f8bb, 0xf296c265) + TEST_MSUBU_HL(0x1aeb4bef, 0x21b688e6, 0x4f043d51, 0x6ecd9fcb, 0x4b78b6da, 0x74266f11) + TEST_MSUBU_HL(0x749da6f6, 0x1aff9b1d, 0x6142dc5e, 0x11e93b20, 0x54f669b7, 0x1cec5f42) + TEST_MSUBU_HL(0x55e1fc1e, 0x29d20b07, 0x56a77b52, 0x1b84f268, 0x489fd2dd, 0x6de5c396) + TEST_MSUBU_HL(0x262c9b3b, 0x37976ba7, 0x7fa8b2a8, 0x501a70f7, 0x775e88f1, 0x8752847a) + TEST_MSUBU_HL(0x63bb0f2b, 0x1ee7247d, 0x45a835ab, 0xe2d54b7, 0x399e3de2, 0x53e7e0b8) + TEST_MSUBU_HL(0x16d1fd8a, 0x42369890, 0x204a8799, 0x1b3337f7, 0x1a638656, 0x876eaa57) + TEST_MSUBU_HL(0x479e1972, 0x2478d13c, 0x2c20b4b8, 0xe94fcc1, 0x21ecac7f, 0x3d50f409) + TEST_MSUBU_HL(0x4dbc15e, 0x6d6785ab, 0x43627f55, 0x4efd668a, 0x414ef70c, 0x11eb66c0) + TEST_MSUBU_HL(0x40bbea98, 0x558ff351, 0x49eaeb6, 0x51bbc6ca, 0xeefbe352, 0xf3b044b2) + TEST_MSUBU_HL(0x6093c95e, 0xfb26b7b, 0x61b878bc, 0xb91bae6, 0x5bcc80a1, 0x5a09b0bc) + TEST_MSUBU_HL(0x5b84b5bf, 0x6d83a2ab, 0x56ec9216, 0x1689f468, 0x2fc601a3, 0xa624afd3) + TEST_MSUBU_HL(0x77f277b2, 0x2001e76e, 0x420ee536, 0x7053591c, 0x330fb1de, 0x64704ca0) + TEST_MSUBU_HL(0x5be01c4d, 0x35e94d15, 0x78d2e147, 0x4fb8ea0f, 0x6579c0c7, 0xaabe6ebe) + TEST_MSUBU_HL(0x40ade265, 0x3450bcea, 0x638442d8, 0x4bf8dac7, 0x564c8aca, 0x3735be75) + TEST_MSUBU_HL(0x7e7612ae, 0x4bbd6867, 0x9708fe9, 0x53b6f351, 0xe40667b1, 0xb628bf4f) + TEST_MSUBU_HL(0x535f3e12, 0x24fd0e6f, 0x46db5761, 0x70d01442, 0x3acf88d3, 0x35552e74) + TEST_MSUBU_HL(0x5073607b, 0x29f332db, 0x44b26968, 0x59818ebe, 0x37838174, 0xb634ff85) + TEST_MSUBU_HL(0x1cfe5f95, 0x5600ecd8, 0x1d0fc957, 0x29a84554, 0x13523a68, 0x24ea439c) + TEST_MSUBU_HL(0x49550a0, 0x7585ca4d, 0x5fc49005, 0x21ba4f9b, 0x5da9ecf9, 0xec12cf7b) + TEST_MSUBU_HL(0x42ecbb32, 0x35246354, 0x1c20f365, 0x709d95c9, 0xe3c6d62, 0x4183d361) + TEST_MSUBU_HL(0x7419d2df, 0x6a2867a0, 0x54e2c189, 0x37282dcc, 0x24bdbd30, 0xfa54a96c) + TEST_MSUBU_HL(0x42be9054, 0x2fe65d14, 0x4ff1ccd2, 0x285b7d63, 0x4374c0d8, 0x9f91b2d3) + TEST_MSUBU_HL(0x69ec6de, 0x5aebb8ea, 0x187743c5, 0x5c5cc5e4, 0x161d5952, 0x96816ef8) + TEST_MSUBU_HL(0x55714c25, 0x164da192, 0x7dc3daf, 0x62bf12fe, 0x6a9823, 0x521d60e4) + TEST_MSUBU_HL(0x3b4d004, 0x7f965c65, 0x5b757356, 0x3929ae0f, 0x599c92db, 0xe9ba2c7b) + TEST_MSUBU_HL(0x73b69969, 0x3f674145, 0x1fe59b, 0x363c3f50, 0xe37749e2, 0x18d23d03) + TEST_MSUBU_HL(0x6952f8be, 0x64c6a94c, 0x1f4b8c08, 0x4492c689, 0xf5d5670a, 0x9ec78021) + TEST_MSUBU_HL(0x7c1736a7, 0x7ea12910, 0x69aa106d, 0xd853ec4, 0x2c488506, 0x34a1554) + TEST_MSUBU_HL(0x336780bb, 0x4a5100f3, 0x6af27e2f, 0x758a1f38, 0x5c064f08, 0xe11fedb7) + TEST_MSUBU_HL(0x8f55942, 0x72e552ac, 0x323e6d31, 0x7ecb9d70, 0x2e392514, 0xa7528118) + TEST_MSUBU_HL(0x4e976289, 0x7764454c, 0x20a328f9, 0x252093f6, 0xfbfc01c2, 0xd61c664a) + TEST_MSUBU_HL(0x55f2c459, 0xc618770, 0x76103e7d, 0x2ec2236a, 0x71e81ed3, 0xfd484d7a) + TEST_MSUBU_HL(0x51f1896, 0x1d3493fe, 0x6a663, 0x93c35ec, 0xff711353, 0x1ccbaf18) + TEST_MSUBU_HL(0x7385e4e, 0x1584473d, 0x6e2aea62, 0x7ca832eb, 0x6d8f8f93, 0x1bda1855) + TEST_MSUBU_HL(0x4ebc2913, 0x794f5344, 0x38a5ac13, 0x2cc2d6ab, 0x135656fc, 0x9999c49f) + TEST_MSUBU_HL(0x7430b8f3, 0x1a0cc11d, 0x2c2e31cb, 0x61c8824d, 0x205b7514, 0x23705bc6) + TEST_MSUBU_HL(0x3c8dbcc5, 0x2006f3e9, 0x656989df, 0x4781742a, 0x5dd62d42, 0x93b3a5dd) + TEST_MSUBU_HL(0x9cc1464, 0x6d7ec0d7, 0x5a005521, 0x158c64bc, 0x55cf969f, 0x2ea444c0) + TEST_MSUBU_HL(0x26719f24, 0x275e4d4b, 0x37c91d3e, 0x4d8faf3b, 0x31dfa4ab, 0xf2303baf) + TEST_MSUBU_HL(0x4062b346, 0x47d4d9ad, 0x4d77e855, 0x1af6e384, 0x3b670021, 0xe556736) + TEST_MSUBU_HL(0x297c10d3, 0x6d7280b1, 0x21521197, 0x2d43583a, 0xf95b053, 0x211c3657) + TEST_MSUBU_HL(0x7699f96c, 0x39da7124, 0x6a039deb, 0x6d31c72a, 0x4f3621d9, 0x567a07fa) + TEST_MSUBU_HL(0x3f9a4c4c, 0x5866787c, 0x4c4b54ab, 0x5600349d, 0x3654d507, 0xad379fcd) + TEST_MSUBU_HL(0x1f7d63a5, 0x3ce50e0d, 0x256d3bdd, 0x1032f3d0, 0x1defab9d, 0xccc8de6f) + TEST_MSUBU_HL(0x437fdd49, 0x16596290, 0x6beb0007, 0x4ae3de52, 0x66067192, 0x2be07342) + TEST_MSUBU_HL(0x7c720e04, 0x61240393, 0x195157f1, 0x355f997b, 0xea189eda, 0xed27812f) + TEST_MSUBU_HL(0x2f907235, 0xcbb380d, 0x2ae26f1f, 0x6979c49f, 0x2884e0d7, 0x7d715fee) + TEST_MSUBU_HL(0x73551bdc, 0x6286df46, 0xfe501e0, 0x78c1e65a, 0xe381aa12, 0xff0fa432) + TEST_MSUBU_HL(0x3a9535c8, 0x446b3c37, 0x4a48c3f9, 0x67dd08cb, 0x3aa0978b, 0x3e9b9ad3) + TEST_MSUBU_HL(0x26bc9209, 0x527ada3d, 0x4fcd71cc, 0x51966f4b, 0x43527422, 0x801f926) + TEST_MSUBU_HL(0x2150d558, 0x1b72c5fe, 0x346614bc, 0x69a059f4, 0x30d39e78, 0xde0ff4a4) + TEST_MSUBU_HL(0x6790345d, 0x5ec02e34, 0x56dc9ef9, 0x1456f285, 0x3087ece6, 0xb5e399a1) + TEST_MSUBU_HL(0x15c8f2cb, 0x61d121ea, 0x3cc9159a, 0x60691d20, 0x347625aa, 0x6cb40492) + TEST_MSUBU_HL(0x11993bc2, 0x3a717e85, 0x1f3a8844, 0x647aebb2, 0x1b360364, 0x7fd363e8) + TEST_MSUBU_HL(0x78c45017, 0x1a0af228, 0x76a21125, 0x31a6c3cb, 0x6a58f71b, 0x485e8233) + TEST_MSUBU_HL(0x1ecafa6c, 0x26e76f1f, 0x3410cc4d, 0xfe1ba4f, 0x2f62d49b, 0x5344933b) + TEST_MSUBU_HL(0x35cc774f, 0x102bec26, 0x75731285, 0x55494f0e, 0x720d1017, 0xe0adc554) + TEST_MSUBU_HL(0x3230f978, 0x3fe1f00b, 0x6da0e757, 0x3086b7c3, 0x611a8dd7, 0x54137f9b) + TEST_MSUBU_HL(0x6e01f0ae, 0x773bd5fa, 0x59dfb011, 0x188c696, 0x26a312ca, 0x9c48f6aa) + TEST_MSUBU_HL(0x4db41462, 0x4bc9366b, 0x6306e7a8, 0x4eb9d15c, 0x4c0612c7, 0x2136a066) + TEST_MSUBU_HL(0x5cd408ae, 0x381f90dd, 0x4f302965, 0x1c39c078, 0x3ad6554a, 0x973a6242) + TEST_MSUBU_HL(0x7194c55c, 0xb2ed2c9, 0x58e54d25, 0x4a8d4791, 0x53ef2269, 0xa850da55) + TEST_MSUBU_HL(0x79d19214, 0x84592de, 0xa676d04, 0x67280834, 0x677c514, 0x3eb7f2dc) + TEST_MSUBU_HL(0x35c600bb, 0x3d573d2e, 0x10d8e87a, 0x7f5e9f4b, 0x3f66729, 0xd910eeb1) + TEST_MSUBU_HL(0x249a587b, 0x1c52cda4, 0x7968c7d2, 0x28afbc02, 0x755c0f4d, 0x518e8e36) + TEST_MSUBU_HL(0x1a38374e, 0xefe4e16, 0x59ed4ef4, 0x65543e2c, 0x58643027, 0xe041b978) + TEST_MSUBU_HL(0x460828b2, 0x77ceb952, 0x15c7390b, 0x28d5a1b1, 0xf500e0dd, 0x5793f6ad) + TEST_MSUBU_HL(0x5638bd34, 0x24d867aa, 0x31e09091, 0x3e6aa728, 0x2577b32c, 0x34bd16a0) + TEST_MSUBU_HL(0x4e516f14, 0x66c33dba, 0x776c5e78, 0x220929b, 0x57fc314c, 0x1f421a13) + TEST_MSUBU_HL(0x1420f940, 0x712adc6a, 0x43379665, 0x24db3d8a, 0x3a51a9a2, 0x5481090a) + TEST_MSUBU_HL(0x22797603, 0x973885e, 0x31850e8d, 0x53b1d5b9, 0x303f3a7a, 0x60de89f) + TEST_MSUBU_HL(0xa237683, 0x6372fab7, 0x2b091b40, 0x7855f2c0, 0x2718d6b3, 0x27ea4d1b) + TEST_MSUBU_HL(0x7a291e75, 0x4e1fc41d, 0x70ab7a86, 0x47dc370e, 0x4b63caae, 0x9fb72fcd) + TEST_MSUBU_HL(0x7aa5c79a, 0x1346b2e1, 0xedb6e19, 0x28a20641, 0x59f4141, 0x160883e7) + TEST_MSUBU_HL(0x1c16b855, 0x52caf402, 0x4cad5304, 0x2c147c4d, 0x4397c745, 0x9f2407a3) + +###detect exception + bne s2, zero, inst_error + nop +###score ++ + addiu s3, s3, 1 +###output (s0<<24)|s3 +inst_error: + sll t1, s0, 24 + or t0, t1, s3 + sw t0, 0(s1) + jr ra + nop +END(n97_msub_msubu_test) diff --git a/resources/2021/soft/func/start.S b/resources/2021/soft/func/start.S index 5ff7268..6d2cfd7 100644 --- a/resources/2021/soft/func/start.S +++ b/resources/2021/soft/func/start.S @@ -2,7 +2,7 @@ #include #include -#define TEST_NUM 94 +#define TEST_NUM 97 ##s0, number @@ -671,6 +671,18 @@ kseg0_kseg1: nop jal wait_1s nop + jal n95_madd_test + nop + jal wait_1s + nop + jal n96_maddu_test + nop + jal wait_1s + nop + jal n97_msub_msubu_test + nop + jal wait_1s + nop ###check io access LI (a0, IO_SIMU_ADDR) From b0a9cd857c35cd61b3876eaeb0ec332480002710 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Tue, 31 Aug 2021 20:43:49 +0800 Subject: [PATCH 28/56] fix bug in MADD MADDU MSUB MSUBU --- resources/2021/soft/func/inst/inst_test.h | 8 ++++---- src/Core/Datapath.sv | 14 +++++++------- src/Core/Gadgets.sv | 4 ++++ 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/resources/2021/soft/func/inst/inst_test.h b/resources/2021/soft/func/inst/inst_test.h index ccc857b..310c44d 100644 --- a/resources/2021/soft/func/inst/inst_test.h +++ b/resources/2021/soft/func/inst/inst_test.h @@ -1338,7 +1338,7 @@ nop /*95*/ -#define TEST_MADD_HL(in_a, in_b, raw_hi, raw_lo, ref_lo, ref_hi) \ +#define TEST_MADD_HL(in_a, in_b, raw_hi, raw_lo, ref_hi, ref_lo) \ li t0, in_a; \ li t1, in_b; \ li a0, raw_hi; \ @@ -1371,7 +1371,7 @@ nop /*96*/ -#define TEST_MADDU_HL(in_a, in_b, raw_hi, raw_lo, ref_lo, ref_hi) \ +#define TEST_MADDU_HL(in_a, in_b, raw_hi, raw_lo, ref_hi, ref_lo) \ li t0, in_a; \ li t1, in_b; \ li a0, raw_hi; \ @@ -1404,7 +1404,7 @@ nop /*97 98*/ -#define TEST_MSUB_HL(in_a, in_b, raw_hi, raw_lo, ref_lo, ref_hi) \ +#define TEST_MSUB_HL(in_a, in_b, raw_hi, raw_lo, ref_hi, ref_lo) \ li t0, in_a; \ li t1, in_b; \ li a0, raw_hi; \ @@ -1421,7 +1421,7 @@ bne v1, s6, inst_error; \ nop -#define TEST_MSUBU_HL(in_a, in_b, raw_hi, raw_lo, ref_lo, ref_hi) \ +#define TEST_MSUBU_HL(in_a, in_b, raw_hi, raw_lo, ref_hi, ref_lo) \ li t0, in_a; \ li t1, in_b; \ li a0, raw_hi; \ diff --git a/src/Core/Datapath.sv b/src/Core/Datapath.sv index 744d332..ddb120e 100644 --- a/src/Core/Datapath.sv +++ b/src/Core/Datapath.sv @@ -1137,11 +1137,11 @@ module Datapath ( ); // TODO: Optimize ME - assign {M_I0_MUASH, M_I0_MUASL} = M.I0.MCtrl.MAS[0] ? {M_I0_MULTUHF, M_I0_MULTLF} + {HI, LO} - : {M_I0_MULTUHF, M_I0_MULTLF} - {HI, LO}; - assign {M_I0_MASH, M_I0_MASL} = M.I0.MCtrl.MAS[0] ? $signed({M_I0_MULTHF, M_I0_MULTLF}) + $signed({HI, LO}) - : $signed({M_I0_MULTHF, M_I0_MULTLF}) - $signed({HI, LO}); - + assign {M_I0_MUASH, M_I0_MUASL} = M.I0.MCtrl.MAS[0] ? {HI, LO} + {M_I0_MULTUHF, M_I0_MULTLF} + : {HI, LO} - {M_I0_MULTUHF, M_I0_MULTLF}; + assign {M_I0_MASH, M_I0_MASL} = M.I0.MCtrl.MAS[0] ? $signed({HI, LO}) + $signed({M_I0_MULTHF, M_I0_MULTLF}) + : $signed({HI, LO}) - $signed({M_I0_MULTHF, M_I0_MULTLF}); + myBuffer #(96) M_I0_MULT_buffer ( clk, rst, M_I0_MULT_CNTR[0] & M.I0.MCtrl.MAS == 2'b00 | M_I0_MAS_bvalid & |M.I0.MCtrl.MAS, @@ -1192,13 +1192,13 @@ module Datapath ( ffen #(32) HI_ff ( clk, M_I0_HI, - M.I0.MCtrl.HW & M_I0_go, + M.I0.MCtrl.HW & M_go, HI ); ffen #(32) LO_ff ( clk, M_I0_LO, - M.I0.MCtrl.LW & M_I0_go, + M.I0.MCtrl.LW & M_go, LO ); diff --git a/src/Core/Gadgets.sv b/src/Core/Gadgets.sv index 9c22bba..26bdf69 100644 --- a/src/Core/Gadgets.sv +++ b/src/Core/Gadgets.sv @@ -73,6 +73,10 @@ module instr_valid ( 32'b01000010000000000000000000000110: valid = 1'b1; // TLBWR 32'b01000010000000000000000000001000: valid = 1'b1; // TLBP 32'b01000010000000000000000000011000: valid = 1'b1; // ERET + 32'b011100??????????0000000000000000: valid = 1'b1; // MADD + 32'b011100??????????0000000000000001: valid = 1'b1; // MADDU + 32'b011100??????????0000000000000100: valid = 1'b1; // MSUB + 32'b011100??????????0000000000000101: valid = 1'b1; // MSUBU 32'b011100???????????????00000000010: valid = 1'b1; // MUL 32'b100000??????????????????????????: valid = 1'b1; // LB 32'b100001??????????????????????????: valid = 1'b1; // LH From 53c0c018bb58c251ac4cc5aff7d5c0d30a2a28c1 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Tue, 31 Aug 2021 21:11:59 +0800 Subject: [PATCH 29/56] fix bug in decode --- src/Core/Controller.sv | 2 +- tools/ctrl_maker.py | 2 +- tools/decoder.py | 2 +- tools/mctrl0.txt | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Core/Controller.sv b/src/Core/Controller.sv index 97edd9b..b95ee9d 100644 --- a/src/Core/Controller.sv +++ b/src/Core/Controller.sv @@ -64,7 +64,7 @@ module Controller ( assign ctrl.MCtrl0.HW = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (~inst[1] & inst[0] | inst[3]) | inst[30] & inst[29] & ~inst[1]; assign ctrl.MCtrl0.LW = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (inst[1] & inst[0] | inst[3]) | inst[30] & inst[29] & ~inst[1]; assign ctrl.MCtrl0.HLS = HLS_t'({~inst[27] & ~inst[26] & (~inst[30] & ~inst[31] & ~inst[29] & ~inst[28] & inst[4] & inst[3] | inst[30] & inst[29]), ~inst[30] & inst[1], inst[0]}); - assign ctrl.MCtrl0.MAS = MAS_t'({inst[2], ~inst[2] & ~inst[1]}); + assign ctrl.MCtrl0.MAS = MAS_t'({inst[2], inst[30] & ~inst[2] & ~inst[1]}); assign ctrl.MCtrl0.C0D = inst[15:11]; assign ctrl.MCtrl0.C0W = ~inst[31] & inst[30] & ~inst[29] & inst[23] & ~inst[3]; assign ctrl.MCtrl0.SEL = inst[2:0]; diff --git a/tools/ctrl_maker.py b/tools/ctrl_maker.py index c7fd510..a670c42 100644 --- a/tools/ctrl_maker.py +++ b/tools/ctrl_maker.py @@ -1,4 +1,4 @@ -with open('wctrl.txt') as f: +with open('mctrl0.txt') as f: lines = f.readlines() title = lines[0].split() items = [x.split() for x in lines[1:]] diff --git a/tools/decoder.py b/tools/decoder.py index e8576cc..ff11b8f 100644 --- a/tools/decoder.py +++ b/tools/decoder.py @@ -131,7 +131,7 @@ for inst, name in table: ctrl['MCtrl0_HW'] = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (~inst[1] & inst[0] | inst[3]) | inst[30] & inst[29] & ~inst[1] ctrl['MCtrl0_LW'] = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (inst[1] & inst[0] | inst[3]) | inst[30] & inst[29] & ~inst[1] ctrl['MCtrl0_HLS'] = (~inst[27] & ~inst[26] & (~inst[30] & ~inst[31] & ~inst[29] & ~inst[28] & inst[4] & inst[3] | inst[30] & inst[29]), ~inst[30] & inst[1], inst[0]) - ctrl['MCtrl0_MAS'] = (inst[2], ~inst[2] & ~inst[1]) + ctrl['MCtrl0_MAS'] = (inst[2], inst[30] & ~inst[2] & ~inst[1]) ctrl['MCtrl0_C0W'] = ~inst[31] & inst[30] & ~inst[29] & inst[23] & ~inst[3] ctrl['MCtrl0_RS0'] = (ctrl['DP1'], inst[30], ~inst[29] & (inst[30] | ~inst[1])) diff --git a/tools/mctrl0.txt b/tools/mctrl0.txt index af23ad6..6f1e58c 100644 --- a/tools/mctrl0.txt +++ b/tools/mctrl0.txt @@ -14,8 +14,8 @@ 32'b000000?????000000000000000010001 1 0 RS 0 ? ? ? ? ? 0 ? ? ? ? // MTHI 32'b0000000000000000?????00000010010 0 0 ? 0 ? ? ? ? ? 0 LO 0 0 0 // MFLO 32'b000000?????000000000000000010011 0 1 RS 0 ? ? ? ? ? 0 ? ? ? ? // MTLO -32'b000000??????????0000000000011000 1 1 MULT 1 0 0 PASST ? ? 0 ? ? ? ? // MULT -32'b000000??????????0000000000011001 1 1 MULTU 1 0 1 PASST ? ? 0 ? ? ? ? // MULTU +32'b000000??????????0000000000011000 1 1 MULT 1 0 0 PASST 0 0 0 ? ? ? ? // MULT +32'b000000??????????0000000000011001 1 1 MULTU 1 0 1 PASST 0 0 0 ? ? ? ? // MULTU 32'b000000??????????0000000000011010 1 1 DIV 1 1 0 ? ? ? 0 ? ? ? ? // DIV 32'b000000??????????0000000000011011 1 1 DIVU 1 1 1 ? ? ? 0 ? ? ? ? // DIVU 32'b000000???????????????00000100000 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // ADD From 3dffdae575ecab4a1b1d39cbfe0e766da1d367a3 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Wed, 1 Sep 2021 23:12:58 +0800 Subject: [PATCH 30/56] try add D-Cache's CACHE inst --- README.md | 132 +++++++++++++++++++++++++++------------- src/CP0/CP0.sv | 12 +--- src/Cache/DCache.sv | 8 +-- src/Core/Gadgets.sv | 14 ++--- src/MMU/MMU.sv | 83 ++++++++++--------------- src/MyCPU.sv | 3 + src/include/CP0.svh | 7 +-- src/include/Cache.svh | 11 ---- src/include/DCache.svh | 19 +++--- src/include/ICache.svh | 23 ++++--- src/include/defines.svh | 25 +++++--- 11 files changed, 184 insertions(+), 153 deletions(-) delete mode 100644 src/include/Cache.svh diff --git a/README.md b/README.md index 3c50458..abb76dd 100644 --- a/README.md +++ b/README.md @@ -28,46 +28,94 @@ Our awesome `MIPS` CPU written in `SystemVerilog` for Loongson Cup - [ ] 浮点运算指令报`Coprocessor Unusable`,同时`CP0`中新增`Cause.CE` :clock3: - [ ] 新增指令 -| Status | Instruction | Type | Tier | Comment | -| :----------------: | :---------: | :------: | :--: | :-------------------------------------- | -| :hourglass: | `Cache` | `SYS` | 2 | | -| :heavy_check_mark: | `PREF` | `SYS` | 1 | Treat as `NOP` | -| :heavy_check_mark: | `SYNC` | `SYS` | 1 | Treat as `NOP` (We're strongly ordered) | -| :clock3: | `WAIT` | `SYS` | 2 | | -| :clock3: | `TEQ` | `SYS` | 2 | | -| :clock3: | `TEQI` | `SYS` | 2 | | -| :clock3: | `TGE` | `SYS` | 2 | | -| :clock3: | `TGEI` | `SYS` | 2 | | -| :clock3: | `TGEIU` | `SYS` | 2 | | -| :clock3: | `TGEU` | `SYS` | 2 | | -| :clock3: | `TLT` | `SYS` | 2 | | -| :clock3: | `TLTI` | `SYS` | 2 | | -| :clock3: | `TLTIU` | `SYS` | 2 | | -| :clock3: | `TLTU` | `SYS` | 2 | | -| :clock3: | `TNE` | `SYS` | 2 | | -| :clock3: | `TNEI` | `SYS` | 2 | | -| :clock3: | `CLO` | `ARITH` | 2 | `RT == RD` | -| :clock3: | `CLZ` | `ARITH` | 2 | `RT == RD` | -| :hourglass: | `MADD` | `ARITH` | 2 | `M`阶段加一个流水级 | -| :hourglass: | `MADDU` | `ARITH` | 2 | `M`阶段加一个流水级 | -| :hourglass: | `MSUB` | `ARITH` | 2 | `M`阶段加一个流水级 | -| :hourglass: | `MSUBU` | `ARITH` | 2 | `M`阶段加一个流水级 | -| :hourglass: | `MOVN` | `ARITH` | 2 | `D`阶段阻塞 | -| :hourglass: | `MOVZ` | `ARITH` | 2 | `D`阶段阻塞 | -| :x: | `LL` | `MEM` | 3 | 修改内核去除相关指令 | -| :heavy_check_mark: | `LWL` | `MEM` | 1 | | -| :heavy_check_mark: | `LWR` | `MEM` | 1 | | -| :x: | `SC` | `MEM` | 3 | 修改内核去除相关指令 | -| :heavy_check_mark: | `SWL` | `MEM` | 1 | | -| :heavy_check_mark: | `SWR` | `MEM` | 1 | | -| :clock3: | `MOVF` | `FP` | 3 | | -| :clock3: | `MOVT` | `FP` | 3 | | -| :x: | `BEQL` | `BRANCH` | 3 | 修改编译指令 | -| :x: | `BGEZALL` | `BRANCH` | 3 | 修改编译指令 | -| :x: | `BGEZL` | `BRANCH` | 3 | 修改编译指令 | -| :x: | `BGTZL` | `BRANCH` | 3 | 修改编译指令 | -| :x: | `BLEZL` | `BRANCH` | 3 | 修改编译指令 | -| :x: | `BLTZALL` | `BRANCH` | 3 | 修改编译指令 | -| :x: | `BLTZL` | `BRANCH` | 3 | 修改编译指令 | -| :x: | `BNEL` | `BRANCH` | 3 | 修改编译指令 | +| Status | Instruction | Type | Tier | Comment | +| :----------------: | :-------------------------------: | :------: | :--: | :-------------------------------------- | +| :hourglass: | `I-Cache Index Invalid` | `SYS` | 2 | | +| :hourglass: | `I-Cache Hit Invalid` | `SYS` | 2 | | +| :hourglass: | `D-Cache Index Writeback Invalid` | `SYS` | 2 | | +| :hourglass: | `D-Cache Index Store Tag` | `SYS` | 2 | | +| :hourglass: | `D-Cache Hit Invalid` | `SYS` | 2 | | +| :hourglass: | `D-Cache Hit Writeback Invalid` | `SYS` | 2 | | +| :heavy_check_mark: | `PREF` | `SYS` | 1 | Treat as `NOP` | +| :heavy_check_mark: | `SYNC` | `SYS` | 1 | Treat as `NOP` (We're strongly ordered) | +| :clock3: | `WAIT` | `SYS` | 2 | | +| :clock3: | `TEQ` | `SYS` | 2 | | +| :clock3: | `TEQI` | `SYS` | 2 | | +| :clock3: | `TGE` | `SYS` | 2 | | +| :clock3: | `TGEI` | `SYS` | 2 | | +| :clock3: | `TGEIU` | `SYS` | 2 | | +| :clock3: | `TGEU` | `SYS` | 2 | | +| :clock3: | `TLT` | `SYS` | 2 | | +| :clock3: | `TLTI` | `SYS` | 2 | | +| :clock3: | `TLTIU` | `SYS` | 2 | | +| :clock3: | `TLTU` | `SYS` | 2 | | +| :clock3: | `TNE` | `SYS` | 2 | | +| :clock3: | `TNEI` | `SYS` | 2 | | +| :clock3: | `CLO` | `ARITH` | 2 | `RT == RD` | +| :clock3: | `CLZ` | `ARITH` | 2 | `RT == RD` | +| :heavy_check_mark: | `MADD` | `ARITH` | 2 | `M`阶段加一个流水级 | +| :heavy_check_mark: | `MADDU` | `ARITH` | 2 | `M`阶段加一个流水级 | +| :heavy_check_mark: | `MSUB` | `ARITH` | 2 | `M`阶段加一个流水级 | +| :heavy_check_mark: | `MSUBU` | `ARITH` | 2 | `M`阶段加一个流水级 | +| :hourglass: | `MOVN` | `ARITH` | 2 | `D`阶段阻塞 | +| :hourglass: | `MOVZ` | `ARITH` | 2 | `D`阶段阻塞 | +| :x: | `LL` | `MEM` | 3 | 修改内核去除相关指令 | +| :heavy_check_mark: | `LWL` | `MEM` | 1 | | +| :heavy_check_mark: | `LWR` | `MEM` | 1 | | +| :x: | `SC` | `MEM` | 3 | 修改内核去除相关指令 | +| :heavy_check_mark: | `SWL` | `MEM` | 1 | | +| :heavy_check_mark: | `SWR` | `MEM` | 1 | | +| :clock3: | `MOVF` | `FP` | 3 | | +| :clock3: | `MOVT` | `FP` | 3 | | +| :x: | `BEQL` | `BRANCH` | 3 | 修改编译指令 | +| :x: | `BGEZALL` | `BRANCH` | 3 | 修改编译指令 | +| :x: | `BGEZL` | `BRANCH` | 3 | 修改编译指令 | +| :x: | `BGTZL` | `BRANCH` | 3 | 修改编译指令 | +| :x: | `BLEZL` | `BRANCH` | 3 | 修改编译指令 | +| :x: | `BLTZALL` | `BRANCH` | 3 | 修改编译指令 | +| :x: | `BLTZL` | `BRANCH` | 3 | 修改编译指令 | +| :x: | `BNEL` | `BRANCH` | 3 | 修改编译指令 | +## `Cache`指令 + +预计实现以下`7`条操作 + +```verilog +32'b101111?????00000???????????????? // I-Cache Index Invalid +32'b101111?????01000???????????????? // I-Cache Index Store Tag +32'b101111?????10000???????????????? // I-Cache Hit Invalid +32'b101111?????00001???????????????? // D-Cache Index Writeback Invalid +32'b101111?????01001???????????????? // D-Cache Index Store Tag +32'b101111?????10001???????????????? // D-Cache Hit Invalid +32'b101111?????10101???????????????? // D-Cache Hit Writeback Invalid +``` + +其中,`Index Store Tag`中使用到了`TagLo`和`TagHi`寄存器。考虑到地址最多`32`位,故不实现`TagHi`寄存器(恒`0`);同时,由于`TagLo`和`TagHi`寄存器定义与具体处理器实现相关,在应用上用于将`Cache`的`Tag`清零(可以魔改内核),故也不实现`TagLo`寄存器(恒`0`)。所以`Index Store Tag`指令在实现上变为不写回的`Index Invalid` + +对于上述操作,具体实现: + +``` +Cache -> VIPT +Index Invalid : VA -> Index -> (Write Back) -> Write Zero +Index Store Tag : VA -> Index -> Write Zero +Hit Invalid : VA -> Lookup -> Hit? -> Write Zero +Hit Writeback Invalid : VA -> Lookup -> Hit? -> (Write Back) -> Write Zero +``` + +控制信号: + +| `CacheOp[2]` | `CacheOp[1]` | `CacheOp[0]` | Name | +| :------------------------: | :---------------------: | :----------------------------: | :---: | +| 0 | 0 | 0 | `NOP` | +| 0 | 0 | 1 | | +| 0 | 1 | ? | | +| 1 | 0 | 0 | | +| 1 | 0 | 1 | | +| 1 | 1 | 0 | | +| 1 | 1 | 1 | | +| `I-Cache(0) or D-Cache(1)` | `Lookup(0) or Index(1)` | `WriteBack(0) or WriteOnly(1)` | | + +备注: + +1. `Cache`指令当成写请求 +2. diff --git a/src/CP0/CP0.sv b/src/CP0/CP0.sv index bfe4991..304febf 100644 --- a/src/CP0/CP0.sv +++ b/src/CP0/CP0.sv @@ -45,7 +45,6 @@ module CP0 ( & |{rf_cp0.Cause.IP & rf_cp0.Status.IM, rf_cp0.Cause.TI & rf_cp0.Status.IM[7]}; - assign rf_cp0.TagLo.zero = 9'b0; assign rf_cp0.Config.M = 1'b1; assign rf_cp0.Config.zero = 15'b0; assign rf_cp0.Config.BE = 1'b0; @@ -88,9 +87,6 @@ module CP0 ( always_ff @(posedge clk) if (rst) begin - rf_cp0.TagLo.Tag = 21'b0; - rf_cp0.TagLo.D = 1'b0; - rf_cp0.TagLo.V = 1'b0; rf_cp0.Config.K0 = 3'b011; rf_cp0.EPC = 32'h0; rf_cp0.Cause.BD = 1'b0; @@ -135,11 +131,7 @@ module CP0 ( // 31: rf_cp0.DESAVE = wdata; // 30: rf_cp0.ErrorEPC = wdata; // 29: rf_cp0.TagHi = wdata; - 28: begin - rf_cp0.TagLo.Tag = wdata[22:2]; - rf_cp0.TagLo.D = wdata[1]; - rf_cp0.TagLo.V = wdata[0]; - end + // 28: rf_cp0.TagLo = wdata; // 27: rf_cp0.CacheErr = wdata; // 26: rf_cp0.Errctl = wdata; // 25: rf_cp0.PerfCnt = wdata; @@ -257,7 +249,7 @@ module CP0 ( // 31: rdata = rf_cp0.DESAVE; // 30: rdata = rf_cp0.ErrorEPC; // 29: rdata = rf_cp0.TagHi; - 28: rdata = rf_cp0.TagLo; + // 28: rdata = rf_cp0.TagLo; // 27: rdata = rf_cp0.CacheErr; // 26: rdata = rf_cp0.Errctl; // 25: rdata = rf_cp0.PerfCnt; diff --git a/src/Cache/DCache.sv b/src/Cache/DCache.sv index ffdd833..f1f6057 100644 --- a/src/Cache/DCache.sv +++ b/src/Cache/DCache.sv @@ -240,10 +240,10 @@ module DCache ( assign DataRAM2.wen = (bwe1 & wen[2]) | (bwe2 & wen2[2]); assign DataRAM3.wen = (bwe1 & wen[3]) | (bwe2 & wen2[3]); // 写数据 - assign TagRAM0.wdata = {port.tag1, port.wvalid, 1'b1}; - assign TagRAM1.wdata = {port.tag1, port.wvalid, 1'b1}; - assign TagRAM2.wdata = {port.tag1, port.wvalid, 1'b1}; - assign TagRAM3.wdata = {port.tag1, port.wvalid, 1'b1}; + assign TagRAM0.wdata = port.clear ? `DC_TAG_LENGTH'b0 : {port.tag1, port.wvalid, 1'b1}; + assign TagRAM1.wdata = port.clear ? `DC_TAG_LENGTH'b0 : {port.tag1, port.wvalid, 1'b1}; + assign TagRAM2.wdata = port.clear ? `DC_TAG_LENGTH'b0 : {port.tag1, port.wvalid, 1'b1}; + assign TagRAM3.wdata = port.clear ? `DC_TAG_LENGTH'b0 : {port.tag1, port.wvalid, 1'b1}; assign DataRAM0.wdata = state == LOOKUP ? wdata1[0] : wdata2[0]; assign DataRAM1.wdata = state == LOOKUP ? wdata1[1] : wdata2[1]; diff --git a/src/Core/Gadgets.sv b/src/Core/Gadgets.sv index 26bdf69..9288315 100644 --- a/src/Core/Gadgets.sv +++ b/src/Core/Gadgets.sv @@ -90,14 +90,14 @@ module instr_valid ( 32'b101010??????????????????????????: valid = 1'b1; // SWL 32'b101011??????????????????????????: valid = 1'b1; // SW 32'b101110??????????????????????????: valid = 1'b1; // SWR + 32'b101111?????00000????????????????: valid = 1'b1; // I-Cache Index Invalid + 32'b101111?????01000????????????????: valid = 1'b1; // I-Cache Index Store Tag + 32'b101111?????10000????????????????: valid = 1'b1; // I-Cache Hit Invalid + 32'b101111?????00001????????????????: valid = 1'b1; // D-Cache Index Writeback Invalid + 32'b101111?????01001????????????????: valid = 1'b1; // D-Cache Index Store Tag + 32'b101111?????10001????????????????: valid = 1'b1; // D-Cache Hit Invalid + 32'b101111?????10101????????????????: valid = 1'b1; // D-Cache Hit Writeback Invalid 32'b110011??????????????????????????: valid = 1'b1; // PREF (NOP) - // 32'b101111?????00000????????????????: valid = 1'b1; // I-Cache Index Invalid - // 32'b101111?????01000????????????????: valid = 1'b1; // I-Cache Index Store Tag - // 32'b101111?????10000????????????????: valid = 1'b1; // I-Cache Hit Invalid - // 32'b101111?????00001????????????????: valid = 1'b1; // D-Cache Index Writeback Invalid - // 32'b101111?????01001????????????????: valid = 1'b1; // D-Cache Index Store Tag - // 32'b101111?????10001????????????????: valid = 1'b1; // D-Cache Hit Invalid - // 32'b101111?????10101????????????????: valid = 1'b1; // D-Cache Hit Writeback Invalid default: valid = 1'b0; endcase endmodule diff --git a/src/MMU/MMU.sv b/src/MMU/MMU.sv index ead272c..adc50b8 100644 --- a/src/MMU/MMU.sv +++ b/src/MMU/MMU.sv @@ -12,8 +12,9 @@ module MMU ( ICache_i.mmu ic, DCache_i.mmu dc, - sramro_i.slave inst, - sram_i.slave data, + sramro_i.slave inst, + sram_i.slave data, + input CacheOp_t cacheOp, SRAM_RO_AXI_i.master inst_axi, SRAM_RO_AXI_i.master rdata_axi, @@ -309,6 +310,8 @@ module MMU ( logic dUser1; word_t dPA1, dPA2; logic [1:0] dSize1; + + CacheOp_t cacheOp1, cacheOp2; logic dEn2; logic dwr1; @@ -325,49 +328,15 @@ module MMU ( // ======== dFlip-Flop ======== // ============================ - ffenr #(1) dvalid_ff ( - clk, - rst, - data.req, - dEn, - dReq1 - ); - ffen #(2) dsize_ff ( - clk, - data.size, - dEn, - dSize1 - ); - ffen #(32) dPA_ff ( - clk, - dPA1, - dEn2, - dPA2 - ); - ffen #(1) dCached_ff ( - clk, - dCached1, - dEn2, - dCached2 - ); - ffen #(1) dwr_ff ( - clk, - data.wr, - dEn2, - dwr1 - ); - ffen #(4) dwstrb_ff ( - clk, - data.wstrb, - dEn2, - dWstrb1 - ); - ffen #(32) dwdata_ff ( - clk, - data.wdata, - dEn2, - dWdata1 - ); + ffenr #(1) dvalid_ff (clk, rst, data.req, dEn, dReq1); + ffen #(2) dsize_ff (clk, data.size, dEn, dSize1); + ffen #(32) dPA_ff (clk, dPA1, dEn2, dPA2); + ffen #(1) dCached_ff (clk, dCached1, dEn2, dCached2); + ffen #(1) dwr_ff (clk, data.wr, dEn2, dwr1); + ffen #(4) dwstrb_ff (clk, data.wstrb, dEn2, dWstrb1); + ffen #(32) dwdata_ff (clk, data.wdata, dEn2, dWdata1); + ffen #(3) cache_op_ff (clk, cacheOp, dEn, cacheOp1); + ffen #(3) cache_op2_ff (clk, cacheOp1, dEn2, cacheOp2); // ================================= // ======== drState Machine ======== @@ -393,7 +362,7 @@ module MMU ( else begin dEn2 = 1; if (data.wr) data.data_ok = 1; - if (data.wr & (~dCached1 | dc.hit)) drNextState = DR_REFILL; + if (data.wr & (~dCached1 | dc.hit | cacheOp1[2])) drNextState = DR_REFILL; else if (dCached1 & dc.hit) begin dEn = 1; data.data_ok = 1; @@ -453,10 +422,10 @@ module MMU ( assign dVA = data.addr; assign dValid1 = dReq1 & dHit1 & dMValid1 & (~data.wr | dDirty1) & (in_kernel | dUser1); - assign dTLBRefill = (drState == DR_IDLE) & dReq1 & ~dHit1; - assign dTLBInvalid = (drState == DR_IDLE) & dReq1 & ~dMValid1; - assign dTLBModified = (drState == DR_IDLE) & dReq1 & data.wr & ~dDirty1; - assign dAddressError = (drState == DR_IDLE) & dReq1 & ~in_kernel & ~dUser1; + assign dTLBRefill = (drState == DR_IDLE) & dReq1 & ~cacheOp1[1] & ~dHit1; + assign dTLBInvalid = (drState == DR_IDLE) & dReq1 & ~cacheOp1[1] & ~dMValid1; + assign dTLBModified = (drState == DR_IDLE) & dReq1 & ~cacheOp1[1] & data.wr & ~dDirty1; + assign dAddressError = (drState == DR_IDLE) & dReq1 & ~cacheOp1[1] & ~in_kernel & ~dUser1; // ============================= // ======== drFlip-Flop ======== @@ -537,7 +506,11 @@ module MMU ( case (dwState) DW_IDLE: begin - if (dEn2 & (~dCached1 & data.wr | dCached1 & ~dc.hit & dc.dirt_valid)) begin + if (dEn2 & (~dCached1 & data.wr + | dCached1 & dc.dirt_valid + & (~cacheOp1[2] | ~cacheOp1[0]) // WriteOnly 不允许写回 + & (~dc.hit | cacheOp1[2] & ~cacheOp1[0]) // Writeback Invalid 直接写回 + )) begin if (dCached1) begin wdata_axi.wdata = dc.dirt_data[31:0]; wdata_axi.wstrb = 4'b1111; @@ -646,7 +619,11 @@ module MMU ( case (dwaState) DWA_IDLE: begin - if (dEn2 & (~dCached1 & data.wr | dCached1 & ~dc.hit & dc.dirt_valid)) begin + if (dEn2 & (~dCached1 & data.wr + | dCached1 & dc.dirt_valid + & (~cacheOp1[2] | ~cacheOp1[0]) // WriteOnly 不允许写回 + & (~dc.hit | cacheOp1[2] & ~cacheOp1[0])) // Writeback Invalid 直接写回 + ) begin wdata_axi.req = 1'b1; if (~wdata_axi.addr_ok) dwaNextState = DWA_WA; end @@ -685,6 +662,8 @@ module MMU ( assign dc.wvalid = dEn2 ? data.wr : dwr1; assign dc.wdata = dEn2 ? data.wdata : dWdata1; assign dc.wstrb = dEn2 ? data.wstrb : dWstrb1; + assign dc.clear = dEn2 ? cacheOp1[2] & dCached1 & (dc.hit | cacheOp1[1]) + : cacheOp2[2] & dCached2; // ============================== // ========== VA -> PA ========== diff --git a/src/MyCPU.sv b/src/MyCPU.sv index cbae4f5..69c450e 100644 --- a/src/MyCPU.sv +++ b/src/MyCPU.sv @@ -79,6 +79,8 @@ module mycpu_top ( sramro_i inst (); sram_i data (); + + CacheOp_t cache_op; logic C0_int; logic [4:0] C0_addr; @@ -135,6 +137,7 @@ module mycpu_top ( .dc (dcache.mmu), .inst (inst.slave), .data (data.slave), + .cacheOp (cache_op), .inst_axi (inst_axi.master), .rdata_axi (rdata_axi.master), .wdata_axi (wdata_axi.master), diff --git a/src/include/CP0.svh b/src/include/CP0.svh index b5c7e9e..405a634 100644 --- a/src/include/CP0.svh +++ b/src/include/CP0.svh @@ -2,7 +2,6 @@ `define CP0_SVH `include "defines.svh" -`include "Cache.svh" `include "TLB.svh" typedef enum bit [4:0] { @@ -94,8 +93,8 @@ typedef struct packed { // ==== sel0 ==== // word_t DESAVE, // ErrorEPC, - // word_t TagHi; - TagLo_t TagLo; + // TagHi + word_t TagLo; // CacheErr, // Errctl, // PerfCnt, @@ -109,7 +108,7 @@ typedef struct packed { // LLAddr // ; CP0_REGS_CONFIG_t Config; - word_t PRId; + word_t PRId; word_t EPC; CP0_REGS_CAUSE_t Cause; CP0_REGS_STATUS_t Status; diff --git a/src/include/Cache.svh b/src/include/Cache.svh deleted file mode 100644 index 5464339..0000000 --- a/src/include/Cache.svh +++ /dev/null @@ -1,11 +0,0 @@ -`ifndef CACHE_SVH -`define CACHE_SVH - -typedef struct packed { - logic [ 8:0] zero; - logic [20:0] Tag; - logic D; - logic V; -} TagLo_t; - -`endif diff --git a/src/include/DCache.svh b/src/include/DCache.svh index f300b5b..423709b 100644 --- a/src/include/DCache.svh +++ b/src/include/DCache.svh @@ -49,18 +49,21 @@ interface DCache_i; word_t dirt_addr; DCData_t dirt_data; DCData_t row; + logic clear; modport cache( - input req, valid, - input index, tag1, sel1, - input rvalid, rdata, wvalid, wdata, wstrb, - output hit, dirt_valid, dirt_addr, dirt_data, row + input req, valid, + input index, tag1, sel1, + input rvalid, rdata, wvalid, wdata, wstrb, + output hit, dirt_valid, dirt_addr, dirt_data, row, + input clear ); modport mmu( - output req, valid, - output index, tag1, sel1, - output rvalid, rdata, wvalid, wdata, wstrb, - input hit, dirt_valid, dirt_addr, dirt_data, row + output req, valid, + output index, tag1, sel1, + output rvalid, rdata, wvalid, wdata, wstrb, + input hit, dirt_valid, dirt_addr, dirt_data, row, + output clear ); endinterface //DCache_i diff --git a/src/include/ICache.svh b/src/include/ICache.svh index 10440c4..fd7ec03 100644 --- a/src/include/ICache.svh +++ b/src/include/ICache.svh @@ -41,15 +41,22 @@ interface ICache_i; ICData_t row; logic rvalid; ICData_t rdata; + logic clear; - modport cache(input req, valid, - input index, tag1, - output hit, row, - input rvalid, rdata); - modport mmu(output req, valid, - output index, tag1, - input hit, row, - output rvalid, rdata); + modport cache( + input req, valid, + input index, tag1, + output hit, row, + input rvalid, rdata, + input clear + ); + modport mmu( + output req, valid, + output index, tag1, + input hit, row, + output rvalid, rdata, + output clear + ); endinterface //ICache_i `endif diff --git a/src/include/defines.svh b/src/include/defines.svh index 5985709..d86bc0e 100644 --- a/src/include/defines.svh +++ b/src/include/defines.svh @@ -83,6 +83,16 @@ typedef enum logic [1:0] { URIGHT = 2'b10 } ALR_t; +typedef enum logic [2:0] { + CNOP = 3'b000, + IC_L = 3'b001, // I-Cache Lookup + IC_I = 3'b011, // I-Cache Index + DC_LB = 3'b100, // D-Cache Lookup writeBack + DC_LO = 3'b101, // D-Cache Lookup writeOnly + DC_IB = 3'b110, // D-Cache Index writeBack + DC_IO = 3'b111 // D-Cache Index writeOnly +} CacheOp_t; + typedef struct packed { SA_t SA; SB_t SB; @@ -101,15 +111,16 @@ typedef struct packed { } MCtrl0_t; typedef struct packed { - logic MR; // critical - logic MWR; // critical + logic MR; // critical + logic MWR; // critical logic MX; - ALR_t ALR; // critical + ALR_t ALR; // critical logic [1:0] SZ; - logic TLBWI; // critical - logic TLBWR; // critical - logic TLBR; // critical - logic TLBP; // critical + logic TLBWI; // critical + logic TLBWR; // critical + logic TLBR; // critical + logic TLBP; // critical + CacheOp_t CACHE_OP; // critical } MCtrl1_t; typedef struct packed { From ed49e734d8460ac41c71c3b1a58d61eec3469e01 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Thu, 2 Sep 2021 11:05:33 +0800 Subject: [PATCH 31/56] update Controller and Datapath --- src/Core/Controller.sv | 21 +++++++++++---------- src/Core/Datapath.sv | 35 ++++++++++++++++++----------------- src/MyCPU.sv | 9 +++++---- 3 files changed, 34 insertions(+), 31 deletions(-) diff --git a/src/Core/Controller.sv b/src/Core/Controller.sv index b95ee9d..dfbe178 100644 --- a/src/Core/Controller.sv +++ b/src/Core/Controller.sv @@ -24,7 +24,7 @@ module Controller ( {16'b0, inst[15:0]}, {{16{inst[15]}}, inst[15:0]}, {inst[15:0], 16'b0}, - {inst[28] & inst[27] & inst[26], inst[31] | ~inst[28]}, + {~inst[31] & inst[28] & inst[27] & inst[26], inst[31] | ~inst[28]}, imm ); @@ -70,15 +70,16 @@ module Controller ( assign ctrl.MCtrl0.SEL = inst[2:0]; assign ctrl.MCtrl0.RS0 = RS0_t'({~inst[30] & (inst[29] | inst[26] | ~inst[4]), inst[30], ~inst[29] & (inst[30] | ~inst[1])}); - assign ctrl.MCtrl1.MR = inst[31] & ~inst[30]; - assign ctrl.MCtrl1.MWR = inst[29]; - assign ctrl.MCtrl1.MX = ~inst[28]; - assign ctrl.MCtrl1.ALR = ALR_t'({inst[28] & inst[27], ~inst[28] & inst[27] & ~inst[26]}); - assign ctrl.MCtrl1.SZ = inst[27:26]; - assign ctrl.MCtrl1.TLBR = ~inst[31] & inst[30] & ~inst[29] & inst[25] & ~inst[3] & ~inst[1]; - assign ctrl.MCtrl1.TLBWI = ~inst[31] & inst[30] & ~inst[29] & inst[25] & ~inst[3] & inst[1]; - assign ctrl.MCtrl1.TLBWR = ~inst[31] & inst[30] & ~inst[29] & inst[25] & ~inst[3] & (inst[2] | ~inst[1]); - assign ctrl.MCtrl1.TLBP = ~inst[31] & inst[30] & ~inst[4] & inst[3]; + assign ctrl.MCtrl1.MR = inst[31] & ~inst[30]; + assign ctrl.MCtrl1.MWR = inst[29]; + assign ctrl.MCtrl1.MX = ~inst[28]; + assign ctrl.MCtrl1.ALR = ALR_t'({inst[28] & inst[27] & ~inst[26], inst[27] & ~inst[26]}); + assign ctrl.MCtrl1.SZ = inst[27:26]; + assign ctrl.MCtrl1.TLBR = ~inst[31] & inst[30] & ~inst[29] & inst[25] & ~inst[3] & ~inst[1]; + assign ctrl.MCtrl1.TLBWI = ~inst[31] & inst[30] & ~inst[29] & inst[25] & ~inst[3] & inst[1]; + assign ctrl.MCtrl1.TLBWR = ~inst[31] & inst[30] & ~inst[29] & inst[25] & ~inst[3] & (inst[2] | ~inst[1]); + assign ctrl.MCtrl1.TLBP = ~inst[31] & inst[30] & ~inst[4] & inst[3]; + assign ctrl.MCtrl1.CACHE_OP = CacheOp_t'({inst[29] & inst[28] & inst[26] & inst[16], inst[29] & inst[28] & inst[26] & ~inst[20], inst[29] & inst[28] & inst[26] & ~inst[18] & (inst[20] | inst[19] | ~inst[16])}); assign ctrl.WCtrl.RW = ctrl.RD != 5'b00000 & (~inst[30] & (~inst[27] & (~inst[26] & (~inst[31] & (~inst[28] & (~inst[3] & (~inst[4] | ~inst[0]) | inst[3] & (~inst[4] & ~inst[2] & inst[0] | inst[5])) | inst[29]) | inst[31] & ~inst[29]) | inst[26] & (~inst[31] & (~inst[28] & inst[20] | inst[29]) | inst[31] & ~inst[29])) | inst[27] & (~inst[26] & (~inst[31] & inst[29] | inst[31] & ~inst[29]) | inst[26] & (~inst[31] & (~inst[28] | inst[29]) | inst[31] & ~inst[29]))) | inst[30] & ~inst[31] & ~inst[3] & (~inst[29] & ~inst[25] & ~inst[23] | inst[29] & inst[1])); diff --git a/src/Core/Datapath.sv b/src/Core/Datapath.sv index ddb120e..f0bfbd9 100644 --- a/src/Core/Datapath.sv +++ b/src/Core/Datapath.sv @@ -7,20 +7,21 @@ module Datapath ( input rst, // MMU - sramro_i.master fetch_i, - sram_i.master mem_i, - input logic iTLBRefill, - input logic iTLBInvalid, - input logic iAddressError, - input logic dTLBRefill, - input logic dTLBInvalid, - input logic dTLBModified, - input logic dAddressError, - output logic tlb_tlbwi, - output logic tlb_tlbwr, - output logic tlb_tlbp, - output logic c0_tlbr, - output logic c0_tlbp, + sramro_i.master fetch_i, + sram_i.master mem_i, + output CacheOp_t cache_op, + input logic iTLBRefill, + input logic iTLBInvalid, + input logic iAddressError, + input logic dTLBRefill, + input logic dTLBInvalid, + input logic dTLBModified, + input logic dAddressError, + output logic tlb_tlbwi, + output logic tlb_tlbwr, + output logic tlb_tlbp, + output logic c0_tlbr, + output logic c0_tlbp, // CP0 input logic C0_int, @@ -780,7 +781,7 @@ module Datapath ( E.en, E.I1.ECtrl ); - ffenrc #(11) E_I1_MCtrl_ff ( + ffenrc #(14) E_I1_MCtrl_ff ( clk, rst | rstM, D.I1.MCtrl, @@ -917,7 +918,7 @@ module Datapath ( assign E_I1_ADDR = E_I1_ForwardS + E.I1.imm; assign mem_i.addr = |E.I1.MCtrl.ALR ? {E_I1_ADDR[31:2], 2'b0} : E_I1_ADDR; assign mem_i.size = {E.I1.MCtrl.SZ[1], E.I1.MCtrl.SZ[0] & ~E.I1.MCtrl.SZ[1]}; - // assign mem_i.addr = E.I1.ALUOut; + assign cache_op = E.I1.MCtrl.CACHE_OP; assign E.en = E_go & M.en; assign E_go = ~mem_i.req | mem_i.addr_ok; @@ -1069,7 +1070,7 @@ module Datapath ( M.en, M.I1.ALUOut ); - ffenrc #(11) M_I1_MCtrl_ff ( + ffenrc #(14) M_I1_MCtrl_ff ( clk, rst | rstM, E.I1.MCtrl, diff --git a/src/MyCPU.sv b/src/MyCPU.sv index 69c450e..5379d78 100644 --- a/src/MyCPU.sv +++ b/src/MyCPU.sv @@ -210,10 +210,11 @@ module mycpu_top ( ); Datapath datapath ( - .clk (aclk), - .rst (~aresetn), - .fetch_i(inst.master), - .mem_i (data.master), + .clk (aclk), + .rst (~aresetn), + .fetch_i (inst.master), + .mem_i (data.master), + .cache_op(cache_op), .iTLBRefill (iTLBRefill), .iTLBInvalid (iTLBInvalid), From f256abd248f0ce99dc02c3834c408b60e711f1b1 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Thu, 2 Sep 2021 19:05:23 +0800 Subject: [PATCH 32/56] add control signals --- tools/ctrl_maker.py | 2 +- tools/decoder.py | 152 +++++++++++++++++++++---------------------- tools/ectrl.txt | 1 + tools/global.txt | 1 + tools/mctrl0.txt | 1 + tools/mctrl1.txt | 153 +++++++++++++++++++++++--------------------- tools/pcs.txt | 1 + tools/privilege.txt | 1 + tools/wctrl.txt | 1 + 9 files changed, 164 insertions(+), 149 deletions(-) diff --git a/tools/ctrl_maker.py b/tools/ctrl_maker.py index a670c42..1c42741 100644 --- a/tools/ctrl_maker.py +++ b/tools/ctrl_maker.py @@ -1,4 +1,4 @@ -with open('mctrl0.txt') as f: +with open('mctrl1.txt') as f: lines = f.readlines() title = lines[0].split() items = [x.split() for x in lines[1:]] diff --git a/tools/decoder.py b/tools/decoder.py index ff11b8f..71c2cfc 100644 --- a/tools/decoder.py +++ b/tools/decoder.py @@ -1,76 +1,77 @@ table = [ - # ('000000000000000000000?????001111', 'SYNC'), - # ('00000000000???????????????000000', 'SLL'), - # ('00000000000???????????????000010', 'SRL'), - # ('00000000000???????????????000011', 'SRA'), - # ('000000???????????????00000000100', 'SLLV'), - # ('000000???????????????00000000110', 'SRLV'), - # ('000000???????????????00000000111', 'SRAV'), - # ('000000?????000000000000000001000', 'JR'), - # ('000000?????00000?????00000001001', 'JALR'), - # ('000000????????????????????001100', 'SYSCALL'), - # ('000000????????????????????001101', 'BREAK'), - # ('0000000000000000?????00000010000', 'MFHI'), - # ('000000?????000000000000000010001', 'MTHI'), - # ('0000000000000000?????00000010010', 'MFLO'), - # ('000000?????000000000000000010011', 'MTLO'), + ('000000000000000000000?????001111', 'SYNC'), + ('00000000000???????????????000000', 'SLL'), + ('00000000000???????????????000010', 'SRL'), + ('00000000000???????????????000011', 'SRA'), + ('000000???????????????00000000100', 'SLLV'), + ('000000???????????????00000000110', 'SRLV'), + ('000000???????????????00000000111', 'SRAV'), + ('000000?????000000000000000001000', 'JR'), + ('000000?????00000?????00000001001', 'JALR'), + ('000000????????????????????001100', 'SYSCALL'), + ('000000????????????????????001101', 'BREAK'), + ('0000000000000000?????00000010000', 'MFHI'), + ('000000?????000000000000000010001', 'MTHI'), + ('0000000000000000?????00000010010', 'MFLO'), + ('000000?????000000000000000010011', 'MTLO'), ('000000??????????0000000000011000', 'MULT'), ('000000??????????0000000000011001', 'MULTU'), - # ('000000??????????0000000000011010', 'DIV'), - # ('000000??????????0000000000011011', 'DIVU'), - # ('000000???????????????00000100000', 'ADD'), - # ('000000???????????????00000100001', 'ADDU'), - # ('000000???????????????00000100010', 'SUB'), - # ('000000???????????????00000100011', 'SUBU'), - # ('000000???????????????00000100100', 'AND'), - # ('000000???????????????00000100101', 'OR'), - # ('000000???????????????00000100110', 'XOR'), - # ('000000???????????????00000100111', 'NOR'), - # ('000000???????????????00000101010', 'SLT'), - # ('000000???????????????00000101011', 'SLTU'), - # ('000001?????00000????????????????', 'BLTZ'), - # ('000001?????10000????????????????', 'BLTZAL'), - # ('000001?????00001????????????????', 'BGEZ'), - # ('000001?????10001????????????????', 'BGEZAL'), - # ('000010??????????????????????????', 'J'), - # ('000011??????????????????????????', 'JAL'), - # ('000100??????????????????????????', 'BEQ'), - # ('000101??????????????????????????', 'BNE'), - # ('000110?????00000????????????????', 'BLEZ'), - # ('000111?????00000????????????????', 'BGTZ'), - # ('001000??????????????????????????', 'ADDI'), - # ('001001??????????????????????????', 'ADDIU'), - # ('001010??????????????????????????', 'SLTI'), - # ('001011??????????????????????????', 'SLTIU'), - # ('001100??????????????????????????', 'ANDI'), - # ('001101??????????????????????????', 'ORI'), - # ('001110??????????????????????????', 'XORI'), - # ('00111100000?????????????????????', 'LUI'), - # ('01000000000??????????00000000???', 'MFC0'), - # ('01000000100??????????00000000???', 'MTC0'), - # ('01000010000000000000000000000001', 'TLBR'), - # ('01000010000000000000000000000010', 'TLBWI'), - # ('01000010000000000000000000000110', 'TLBWR'), - # ('01000010000000000000000000001000', 'TLBP'), - # ('01000010000000000000000000011000', 'ERET'), + ('000000??????????0000000000011010', 'DIV'), + ('000000??????????0000000000011011', 'DIVU'), + ('000000???????????????00000100000', 'ADD'), + ('000000???????????????00000100001', 'ADDU'), + ('000000???????????????00000100010', 'SUB'), + ('000000???????????????00000100011', 'SUBU'), + ('000000???????????????00000100100', 'AND'), + ('000000???????????????00000100101', 'OR'), + ('000000???????????????00000100110', 'XOR'), + ('000000???????????????00000100111', 'NOR'), + ('000000???????????????00000101010', 'SLT'), + ('000000???????????????00000101011', 'SLTU'), + ('000001?????00000????????????????', 'BLTZ'), + ('000001?????10000????????????????', 'BLTZAL'), + ('000001?????00001????????????????', 'BGEZ'), + ('000001?????10001????????????????', 'BGEZAL'), + ('000010??????????????????????????', 'J'), + ('000011??????????????????????????', 'JAL'), + ('000100??????????????????????????', 'BEQ'), + ('000101??????????????????????????', 'BNE'), + ('000110?????00000????????????????', 'BLEZ'), + ('000111?????00000????????????????', 'BGTZ'), + ('001000??????????????????????????', 'ADDI'), + ('001001??????????????????????????', 'ADDIU'), + ('001010??????????????????????????', 'SLTI'), + ('001011??????????????????????????', 'SLTIU'), + ('001100??????????????????????????', 'ANDI'), + ('001101??????????????????????????', 'ORI'), + ('001110??????????????????????????', 'XORI'), + ('00111100000?????????????????????', 'LUI'), + ('01000000000??????????00000000???', 'MFC0'), + ('01000000100??????????00000000???', 'MTC0'), + ('01000010000000000000000000000001', 'TLBR'), + ('01000010000000000000000000000010', 'TLBWI'), + ('01000010000000000000000000000110', 'TLBWR'), + ('01000010000000000000000000001000', 'TLBP'), + ('01000010000000000000000000011000', 'ERET'), ('011100??????????0000000000000000', 'MADD'), ('011100??????????0000000000000001', 'MADDU'), ('011100??????????0000000000000100', 'MSUB'), ('011100??????????0000000000000101', 'MSUBU'), - # ('011100???????????????00000000010', 'MUL'), - # ('100000??????????????????????????', 'LB'), - # ('100001??????????????????????????', 'LH'), - # ('100010??????????????????????????', 'LWL'), - # ('100011??????????????????????????', 'LW'), - # ('100100??????????????????????????', 'LBU'), - # ('100101??????????????????????????', 'LHU'), - # ('100110??????????????????????????', 'LWR'), - # ('101000??????????????????????????', 'SB'), - # ('101001??????????????????????????', 'SH'), - # ('101010??????????????????????????', 'SWL'), - # ('101011??????????????????????????', 'SW'), - # ('101110??????????????????????????', 'SWR'), - # ('110011??????????????????????????', 'PREF'), + ('011100???????????????00000000010', 'MUL'), + ('100000??????????????????????????', 'LB'), + ('100001??????????????????????????', 'LH'), + ('100010??????????????????????????', 'LWL'), + ('100011??????????????????????????', 'LW'), + ('100100??????????????????????????', 'LBU'), + ('100101??????????????????????????', 'LHU'), + ('100110??????????????????????????', 'LWR'), + ('101000??????????????????????????', 'SB'), + ('101001??????????????????????????', 'SH'), + ('101010??????????????????????????', 'SWL'), + ('101011??????????????????????????', 'SW'), + ('101110??????????????????????????', 'SWR'), + ('101111??????????????????????????', 'CACHE'), + ('110011??????????????????????????', 'PREF'), ] class Boolean: @@ -126,7 +127,7 @@ for inst, name in table: ctrl['ECtrl_SA'] = (inst[31] | inst[29] | ~inst[26] & (inst[5] | inst[2]), inst[31] | (~inst[28] & (inst[29] | inst[26] | inst[5] | inst[3] | inst[2]) | inst[28] & (~inst[27] | ~inst[26]))) ctrl['ECtrl_SB'] = (inst[31] | inst[29], inst[26] | ~inst[5] & inst[3]) - ctrl['imm'] = (inst[28] & inst[27] & inst[26], inst[31] | ~inst[28]) + ctrl['imm'] = (~inst[31] & inst[28] & inst[27] & inst[26], inst[31] | ~inst[28]) ctrl['MCtrl0_HW'] = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (~inst[1] & inst[0] | inst[3]) | inst[30] & inst[29] & ~inst[1] ctrl['MCtrl0_LW'] = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (inst[1] & inst[0] | inst[3]) | inst[30] & inst[29] & ~inst[1] @@ -135,14 +136,15 @@ for inst, name in table: ctrl['MCtrl0_C0W'] = ~inst[31] & inst[30] & ~inst[29] & inst[23] & ~inst[3] ctrl['MCtrl0_RS0'] = (ctrl['DP1'], inst[30], ~inst[29] & (inst[30] | ~inst[1])) - ctrl['MCtrl1_MR'] = inst[31] & ~inst[30] - ctrl['MCtrl1_MWR'] = inst[29] - ctrl['MCtrl1_MX'] = ~inst[28] - ctrl['MCtrl1_ALR'] = (inst[28] & inst[27], ~inst[28] & inst[27] & ~inst[26]) - ctrl['MCtrl1_TLBR'] = ~inst[31] & inst[30] & ~inst[29] & inst[25] & ~inst[3] & ~inst[1] - ctrl['MCtrl1_TLBWI'] = ~inst[31] & inst[30] & ~inst[29] & inst[25] & ~inst[3] & inst[1] - ctrl['MCtrl1_TLBWR'] = ~inst[31] & inst[30] & ~inst[29] & inst[25] & ~inst[3] & (inst[2] | ~inst[1]) - ctrl['MCtrl1_TLBP'] = ~inst[31] & inst[30] & ~inst[4] & inst[3] + ctrl['MCtrl1_MR'] = inst[31] & ~inst[30] + ctrl['MCtrl1_MWR'] = inst[29] + ctrl['MCtrl1_MX'] = ~inst[28] + ctrl['MCtrl1_ALR'] = (inst[28] & inst[27] & ~inst[26], inst[27] & ~inst[26]) + ctrl['MCtrl1_TLBR'] = ~inst[31] & inst[30] & ~inst[29] & inst[25] & ~inst[3] & ~inst[1] + ctrl['MCtrl1_TLBWI'] = ~inst[31] & inst[30] & ~inst[29] & inst[25] & ~inst[3] & inst[1] + ctrl['MCtrl1_TLBWR'] = ~inst[31] & inst[30] & ~inst[29] & inst[25] & ~inst[3] & (inst[2] | ~inst[1]) + ctrl['MCtrl1_TLBP'] = ~inst[31] & inst[30] & ~inst[4] & inst[3] + ctrl['MCtrl1_CACHE_OP'] = (inst[29] & inst[28] & inst[26] & inst[16], inst[29] & inst[28] & inst[26] & ~inst[20], inst[29] & inst[28] & inst[26] & ~inst[18] & (inst[20] | inst[19] | ~inst[16])) ctrl['WCtrl_RW'] = ~inst[30] & (~inst[27] & (~inst[26] & (~inst[31] & (~inst[28] & (~inst[3] & (~inst[4] | ~inst[0]) | inst[3] & (~inst[4] & ~inst[2] & inst[0] | inst[5])) | inst[29]) | inst[31] & ~inst[29]) | inst[26] & (~inst[31] & (~inst[28] & inst[20] | inst[29]) | inst[31] & ~inst[29])) | inst[27] & (~inst[26] & (~inst[31] & inst[29] | inst[31] & ~inst[29]) | inst[26] & (~inst[31] & (~inst[28] | inst[29]) | inst[31] & ~inst[29]))) | inst[30] & ~inst[31] & ~inst[3] & (~inst[29] & ~inst[25] & ~inst[23] | inst[29] & inst[1]) ctrl['RD'] = (~inst[29] & inst[30] | inst[29] & ~inst[30] | inst[31], inst[26]) diff --git a/tools/ectrl.txt b/tools/ectrl.txt index 7a0a2c1..71d125c 100644 --- a/tools/ectrl.txt +++ b/tools/ectrl.txt @@ -70,4 +70,5 @@ 32'b101010?????????????????????????? ADD 0 RS 1 1 IMM 1 ? IX 0 1 // SWL 32'b101011?????????????????????????? ADD 0 RS 1 1 IMM 1 ? IX 0 1 // SW 32'b101110?????????????????????????? ADD 0 RS 1 1 IMM 1 ? IX 0 1 // SWR +32'b101111?????????????????????????? ADD 0 RS 1 1 IMM 1 ? IX 0 1 // CACHE 32'b110011?????????????????????????? ? ? ? ? ? ? ? ? ? ? ? // PREF \ No newline at end of file diff --git a/tools/global.txt b/tools/global.txt index 45e1458..1c41b80 100644 --- a/tools/global.txt +++ b/tools/global.txt @@ -70,4 +70,5 @@ 32'b101010?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // SWL 32'b101011?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // SW 32'b101110?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // SWR +32'b101111?????????????????????????? 0 0 0 0 1 0 0 0 0 1 // CACHE 32'b110011?????????????????????????? 0 0 0 0 0 0 0 0 1 1 // PREF (NOP) \ No newline at end of file diff --git a/tools/mctrl0.txt b/tools/mctrl0.txt index 6f1e58c..fc9f549 100644 --- a/tools/mctrl0.txt +++ b/tools/mctrl0.txt @@ -70,4 +70,5 @@ 32'b101010?????????????????????????? ? ? ? 0 ? ? ? ? ? 0 ? ? ? ? // SWL 32'b101011?????????????????????????? ? ? ? 0 ? ? ? ? ? 0 ? ? ? ? // SW 32'b101110?????????????????????????? ? ? ? 0 ? ? ? ? ? 0 ? ? ? ? // SWR +32'b101111?????????????????????????? ? ? ? 0 ? ? ? ? ? 0 ? ? ? ? // CACHE 32'b110011?????????????????????????? 0 0 ? 0 ? ? ? ? ? 0 ? ? ? ? // PREF (NOP) \ No newline at end of file diff --git a/tools/mctrl1.txt b/tools/mctrl1.txt index d6bf7c0..0626d04 100644 --- a/tools/mctrl1.txt +++ b/tools/mctrl1.txt @@ -1,73 +1,80 @@ -////-------------------------------- TLBR TLBWI TLBWR TLBP MR MWR MX ALR ALR1 ALR0 -32'b000000000000000000000?????001111 0 0 0 0 0 ? ? ? ? ? // SYNC (NOP) -32'b00000000000???????????????000000 0 0 0 0 0 ? ? ? ? ? // SLL -32'b00000000000???????????????000010 0 0 0 0 0 ? ? ? ? ? // SRL -32'b00000000000???????????????000011 0 0 0 0 0 ? ? ? ? ? // SRA -32'b000000???????????????00000000100 0 0 0 0 0 ? ? ? ? ? // SLLV -32'b000000???????????????00000000110 0 0 0 0 0 ? ? ? ? ? // SRLV -32'b000000???????????????00000000111 0 0 0 0 0 ? ? ? ? ? // SRAV -32'b000000?????000000000000000001000 0 0 0 0 0 ? ? ? ? ? // JR -32'b000000?????00000?????00000001001 0 0 0 0 0 ? ? ? ? ? // JALR -32'b000000????????????????????001100 0 0 0 0 0 ? ? ? ? ? // SYSCALL -32'b000000????????????????????001101 0 0 0 0 0 ? ? ? ? ? // BREAK -32'b0000000000000000?????00000010000 0 0 0 0 ? ? ? ? ? ? // MFHI -32'b000000?????000000000000000010001 0 0 0 0 ? ? ? ? ? ? // MTHI -32'b0000000000000000?????00000010010 0 0 0 0 ? ? ? ? ? ? // MFLO -32'b000000?????000000000000000010011 0 0 0 0 ? ? ? ? ? ? // MTLO -32'b000000??????????0000000000011000 0 0 0 0 ? ? ? ? ? ? // MULT -32'b000000??????????0000000000011001 0 0 0 0 ? ? ? ? ? ? // MULTU -32'b000000??????????0000000000011010 0 0 0 0 ? ? ? ? ? ? // DIV -32'b000000??????????0000000000011011 0 0 0 0 ? ? ? ? ? ? // DIVU -32'b000000???????????????00000100000 0 0 0 0 0 ? ? ? ? ? // ADD -32'b000000???????????????00000100001 0 0 0 0 0 ? ? ? ? ? // ADDU -32'b000000???????????????00000100010 0 0 0 0 0 ? ? ? ? ? // SUB -32'b000000???????????????00000100011 0 0 0 0 0 ? ? ? ? ? // SUBU -32'b000000???????????????00000100100 0 0 0 0 0 ? ? ? ? ? // AND -32'b000000???????????????00000100101 0 0 0 0 0 ? ? ? ? ? // OR -32'b000000???????????????00000100110 0 0 0 0 0 ? ? ? ? ? // XOR -32'b000000???????????????00000100111 0 0 0 0 0 ? ? ? ? ? // NOR -32'b000000???????????????00000101010 0 0 0 0 0 ? ? ? ? ? // SLT -32'b000000???????????????00000101011 0 0 0 0 0 ? ? ? ? ? // SLTU -32'b000001?????00000???????????????? 0 0 0 0 0 ? ? ? ? ? // BLTZ -32'b000001?????10000???????????????? 0 0 0 0 0 ? ? ? ? ? // BLTZAL -32'b000001?????00001???????????????? 0 0 0 0 0 ? ? ? ? ? // BGEZ -32'b000001?????10001???????????????? 0 0 0 0 0 ? ? ? ? ? // BGEZAL -32'b000010?????????????????????????? 0 0 0 0 0 ? ? ? ? ? // J -32'b000011?????????????????????????? 0 0 0 0 0 ? ? ? ? ? // JAL -32'b000100?????????????????????????? 0 0 0 0 0 ? ? ? ? ? // BEQ -32'b000101?????????????????????????? 0 0 0 0 0 ? ? ? ? ? // BNE -32'b000110?????00000???????????????? 0 0 0 0 0 ? ? ? ? ? // BLEZ -32'b000111?????00000???????????????? 0 0 0 0 0 ? ? ? ? ? // BGTZ -32'b001000?????????????????????????? 0 0 0 0 0 ? ? ? ? ? // ADDI -32'b001001?????????????????????????? 0 0 0 0 0 ? ? ? ? ? // ADDIU -32'b001010?????????????????????????? 0 0 0 0 0 ? ? ? ? ? // SLTI -32'b001011?????????????????????????? 0 0 0 0 0 ? ? ? ? ? // SLTIU -32'b001100?????????????????????????? 0 0 0 0 0 ? ? ? ? ? // ANDI -32'b001101?????????????????????????? 0 0 0 0 0 ? ? ? ? ? // ORI -32'b001110?????????????????????????? 0 0 0 0 0 ? ? ? ? ? // XORI -32'b00111100000????????????????????? 0 0 0 0 0 ? ? ? ? ? // LUI -32'b01000000000??????????00000000??? 0 0 0 0 ? ? ? ? ? ? // MFC0 -32'b01000000100??????????00000000??? 0 0 0 0 ? ? ? ? ? ? // MTC0 -32'b01000010000000000000000000000001 1 0 1 0 0 ? ? ? ? ? // TLBR -32'b01000010000000000000000000000010 0 1 0 0 0 ? ? ? ? ? // TLBWI -32'b01000010000000000000000000000110 0 1 1 0 0 ? ? ? ? ? // TLBWR -32'b01000010000000000000000000001000 0 0 0 1 0 ? ? ? ? ? // TLBP -32'b01000010000000000000000000011000 0 0 0 0 0 ? ? ? ? ? // ERET -32'b011100??????????0000000000000000 0 0 0 0 ? ? ? ? ? ? // MADD -32'b011100??????????0000000000000001 0 0 0 0 ? ? ? ? ? ? // MADDU -32'b011100??????????0000000000000100 0 0 0 0 ? ? ? ? ? ? // MSUB -32'b011100??????????0000000000000101 0 0 0 0 ? ? ? ? ? ? // MSUBU -32'b011100???????????????00000000010 0 0 0 0 ? ? ? ? ? ? // MUL -32'b100000?????????????????????????? 0 0 0 0 1 0 1 ALIGN 0 0 // LB -32'b100001?????????????????????????? 0 0 0 0 1 0 1 ALIGN 0 0 // LH -32'h100010?????????????????????????? 0 0 0 0 1 0 ? ULEFT 0 1 // LWL -32'b100011?????????????????????????? 0 0 0 0 1 0 ? ALIGN 0 0 // LW -32'b100100?????????????????????????? 0 0 0 0 1 0 0 ALIGN 0 0 // LBU -32'b100101?????????????????????????? 0 0 0 0 1 0 0 ALIGN 0 0 // LHU -32'h100110?????????????????????????? 0 0 0 0 1 0 ? URIGHT 1 ? // LWR -32'b101000?????????????????????????? 0 0 0 0 1 1 ? ALIGN 0 0 // SB -32'b101001?????????????????????????? 0 0 0 0 1 1 ? ALIGN 0 0 // SH -32'b101010?????????????????????????? 0 0 0 0 1 1 ? ULEFT 0 1 // SWL -32'b101011?????????????????????????? 0 0 0 0 1 1 ? ALIGN 0 0 // SW -32'b101110?????????????????????????? 0 0 0 0 1 1 ? URIGHT 1 ? // SWR -32'b110011?????????????????????????? 0 0 0 0 0 ? ? ? ? ? // PREF (NOP) \ No newline at end of file +////-------------------------------- TLBR TLBWI TLBWR TLBP MR MWR MX ALR ALR1 ALR0 CACHEOP CO2 CO1 CO0 +32'b000000000000000000000?????001111 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // SYNC (NOP) +32'b00000000000???????????????000000 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // SLL +32'b00000000000???????????????000010 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // SRL +32'b00000000000???????????????000011 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // SRA +32'b000000???????????????00000000100 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // SLLV +32'b000000???????????????00000000110 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // SRLV +32'b000000???????????????00000000111 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // SRAV +32'b000000?????000000000000000001000 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // JR +32'b000000?????00000?????00000001001 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // JALR +32'b000000????????????????????001100 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // SYSCALL +32'b000000????????????????????001101 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // BREAK +32'b0000000000000000?????00000010000 0 0 0 0 ? ? ? ? ? ? ? ? ? ? // MFHI +32'b000000?????000000000000000010001 0 0 0 0 ? ? ? ? ? ? ? ? ? ? // MTHI +32'b0000000000000000?????00000010010 0 0 0 0 ? ? ? ? ? ? ? ? ? ? // MFLO +32'b000000?????000000000000000010011 0 0 0 0 ? ? ? ? ? ? ? ? ? ? // MTLO +32'b000000??????????0000000000011000 0 0 0 0 ? ? ? ? ? ? ? ? ? ? // MULT +32'b000000??????????0000000000011001 0 0 0 0 ? ? ? ? ? ? ? ? ? ? // MULTU +32'b000000??????????0000000000011010 0 0 0 0 ? ? ? ? ? ? ? ? ? ? // DIV +32'b000000??????????0000000000011011 0 0 0 0 ? ? ? ? ? ? ? ? ? ? // DIVU +32'b000000???????????????00000100000 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // ADD +32'b000000???????????????00000100001 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // ADDU +32'b000000???????????????00000100010 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // SUB +32'b000000???????????????00000100011 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // SUBU +32'b000000???????????????00000100100 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // AND +32'b000000???????????????00000100101 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // OR +32'b000000???????????????00000100110 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // XOR +32'b000000???????????????00000100111 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // NOR +32'b000000???????????????00000101010 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // SLT +32'b000000???????????????00000101011 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // SLTU +32'b000001?????00000???????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // BLTZ +32'b000001?????10000???????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // BLTZAL +32'b000001?????00001???????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // BGEZ +32'b000001?????10001???????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // BGEZAL +32'b000010?????????????????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // J +32'b000011?????????????????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // JAL +32'b000100?????????????????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // BEQ +32'b000101?????????????????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // BNE +32'b000110?????00000???????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // BLEZ +32'b000111?????00000???????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // BGTZ +32'b001000?????????????????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // ADDI +32'b001001?????????????????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // ADDIU +32'b001010?????????????????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // SLTI +32'b001011?????????????????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // SLTIU +32'b001100?????????????????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // ANDI +32'b001101?????????????????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // ORI +32'b001110?????????????????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // XORI +32'b00111100000????????????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // LUI +32'b01000000000??????????00000000??? 0 0 0 0 ? ? ? ? ? ? ? ? ? ? // MFC0 +32'b01000000100??????????00000000??? 0 0 0 0 ? ? ? ? ? ? ? ? ? ? // MTC0 +32'b01000010000000000000000000000001 1 0 1 0 0 ? ? ? ? ? ? ? ? ? // TLBR +32'b01000010000000000000000000000010 0 1 0 0 0 ? ? ? ? ? ? ? ? ? // TLBWI +32'b01000010000000000000000000000110 0 1 1 0 0 ? ? ? ? ? ? ? ? ? // TLBWR +32'b01000010000000000000000000001000 0 0 0 1 0 ? ? ? ? ? ? ? ? ? // TLBP +32'b01000010000000000000000000011000 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // ERET +32'b011100??????????0000000000000000 0 0 0 0 ? ? ? ? ? ? ? ? ? ? // MADD +32'b011100??????????0000000000000001 0 0 0 0 ? ? ? ? ? ? ? ? ? ? // MADDU +32'b011100??????????0000000000000100 0 0 0 0 ? ? ? ? ? ? ? ? ? ? // MSUB +32'b011100??????????0000000000000101 0 0 0 0 ? ? ? ? ? ? ? ? ? ? // MSUBU +32'b011100???????????????00000000010 0 0 0 0 ? ? ? ? ? ? ? ? ? ? // MUL +32'b100000?????????????????????????? 0 0 0 0 1 0 1 ALIGN 0 0 CNOP 0 0 0 // LB +32'b100001?????????????????????????? 0 0 0 0 1 0 1 ALIGN 0 0 CNOP 0 0 0 // LH +32'h100010?????????????????????????? 0 0 0 0 1 0 ? ULEFT 0 1 CNOP 0 0 0 // LWL +32'b100011?????????????????????????? 0 0 0 0 1 0 ? ALIGN 0 0 CNOP 0 0 0 // LW +32'b100100?????????????????????????? 0 0 0 0 1 0 0 ALIGN 0 0 CNOP 0 0 0 // LBU +32'b100101?????????????????????????? 0 0 0 0 1 0 0 ALIGN 0 0 CNOP 0 0 0 // LHU +32'h100110?????????????????????????? 0 0 0 0 1 0 ? URIGHT 1 ? CNOP 0 0 0 // LWR +32'b101000?????????????????????????? 0 0 0 0 1 1 ? ALIGN 0 0 CNOP 0 0 0 // SB +32'b101001?????????????????????????? 0 0 0 0 1 1 ? ALIGN 0 0 CNOP 0 0 0 // SH +32'b101010?????????????????????????? 0 0 0 0 1 1 ? ULEFT 0 1 CNOP 0 0 0 // SWL +32'b101011?????????????????????????? 0 0 0 0 1 1 ? ALIGN 0 0 CNOP 0 0 0 // SW +32'b101110?????????????????????????? 0 0 0 0 1 1 ? URIGHT 1 ? CNOP 0 0 0 // SWR +32'b101111?????00000???????????????? 0 0 0 0 1 1 ? ALIGN 0 0 IC_I 0 1 1 // I-Cache Index Invalid +32'b101111?????01000???????????????? 0 0 0 0 1 1 ? ALIGN 0 0 IC_I 0 1 1 // I-Cache Index Store Tag +32'b101111?????10000???????????????? 0 0 0 0 1 1 ? ALIGN 0 0 IC_L 0 0 1 // I-Cache Hit Invalid +32'b101111?????00001???????????????? 0 0 0 0 1 1 ? ALIGN 0 0 DC_IB 1 1 0 // D-Cache Index Writeback Invalid +32'b101111?????01001???????????????? 0 0 0 0 1 1 ? ALIGN 0 0 DC_IO 1 1 1 // D-Cache Index Store Tag +32'b101111?????10001???????????????? 0 0 0 0 1 1 ? ALIGN 0 0 DC_LO 1 0 1 // D-Cache Hit Invalid +32'b101111?????10101???????????????? 0 0 0 0 1 1 ? ALIGN 0 0 DC_LB 1 0 0 // D-Cache Hit Writeback Invalid +32'b110011?????????????????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // PREF (NOP) \ No newline at end of file diff --git a/tools/pcs.txt b/tools/pcs.txt index 3710696..c03017f 100644 --- a/tools/pcs.txt +++ b/tools/pcs.txt @@ -70,4 +70,5 @@ 32'b101010?????????????????????????? 0 0 0 0 // SWL 32'b101011?????????????????????????? 0 0 0 0 // SW 32'b101110?????????????????????????? 0 0 0 0 // SWR +32'b101111?????????????????????????? 0 0 0 0 // CACHE 32'b110011?????????????????????????? 0 0 0 0 // PREF (NOP) \ No newline at end of file diff --git a/tools/privilege.txt b/tools/privilege.txt index f08198f..0c86eb6 100644 --- a/tools/privilege.txt +++ b/tools/privilege.txt @@ -70,4 +70,5 @@ 32'b101010?????????????????????????? 0 // SWL 32'b101011?????????????????????????? 0 // SW 32'b101110?????????????????????????? 0 // SWR +32'b101111?????????????????????????? 0 // CACHE 32'b110011?????????????????????????? 0 // PREF (NOP) \ No newline at end of file diff --git a/tools/wctrl.txt b/tools/wctrl.txt index e375799..cabb946 100644 --- a/tools/wctrl.txt +++ b/tools/wctrl.txt @@ -70,4 +70,5 @@ 32'b101010?????????????????????????? 0 ? ? ? // SWL 32'b101011?????????????????????????? 0 ? ? ? // SW 32'b101110?????????????????????????? 0 ? ? ? // SWR +32'b101111?????????????????????????? 0 ? ? ? // CACHE 32'b110011?????????????????????????? 0 ? ? ? // PREF (NOP) \ No newline at end of file From 17f64e1f2f25c50d6aeb2b2039ed6e7de5f46ae5 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Thu, 2 Sep 2021 19:20:19 +0800 Subject: [PATCH 33/56] 1. add cache (D-Cache Address) inst 2. fix bug in ALR 3. fix bug in MMU and DCache 4. Register File rst --- README.md | 8 +-- resources/2021/soft/func/inst/inst_test.h | 70 ++++++++++++++++++- .../2021/soft/func/inst/n98_cache_dcache.S | 33 +++++++++ resources/2021/soft/func/start.S | 6 +- src/Cache/DCache.sv | 3 +- src/Core/Controller.sv | 2 +- src/Core/Datapath.sv | 1 + src/Core/RF.sv | 15 ++-- src/MMU/MMU.sv | 14 ++-- tools/decoder.py | 2 +- tools/mctrl1.txt | 4 +- 11 files changed, 131 insertions(+), 27 deletions(-) create mode 100644 resources/2021/soft/func/inst/n98_cache_dcache.S diff --git a/README.md b/README.md index abb76dd..9d010de 100644 --- a/README.md +++ b/README.md @@ -34,8 +34,8 @@ Our awesome `MIPS` CPU written in `SystemVerilog` for Loongson Cup | :hourglass: | `I-Cache Hit Invalid` | `SYS` | 2 | | | :hourglass: | `D-Cache Index Writeback Invalid` | `SYS` | 2 | | | :hourglass: | `D-Cache Index Store Tag` | `SYS` | 2 | | -| :hourglass: | `D-Cache Hit Invalid` | `SYS` | 2 | | -| :hourglass: | `D-Cache Hit Writeback Invalid` | `SYS` | 2 | | +| :heavy_check_mark: | `D-Cache Hit Invalid` | `SYS` | 2 | | +| :heavy_check_mark: | `D-Cache Hit Writeback Invalid` | `SYS` | 2 | | | :heavy_check_mark: | `PREF` | `SYS` | 1 | Treat as `NOP` | | :heavy_check_mark: | `SYNC` | `SYS` | 1 | Treat as `NOP` (We're strongly ordered) | | :clock3: | `WAIT` | `SYS` | 2 | | @@ -115,7 +115,3 @@ Hit Writeback Invalid : VA -> Lookup -> Hit? -> (Write Back) -> Write Zero | 1 | 1 | 1 | | | `I-Cache(0) or D-Cache(1)` | `Lookup(0) or Index(1)` | `WriteBack(0) or WriteOnly(1)` | | -备注: - -1. `Cache`指令当成写请求 -2. diff --git a/resources/2021/soft/func/inst/inst_test.h b/resources/2021/soft/func/inst/inst_test.h index 310c44d..6cf97df 100644 --- a/resources/2021/soft/func/inst/inst_test.h +++ b/resources/2021/soft/func/inst/inst_test.h @@ -1403,7 +1403,7 @@ bne v1, s6, inst_error; \ nop -/*97 98*/ +/*97*/ #define TEST_MSUB_HL(in_a, in_b, raw_hi, raw_lo, ref_hi, ref_lo) \ li t0, in_a; \ li t1, in_b; \ @@ -1437,3 +1437,71 @@ nop; \ bne v1, s6, inst_error; \ nop + +/*98*/ +/* + * addr1 : uncached + * addr2 : cached and mapped to addr1 + */ +#define TEST_CACHE_DCACHE_HIT(addr1, addr2, offset, data1, data2) \ + LI(t0, addr1); \ + LI(t1, addr2); \ + LI(t2, data1); \ + LI(t3, data2); \ + /* prepare -> hit writeback invalidate */ \ + sw t2, offset(t0); \ + cache 21, offset(t1); \ + lw a0, offset(t1); \ + bne t2, a0, inst_error; \ + nop; \ + /* test hit invalidate */ \ + sw t3, offset(t1); \ + cache 17, offset(t1); \ + lw a0, offset(t0); \ + bne a0, t2, inst_error; \ + nop; \ + /* test hit writeback invalidate */ \ + sw t3, offset(t1); \ + cache 21, offset(t1); \ + lw a0, offset(t0); \ + bne a0, t3, inst_error; \ + nop; \ + /* test multiple*/ \ + addi a1, t1, 4; \ + cache 17, offset(t1); \ + cache 17, offset(a1); \ + sw t2, offset(t1); \ + sw t3, offset(a1); \ + cache 21, offset(t1); \ + cache 21, offset(a1); \ + addi a1, t0, 4; \ + lw v0, offset(t0); \ + lw v1, offset(a1); \ + bne v0, t2, inst_error; \ + nop; \ + bne v1, t3, inst_error; \ + nop; \ + sw t3, offset(t0); \ + sw t2, offset(a1); \ + addi a1, t1, 4; \ + lw v0, offset(t1); \ + lw v1, offset(a1); \ + bne v0, t3, inst_error; \ + nop; \ + bne v1, t2, inst_error; \ + nop; \ + sw t2, offset(t1); \ + sw t3, offset(a1); \ + cache 17, offset(t1); \ + cache 17, offset(a1); \ + bne v0, t3, inst_error; \ + nop; \ + bne v1, t2, inst_error; \ + nop; \ + addi a1, t0, 4; \ + lw v0, offset(t0); \ + lw v1, offset(a1); \ + bne v0, t3, inst_error; \ + nop; \ + bne v1, t2, inst_error; \ + nop diff --git a/resources/2021/soft/func/inst/n98_cache_dcache.S b/resources/2021/soft/func/inst/n98_cache_dcache.S new file mode 100644 index 0000000..d65d9fd --- /dev/null +++ b/resources/2021/soft/func/inst/n98_cache_dcache.S @@ -0,0 +1,33 @@ +#include +#include +#include + +LEAF(n98_cache_dcache_test) + .set noreorder + addiu s0, s0 ,1 + li s2, 0x0 +###test inst + +TEST_CACHE_DCACHE_HIT(0xa00d0000, 0x800d0000, 0, 0xA5A5A5A5, 0x12345678) +TEST_CACHE_DCACHE_HIT(0xa00d0004, 0x800d0004, 0, 0xABCDEFAB, 0xF0F0F0F0) +TEST_CACHE_DCACHE_HIT(0xa00d0008, 0x800d0008, 4, 0x87654321, 0xAABBCCDD) +TEST_CACHE_DCACHE_HIT(0xa00d000C, 0x800d000C, 4, 0xF0F0F0F0, 0xABCDEFAB) + +TEST_CACHE_DCACHE_HIT(0xa00d0010, 0x800d0010, 0, 0xA5A5A5A5, 0x12345678) +TEST_CACHE_DCACHE_HIT(0xa00d0018, 0x800d0018, 0, 0xABCDEFAB, 0xF0F0F0F0) +TEST_CACHE_DCACHE_HIT(0xa00d0020, 0x800d0020, 4, 0x87654321, 0xAABBCCDD) +TEST_CACHE_DCACHE_HIT(0xa00d0028, 0x800d0028, 4, 0xF0F0F0F0, 0xABCDEFAB) + +###detect exception + bne s2, zero, inst_error + nop +###score ++ + addiu s3, s3, 1 +###output (s0<<24)|s3 +inst_error: + sll t1, s0, 24 + or t0, t1, s3 + sw t0, 0(s1) + jr ra + nop +END(n98_cache_dcache_test) diff --git a/resources/2021/soft/func/start.S b/resources/2021/soft/func/start.S index 6d2cfd7..44215cc 100644 --- a/resources/2021/soft/func/start.S +++ b/resources/2021/soft/func/start.S @@ -2,7 +2,7 @@ #include #include -#define TEST_NUM 97 +#define TEST_NUM 98 ##s0, number @@ -683,6 +683,10 @@ kseg0_kseg1: nop jal wait_1s nop + jal n98_cache_dcache_test + nop + jal wait_1s + nop ###check io access LI (a0, IO_SIMU_ADDR) diff --git a/src/Cache/DCache.sv b/src/Cache/DCache.sv index f1f6057..5d1436f 100644 --- a/src/Cache/DCache.sv +++ b/src/Cache/DCache.sv @@ -161,7 +161,8 @@ module DCache ( // ============================== // Choose Victim - assign victim = tagV[0] == 0 ? 4'b0001 + assign victim = port.clear ? hitWay + : tagV[0] == 0 ? 4'b0001 : tagV[1] == 0 ? 4'b0010 : tagV[2] == 0 ? 4'b0100 : tagV[3] == 0 ? 4'b1000 diff --git a/src/Core/Controller.sv b/src/Core/Controller.sv index dfbe178..bd3ec4b 100644 --- a/src/Core/Controller.sv +++ b/src/Core/Controller.sv @@ -73,7 +73,7 @@ module Controller ( assign ctrl.MCtrl1.MR = inst[31] & ~inst[30]; assign ctrl.MCtrl1.MWR = inst[29]; assign ctrl.MCtrl1.MX = ~inst[28]; - assign ctrl.MCtrl1.ALR = ALR_t'({inst[28] & inst[27] & ~inst[26], inst[27] & ~inst[26]}); + assign ctrl.MCtrl1.ALR = ALR_t'({inst[28] & inst[27] & ~inst[26], ~inst[28] & inst[27] & ~inst[26]}); assign ctrl.MCtrl1.SZ = inst[27:26]; assign ctrl.MCtrl1.TLBR = ~inst[31] & inst[30] & ~inst[29] & inst[25] & ~inst[3] & ~inst[1]; assign ctrl.MCtrl1.TLBWI = ~inst[31] & inst[30] & ~inst[29] & inst[25] & ~inst[3] & inst[1]; diff --git a/src/Core/Datapath.sv b/src/Core/Datapath.sv index f0bfbd9..f3aac6a 100644 --- a/src/Core/Datapath.sv +++ b/src/Core/Datapath.sv @@ -390,6 +390,7 @@ module Datapath ( // Register File RF RegisterFile ( .clk(clk), + .rst(rst), .raddr1(D.IA.RS), .raddr2(D.IA.RT), .raddr3(D.IB.RS), diff --git a/src/Core/RF.sv b/src/Core/RF.sv index ad8a5c8..49b2ad4 100644 --- a/src/Core/RF.sv +++ b/src/Core/RF.sv @@ -1,7 +1,8 @@ `include "defines.svh" module RF ( - input clk, + input logic clk, + input logic rst, input logic [4:0] raddr1, input logic [4:0] raddr2, input logic [4:0] raddr3, @@ -20,12 +21,12 @@ module RF ( word_t rf[31:0]; - always_ff @(posedge clk) begin - if(we1 & waddr1 != 0) - rf[waddr1] <= wdata1; - if(we2 & waddr2 != 0) - rf[waddr2] <= wdata2; - end + always_ff @(posedge clk) + if (rst) for (int i = 0; i < 32; i = i + 1) rf[i] <= 32'b0; + else begin + if (we1 & waddr1 != 0) rf[waddr1] <= wdata1; + if (we2 & waddr2 != 0) rf[waddr2] <= wdata2; + end assign rdata1 = raddr1 != 0 ? rf[raddr1] : 32'b0; assign rdata2 = raddr2 != 0 ? rf[raddr2] : 32'b0; diff --git a/src/MMU/MMU.sv b/src/MMU/MMU.sv index adc50b8..0f70239 100644 --- a/src/MMU/MMU.sv +++ b/src/MMU/MMU.sv @@ -310,7 +310,7 @@ module MMU ( logic dUser1; word_t dPA1, dPA2; logic [1:0] dSize1; - + CacheOp_t cacheOp1, cacheOp2; logic dEn2; @@ -335,8 +335,8 @@ module MMU ( ffen #(1) dwr_ff (clk, data.wr, dEn2, dwr1); ffen #(4) dwstrb_ff (clk, data.wstrb, dEn2, dWstrb1); ffen #(32) dwdata_ff (clk, data.wdata, dEn2, dWdata1); - ffen #(3) cache_op_ff (clk, cacheOp, dEn, cacheOp1); - ffen #(3) cache_op2_ff (clk, cacheOp1, dEn2, cacheOp2); + ffen #(3) cache_op_ff (clk, cacheOp[2:0], dEn, cacheOp1[2:0]); + ffen #(3) cache_op2_ff (clk, cacheOp1[2:0], dEn2, cacheOp2[2:0]); // ================================= // ======== drState Machine ======== @@ -466,7 +466,7 @@ module MMU ( ); assign dc.req = dEn; - assign dc.valid = dValid1 & dCached1; + assign dc.valid = dValid1 & dCached1 & (~cacheOp1[2] | cacheOp1[1] | dc.hit); assign dc.index = dVA[`DC_TAGL-1:`DC_INDEXL]; assign dc.tag1 = dEn2 ? dPA1[31:`DC_TAGL] : dPA2[31:`DC_TAGL]; assign dc.sel1 = dEn2 ? dPA1[3:2] : dPA2[3:2]; @@ -506,7 +506,7 @@ module MMU ( case (dwState) DW_IDLE: begin - if (dEn2 & (~dCached1 & data.wr + if (dEn2 & (~dCached1 & data.wr | dCached1 & dc.dirt_valid & (~cacheOp1[2] | ~cacheOp1[0]) // WriteOnly 不允许写回 & (~dc.hit | cacheOp1[2] & ~cacheOp1[0]) // Writeback Invalid 直接写回 @@ -619,7 +619,7 @@ module MMU ( case (dwaState) DWA_IDLE: begin - if (dEn2 & (~dCached1 & data.wr + if (dEn2 & (~dCached1 & data.wr | dCached1 & dc.dirt_valid & (~cacheOp1[2] | ~cacheOp1[0]) // WriteOnly 不允许写回 & (~dc.hit | cacheOp1[2] & ~cacheOp1[0])) // Writeback Invalid 直接写回 @@ -662,7 +662,7 @@ module MMU ( assign dc.wvalid = dEn2 ? data.wr : dwr1; assign dc.wdata = dEn2 ? data.wdata : dWdata1; assign dc.wstrb = dEn2 ? data.wstrb : dWstrb1; - assign dc.clear = dEn2 ? cacheOp1[2] & dCached1 & (dc.hit | cacheOp1[1]) + assign dc.clear = dEn2 ? cacheOp1[2] & dCached1 & (dc.hit | cacheOp1[1]) : cacheOp2[2] & dCached2; // ============================== diff --git a/tools/decoder.py b/tools/decoder.py index 71c2cfc..d369363 100644 --- a/tools/decoder.py +++ b/tools/decoder.py @@ -139,7 +139,7 @@ for inst, name in table: ctrl['MCtrl1_MR'] = inst[31] & ~inst[30] ctrl['MCtrl1_MWR'] = inst[29] ctrl['MCtrl1_MX'] = ~inst[28] - ctrl['MCtrl1_ALR'] = (inst[28] & inst[27] & ~inst[26], inst[27] & ~inst[26]) + ctrl['MCtrl1_ALR'] = (inst[28] & inst[27] & ~inst[26], ~inst[28] & inst[27] & ~inst[26]) ctrl['MCtrl1_TLBR'] = ~inst[31] & inst[30] & ~inst[29] & inst[25] & ~inst[3] & ~inst[1] ctrl['MCtrl1_TLBWI'] = ~inst[31] & inst[30] & ~inst[29] & inst[25] & ~inst[3] & inst[1] ctrl['MCtrl1_TLBWR'] = ~inst[31] & inst[30] & ~inst[29] & inst[25] & ~inst[3] & (inst[2] | ~inst[1]) diff --git a/tools/mctrl1.txt b/tools/mctrl1.txt index 0626d04..6111647 100644 --- a/tools/mctrl1.txt +++ b/tools/mctrl1.txt @@ -64,12 +64,12 @@ 32'b100011?????????????????????????? 0 0 0 0 1 0 ? ALIGN 0 0 CNOP 0 0 0 // LW 32'b100100?????????????????????????? 0 0 0 0 1 0 0 ALIGN 0 0 CNOP 0 0 0 // LBU 32'b100101?????????????????????????? 0 0 0 0 1 0 0 ALIGN 0 0 CNOP 0 0 0 // LHU -32'h100110?????????????????????????? 0 0 0 0 1 0 ? URIGHT 1 ? CNOP 0 0 0 // LWR +32'h100110?????????????????????????? 0 0 0 0 1 0 ? URIGHT 1 0 CNOP 0 0 0 // LWR 32'b101000?????????????????????????? 0 0 0 0 1 1 ? ALIGN 0 0 CNOP 0 0 0 // SB 32'b101001?????????????????????????? 0 0 0 0 1 1 ? ALIGN 0 0 CNOP 0 0 0 // SH 32'b101010?????????????????????????? 0 0 0 0 1 1 ? ULEFT 0 1 CNOP 0 0 0 // SWL 32'b101011?????????????????????????? 0 0 0 0 1 1 ? ALIGN 0 0 CNOP 0 0 0 // SW -32'b101110?????????????????????????? 0 0 0 0 1 1 ? URIGHT 1 ? CNOP 0 0 0 // SWR +32'b101110?????????????????????????? 0 0 0 0 1 1 ? URIGHT 1 0 CNOP 0 0 0 // SWR 32'b101111?????00000???????????????? 0 0 0 0 1 1 ? ALIGN 0 0 IC_I 0 1 1 // I-Cache Index Invalid 32'b101111?????01000???????????????? 0 0 0 0 1 1 ? ALIGN 0 0 IC_I 0 1 1 // I-Cache Index Store Tag 32'b101111?????10000???????????????? 0 0 0 0 1 1 ? ALIGN 0 0 IC_L 0 0 1 // I-Cache Hit Invalid From 2143cbe63072e7c7afb8bc7acb0ff6b90ad21b7a Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Fri, 3 Sep 2021 21:23:32 +0800 Subject: [PATCH 34/56] try add I-Cache's CACHE inst --- src/Cache/ICache.sv | 12 +-- src/MMU/MMU.sv | 201 +++++++++++++++++++++----------------------- 2 files changed, 102 insertions(+), 111 deletions(-) diff --git a/src/Cache/ICache.sv b/src/Cache/ICache.sv index 566609d..5b1e5a9 100644 --- a/src/Cache/ICache.sv +++ b/src/Cache/ICache.sv @@ -68,7 +68,7 @@ module ICache ( end end LOOKUP: begin - if (~port.valid | hit) begin + if (~port.valid | hit | port.clear) begin if (~port.req) begin nextState = IDLE; end @@ -164,7 +164,7 @@ module ICache ( port.req, baddr ); - assign bwe = (state == REPLACE) & port.rvalid; + assign bwe = (state == REPLACE) & port.rvalid | port.clear; // 地址 assign TagRAM0.addr = baddr; @@ -189,10 +189,10 @@ module ICache ( assign TagRAM1.wdata = {port.tag1, 1'b1}; assign TagRAM2.wdata = {port.tag1, 1'b1}; assign TagRAM3.wdata = {port.tag1, 1'b1}; - assign DataRAM0.wdata = port.rdata; - assign DataRAM1.wdata = port.rdata; - assign DataRAM2.wdata = port.rdata; - assign DataRAM3.wdata = port.rdata; + assign DataRAM0.wdata = port.clear ? `IC_TAG_LENGTH'b0 : port.rdata; + assign DataRAM1.wdata = port.clear ? `IC_TAG_LENGTH'b0 : port.rdata; + assign DataRAM2.wdata = port.clear ? `IC_TAG_LENGTH'b0 : port.rdata; + assign DataRAM3.wdata = port.clear ? `IC_TAG_LENGTH'b0 : port.rdata; ICTag_bram tag_ram0 ( .addra(TagRAM0.addr), diff --git a/src/MMU/MMU.sv b/src/MMU/MMU.sv index 0f70239..ff367d8 100644 --- a/src/MMU/MMU.sv +++ b/src/MMU/MMU.sv @@ -55,33 +55,22 @@ module MMU ( typedef enum bit [3:0] { I_IDLE, I_WA, - I_WD1, - I_WD2, - I_WD3, - I_WD4, - I_WD5, - I_WD6, - I_WD7, - I_WD8, - I_REFILL + I_WD1, I_WD2, I_WD3, I_WD4, I_WD5, I_WD6, I_WD7, I_WD8, + I_REFILL, + I_CACHE } istate_t; typedef enum bit [2:0] { DR_IDLE, DR_WA, - DR_WD1, - DR_WD2, - DR_WD3, - DR_WD4, - DR_REFILL + DR_WD1, DR_WD2, DR_WD3, DR_WD4, + DR_REFILL, + DR_CACHE } drstate_t; typedef enum bit [2:0] { DW_IDLE, - DW_WD1, - DW_WD2, - DW_WD3, - DW_WD4, + DW_WD1, DW_WD2, DW_WD3, DW_WD4, DW_WB, DW_WAITR } dwstate_t; @@ -121,14 +110,17 @@ module MMU ( end always_comb begin - iEn = 0; - iEn2 = 0; - iNextState = iState; + iEn = 0; + iEn2 = 0; + iNextState = iState; inst.data_ok = 0; inst_axi.req = 0; + ic.clear = 0; case (iState) I_IDLE: begin - if (~iValid1) iEn = 1; + if (diReq & ~iValid1) begin + iNextState = I_CACHE; + end else if (~iValid1) iEn = 1; else begin iEn2 = 1; if (iCached1 & ic.hit) begin @@ -155,6 +147,7 @@ module MMU ( if (inst_axi.rvalid) begin inst.data_ok = 1; if (iCached2) iNextState = I_WD3; + else if (diReq) iNextState = I_CACHE; else begin iEn = 1; iNextState = I_IDLE; @@ -180,7 +173,27 @@ module MMU ( if (inst_axi.rvalid) iNextState = I_REFILL; end I_REFILL: begin - iEn = 1; + if (diReq) iNextState = I_CACHE; + else begin + iEn = 1; + iNextState = I_IDLE; + end + end + I_CACHE: begin + /* + * I-Cache Cache指令实现备注: + * 在进入 I_CACHE 状态时需确保 iEn == 0 + * 跳出 I_CACHE 状态时 iEn = 1 + * 注意处理 Exceptions + * TLB 转换请求在 iNextState == I_CACHE时发送 + * I-Cache 查询请求在 iNextState == I_CACHE时发送 + * 在 I_CACHE 状态下屏蔽 iAddressError 且只有在 Address 类型请求下允许 TLBRefill 和 TLBInvalid + * I_CACHE 状态下向 I_CACHE 发送 clear 信号 + * drState 状态机同步 + */ + + if (~iTLBRefill & ~iTLBInvalid & iCached1 & (ic.hit | cacheOp1[1])) ic.clear = 1; + iEn = 1; iNextState = I_IDLE; end endcase @@ -190,74 +203,23 @@ module MMU ( // ======== iFlip-Flop ======== // ============================ - ffenr #(1) ivalid_ff ( - clk, - rst, - inst.req, - iEn, - iReq1 - ); - ffen #(32) iPA_ff ( - clk, - iPA1, - iEn2, - iPA2 - ); - ffen #(1) iCached_ff ( - clk, - iCached1, - iEn2, - iCached2 - ); + ffenr #(1) ivalid_ff (clk, rst, inst.req, iEn, iReq1); + ffen #(32) iPA_ff (clk, iPA1, iEn2, iPA2); + ffen #(1) iCached_ff (clk, iCached1, iEn2, iCached2); - ffen #(32) id1_ff ( - clk, - inst_axi.rdata, - iState == I_WA | iState == I_WD1, - iD1 - ); - ffen #(32) id2_ff ( - clk, - inst_axi.rdata, - iState == I_WD2, - iD2 - ); - ffen #(32) id3_ff ( - clk, - inst_axi.rdata, - iState == I_WD3, - iD3 - ); - ffen #(32) id4_ff ( - clk, - inst_axi.rdata, - iState == I_WD4, - iD4 - ); - ffen #(32) id5_ff ( - clk, - inst_axi.rdata, - iState == I_WD5, - iD5 - ); - ffen #(32) id6_ff ( - clk, - inst_axi.rdata, - iState == I_WD6, - iD6 - ); - ffen #(32) id7_ff ( - clk, - inst_axi.rdata, - iState == I_WD7, - iD7 - ); + ffen #(32) id1_ff (clk, inst_axi.rdata, iState == I_WA | iState == I_WD1, iD1); + ffen #(32) id2_ff (clk, inst_axi.rdata, iState == I_WD2, iD2); + ffen #(32) id3_ff (clk, inst_axi.rdata, iState == I_WD3, iD3); + ffen #(32) id4_ff (clk, inst_axi.rdata, iState == I_WD4, iD4); + ffen #(32) id5_ff (clk, inst_axi.rdata, iState == I_WD5, iD5); + ffen #(32) id6_ff (clk, inst_axi.rdata, iState == I_WD6, iD6); + ffen #(32) id7_ff (clk, inst_axi.rdata, iState == I_WD7, iD7); // =============================== // ========== iFunction ========== // =============================== - assign iVA = inst.addr; + assign iVA = iNextState == I_CACHE ? data.addr : inst.addr; assign iValid1 = iReq1 & iHit1 & iMValid1 & (in_kernel | iUser1); assign inst.addr_ok = iEn; @@ -271,11 +233,13 @@ module MMU ( {inst.rdata1, inst.rdata0} ); - assign ic.req = iEn; + // I-Cache req on inst query or cache instruction + assign ic.req = iEn | iNextState == I_CACHE; assign ic.valid = iValid1 & iCached1; assign ic.index = iVA[`IC_TAGL-1:`IC_INDEXL]; assign ic.tag1 = iEn2 ? iPA1[31:`IC_TAGL] : iPA2[31:`IC_TAGL]; assign ic.rvalid = inst_axi.rvalid & inst_axi.data_ok; + assign ic.clear = iState == I_CACHE & ~cacheOp1[2] & iCached1 & (ic.hit | cacheOp1[1]); mux4 #(256) ic_rdata_mux ( {inst_axi.rdata, iD7, iD6, iD5, iD4, iD3, iD2, iD1}, @@ -290,8 +254,8 @@ module MMU ( assign inst_axi.len = (iEn2 ? iCached1 : iCached2) ? 4'b0111 : 4'b0001; assign inst_axi.size = 3'b010; - assign iTLBRefill = (iState == I_IDLE) & iReq1 & ~iHit1; - assign iTLBInvalid = (iState == I_IDLE) & iReq1 & ~iMValid1; + assign iTLBRefill = (iState == I_IDLE & iReq1 | iState == I_CACHE & ~cacheOp[1]) & ~iHit1; + assign iTLBInvalid = (iState == I_IDLE & iReq1 | iState == I_CACHE & ~cacheOp[1]) & ~iMValid1; assign iAddressError = (iState == I_IDLE) & iReq1 & ~in_kernel & ~iUser1; // ====================== @@ -301,7 +265,7 @@ module MMU ( word_t dVA; logic dEn; - logic dReq1; + logic dReq1, dcReq1, diReq; logic dHit1; logic dCached1, dCached2; logic dDirty1; @@ -328,15 +292,15 @@ module MMU ( // ======== dFlip-Flop ======== // ============================ - ffenr #(1) dvalid_ff (clk, rst, data.req, dEn, dReq1); - ffen #(2) dsize_ff (clk, data.size, dEn, dSize1); - ffen #(32) dPA_ff (clk, dPA1, dEn2, dPA2); - ffen #(1) dCached_ff (clk, dCached1, dEn2, dCached2); - ffen #(1) dwr_ff (clk, data.wr, dEn2, dwr1); - ffen #(4) dwstrb_ff (clk, data.wstrb, dEn2, dWstrb1); - ffen #(32) dwdata_ff (clk, data.wdata, dEn2, dWdata1); - ffen #(3) cache_op_ff (clk, cacheOp[2:0], dEn, cacheOp1[2:0]); - ffen #(3) cache_op2_ff (clk, cacheOp1[2:0], dEn2, cacheOp2[2:0]); + ffenr #(1) dvalid_ff (clk, rst, data.req, dEn, dReq1); + ffen #(2) dsize_ff (clk, data.size, dEn, dSize1); + ffen #(32) dPA_ff (clk, dPA1, dEn2, dPA2); + ffen #(1) dCached_ff (clk, dCached1, dEn2, dCached2); + ffen #(1) dwr_ff (clk, data.wr, dEn2, dwr1); + ffen #(4) dwstrb_ff (clk, data.wstrb, dEn2, dWstrb1); + ffen #(32) dwdata_ff (clk, data.wdata, dEn2, dWdata1); + ffen #(3) cache_op_ff (clk, cacheOp[2:0], dEn, cacheOp1[2:0]); + ffen #(3) cache_op2_ff (clk, cacheOp1[2:0], dEn2, cacheOp2[2:0]); // ================================= // ======== drState Machine ======== @@ -359,6 +323,7 @@ module MMU ( case (drState) DR_IDLE: begin if (~dValid1) dEn = 1; + else if (~dcReq1) drNextState = DR_CACHE; else begin dEn2 = 1; if (data.wr) data.data_ok = 1; @@ -412,6 +377,17 @@ module MMU ( drNextState = DR_IDLE; end end + DR_CACHE: begin + /* + * 该状态是 I-CACHE 的清除指令 + * 当 iState == I_CACHE 代表下一个周期恢复正常工作 + */ + if (iState == I_CACHE) begin + data.data_ok = 1; + dEn = 1; + drNextState = DR_IDLE; + end + end endcase end @@ -419,13 +395,27 @@ module MMU ( // ========== dFunction ========== // ================================ - assign dVA = data.addr; - assign dValid1 = dReq1 & dHit1 & dMValid1 & (~data.wr | dDirty1) & (in_kernel | dUser1); + /* + * D-Cache Cache 指令实现备注 + * Cache 指令当成写指令处理 + * TLB 转换请求和 D-Cache 请求与普通访存一致 + * dc.req 在 I-Cache Cache 指令发生时为0 + * 清除请求时 drState 进入 DR_REFILL 状态,后由 DW_STATE 确定返回 + * dwState 和 dwaState 需判断是否是 CACHE 指令且是否允许写回 + * 屏蔽 dAddressError 和 TLBModified 且只有在 Address 类型请求下允许 TLBRefill 和 TLBInvalid + * dc.clear 在查询完成后一阶段或者写回完成阶段发送 + */ - assign dTLBRefill = (drState == DR_IDLE) & dReq1 & ~cacheOp1[1] & ~dHit1; - assign dTLBInvalid = (drState == DR_IDLE) & dReq1 & ~cacheOp1[1] & ~dMValid1; - assign dTLBModified = (drState == DR_IDLE) & dReq1 & ~cacheOp1[1] & data.wr & ~dDirty1; - assign dAddressError = (drState == DR_IDLE) & dReq1 & ~cacheOp1[1] & ~in_kernel & ~dUser1; + assign dVA = data.addr; + assign diReq = dEn ? data.req & ~cacheOp[2] & |cacheOp[1:0] + : dReq1 & ~cacheOp1[2] & |cacheOp1[1:0]; + assign dcReq1 = dReq1 & (cacheOp1 == CNOP | cacheOp[2]); // exclude I-Cache clear + assign dValid1 = dReq1 & dHit1 & dMValid1 & (~data.wr | dDirty1) & (in_kernel | dUser1); + + assign dTLBRefill = drState == DR_IDLE & dcReq1 & (cacheOp1 == CNOP | ~cacheOp1[1]) & ~dHit1; + assign dTLBInvalid = drState == DR_IDLE & dcReq1 & (cacheOp1 == CNOP | ~cacheOp1[1]) & ~dMValid1; + assign dTLBModified = drState == DR_IDLE & dcReq1 & data.wr & ~dDirty1; + assign dAddressError = drState == DR_IDLE & dcReq1 & ~in_kernel & ~dUser1; // ============================= // ======== drFlip-Flop ======== @@ -465,7 +455,8 @@ module MMU ( data.rdata ); - assign dc.req = dEn; + // do not request when handling CACHE instruction on I-Cache + assign dc.req = dEn & (cacheOp[2] | ~|cacheOp[1:0]); assign dc.valid = dValid1 & dCached1 & (~cacheOp1[2] | cacheOp1[1] | dc.hit); assign dc.index = dVA[`DC_TAGL-1:`DC_INDEXL]; assign dc.tag1 = dEn2 ? dPA1[31:`DC_TAGL] : dPA2[31:`DC_TAGL]; From fa0c8ece07666a6e55e0e8fb8f9e6594115af6b0 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Fri, 3 Sep 2021 22:16:59 +0800 Subject: [PATCH 35/56] 1. fix index addr 2. add n99 I-Cache CACHE test --- resources/2021/soft/func/inst/1 | 89 ------------------- .../2021/soft/func/inst/n99_cache_icache.S | 80 +++++++++++++++++ resources/2021/soft/func/start.S | 17 +++- src/Core/Datapath.sv | 5 +- 4 files changed, 100 insertions(+), 91 deletions(-) delete mode 100644 resources/2021/soft/func/inst/1 create mode 100644 resources/2021/soft/func/inst/n99_cache_icache.S diff --git a/resources/2021/soft/func/inst/1 b/resources/2021/soft/func/inst/1 deleted file mode 100644 index 91180a6..0000000 --- a/resources/2021/soft/func/inst/1 +++ /dev/null @@ -1,89 +0,0 @@ -n10_sltiu.S -n11_sll.S -n12_sw.S -n13_j.S -n14_jal.S -n15_jr.S -n16_beq_ds.S -n17_bne_ds.S -n18_j_ds.S -n19_jal_ds.S -n1_lui.S -n20_jr_ds.S -n21_add.S -n22_addi.S -n23_sub.S -n24_subu.S -n25_sltu.S -n26_and.S -n27_andi.S -n28_nor.S -n29_ori.S -n2_addu.S -n30_xor.S -n31_xori.S -n32_sllv.S -n33_sra.S -n34_srav.S -n35_srl.S -n36_srlv.S -n37_bgez.S -n38_bgtz.S -n39_blez.S -n3_addiu.S -n40_bltz.S -n41_bltzal.S -n42_bgezal.S -n43_jalr.S -n44_div.S -n45_divu.S -n46_mult.S -n47_multu.S -n48_mfhi.S -n49_mflo.S -n4_beq.S -n50_mthi.S -n51_mtlo.S -n52_bgez_ds.S -n53_bgtz_ds.S -n54_blez_ds.S -n55_bltz_ds.S -n56_bltzal_ds.S -n57_bgezal_ds.S -n58_jalr_ds.S -n59_lb.S -n5_bne.S -n60_lbu.S -n61_lh.S -n62_lhu.S -n63_sb.S -n64_sh.S -n65_syscall_ex.S -n66_break_ex.S -n67_add_ov_ex.S -n68_addi_ov_ex.S -n69_sub_ov_ex.S -n6_lw.S -n70_lw_adel_ex.S -n71_lh_adel_ex.S -n72_lhu_adel_ex.S -n73_sw_ades_ex.S -n74_sh_ades_ex.S -n75_ft_adel_ex.S -n76_ri_ex.S -n77_soft_int_ex.S -n78_beq_ds_ex.S -n79_bne_ds_ex.S -n7_or.S -n80_bgez_ds_ex.S -n81_bgtz_ds_ex.S -n82_blez_ds_ex.S -n83_bltz_ds_ex.S -n84_bltzal_ds_ex.S -n85_bgezal_ds_ex.S -n86_j_ds_ex.S -n87_jal_ds_ex.S -n88_jr_ds_ex.S -n89_jalr_ds_ex.S -n8_slt.S -n9_slti.S diff --git a/resources/2021/soft/func/inst/n99_cache_icache.S b/resources/2021/soft/func/inst/n99_cache_icache.S new file mode 100644 index 0000000..95f39dd --- /dev/null +++ b/resources/2021/soft/func/inst/n99_cache_icache.S @@ -0,0 +1,80 @@ +#include +#include +#include + +LEAF(n99_cache_icache_test) + .set noreorder + addiu s0, s0 ,1 + li s2, 0x0 +###test inst + +.n99_1: + la v0, .n99_1_replace + li v1, 0x20840001 + sw v1, 0(v0) + cache 21, 0(v0) # D-Cache Hit WriteBack Invalid + cache 16, 0(v0) # I-Cache Hit Invalid + addi a0, zero, 0 + addi a1, zero, 1 +.n99_1_replace: + nop # line will be replaced with "addi a0, a0, 1" -> 20840001 + bne a0, a1, inst_error + nop + +.n99_2: + la v0, .n99_2_replace + li v1, 0x20840001 + sw v1, 0(v0) + cache 21, 0(v0) # D-Cache Hit WriteBack Invalid + addi t0, zero, 0 + addi t1, zero, 64 # I-Cache Index Max 64 +.n99_2_loop: + beq t0, t1, .n99_2_check + nop + add v0, t0, zero + cache 0, 0(v0) # I-Cache Index Invalid + addi t0, t0, 1 + j .n99_2_loop +.n99_2_check: + addi a0, zero, 0 + addi a1, zero, 1 +.n99_2_replace: + nop # line will be replaced with "addi a0, a0, 1" -> 20840001 + bne a0, a1, inst_error + nop + +.n99_3: + la v0, .n99_3_replace + li v1, 0x20840001 + sw v1, 0(v0) + cache 21, 0(v0) # D-Cache Hit WriteBack Invalid + addi t0, zero, 0 + addi t1, zero, 64 # I-Cache Index Max 64 +.n99_3_loop: + beq t0, t1, .n99_3_check + nop + add v0, t0, zero + cache 8, 0(v0) # I-Cache Index Store Tag + addi t0, t0, 1 + j .n99_3_loop +.n99_3_check: + addi a0, zero, 0 + addi a1, zero, 1 +.n99_3_replace: + nop # line will be replaced with "addi a0, a0, 1" -> 20840001 + bne a0, a1, inst_error + nop + +###detect exception + bne s2, zero, inst_error + nop +###score ++ + addiu s3, s3, 1 +###output (s0<<24)|s3 +inst_error: + sll t1, s0, 24 + or t0, t1, s3 + sw t0, 0(s1) + jr ra + nop +END(n99_cache_icache_test) diff --git a/resources/2021/soft/func/start.S b/resources/2021/soft/func/start.S index 44215cc..d78850c 100644 --- a/resources/2021/soft/func/start.S +++ b/resources/2021/soft/func/start.S @@ -2,7 +2,7 @@ #include #include -#define TEST_NUM 98 +#define TEST_NUM 99 ##s0, number @@ -687,6 +687,21 @@ kseg0_kseg1: nop jal wait_1s nop + + la t1, n99_kseg1_kseg0 + li t2, 0x20000000 + subu t9, t1, t2 + jr t9 + nop +n99_kseg1_kseg0: + jal n99_cache_icache_test + nop + jal wait_1s + nop + la t9, n99_kseg0_kseg1 + jr t9 + nop +n99_kseg0_kseg1: ###check io access LI (a0, IO_SIMU_ADDR) diff --git a/src/Core/Datapath.sv b/src/Core/Datapath.sv index f3aac6a..7ce04d5 100644 --- a/src/Core/Datapath.sv +++ b/src/Core/Datapath.sv @@ -917,7 +917,10 @@ module Datapath ( assign tlb_tlbp = E.I1.MCtrl.TLBP; assign mem_i.req = E.I1.MCtrl.MR & E_I1_goWithoutOF & M.en & ~rstM; assign E_I1_ADDR = E_I1_ForwardS + E.I1.imm; - assign mem_i.addr = |E.I1.MCtrl.ALR ? {E_I1_ADDR[31:2], 2'b0} : E_I1_ADDR; + assign mem_i.addr = |E.I1.MCtrl.ALR ? {E_I1_ADDR[31:2], 2'b0} + : (cache_op == CNOP | ~cache_op[1]) ? E_I1_ADDR + : cache_op[2] ? {E_I1_ADDR[32-`DC_INDEXL-1:0], `DC_INDEXL'b0} + : {E_I1_ADDR[32-`IC_INDEXL-1:0], `IC_INDEXL'b0}; assign mem_i.size = {E.I1.MCtrl.SZ[1], E.I1.MCtrl.SZ[0] & ~E.I1.MCtrl.SZ[1]}; assign cache_op = E.I1.MCtrl.CACHE_OP; From e08ded2242f3b16916333eb6185c9c3512e639de Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Sat, 4 Sep 2021 16:31:25 +0800 Subject: [PATCH 36/56] Test Passed? maybe 1. fix timing loop 2. fix multi driven 3. fix CACHE I-Cache Index logic 4. fix testcase --- .../2021/soft/func/inst/n99_cache_icache.S | 82 ++++++++++++++----- resources/2021/soft/func/start.S | 39 ++++----- src/CP0/CP0.sv | 4 +- src/Cache/DCache.sv | 8 +- src/Cache/ICache.sv | 32 ++++---- src/Core/Datapath.sv | 2 + src/MMU/MMU.sv | 36 ++++---- src/include/ICache.svh | 2 +- 8 files changed, 128 insertions(+), 77 deletions(-) diff --git a/resources/2021/soft/func/inst/n99_cache_icache.S b/resources/2021/soft/func/inst/n99_cache_icache.S index 95f39dd..f1e86a9 100644 --- a/resources/2021/soft/func/inst/n99_cache_icache.S +++ b/resources/2021/soft/func/inst/n99_cache_icache.S @@ -8,22 +8,49 @@ LEAF(n99_cache_icache_test) li s2, 0x0 ###test inst +.n99_1_prepare: + addi a1, zero, 0 .n99_1: + addi a0, zero, 0 +.n99_1_replace: + nop # will be replaced with "addi a0, a0, 1" -> 20840001 + bne a0, a1, inst_error + nop + bne a1, zero, .n99_2_prepare # jump out 2nd + nop + addi a1, a1, 1 +.n99_1_work: la v0, .n99_1_replace li v1, 0x20840001 + li t0, 0x20000000 + subu v0, v0, t0 # v0 <- 9fcxxxxx sw v1, 0(v0) cache 21, 0(v0) # D-Cache Hit WriteBack Invalid cache 16, 0(v0) # I-Cache Hit Invalid - addi a0, zero, 0 - addi a1, zero, 1 -.n99_1_replace: - nop # line will be replaced with "addi a0, a0, 1" -> 20840001 - bne a0, a1, inst_error + # TODO: clear Datapath on CACHE + # using enough nop to stop prefetch + nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop + nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop + j .n99_1 nop + +.n99_2_prepare: + addi a1, zero, 0 .n99_2: + addi a0, zero, 0 +.n99_2_replace: + nop # will be replaced with "addi a0, a0, 1" -> 20840001 + bne a0, a1, inst_error + nop + bne a1, zero, .n99_3_prepare # jump out 2nd + nop + addi a1, a1, 1 +.n99_2_work: la v0, .n99_2_replace li v1, 0x20840001 + li t0, 0x20000000 + subu v0, v0, t0 sw v1, 0(v0) cache 21, 0(v0) # D-Cache Hit WriteBack Invalid addi t0, zero, 0 @@ -31,21 +58,35 @@ LEAF(n99_cache_icache_test) .n99_2_loop: beq t0, t1, .n99_2_check nop - add v0, t0, zero - cache 0, 0(v0) # I-Cache Index Invalid + cache 0, 0(t0) # I-Cache Index Invalid addi t0, t0, 1 j .n99_2_loop + nop .n99_2_check: - addi a0, zero, 0 - addi a1, zero, 1 -.n99_2_replace: - nop # line will be replaced with "addi a0, a0, 1" -> 20840001 - bne a0, a1, inst_error + # TODO: clear Datapath on CACHE + # using enough nop to stop prefetch + nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop + nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop + j .n99_2 nop + +.n99_3_prepare: + addi a1, zero, 0 .n99_3: + addi a0, zero, 0 +.n99_3_replace: + nop # will be replaced with "addi a0, a0, 1" -> 20840001 + bne a0, a1, inst_error + nop + bne a1, zero, .n99_success # jump out 2nd + nop + addi a1, a1, 1 +.n99_3_work: la v0, .n99_3_replace li v1, 0x20840001 + li t0, 0x20000000 + subu v0, v0, t0 sw v1, 0(v0) cache 21, 0(v0) # D-Cache Hit WriteBack Invalid addi t0, zero, 0 @@ -53,16 +94,19 @@ LEAF(n99_cache_icache_test) .n99_3_loop: beq t0, t1, .n99_3_check nop - add v0, t0, zero - cache 8, 0(v0) # I-Cache Index Store Tag + cache 0, 0(t0) # I-Cache Index Invalid addi t0, t0, 1 j .n99_3_loop + nop .n99_3_check: - addi a0, zero, 0 - addi a1, zero, 1 -.n99_3_replace: - nop # line will be replaced with "addi a0, a0, 1" -> 20840001 - bne a0, a1, inst_error + # TODO: clear Datapath on CACHE + # using enough nop to stop prefetch + nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop + nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop + j .n99_3 + nop + +.n99_success: nop ###detect exception diff --git a/resources/2021/soft/func/start.S b/resources/2021/soft/func/start.S index d78850c..cea091c 100644 --- a/resources/2021/soft/func/start.S +++ b/resources/2021/soft/func/start.S @@ -299,6 +299,26 @@ inst_test: nop ##### kseg0_kseg1: + jal n98_cache_dcache_test + nop + jal wait_1s + nop + + la t1, n99_kseg1_kseg0 + li t2, 0x20000000 + subu t9, t1, t2 + jr t9 + nop +n99_kseg1_kseg0: + jal n99_cache_icache_test + nop + jal wait_1s + nop + la t9, n99_kseg0_kseg1 + jr t9 + nop +n99_kseg0_kseg1: + jal n2_addu_test #addu nop jal wait_1s @@ -683,25 +703,6 @@ kseg0_kseg1: nop jal wait_1s nop - jal n98_cache_dcache_test - nop - jal wait_1s - nop - - la t1, n99_kseg1_kseg0 - li t2, 0x20000000 - subu t9, t1, t2 - jr t9 - nop -n99_kseg1_kseg0: - jal n99_cache_icache_test - nop - jal wait_1s - nop - la t9, n99_kseg0_kseg1 - jr t9 - nop -n99_kseg0_kseg1: ###check io access LI (a0, IO_SIMU_ADDR) diff --git a/src/CP0/CP0.sv b/src/CP0/CP0.sv index 304febf..7a03c2a 100644 --- a/src/CP0/CP0.sv +++ b/src/CP0/CP0.sv @@ -115,7 +115,7 @@ module CP0 ( rf_cp0.EntryLo0.V = 1'b0; rf_cp0.EntryLo0.G = 1'b0; rf_cp0.Index.P = 1'b0; - rf_cp0.Index.Index = 2'b0; + rf_cp0.Index.Index = 3'b0; rf_cp0.Random.Random = 3'b111; rf_cp0.EBase.EBase = 18'b0; @@ -166,7 +166,7 @@ module CP0 ( 9: rf_cp0.Count = wdata; 8: rf_cp0.BadVAddr = wdata; // 7: rf_cp0.HWREna = wdata; - 6: rf_cp0.Wired = wdata[2:0]; + 6: rf_cp0.Wired = {29'b0, wdata[2:0]}; // 5: rf_cp0.PageMask.Mask = wdata[24:13]; // 4: rf_cp0.Context = wdata; 3: begin diff --git a/src/Cache/DCache.sv b/src/Cache/DCache.sv index 5d1436f..96c4082 100644 --- a/src/Cache/DCache.sv +++ b/src/Cache/DCache.sv @@ -241,10 +241,10 @@ module DCache ( assign DataRAM2.wen = (bwe1 & wen[2]) | (bwe2 & wen2[2]); assign DataRAM3.wen = (bwe1 & wen[3]) | (bwe2 & wen2[3]); // 写数据 - assign TagRAM0.wdata = port.clear ? `DC_TAG_LENGTH'b0 : {port.tag1, port.wvalid, 1'b1}; - assign TagRAM1.wdata = port.clear ? `DC_TAG_LENGTH'b0 : {port.tag1, port.wvalid, 1'b1}; - assign TagRAM2.wdata = port.clear ? `DC_TAG_LENGTH'b0 : {port.tag1, port.wvalid, 1'b1}; - assign TagRAM3.wdata = port.clear ? `DC_TAG_LENGTH'b0 : {port.tag1, port.wvalid, 1'b1}; + assign TagRAM0.wdata = {port.tag1, port.wvalid, ~port.clear}; + assign TagRAM1.wdata = {port.tag1, port.wvalid, ~port.clear}; + assign TagRAM2.wdata = {port.tag1, port.wvalid, ~port.clear}; + assign TagRAM3.wdata = {port.tag1, port.wvalid, ~port.clear}; assign DataRAM0.wdata = state == LOOKUP ? wdata1[0] : wdata2[0]; assign DataRAM1.wdata = state == LOOKUP ? wdata1[1] : wdata2[1]; diff --git a/src/Cache/ICache.sv b/src/Cache/ICache.sv index 5b1e5a9..05deedf 100644 --- a/src/Cache/ICache.sv +++ b/src/Cache/ICache.sv @@ -176,23 +176,23 @@ module ICache ( assign DataRAM2.addr = baddr; assign DataRAM3.addr = baddr; // 写使能 - assign TagRAM0.wen = bwe & wen2[0]; - assign TagRAM1.wen = bwe & wen2[1]; - assign TagRAM2.wen = bwe & wen2[2]; - assign TagRAM3.wen = bwe & wen2[3]; - assign DataRAM0.wen = bwe & wen2[0]; - assign DataRAM1.wen = bwe & wen2[1]; - assign DataRAM2.wen = bwe & wen2[2]; - assign DataRAM3.wen = bwe & wen2[3]; + assign TagRAM0.wen = bwe & wen2[0] | port.clear & wen[0]; + assign TagRAM1.wen = bwe & wen2[1] | port.clear & wen[1]; + assign TagRAM2.wen = bwe & wen2[2] | port.clear & wen[2]; + assign TagRAM3.wen = bwe & wen2[3] | port.clear & wen[3]; + assign DataRAM0.wen = bwe & wen2[0] | port.clear & wen[0]; + assign DataRAM1.wen = bwe & wen2[1] | port.clear & wen[1]; + assign DataRAM2.wen = bwe & wen2[2] | port.clear & wen[2]; + assign DataRAM3.wen = bwe & wen2[3] | port.clear & wen[3]; // 写数据 - assign TagRAM0.wdata = {port.tag1, 1'b1}; - assign TagRAM1.wdata = {port.tag1, 1'b1}; - assign TagRAM2.wdata = {port.tag1, 1'b1}; - assign TagRAM3.wdata = {port.tag1, 1'b1}; - assign DataRAM0.wdata = port.clear ? `IC_TAG_LENGTH'b0 : port.rdata; - assign DataRAM1.wdata = port.clear ? `IC_TAG_LENGTH'b0 : port.rdata; - assign DataRAM2.wdata = port.clear ? `IC_TAG_LENGTH'b0 : port.rdata; - assign DataRAM3.wdata = port.clear ? `IC_TAG_LENGTH'b0 : port.rdata; + assign TagRAM0.wdata = {port.tag1, ~port.clear}; + assign TagRAM1.wdata = {port.tag1, ~port.clear}; + assign TagRAM2.wdata = {port.tag1, ~port.clear}; + assign TagRAM3.wdata = {port.tag1, ~port.clear}; + assign DataRAM0.wdata = port.rdata; + assign DataRAM1.wdata = port.rdata; + assign DataRAM2.wdata = port.rdata; + assign DataRAM3.wdata = port.rdata; ICTag_bram tag_ram0 ( .addra(TagRAM0.addr), diff --git a/src/Core/Datapath.sv b/src/Core/Datapath.sv index 7ce04d5..ad52678 100644 --- a/src/Core/Datapath.sv +++ b/src/Core/Datapath.sv @@ -1,6 +1,8 @@ `include "defines.svh" `include "sram.svh" `include "CP0.svh" +`include "ICache.svh" +`include "DCache.svh" module Datapath ( input clk, diff --git a/src/MMU/MMU.sv b/src/MMU/MMU.sv index ff367d8..f520f1a 100644 --- a/src/MMU/MMU.sv +++ b/src/MMU/MMU.sv @@ -97,6 +97,10 @@ module MMU ( word_t iD1, iD2, iD3, iD4, iD5, iD6, iD7; + logic diReq; + CacheOp_t cacheOp1, cacheOp2; + word_t dVA1; + // ================================ // ======== iState Machine ======== // ================================ @@ -183,7 +187,7 @@ module MMU ( /* * I-Cache Cache指令实现备注: * 在进入 I_CACHE 状态时需确保 iEn == 0 - * 跳出 I_CACHE 状态时 iEn = 1 + * 跳出 I_CACHE 状态时 iEn = 0 * 注意处理 Exceptions * TLB 转换请求在 iNextState == I_CACHE时发送 * I-Cache 查询请求在 iNextState == I_CACHE时发送 @@ -192,8 +196,9 @@ module MMU ( * drState 状态机同步 */ - if (~iTLBRefill & ~iTLBInvalid & iCached1 & (ic.hit | cacheOp1[1])) ic.clear = 1; - iEn = 1; + if (~iTLBRefill & ~iTLBInvalid & (iCached1 & ic.hit | cacheOp1[1])) ic.clear = 1; + iEn = 0; + iEn2 = 1; iNextState = I_IDLE; end endcase @@ -219,7 +224,7 @@ module MMU ( // ========== iFunction ========== // =============================== - assign iVA = iNextState == I_CACHE ? data.addr : inst.addr; + assign iVA = iNextState == I_CACHE ? dVA1 : inst.addr; assign iValid1 = iReq1 & iHit1 & iMValid1 & (in_kernel | iUser1); assign inst.addr_ok = iEn; @@ -234,12 +239,11 @@ module MMU ( ); // I-Cache req on inst query or cache instruction - assign ic.req = iEn | iNextState == I_CACHE; + assign ic.req = iEn & iState != I_CACHE | iNextState == I_CACHE; assign ic.valid = iValid1 & iCached1; assign ic.index = iVA[`IC_TAGL-1:`IC_INDEXL]; assign ic.tag1 = iEn2 ? iPA1[31:`IC_TAGL] : iPA2[31:`IC_TAGL]; assign ic.rvalid = inst_axi.rvalid & inst_axi.data_ok; - assign ic.clear = iState == I_CACHE & ~cacheOp1[2] & iCached1 & (ic.hit | cacheOp1[1]); mux4 #(256) ic_rdata_mux ( {inst_axi.rdata, iD7, iD6, iD5, iD4, iD3, iD2, iD1}, @@ -254,8 +258,8 @@ module MMU ( assign inst_axi.len = (iEn2 ? iCached1 : iCached2) ? 4'b0111 : 4'b0001; assign inst_axi.size = 3'b010; - assign iTLBRefill = (iState == I_IDLE & iReq1 | iState == I_CACHE & ~cacheOp[1]) & ~iHit1; - assign iTLBInvalid = (iState == I_IDLE & iReq1 | iState == I_CACHE & ~cacheOp[1]) & ~iMValid1; + assign iTLBRefill = (iState == I_IDLE & iReq1 | iState == I_CACHE & ~cacheOp1[1]) & ~iHit1; + assign iTLBInvalid = (iState == I_IDLE & iReq1 | iState == I_CACHE & ~cacheOp1[1]) & ~iMValid1; assign iAddressError = (iState == I_IDLE) & iReq1 & ~in_kernel & ~iUser1; // ====================== @@ -265,7 +269,7 @@ module MMU ( word_t dVA; logic dEn; - logic dReq1, dcReq1, diReq; + logic dReq1, dcReq1; logic dHit1; logic dCached1, dCached2; logic dDirty1; @@ -275,8 +279,6 @@ module MMU ( word_t dPA1, dPA2; logic [1:0] dSize1; - CacheOp_t cacheOp1, cacheOp2; - logic dEn2; logic dwr1; logic [3:0] dWstrb1; @@ -294,6 +296,7 @@ module MMU ( ffenr #(1) dvalid_ff (clk, rst, data.req, dEn, dReq1); ffen #(2) dsize_ff (clk, data.size, dEn, dSize1); + ffen #(32) dVA1_ff (clk, data.addr, dEn, dVA1); ffen #(32) dPA_ff (clk, dPA1, dEn2, dPA2); ffen #(1) dCached_ff (clk, dCached1, dEn2, dCached2); ffen #(1) dwr_ff (clk, data.wr, dEn2, dwr1); @@ -322,8 +325,8 @@ module MMU ( rdata_axi.req = 0; case (drState) DR_IDLE: begin - if (~dValid1) dEn = 1; - else if (~dcReq1) drNextState = DR_CACHE; + if (diReq) drNextState = DR_CACHE; + else if (~dValid1) dEn = 1; else begin dEn2 = 1; if (data.wr) data.data_ok = 1; @@ -407,9 +410,8 @@ module MMU ( */ assign dVA = data.addr; - assign diReq = dEn ? data.req & ~cacheOp[2] & |cacheOp[1:0] - : dReq1 & ~cacheOp1[2] & |cacheOp1[1:0]; - assign dcReq1 = dReq1 & (cacheOp1 == CNOP | cacheOp[2]); // exclude I-Cache clear + assign diReq = dReq1 & ~cacheOp1[2] & |cacheOp1[1:0]; + assign dcReq1 = dReq1 & (cacheOp1 == CNOP | cacheOp1[2]); // exclude I-Cache clear assign dValid1 = dReq1 & dHit1 & dMValid1 & (~data.wr | dDirty1) & (in_kernel | dUser1); assign dTLBRefill = drState == DR_IDLE & dcReq1 & (cacheOp1 == CNOP | ~cacheOp1[1]) & ~dHit1; @@ -457,6 +459,8 @@ module MMU ( // do not request when handling CACHE instruction on I-Cache assign dc.req = dEn & (cacheOp[2] | ~|cacheOp[1:0]); + // TODO: 在实现 CACHE 指令的 D-Cache Index 功能时应替换成下面注释的内容 + // assign dc.valid = dValid1 & (dCached1 & (~cacheOp1[2] | dc.hit) | cacheOp1[1]); assign dc.valid = dValid1 & dCached1 & (~cacheOp1[2] | cacheOp1[1] | dc.hit); assign dc.index = dVA[`DC_TAGL-1:`DC_INDEXL]; assign dc.tag1 = dEn2 ? dPA1[31:`DC_TAGL] : dPA2[31:`DC_TAGL]; diff --git a/src/include/ICache.svh b/src/include/ICache.svh index fd7ec03..63bf773 100644 --- a/src/include/ICache.svh +++ b/src/include/ICache.svh @@ -6,7 +6,7 @@ // IC for I-Cache `define IC_TAGL 11 `define IC_INDEXL 5 -`define IC_TAG_LENGTH (32-`IC_TAGL+1) // Tag + Valid +`define IC_TAG_LENGTH 22 // Tag + Valid `define IC_DATA_LENGTH 256 // 32Bytes typedef logic [`IC_DATA_LENGTH-1:0] ICData_t; From 1f2d7f6f3c19e52689b96dfb7874af7c2efbb20a Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Sat, 4 Sep 2021 21:07:00 +0800 Subject: [PATCH 37/56] 1. fix deadlock on continuous CACHE inst 2. enhance the testcases --- README.md | 11 +- resources/2021/soft/func/inst/inst_test.h | 13 ++ .../2021/soft/func/inst/n99_cache_icache.S | 199 +++++++++++++++++- src/MMU/MMU.sv | 10 +- tools/clo.txt | 34 +++ tools/ctrl_maker.py | 2 +- 6 files changed, 257 insertions(+), 12 deletions(-) create mode 100644 tools/clo.txt diff --git a/README.md b/README.md index 9d010de..da4a71d 100644 --- a/README.md +++ b/README.md @@ -30,16 +30,16 @@ Our awesome `MIPS` CPU written in `SystemVerilog` for Loongson Cup | Status | Instruction | Type | Tier | Comment | | :----------------: | :-------------------------------: | :------: | :--: | :-------------------------------------- | -| :hourglass: | `I-Cache Index Invalid` | `SYS` | 2 | | -| :hourglass: | `I-Cache Hit Invalid` | `SYS` | 2 | | -| :hourglass: | `D-Cache Index Writeback Invalid` | `SYS` | 2 | | +| :heavy_check_mark: | `I-Cache Index Invalid` | `SYS` | 2 | | +| :heavy_check_mark: | `I-Cache Hit Invalid` | `SYS` | 2 | | +| :hourglass: | `D-Cache Index Writeback Invalid` | `SYS` | 2 | :cry: | | :hourglass: | `D-Cache Index Store Tag` | `SYS` | 2 | | | :heavy_check_mark: | `D-Cache Hit Invalid` | `SYS` | 2 | | | :heavy_check_mark: | `D-Cache Hit Writeback Invalid` | `SYS` | 2 | | | :heavy_check_mark: | `PREF` | `SYS` | 1 | Treat as `NOP` | | :heavy_check_mark: | `SYNC` | `SYS` | 1 | Treat as `NOP` (We're strongly ordered) | | :clock3: | `WAIT` | `SYS` | 2 | | -| :clock3: | `TEQ` | `SYS` | 2 | | +| :clock3: | `TEQ` | `SYS` | 2 | Work as Branch | | :clock3: | `TEQI` | `SYS` | 2 | | | :clock3: | `TGE` | `SYS` | 2 | | | :clock3: | `TGEI` | `SYS` | 2 | | @@ -65,8 +65,6 @@ Our awesome `MIPS` CPU written in `SystemVerilog` for Loongson Cup | :x: | `SC` | `MEM` | 3 | 修改内核去除相关指令 | | :heavy_check_mark: | `SWL` | `MEM` | 1 | | | :heavy_check_mark: | `SWR` | `MEM` | 1 | | -| :clock3: | `MOVF` | `FP` | 3 | | -| :clock3: | `MOVT` | `FP` | 3 | | | :x: | `BEQL` | `BRANCH` | 3 | 修改编译指令 | | :x: | `BGEZALL` | `BRANCH` | 3 | 修改编译指令 | | :x: | `BGEZL` | `BRANCH` | 3 | 修改编译指令 | @@ -115,3 +113,4 @@ Hit Writeback Invalid : VA -> Lookup -> Hit? -> (Write Back) -> Write Zero | 1 | 1 | 1 | | | `I-Cache(0) or D-Cache(1)` | `Lookup(0) or Index(1)` | `WriteBack(0) or WriteOnly(1)` | | +`Todo`: 涉及`I-Cache`的`CACHE`指令需要清空流水线 diff --git a/resources/2021/soft/func/inst/inst_test.h b/resources/2021/soft/func/inst/inst_test.h index 6cf97df..7f704ba 100644 --- a/resources/2021/soft/func/inst/inst_test.h +++ b/resources/2021/soft/func/inst/inst_test.h @@ -1438,6 +1438,19 @@ bne v1, s6, inst_error; \ nop +/*CACHE instruction*/ + +// address and result stored in v0 +#define GET_ICACHE_INDEX \ + srl v0, v0, 5; \ + andi v0, v0, 0x3f; \ + nop + +#define GET_DCACHE_INDEX \ + srl v0, v0, 4; \ + andi v0, v0, 0x7f; \ + nop + /*98*/ /* * addr1 : uncached diff --git a/resources/2021/soft/func/inst/n99_cache_icache.S b/resources/2021/soft/func/inst/n99_cache_icache.S index f1e86a9..7830a72 100644 --- a/resources/2021/soft/func/inst/n99_cache_icache.S +++ b/resources/2021/soft/func/inst/n99_cache_icache.S @@ -79,7 +79,7 @@ LEAF(n99_cache_icache_test) nop # will be replaced with "addi a0, a0, 1" -> 20840001 bne a0, a1, inst_error nop - bne a1, zero, .n99_success # jump out 2nd + bne a1, zero, .n99_4_prepare # jump out 2nd nop addi a1, a1, 1 .n99_3_work: @@ -94,7 +94,7 @@ LEAF(n99_cache_icache_test) .n99_3_loop: beq t0, t1, .n99_3_check nop - cache 0, 0(t0) # I-Cache Index Invalid + cache 8, 0(t0) # I-Cache Index Store Tag addi t0, t0, 1 j .n99_3_loop nop @@ -106,9 +106,204 @@ LEAF(n99_cache_icache_test) j .n99_3 nop + +.n99_4_prepare: + addi a1, zero, 0 +.n99_4: + addi a0, zero, 0 +.n99_4_replace: + nop # will be replaced with "addi a0, a0, 1" -> 20840001 + bne a0, a1, inst_error + nop + bne a1, zero, .n99_5_prepare # jump out 2nd + nop + addi a1, a1, 1 +.n99_4_work: + la v0, .n99_4_replace + li v1, 0x20840001 + li t0, 0x20000000 + subu v0, v0, t0 # v0 <- 9fcxxxxx + sw v1, 0(v0) + cache 21, 0(v0) # D-Cache Hit WriteBack Invalid + GET_ICACHE_INDEX # convert v0 into its index + cache 0, 0(v0) # I-Cache Hit Invalid + # TODO: clear Datapath on CACHE + # using enough nop to stop prefetch + nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop + nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop + j .n99_4 + nop + + +.n99_5_prepare: + addi a1, zero, 0 +.n99_5: + addi a0, zero, 0 +.n99_5_replace: + nop # will be replaced with "addi a0, a0, 1" -> 20840001 + bne a0, a1, inst_error + nop + bne a1, zero, .n99_con_prepare # jump out 2nd + nop + addi a1, a1, 1 +.n99_5_work: + la v0, .n99_5_replace + li v1, 0x20840001 + li t0, 0x20000000 + subu v0, v0, t0 # v0 <- 9fcxxxxx + sw v1, 0(v0) + cache 21, 0(v0) # D-Cache Hit WriteBack Invalid + GET_ICACHE_INDEX # convert v0 into its index + cache 8, 0(v0) # I-Cache Index Store Tag + # TODO: clear Datapath on CACHE + # using enough nop to stop prefetch + nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop + nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop + j .n99_5 + nop + +.n99_con_prepare: + addi a1, zero, 0 +.n99_con: + addi a0, zero, 0 + # nop # very tricky -> align 16 <- no need +.n99_con_replace: + nop;nop;nop;nop; # addi a0, zero, 5; addi a1, zero, 6; mul a0, a0, a1; nop; + nop;nop;nop;nop; # addi a0, a0, 12; addi a1, a1, 1; div a0, a1; nop; + nop;nop;nop;nop; # mflo a0; addi a1, zero, 1; nop; nop; + nop;nop;nop;nop; # nop; addi a0, a0, -1; nop; nop; + nop;nop;nop;nop; # nop; nop; addi a0, a0, -1; nop; + nop;nop;nop;nop; # nop; nop; nop; addi a0, a0, -1; + nop;nop;nop;nop; # addi a0, a0, -1; nop; nop; nop; + nop;nop;nop;nop; # nop; addi a0, a0, -1; nop; nop; + + bne a0, a1, inst_error + nop + bne a1, zero, .n99_success # jump out 2nd + nop + addi a1, a1, 1 +.n99_con_work: + la v0, .n99_con_replace + li t0, 0x20000000 + subu v0, v0, t0 # v0 <- 9fcxxxxx + addi t0, zero, 0 + + # addi a0, zero, 5; addi a1, zero, 6; mul a0, a0, a1; nop; + li v1, 0x20040005 # addi a0, zero, 5 + sw v1, 0(v0) + li v1, 0x20050006 # addi a1, zero, 6 + sw v1, 4(v0) + li v1, 0x70852002 # mul a0, a0, a1 + sw v1, 8(v0) + cache 21, 0(v0) + + # addi a0, a0, 12; addi a1, a1, 1; div a0, a1; nop; + addi v0, v0, 16 + li v1, 0x2084000C # addi a0, a0, 12 + sw v1, 0(v0) + li v1, 0x20A50001 # addi a1, a1, 1 + sw v1, 4(v0) + li v1, 0x0085001a # div a0, a1 + sw v1, 8(v0) + cache 21, 0(v0) + + # mfhi a0; addi a1, zero, 1; nop; nop; + addi v0, v0, 16 + li v1, 0x00002012 # mflo a0 + sw v1, 0(v0) + li v1, 0x20050001 # addi a1, zero, 1 + sw v1, 4(v0) + cache 21, 0(v0) + + # nop; addi a0, a0, -1; nop; nop; + addi v0, v0, 16 + li v1, 0x2084FFFF # addi a0, a0, -1 + sw v1, 4(v0) + cache 21, 0(v0) + + # nop; nop; addi a0, a0, -1; nop; + addi v0, v0, 16 + sw v1, 8(v0) + cache 21, 0(v0) + + # nop; nop; nop; addi a0, a0, -1; + addi v0, v0, 16 + sw v1, 12(v0) + cache 21, 0(v0) + + # addi a0, a0, -1; nop; nop; nop; + addi v0, v0, 16 + sw v1, 0(v0) + cache 21, 0(v0) + + # nop; addi a0, a0, -1; nop; nop; + addi v0, v0, 16 + sw v1, 4(v0) + cache 21, 4(v0) + + addi v0, zero, 0 + addi v1, zero, 64 +.n99_con_loop: + beq v0, v1, .n99_con_loop_end + nop + cache 0, 0(v0) + cache 0, 1(v0) + cache 0, 2(v0) + cache 0, 3(v0) + cache 0, 4(v0) + cache 0, 5(v0) + cache 0, 6(v0) + cache 0, 7(v0) + addi v0, v0, 8 + j .n99_con_loop + nop + +.n99_con_loop_end: + # TODO: clear Datapath on CACHE + # using enough nop to stop prefetch + nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop + nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop + j .n99_con + nop + .n99_success: nop +/* Hand-make disasm of the NOPs +0cc 20040005 addi a0, zero, 5 +0d0 20050006 addi a1, zero, 6 +0d4 70852002 mul a0, a0, a1 +0d8 00000000 nop +0dc 2084000C addi a0, a0, 12 +0e0 20A50001 addi a1, a1, 1 +0e4 0085001A div a0, a1 +0e8 00000000 nop +0ec 00002012 mflo a0 +0f0 20050001 addi a1, zero, 1 +0f4 00000000 nop +0f8 00000000 nop +0fc 00000000 nop +100 2084FFFF addi a0, a0, -1 +104 00000000 nop +108 00000000 nop +10c 00000000 nop +110 00000000 nop +114 2084FFFF addi a0, a0, -1 +118 00000000 nop +11c 00000000 nop +120 00000000 nop +124 00000000 nop +128 2084FFFF addi a0, a0, -1 +12c 2084FFFF addi a0, a0, -1 +130 00000000 nop +134 00000000 nop +138 00000000 nop +13c 00000000 nop +140 2084FFFF addi a0, a0, -1 +144 00000000 nop +148 00000000 nop +*/ + ###detect exception bne s2, zero, inst_error nop diff --git a/src/MMU/MMU.sv b/src/MMU/MMU.sv index f520f1a..89c59f5 100644 --- a/src/MMU/MMU.sv +++ b/src/MMU/MMU.sv @@ -57,7 +57,7 @@ module MMU ( I_WA, I_WD1, I_WD2, I_WD3, I_WD4, I_WD5, I_WD6, I_WD7, I_WD8, I_REFILL, - I_CACHE + I_CACHE, I_CACHE_REFILL } istate_t; typedef enum bit [2:0] { @@ -199,6 +199,10 @@ module MMU ( if (~iTLBRefill & ~iTLBInvalid & (iCached1 & ic.hit | cacheOp1[1])) ic.clear = 1; iEn = 0; iEn2 = 1; + iNextState = I_CACHE_REFILL; + end + I_CACHE_REFILL: begin + iEn = 1; iNextState = I_IDLE; end endcase @@ -383,9 +387,9 @@ module MMU ( DR_CACHE: begin /* * 该状态是 I-CACHE 的清除指令 - * 当 iState == I_CACHE 代表下一个周期恢复正常工作 + * 当 iState == I_CACHE_REFILL 代表下一个周期恢复正常工作 */ - if (iState == I_CACHE) begin + if (iState == I_CACHE_REFILL) begin data.data_ok = 1; dEn = 1; drNextState = DR_IDLE; diff --git a/tools/clo.txt b/tools/clo.txt new file mode 100644 index 0000000..7c94bb8 --- /dev/null +++ b/tools/clo.txt @@ -0,0 +1,34 @@ +////-------------------------------- CLO CLO5 CLO4 CLO3 CLO2 CLO1 CLO0 +32'b0??????????????????????????????? 0 0 0 0 0 0 0 +32'b10?????????????????????????????? 1 0 0 0 0 0 1 +32'b110????????????????????????????? 2 0 0 0 0 1 0 +32'b1110???????????????????????????? 3 0 0 0 0 1 1 +32'b11110??????????????????????????? 4 0 0 0 1 0 0 +32'b111110?????????????????????????? 5 0 0 0 1 0 1 +32'b1111110????????????????????????? 6 0 0 0 1 1 0 +32'b11111110???????????????????????? 7 0 0 0 1 1 1 +32'b111111110??????????????????????? 8 0 0 1 0 0 0 +32'b1111111110?????????????????????? 9 0 0 1 0 0 1 +32'b11111111110????????????????????? 10 0 0 1 0 1 0 +32'b111111111110???????????????????? 11 0 0 1 0 1 1 +32'b1111111111110??????????????????? 12 0 0 1 1 0 0 +32'b11111111111110?????????????????? 13 0 0 1 1 0 1 +32'b111111111111110????????????????? 14 0 0 1 1 1 0 +32'b1111111111111110???????????????? 15 0 0 1 1 1 1 +32'b11111111111111110??????????????? 16 0 1 0 0 0 0 +32'b111111111111111110?????????????? 17 0 1 0 0 0 1 +32'b1111111111111111110????????????? 18 0 1 0 0 1 0 +32'b11111111111111111110???????????? 19 0 1 0 0 1 1 +32'b111111111111111111110??????????? 20 0 1 0 1 0 0 +32'b1111111111111111111110?????????? 21 0 1 0 1 0 1 +32'b11111111111111111111110????????? 22 0 1 0 1 1 0 +32'b111111111111111111111110???????? 23 0 1 0 1 1 1 +32'b1111111111111111111111110??????? 24 0 1 1 0 0 0 +32'b11111111111111111111111110?????? 25 0 1 1 0 0 1 +32'b111111111111111111111111110????? 26 0 1 1 0 1 0 +32'b1111111111111111111111111110???? 27 0 1 1 0 1 1 +32'b11111111111111111111111111110??? 28 0 1 1 1 0 0 +32'b111111111111111111111111111110?? 29 0 1 1 1 0 1 +32'b1111111111111111111111111111110? 30 0 1 1 1 1 0 +32'b11111111111111111111111111111110 31 0 1 1 1 1 1 +32'b11111111111111111111111111111111 32 1 0 0 0 0 0 \ No newline at end of file diff --git a/tools/ctrl_maker.py b/tools/ctrl_maker.py index 1c42741..2f1fc48 100644 --- a/tools/ctrl_maker.py +++ b/tools/ctrl_maker.py @@ -1,4 +1,4 @@ -with open('mctrl1.txt') as f: +with open('clo.txt') as f: lines = f.readlines() title = lines[0].split() items = [x.split() for x in lines[1:]] From f8d7b7b0c6a32a9d97015f7e4b55f8e2056f8aba Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Sun, 5 Sep 2021 13:06:35 +0800 Subject: [PATCH 38/56] 1. fix exceptions about CACHE inst on D-Cache 2. fix D-Cache control signals 3. fix I-Cache tag1 signal 4. fix I-Cache clear index logic 5. enhance D-Cache tests --- .../2021/soft/func/inst/n98_cache_dcache.S | 109 ++++++++++++++++++ src/Cache/ICache.sv | 20 ++-- src/MMU/MMU.sv | 28 ++--- src/include/ICache.svh | 5 +- 4 files changed, 136 insertions(+), 26 deletions(-) diff --git a/resources/2021/soft/func/inst/n98_cache_dcache.S b/resources/2021/soft/func/inst/n98_cache_dcache.S index d65d9fd..bf602fa 100644 --- a/resources/2021/soft/func/inst/n98_cache_dcache.S +++ b/resources/2021/soft/func/inst/n98_cache_dcache.S @@ -18,6 +18,115 @@ TEST_CACHE_DCACHE_HIT(0xa00d0018, 0x800d0018, 0, 0xABCDEFAB, 0xF0F0F0F0) TEST_CACHE_DCACHE_HIT(0xa00d0020, 0x800d0020, 4, 0x87654321, 0xAABBCCDD) TEST_CACHE_DCACHE_HIT(0xa00d0028, 0x800d0028, 4, 0xF0F0F0F0, 0xABCDEFAB) +.n98_con_prepare1: + li a0, 0x12345678 + li v0, 0x800d0000 + li v1, 64*4*4 + add v1, v0, v1 +.n98_con_prepare1_loop: + beq v0, v1, .n98_con_check1 + nop + sw a0, 0(v0) + sw a0, 4(v0) + sw a0, 8(v0) + sw a0, 12(v0) + cache 21, 0(v0) # Hit Writeback Invalid + cache 21, 4(v0) + cache 21, 8(v0) + cache 21, 12(v0) + addi v0, v0, 16 + j .n98_con_prepare1_loop + nop +.n98_con_check1: + li v0, 0xa00d0000 + li v1, 64*4*4 + add v1, v0, v1 +.n98_con_check1_loop: + beq v0, v1, .n98_con_check2 + nop + lw a1, 0(v0) + bne a0, a1, inst_error + nop + lw a1, 4(v0) + bne a0, a1, inst_error + nop + lw a1, 8(v0) + bne a0, a1, inst_error + nop + lw a1, 12(v0) + bne a0, a1, inst_error + nop + addi v0, v0, 16 + j .n98_con_check1_loop + nop +.n98_con_check2: + li v0, 0x800d0000 + li v1, 64*4*4 + add v1, v0, v1 +.n98_con_check2_loop: + beq v0, v1, .n98_con_prepare3 + nop + lw a1, 0(v0) + bne a0, a1, inst_error + nop + lw a1, 4(v0) + bne a0, a1, inst_error + nop + lw a1, 8(v0) + bne a0, a1, inst_error + nop + lw a1, 12(v0) + bne a0, a1, inst_error + nop + addi v0, v0, 16 + j .n98_con_check2_loop + nop + +.n98_con_prepare3: + li a0, 0xA5A5A5A5 + li v0, 0x800d0000 + li v1, 64*4*4 + add v1, v0, v1 +.n98_con_prepare3_loop: + beq v0, v1, .n98_con_check3 + sw a0, 0(v0) + sw a0, 4(v0) + sw a0, 8(v0) + sw a0, 12(v0) + cache 17, 0(v0) # Hit Invalid + cache 17, 4(v0) + cache 17, 8(v0) + cache 17, 12(v0) + addi v0, v0, 16 + j .n98_con_prepare3_loop +.n98_con_check3: + li a0, 0x12345678 + li v0, 0x800d0000 + li v1, 64*4*4 + add v1, v0, v1 +.n98_con_check4_loop: + beq v0, v1, .n98_con_end + lw a1, 0(v0) + bne a0, a1, inst_error + nop + lw a1, 4(v0) + bne a0, a1, inst_error + nop + lw a1, 8(v0) + bne a0, a1, inst_error + nop + lw a1, 12(v0) + bne a0, a1, inst_error + nop + addi v0, v0, 16 + j .n98_con_check4_loop + nop +.n98_con_end: + nop + + + + ###detect exception bne s2, zero, inst_error nop diff --git a/src/Cache/ICache.sv b/src/Cache/ICache.sv index 05deedf..de40d0b 100644 --- a/src/Cache/ICache.sv +++ b/src/Cache/ICache.sv @@ -133,7 +133,7 @@ module ICache ( nowLRU[1] == 0 ? 4'b0010 : nowLRU[2] == 0 ? 4'b0100 : 4'b1000; - assign wen = hit ? hitWay : victim; + assign wen = (hit | port.clear) ? hitWay : victim; // Update LRU assign nextLRU = { @@ -164,7 +164,7 @@ module ICache ( port.req, baddr ); - assign bwe = (state == REPLACE) & port.rvalid | port.clear; + assign bwe = state == REPLACE & port.rvalid; // 地址 assign TagRAM0.addr = baddr; @@ -176,14 +176,14 @@ module ICache ( assign DataRAM2.addr = baddr; assign DataRAM3.addr = baddr; // 写使能 - assign TagRAM0.wen = bwe & wen2[0] | port.clear & wen[0]; - assign TagRAM1.wen = bwe & wen2[1] | port.clear & wen[1]; - assign TagRAM2.wen = bwe & wen2[2] | port.clear & wen[2]; - assign TagRAM3.wen = bwe & wen2[3] | port.clear & wen[3]; - assign DataRAM0.wen = bwe & wen2[0] | port.clear & wen[0]; - assign DataRAM1.wen = bwe & wen2[1] | port.clear & wen[1]; - assign DataRAM2.wen = bwe & wen2[2] | port.clear & wen[2]; - assign DataRAM3.wen = bwe & wen2[3] | port.clear & wen[3]; + assign TagRAM0.wen = bwe & wen2[0] | port.clear & (wen[0] | port.clearIdx); + assign TagRAM1.wen = bwe & wen2[1] | port.clear & (wen[1] | port.clearIdx); + assign TagRAM2.wen = bwe & wen2[2] | port.clear & (wen[2] | port.clearIdx); + assign TagRAM3.wen = bwe & wen2[3] | port.clear & (wen[3] | port.clearIdx); + assign DataRAM0.wen = bwe & wen2[0] | port.clear & (wen[0] | port.clearIdx); + assign DataRAM1.wen = bwe & wen2[1] | port.clear & (wen[1] | port.clearIdx); + assign DataRAM2.wen = bwe & wen2[2] | port.clear & (wen[2] | port.clearIdx); + assign DataRAM3.wen = bwe & wen2[3] | port.clear & (wen[3] | port.clearIdx); // 写数据 assign TagRAM0.wdata = {port.tag1, ~port.clear}; assign TagRAM1.wdata = {port.tag1, ~port.clear}; diff --git a/src/MMU/MMU.sv b/src/MMU/MMU.sv index 89c59f5..a6ec59f 100644 --- a/src/MMU/MMU.sv +++ b/src/MMU/MMU.sv @@ -99,7 +99,7 @@ module MMU ( logic diReq; CacheOp_t cacheOp1, cacheOp2; - word_t dVA1; + word_t dVA1, diPA; // ================================ // ======== iState Machine ======== @@ -120,6 +120,7 @@ module MMU ( inst.data_ok = 0; inst_axi.req = 0; ic.clear = 0; + ic.clearIdx = 0; case (iState) I_IDLE: begin if (diReq & ~iValid1) begin @@ -197,9 +198,10 @@ module MMU ( */ if (~iTLBRefill & ~iTLBInvalid & (iCached1 & ic.hit | cacheOp1[1])) ic.clear = 1; - iEn = 0; - iEn2 = 1; - iNextState = I_CACHE_REFILL; + ic.clearIdx = cacheOp1[1]; + iEn = 0; + iEn2 = 1; + iNextState = I_CACHE_REFILL; end I_CACHE_REFILL: begin iEn = 1; @@ -228,7 +230,7 @@ module MMU ( // ========== iFunction ========== // =============================== - assign iVA = iNextState == I_CACHE ? dVA1 : inst.addr; + assign iVA = (iNextState == I_CACHE | iState == I_CACHE) ? dVA1 : inst.addr; assign iValid1 = iReq1 & iHit1 & iMValid1 & (in_kernel | iUser1); assign inst.addr_ok = iEn; @@ -322,10 +324,10 @@ module MMU ( end always_comb begin - dEn = 0; - dEn2 = 0; - drNextState = drState; - data.data_ok = 0; + dEn = 0; + dEn2 = 0; + drNextState = drState; + data.data_ok = 0; rdata_axi.req = 0; case (drState) DR_IDLE: begin @@ -420,8 +422,8 @@ module MMU ( assign dTLBRefill = drState == DR_IDLE & dcReq1 & (cacheOp1 == CNOP | ~cacheOp1[1]) & ~dHit1; assign dTLBInvalid = drState == DR_IDLE & dcReq1 & (cacheOp1 == CNOP | ~cacheOp1[1]) & ~dMValid1; - assign dTLBModified = drState == DR_IDLE & dcReq1 & data.wr & ~dDirty1; - assign dAddressError = drState == DR_IDLE & dcReq1 & ~in_kernel & ~dUser1; + assign dTLBModified = drState == DR_IDLE & dReq1 & cacheOp1 == CNOP & data.wr & ~dDirty1; + assign dAddressError = drState == DR_IDLE & dReq1 & cacheOp1 == CNOP & ~in_kernel & ~dUser1; // ============================= // ======== drFlip-Flop ======== @@ -463,9 +465,7 @@ module MMU ( // do not request when handling CACHE instruction on I-Cache assign dc.req = dEn & (cacheOp[2] | ~|cacheOp[1:0]); - // TODO: 在实现 CACHE 指令的 D-Cache Index 功能时应替换成下面注释的内容 - // assign dc.valid = dValid1 & (dCached1 & (~cacheOp1[2] | dc.hit) | cacheOp1[1]); - assign dc.valid = dValid1 & dCached1 & (~cacheOp1[2] | cacheOp1[1] | dc.hit); + assign dc.valid = dValid1 & (dCached1 & (~cacheOp1[2] | dc.hit) | cacheOp1[1]); assign dc.index = dVA[`DC_TAGL-1:`DC_INDEXL]; assign dc.tag1 = dEn2 ? dPA1[31:`DC_TAGL] : dPA2[31:`DC_TAGL]; assign dc.sel1 = dEn2 ? dPA1[3:2] : dPA2[3:2]; diff --git a/src/include/ICache.svh b/src/include/ICache.svh index 63bf773..2f00c5c 100644 --- a/src/include/ICache.svh +++ b/src/include/ICache.svh @@ -42,20 +42,21 @@ interface ICache_i; logic rvalid; ICData_t rdata; logic clear; + logic clearIdx; modport cache( input req, valid, input index, tag1, output hit, row, input rvalid, rdata, - input clear + input clear, clearIdx ); modport mmu( output req, valid, output index, tag1, input hit, row, output rvalid, rdata, - output clear + output clear, clearIdx ); endinterface //ICache_i From 9df689ed7a81dbeefd96b0b43ec2137dc18d5125 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Sun, 5 Sep 2021 23:59:23 +0800 Subject: [PATCH 39/56] refactor CACHE inst on D-CACHE --- resources/2021/soft/func/inst/inst_test.h | 8 +- .../2021/soft/func/inst/n98_cache_dcache.S | 76 +++++++++++ src/Cache/DCache.sv | 45 +++---- src/MMU/MMU.sv | 121 ++++++++++++++---- src/include/DCache.svh | 6 +- 5 files changed, 199 insertions(+), 57 deletions(-) diff --git a/resources/2021/soft/func/inst/inst_test.h b/resources/2021/soft/func/inst/inst_test.h index 7f704ba..f15cef0 100644 --- a/resources/2021/soft/func/inst/inst_test.h +++ b/resources/2021/soft/func/inst/inst_test.h @@ -1462,8 +1462,10 @@ LI(t2, data1); \ LI(t3, data2); \ /* prepare -> hit writeback invalidate */ \ - sw t2, offset(t0); \ + sw t2, offset(t1); \ cache 21, offset(t1); \ + lw a0, offset(t0); \ + bne t2, a0, inst_error; \ lw a0, offset(t1); \ bne t2, a0, inst_error; \ nop; \ @@ -1472,12 +1474,16 @@ cache 17, offset(t1); \ lw a0, offset(t0); \ bne a0, t2, inst_error; \ + lw a0, offset(t1); \ + bne a0, t2, inst_error; \ nop; \ /* test hit writeback invalidate */ \ sw t3, offset(t1); \ cache 21, offset(t1); \ lw a0, offset(t0); \ bne a0, t3, inst_error; \ + lw a0, offset(t1); \ + bne a0, t3, inst_error; \ nop; \ /* test multiple*/ \ addi a1, t1, 4; \ diff --git a/resources/2021/soft/func/inst/n98_cache_dcache.S b/resources/2021/soft/func/inst/n98_cache_dcache.S index bf602fa..f77071a 100644 --- a/resources/2021/soft/func/inst/n98_cache_dcache.S +++ b/resources/2021/soft/func/inst/n98_cache_dcache.S @@ -8,6 +8,9 @@ LEAF(n98_cache_dcache_test) li s2, 0x0 ###test inst +## CACHE 17 D-Cache Hit Invalid +## CACHE 21 D-Cache Hit Writeback Invalid + TEST_CACHE_DCACHE_HIT(0xa00d0000, 0x800d0000, 0, 0xA5A5A5A5, 0x12345678) TEST_CACHE_DCACHE_HIT(0xa00d0004, 0x800d0004, 0, 0xABCDEFAB, 0xF0F0F0F0) TEST_CACHE_DCACHE_HIT(0xa00d0008, 0x800d0008, 4, 0x87654321, 0xAABBCCDD) @@ -125,7 +128,80 @@ TEST_CACHE_DCACHE_HIT(0xa00d0028, 0x800d0028, 4, 0xF0F0F0F0, 0xABCDEFAB) nop +/* TEST D-CACHE Index OP */ +## CACHE 1 D-Cache Index Writeback Invalid +## CACHE 9 D-Cache Index Store Tag +.n98_c1_prepare: + li a0, 0x12345678 + li v0, 0x800d0000 + li v1, 0x800d0200 +.n98_c1_loop: + beq v0, v1, .n98_c1_check + sw a0, 0(v0) + sw a0, 4(v0) + sw a0, 8(v0) + sw a0, 12(v0) + addi a1, v0, 0 + GET_DCACHE_INDEX + cache 0, 0(v0) + addi v0, a1, 16 + j .n98_c1_loop +.n98_c1_check: + li v0, 0xa00d0000 + li v1, 0xa00d0200 +.n98_c1_check_loop: + beq v0, v1, .n98_c1_check2 + lw a1, 0(v0) + bne a0, a1, inst_error + addi v0, v0, 4 + j .n98_c1_check_loop +.n98_c1_check2: + li v0, 0x800d0000 + li v1, 0x800d0200 +.n98_c1_check2_loop: + beq v0, v1, .n98_c9_prepare + lw a1, 0(v0) + bne a0, a1, inst_error + addi v0, v0, 4 + j .n98_c1_check2_loop + + +.n98_c9_prepare: + li v0, 0x800d0000 + li v1, 0x800d0200 +.n98_c9_loop: + beq v0, v1, .n98_c9_check + sw zero, 0(v0) + sw zero, 4(v0) + sw zero, 8(v0) + sw zero, 12(v0) + addi a1, v0, 0 + GET_DCACHE_INDEX + cache 9, 0(v0) + addi v0, a1, 16 + j .n98_c9_loop +.n98_c9_check: + li v0, 0xa00d0000 + li v1, 0xa00d0200 +.n98_c9_check_loop: + beq v0, v1, .n98_c9_check2 + lw a1, 0(v0) + bne a0, a1, inst_error + addi v0, v0, 4 + j .n98_c9_check_loop +.n98_c9_check2: + li v0, 0x800d0000 + li v1, 0x800d0200 +.n98_c9_check2_loop: + beq v0, v1, .n98_done + lw a1, 0(v0) + bne a0, a1, inst_error + addi v0, v0, 4 + j .n98_c9_check2_loop + +.n98_done: + nop ###detect exception bne s2, zero, inst_error diff --git a/src/Cache/DCache.sv b/src/Cache/DCache.sv index 96c4082..6a43848 100644 --- a/src/Cache/DCache.sv +++ b/src/Cache/DCache.sv @@ -24,22 +24,22 @@ module DCache ( // ============================== // Four way assoc bram controller: - DCTagRAM_t TagRAM0, TagRAM1, TagRAM2, TagRAM3; + DCTagRAM_t TagRAM0, TagRAM1, TagRAM2, TagRAM3; DCDataRAM_t DataRAM0, DataRAM1, DataRAM2, DataRAM3; logic [3:0] LRU[128]; logic [3:0] nextLRU; logic [3:0] nowLRU; - DCTag_t tagOut[4]; - DCData_t dataOut[4]; + DCTag_t tagOut[4]; + DCData_t dataOut[4]; logic [3:0] tagV; DCIndexL_t index1; - logic hit; + logic hit; logic [3:0] hitWay; - DCData_t cacheLine; + DCData_t cacheLine; logic [3:0] victim; logic [3:0] wen; @@ -56,18 +56,8 @@ module DCache ( // ======== Flip-Flop ======== // =========================== - ffen #(`DC_TAGL-`DC_INDEXL) index_ff ( - clk, - port.index, - port.req, - index1 - ); - ffen #(4) wen_ff ( - clk, - wen, - en2, - wen2 - ); + ffen #(`DC_TAGL-`DC_INDEXL) index_ff (clk, port.index, port.req, index1); + ffen #(4) wen_ff (clk, wen, en2, wen2); // =============================== // ======== State Machine ======== @@ -97,7 +87,7 @@ module DCache ( nextState = IDLE; end end else begin - if (hit) begin + if (hit & ~port.clearWb | port.clear & port.clearIdx) begin if (port.wvalid) begin bwe1 = 1'b1; nextState = IDLE; @@ -161,20 +151,21 @@ module DCache ( // ============================== // Choose Victim - assign victim = port.clear ? hitWay - : tagV[0] == 0 ? 4'b0001 - : tagV[1] == 0 ? 4'b0010 - : tagV[2] == 0 ? 4'b0100 - : tagV[3] == 0 ? 4'b1000 + assign victim = port.clearWb ? hitWay + : tagV[0] == 0 ? 4'b0001 + : tagV[1] == 0 ? 4'b0010 + : tagV[2] == 0 ? 4'b0100 + : tagV[3] == 0 ? 4'b1000 : nowLRU[0] == 0 & ~tagOut[0].dirty ? 4'b0001 : nowLRU[1] == 0 & ~tagOut[1].dirty ? 4'b0010 : nowLRU[2] == 0 & ~tagOut[2].dirty ? 4'b0100 : nowLRU[3] == 0 & ~tagOut[3].dirty ? 4'b1000 - : nowLRU[0] == 0 ? 4'b0001 - : nowLRU[1] == 0 ? 4'b0010 - : nowLRU[2] == 0 ? 4'b0100 + : nowLRU[0] == 0 ? 4'b0001 + : nowLRU[1] == 0 ? 4'b0010 + : nowLRU[2] == 0 ? 4'b0100 : 4'b1000; - assign wen = hit ? hitWay : victim; + assign wen = port.clear & port.clearIdx ? 4'b1111 + : hit ? hitWay : victim; assign port.dirt_valid = (state == LOOKUP) & |{tagV & {tagOut[3].dirty, tagOut[2].dirty, tagOut[1].dirty, tagOut[0].dirty} & victim}; diff --git a/src/MMU/MMU.sv b/src/MMU/MMU.sv index a6ec59f..3992d3c 100644 --- a/src/MMU/MMU.sv +++ b/src/MMU/MMU.sv @@ -60,12 +60,12 @@ module MMU ( I_CACHE, I_CACHE_REFILL } istate_t; - typedef enum bit [2:0] { + typedef enum bit [3:0] { DR_IDLE, DR_WA, DR_WD1, DR_WD2, DR_WD3, DR_WD4, DR_REFILL, - DR_CACHE + DR_ICACHE, DR_CACHE, DR_CACHE_REFILL, DR_CACHE_CLEAR, DR_CACHE_REQ } drstate_t; typedef enum bit [2:0] { @@ -296,6 +296,9 @@ module MMU ( word_t ddAddr1; logic [127:0] ddData1; + // D-Cache Clear + logic dClrValid, dClrRv, dClrReq; + // ============================ // ======== dFlip-Flop ======== // ============================ @@ -329,14 +332,34 @@ module MMU ( drNextState = drState; data.data_ok = 0; rdata_axi.req = 0; + dc.clear = 0; + dc.clearIdx = 0; + dc.clearWb = 0; + dClrValid = 0; + dClrRv = 0; + dClrReq = 0; case (drState) DR_IDLE: begin - if (diReq) drNextState = DR_CACHE; - else if (~dValid1) dEn = 1; + if (diReq) drNextState = DR_ICACHE; + else if (dReq1 & cacheOp1[2] & dCached1) begin + if (cacheOp2[0]) begin + // Do not write back + // dc.valid = dc.wvalid = 1; + dClrValid = 1; + dc.clear = 1; + dc.clearIdx = cacheOp2[1]; + drNextState = DR_CACHE_REFILL; + end else begin + // WriteBack + dc.clearWb = 1; + drNextState = DR_CACHE; + dEn2 = 1; + end + end else if (~dValid1) dEn = 1; else begin dEn2 = 1; if (data.wr) data.data_ok = 1; - if (data.wr & (~dCached1 | dc.hit | cacheOp1[2])) drNextState = DR_REFILL; + if (data.wr & (~dCached1 | dc.hit)) drNextState = DR_REFILL; else if (dCached1 & dc.hit) begin dEn = 1; data.data_ok = 1; @@ -386,7 +409,7 @@ module MMU ( drNextState = DR_IDLE; end end - DR_CACHE: begin + DR_ICACHE: begin /* * 该状态是 I-CACHE 的清除指令 * 当 iState == I_CACHE_REFILL 代表下一个周期恢复正常工作 @@ -397,6 +420,38 @@ module MMU ( drNextState = DR_IDLE; end end + DR_CACHE: begin + // WriteBack + // Clear By Index or Address + // D-Cache: state == REPLACE + if (wdata_ok) begin + if (cacheOp2[1]) begin + drNextState = DR_CACHE_CLEAR; + end else begin + dClrRv = 1; + dc.clear = 1; + drNextState = DR_CACHE_REFILL; + end + // drNextState = DR_CACHE_CLEAR; + end + end + DR_CACHE_REFILL: begin + // avoid deadlock + dEn = 1; + drNextState = DR_IDLE; + data.data_ok = 1; + end + DR_CACHE_CLEAR: begin + // deal with timing loop + dClrRv = 1; + dc.clear = 1; + drNextState = DR_CACHE_REQ; + end + DR_CACHE_REQ: begin + // deal with timing loop + dClrReq = 1; // use dClrReq to start a new D-Cache req + drNextState = DR_IDLE; + end endcase end @@ -409,16 +464,30 @@ module MMU ( * Cache 指令当成写指令处理 * TLB 转换请求和 D-Cache 请求与普通访存一致 * dc.req 在 I-Cache Cache 指令发生时为0 - * 清除请求时 drState 进入 DR_REFILL 状态,后由 DW_STATE 确定返回 * dwState 和 dwaState 需判断是否是 CACHE 指令且是否允许写回 * 屏蔽 dAddressError 和 TLBModified 且只有在 Address 类型请求下允许 TLBRefill 和 TLBInvalid - * dc.clear 在查询完成后一阶段或者写回完成阶段发送 + * Index WriteBack 转换成 Hit WriteBack(s) + Index Invalid */ + /* 状态 + D-Cache: + IDLE <- dc.req + dc.index + LOOKUP <- dc.tag1: Lookup模式下需要传入正确的tag1 + dc.valid: 1 + dc.wvalid: 1 + dc.clear: Hit Invalid and Index Invalid + dc.clearIdx: Hit Invalid or Index Invalid + dc.clearWb: 是否需要写回 + -> dc.dirt_valid + dc.dirt_addr + dc.dirt_data + REPLACE <- dc.rvalid + dc.clear: same cycle as dc.rvalid + */ - assign dVA = data.addr; - assign diReq = dReq1 & ~cacheOp1[2] & |cacheOp1[1:0]; - assign dcReq1 = dReq1 & (cacheOp1 == CNOP | cacheOp1[2]); // exclude I-Cache clear - assign dValid1 = dReq1 & dHit1 & dMValid1 & (~data.wr | dDirty1) & (in_kernel | dUser1); + assign dVA = data.addr; + assign diReq = dReq1 & ~cacheOp1[2] & |cacheOp1[1:0]; + assign dcReq1 = dReq1 & (cacheOp1 == CNOP | cacheOp1[2]); // exclude I-Cache clear + assign dValid1 = dReq1 & dHit1 & dMValid1 & (~data.wr | dDirty1) & (in_kernel | dUser1); assign dTLBRefill = drState == DR_IDLE & dcReq1 & (cacheOp1 == CNOP | ~cacheOp1[1]) & ~dHit1; assign dTLBInvalid = drState == DR_IDLE & dcReq1 & (cacheOp1 == CNOP | ~cacheOp1[1]) & ~dMValid1; @@ -464,12 +533,12 @@ module MMU ( ); // do not request when handling CACHE instruction on I-Cache - assign dc.req = dEn & (cacheOp[2] | ~|cacheOp[1:0]); - assign dc.valid = dValid1 & (dCached1 & (~cacheOp1[2] | dc.hit) | cacheOp1[1]); - assign dc.index = dVA[`DC_TAGL-1:`DC_INDEXL]; - assign dc.tag1 = dEn2 ? dPA1[31:`DC_TAGL] : dPA2[31:`DC_TAGL]; - assign dc.sel1 = dEn2 ? dPA1[3:2] : dPA2[3:2]; - assign dc.rvalid = rdata_axi.rvalid & rdata_axi.data_ok; + assign dc.req = dClrReq | dEn & (cacheOp[2] | ~|cacheOp[1:0]); + assign dc.valid = dClrValid | dValid1 & dCached1; + assign dc.index = dEn ? dVA[`DC_TAGL-1:`DC_INDEXL] : dVA1[`DC_TAGL-1:`DC_INDEXL]; + assign dc.tag1 = dEn2 ? dPA1[31:`DC_TAGL] : dPA2[31:`DC_TAGL]; + assign dc.sel1 = dEn2 ? dPA1[3:2] : dPA2[3:2]; + assign dc.rvalid = dClrRv | rdata_axi.rvalid & rdata_axi.data_ok; mux4 #(128) dc_rdata_mux ( {rdata_axi.rdata, drD3, drD2, drD1}, {drD3, drD2, drD1, rdata_axi.rdata}, @@ -508,7 +577,7 @@ module MMU ( if (dEn2 & (~dCached1 & data.wr | dCached1 & dc.dirt_valid & (~cacheOp1[2] | ~cacheOp1[0]) // WriteOnly 不允许写回 - & (~dc.hit | cacheOp1[2] & ~cacheOp1[0]) // Writeback Invalid 直接写回 + & (~dc.hit | cacheOp1[2] & ~cacheOp1[0]) // Writeback 或一般情况 )) begin if (dCached1) begin wdata_axi.wdata = dc.dirt_data[31:0]; @@ -583,7 +652,7 @@ module MMU ( if (~wdata_axi.data_ok) dwNextState = DW_WB; else begin // fixme: AXI3 wait WA - if (drState == DR_REFILL) dwNextState = DW_IDLE; + if (drState == DR_REFILL | drState == DR_CACHE_REFILL) dwNextState = DW_IDLE; else dwNextState = DW_WAITR; end end @@ -592,12 +661,12 @@ module MMU ( // TODO: goto IDLE on failure if (wdata_axi.data_ok) begin // fixme: AXI3 wait WA - if (drState == DR_REFILL) dwNextState = DW_IDLE; + if (drState == DR_REFILL | drState == DR_CACHE_REFILL) dwNextState = DW_IDLE; else dwNextState = DW_WAITR; end end DW_WAITR: begin - if (drState == DR_REFILL) dwNextState = DW_IDLE; + if (drState == DR_REFILL | drState == DR_CACHE_REFILL) dwNextState = DW_IDLE; end endcase end @@ -621,8 +690,8 @@ module MMU ( if (dEn2 & (~dCached1 & data.wr | dCached1 & dc.dirt_valid & (~cacheOp1[2] | ~cacheOp1[0]) // WriteOnly 不允许写回 - & (~dc.hit | cacheOp1[2] & ~cacheOp1[0])) // Writeback Invalid 直接写回 - ) begin + & (~dc.hit | cacheOp1[2] & ~cacheOp1[0]) // Writeback 或一般情况 + )) begin wdata_axi.req = 1'b1; if (~wdata_axi.addr_ok) dwaNextState = DWA_WA; end @@ -658,11 +727,9 @@ module MMU ( assign wdata_axi.addr = (dEn2 ? dCached1 : dCached2) ? (dwaState == DWA_IDLE) ? dc.dirt_addr : ddAddr1 : dEn2 ? dPA1 : dPA2; assign wdata_axi.len = (dEn2 ? dCached1 : dCached2) ? 4'b0011 : 4'b0000; assign wdata_axi.size = (dEn2 ? dCached1 : dCached2) ? 3'b010 : {1'b0, dSize1}; - assign dc.wvalid = dEn2 ? data.wr : dwr1; + assign dc.wvalid = dClrValid | dEn2 ? data.wr : dwr1; assign dc.wdata = dEn2 ? data.wdata : dWdata1; assign dc.wstrb = dEn2 ? data.wstrb : dWstrb1; - assign dc.clear = dEn2 ? cacheOp1[2] & dCached1 & (dc.hit | cacheOp1[1]) - : cacheOp2[2] & dCached2; // ============================== // ========== VA -> PA ========== diff --git a/src/include/DCache.svh b/src/include/DCache.svh index 423709b..c5235a1 100644 --- a/src/include/DCache.svh +++ b/src/include/DCache.svh @@ -50,20 +50,22 @@ interface DCache_i; DCData_t dirt_data; DCData_t row; logic clear; + logic clearIdx; + logic clearWb; modport cache( input req, valid, input index, tag1, sel1, input rvalid, rdata, wvalid, wdata, wstrb, output hit, dirt_valid, dirt_addr, dirt_data, row, - input clear + input clear, clearIdx, clearWb ); modport mmu( output req, valid, output index, tag1, sel1, output rvalid, rdata, wvalid, wdata, wstrb, input hit, dirt_valid, dirt_addr, dirt_data, row, - output clear + output clear, clearIdx, clearWb ); endinterface //DCache_i From 0cd3d9007e803d8d33f43a53001224f424adbbaa Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Mon, 6 Sep 2021 09:27:22 +0800 Subject: [PATCH 40/56] 1. fix D-Cache clear by index 2. fix testcases --- resources/2021/soft/func/inst/inst_test.h | 3 +++ resources/2021/soft/func/inst/n98_cache_dcache.S | 13 +++++++++++++ src/MMU/MMU.sv | 2 +- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/resources/2021/soft/func/inst/inst_test.h b/resources/2021/soft/func/inst/inst_test.h index f15cef0..5ccad84 100644 --- a/resources/2021/soft/func/inst/inst_test.h +++ b/resources/2021/soft/func/inst/inst_test.h @@ -1466,6 +1466,7 @@ cache 21, offset(t1); \ lw a0, offset(t0); \ bne t2, a0, inst_error; \ + nop; \ lw a0, offset(t1); \ bne t2, a0, inst_error; \ nop; \ @@ -1474,6 +1475,7 @@ cache 17, offset(t1); \ lw a0, offset(t0); \ bne a0, t2, inst_error; \ + nop; \ lw a0, offset(t1); \ bne a0, t2, inst_error; \ nop; \ @@ -1482,6 +1484,7 @@ cache 21, offset(t1); \ lw a0, offset(t0); \ bne a0, t3, inst_error; \ + nop; \ lw a0, offset(t1); \ bne a0, t3, inst_error; \ nop; \ diff --git a/resources/2021/soft/func/inst/n98_cache_dcache.S b/resources/2021/soft/func/inst/n98_cache_dcache.S index f77071a..6c72f90 100644 --- a/resources/2021/soft/func/inst/n98_cache_dcache.S +++ b/resources/2021/soft/func/inst/n98_cache_dcache.S @@ -102,6 +102,7 @@ TEST_CACHE_DCACHE_HIT(0xa00d0028, 0x800d0028, 4, 0xF0F0F0F0, 0xABCDEFAB) cache 17, 12(v0) addi v0, v0, 16 j .n98_con_prepare3_loop + nop .n98_con_check3: li a0, 0x12345678 li v0, 0x800d0000 @@ -147,24 +148,31 @@ TEST_CACHE_DCACHE_HIT(0xa00d0028, 0x800d0028, 4, 0xF0F0F0F0, 0xABCDEFAB) cache 0, 0(v0) addi v0, a1, 16 j .n98_c1_loop + nop .n98_c1_check: li v0, 0xa00d0000 li v1, 0xa00d0200 .n98_c1_check_loop: beq v0, v1, .n98_c1_check2 + nop lw a1, 0(v0) bne a0, a1, inst_error + nop addi v0, v0, 4 j .n98_c1_check_loop + nop .n98_c1_check2: li v0, 0x800d0000 li v1, 0x800d0200 .n98_c1_check2_loop: beq v0, v1, .n98_c9_prepare + nop lw a1, 0(v0) bne a0, a1, inst_error + nop addi v0, v0, 4 j .n98_c1_check2_loop + nop .n98_c9_prepare: @@ -181,6 +189,7 @@ TEST_CACHE_DCACHE_HIT(0xa00d0028, 0x800d0028, 4, 0xF0F0F0F0, 0xABCDEFAB) cache 9, 0(v0) addi v0, a1, 16 j .n98_c9_loop + nop .n98_c9_check: li v0, 0xa00d0000 li v1, 0xa00d0200 @@ -188,8 +197,10 @@ TEST_CACHE_DCACHE_HIT(0xa00d0028, 0x800d0028, 4, 0xF0F0F0F0, 0xABCDEFAB) beq v0, v1, .n98_c9_check2 lw a1, 0(v0) bne a0, a1, inst_error + nop addi v0, v0, 4 j .n98_c9_check_loop + nop .n98_c9_check2: li v0, 0x800d0000 li v1, 0x800d0200 @@ -197,8 +208,10 @@ TEST_CACHE_DCACHE_HIT(0xa00d0028, 0x800d0028, 4, 0xF0F0F0F0, 0xABCDEFAB) beq v0, v1, .n98_done lw a1, 0(v0) bne a0, a1, inst_error + nop addi v0, v0, 4 j .n98_c9_check2_loop + nop .n98_done: nop diff --git a/src/MMU/MMU.sv b/src/MMU/MMU.sv index 3992d3c..41de194 100644 --- a/src/MMU/MMU.sv +++ b/src/MMU/MMU.sv @@ -341,7 +341,7 @@ module MMU ( case (drState) DR_IDLE: begin if (diReq) drNextState = DR_ICACHE; - else if (dReq1 & cacheOp1[2] & dCached1) begin + else if (dReq1 & cacheOp1[2] & (dCached1 | cacheOp1[1])) begin if (cacheOp2[0]) begin // Do not write back // dc.valid = dc.wvalid = 1; From 7e85ca17e3927cd9db3c655f9257d643efdd7746 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Mon, 6 Sep 2021 22:36:37 +0800 Subject: [PATCH 41/56] refactor D-Cache CACHE inst --- README.md | 4 +- .../2021/soft/func/inst/n98_cache_dcache.S | 10 +- src/Cache/DCache.sv | 40 +++-- src/MMU/MMU.sv | 144 ++++++++---------- 4 files changed, 103 insertions(+), 95 deletions(-) diff --git a/README.md b/README.md index da4a71d..494d0c0 100644 --- a/README.md +++ b/README.md @@ -32,8 +32,8 @@ Our awesome `MIPS` CPU written in `SystemVerilog` for Loongson Cup | :----------------: | :-------------------------------: | :------: | :--: | :-------------------------------------- | | :heavy_check_mark: | `I-Cache Index Invalid` | `SYS` | 2 | | | :heavy_check_mark: | `I-Cache Hit Invalid` | `SYS` | 2 | | -| :hourglass: | `D-Cache Index Writeback Invalid` | `SYS` | 2 | :cry: | -| :hourglass: | `D-Cache Index Store Tag` | `SYS` | 2 | | +| :heavy_check_mark: | `D-Cache Index Writeback Invalid` | `SYS` | 2 | :cry: | +| :heavy_check_mark: | `D-Cache Index Store Tag` | `SYS` | 2 | | | :heavy_check_mark: | `D-Cache Hit Invalid` | `SYS` | 2 | | | :heavy_check_mark: | `D-Cache Hit Writeback Invalid` | `SYS` | 2 | | | :heavy_check_mark: | `PREF` | `SYS` | 1 | Treat as `NOP` | diff --git a/resources/2021/soft/func/inst/n98_cache_dcache.S b/resources/2021/soft/func/inst/n98_cache_dcache.S index 6c72f90..63bfc1f 100644 --- a/resources/2021/soft/func/inst/n98_cache_dcache.S +++ b/resources/2021/soft/func/inst/n98_cache_dcache.S @@ -92,6 +92,7 @@ TEST_CACHE_DCACHE_HIT(0xa00d0028, 0x800d0028, 4, 0xF0F0F0F0, 0xABCDEFAB) add v1, v0, v1 .n98_con_prepare3_loop: beq v0, v1, .n98_con_check3 + nop sw a0, 0(v0) sw a0, 4(v0) sw a0, 8(v0) @@ -110,6 +111,7 @@ TEST_CACHE_DCACHE_HIT(0xa00d0028, 0x800d0028, 4, 0xF0F0F0F0, 0xABCDEFAB) add v1, v0, v1 .n98_con_check4_loop: beq v0, v1, .n98_con_end + nop lw a1, 0(v0) bne a0, a1, inst_error nop @@ -134,18 +136,19 @@ TEST_CACHE_DCACHE_HIT(0xa00d0028, 0x800d0028, 4, 0xF0F0F0F0, 0xABCDEFAB) ## CACHE 9 D-Cache Index Store Tag .n98_c1_prepare: - li a0, 0x12345678 + li a0, 0x11223344 li v0, 0x800d0000 li v1, 0x800d0200 .n98_c1_loop: beq v0, v1, .n98_c1_check + nop sw a0, 0(v0) sw a0, 4(v0) sw a0, 8(v0) sw a0, 12(v0) addi a1, v0, 0 GET_DCACHE_INDEX - cache 0, 0(v0) + cache 1, 0(v0) addi v0, a1, 16 j .n98_c1_loop nop @@ -180,6 +183,7 @@ TEST_CACHE_DCACHE_HIT(0xa00d0028, 0x800d0028, 4, 0xF0F0F0F0, 0xABCDEFAB) li v1, 0x800d0200 .n98_c9_loop: beq v0, v1, .n98_c9_check + nop sw zero, 0(v0) sw zero, 4(v0) sw zero, 8(v0) @@ -195,6 +199,7 @@ TEST_CACHE_DCACHE_HIT(0xa00d0028, 0x800d0028, 4, 0xF0F0F0F0, 0xABCDEFAB) li v1, 0xa00d0200 .n98_c9_check_loop: beq v0, v1, .n98_c9_check2 + nop lw a1, 0(v0) bne a0, a1, inst_error nop @@ -206,6 +211,7 @@ TEST_CACHE_DCACHE_HIT(0xa00d0028, 0x800d0028, 4, 0xF0F0F0F0, 0xABCDEFAB) li v1, 0x800d0200 .n98_c9_check2_loop: beq v0, v1, .n98_done + nop lw a1, 0(v0) bne a0, a1, inst_error nop diff --git a/src/Cache/DCache.sv b/src/Cache/DCache.sv index 6a43848..a2bbcc1 100644 --- a/src/Cache/DCache.sv +++ b/src/Cache/DCache.sv @@ -52,12 +52,15 @@ module DCache ( DCData_t wdata1[4], wdata2[4]; + logic clear; + // =========================== // ======== Flip-Flop ======== // =========================== - ffen #(`DC_TAGL-`DC_INDEXL) index_ff (clk, port.index, port.req, index1); - ffen #(4) wen_ff (clk, wen, en2, wen2); + ffen #(`DC_TAGL-`DC_INDEXL) index_ff (clk, port.index, port.req, index1); + ffen #(4) wen_ff (clk, wen, en2, wen2); + ffen #(1) clear_ff (clk, port.clearWb, en2, clear); // =============================== // ======== State Machine ======== @@ -82,12 +85,12 @@ module DCache ( end end LOOKUP: begin - if (~port.valid) begin + if (~port.valid & ~port.clearWb) begin if (~port.req) begin nextState = IDLE; end end else begin - if (hit & ~port.clearWb | port.clear & port.clearIdx) begin + if (hit & ~port.clearWb | port.clear & ~port.clearWb) begin if (port.wvalid) begin bwe1 = 1'b1; nextState = IDLE; @@ -136,7 +139,8 @@ module DCache ( assign hitWay[1] = tagV[1] & tagOut[1].tag == port.tag1; assign hitWay[2] = tagV[2] & tagOut[2].tag == port.tag1; assign hitWay[3] = tagV[3] & tagOut[3].tag == port.tag1; - assign hit = |{hitWay}; + // 在 clearWb状态下确保命中 + assign hit = |{hitWay} | port.clear & port.clearWb; assign cacheLine = (hitWay[0] ? dataOut[0] : `DC_DATA_LENGTH'b0) | (hitWay[1] ? dataOut[1] : `DC_DATA_LENGTH'b0) @@ -151,7 +155,13 @@ module DCache ( // ============================== // Choose Victim - assign victim = port.clearWb ? hitWay + assign victim = port.clear & port.clearWb & ~port.clearIdx ? hitWay // Hit Address Writeback -> hitWay + // Hit Index Writeback -> clear valid + dirty way + : port.clear & port.clearWb & port.clearIdx & tagV[0] & tagOut[0].dirty ? 4'b0001 + : port.clear & port.clearWb & port.clearIdx & tagV[1] & tagOut[1].dirty ? 4'b0010 + : port.clear & port.clearWb & port.clearIdx & tagV[2] & tagOut[2].dirty ? 4'b0100 + : port.clear & port.clearWb & port.clearIdx & tagV[3] & tagOut[3].dirty ? 4'b1000 + // Normal mode : tagV[0] == 0 ? 4'b0001 : tagV[1] == 0 ? 4'b0010 : tagV[2] == 0 ? 4'b0100 @@ -164,8 +174,11 @@ module DCache ( : nowLRU[1] == 0 ? 4'b0010 : nowLRU[2] == 0 ? 4'b0100 : 4'b1000; - assign wen = port.clear & port.clearIdx ? 4'b1111 - : hit ? hitWay : victim; + + assign wen = port.clear & port.clearIdx & ~port.clearWb ? 4'b1111 // Index Invalidate + : port.clear & ~port.clearIdx & ~port.clearWb ? hitWay // Hit Invalidate + : port.clear & port.clearWb ? victim // Writeback Invalidate + : hit ? hitWay : victim; assign port.dirt_valid = (state == LOOKUP) & |{tagV & {tagOut[3].dirty, tagOut[2].dirty, tagOut[1].dirty, tagOut[0].dirty} & victim}; @@ -182,7 +195,8 @@ module DCache ( | (victim[3] ? dataOut[3] : `DC_DATA_LENGTH'b0); // Update LRU - assign nextLRU = { + assign nextLRU = port.clear & port.clearIdx ? nowLRU : + { wen[3] | nowLRU[3] & ~&{nowLRU | wen}, wen[2] | nowLRU[2] & ~&{nowLRU | wen}, wen[1] | nowLRU[1] & ~&{nowLRU | wen}, @@ -232,10 +246,10 @@ module DCache ( assign DataRAM2.wen = (bwe1 & wen[2]) | (bwe2 & wen2[2]); assign DataRAM3.wen = (bwe1 & wen[3]) | (bwe2 & wen2[3]); // 写数据 - assign TagRAM0.wdata = {port.tag1, port.wvalid, ~port.clear}; - assign TagRAM1.wdata = {port.tag1, port.wvalid, ~port.clear}; - assign TagRAM2.wdata = {port.tag1, port.wvalid, ~port.clear}; - assign TagRAM3.wdata = {port.tag1, port.wvalid, ~port.clear}; + assign TagRAM0.wdata = {port.tag1, port.wvalid, ~(port.clear | bwe2 & clear)}; + assign TagRAM1.wdata = {port.tag1, port.wvalid, ~(port.clear | bwe2 & clear)}; + assign TagRAM2.wdata = {port.tag1, port.wvalid, ~(port.clear | bwe2 & clear)}; + assign TagRAM3.wdata = {port.tag1, port.wvalid, ~(port.clear | bwe2 & clear)}; assign DataRAM0.wdata = state == LOOKUP ? wdata1[0] : wdata2[0]; assign DataRAM1.wdata = state == LOOKUP ? wdata1[1] : wdata2[1]; diff --git a/src/MMU/MMU.sv b/src/MMU/MMU.sv index 41de194..f86ff97 100644 --- a/src/MMU/MMU.sv +++ b/src/MMU/MMU.sv @@ -65,7 +65,7 @@ module MMU ( DR_WA, DR_WD1, DR_WD2, DR_WD3, DR_WD4, DR_REFILL, - DR_ICACHE, DR_CACHE, DR_CACHE_REFILL, DR_CACHE_CLEAR, DR_CACHE_REQ + DR_ICACHE, DR_CACHE, DR_CACHE_REFILL, DR_CACHE_REQ } drstate_t; typedef enum bit [2:0] { @@ -98,7 +98,7 @@ module MMU ( word_t iD1, iD2, iD3, iD4, iD5, iD6, iD7; logic diReq; - CacheOp_t cacheOp1, cacheOp2; + CacheOp_t cacheOp1; word_t dVA1, diPA; // ================================ @@ -297,7 +297,9 @@ module MMU ( logic [127:0] ddData1; // D-Cache Clear - logic dClrValid, dClrRv, dClrReq; + logic dClrRv, dClrReq; + logic dDirtValid; + logic dCEn, dCClear, dCCached; // ============================ // ======== dFlip-Flop ======== @@ -312,7 +314,9 @@ module MMU ( ffen #(4) dwstrb_ff (clk, data.wstrb, dEn2, dWstrb1); ffen #(32) dwdata_ff (clk, data.wdata, dEn2, dWdata1); ffen #(3) cache_op_ff (clk, cacheOp[2:0], dEn, cacheOp1[2:0]); - ffen #(3) cache_op2_ff (clk, cacheOp1[2:0], dEn2, cacheOp2[2:0]); + + ffen #(1) dDirtValid_ff (clk, dc.dirt_valid, dEn2, dDirtValid); + ffenr #(1) dCCached_ff (clk, dCClear | rst, 1'b1, dCEn, dCCached); // ================================= // ======== drState Machine ======== @@ -329,32 +333,44 @@ module MMU ( always_comb begin dEn = 0; dEn2 = 0; + dCEn = 0; + dCClear = 0; drNextState = drState; data.data_ok = 0; rdata_axi.req = 0; + // D-Cache 清除功能 (与 req 一起发送) dc.clear = 0; dc.clearIdx = 0; dc.clearWb = 0; - dClrValid = 0; + // 直接发送 dc.rvalid dClrRv = 0; + // 直接发送 dc.req dClrReq = 0; case (drState) DR_IDLE: begin if (diReq) drNextState = DR_ICACHE; - else if (dReq1 & cacheOp1[2] & (dCached1 | cacheOp1[1])) begin - if (cacheOp2[0]) begin - // Do not write back - // dc.valid = dc.wvalid = 1; - dClrValid = 1; - dc.clear = 1; - dc.clearIdx = cacheOp2[1]; - drNextState = DR_CACHE_REFILL; + else if (dReq1 & cacheOp1[2] & (dCached1 | dCCached | cacheOp1[1])) begin + if (cacheOp1[0]) begin + // 不需要写回的情况 + // D-Cache 状态机处于 Lookup 阶段 + dc.clear = 1; // 发送清除 + dc.clearIdx = cacheOp1[1]; // 清除时清除整行或者命中对象 + drNextState = DR_CACHE_REFILL; // 进入 REFILL 等候写入完成 end else begin - // WriteBack - dc.clearWb = 1; - drNextState = DR_CACHE; - dEn2 = 1; + // 需要写回 + // 此时 D-Cache 状态机处于 Lookup 状态 + // 可能是: 1. CACHE 请求第一次发送 + // 2. Index Writeback 清除一路后返回 + dc.clear = 1; // 发送清除 + dc.clearIdx = cacheOp1[1]; // 清除时清除整行或者命中对象 + dc.clearWb = 1; // 需要写回的清除 + drNextState = DR_CACHE; // 进入 DR_CACHE 等候写入完成 + dEn2 = 1; // 二阶段 + dCEn = 1; // 缓存 dCached1 end + end else if (dReq1 & cacheOp1[2]) begin + // avoid deadlock when address is uncached + drNextState = DR_CACHE_REFILL; end else if (~dValid1) dEn = 1; else begin dEn2 = 1; @@ -422,34 +438,31 @@ module MMU ( end DR_CACHE: begin // WriteBack - // Clear By Index or Address // D-Cache: state == REPLACE if (wdata_ok) begin - if (cacheOp2[1]) begin - drNextState = DR_CACHE_CLEAR; + dClrRv = 1; // 直接发送 dc.rvalid 通知可写 + // Why cann't I send dc.clear HERE ??? + // dc.clear = 1; + if (cacheOp1[1]) begin + // Clear by Index + if (dDirtValid) + drNextState = DR_CACHE_REQ; // 重新进入准备其它路的清除 + else + drNextState = DR_CACHE_REFILL; // 清除完了 end else begin - dClrRv = 1; - dc.clear = 1; - drNextState = DR_CACHE_REFILL; + // Clear by Address + drNextState = DR_CACHE_REFILL; // 进入 REFILL 等候写入完成 end - // drNextState = DR_CACHE_CLEAR; end end DR_CACHE_REFILL: begin - // avoid deadlock + dCClear = 1; dEn = 1; drNextState = DR_IDLE; data.data_ok = 1; end - DR_CACHE_CLEAR: begin - // deal with timing loop - dClrRv = 1; - dc.clear = 1; - drNextState = DR_CACHE_REQ; - end DR_CACHE_REQ: begin - // deal with timing loop - dClrReq = 1; // use dClrReq to start a new D-Cache req + dClrReq = 1; drNextState = DR_IDLE; end endcase @@ -459,31 +472,6 @@ module MMU ( // ========== dFunction ========== // ================================ - /* - * D-Cache Cache 指令实现备注 - * Cache 指令当成写指令处理 - * TLB 转换请求和 D-Cache 请求与普通访存一致 - * dc.req 在 I-Cache Cache 指令发生时为0 - * dwState 和 dwaState 需判断是否是 CACHE 指令且是否允许写回 - * 屏蔽 dAddressError 和 TLBModified 且只有在 Address 类型请求下允许 TLBRefill 和 TLBInvalid - * Index WriteBack 转换成 Hit WriteBack(s) + Index Invalid - */ - /* 状态 - D-Cache: - IDLE <- dc.req + dc.index - LOOKUP <- dc.tag1: Lookup模式下需要传入正确的tag1 - dc.valid: 1 - dc.wvalid: 1 - dc.clear: Hit Invalid and Index Invalid - dc.clearIdx: Hit Invalid or Index Invalid - dc.clearWb: 是否需要写回 - -> dc.dirt_valid - dc.dirt_addr - dc.dirt_data - REPLACE <- dc.rvalid - dc.clear: same cycle as dc.rvalid - */ - assign dVA = data.addr; assign diReq = dReq1 & ~cacheOp1[2] & |cacheOp1[1:0]; assign dcReq1 = dReq1 & (cacheOp1 == CNOP | cacheOp1[2]); // exclude I-Cache clear @@ -534,7 +522,7 @@ module MMU ( // do not request when handling CACHE instruction on I-Cache assign dc.req = dClrReq | dEn & (cacheOp[2] | ~|cacheOp[1:0]); - assign dc.valid = dClrValid | dValid1 & dCached1; + assign dc.valid = dValid1 & dCached1 | dc.clear; assign dc.index = dEn ? dVA[`DC_TAGL-1:`DC_INDEXL] : dVA1[`DC_TAGL-1:`DC_INDEXL]; assign dc.tag1 = dEn2 ? dPA1[31:`DC_TAGL] : dPA2[31:`DC_TAGL]; assign dc.sel1 = dEn2 ? dPA1[3:2] : dPA2[3:2]; @@ -574,12 +562,12 @@ module MMU ( case (dwState) DW_IDLE: begin - if (dEn2 & (~dCached1 & data.wr - | dCached1 & dc.dirt_valid - & (~cacheOp1[2] | ~cacheOp1[0]) // WriteOnly 不允许写回 - & (~dc.hit | cacheOp1[2] & ~cacheOp1[0]) // Writeback 或一般情况 + if (dEn2 & (~(dCached1 | dCEn) & data.wr + | (dCached1 | dCEn) & dc.dirt_valid + & (~cacheOp1[2] | ~cacheOp1[0]) // WriteOnly 不允许写回 + & (~dc.hit | cacheOp1[2] & ~cacheOp1[0]) // Writeback 或一般情况 )) begin - if (dCached1) begin + if (dCached1 | dCEn) begin wdata_axi.wdata = dc.dirt_data[31:0]; wdata_axi.wstrb = 4'b1111; wdata_axi.wvalid = 1'b1; @@ -592,7 +580,7 @@ module MMU ( if (~wdata_axi.wready) dwNextState = DW_WD1; else begin - if (dCached1) dwNextState = DW_WD2; + if (dCached1 | dCEn) dwNextState = DW_WD2; else begin if (~wdata_axi.data_ok) dwNextState = DW_WB; else begin @@ -605,7 +593,7 @@ module MMU ( end end DW_WD1: begin - if (dCached2) begin + if (dCached2 | dCCached) begin wdata_axi.wdata = ddData1[31:0]; wdata_axi.wstrb = 4'b1111; wdata_axi.wvalid = 1'b1; @@ -617,7 +605,7 @@ module MMU ( end if (wdata_axi.wready) begin - if (dCached2) dwNextState = DW_WD2; + if (dCached2 | dCCached) dwNextState = DW_WD2; else begin if (~wdata_axi.data_ok) dwNextState = DW_WB; else begin @@ -652,7 +640,7 @@ module MMU ( if (~wdata_axi.data_ok) dwNextState = DW_WB; else begin // fixme: AXI3 wait WA - if (drState == DR_REFILL | drState == DR_CACHE_REFILL) dwNextState = DW_IDLE; + if (drState == DR_REFILL | drState == DR_CACHE_REFILL | drState == DR_CACHE_REQ) dwNextState = DW_IDLE; else dwNextState = DW_WAITR; end end @@ -661,12 +649,12 @@ module MMU ( // TODO: goto IDLE on failure if (wdata_axi.data_ok) begin // fixme: AXI3 wait WA - if (drState == DR_REFILL | drState == DR_CACHE_REFILL) dwNextState = DW_IDLE; + if (drState == DR_REFILL | drState == DR_CACHE_REFILL | drState == DR_CACHE_REQ) dwNextState = DW_IDLE; else dwNextState = DW_WAITR; end end DW_WAITR: begin - if (drState == DR_REFILL | drState == DR_CACHE_REFILL) dwNextState = DW_IDLE; + if (drState == DR_REFILL | drState == DR_CACHE_REFILL | drState == DR_CACHE_REQ) dwNextState = DW_IDLE; end endcase end @@ -687,10 +675,10 @@ module MMU ( case (dwaState) DWA_IDLE: begin - if (dEn2 & (~dCached1 & data.wr - | dCached1 & dc.dirt_valid - & (~cacheOp1[2] | ~cacheOp1[0]) // WriteOnly 不允许写回 - & (~dc.hit | cacheOp1[2] & ~cacheOp1[0]) // Writeback 或一般情况 + if (dEn2 & (~(dCached1 | dCEn) & data.wr + | (dCached1 | dCEn) & dc.dirt_valid + & (~cacheOp1[2] | ~cacheOp1[0]) // WriteOnly 不允许写回 + & (~dc.hit | cacheOp1[2] & ~cacheOp1[0]) // Writeback 或一般情况 )) begin wdata_axi.req = 1'b1; if (~wdata_axi.addr_ok) dwaNextState = DWA_WA; @@ -724,10 +712,10 @@ module MMU ( // ========== dwFunction ========== // ================================ - assign wdata_axi.addr = (dEn2 ? dCached1 : dCached2) ? (dwaState == DWA_IDLE) ? dc.dirt_addr : ddAddr1 : dEn2 ? dPA1 : dPA2; - assign wdata_axi.len = (dEn2 ? dCached1 : dCached2) ? 4'b0011 : 4'b0000; - assign wdata_axi.size = (dEn2 ? dCached1 : dCached2) ? 3'b010 : {1'b0, dSize1}; - assign dc.wvalid = dClrValid | dEn2 ? data.wr : dwr1; + assign wdata_axi.addr = ((dEn2 ? dCached1 : dCached2) | dCEn) ? (dwaState == DWA_IDLE) ? dc.dirt_addr : ddAddr1 : dEn2 ? dPA1 : dPA2; + assign wdata_axi.len = ((dEn2 ? dCached1 : dCached2) | dCEn) ? 4'b0011 : 4'b0000; + assign wdata_axi.size = ((dEn2 ? dCached1 : dCached2) | dCEn) ? 3'b010 : {1'b0, dSize1}; + assign dc.wvalid = dEn2 ? data.wr : dwr1; assign dc.wdata = dEn2 ? data.wdata : dWdata1; assign dc.wstrb = dEn2 ? data.wstrb : dWstrb1; From 29c6e166822c67e31072e06509e42dd353336004 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Tue, 7 Sep 2021 19:24:34 +0800 Subject: [PATCH 42/56] try add MOVZ, MOVN --- src/Core/Controller.sv | 38 +++++---- src/Core/Datapath.sv | 2 + src/Core/Gadgets.sv | 2 + tools/ctrl_maker.py | 2 +- tools/decoder.py | 182 +++++++++++++++++++++-------------------- tools/ectrl.txt | 2 + tools/global.txt | 2 + tools/mctrl0.txt | 2 + tools/mctrl1.txt | 2 + tools/pcs.txt | 2 + tools/privilege.txt | 2 + tools/wctrl.txt | 150 ++++++++++++++++----------------- 12 files changed, 208 insertions(+), 180 deletions(-) diff --git a/src/Core/Controller.sv b/src/Core/Controller.sv index bd3ec4b..96692bb 100644 --- a/src/Core/Controller.sv +++ b/src/Core/Controller.sv @@ -4,6 +4,7 @@ module Controller ( input word_t inst, input logic eq, input logic ltz, + input word_t rt, output Ctrl_t ctrl, output word_t imm, output logic [4:0] sa @@ -28,9 +29,9 @@ module Controller ( imm ); - assign ctrl.BJRJ = (~inst[27] & (~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[5] & ~inst[4] & inst[3] & ~inst[2] | ~inst[31] & ~inst[29] & inst[28]) | inst[27] & ~inst[31] & ~inst[29]) & ~inst[26] | ~inst[31] & ~inst[29] & inst[26]; + assign ctrl.BJRJ = ~inst[26] & (~inst[27] & ~inst[30] & (~inst[28] & ~inst[31] & ~inst[29] & inst[3] & ~inst[1] & ~inst[4] & ~inst[2] | inst[28] & ~inst[31] & ~inst[29]) | inst[27] & ~inst[31] & ~inst[29]) | inst[26] & ~inst[31] & ~inst[29]; assign ctrl.B = ~inst[31] & ~inst[29] & (inst[28] | ~inst[27] & inst[26]); - assign ctrl.JR = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & ~inst[4] & inst[3] & ~inst[2]; + assign ctrl.JR = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[4] & inst[3] & ~inst[2] & ~inst[1]; assign ctrl.J = ~inst[31] & ~inst[29] & ~inst[28] & inst[27]; assign ctrl.BGO = ~inst[26] & (eq | inst[27] & ltz) | inst[26] & (~inst[27] & (~inst[28] & (inst[16] & ~ltz | ~inst[16] & ltz) | inst[28] & ~eq) | inst[27] & ~eq & ~ltz); @@ -40,35 +41,36 @@ module Controller ( assign ctrl.ERET = ~inst[31] & inst[30] & inst[4]; assign ctrl.OFA = ~inst[31] & ~inst[28] & ~inst[27] & ~inst[26] & (~inst[30] & inst[5] & ~inst[3] & ~inst[2] & ~inst[0] | inst[29]); - assign ctrl.ES = (~inst[30] & (~inst[28] & ~inst[27] & ~inst[26] & ((inst[4] & inst[3] & ~inst[2] | ~inst[3] & inst[2]) | inst[5]) | inst[31]) | inst[29]); - assign ctrl.ET = ~inst[27] & ~inst[26] & (~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & (~inst[1] & (~inst[0] & (~inst[3] & ~inst[4] | inst[3] & inst[4]) | inst[4] & inst[3] & inst[0]) | inst[1] & (~inst[4] | inst[3]) | inst[5]) | inst[30] & inst[29]); - assign ctrl.DS = ~inst[26] & (~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[5] & ~inst[4] & inst[3] & ~inst[2] | ~inst[31] & ~inst[29] & inst[28]) | ~inst[31] & ~inst[29] & (inst[28] | ~inst[27]) & inst[26]; - assign ctrl.DT = ~inst[31] & ~inst[29] & inst[28] & ~inst[27]; + assign ctrl.ES = ~inst[30] & (~inst[28] & ~inst[27] & ~inst[26] & (~inst[3] & inst[2] | inst[3] & (inst[4] | inst[1]) | inst[5]) | inst[31]) | inst[29]; + assign ctrl.ET = ~inst[31] & ~inst[27] & ~inst[26] & (~inst[30] & ~inst[29] & ~inst[28] & (~inst[3] & ~inst[4] | inst[3] & inst[4] | inst[5]) | inst[30] & inst[29]); + assign ctrl.DS = ~inst[26] & (~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[4] & inst[3] & ~inst[2] & ~inst[1] | inst[28] & ~inst[29] & ~inst[31]) | inst[26] & ~inst[31] & ~inst[29] & (~inst[27] | inst[28]); + assign ctrl.DT = ~inst[28] & ~inst[26] & ~inst[30] & ~inst[31] & ~inst[29] & ~inst[27] & inst[3] & inst[1] & ~inst[5] & ~inst[4] | inst[28] & ~inst[29] & ~inst[31] & ~inst[27]; assign ctrl.DP0 = ~inst[31] & (~inst[30] | inst[29] | ~inst[25] | inst[4]) | inst[31] & inst[30]; assign ctrl.DP1 = inst[26] | (~inst[30] & (inst[31] | inst[29] | inst[28] | inst[27] | ~inst[4]) | inst[30] & (~inst[29] & inst[25] | inst[3])); assign ctrl.ECtrl.OP.f_sl = ~inst[31] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & ~inst[3] & ~inst[1]; - assign ctrl.ECtrl.OP.f_sr = ~inst[31] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & inst[1]; - assign ctrl.ECtrl.OP.f_add = inst[31] | ~inst[28] & (~inst[26] & ~inst[27] & (inst[29] | ~inst[5] & inst[3] & ~inst[1] | inst[5] & ~inst[3] & ~inst[2]) | inst[26] & (~inst[29] | ~inst[27])); - assign ctrl.ECtrl.OP.f_and = ~inst[31] & (~inst[28] & ~inst[29] & ~inst[27] & ~inst[26] & inst[5] & inst[2] & ~inst[0] & ~inst[1] | inst[28] & ~inst[27] & ~inst[26]); - assign ctrl.ECtrl.OP.f_or = ~inst[31] & (~inst[28] & ~inst[29] & ~inst[27] & ~inst[26] & inst[5] & inst[2] & inst[0] | inst[28] & ~inst[27] & inst[26]); - assign ctrl.ECtrl.OP.f_xor = ~inst[31] & (~inst[28] & ~inst[29] & ~inst[27] & ~inst[26] & inst[5] & inst[2] & ~inst[0] & inst[1] | inst[28] & inst[27]); + assign ctrl.ECtrl.OP.f_sr = ~inst[31] & ~inst[28] & ~inst[26] & ~inst[27] & ~inst[29] & ~inst[5] & ~inst[3] & inst[1]; + assign ctrl.ECtrl.OP.f_add = ~inst[28] & (~inst[27] & ~inst[26] & ((~inst[5] & inst[3] & ~inst[1] | inst[5] & ~inst[3] & ~inst[2]) | inst[29]) | inst[26] & (~inst[29] | ~inst[27])) | inst[31]; + assign ctrl.ECtrl.OP.f_and = ~inst[31] & (~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[5] & inst[2] & ~inst[1] & ~inst[0] | inst[28] & ~inst[27] & ~inst[26]); + assign ctrl.ECtrl.OP.f_or = ~inst[31] & (~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[5] & inst[2] & inst[0] | inst[28] & ~inst[27] & inst[26]); + assign ctrl.ECtrl.OP.f_xor = ~inst[31] & (~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[5] & inst[2] & inst[1] & ~inst[0] | inst[28] & inst[27]); assign ctrl.ECtrl.OP.f_slt = ~inst[31] & ~inst[28] & ~inst[26] & (~inst[29] & inst[5] & inst[3] & ~inst[2] & ~inst[0] | inst[27]); - assign ctrl.ECtrl.OP.f_sltu = ~inst[31] & ~inst[28] & (~inst[26] & ~inst[29] & ~inst[27] & inst[5] & inst[3] & ~inst[2] & inst[0] | inst[26] & inst[29] & inst[27]); + assign ctrl.ECtrl.OP.f_sltu = ~inst[31] & ~inst[28] & (~inst[29] & ~inst[27] & ~inst[26] & inst[5] & inst[3] & ~inst[2] & inst[0] | inst[29] & inst[27] & inst[26]); + assign ctrl.ECtrl.OP.f_mova = ~inst[31] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & inst[3] & inst[1]; assign ctrl.ECtrl.OP.alt = ~inst[31] & (~inst[26] & (~inst[29] & inst[1] & (inst[5] | inst[0]) | inst[27]) | inst[26] & inst[29] & inst[27]); - assign ctrl.ECtrl.SA = SA_t'({inst[31] | inst[29] | ~inst[26] & (inst[5] | inst[2]), inst[31] | (~inst[28] & (inst[29] | inst[26] | inst[5] | inst[3] | inst[2]) | inst[28] & (~inst[27] | ~inst[26]))}); + assign ctrl.ECtrl.SA = SA_t'({~inst[26] & ((inst[3] & inst[1] | inst[2]) | inst[5]) | inst[31] | inst[29], (~inst[28] & (inst[29] | inst[26] | inst[5] | inst[3] | inst[2]) | inst[28] & (~inst[27] | ~inst[26])) | inst[31]}); assign ctrl.ECtrl.SB = SB_t'({inst[31] | inst[29], inst[26] | ~inst[5] & inst[3]}); assign ctrl.MCtrl0.HW = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (~inst[1] & inst[0] | inst[3]) | inst[30] & inst[29] & ~inst[1]; assign ctrl.MCtrl0.LW = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (inst[1] & inst[0] | inst[3]) | inst[30] & inst[29] & ~inst[1]; - assign ctrl.MCtrl0.HLS = HLS_t'({~inst[27] & ~inst[26] & (~inst[30] & ~inst[31] & ~inst[29] & ~inst[28] & inst[4] & inst[3] | inst[30] & inst[29]), ~inst[30] & inst[1], inst[0]}); + assign ctrl.MCtrl0.HLS = HLS_t'({(~inst[30] & ~inst[26] & ~inst[27] & ~inst[31] & ~inst[29] & ~inst[28] & inst[4] & inst[3] | inst[30] & inst[29]), inst[1] & ~inst[30], inst[0]}); assign ctrl.MCtrl0.MAS = MAS_t'({inst[2], inst[30] & ~inst[2] & ~inst[1]}); assign ctrl.MCtrl0.C0D = inst[15:11]; assign ctrl.MCtrl0.C0W = ~inst[31] & inst[30] & ~inst[29] & inst[23] & ~inst[3]; assign ctrl.MCtrl0.SEL = inst[2:0]; - assign ctrl.MCtrl0.RS0 = RS0_t'({~inst[30] & (inst[29] | inst[26] | ~inst[4]), inst[30], ~inst[29] & (inst[30] | ~inst[1])}); + assign ctrl.MCtrl0.RS0 = RS0_t'({~inst[30] & (~inst[4] | inst[26] | inst[29]), inst[30], ~inst[29] & (~inst[1] | inst[30])}); assign ctrl.MCtrl1.MR = inst[31] & ~inst[30]; assign ctrl.MCtrl1.MWR = inst[29]; @@ -81,6 +83,10 @@ module Controller ( assign ctrl.MCtrl1.TLBP = ~inst[31] & inst[30] & ~inst[4] & inst[3]; assign ctrl.MCtrl1.CACHE_OP = CacheOp_t'({inst[29] & inst[28] & inst[26] & inst[16], inst[29] & inst[28] & inst[26] & ~inst[20], inst[29] & inst[28] & inst[26] & ~inst[18] & (inst[20] | inst[19] | ~inst[16])}); - assign ctrl.WCtrl.RW = ctrl.RD != 5'b00000 & (~inst[30] & (~inst[27] & (~inst[26] & (~inst[31] & (~inst[28] & (~inst[3] & (~inst[4] | ~inst[0]) | inst[3] & (~inst[4] & ~inst[2] & inst[0] | inst[5])) | inst[29]) | inst[31] & ~inst[29]) | inst[26] & (~inst[31] & (~inst[28] & inst[20] | inst[29]) | inst[31] & ~inst[29])) | inst[27] & (~inst[26] & (~inst[31] & inst[29] | inst[31] & ~inst[29]) | inst[26] & (~inst[31] & (~inst[28] | inst[29]) | inst[31] & ~inst[29]))) | inst[30] & ~inst[31] & ~inst[3] & (~inst[29] & ~inst[25] & ~inst[23] | inst[29] & inst[1])); + logic mov, rw, eqz; + assign mov = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & ~inst[4] & inst[3] & ~inst[2] & inst[1]; + assign rw = (~inst[30] & (~inst[27] & (~inst[26] & (~inst[31] & (~inst[28] & (~inst[4] & (~inst[3] | ~inst[2] & (inst[1] | inst[0])) | inst[4] & ~inst[3] & ~inst[0]) | inst[29]) | inst[31] & ~inst[29]) | inst[26] & (~inst[31] & (~inst[28] & inst[20] | inst[29]) | inst[31] & ~inst[29])) | inst[27] & (~inst[31] & (~inst[28] & inst[26] | inst[29]) | inst[31] & ~inst[29])) | ~inst[31] & inst[30] & ~inst[3] & (~inst[29] & ~inst[25] & ~inst[23] | inst[29] & inst[1])); + assign eqz = rt == 32'h0; + assign ctrl.WCtrl.RW = ctrl.RD != 5'b00000 & (~mov | ~inst[0] & eqz | inst[0] & ~eqz) & rw; endmodule diff --git a/src/Core/Datapath.sv b/src/Core/Datapath.sv index ad52678..40a2bd1 100644 --- a/src/Core/Datapath.sv +++ b/src/Core/Datapath.sv @@ -432,6 +432,7 @@ module Datapath ( .inst(D.IA_inst), .eq (D_IA_ForwardS == D_IA_ForwardT), .ltz (D_IA_ForwardS[31]), + .rt (D_IA_ForwardT), .ctrl(D.IA), .imm (D.IA_imm), .sa (D.IA_sa) @@ -440,6 +441,7 @@ module Datapath ( .inst(D.IB_inst), .eq (D_IB_ForwardS == D_IB_ForwardT), .ltz (D_IB_ForwardS[31]), + .rt (D_IB_ForwardT), .ctrl(D.IB), .imm (D.IB_imm), .sa (D.IB_sa) diff --git a/src/Core/Gadgets.sv b/src/Core/Gadgets.sv index 9288315..619dbcd 100644 --- a/src/Core/Gadgets.sv +++ b/src/Core/Gadgets.sv @@ -26,6 +26,8 @@ module instr_valid ( 32'b000000???????????????00000000100: valid = 1'b1; // SLLV 32'b000000???????????????00000000110: valid = 1'b1; // SRLV 32'b000000???????????????00000000111: valid = 1'b1; // SRAV + 32'b000000???????????????00000001010: valid = 1'b1; // MOVZ + 32'b000000???????????????00000001011: valid = 1'b1; // MOVN 32'b000000?????000000000000000001000: valid = 1'b1; // JR 32'b000000?????00000?????00000001001: valid = 1'b1; // JALR 32'b000000????????????????????001100: valid = 1'b1; // SYSCALL diff --git a/tools/ctrl_maker.py b/tools/ctrl_maker.py index 2f1fc48..c7fd510 100644 --- a/tools/ctrl_maker.py +++ b/tools/ctrl_maker.py @@ -1,4 +1,4 @@ -with open('clo.txt') as f: +with open('wctrl.txt') as f: lines = f.readlines() title = lines[0].split() items = [x.split() for x in lines[1:]] diff --git a/tools/decoder.py b/tools/decoder.py index d369363..4441b71 100644 --- a/tools/decoder.py +++ b/tools/decoder.py @@ -1,77 +1,79 @@ table = [ - ('000000000000000000000?????001111', 'SYNC'), + # ('000000000000000000000?????001111', 'SYNC'), ('00000000000???????????????000000', 'SLL'), - ('00000000000???????????????000010', 'SRL'), - ('00000000000???????????????000011', 'SRA'), - ('000000???????????????00000000100', 'SLLV'), - ('000000???????????????00000000110', 'SRLV'), - ('000000???????????????00000000111', 'SRAV'), - ('000000?????000000000000000001000', 'JR'), - ('000000?????00000?????00000001001', 'JALR'), - ('000000????????????????????001100', 'SYSCALL'), - ('000000????????????????????001101', 'BREAK'), - ('0000000000000000?????00000010000', 'MFHI'), - ('000000?????000000000000000010001', 'MTHI'), - ('0000000000000000?????00000010010', 'MFLO'), - ('000000?????000000000000000010011', 'MTLO'), - ('000000??????????0000000000011000', 'MULT'), - ('000000??????????0000000000011001', 'MULTU'), - ('000000??????????0000000000011010', 'DIV'), - ('000000??????????0000000000011011', 'DIVU'), - ('000000???????????????00000100000', 'ADD'), - ('000000???????????????00000100001', 'ADDU'), - ('000000???????????????00000100010', 'SUB'), - ('000000???????????????00000100011', 'SUBU'), - ('000000???????????????00000100100', 'AND'), - ('000000???????????????00000100101', 'OR'), - ('000000???????????????00000100110', 'XOR'), - ('000000???????????????00000100111', 'NOR'), - ('000000???????????????00000101010', 'SLT'), - ('000000???????????????00000101011', 'SLTU'), - ('000001?????00000????????????????', 'BLTZ'), - ('000001?????10000????????????????', 'BLTZAL'), - ('000001?????00001????????????????', 'BGEZ'), - ('000001?????10001????????????????', 'BGEZAL'), - ('000010??????????????????????????', 'J'), - ('000011??????????????????????????', 'JAL'), - ('000100??????????????????????????', 'BEQ'), - ('000101??????????????????????????', 'BNE'), - ('000110?????00000????????????????', 'BLEZ'), - ('000111?????00000????????????????', 'BGTZ'), - ('001000??????????????????????????', 'ADDI'), - ('001001??????????????????????????', 'ADDIU'), - ('001010??????????????????????????', 'SLTI'), - ('001011??????????????????????????', 'SLTIU'), - ('001100??????????????????????????', 'ANDI'), - ('001101??????????????????????????', 'ORI'), - ('001110??????????????????????????', 'XORI'), - ('00111100000?????????????????????', 'LUI'), - ('01000000000??????????00000000???', 'MFC0'), - ('01000000100??????????00000000???', 'MTC0'), - ('01000010000000000000000000000001', 'TLBR'), - ('01000010000000000000000000000010', 'TLBWI'), - ('01000010000000000000000000000110', 'TLBWR'), - ('01000010000000000000000000001000', 'TLBP'), - ('01000010000000000000000000011000', 'ERET'), - ('011100??????????0000000000000000', 'MADD'), - ('011100??????????0000000000000001', 'MADDU'), - ('011100??????????0000000000000100', 'MSUB'), - ('011100??????????0000000000000101', 'MSUBU'), - ('011100???????????????00000000010', 'MUL'), - ('100000??????????????????????????', 'LB'), - ('100001??????????????????????????', 'LH'), - ('100010??????????????????????????', 'LWL'), - ('100011??????????????????????????', 'LW'), - ('100100??????????????????????????', 'LBU'), - ('100101??????????????????????????', 'LHU'), - ('100110??????????????????????????', 'LWR'), - ('101000??????????????????????????', 'SB'), - ('101001??????????????????????????', 'SH'), - ('101010??????????????????????????', 'SWL'), - ('101011??????????????????????????', 'SW'), - ('101110??????????????????????????', 'SWR'), - ('101111??????????????????????????', 'CACHE'), - ('110011??????????????????????????', 'PREF'), + # ('00000000000???????????????000010', 'SRL'), + # ('00000000000???????????????000011', 'SRA'), + # ('000000???????????????00000000100', 'SLLV'), + # ('000000???????????????00000000110', 'SRLV'), + # ('000000???????????????00000000111', 'SRAV'), + ('000000???????????????00000001010', 'MOVZ'), + ('000000???????????????00000001011', 'MOVN'), + # ('000000?????000000000000000001000', 'JR'), + # ('000000?????00000?????00000001001', 'JALR'), + # ('000000????????????????????001100', 'SYSCALL'), + # ('000000????????????????????001101', 'BREAK'), + # ('0000000000000000?????00000010000', 'MFHI'), + # ('000000?????000000000000000010001', 'MTHI'), + # ('0000000000000000?????00000010010', 'MFLO'), + # ('000000?????000000000000000010011', 'MTLO'), + # ('000000??????????0000000000011000', 'MULT'), + # ('000000??????????0000000000011001', 'MULTU'), + # ('000000??????????0000000000011010', 'DIV'), + # ('000000??????????0000000000011011', 'DIVU'), + # ('000000???????????????00000100000', 'ADD'), + # ('000000???????????????00000100001', 'ADDU'), + # ('000000???????????????00000100010', 'SUB'), + # ('000000???????????????00000100011', 'SUBU'), + # ('000000???????????????00000100100', 'AND'), + # ('000000???????????????00000100101', 'OR'), + # ('000000???????????????00000100110', 'XOR'), + # ('000000???????????????00000100111', 'NOR'), + # ('000000???????????????00000101010', 'SLT'), + # ('000000???????????????00000101011', 'SLTU'), + # ('000001?????00000????????????????', 'BLTZ'), + # ('000001?????10000????????????????', 'BLTZAL'), + # ('000001?????00001????????????????', 'BGEZ'), + # ('000001?????10001????????????????', 'BGEZAL'), + # ('000010??????????????????????????', 'J'), + # ('000011??????????????????????????', 'JAL'), + # ('000100??????????????????????????', 'BEQ'), + # ('000101??????????????????????????', 'BNE'), + # ('000110?????00000????????????????', 'BLEZ'), + # ('000111?????00000????????????????', 'BGTZ'), + # ('001000??????????????????????????', 'ADDI'), + # ('001001??????????????????????????', 'ADDIU'), + # ('001010??????????????????????????', 'SLTI'), + # ('001011??????????????????????????', 'SLTIU'), + # ('001100??????????????????????????', 'ANDI'), + # ('001101??????????????????????????', 'ORI'), + # ('001110??????????????????????????', 'XORI'), + # ('00111100000?????????????????????', 'LUI'), + # ('01000000000??????????00000000???', 'MFC0'), + # ('01000000100??????????00000000???', 'MTC0'), + # ('01000010000000000000000000000001', 'TLBR'), + # ('01000010000000000000000000000010', 'TLBWI'), + # ('01000010000000000000000000000110', 'TLBWR'), + # ('01000010000000000000000000001000', 'TLBP'), + # ('01000010000000000000000000011000', 'ERET'), + # ('011100??????????0000000000000000', 'MADD'), + # ('011100??????????0000000000000001', 'MADDU'), + # ('011100??????????0000000000000100', 'MSUB'), + # ('011100??????????0000000000000101', 'MSUBU'), + # ('011100???????????????00000000010', 'MUL'), + # ('100000??????????????????????????', 'LB'), + # ('100001??????????????????????????', 'LH'), + # ('100010??????????????????????????', 'LWL'), + # ('100011??????????????????????????', 'LW'), + # ('100100??????????????????????????', 'LBU'), + # ('100101??????????????????????????', 'LHU'), + # ('100110??????????????????????????', 'LWR'), + # ('101000??????????????????????????', 'SB'), + # ('101001??????????????????????????', 'SH'), + # ('101010??????????????????????????', 'SWL'), + # ('101011??????????????????????????', 'SW'), + # ('101110??????????????????????????', 'SWR'), + # ('101111??????????????????????????', 'CACHE'), + # ('110011??????????????????????????', 'PREF'), ] class Boolean: @@ -95,9 +97,9 @@ for inst, name in table: print('=====', name, '=====') ctrl = {} - ctrl['BJRJ'] = (~inst[27] & (~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[5] & ~inst[4] & inst[3] & ~inst[2] | ~inst[31] & ~inst[29] & inst[28]) | inst[27] & ~inst[31] & ~inst[29]) & ~inst[26] | ~inst[31] & ~inst[29] & inst[26] + ctrl['BJRJ'] = ~inst[26] & (~inst[27] & ~inst[30] & (~inst[28] & ~inst[31] & ~inst[29] & inst[3] & ~inst[1] & ~inst[4] & ~inst[2] | inst[28] & ~inst[31] & ~inst[29]) | inst[27] & ~inst[31] & ~inst[29]) | inst[26] & ~inst[31] & ~inst[29] ctrl['B'] = ~inst[31] & ~inst[29] & (inst[28] | ~inst[27] & inst[26]) - ctrl['JR'] = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & ~inst[4] & inst[3] & ~inst[2] + ctrl['JR'] = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[4] & inst[3] & ~inst[2] & ~inst[1] ctrl['J'] = ~inst[31] & ~inst[29] & ~inst[28] & inst[27] ctrl['PRV'] = ~inst[31] & inst[30] & ~inst[29] @@ -107,34 +109,35 @@ for inst, name in table: ctrl['ERET'] = ~inst[31] & inst[30] & inst[4] ctrl['OFA'] = ~inst[31] & ~inst[28] & ~inst[27] & ~inst[26] & (~inst[30] & inst[5] & ~inst[3] & ~inst[2] & ~inst[0] | inst[29]) - ctrl['ES'] = (~inst[30] & (~inst[28] & ~inst[27] & ~inst[26] & ((inst[4] & inst[3] & ~inst[2] | ~inst[3] & inst[2]) | inst[5]) | inst[31]) | inst[29]) - ctrl['ET'] = ~inst[27] & ~inst[26] & (~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & (~inst[1] & (~inst[0] & (~inst[3] & ~inst[4] | inst[3] & inst[4]) | inst[4] & inst[3] & inst[0]) | inst[1] & (~inst[4] | inst[3]) | inst[5]) | inst[30] & inst[29]) - ctrl['DS'] = ~inst[26] & (~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[5] & ~inst[4] & inst[3] & ~inst[2] | ~inst[31] & ~inst[29] & inst[28]) | ~inst[31] & ~inst[29] & (inst[28] | ~inst[27]) & inst[26] - ctrl['DT'] = ~inst[31] & ~inst[29] & inst[28] & ~inst[27] + ctrl['ES'] = ~inst[30] & (~inst[28] & ~inst[27] & ~inst[26] & (~inst[3] & inst[2] | inst[3] & (inst[4] | inst[1]) | inst[5]) | inst[31]) | inst[29] + ctrl['ET'] = ~inst[31] & ~inst[27] & ~inst[26] & (~inst[30] & ~inst[29] & ~inst[28] & (~inst[3] & ~inst[4] | inst[3] & inst[4] | inst[5]) | inst[30] & inst[29]) + ctrl['DS'] = ~inst[26] & (~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[4] & inst[3] & ~inst[2] & ~inst[1] | inst[28] & ~inst[29] & ~inst[31]) | inst[26] & ~inst[31] & ~inst[29] & (~inst[27] | inst[28]) + ctrl['DT'] = ~inst[28] & ~inst[26] & ~inst[30] & ~inst[31] & ~inst[29] & ~inst[27] & inst[3] & inst[1] & ~inst[5] & ~inst[4] | inst[28] & ~inst[29] & ~inst[31] & ~inst[27] ctrl['DP0'] = ~inst[31] & (~inst[30] | inst[29] | ~inst[25] | inst[4]) | inst[31] & inst[30] ctrl['DP1'] = inst[26] | (~inst[30] & (inst[31] | inst[29] | inst[28] | inst[27] | ~inst[4]) | inst[30] & (~inst[29] & inst[25] | inst[3])) ctrl['ECtrl_OP_f_sl'] = ~inst[31] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & ~inst[3] & ~inst[1] - ctrl['ECtrl_OP_f_sr'] = ~inst[31] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & inst[1] - ctrl['ECtrl_OP_f_add'] = inst[31] | ~inst[28] & (~inst[26] & ~inst[27] & (inst[29] | ~inst[5] & inst[3] & ~inst[1] | inst[5] & ~inst[3] & ~inst[2]) | inst[26] & (~inst[29] | ~inst[27])) - ctrl['ECtrl_OP_f_and'] = ~inst[31] & (~inst[28] & ~inst[29] & ~inst[27] & ~inst[26] & inst[5] & inst[2] & ~inst[0] & ~inst[1] | inst[28] & ~inst[27] & ~inst[26]) - ctrl['ECtrl_OP_f_or'] = ~inst[31] & (~inst[28] & ~inst[29] & ~inst[27] & ~inst[26] & inst[5] & inst[2] & inst[0] | inst[28] & ~inst[27] & inst[26]) - ctrl['ECtrl_OP_f_xor'] = ~inst[31] & (~inst[28] & ~inst[29] & ~inst[27] & ~inst[26] & inst[5] & inst[2] & ~inst[0] & inst[1] | inst[28] & inst[27]) + ctrl['ECtrl_OP_f_sr'] = ~inst[31] & ~inst[28] & ~inst[26] & ~inst[27] & ~inst[29] & ~inst[5] & ~inst[3] & inst[1] + ctrl['ECtrl_OP_f_add'] = ~inst[28] & (~inst[27] & ~inst[26] & ((~inst[5] & inst[3] & ~inst[1] | inst[5] & ~inst[3] & ~inst[2]) | inst[29]) | inst[26] & (~inst[29] | ~inst[27])) | inst[31] + ctrl['ECtrl_OP_f_and'] = ~inst[31] & (~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[5] & inst[2] & ~inst[1] & ~inst[0] | inst[28] & ~inst[27] & ~inst[26]) + ctrl['ECtrl_OP_f_or'] = ~inst[31] & (~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[5] & inst[2] & inst[0] | inst[28] & ~inst[27] & inst[26]) + ctrl['ECtrl_OP_f_xor'] = ~inst[31] & (~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[5] & inst[2] & inst[1] & ~inst[0] | inst[28] & inst[27]) ctrl['ECtrl_OP_f_slt'] = ~inst[31] & ~inst[28] & ~inst[26] & (~inst[29] & inst[5] & inst[3] & ~inst[2] & ~inst[0] | inst[27]) - ctrl['ECtrl_OP_f_sltu'] = ~inst[31] & ~inst[28] & (~inst[26] & ~inst[29] & ~inst[27] & inst[5] & inst[3] & ~inst[2] & inst[0] | inst[26] & inst[29] & inst[27]) + ctrl['ECtrl_OP_f_sltu'] = ~inst[31] & ~inst[28] & (~inst[29] & ~inst[27] & ~inst[26] & inst[5] & inst[3] & ~inst[2] & inst[0] | inst[29] & inst[27] & inst[26]) + ctrl['ECtrl_OP_f_mova'] = ~inst[31] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & inst[3] & inst[1] ctrl['ECtrl_OP_alt'] = ~inst[31] & (~inst[26] & (~inst[29] & inst[1] & (inst[5] | inst[0]) | inst[27]) | inst[26] & inst[29] & inst[27]) - ctrl['ECtrl_SA'] = (inst[31] | inst[29] | ~inst[26] & (inst[5] | inst[2]), inst[31] | (~inst[28] & (inst[29] | inst[26] | inst[5] | inst[3] | inst[2]) | inst[28] & (~inst[27] | ~inst[26]))) + ctrl['ECtrl_SA'] = (~inst[26] & ((inst[3] & inst[1] | inst[2]) | inst[5]) | inst[31] | inst[29], (~inst[28] & (inst[29] | inst[26] | inst[5] | inst[3] | inst[2]) | inst[28] & (~inst[27] | ~inst[26])) | inst[31]) ctrl['ECtrl_SB'] = (inst[31] | inst[29], inst[26] | ~inst[5] & inst[3]) ctrl['imm'] = (~inst[31] & inst[28] & inst[27] & inst[26], inst[31] | ~inst[28]) ctrl['MCtrl0_HW'] = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (~inst[1] & inst[0] | inst[3]) | inst[30] & inst[29] & ~inst[1] ctrl['MCtrl0_LW'] = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (inst[1] & inst[0] | inst[3]) | inst[30] & inst[29] & ~inst[1] - ctrl['MCtrl0_HLS'] = (~inst[27] & ~inst[26] & (~inst[30] & ~inst[31] & ~inst[29] & ~inst[28] & inst[4] & inst[3] | inst[30] & inst[29]), ~inst[30] & inst[1], inst[0]) + ctrl['MCtrl0_HLS'] = (~inst[30] & ~inst[26] & ~inst[27] & ~inst[31] & ~inst[29] & ~inst[28] & inst[4] & inst[3] | inst[30] & inst[29]), inst[1] & ~inst[30], inst[0] ctrl['MCtrl0_MAS'] = (inst[2], inst[30] & ~inst[2] & ~inst[1]) ctrl['MCtrl0_C0W'] = ~inst[31] & inst[30] & ~inst[29] & inst[23] & ~inst[3] - ctrl['MCtrl0_RS0'] = (ctrl['DP1'], inst[30], ~inst[29] & (inst[30] | ~inst[1])) + ctrl['MCtrl0_RS0'] = (~inst[30] & (~inst[4] | inst[26] | inst[29]), inst[30], ~inst[29] & (~inst[1] | inst[30])) ctrl['MCtrl1_MR'] = inst[31] & ~inst[30] ctrl['MCtrl1_MWR'] = inst[29] @@ -146,6 +149,7 @@ for inst, name in table: ctrl['MCtrl1_TLBP'] = ~inst[31] & inst[30] & ~inst[4] & inst[3] ctrl['MCtrl1_CACHE_OP'] = (inst[29] & inst[28] & inst[26] & inst[16], inst[29] & inst[28] & inst[26] & ~inst[20], inst[29] & inst[28] & inst[26] & ~inst[18] & (inst[20] | inst[19] | ~inst[16])) - ctrl['WCtrl_RW'] = ~inst[30] & (~inst[27] & (~inst[26] & (~inst[31] & (~inst[28] & (~inst[3] & (~inst[4] | ~inst[0]) | inst[3] & (~inst[4] & ~inst[2] & inst[0] | inst[5])) | inst[29]) | inst[31] & ~inst[29]) | inst[26] & (~inst[31] & (~inst[28] & inst[20] | inst[29]) | inst[31] & ~inst[29])) | inst[27] & (~inst[26] & (~inst[31] & inst[29] | inst[31] & ~inst[29]) | inst[26] & (~inst[31] & (~inst[28] | inst[29]) | inst[31] & ~inst[29]))) | inst[30] & ~inst[31] & ~inst[3] & (~inst[29] & ~inst[25] & ~inst[23] | inst[29] & inst[1]) - ctrl['RD'] = (~inst[29] & inst[30] | inst[29] & ~inst[30] | inst[31], inst[26]) + ctrl['WCtrl_MOV'] = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & ~inst[4] & inst[3] & ~inst[2] & inst[1] + ctrl['WCtrl_RW'] = (~inst[30] & (~inst[27] & (~inst[26] & (~inst[31] & (~inst[28] & (~inst[4] & (~inst[3] | ~inst[2] & (inst[1] | inst[0])) | inst[4] & ~inst[3] & ~inst[0]) | inst[29]) | inst[31] & ~inst[29]) | inst[26] & (~inst[31] & (~inst[28] & inst[20] | inst[29]) | inst[31] & ~inst[29])) | inst[27] & (~inst[31] & (~inst[28] & inst[26] | inst[29]) | inst[31] & ~inst[29])) | ~inst[31] & inst[30] & ~inst[3] & (~inst[29] & ~inst[25] & ~inst[23] | inst[29] & inst[1])) + ctrl['RD'] = (~inst[29] & inst[30] | inst[29] & ~inst[30] | inst[31], inst[26]) print(ctrl) diff --git a/tools/ectrl.txt b/tools/ectrl.txt index 71d125c..74888ac 100644 --- a/tools/ectrl.txt +++ b/tools/ectrl.txt @@ -6,6 +6,8 @@ 32'b000000???????????????00000000100 SL ? RS 1 1 RT 0 0 ? ? ? // SLLV 32'b000000???????????????00000000110 SR 0 RS 1 1 RT 0 0 ? ? ? // SRLV 32'b000000???????????????00000000111 SR 1 RS 1 1 RT 0 0 ? ? ? // SRAV +32'b000000???????????????00000001010 MOVA ? RS 1 1 ? ? ? ? ? ? // MOVZ +32'b000000???????????????00000001011 MOVA ? RS 1 1 ? ? ? ? ? ? // MOVN 32'b000000?????000000000000000001000 ? ? ? ? ? ? ? ? ? ? ? // JR 32'b000000?????00000?????00000001001 ADD 0 PC 0 1 EIGHT 0 1 ? ? ? // JALR 32'b000000????????????????????001100 ? ? ? ? ? ? ? ? ? ? ? // SYSCALL diff --git a/tools/global.txt b/tools/global.txt index 1c41b80..ee41f87 100644 --- a/tools/global.txt +++ b/tools/global.txt @@ -6,6 +6,8 @@ 32'b000000???????????????00000000100 0 0 0 0 1 1 0 0 1 1 // SLLV 32'b000000???????????????00000000110 0 0 0 0 1 1 0 0 1 1 // SRLV 32'b000000???????????????00000000111 0 0 0 0 1 1 0 0 1 1 // SRAV +32'b000000???????????????00000001010 0 0 0 0 1 0 0 1 1 1 // MOVZ +32'b000000???????????????00000001011 0 0 0 0 1 0 0 1 1 1 // MOVN 32'b000000?????000000000000000001000 0 0 0 0 0 0 1 0 1 1 // JR 32'b000000?????00000?????00000001001 0 0 0 0 0 0 1 0 1 1 // JALR 32'b000000????????????????????001100 1 0 0 0 0 0 0 0 1 1 // SYSCALL diff --git a/tools/mctrl0.txt b/tools/mctrl0.txt index fc9f549..b5e0c15 100644 --- a/tools/mctrl0.txt +++ b/tools/mctrl0.txt @@ -6,6 +6,8 @@ 32'b000000???????????????00000000100 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // SLLV 32'b000000???????????????00000000110 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // SRLV 32'b000000???????????????00000000111 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // SRAV +32'b000000???????????????00000001010 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // MOVZ +32'b000000???????????????00000001011 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // MOVN 32'b000000?????000000000000000001000 0 0 ? 0 ? ? ? ? ? 0 ? ? ? ? // JR 32'b000000?????00000?????00000001001 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // JALR 32'b000000????????????????????001100 0 0 ? 0 ? ? ? ? ? 0 ? ? ? ? // SYSCALL diff --git a/tools/mctrl1.txt b/tools/mctrl1.txt index 6111647..2cde4e0 100644 --- a/tools/mctrl1.txt +++ b/tools/mctrl1.txt @@ -6,6 +6,8 @@ 32'b000000???????????????00000000100 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // SLLV 32'b000000???????????????00000000110 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // SRLV 32'b000000???????????????00000000111 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // SRAV +32'b000000???????????????00000001010 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // MOVZ +32'b000000???????????????00000001011 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // MOVN 32'b000000?????000000000000000001000 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // JR 32'b000000?????00000?????00000001001 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // JALR 32'b000000????????????????????001100 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // SYSCALL diff --git a/tools/pcs.txt b/tools/pcs.txt index c03017f..6685032 100644 --- a/tools/pcs.txt +++ b/tools/pcs.txt @@ -6,6 +6,8 @@ 32'b000000???????????????00000000100 0 0 0 0 // SLLV 32'b000000???????????????00000000110 0 0 0 0 // SRLV 32'b000000???????????????00000000111 0 0 0 0 // SRAV +32'b000000???????????????00000001010 0 0 0 0 // MOVZ +32'b000000???????????????00000001011 0 0 0 0 // MOVN 32'b000000?????000000000000000001000 1 0 1 0 // JR 32'b000000?????00000?????00000001001 1 0 1 0 // JALR 32'b000000????????????????????001100 0 0 0 0 // SYSCALL diff --git a/tools/privilege.txt b/tools/privilege.txt index 0c86eb6..200ca0e 100644 --- a/tools/privilege.txt +++ b/tools/privilege.txt @@ -6,6 +6,8 @@ 32'b000000???????????????00000000100 0 // SLLV 32'b000000???????????????00000000110 0 // SRLV 32'b000000???????????????00000000111 0 // SRAV +32'b000000???????????????00000001010 0 // MOVZ +32'b000000???????????????00000001011 0 // MOVN 32'b000000?????000000000000000001000 0 // JR 32'b000000?????00000?????00000001001 0 // JALR 32'b000000????????????????????001100 0 // SYSCALL diff --git a/tools/wctrl.txt b/tools/wctrl.txt index cabb946..7c6c84f 100644 --- a/tools/wctrl.txt +++ b/tools/wctrl.txt @@ -1,74 +1,76 @@ -////-------------------------------- RW RD RD1 RD0 -32'b000000000000000000000?????001111 0 ? ? ? // SYNC (NOP) -32'b00000000000???????????????000000 1 RD 0 0 // SLL -32'b00000000000???????????????000010 1 RD 0 0 // SRL -32'b00000000000???????????????000011 1 RD 0 0 // SRA -32'b000000???????????????00000000100 1 RD 0 0 // SLLV -32'b000000???????????????00000000110 1 RD 0 0 // SRLV -32'b000000???????????????00000000111 1 RD 0 0 // SRAV -32'b000000?????000000000000000001000 0 ? ? ? // JR -32'b000000?????00000?????00000001001 1 RD 0 0 // JALR -32'b000000????????????????????001100 0 ? ? ? // SYSCALL -32'b000000????????????????????001101 0 ? ? ? // BREAK -32'b0000000000000000?????00000010000 1 RD 0 0 // MFHI -32'b000000?????000000000000000010001 0 ? ? ? // MTHI -32'b0000000000000000?????00000010010 1 RD 0 0 // MFLO -32'b000000?????000000000000000010011 0 ? ? ? // MTLO -32'b000000??????????0000000000011000 0 ? ? ? // MULT -32'b000000??????????0000000000011001 0 ? ? ? // MULTU -32'b000000??????????0000000000011010 0 ? ? ? // DIV -32'b000000??????????0000000000011011 0 ? ? ? // DIVU -32'b000000???????????????00000100000 1 RD 0 0 // ADD -32'b000000???????????????00000100001 1 RD 0 0 // ADDU -32'b000000???????????????00000100010 1 RD 0 0 // SUB -32'b000000???????????????00000100011 1 RD 0 0 // SUBU -32'b000000???????????????00000100100 1 RD 0 0 // AND -32'b000000???????????????00000100101 1 RD 0 0 // OR -32'b000000???????????????00000100110 1 RD 0 0 // XOR -32'b000000???????????????00000100111 1 RD 0 0 // NOR -32'b000000???????????????00000101010 1 RD 0 0 // SLT -32'b000000???????????????00000101011 1 RD 0 0 // SLTU -32'b000001?????00000???????????????? 0 ? ? ? // BLTZ -32'b000001?????10000???????????????? 1 31 0 1 // BLTZAL -32'b000001?????00001???????????????? 0 ? ? ? // BGEZ -32'b000001?????10001???????????????? 1 31 0 1 // BGEZAL -32'b000010?????????????????????????? 0 ? ? ? // J -32'b000011?????????????????????????? 1 31 0 1 // JAL -32'b000100?????????????????????????? 0 ? ? ? // BEQ -32'b000101?????????????????????????? 0 ? ? ? // BNE -32'b000110?????00000???????????????? 0 ? ? ? // BLEZ -32'b000111?????00000???????????????? 0 ? ? ? // BGTZ -32'b001000?????????????????????????? 1 RT 1 ? // ADDI -32'b001001?????????????????????????? 1 RT 1 ? // ADDIU -32'b001010?????????????????????????? 1 RT 1 ? // SLTI -32'b001011?????????????????????????? 1 RT 1 ? // SLTIU -32'b001100?????????????????????????? 1 RT 1 ? // ANDI -32'b001101?????????????????????????? 1 RT 1 ? // ORI -32'b001110?????????????????????????? 1 RT 1 ? // XORI -32'b00111100000????????????????????? 1 RT 1 ? // LUI -32'b01000000000??????????00000000??? 1 RT 1 ? // MFC0 -32'b01000000100??????????00000000??? 0 ? ? ? // MTC0 -32'b01000010000000000000000000000001 0 ? ? ? // TLBR -32'b01000010000000000000000000000010 0 ? ? ? // TLBWI -32'b01000010000000000000000000000110 0 ? ? ? // TLBWR -32'b01000010000000000000000000001000 0 ? ? ? // TLBP -32'b01000010000000000000000000011000 0 ? ? ? // ERET -32'b011100??????????0000000000000000 0 ? ? ? // MADD -32'b011100??????????0000000000000001 0 ? ? ? // MADDU -32'b011100??????????0000000000000100 0 ? ? ? // MSUB -32'b011100??????????0000000000000101 0 ? ? ? // MSUBU -32'b011100???????????????00000000010 1 RD 0 0 // MUL -32'b100000?????????????????????????? 1 RT 1 ? // LB -32'b100001?????????????????????????? 1 RT 1 ? // LH -32'h100010?????????????????????????? 1 RT 1 ? // LWL -32'b100011?????????????????????????? 1 RT 1 ? // LW -32'b100100?????????????????????????? 1 RT 1 ? // LBU -32'b100101?????????????????????????? 1 RT 1 ? // LHU -32'h100110?????????????????????????? 1 RT 1 ? // LWR -32'b101000?????????????????????????? 0 ? ? ? // SB -32'b101001?????????????????????????? 0 ? ? ? // SH -32'b101010?????????????????????????? 0 ? ? ? // SWL -32'b101011?????????????????????????? 0 ? ? ? // SW -32'b101110?????????????????????????? 0 ? ? ? // SWR -32'b101111?????????????????????????? 0 ? ? ? // CACHE -32'b110011?????????????????????????? 0 ? ? ? // PREF (NOP) \ No newline at end of file +////-------------------------------- MOV RW RD RD1 RD0 +32'b000000000000000000000?????001111 0 0 ? ? ? // SYNC (NOP) +32'b00000000000???????????????000000 0 1 RD 0 0 // SLL +32'b00000000000???????????????000010 0 1 RD 0 0 // SRL +32'b00000000000???????????????000011 0 1 RD 0 0 // SRA +32'b000000???????????????00000000100 0 1 RD 0 0 // SLLV +32'b000000???????????????00000000110 0 1 RD 0 0 // SRLV +32'b000000???????????????00000000111 0 1 RD 0 0 // SRAV +32'b000000???????????????00000001010 1 1 RD 0 0 // MOVZ +32'b000000???????????????00000001011 1 1 RD 0 0 // MOVN +32'b000000?????000000000000000001000 0 0 ? ? ? // JR +32'b000000?????00000?????00000001001 0 1 RD 0 0 // JALR +32'b000000????????????????????001100 0 0 ? ? ? // SYSCALL +32'b000000????????????????????001101 0 0 ? ? ? // BREAK +32'b0000000000000000?????00000010000 0 1 RD 0 0 // MFHI +32'b000000?????000000000000000010001 0 0 ? ? ? // MTHI +32'b0000000000000000?????00000010010 0 1 RD 0 0 // MFLO +32'b000000?????000000000000000010011 0 0 ? ? ? // MTLO +32'b000000??????????0000000000011000 0 0 ? ? ? // MULT +32'b000000??????????0000000000011001 0 0 ? ? ? // MULTU +32'b000000??????????0000000000011010 0 0 ? ? ? // DIV +32'b000000??????????0000000000011011 0 0 ? ? ? // DIVU +32'b000000???????????????00000100000 0 1 RD 0 0 // ADD +32'b000000???????????????00000100001 0 1 RD 0 0 // ADDU +32'b000000???????????????00000100010 0 1 RD 0 0 // SUB +32'b000000???????????????00000100011 0 1 RD 0 0 // SUBU +32'b000000???????????????00000100100 0 1 RD 0 0 // AND +32'b000000???????????????00000100101 0 1 RD 0 0 // OR +32'b000000???????????????00000100110 0 1 RD 0 0 // XOR +32'b000000???????????????00000100111 0 1 RD 0 0 // NOR +32'b000000???????????????00000101010 0 1 RD 0 0 // SLT +32'b000000???????????????00000101011 0 1 RD 0 0 // SLTU +32'b000001?????00000???????????????? 0 0 ? ? ? // BLTZ +32'b000001?????10000???????????????? 0 1 31 0 1 // BLTZAL +32'b000001?????00001???????????????? 0 0 ? ? ? // BGEZ +32'b000001?????10001???????????????? 0 1 31 0 1 // BGEZAL +32'b000010?????????????????????????? 0 0 ? ? ? // J +32'b000011?????????????????????????? 0 1 31 0 1 // JAL +32'b000100?????????????????????????? 0 0 ? ? ? // BEQ +32'b000101?????????????????????????? 0 0 ? ? ? // BNE +32'b000110?????00000???????????????? 0 0 ? ? ? // BLEZ +32'b000111?????00000???????????????? 0 0 ? ? ? // BGTZ +32'b001000?????????????????????????? 0 1 RT 1 ? // ADDI +32'b001001?????????????????????????? 0 1 RT 1 ? // ADDIU +32'b001010?????????????????????????? 0 1 RT 1 ? // SLTI +32'b001011?????????????????????????? 0 1 RT 1 ? // SLTIU +32'b001100?????????????????????????? 0 1 RT 1 ? // ANDI +32'b001101?????????????????????????? 0 1 RT 1 ? // ORI +32'b001110?????????????????????????? 0 1 RT 1 ? // XORI +32'b00111100000????????????????????? 0 1 RT 1 ? // LUI +32'b01000000000??????????00000000??? 0 1 RT 1 ? // MFC0 +32'b01000000100??????????00000000??? 0 0 ? ? ? // MTC0 +32'b01000010000000000000000000000001 0 0 ? ? ? // TLBR +32'b01000010000000000000000000000010 0 0 ? ? ? // TLBWI +32'b01000010000000000000000000000110 0 0 ? ? ? // TLBWR +32'b01000010000000000000000000001000 0 0 ? ? ? // TLBP +32'b01000010000000000000000000011000 0 0 ? ? ? // ERET +32'b011100??????????0000000000000000 0 0 ? ? ? // MADD +32'b011100??????????0000000000000001 0 0 ? ? ? // MADDU +32'b011100??????????0000000000000100 0 0 ? ? ? // MSUB +32'b011100??????????0000000000000101 0 0 ? ? ? // MSUBU +32'b011100???????????????00000000010 0 1 RD 0 0 // MUL +32'b100000?????????????????????????? 0 1 RT 1 ? // LB +32'b100001?????????????????????????? 0 1 RT 1 ? // LH +32'h100010?????????????????????????? 0 1 RT 1 ? // LWL +32'b100011?????????????????????????? 0 1 RT 1 ? // LW +32'b100100?????????????????????????? 0 1 RT 1 ? // LBU +32'b100101?????????????????????????? 0 1 RT 1 ? // LHU +32'h100110?????????????????????????? 0 1 RT 1 ? // LWR +32'b101000?????????????????????????? 0 0 ? ? ? // SB +32'b101001?????????????????????????? 0 0 ? ? ? // SH +32'b101010?????????????????????????? 0 0 ? ? ? // SWL +32'b101011?????????????????????????? 0 0 ? ? ? // SW +32'b101110?????????????????????????? 0 0 ? ? ? // SWR +32'b101111?????????????????????????? 0 0 ? ? ? // CACHE +32'b110011?????????????????????????? 0 0 ? ? ? // PREF (NOP) \ No newline at end of file From a0d3367f34cd267a91a0a42c41441f18ecea5196 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Tue, 7 Sep 2021 19:53:53 +0800 Subject: [PATCH 43/56] update ALU and test --- .../2021/soft/func/inst/n100_movz_movn.S | 51 +++++++++++++++++++ resources/2021/soft/func/start.S | 47 +++++++++-------- src/Core/ALU.sv | 3 +- src/Core/Datapath.sv | 4 +- src/include/defines.svh | 1 + 5 files changed, 81 insertions(+), 25 deletions(-) create mode 100644 resources/2021/soft/func/inst/n100_movz_movn.S diff --git a/resources/2021/soft/func/inst/n100_movz_movn.S b/resources/2021/soft/func/inst/n100_movz_movn.S new file mode 100644 index 0000000..dab867a --- /dev/null +++ b/resources/2021/soft/func/inst/n100_movz_movn.S @@ -0,0 +1,51 @@ +#include +#include +#include + +LEAF(n100_movz_movn_test) + .set noreorder + addiu s0, s0 ,1 + li s2, 0x0 +###test inst + li a0, 0xAAAAAAAA # RD + li v0, 0xAAAAAAAA # RD REF + li a1, 0x12345678 # RS + li v1, 0 # RT + + li v1, 0 + add a0, v0, zero + movn a0, a1, v1 + bne a0, v0, inst_error + nop + + li v1, 1 + add a0, v0, zero + movn a0, a1, v1 + bne a0, a1, inst_error + nop + + li v1, 0 + add a0, v0, zero + movz a0, a1, v1 + bne a0, a1, inst_error + nop + + li v1, 1 + add a0, v0, zero + movz a0, a1, v1 + bne a0, v0, inst_error + nop + +###detect exception + bne s2, zero, inst_error + nop +###score ++ + addiu s3, s3, 1 +###output (s0<<24)|s3 +inst_error: + sll t1, s0, 24 + or t0, t1, s3 + sw t0, 0(s1) + jr ra + nop +END(n100_movz_movn_test) diff --git a/resources/2021/soft/func/start.S b/resources/2021/soft/func/start.S index cea091c..90ed46d 100644 --- a/resources/2021/soft/func/start.S +++ b/resources/2021/soft/func/start.S @@ -2,7 +2,7 @@ #include #include -#define TEST_NUM 99 +#define TEST_NUM 100 ##s0, number @@ -298,27 +298,6 @@ inst_test: jr t9 #kseg0 -> kseg1 nop ##### kseg0_kseg1: - - jal n98_cache_dcache_test - nop - jal wait_1s - nop - - la t1, n99_kseg1_kseg0 - li t2, 0x20000000 - subu t9, t1, t2 - jr t9 - nop -n99_kseg1_kseg0: - jal n99_cache_icache_test - nop - jal wait_1s - nop - la t9, n99_kseg0_kseg1 - jr t9 - nop -n99_kseg0_kseg1: - jal n2_addu_test #addu nop jal wait_1s @@ -703,6 +682,30 @@ n99_kseg0_kseg1: nop jal wait_1s nop + jal n98_cache_dcache_test + nop + jal wait_1s + nop + + la t1, n99_kseg1_kseg0 + li t2, 0x20000000 + subu t9, t1, t2 + jr t9 + nop +n99_kseg1_kseg0: + jal n99_cache_icache_test + nop + jal wait_1s + nop + la t9, n99_kseg0_kseg1 + jr t9 + nop +n99_kseg0_kseg1: + + jal n100_movz_movn_test + nop + jal wait_1s + nop ###check io access LI (a0, IO_SIMU_ADDR) diff --git a/src/Core/ALU.sv b/src/Core/ALU.sv index dc35ae1..b8b5582 100644 --- a/src/Core/ALU.sv +++ b/src/Core/ALU.sv @@ -25,6 +25,7 @@ module ALU( | (aluctrl.f_or ? alt ? ~(a | b) : a | b : 32'b0) | (aluctrl.f_xor ? a ^ b : 32'b0) | (aluctrl.f_slt ? {31'b0, lt } : 32'b0) - | (aluctrl.f_sltu ? {31'b0, ltu} : 32'b0); + | (aluctrl.f_sltu ? {31'b0, ltu} : 32'b0) + | (aluctrl.f_mova ? a : 32'b0); assign overflow = lt ^ sum[31]; endmodule diff --git a/src/Core/Datapath.sv b/src/Core/Datapath.sv index 40a2bd1..f5f439a 100644 --- a/src/Core/Datapath.sv +++ b/src/Core/Datapath.sv @@ -717,7 +717,7 @@ module Datapath ( E.en, {E.I0.imm, E.I0.sa} ); - ffen #(13) E_I0_ECtrl_ff ( + ffen #(14) E_I0_ECtrl_ff ( clk, D.I0.ECtrl, E.en, @@ -780,7 +780,7 @@ module Datapath ( E.en, {E.I1.imm, E.I1.sa} ); - ffen #(13) E_I1_ECtrl_ff ( + ffen #(14) E_I1_ECtrl_ff ( clk, D.I1.ECtrl, E.en, diff --git a/src/include/defines.svh b/src/include/defines.svh index d86bc0e..72fed70 100644 --- a/src/include/defines.svh +++ b/src/include/defines.svh @@ -39,6 +39,7 @@ typedef struct packed { logic f_xor; logic f_slt; logic f_sltu; + logic f_mova; logic alt; } aluctrl_t; From ab1b2ad13dcf9b17a2be5d32aba064246166a72f Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Sun, 12 Sep 2021 19:48:56 +0800 Subject: [PATCH 44/56] fix CP0 --- src/CP0/CP0.sv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CP0/CP0.sv b/src/CP0/CP0.sv index 7a03c2a..b1a3e82 100644 --- a/src/CP0/CP0.sv +++ b/src/CP0/CP0.sv @@ -166,7 +166,7 @@ module CP0 ( 9: rf_cp0.Count = wdata; 8: rf_cp0.BadVAddr = wdata; // 7: rf_cp0.HWREna = wdata; - 6: rf_cp0.Wired = {29'b0, wdata[2:0]}; + 6: rf_cp0.Wired.Wired = wdata[2:0]; // 5: rf_cp0.PageMask.Mask = wdata[24:13]; // 4: rf_cp0.Context = wdata; 3: begin From a1bbfa0a0ceee91617f1d44153f10cb527172789 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Tue, 21 Sep 2021 17:15:30 +0800 Subject: [PATCH 45/56] make linter happy --- model/DCData_bram.v | 17 ++ model/DCTag_bram.v | 17 ++ model/ICData_bram.v | 16 ++ model/ICTag_bram.v | 17 ++ src/AXI/AXI.sv | 1 - src/AXI/AXIRead_i.sv | 9 + src/AXI/AXIWrite_i.sv | 9 + src/Cache/DCache.sv | 4 +- src/Cache/DCache_i.sv | 37 +++ src/Cache/ICache.sv | 2 +- src/Cache/ICache_i.sv | 29 ++ src/Core/Datapath.sv | 1 - .../{Gadgets.sv => Gadgets/instr_valid.sv} | 125 --------- src/Core/Gadgets/memerror.sv | 23 ++ src/Core/Gadgets/memoutput.sv | 60 ++++ src/Core/Gadgets/pcenr.sv | 13 + src/Gadgets.sv | 263 ------------------ src/Gadgets/extender.sv | 12 + src/Gadgets/ffen.sv | 11 + src/Gadgets/ffenr.sv | 14 + src/Gadgets/ffenrc.sv | 15 + src/Gadgets/mux2.sv | 12 + src/Gadgets/mux3.sv | 13 + src/Gadgets/mux4.sv | 14 + src/Gadgets/mux5.sv | 15 + src/Gadgets/mux6.sv | 25 ++ src/Gadgets/myBuffer.sv | 32 +++ src/Gadgets/myBuffer0.sv | 15 + src/Gadgets/onehot_bin16.sv | 9 + src/Gadgets/onehot_bin32.sv | 9 + src/Gadgets/onehot_bin4.sv | 6 + src/Gadgets/onehot_bin8.sv | 9 + src/Gadgets/prio_mux4.sv | 14 + src/Gadgets/prio_mux5.sv | 15 + src/MMU/MMU.sv | 5 +- src/MMU/SRAM_RO_AXI_i.sv | 17 ++ src/MMU/SRAM_W_AXI_i.sv | 20 ++ src/MMU/TLB.sv | 59 ---- src/MMU/TLB_Lookup.sv | 60 ++++ src/MMU/sram_i.sv | 17 ++ src/MMU/sramro_i.sv | 15 + src/MyCPU.sv | 1 - src/include/AXI.svh | 17 -- src/include/DCache.svh | 36 --- src/include/ICache.svh | 28 -- src/include/sram.svh | 71 ----- 46 files changed, 624 insertions(+), 605 deletions(-) create mode 100644 model/DCData_bram.v create mode 100644 model/DCTag_bram.v create mode 100644 model/ICData_bram.v create mode 100644 model/ICTag_bram.v create mode 100644 src/AXI/AXIRead_i.sv create mode 100644 src/AXI/AXIWrite_i.sv create mode 100644 src/Cache/DCache_i.sv create mode 100644 src/Cache/ICache_i.sv rename src/Core/{Gadgets.sv => Gadgets/instr_valid.sv} (65%) create mode 100644 src/Core/Gadgets/memerror.sv create mode 100644 src/Core/Gadgets/memoutput.sv create mode 100644 src/Core/Gadgets/pcenr.sv delete mode 100644 src/Gadgets.sv create mode 100644 src/Gadgets/extender.sv create mode 100644 src/Gadgets/ffen.sv create mode 100644 src/Gadgets/ffenr.sv create mode 100644 src/Gadgets/ffenrc.sv create mode 100644 src/Gadgets/mux2.sv create mode 100644 src/Gadgets/mux3.sv create mode 100644 src/Gadgets/mux4.sv create mode 100644 src/Gadgets/mux5.sv create mode 100644 src/Gadgets/mux6.sv create mode 100644 src/Gadgets/myBuffer.sv create mode 100644 src/Gadgets/myBuffer0.sv create mode 100644 src/Gadgets/onehot_bin16.sv create mode 100644 src/Gadgets/onehot_bin32.sv create mode 100644 src/Gadgets/onehot_bin4.sv create mode 100644 src/Gadgets/onehot_bin8.sv create mode 100644 src/Gadgets/prio_mux4.sv create mode 100644 src/Gadgets/prio_mux5.sv create mode 100644 src/MMU/SRAM_RO_AXI_i.sv create mode 100644 src/MMU/SRAM_W_AXI_i.sv create mode 100644 src/MMU/TLB_Lookup.sv create mode 100644 src/MMU/sram_i.sv create mode 100644 src/MMU/sramro_i.sv delete mode 100644 src/include/sram.svh diff --git a/model/DCData_bram.v b/model/DCData_bram.v new file mode 100644 index 0000000..027925d --- /dev/null +++ b/model/DCData_bram.v @@ -0,0 +1,17 @@ +module DCData_bram ( + input [ 6:0] addra, + input clka, + input [127:0] dina, + output [127:0] douta, + input wea +); + + reg [127:0] ram [0:127]; + always @(posedge CLK) begin + if(wea) begin + ram[addra] <= dina; + end + douta <= ~wea ? ram[addra] : {128{$random}}; + end + +endmodule diff --git a/model/DCTag_bram.v b/model/DCTag_bram.v new file mode 100644 index 0000000..030bf8e --- /dev/null +++ b/model/DCTag_bram.v @@ -0,0 +1,17 @@ +module DCTag_bram ( + input [ 6:0] addra, + input clka, + input [22:0] dina, + output [22:0] douta, + input wea +); + + reg [22:0] ram [0:127]; + always @(posedge CLK) begin + if(wea) begin + ram[addra] <= dina; + end + douta <= ~wea ? ram[addra] : {23{$random}}; + end + +endmodule diff --git a/model/ICData_bram.v b/model/ICData_bram.v new file mode 100644 index 0000000..7778312 --- /dev/null +++ b/model/ICData_bram.v @@ -0,0 +1,16 @@ +module ICData_bram ( + input [ 5:0] addra, + input clka, + input [255:0] dina, + output [255:0] douta, + input wea +); + reg [255:0] ram [0:63]; + always @(posedge CLK) begin + if(wea) begin + ram[addra] <= dina; + end + douta <= ~wea ? ram[addra] : {256{$random}}; + end + +endmodule diff --git a/model/ICTag_bram.v b/model/ICTag_bram.v new file mode 100644 index 0000000..aeaac26 --- /dev/null +++ b/model/ICTag_bram.v @@ -0,0 +1,17 @@ +module ICTag_bram ( + input [ 5:0] addra, + input clka, + input [21:0] dina, + output [21:0] douta, + input wea +); + + reg [21:0] ram [0:63]; + always @(posedge CLK) begin + if(wea) begin + ram[addra] <= dina; + end + douta <= ~wea ? ram[addra] : {21{$random}}; + end + +endmodule diff --git a/src/AXI/AXI.sv b/src/AXI/AXI.sv index 9908f58..27c5789 100644 --- a/src/AXI/AXI.sv +++ b/src/AXI/AXI.sv @@ -1,5 +1,4 @@ `include "AXI.svh" -`include "sram.svh" module AXI ( input clk, diff --git a/src/AXI/AXIRead_i.sv b/src/AXI/AXIRead_i.sv new file mode 100644 index 0000000..497d580 --- /dev/null +++ b/src/AXI/AXIRead_i.sv @@ -0,0 +1,9 @@ +`include "AXI.svh" + +interface AXIRead_i; + AXIReadAddr_t AXIReadAddr; + AXIReadData_t AXIReadData; + + modport master(input AXIReadData, output AXIReadAddr); + modport slave(input AXIReadAddr, output AXIReadData); +endinterface //AXIRead \ No newline at end of file diff --git a/src/AXI/AXIWrite_i.sv b/src/AXI/AXIWrite_i.sv new file mode 100644 index 0000000..1ab4052 --- /dev/null +++ b/src/AXI/AXIWrite_i.sv @@ -0,0 +1,9 @@ +`include "AXI.svh" + +interface AXIWrite_i; + AXIWriteAddr_t AXIWriteAddr; + AXIWriteData_t AXIWriteData; + + modport master(input AXIWriteData, output AXIWriteAddr); + modport slave(input AXIWriteAddr, output AXIWriteData); +endinterface //AXIWrite \ No newline at end of file diff --git a/src/Cache/DCache.sv b/src/Cache/DCache.sv index a2bbcc1..ca28e62 100644 --- a/src/Cache/DCache.sv +++ b/src/Cache/DCache.sv @@ -1,5 +1,4 @@ `include "defines.svh" -`include "sram.svh" `include "DCache.svh" `include "AXI.svh" @@ -111,6 +110,7 @@ module DCache ( nextState = IDLE; end end + default: begin nextState = IDLE; end endcase end @@ -288,6 +288,7 @@ module DCache ( if (port.wstrb[1]) wdata1[i][15: 8] = port.wdata[15: 8]; if (port.wstrb[0]) wdata1[i][ 7: 0] = port.wdata[ 7: 0]; end + default: begin end endcase case (port.sel1) 2'b11: begin @@ -314,6 +315,7 @@ module DCache ( if (port.wstrb[1]) wdata2[i][15: 8] = port.wdata[15: 8]; if (port.wstrb[0]) wdata2[i][ 7: 0] = port.wdata[ 7: 0]; end + default: begin end endcase end end diff --git a/src/Cache/DCache_i.sv b/src/Cache/DCache_i.sv new file mode 100644 index 0000000..34e064d --- /dev/null +++ b/src/Cache/DCache_i.sv @@ -0,0 +1,37 @@ +`include "DCache.svh" + +interface DCache_i; + logic req; + logic valid; + DCIndexL_t index; + DCTagL_t tag1; + logic [1:0] sel1; // addr[3:2] + logic hit; + logic rvalid; // MMU(AXI) -> DCache + DCData_t rdata; + logic wvalid; + word_t wdata; + logic [3:0] wstrb; + logic dirt_valid; + word_t dirt_addr; + DCData_t dirt_data; + DCData_t row; + logic clear; + logic clearIdx; + logic clearWb; + + modport cache( + input req, valid, + input index, tag1, sel1, + input rvalid, rdata, wvalid, wdata, wstrb, + output hit, dirt_valid, dirt_addr, dirt_data, row, + input clear, clearIdx, clearWb + ); + modport mmu( + output req, valid, + output index, tag1, sel1, + output rvalid, rdata, wvalid, wdata, wstrb, + input hit, dirt_valid, dirt_addr, dirt_data, row, + output clear, clearIdx, clearWb + ); +endinterface //DCache_i \ No newline at end of file diff --git a/src/Cache/ICache.sv b/src/Cache/ICache.sv index de40d0b..0c305d7 100644 --- a/src/Cache/ICache.sv +++ b/src/Cache/ICache.sv @@ -1,5 +1,4 @@ `include "defines.svh" -`include "sram.svh" `include "ICache.svh" `include "AXI.svh" @@ -82,6 +81,7 @@ module ICache ( nextState = IDLE; end end + default: begin nextState = IDLE; end endcase end diff --git a/src/Cache/ICache_i.sv b/src/Cache/ICache_i.sv new file mode 100644 index 0000000..4957cc7 --- /dev/null +++ b/src/Cache/ICache_i.sv @@ -0,0 +1,29 @@ +`include "ICache.svh" + +interface ICache_i; + logic req; + logic valid; + ICIndexL_t index; + ICTagL_t tag1; + logic hit; + ICData_t row; + logic rvalid; + ICData_t rdata; + logic clear; + logic clearIdx; + + modport cache( + input req, valid, + input index, tag1, + output hit, row, + input rvalid, rdata, + input clear, clearIdx + ); + modport mmu( + output req, valid, + output index, tag1, + input hit, row, + output rvalid, rdata, + output clear, clearIdx + ); +endinterface //ICache_i \ No newline at end of file diff --git a/src/Core/Datapath.sv b/src/Core/Datapath.sv index f5f439a..e31a186 100644 --- a/src/Core/Datapath.sv +++ b/src/Core/Datapath.sv @@ -1,5 +1,4 @@ `include "defines.svh" -`include "sram.svh" `include "CP0.svh" `include "ICache.svh" `include "DCache.svh" diff --git a/src/Core/Gadgets.sv b/src/Core/Gadgets/instr_valid.sv similarity index 65% rename from src/Core/Gadgets.sv rename to src/Core/Gadgets/instr_valid.sv index 619dbcd..c22ab47 100644 --- a/src/Core/Gadgets.sv +++ b/src/Core/Gadgets/instr_valid.sv @@ -1,17 +1,5 @@ `include "defines.svh" -module pcenr ( - input clk, rst, - input word_t d, - input logic en, - output word_t q -); - - always_ff @(posedge clk) - if (rst) q <= (`PCRST - 8); - else if (en) q <= d; -endmodule - module instr_valid ( input word_t instr, output logic valid @@ -103,116 +91,3 @@ module instr_valid ( default: valid = 1'b0; endcase endmodule - -module memerror ( - input logic [1:0] addr, - input logic [1:0] size, - output logic error -); - - always_comb - casez (size) - 2'b11: begin - error = (addr != 2'b00); - end - 2'b10: begin - error = 1'b0; - end - 2'b01: begin - error = (addr[0] != 1'b0); - end - 2'b00: begin - error = 1'b0; - end - endcase -endmodule - -module memoutput ( - input logic [1:0] addr, - input word_t data, - input logic [1:0] size, - input ALR_t alr, - output word_t wdata, - output logic [3:0] wstrb -); - // TODO: wdata fill zero or replica - always_comb - casez (size) - 2'b11: begin - wdata = data; - wstrb = 4'b1111; - end - 2'b10: begin - wdata = data; - case (addr) - 2'b11: begin - wstrb = alr[0] ? 4'b1111 : 4'b1000; - wdata = alr[0] ? data - : {data[7:0], data[31:8]}; - end - 2'b10: begin - wstrb = alr[0] ? 4'b0111 : 4'b1100; - wdata = alr[0] ? {data[7:0], data[31:8]} - : {data[15:0], data[31:16]}; - end - 2'b01: begin - wstrb = alr[0] ? 4'b0011 : 4'b1110; - wdata = alr[0] ? {data[15:0], data[31:16]} - : {data[23:0], data[31:24]}; - end - 2'b00: begin - wstrb = alr[0] ? 4'b0001 : 4'b1111; - wdata = alr[0] ? {data[23:0], data[31:24]} - : data; - end - endcase - end - 2'b01: begin - wdata = {2{data[15:0]}}; - wstrb = addr[1] ? 4'b1100 : 4'b0011; - end - 2'b00: begin - wdata = {4{data[7:0]}}; - case (addr) - 2'b11: wstrb = 4'b1000; - 2'b10: wstrb = 4'b0100; - 2'b01: wstrb = 4'b0010; - 2'b00: wstrb = 4'b0001; - endcase - end - endcase -endmodule - -// module memoutput ( -// input logic [1:0] addr, -// input word_t data, -// input logic [1:0] size, -// output word_t wdata, -// output logic [3:0] wstrb, -// output logic error -// ); - -// always_comb -// casez (size) -// 2'b1?: begin -// wdata = data; -// wstrb = 4'b1111; -// error = (addr != 2'b00); -// end -// 2'b01: begin -// wdata = {2{data[15:0]}}; -// wstrb = addr[1] ? 4'b1100 : 4'b0011; -// error = (addr[0] != 1'b0); -// end -// 2'b00: begin -// wdata = {4{data[7:0]}}; -// case (addr) -// 2'b11: wstrb = 4'b1000; -// 2'b10: wstrb = 4'b0100; -// 2'b01: wstrb = 4'b0010; -// 2'b00: wstrb = 4'b0001; -// endcase -// error = 1'b0; -// end -// endcase -// endmodule diff --git a/src/Core/Gadgets/memerror.sv b/src/Core/Gadgets/memerror.sv new file mode 100644 index 0000000..ba0d8f8 --- /dev/null +++ b/src/Core/Gadgets/memerror.sv @@ -0,0 +1,23 @@ +module memerror ( + input logic [1:0] addr, + input logic [1:0] size, + output logic error +); + + always_comb + casez (size) + 2'b11: begin + error = (addr != 2'b00); + end + 2'b10: begin + error = 1'b0; + end + 2'b01: begin + error = (addr[0] != 1'b0); + end + 2'b00: begin + error = 1'b0; + end + default: begin error = 1'b1; end + endcase +endmodule diff --git a/src/Core/Gadgets/memoutput.sv b/src/Core/Gadgets/memoutput.sv new file mode 100644 index 0000000..03220b6 --- /dev/null +++ b/src/Core/Gadgets/memoutput.sv @@ -0,0 +1,60 @@ +`include "defines.svh" + +module memoutput ( + input logic [1:0] addr, + input word_t data, + input logic [1:0] size, + input ALR_t alr, + output word_t wdata, + output logic [3:0] wstrb +); + // TODO: wdata fill zero or replica + always_comb + casez (size) + 2'b11: begin + wdata = data; + wstrb = 4'b1111; + end + 2'b10: begin + wdata = data; + case (addr) + 2'b11: begin + wstrb = alr[0] ? 4'b1111 : 4'b1000; + wdata = alr[0] ? data + : {data[7:0], data[31:8]}; + end + 2'b10: begin + wstrb = alr[0] ? 4'b0111 : 4'b1100; + wdata = alr[0] ? {data[7:0], data[31:8]} + : {data[15:0], data[31:16]}; + end + 2'b01: begin + wstrb = alr[0] ? 4'b0011 : 4'b1110; + wdata = alr[0] ? {data[15:0], data[31:16]} + : {data[23:0], data[31:24]}; + end + 2'b00: begin + wstrb = alr[0] ? 4'b0001 : 4'b1111; + wdata = alr[0] ? {data[23:0], data[31:24]} + : data; + end + default: begin wstrb = 4'b0000; end + endcase + end + 2'b01: begin + wdata = {2{data[15:0]}}; + wstrb = addr[1] ? 4'b1100 : 4'b0011; + end + 2'b00: begin + wdata = {4{data[7:0]}}; + case (addr) + 2'b11: wstrb = 4'b1000; + 2'b10: wstrb = 4'b0100; + 2'b01: wstrb = 4'b0010; + 2'b00: wstrb = 4'b0001; + default: wstrb = 4'b0000; + endcase + end + default: begin wstrb = 4'b0000; end + endcase +endmodule \ No newline at end of file diff --git a/src/Core/Gadgets/pcenr.sv b/src/Core/Gadgets/pcenr.sv new file mode 100644 index 0000000..670fb6a --- /dev/null +++ b/src/Core/Gadgets/pcenr.sv @@ -0,0 +1,13 @@ +`include "defines.svh" + +module pcenr ( + input clk, rst, + input word_t d, + input logic en, + output word_t q +); + + always_ff @(posedge clk) + if (rst) q <= (`PCRST - 8); + else if (en) q <= d; +endmodule diff --git a/src/Gadgets.sv b/src/Gadgets.sv deleted file mode 100644 index 33f7da0..0000000 --- a/src/Gadgets.sv +++ /dev/null @@ -1,263 +0,0 @@ -module ffen #( - parameter WIDTH = 8 -) ( - input logic clk, - input logic [WIDTH-1:0] d, - input logic en, - output logic [WIDTH-1:0] q -); - - always_ff @(posedge clk) if (en) q <= d; -endmodule - -module ffenr #( - parameter WIDTH = 8 -) ( - input logic clk, - input logic rst, - input logic [WIDTH-1:0] d, - input logic en, - output logic [WIDTH-1:0] q -); - - always_ff @(posedge clk) - if (rst) q <= {WIDTH{1'b0}}; - else if (en) q <= d; -endmodule - -module ffenrc #( - parameter WIDTH = 8 -) ( - input logic clk, - input logic rst, - input logic [WIDTH-1:0] d, - input logic en, - input logic c, - output logic [WIDTH-1:0] q -); - - always_ff @(posedge clk) - if (rst) q <= {WIDTH{1'b0}}; - else if (en) q <= c ? {WIDTH{1'b0}} : d; -endmodule - -module mux2 #( - parameter WIDTH = 8 -) ( - input logic [WIDTH-1:0] d0, - input logic [WIDTH-1:0] d1, - input logic s, - output logic [WIDTH-1:0] q -); - - assign q = s ? d1 : d0; - -endmodule - -module mux3 #( - parameter WIDTH = 8 -) ( - input logic [WIDTH-1:0] d0, - input logic [WIDTH-1:0] d1, - input logic [WIDTH-1:0] d2, - input logic [ 1:0] s, - output logic [WIDTH-1:0] q -); - - assign q = s[1] ? d2 : s[0] ? d1 : d0; - -endmodule - -module mux4 #( - parameter WIDTH = 8 -) ( - input logic [WIDTH-1:0] d0, - input logic [WIDTH-1:0] d1, - input logic [WIDTH-1:0] d2, - input logic [WIDTH-1:0] d3, - input logic [ 1:0] s, - output logic [WIDTH-1:0] q -); - - assign q = s[1] ? s[0] ? d3 : d2 : s[0] ? d1 : d0; - -endmodule - -module mux5 #( - parameter WIDTH = 8 -) ( - input logic [WIDTH-1:0] d0, - input logic [WIDTH-1:0] d1, - input logic [WIDTH-1:0] d2, - input logic [WIDTH-1:0] d3, - input logic [WIDTH-1:0] d4, - input logic [ 2:0] s, - output logic [WIDTH-1:0] q -); - - assign q = s[2] ? d4 : s[1] ? s[0] ? d3 : d2 : s[0] ? d1 : d0; - -endmodule - -module mux6 #( - parameter WIDTH = 8 -) ( - input logic [WIDTH-1:0] d0, - input logic [WIDTH-1:0] d1, - input logic [WIDTH-1:0] d2, - input logic [WIDTH-1:0] d3, - input logic [WIDTH-1:0] d4, - input logic [WIDTH-1:0] d5, - - input logic [ 2:0] s, - output logic [WIDTH-1:0] q -); - - always_comb begin - case (s) - 3'b000: q = d0; - 3'b001: q = d1; - 3'b010: q = d2; - 3'b011: q = d3; - 3'b100: q = d4; - default: q = d5; - endcase - end -endmodule - -module prio_mux4 #( - parameter WIDTH = 8 -) ( - input logic [WIDTH-1:0] d0, - input logic [WIDTH-1:0] d1, - input logic [WIDTH-1:0] d2, - input logic [WIDTH-1:0] d3, - input logic [ 2:0] s, - output logic [WIDTH-1:0] q -); - - assign q = s[2] ? d3 : s[1] ? d2 : s[0] ? d1 : d0; - -endmodule - -module prio_mux5 #( - parameter WIDTH = 8 -) ( - input logic [WIDTH-1:0] d0, - input logic [WIDTH-1:0] d1, - input logic [WIDTH-1:0] d2, - input logic [WIDTH-1:0] d3, - input logic [WIDTH-1:0] d4, - input logic [ 3:0] s, - output logic [WIDTH-1:0] q -); - - assign q = s[3] ? d4 : s[2] ? d3 : s[1] ? d2 : s[0] ? d1 : d0; - -endmodule - -module onehot_bin4 ( - input logic [3:0] onehot, - output logic [1:0] bin -); - assign bin = {onehot[3] | onehot[2], onehot[3] | onehot[1]}; -endmodule - -module onehot_bin8 ( - input logic [7:0] onehot, - output logic [2:0] bin -); - logic [1:0] bin1, bin0; - onehot_bin4 onehot_bin4_1(onehot[7:4], bin1); - onehot_bin4 onehot_bin4_0(onehot[3:0], bin0); - assign bin = {|{onehot[7:4]}, bin1 | bin0}; -endmodule - -module onehot_bin16 ( - input logic [15:0] onehot, - output logic [ 3:0] bin -); - logic [2:0] bin1, bin0; - onehot_bin8 onehot_bin8_1(onehot[15:8], bin1); - onehot_bin8 onehot_bin8_0(onehot[ 7:0], bin0); - assign bin = {|{onehot[15:8]}, bin1 | bin0}; -endmodule - -module onehot_bin32 ( - input logic [31:0] onehot, - output logic [ 4:0] bin -); - logic [3:0] bin1, bin0; - onehot_bin16 onehot_bin16_1(onehot[31:16], bin1); - onehot_bin16 onehot_bin16_0(onehot[15: 0], bin0); - assign bin = {|{onehot[31:16]}, bin1 | bin0}; -endmodule - -module extender #( - parameter OWIDTH = 8, - parameter IWIDTH = 8 -) ( - input logic [IWIDTH-1:0] d, - input logic s, - output logic [OWIDTH-1:0] q -); - - assign q = {{(OWIDTH - IWIDTH) {s & d[IWIDTH-1]}}, d}; - -endmodule - -module myBuffer0 #( - parameter WIDTH = 8 -) ( - input clk, - input rst, - input logic [WIDTH-1:0] data, - input logic en, - output logic [WIDTH-1:0] bdata -); - - logic [WIDTH-1:0] data1; - - ffenr #(WIDTH) data_ff ( - clk, - rst, - data, - en, - data1 - ); - - assign bdata = en ? data : data1; -endmodule - -module myBuffer #( - parameter WIDTH = 8 -) ( - input clk, - input rst, - input logic prev_valid, - input logic [WIDTH-1:0] prev_data, - input logic next_en, - output logic next_valid, - output logic [WIDTH-1:0] next_data -); - - logic valid; - logic [WIDTH-1:0] data; - - ffenr #(1) valid_ff ( - clk, - rst, - prev_valid, - prev_valid ^ next_en, - valid - ); - ffen #(WIDTH) data_ff ( - clk, - prev_data, - prev_valid, - data - ); - - assign next_valid = valid | prev_valid; - assign next_data = valid ? data : prev_data; -endmodule diff --git a/src/Gadgets/extender.sv b/src/Gadgets/extender.sv new file mode 100644 index 0000000..994254e --- /dev/null +++ b/src/Gadgets/extender.sv @@ -0,0 +1,12 @@ +module extender #( + parameter OWIDTH = 8, + parameter IWIDTH = 8 +) ( + input logic [IWIDTH-1:0] d, + input logic s, + output logic [OWIDTH-1:0] q +); + + assign q = {{(OWIDTH - IWIDTH) {s & d[IWIDTH-1]}}, d}; + +endmodule diff --git a/src/Gadgets/ffen.sv b/src/Gadgets/ffen.sv new file mode 100644 index 0000000..de6622f --- /dev/null +++ b/src/Gadgets/ffen.sv @@ -0,0 +1,11 @@ +module ffen #( + parameter WIDTH = 8 +) ( + input logic clk, + input logic [WIDTH-1:0] d, + input logic en, + output logic [WIDTH-1:0] q +); + + always_ff @(posedge clk) if (en) q <= d; +endmodule diff --git a/src/Gadgets/ffenr.sv b/src/Gadgets/ffenr.sv new file mode 100644 index 0000000..2251533 --- /dev/null +++ b/src/Gadgets/ffenr.sv @@ -0,0 +1,14 @@ +module ffenr #( + parameter WIDTH = 8 +) ( + input logic clk, + input logic rst, + input logic [WIDTH-1:0] d, + input logic en, + output logic [WIDTH-1:0] q +); + + always_ff @(posedge clk) + if (rst) q <= {WIDTH{1'b0}}; + else if (en) q <= d; +endmodule diff --git a/src/Gadgets/ffenrc.sv b/src/Gadgets/ffenrc.sv new file mode 100644 index 0000000..e1c9b59 --- /dev/null +++ b/src/Gadgets/ffenrc.sv @@ -0,0 +1,15 @@ +module ffenrc #( + parameter WIDTH = 8 +) ( + input logic clk, + input logic rst, + input logic [WIDTH-1:0] d, + input logic en, + input logic c, + output logic [WIDTH-1:0] q +); + + always_ff @(posedge clk) + if (rst) q <= {WIDTH{1'b0}}; + else if (en) q <= c ? {WIDTH{1'b0}} : d; +endmodule diff --git a/src/Gadgets/mux2.sv b/src/Gadgets/mux2.sv new file mode 100644 index 0000000..ea68d2f --- /dev/null +++ b/src/Gadgets/mux2.sv @@ -0,0 +1,12 @@ +module mux2 #( + parameter WIDTH = 8 +) ( + input logic [WIDTH-1:0] d0, + input logic [WIDTH-1:0] d1, + input logic s, + output logic [WIDTH-1:0] q +); + + assign q = s ? d1 : d0; + +endmodule diff --git a/src/Gadgets/mux3.sv b/src/Gadgets/mux3.sv new file mode 100644 index 0000000..d8f3f97 --- /dev/null +++ b/src/Gadgets/mux3.sv @@ -0,0 +1,13 @@ +module mux3 #( + parameter WIDTH = 8 +) ( + input logic [WIDTH-1:0] d0, + input logic [WIDTH-1:0] d1, + input logic [WIDTH-1:0] d2, + input logic [ 1:0] s, + output logic [WIDTH-1:0] q +); + + assign q = s[1] ? d2 : s[0] ? d1 : d0; + +endmodule diff --git a/src/Gadgets/mux4.sv b/src/Gadgets/mux4.sv new file mode 100644 index 0000000..c257cf4 --- /dev/null +++ b/src/Gadgets/mux4.sv @@ -0,0 +1,14 @@ +module mux4 #( + parameter WIDTH = 8 +) ( + input logic [WIDTH-1:0] d0, + input logic [WIDTH-1:0] d1, + input logic [WIDTH-1:0] d2, + input logic [WIDTH-1:0] d3, + input logic [ 1:0] s, + output logic [WIDTH-1:0] q +); + + assign q = s[1] ? s[0] ? d3 : d2 : s[0] ? d1 : d0; + +endmodule diff --git a/src/Gadgets/mux5.sv b/src/Gadgets/mux5.sv new file mode 100644 index 0000000..dfda78d --- /dev/null +++ b/src/Gadgets/mux5.sv @@ -0,0 +1,15 @@ +module mux5 #( + parameter WIDTH = 8 +) ( + input logic [WIDTH-1:0] d0, + input logic [WIDTH-1:0] d1, + input logic [WIDTH-1:0] d2, + input logic [WIDTH-1:0] d3, + input logic [WIDTH-1:0] d4, + input logic [ 2:0] s, + output logic [WIDTH-1:0] q +); + + assign q = s[2] ? d4 : s[1] ? s[0] ? d3 : d2 : s[0] ? d1 : d0; + +endmodule diff --git a/src/Gadgets/mux6.sv b/src/Gadgets/mux6.sv new file mode 100644 index 0000000..d95b6e2 --- /dev/null +++ b/src/Gadgets/mux6.sv @@ -0,0 +1,25 @@ +module mux6 #( + parameter WIDTH = 8 +) ( + input logic [WIDTH-1:0] d0, + input logic [WIDTH-1:0] d1, + input logic [WIDTH-1:0] d2, + input logic [WIDTH-1:0] d3, + input logic [WIDTH-1:0] d4, + input logic [WIDTH-1:0] d5, + + input logic [ 2:0] s, + output logic [WIDTH-1:0] q +); + + always_comb begin + case (s) + 3'b000: q = d0; + 3'b001: q = d1; + 3'b010: q = d2; + 3'b011: q = d3; + 3'b100: q = d4; + default: q = d5; + endcase + end +endmodule diff --git a/src/Gadgets/myBuffer.sv b/src/Gadgets/myBuffer.sv new file mode 100644 index 0000000..1d40ec8 --- /dev/null +++ b/src/Gadgets/myBuffer.sv @@ -0,0 +1,32 @@ +module myBuffer #( + parameter WIDTH = 8 +) ( + input clk, + input rst, + input logic prev_valid, + input logic [WIDTH-1:0] prev_data, + input logic next_en, + output logic next_valid, + output logic [WIDTH-1:0] next_data +); + + logic valid; + logic [WIDTH-1:0] data; + + ffenr #(1) valid_ff ( + clk, + rst, + prev_valid, + prev_valid ^ next_en, + valid + ); + ffen #(WIDTH) data_ff ( + clk, + prev_data, + prev_valid, + data + ); + + assign next_valid = valid | prev_valid; + assign next_data = valid ? data : prev_data; +endmodule diff --git a/src/Gadgets/myBuffer0.sv b/src/Gadgets/myBuffer0.sv new file mode 100644 index 0000000..fa0a6e0 --- /dev/null +++ b/src/Gadgets/myBuffer0.sv @@ -0,0 +1,15 @@ +module myBuffer0 #( + parameter WIDTH = 8 +) ( + input clk, + input rst, + input logic [WIDTH-1:0] data, + input logic en, + output logic [WIDTH-1:0] bdata +); + logic [WIDTH-1:0] data1; + + ffenr #(WIDTH) data_ff (clk, rst, data, en, data1); + + assign bdata = en ? data : data1; +endmodule diff --git a/src/Gadgets/onehot_bin16.sv b/src/Gadgets/onehot_bin16.sv new file mode 100644 index 0000000..05d3e80 --- /dev/null +++ b/src/Gadgets/onehot_bin16.sv @@ -0,0 +1,9 @@ +module onehot_bin16 ( + input logic [15:0] onehot, + output logic [ 3:0] bin +); + logic [2:0] bin1, bin0; + onehot_bin8 onehot_bin8_1(onehot[15:8], bin1); + onehot_bin8 onehot_bin8_0(onehot[ 7:0], bin0); + assign bin = {|{onehot[15:8]}, bin1 | bin0}; +endmodule diff --git a/src/Gadgets/onehot_bin32.sv b/src/Gadgets/onehot_bin32.sv new file mode 100644 index 0000000..ecbfb56 --- /dev/null +++ b/src/Gadgets/onehot_bin32.sv @@ -0,0 +1,9 @@ +module onehot_bin32 ( + input logic [31:0] onehot, + output logic [ 4:0] bin +); + logic [3:0] bin1, bin0; + onehot_bin16 onehot_bin16_1(onehot[31:16], bin1); + onehot_bin16 onehot_bin16_0(onehot[15: 0], bin0); + assign bin = {|{onehot[31:16]}, bin1 | bin0}; +endmodule diff --git a/src/Gadgets/onehot_bin4.sv b/src/Gadgets/onehot_bin4.sv new file mode 100644 index 0000000..c777db8 --- /dev/null +++ b/src/Gadgets/onehot_bin4.sv @@ -0,0 +1,6 @@ +module onehot_bin4 ( + input logic [3:0] onehot, + output logic [1:0] bin +); + assign bin = {onehot[3] | onehot[2], onehot[3] | onehot[1]}; +endmodule diff --git a/src/Gadgets/onehot_bin8.sv b/src/Gadgets/onehot_bin8.sv new file mode 100644 index 0000000..58a6279 --- /dev/null +++ b/src/Gadgets/onehot_bin8.sv @@ -0,0 +1,9 @@ +module onehot_bin8 ( + input logic [7:0] onehot, + output logic [2:0] bin +); + logic [1:0] bin1, bin0; + onehot_bin4 onehot_bin4_1(onehot[7:4], bin1); + onehot_bin4 onehot_bin4_0(onehot[3:0], bin0); + assign bin = {|{onehot[7:4]}, bin1 | bin0}; +endmodule diff --git a/src/Gadgets/prio_mux4.sv b/src/Gadgets/prio_mux4.sv new file mode 100644 index 0000000..d0fd129 --- /dev/null +++ b/src/Gadgets/prio_mux4.sv @@ -0,0 +1,14 @@ +module prio_mux4 #( + parameter WIDTH = 8 +) ( + input logic [WIDTH-1:0] d0, + input logic [WIDTH-1:0] d1, + input logic [WIDTH-1:0] d2, + input logic [WIDTH-1:0] d3, + input logic [ 2:0] s, + output logic [WIDTH-1:0] q +); + + assign q = s[2] ? d3 : s[1] ? d2 : s[0] ? d1 : d0; + +endmodule diff --git a/src/Gadgets/prio_mux5.sv b/src/Gadgets/prio_mux5.sv new file mode 100644 index 0000000..d8dad81 --- /dev/null +++ b/src/Gadgets/prio_mux5.sv @@ -0,0 +1,15 @@ +module prio_mux5 #( + parameter WIDTH = 8 +) ( + input logic [WIDTH-1:0] d0, + input logic [WIDTH-1:0] d1, + input logic [WIDTH-1:0] d2, + input logic [WIDTH-1:0] d3, + input logic [WIDTH-1:0] d4, + input logic [ 3:0] s, + output logic [WIDTH-1:0] q +); + + assign q = s[3] ? d4 : s[2] ? d3 : s[1] ? d2 : s[0] ? d1 : d0; + +endmodule diff --git a/src/MMU/MMU.sv b/src/MMU/MMU.sv index f86ff97..0a5d088 100644 --- a/src/MMU/MMU.sv +++ b/src/MMU/MMU.sv @@ -1,5 +1,4 @@ `include "defines.svh" -`include "sram.svh" `include "ICache.svh" `include "DCache.svh" `include "TLB.svh" @@ -207,6 +206,7 @@ module MMU ( iEn = 1; iNextState = I_IDLE; end + default: begin iNextState = I_IDLE; end endcase end @@ -465,6 +465,7 @@ module MMU ( dClrReq = 1; drNextState = DR_IDLE; end + default: begin drNextState = DR_IDLE; end endcase end @@ -656,6 +657,7 @@ module MMU ( DW_WAITR: begin if (drState == DR_REFILL | drState == DR_CACHE_REFILL | drState == DR_CACHE_REQ) dwNextState = DW_IDLE; end + default: begin dwNextState = DW_IDLE; end endcase end @@ -688,6 +690,7 @@ module MMU ( wdata_axi.req = 1'b1; if (wdata_axi.addr_ok) dwaNextState = DWA_IDLE; end + default: begin dwaNextState = DWA_IDLE; end endcase end diff --git a/src/MMU/SRAM_RO_AXI_i.sv b/src/MMU/SRAM_RO_AXI_i.sv new file mode 100644 index 0000000..3fb72d7 --- /dev/null +++ b/src/MMU/SRAM_RO_AXI_i.sv @@ -0,0 +1,17 @@ +`include "defines.svh" + +// SRAM interface for IDCache/MMU <-> AXI +interface SRAM_RO_AXI_i; + logic req; + word_t addr; + logic [3:0] len; + logic [2:0] size; + logic addr_ok; + logic data_ok; + word_t rdata; + logic rvalid; + + modport master(output req, addr, len, size, input addr_ok, data_ok, rdata, rvalid); + modport slave(input req, addr, len, size, output addr_ok, data_ok, rdata, rvalid); + +endinterface \ No newline at end of file diff --git a/src/MMU/SRAM_W_AXI_i.sv b/src/MMU/SRAM_W_AXI_i.sv new file mode 100644 index 0000000..f9c0450 --- /dev/null +++ b/src/MMU/SRAM_W_AXI_i.sv @@ -0,0 +1,20 @@ +`include "defines.svh" + +// SRAM interface for DCache/MMU <-> AXI +interface SRAM_W_AXI_i; + logic req; + word_t addr; + logic [3:0] len; + logic [2:0] size; + logic [3:0] wstrb; + word_t wdata; + logic wvalid; + logic wlast; + logic addr_ok; + logic data_ok; // 全部写完的响应信号 + logic wready;// 一次写 + + modport master(output req, addr, len, size, wstrb, wdata, wvalid, wlast, input addr_ok, data_ok, wready); + modport slave(input req, addr, len, size, wstrb, wdata, wvalid, wlast, output addr_ok, data_ok, wready); + +endinterface \ No newline at end of file diff --git a/src/MMU/TLB.sv b/src/MMU/TLB.sv index 4e0d349..fcac3e1 100644 --- a/src/MMU/TLB.sv +++ b/src/MMU/TLB.sv @@ -198,62 +198,3 @@ module TLB ( end endmodule - - -module TLB_Lookup ( - input TLB_t [ 7:0] TLB_entries, - input logic [19:0] VPN, - input logic [ 7:0] ASID, - - output logic [19:0] PPN, - output logic hit, - output logic cached, - output logic dirty, - output logic valid, - output Index_t index -); - - logic [7:0] hitWay; - for (genvar i = 0; i < 8; i++) - // assign hitWay[i] = ((TLB_entries[i].VPN2 & ~{7'b0, TLB_entries[i].PageMask}) - // == (VPN[19:1] & ~{7'b0, TLB_entries[i].PageMask})) - // & (TLB_entries[i].G | TLB_entries[i].ASID == ASID); - assign hitWay[i] = (TLB_entries[i].VPN2 == VPN[19:1]) - & (TLB_entries[i].G | TLB_entries[i].ASID == ASID); - - // assume: hit is unique - assign hit = |{hitWay}; - assign index.P = ~hit; - assign index.zero = 0; - onehot_bin8 index_decoder(hitWay, index.Index); - // always_comb for (int i = 0; i < 32; i++) index.Index |= hitWay[i] ? i : 0; - - TLB_t found; - assign found = (hitWay[ 0] ? TLB_entries[ 0] : 78'b0) - | (hitWay[ 1] ? TLB_entries[ 1] : 78'b0) - | (hitWay[ 2] ? TLB_entries[ 2] : 78'b0) - | (hitWay[ 3] ? TLB_entries[ 3] : 78'b0) - | (hitWay[ 4] ? TLB_entries[ 4] : 78'b0) - | (hitWay[ 5] ? TLB_entries[ 5] : 78'b0) - | (hitWay[ 6] ? TLB_entries[ 6] : 78'b0) - | (hitWay[ 7] ? TLB_entries[ 7] : 78'b0); - - logic parity; - // assign parity = |{ - // VPN[12] & found.PageMask[10], - // VPN[10] & ~found.PageMask[10] & found.PageMask[ 8], - // VPN[ 8] & ~found.PageMask[ 8] & found.PageMask[ 6], - // VPN[ 6] & ~found.PageMask[ 6] & found.PageMask[ 4], - // VPN[ 4] & ~found.PageMask[ 4] & found.PageMask[ 2], - // VPN[ 2] & ~found.PageMask[ 2] & found.PageMask[ 0], - // VPN[ 0] & ~found.PageMask[ 0] - // }; - // assign parity = |{VPN & {7'b0, found.PageMask + 1'b1}}; - assign parity = VPN[0]; - - logic [19:0] PFN; - assign {PFN, cached, dirty, valid} = parity ? {found.PFN1, found.C1[0], found.D1, found.V1} - : {found.PFN0, found.C0[0], found.D0, found.V0}; - // assign PPN = (VPN & {8'b0, found.PageMask}) | (PFN & ~{8'b0, found.PageMask}); - assign PPN = PFN; -endmodule diff --git a/src/MMU/TLB_Lookup.sv b/src/MMU/TLB_Lookup.sv new file mode 100644 index 0000000..967b974 --- /dev/null +++ b/src/MMU/TLB_Lookup.sv @@ -0,0 +1,60 @@ +`include "defines.svh" +`include "TLB.svh" + +module TLB_Lookup ( + input TLB_t [ 7:0] TLB_entries, + input logic [19:0] VPN, + input logic [ 7:0] ASID, + + output logic [19:0] PPN, + output logic hit, + output logic cached, + output logic dirty, + output logic valid, + output Index_t index +); + + logic [7:0] hitWay; + for (genvar i = 0; i < 8; i++) + // assign hitWay[i] = ((TLB_entries[i].VPN2 & ~{7'b0, TLB_entries[i].PageMask}) + // == (VPN[19:1] & ~{7'b0, TLB_entries[i].PageMask})) + // & (TLB_entries[i].G | TLB_entries[i].ASID == ASID); + assign hitWay[i] = (TLB_entries[i].VPN2 == VPN[19:1]) + & (TLB_entries[i].G | TLB_entries[i].ASID == ASID); + + // assume: hit is unique + assign hit = |{hitWay}; + assign index.P = ~hit; + assign index.zero = 0; + onehot_bin8 index_decoder(hitWay, index.Index); + // always_comb for (int i = 0; i < 32; i++) index.Index |= hitWay[i] ? i : 0; + + TLB_t found; + assign found = (hitWay[ 0] ? TLB_entries[ 0] : 78'b0) + | (hitWay[ 1] ? TLB_entries[ 1] : 78'b0) + | (hitWay[ 2] ? TLB_entries[ 2] : 78'b0) + | (hitWay[ 3] ? TLB_entries[ 3] : 78'b0) + | (hitWay[ 4] ? TLB_entries[ 4] : 78'b0) + | (hitWay[ 5] ? TLB_entries[ 5] : 78'b0) + | (hitWay[ 6] ? TLB_entries[ 6] : 78'b0) + | (hitWay[ 7] ? TLB_entries[ 7] : 78'b0); + + logic parity; + // assign parity = |{ + // VPN[12] & found.PageMask[10], + // VPN[10] & ~found.PageMask[10] & found.PageMask[ 8], + // VPN[ 8] & ~found.PageMask[ 8] & found.PageMask[ 6], + // VPN[ 6] & ~found.PageMask[ 6] & found.PageMask[ 4], + // VPN[ 4] & ~found.PageMask[ 4] & found.PageMask[ 2], + // VPN[ 2] & ~found.PageMask[ 2] & found.PageMask[ 0], + // VPN[ 0] & ~found.PageMask[ 0] + // }; + // assign parity = |{VPN & {7'b0, found.PageMask + 1'b1}}; + assign parity = VPN[0]; + + logic [19:0] PFN; + assign {PFN, cached, dirty, valid} = parity ? {found.PFN1, found.C1[0], found.D1, found.V1} + : {found.PFN0, found.C0[0], found.D0, found.V0}; + // assign PPN = (VPN & {8'b0, found.PageMask}) | (PFN & ~{8'b0, found.PageMask}); + assign PPN = PFN; +endmodule diff --git a/src/MMU/sram_i.sv b/src/MMU/sram_i.sv new file mode 100644 index 0000000..d4554b2 --- /dev/null +++ b/src/MMU/sram_i.sv @@ -0,0 +1,17 @@ +`include "defines.svh" + +interface sram_i (); + logic req; + logic wr; + word_t addr; + logic [1:0] size; + logic [3:0] wstrb; + word_t wdata; + logic addr_ok; + logic data_ok; + word_t rdata; + + modport master(output req, wr, addr, size, wstrb, wdata, input addr_ok, data_ok, rdata); + modport slave(input req, wr, addr, size, wstrb, wdata, output addr_ok, data_ok, rdata); + +endinterface \ No newline at end of file diff --git a/src/MMU/sramro_i.sv b/src/MMU/sramro_i.sv new file mode 100644 index 0000000..6ccf12e --- /dev/null +++ b/src/MMU/sramro_i.sv @@ -0,0 +1,15 @@ +`include "defines.svh" + +// SRAM interface for MMU <-> ICache +interface sramro_i (); + logic req; + word_t addr; + logic addr_ok; + logic data_ok; + word_t rdata0; + word_t rdata1; + + modport master(output req, addr, input addr_ok, data_ok, rdata0, rdata1); + modport slave(input req, addr, output addr_ok, data_ok, rdata0, rdata1); + +endinterface \ No newline at end of file diff --git a/src/MyCPU.sv b/src/MyCPU.sv index 5379d78..5068245 100644 --- a/src/MyCPU.sv +++ b/src/MyCPU.sv @@ -4,7 +4,6 @@ `include "CP0.svh" `include "DCache.svh" `include "ICache.svh" -`include "sram.svh" module mycpu_top ( input wire [5:0] ext_int, //high active diff --git a/src/include/AXI.svh b/src/include/AXI.svh index 70877f6..057c70b 100644 --- a/src/include/AXI.svh +++ b/src/include/AXI.svh @@ -24,15 +24,6 @@ typedef struct packed { logic rvalid; // Read valid } AXIReadData_t; // slave -interface AXIRead_i; - AXIReadAddr_t AXIReadAddr; - AXIReadData_t AXIReadData; - - modport master(input AXIReadData, output AXIReadAddr); - modport slave(input AXIReadAddr, output AXIReadData); -endinterface //AXIRead - - typedef struct packed { logic [3:0] awid; // Write address ID logic [31:0] awaddr; // Write address @@ -62,12 +53,4 @@ typedef struct packed { logic bvalid; // Write response valid } AXIWriteData_t; // slave -interface AXIWrite_i; - AXIWriteAddr_t AXIWriteAddr; - AXIWriteData_t AXIWriteData; - - modport master(input AXIWriteData, output AXIWriteAddr); - modport slave(input AXIWriteAddr, output AXIWriteData); -endinterface //AXIWrite - `endif diff --git a/src/include/DCache.svh b/src/include/DCache.svh index c5235a1..5becbe1 100644 --- a/src/include/DCache.svh +++ b/src/include/DCache.svh @@ -33,40 +33,4 @@ typedef struct packed { DCData_t rdata; } DCDataRAM_t; -interface DCache_i; - logic req; - logic valid; - DCIndexL_t index; - DCTagL_t tag1; - logic [1:0] sel1; // addr[3:2] - logic hit; - logic rvalid; // MMU(AXI) -> DCache - DCData_t rdata; - logic wvalid; - word_t wdata; - logic [3:0] wstrb; - logic dirt_valid; - word_t dirt_addr; - DCData_t dirt_data; - DCData_t row; - logic clear; - logic clearIdx; - logic clearWb; - - modport cache( - input req, valid, - input index, tag1, sel1, - input rvalid, rdata, wvalid, wdata, wstrb, - output hit, dirt_valid, dirt_addr, dirt_data, row, - input clear, clearIdx, clearWb - ); - modport mmu( - output req, valid, - output index, tag1, sel1, - output rvalid, rdata, wvalid, wdata, wstrb, - input hit, dirt_valid, dirt_addr, dirt_data, row, - output clear, clearIdx, clearWb - ); -endinterface //DCache_i - `endif diff --git a/src/include/ICache.svh b/src/include/ICache.svh index 2f00c5c..9e4a2c8 100644 --- a/src/include/ICache.svh +++ b/src/include/ICache.svh @@ -32,32 +32,4 @@ typedef struct packed { ICData_t rdata; } ICDataRAM_t; -interface ICache_i; - logic req; - logic valid; - ICIndexL_t index; - ICTagL_t tag1; - logic hit; - ICData_t row; - logic rvalid; - ICData_t rdata; - logic clear; - logic clearIdx; - - modport cache( - input req, valid, - input index, tag1, - output hit, row, - input rvalid, rdata, - input clear, clearIdx - ); - modport mmu( - output req, valid, - output index, tag1, - input hit, row, - output rvalid, rdata, - output clear, clearIdx - ); -endinterface //ICache_i - `endif diff --git a/src/include/sram.svh b/src/include/sram.svh deleted file mode 100644 index 487c07f..0000000 --- a/src/include/sram.svh +++ /dev/null @@ -1,71 +0,0 @@ -`ifndef SRAM_SVH -`define SRAM_SVH - -`include "defines.svh" - -interface sram_i (); - logic req; - logic wr; - word_t addr; - logic [1:0] size; - logic [3:0] wstrb; - word_t wdata; - logic addr_ok; - logic data_ok; - word_t rdata; - - modport master(output req, wr, addr, size, wstrb, wdata, input addr_ok, data_ok, rdata); - modport slave(input req, wr, addr, size, wstrb, wdata, output addr_ok, data_ok, rdata); - -endinterface - -// SRAM interface for MMU <-> ICache -interface sramro_i (); - logic req; - word_t addr; - logic addr_ok; - logic data_ok; - word_t rdata0; - word_t rdata1; - - modport master(output req, addr, input addr_ok, data_ok, rdata0, rdata1); - modport slave(input req, addr, output addr_ok, data_ok, rdata0, rdata1); - -endinterface - -// SRAM interface for IDCache/MMU <-> AXI -interface SRAM_RO_AXI_i; - logic req; - word_t addr; - logic [3:0] len; - logic [2:0] size; - logic addr_ok; - logic data_ok; - word_t rdata; - logic rvalid; - - modport master(output req, addr, len, size, input addr_ok, data_ok, rdata, rvalid); - modport slave(input req, addr, len, size, output addr_ok, data_ok, rdata, rvalid); - -endinterface - -// SRAM interface for DCache/MMU <-> AXI -interface SRAM_W_AXI_i; - logic req; - word_t addr; - logic [3:0] len; - logic [2:0] size; - logic [3:0] wstrb; - word_t wdata; - logic wvalid; - logic wlast; - logic addr_ok; - logic data_ok; // 全部写完的响应信号 - logic wready;// 一次写 - - modport master(output req, addr, len, size, wstrb, wdata, wvalid, wlast, input addr_ok, data_ok, wready); - modport slave(input req, addr, len, size, wstrb, wdata, wvalid, wlast, output addr_ok, data_ok, wready); - -endinterface - -`endif From 75a62cfc37ab3d44f09f0e7f8a1c56bf201dfc40 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Wed, 22 Sep 2021 13:41:09 +0800 Subject: [PATCH 46/56] try add trap --- src/Core/Controller.sv | 44 +++++++++++---------- src/Core/Datapath.sv | 26 ++++++++++++ src/include/defines.svh | 18 ++++++++- tools/ctrl_maker.py | 2 +- tools/decoder.py | 63 ++++++++++++++++++----------- tools/ectrl.txt | 14 ++++++- tools/global.txt | 14 ++++++- tools/mctrl0.txt | 14 ++++++- tools/mctrl1.txt | 14 ++++++- tools/pcs.txt | 14 ++++++- tools/privilege.txt | 14 ++++++- tools/trap.txt | 88 +++++++++++++++++++++++++++++++++++++++++ tools/wctrl.txt | 14 ++++++- 13 files changed, 286 insertions(+), 53 deletions(-) create mode 100644 tools/trap.txt diff --git a/src/Core/Controller.sv b/src/Core/Controller.sv index 96692bb..2b36f2c 100644 --- a/src/Core/Controller.sv +++ b/src/Core/Controller.sv @@ -29,48 +29,49 @@ module Controller ( imm ); - assign ctrl.BJRJ = ~inst[26] & (~inst[27] & ~inst[30] & (~inst[28] & ~inst[31] & ~inst[29] & inst[3] & ~inst[1] & ~inst[4] & ~inst[2] | inst[28] & ~inst[31] & ~inst[29]) | inst[27] & ~inst[31] & ~inst[29]) | inst[26] & ~inst[31] & ~inst[29]; - assign ctrl.B = ~inst[31] & ~inst[29] & (inst[28] | ~inst[27] & inst[26]); + assign ctrl.BJRJ = ~inst[26] & (~inst[27] & (~inst[28] & ~inst[30] & ~inst[31] & ~inst[29] & inst[3] & ~inst[1] & ~inst[4] & ~inst[2] | inst[28] & ~inst[29] & ~inst[31]) | inst[27] & ~inst[31] & ~inst[29]) | inst[26] & ~inst[31] & ~inst[29] & (~inst[19] | inst[27] | inst[28]); + assign ctrl.B = ~inst[26] & inst[28] & ~inst[29] & ~inst[31] | inst[26] & ~inst[31] & ~inst[29] & (~inst[27] & ~inst[19] | inst[28]); assign ctrl.JR = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[4] & inst[3] & ~inst[2] & ~inst[1]; assign ctrl.J = ~inst[31] & ~inst[29] & ~inst[28] & inst[27]; + // Take Care of BGO assign ctrl.BGO = ~inst[26] & (eq | inst[27] & ltz) | inst[26] & (~inst[27] & (~inst[28] & (inst[16] & ~ltz | ~inst[16] & ltz) | inst[28] & ~eq) | inst[27] & ~eq & ~ltz); assign ctrl.PRV = ~inst[31] & inst[30] & ~inst[29]; assign ctrl.SYSCALL = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[3] & inst[2] & ~inst[0]; assign ctrl.BREAK = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[3] & inst[2] & ~inst[1] & inst[0]; assign ctrl.ERET = ~inst[31] & inst[30] & inst[4]; - assign ctrl.OFA = ~inst[31] & ~inst[28] & ~inst[27] & ~inst[26] & (~inst[30] & inst[5] & ~inst[3] & ~inst[2] & ~inst[0] | inst[29]); + assign ctrl.OFA = ~inst[26] & ~inst[30] & (~inst[29] & ~inst[31] & ~inst[28] & ~inst[27] & inst[5] & ~inst[0] & ~inst[4] & ~inst[2] & ~inst[3] | inst[29] & ~inst[27] & ~inst[31] & ~inst[28]); - assign ctrl.ES = ~inst[30] & (~inst[28] & ~inst[27] & ~inst[26] & (~inst[3] & inst[2] | inst[3] & (inst[4] | inst[1]) | inst[5]) | inst[31]) | inst[29]; - assign ctrl.ET = ~inst[31] & ~inst[27] & ~inst[26] & (~inst[30] & ~inst[29] & ~inst[28] & (~inst[3] & ~inst[4] | inst[3] & inst[4] | inst[5]) | inst[30] & inst[29]); - assign ctrl.DS = ~inst[26] & (~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[4] & inst[3] & ~inst[2] & ~inst[1] | inst[28] & ~inst[29] & ~inst[31]) | inst[26] & ~inst[31] & ~inst[29] & (~inst[27] | inst[28]); + assign ctrl.ES = ~inst[30] & (~inst[28] & ~inst[27] & (~inst[26] & (~inst[3] & inst[2] | inst[3] & (inst[1] | inst[4]) | inst[5]) | inst[26] & inst[19]) | inst[31]) | inst[29]; + assign ctrl.ET = ~inst[26] & ~inst[27] & ~inst[31] & (~inst[30] & ~inst[29] & ~inst[28] & (~inst[3] & ~inst[4] | inst[3] & inst[4] | inst[5]) | inst[30] & inst[29]); + assign ctrl.DS = ~inst[26] & (~inst[28] & ~inst[30] & ~inst[31] & ~inst[29] & ~inst[27] & inst[3] & ~inst[1] & ~inst[4] & ~inst[2] | inst[28] & ~inst[29] & ~inst[31]) | inst[26] & ~inst[31] & ~inst[29] & (~inst[27] & ~inst[19] | inst[28]); assign ctrl.DT = ~inst[28] & ~inst[26] & ~inst[30] & ~inst[31] & ~inst[29] & ~inst[27] & inst[3] & inst[1] & ~inst[5] & ~inst[4] | inst[28] & ~inst[29] & ~inst[31] & ~inst[27]; - assign ctrl.DP0 = ~inst[31] & (~inst[30] | inst[29] | ~inst[25] | inst[4]) | inst[31] & inst[30]; - assign ctrl.DP1 = inst[26] | (~inst[30] & (inst[31] | inst[29] | inst[28] | inst[27] | ~inst[4]) | inst[30] & (~inst[29] & inst[25] | inst[3])); + assign ctrl.DP0 = ~inst[31] & (~inst[30] & (~inst[26] & (~inst[4] | ~inst[5] | inst[27] | inst[28]) | inst[26] & (~inst[19] | inst[27] | inst[28])) | inst[30] & (~inst[25] | inst[4]) | inst[29]) | inst[31] & inst[30]; + assign ctrl.DP1 = ~inst[30] & (~inst[4] | inst[5] | inst[28] | inst[29] | inst[31] | inst[27] | inst[26]) | inst[30] & ~inst[29] & (inst[25] | inst[31]); assign ctrl.ECtrl.OP.f_sl = ~inst[31] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & ~inst[3] & ~inst[1]; assign ctrl.ECtrl.OP.f_sr = ~inst[31] & ~inst[28] & ~inst[26] & ~inst[27] & ~inst[29] & ~inst[5] & ~inst[3] & inst[1]; - assign ctrl.ECtrl.OP.f_add = ~inst[28] & (~inst[27] & ~inst[26] & ((~inst[5] & inst[3] & ~inst[1] | inst[5] & ~inst[3] & ~inst[2]) | inst[29]) | inst[26] & (~inst[29] | ~inst[27])) | inst[31]; - assign ctrl.ECtrl.OP.f_and = ~inst[31] & (~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[5] & inst[2] & ~inst[1] & ~inst[0] | inst[28] & ~inst[27] & ~inst[26]); + assign ctrl.ECtrl.OP.f_add = (~inst[28] & (~inst[26] & ~inst[27] & ((~inst[5] & inst[3] & ~inst[1] | inst[5] & (~inst[0] & (~inst[2] & ~inst[4] & ~inst[3] | inst[2] & inst[4]) | inst[0] & ~inst[2] & ~inst[4] & ~inst[3])) | inst[29]) | inst[26] & (~inst[29] & ((~inst[16] & (inst[20] | inst[18]) | inst[16] & inst[20]) | inst[27]) | inst[29] & ~inst[27])) | inst[31]); + assign ctrl.ECtrl.OP.f_and = ~inst[31] & (~inst[28] & ~inst[26] & ~inst[27] & ~inst[29] & inst[5] & ~inst[0] & inst[2] & ~inst[4] & ~inst[1] | inst[28] & ~inst[27] & ~inst[26]); assign ctrl.ECtrl.OP.f_or = ~inst[31] & (~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[5] & inst[2] & inst[0] | inst[28] & ~inst[27] & inst[26]); - assign ctrl.ECtrl.OP.f_xor = ~inst[31] & (~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[5] & inst[2] & inst[1] & ~inst[0] | inst[28] & inst[27]); - assign ctrl.ECtrl.OP.f_slt = ~inst[31] & ~inst[28] & ~inst[26] & (~inst[29] & inst[5] & inst[3] & ~inst[2] & ~inst[0] | inst[27]); - assign ctrl.ECtrl.OP.f_sltu = ~inst[31] & ~inst[28] & (~inst[29] & ~inst[27] & ~inst[26] & inst[5] & inst[3] & ~inst[2] & inst[0] | inst[29] & inst[27] & inst[26]); + assign ctrl.ECtrl.OP.f_xor = ~inst[31] & (~inst[28] & ~inst[26] & ~inst[27] & ~inst[29] & inst[5] & ~inst[0] & inst[2] & ~inst[4] & inst[1] | inst[28] & inst[27]); + assign ctrl.ECtrl.OP.f_slt = ~inst[31] & ~inst[28] & (~inst[26] & (~inst[29] & inst[5] & ~inst[0] & ~inst[2] & (inst[3] | inst[4]) | inst[27]) | inst[26] & ~inst[29] & ~inst[27] & ~inst[16] & ~inst[18] & ~inst[20]); + assign ctrl.ECtrl.OP.f_sltu = ~inst[31] & ~inst[28] & (~inst[26] & ~inst[27] & ~inst[29] & inst[5] & inst[0] & ~inst[2] & (inst[3] | inst[4]) | inst[26] & (~inst[29] & ~inst[27] & inst[16] & ~inst[20] | inst[29] & inst[27])); assign ctrl.ECtrl.OP.f_mova = ~inst[31] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & inst[3] & inst[1]; - assign ctrl.ECtrl.OP.alt = ~inst[31] & (~inst[26] & (~inst[29] & inst[1] & (inst[5] | inst[0]) | inst[27]) | inst[26] & inst[29] & inst[27]); + assign ctrl.ECtrl.OP.alt = ~inst[31] & ~inst[28] & (~inst[29] & ~inst[27] & (~inst[26] & (inst[1] & (inst[0] | inst[5]) | inst[4]) | inst[26] & ~inst[20]) | inst[29] & inst[27]); - assign ctrl.ECtrl.SA = SA_t'({~inst[26] & ((inst[3] & inst[1] | inst[2]) | inst[5]) | inst[31] | inst[29], (~inst[28] & (inst[29] | inst[26] | inst[5] | inst[3] | inst[2]) | inst[28] & (~inst[27] | ~inst[26])) | inst[31]}); - assign ctrl.ECtrl.SB = SB_t'({inst[31] | inst[29], inst[26] | ~inst[5] & inst[3]}); + assign ctrl.ECtrl.SA = SA_t'({(~inst[27] & (~inst[26] & ((inst[3] & inst[1] | inst[2]) | inst[5]) | inst[26] & ~inst[20]) | inst[31]) | inst[29], (~inst[28] & (inst[2] | inst[3] | inst[5] | inst[29] | inst[26]) | inst[28] & (~inst[27] | ~inst[26])) | inst[31]}); + assign ctrl.ECtrl.SB = SB_t'({(inst[26] & ~inst[27] & ~inst[20] | inst[31]) | inst[29], inst[3] & ~inst[5] | inst[26]}); - assign ctrl.MCtrl0.HW = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (~inst[1] & inst[0] | inst[3]) | inst[30] & inst[29] & ~inst[1]; - assign ctrl.MCtrl0.LW = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (inst[1] & inst[0] | inst[3]) | inst[30] & inst[29] & ~inst[1]; + assign ctrl.MCtrl0.HW = ~inst[30] & ~inst[26] & ~inst[29] & ~inst[28] & ~inst[27] & inst[4] & (~inst[5] & ~inst[1] & inst[0] | inst[3]) | inst[30] & inst[29] & ~inst[1]; + assign ctrl.MCtrl0.LW = ~inst[30] & ~inst[26] & ~inst[29] & ~inst[28] & ~inst[27] & inst[4] & (~inst[5] & inst[1] & inst[0] | inst[3]) | inst[30] & inst[29] & ~inst[1]; assign ctrl.MCtrl0.HLS = HLS_t'({(~inst[30] & ~inst[26] & ~inst[27] & ~inst[31] & ~inst[29] & ~inst[28] & inst[4] & inst[3] | inst[30] & inst[29]), inst[1] & ~inst[30], inst[0]}); assign ctrl.MCtrl0.MAS = MAS_t'({inst[2], inst[30] & ~inst[2] & ~inst[1]}); assign ctrl.MCtrl0.C0D = inst[15:11]; assign ctrl.MCtrl0.C0W = ~inst[31] & inst[30] & ~inst[29] & inst[23] & ~inst[3]; assign ctrl.MCtrl0.SEL = inst[2:0]; - assign ctrl.MCtrl0.RS0 = RS0_t'({~inst[30] & (~inst[4] | inst[26] | inst[29]), inst[30], ~inst[29] & (~inst[1] | inst[30])}); + assign ctrl.MCtrl0.RS0 = RS0_t'({~inst[30] & (~inst[4] | inst[5] | inst[29] | inst[26]), inst[30], ~inst[29] & (~inst[1] | inst[30])}); assign ctrl.MCtrl1.MR = inst[31] & ~inst[30]; assign ctrl.MCtrl1.MWR = inst[29]; @@ -83,9 +84,12 @@ module Controller ( assign ctrl.MCtrl1.TLBP = ~inst[31] & inst[30] & ~inst[4] & inst[3]; assign ctrl.MCtrl1.CACHE_OP = CacheOp_t'({inst[29] & inst[28] & inst[26] & inst[16], inst[29] & inst[28] & inst[26] & ~inst[20], inst[29] & inst[28] & inst[26] & ~inst[18] & (inst[20] | inst[19] | ~inst[16])}); + assign ctrl.Trap.TEN = ~inst[30] & ~inst[27] & (~inst[26] & ~inst[31] & ~inst[29] & ~inst[28] & inst[4] & inst[5] | inst[26] & ~inst[31] & ~inst[29] & ~inst[28] & inst[19]) | inst[30] & ~inst[29] & ~inst[31]; + assign ctrl.Trap.TP = TrapOp_t'({~inst[26] & inst[2] | inst[26] & inst[18], ~inst[26] & inst[1] | inst[26] & inst[17]}); + logic mov, rw, eqz; assign mov = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & ~inst[4] & inst[3] & ~inst[2] & inst[1]; - assign rw = (~inst[30] & (~inst[27] & (~inst[26] & (~inst[31] & (~inst[28] & (~inst[4] & (~inst[3] | ~inst[2] & (inst[1] | inst[0])) | inst[4] & ~inst[3] & ~inst[0]) | inst[29]) | inst[31] & ~inst[29]) | inst[26] & (~inst[31] & (~inst[28] & inst[20] | inst[29]) | inst[31] & ~inst[29])) | inst[27] & (~inst[31] & (~inst[28] & inst[26] | inst[29]) | inst[31] & ~inst[29])) | ~inst[31] & inst[30] & ~inst[3] & (~inst[29] & ~inst[25] & ~inst[23] | inst[29] & inst[1])); + assign rw = ~inst[30] & (~inst[26] & (~inst[27] & (~inst[31] & (~inst[28] & (~inst[4] & (~inst[3] | ~inst[2] & (inst[0] | inst[1])) | inst[4] & ~inst[5] & ~inst[3] & ~inst[0]) | inst[29]) | inst[31] & ~inst[29]) | inst[27] & (~inst[31] & inst[29] | inst[31] & ~inst[29])) | inst[26] & (~inst[29] & (~inst[27] & ~inst[28] & inst[20] | inst[27] & ~inst[28] | inst[31]) | inst[29] & ~inst[31])) | inst[30] & ~inst[31] & ~inst[3] & (~inst[29] & ~inst[25] & ~inst[23] | inst[29] & inst[1]); assign eqz = rt == 32'h0; assign ctrl.WCtrl.RW = ctrl.RD != 5'b00000 & (~mov | ~inst[0] & eqz | inst[0] & ~eqz) & rw; diff --git a/src/Core/Datapath.sv b/src/Core/Datapath.sv index e31a186..3f9893a 100644 --- a/src/Core/Datapath.sv +++ b/src/Core/Datapath.sv @@ -253,6 +253,7 @@ module Datapath ( word_t M_I0_HI; word_t M_I0_LO; + logic M_I1_Trap; logic M_I1_NowExcValid; logic M_I1_PrevExcValid; logic [4:0] M_I1_PrevExcCode; @@ -482,6 +483,7 @@ module Datapath ( | D.IB.PRV & ~C0_kernel); assign D.IB_ERET = D_IB_valid & D.IB_pc[1:0] == 2'b00 & ~D_IB_TLBRefill & ~D_IB_TLBInvalid & ~D_IB_AddressError & D_IB_iv & D.IB.ERET & ~D.IB_Delay; assign D.IB_REFILL = D_IB_valid & D.IB_pc[1:0] == 2'b00 & D_IB_TLBRefill; + // EXCCODE_BP and EXCCODE_SYSCALL -> exc.txt assign D.IB_ExcCode = D.IB_pc[1:0] != 2'b00 | D_IB_AddressError ? `EXCCODE_ADEL : D_IB_TLBRefill ? `EXCCODE_TLBL : D_IB_TLBInvalid ? `EXCCODE_TLBL @@ -606,6 +608,7 @@ module Datapath ( assign D.I1.sa = D.A ? D.IA_sa : D.IB_sa; assign D.I1.ECtrl = D.A ? D.IA.ECtrl : D.IB.ECtrl; assign D.I1.MCtrl = D.A ? D.IA.MCtrl1 : D.IB.MCtrl1; + assign D.I1.Trap = D.A ? D.IA.Trap : D.IB.Trap; assign D.I1.RD = D.A ? D.IA.RD : D.IB.RD; assign D.I1.WCtrl = D.A ? D.IA.WCtrl : D.IB.WCtrl; @@ -793,6 +796,14 @@ module Datapath ( ~D_go | ~D_I1_go, E.I1.MCtrl ); + ffenrc #(3) E_I1_Trap_ff ( + clk, + rst | rstM, + D.I1.Trap, + E.en, + ~D_go | ~D_I1_go, + E.I1.Trap + ); ffenrc #(5 + 1) E_I1_WCtrl_ff ( clk, rst | rstM, @@ -1085,6 +1096,14 @@ module Datapath ( ~E_go | ~E_I1_go, M.I1.MCtrl ); + ffenrc #(3) M_I1_Trap_ff ( + clk, + rst | rstM, + E.I1.Trap, + M.en, + ~E_go | ~E_I1_go, + M.I1.Trap + ); ffenrc #(5 + 1) M_I1_WCtrl_ff ( clk, rst | rstM, @@ -1114,6 +1133,7 @@ module Datapath ( assign M.I1.ExcValid = M_I1_PrevExcValid | M_I1_NowExcValid; assign M.I1.REFILL = M_I1_PrevREFILL | dTLBRefillB; assign M.I1.ExcCode = M_I1_PrevExcValid ? M_I1_PrevExcCode + : M_I1_Trap ? `EXCCODE_TR : dAddressErrorB ? M.I1.MCtrl.MWR ? `EXCCODE_ADES : `EXCCODE_ADES : dTLBRefillB ? M.I1.MCtrl.MWR ? `EXCCODE_TLBS : `EXCCODE_TLBL : dTLBInvalidB ? M.I1.MCtrl.MWR ? `EXCCODE_TLBS : `EXCCODE_TLBL @@ -1300,6 +1320,12 @@ module Datapath ( M_I1_DataR ); + // M.I1.TRAP + assign M_I1_Trap = M.I1.Trap.TEN & ( M.I1.Trap.TP == NE ? M.I1.ALUOut != 32'b0 + : M.I1.Trap.TP == EQ ? M.I1.ALUOut == 32'b0 + : M.I1.Trap.TP == LT ? M.I1.ALUOut[0] == 1'b1 + : M.I1.Trap.TP == GE ? M.I1.ALUOut[0] == 1'b0); + assign M.en = M_go & W.en; assign M_go = (M.I0.MCtrl.HLS[2:1] != 2'b10 | M_I0_MULT_bvalid) & (M.I0.MCtrl.HLS != DIV | M_I0_DIV_bvalid) diff --git a/src/include/defines.svh b/src/include/defines.svh index 72fed70..54194b3 100644 --- a/src/include/defines.svh +++ b/src/include/defines.svh @@ -10,7 +10,7 @@ // fetch_tlb_refill // fetch_tlb_invalid // ri -// syscall, break, overflow +// syscall, break, overflow, trap // mem_addr // mem_tlb_refill // mem_tlb_invalid @@ -94,6 +94,13 @@ typedef enum logic [2:0] { DC_IO = 3'b111 // D-Cache Index writeOnly } CacheOp_t; +typedef enum logic [1:0] { + GE = 2'b00, + LT = 2'b01, + EQ = 2'b10, + NE = 2'b11 +} TrapOp_t; + typedef struct packed { SA_t SA; SB_t SB; @@ -124,6 +131,11 @@ typedef struct packed { CacheOp_t CACHE_OP; // critical } MCtrl1_t; +typedef struct packed { + logic TEN; // critical + TrapOp_t TP; +} Trap_t; + typedef struct packed { logic RW; // critical } WCtrl_t; @@ -155,6 +167,7 @@ typedef struct packed { MCtrl0_t MCtrl0; MCtrl1_t MCtrl1; + Trap_t Trap; logic [4:0] RD; WCtrl_t WCtrl; @@ -245,6 +258,7 @@ typedef struct packed { ECtrl_t ECtrl; MCtrl1_t MCtrl; + Trap_t Trap; logic [4:0] RD; WCtrl_t WCtrl; @@ -305,6 +319,7 @@ typedef struct packed { word_t ALUOut; MCtrl1_t MCtrl; + Trap_t Trap; logic [4:0] RD; WCtrl_t WCtrl; @@ -355,6 +370,7 @@ typedef struct packed { word_t ALUOut; MCtrl1_t MCtrl; + Trap_t Trap; word_t RDataW; logic [4:0] RD; diff --git a/tools/ctrl_maker.py b/tools/ctrl_maker.py index c7fd510..ec48f5f 100644 --- a/tools/ctrl_maker.py +++ b/tools/ctrl_maker.py @@ -1,4 +1,4 @@ -with open('wctrl.txt') as f: +with open('global.txt') as f: lines = f.readlines() title = lines[0].split() items = [x.split() for x in lines[1:]] diff --git a/tools/decoder.py b/tools/decoder.py index 4441b71..e87fd06 100644 --- a/tools/decoder.py +++ b/tools/decoder.py @@ -1,13 +1,13 @@ table = [ # ('000000000000000000000?????001111', 'SYNC'), - ('00000000000???????????????000000', 'SLL'), + # ('00000000000???????????????000000', 'SLL'), # ('00000000000???????????????000010', 'SRL'), # ('00000000000???????????????000011', 'SRA'), # ('000000???????????????00000000100', 'SLLV'), # ('000000???????????????00000000110', 'SRLV'), # ('000000???????????????00000000111', 'SRAV'), - ('000000???????????????00000001010', 'MOVZ'), - ('000000???????????????00000001011', 'MOVN'), + # ('000000???????????????00000001010', 'MOVZ'), + # ('000000???????????????00000001011', 'MOVN'), # ('000000?????000000000000000001000', 'JR'), # ('000000?????00000?????00000001001', 'JALR'), # ('000000????????????????????001100', 'SYSCALL'), @@ -30,9 +30,21 @@ table = [ # ('000000???????????????00000100111', 'NOR'), # ('000000???????????????00000101010', 'SLT'), # ('000000???????????????00000101011', 'SLTU'), + ('000000????????????????????110000', 'TGE'), + ('000000????????????????????110001', 'TGEU'), + ('000000????????????????????110010', 'TLT'), + ('000000????????????????????110011', 'TLTU'), + ('000000????????????????????110100', 'TEQ'), + ('000000????????????????????110110', 'TNE'), # ('000001?????00000????????????????', 'BLTZ'), - # ('000001?????10000????????????????', 'BLTZAL'), # ('000001?????00001????????????????', 'BGEZ'), + ('000001?????01000????????????????', 'TGEI'), + ('000001?????01001????????????????', 'TGEIU'), + ('000001?????01010????????????????', 'TLTI'), + ('000001?????01011????????????????', 'TLTIU'), + ('000001?????01110????????????????', 'TNEI'), + ('000001?????01100????????????????', 'TEQI'), + # ('000001?????10000????????????????', 'BLTZAL'), # ('000001?????10001????????????????', 'BGEZAL'), # ('000010??????????????????????????', 'J'), # ('000011??????????????????????????', 'JAL'), @@ -97,8 +109,8 @@ for inst, name in table: print('=====', name, '=====') ctrl = {} - ctrl['BJRJ'] = ~inst[26] & (~inst[27] & ~inst[30] & (~inst[28] & ~inst[31] & ~inst[29] & inst[3] & ~inst[1] & ~inst[4] & ~inst[2] | inst[28] & ~inst[31] & ~inst[29]) | inst[27] & ~inst[31] & ~inst[29]) | inst[26] & ~inst[31] & ~inst[29] - ctrl['B'] = ~inst[31] & ~inst[29] & (inst[28] | ~inst[27] & inst[26]) + ctrl['BJRJ'] = ~inst[26] & (~inst[27] & (~inst[28] & ~inst[30] & ~inst[31] & ~inst[29] & inst[3] & ~inst[1] & ~inst[4] & ~inst[2] | inst[28] & ~inst[29] & ~inst[31]) | inst[27] & ~inst[31] & ~inst[29]) | inst[26] & ~inst[31] & ~inst[29] & (~inst[19] | inst[27] | inst[28]) + ctrl['B'] = ~inst[26] & inst[28] & ~inst[29] & ~inst[31] | inst[26] & ~inst[31] & ~inst[29] & (~inst[27] & ~inst[19] | inst[28]) ctrl['JR'] = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[4] & inst[3] & ~inst[2] & ~inst[1] ctrl['J'] = ~inst[31] & ~inst[29] & ~inst[28] & inst[27] @@ -107,37 +119,37 @@ for inst, name in table: ctrl['SYSCALL'] = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[3] & inst[2] & ~inst[0] ctrl['BREAK'] = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[3] & inst[2] & ~inst[1] & inst[0] ctrl['ERET'] = ~inst[31] & inst[30] & inst[4] - ctrl['OFA'] = ~inst[31] & ~inst[28] & ~inst[27] & ~inst[26] & (~inst[30] & inst[5] & ~inst[3] & ~inst[2] & ~inst[0] | inst[29]) + ctrl['OFA'] = ~inst[26] & ~inst[30] & (~inst[29] & ~inst[31] & ~inst[28] & ~inst[27] & inst[5] & ~inst[0] & ~inst[4] & ~inst[2] & ~inst[3] | inst[29] & ~inst[27] & ~inst[31] & ~inst[28]) - ctrl['ES'] = ~inst[30] & (~inst[28] & ~inst[27] & ~inst[26] & (~inst[3] & inst[2] | inst[3] & (inst[4] | inst[1]) | inst[5]) | inst[31]) | inst[29] - ctrl['ET'] = ~inst[31] & ~inst[27] & ~inst[26] & (~inst[30] & ~inst[29] & ~inst[28] & (~inst[3] & ~inst[4] | inst[3] & inst[4] | inst[5]) | inst[30] & inst[29]) - ctrl['DS'] = ~inst[26] & (~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[4] & inst[3] & ~inst[2] & ~inst[1] | inst[28] & ~inst[29] & ~inst[31]) | inst[26] & ~inst[31] & ~inst[29] & (~inst[27] | inst[28]) + ctrl['ES'] = ~inst[30] & (~inst[28] & ~inst[27] & (~inst[26] & (~inst[3] & inst[2] | inst[3] & (inst[1] | inst[4]) | inst[5]) | inst[26] & inst[19]) | inst[31]) | inst[29] + ctrl['ET'] = ~inst[26] & ~inst[27] & ~inst[31] & (~inst[30] & ~inst[29] & ~inst[28] & (~inst[3] & ~inst[4] | inst[3] & inst[4] | inst[5]) | inst[30] & inst[29]) + ctrl['DS'] = ~inst[26] & (~inst[28] & ~inst[30] & ~inst[31] & ~inst[29] & ~inst[27] & inst[3] & ~inst[1] & ~inst[4] & ~inst[2] | inst[28] & ~inst[29] & ~inst[31]) | inst[26] & ~inst[31] & ~inst[29] & (~inst[27] & ~inst[19] | inst[28]) ctrl['DT'] = ~inst[28] & ~inst[26] & ~inst[30] & ~inst[31] & ~inst[29] & ~inst[27] & inst[3] & inst[1] & ~inst[5] & ~inst[4] | inst[28] & ~inst[29] & ~inst[31] & ~inst[27] - ctrl['DP0'] = ~inst[31] & (~inst[30] | inst[29] | ~inst[25] | inst[4]) | inst[31] & inst[30] - ctrl['DP1'] = inst[26] | (~inst[30] & (inst[31] | inst[29] | inst[28] | inst[27] | ~inst[4]) | inst[30] & (~inst[29] & inst[25] | inst[3])) + ctrl['DP0'] = ~inst[31] & (~inst[30] & (~inst[26] & (~inst[4] | ~inst[5] | inst[27] | inst[28]) | inst[26] & (~inst[19] | inst[27] | inst[28])) | inst[30] & (~inst[25] | inst[4]) | inst[29]) | inst[31] & inst[30] + ctrl['DP1'] = ~inst[30] & (~inst[4] | inst[5] | inst[28] | inst[29] | inst[31] | inst[27] | inst[26]) | inst[30] & ~inst[29] & (inst[25] | inst[31]) ctrl['ECtrl_OP_f_sl'] = ~inst[31] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & ~inst[3] & ~inst[1] ctrl['ECtrl_OP_f_sr'] = ~inst[31] & ~inst[28] & ~inst[26] & ~inst[27] & ~inst[29] & ~inst[5] & ~inst[3] & inst[1] - ctrl['ECtrl_OP_f_add'] = ~inst[28] & (~inst[27] & ~inst[26] & ((~inst[5] & inst[3] & ~inst[1] | inst[5] & ~inst[3] & ~inst[2]) | inst[29]) | inst[26] & (~inst[29] | ~inst[27])) | inst[31] - ctrl['ECtrl_OP_f_and'] = ~inst[31] & (~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[5] & inst[2] & ~inst[1] & ~inst[0] | inst[28] & ~inst[27] & ~inst[26]) + ctrl['ECtrl_OP_f_add'] = ~inst[28] & (~inst[26] & ~inst[27] & ((~inst[5] & inst[3] & ~inst[1] | inst[5] & (~inst[0] & (~inst[2] & ~inst[4] & ~inst[3] | inst[2] & inst[4]) | inst[0] & ~inst[2] & ~inst[4] & ~inst[3])) | inst[29]) | inst[26] & (~inst[29] & ((~inst[16] & (inst[20] | inst[18]) | inst[16] & inst[20]) | inst[27]) | inst[29] & ~inst[27])) | inst[31] + ctrl['ECtrl_OP_f_and'] = ~inst[31] & (~inst[28] & ~inst[26] & ~inst[27] & ~inst[29] & inst[5] & ~inst[0] & inst[2] & ~inst[4] & ~inst[1] | inst[28] & ~inst[27] & ~inst[26]) ctrl['ECtrl_OP_f_or'] = ~inst[31] & (~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[5] & inst[2] & inst[0] | inst[28] & ~inst[27] & inst[26]) - ctrl['ECtrl_OP_f_xor'] = ~inst[31] & (~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[5] & inst[2] & inst[1] & ~inst[0] | inst[28] & inst[27]) - ctrl['ECtrl_OP_f_slt'] = ~inst[31] & ~inst[28] & ~inst[26] & (~inst[29] & inst[5] & inst[3] & ~inst[2] & ~inst[0] | inst[27]) - ctrl['ECtrl_OP_f_sltu'] = ~inst[31] & ~inst[28] & (~inst[29] & ~inst[27] & ~inst[26] & inst[5] & inst[3] & ~inst[2] & inst[0] | inst[29] & inst[27] & inst[26]) + ctrl['ECtrl_OP_f_xor'] = ~inst[31] & (~inst[28] & ~inst[26] & ~inst[27] & ~inst[29] & inst[5] & ~inst[0] & inst[2] & ~inst[4] & inst[1] | inst[28] & inst[27]) + ctrl['ECtrl_OP_f_slt'] = ~inst[31] & ~inst[28] & (~inst[26] & (~inst[29] & inst[5] & ~inst[0] & ~inst[2] & (inst[3] | inst[4]) | inst[27]) | inst[26] & ~inst[29] & ~inst[27] & ~inst[16] & ~inst[18] & ~inst[20]) + ctrl['ECtrl_OP_f_sltu'] = ~inst[31] & ~inst[28] & (~inst[26] & ~inst[27] & ~inst[29] & inst[5] & inst[0] & ~inst[2] & (inst[3] | inst[4]) | inst[26] & (~inst[29] & ~inst[27] & inst[16] & ~inst[20] | inst[29] & inst[27])) ctrl['ECtrl_OP_f_mova'] = ~inst[31] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & inst[3] & inst[1] - ctrl['ECtrl_OP_alt'] = ~inst[31] & (~inst[26] & (~inst[29] & inst[1] & (inst[5] | inst[0]) | inst[27]) | inst[26] & inst[29] & inst[27]) + ctrl['ECtrl_OP_alt'] = ~inst[31] & ~inst[28] & (~inst[29] & ~inst[27] & (~inst[26] & (inst[1] & (inst[0] | inst[5]) | inst[4]) | inst[26] & ~inst[20]) | inst[29] & inst[27]) - ctrl['ECtrl_SA'] = (~inst[26] & ((inst[3] & inst[1] | inst[2]) | inst[5]) | inst[31] | inst[29], (~inst[28] & (inst[29] | inst[26] | inst[5] | inst[3] | inst[2]) | inst[28] & (~inst[27] | ~inst[26])) | inst[31]) - ctrl['ECtrl_SB'] = (inst[31] | inst[29], inst[26] | ~inst[5] & inst[3]) + ctrl['ECtrl_SA'] = ((~inst[27] & (~inst[26] & ((inst[3] & inst[1] | inst[2]) | inst[5]) | inst[26] & ~inst[20]) | inst[31]) | inst[29], (~inst[28] & (inst[2] | inst[3] | inst[5] | inst[29] | inst[26]) | inst[28] & (~inst[27] | ~inst[26])) | inst[31]) + ctrl['ECtrl_SB'] = ((inst[26] & ~inst[27] & ~inst[20] | inst[31]) | inst[29], inst[3] & ~inst[5] | inst[26]) ctrl['imm'] = (~inst[31] & inst[28] & inst[27] & inst[26], inst[31] | ~inst[28]) - ctrl['MCtrl0_HW'] = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (~inst[1] & inst[0] | inst[3]) | inst[30] & inst[29] & ~inst[1] - ctrl['MCtrl0_LW'] = ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & inst[4] & (inst[1] & inst[0] | inst[3]) | inst[30] & inst[29] & ~inst[1] + ctrl['MCtrl0_HW'] = ~inst[30] & ~inst[26] & ~inst[29] & ~inst[28] & ~inst[27] & inst[4] & (~inst[5] & ~inst[1] & inst[0] | inst[3]) | inst[30] & inst[29] & ~inst[1] + ctrl['MCtrl0_LW'] = ~inst[30] & ~inst[26] & ~inst[29] & ~inst[28] & ~inst[27] & inst[4] & (~inst[5] & inst[1] & inst[0] | inst[3]) | inst[30] & inst[29] & ~inst[1] ctrl['MCtrl0_HLS'] = (~inst[30] & ~inst[26] & ~inst[27] & ~inst[31] & ~inst[29] & ~inst[28] & inst[4] & inst[3] | inst[30] & inst[29]), inst[1] & ~inst[30], inst[0] ctrl['MCtrl0_MAS'] = (inst[2], inst[30] & ~inst[2] & ~inst[1]) ctrl['MCtrl0_C0W'] = ~inst[31] & inst[30] & ~inst[29] & inst[23] & ~inst[3] - ctrl['MCtrl0_RS0'] = (~inst[30] & (~inst[4] | inst[26] | inst[29]), inst[30], ~inst[29] & (~inst[1] | inst[30])) + ctrl['MCtrl0_RS0'] = (~inst[30] & (~inst[4] | inst[5] | inst[29] | inst[26]), inst[30], ~inst[29] & (~inst[1] | inst[30])) ctrl['MCtrl1_MR'] = inst[31] & ~inst[30] ctrl['MCtrl1_MWR'] = inst[29] @@ -149,7 +161,10 @@ for inst, name in table: ctrl['MCtrl1_TLBP'] = ~inst[31] & inst[30] & ~inst[4] & inst[3] ctrl['MCtrl1_CACHE_OP'] = (inst[29] & inst[28] & inst[26] & inst[16], inst[29] & inst[28] & inst[26] & ~inst[20], inst[29] & inst[28] & inst[26] & ~inst[18] & (inst[20] | inst[19] | ~inst[16])) + ctrl['Trap_TEN'] = ~inst[30] & ~inst[27] & (~inst[26] & ~inst[31] & ~inst[29] & ~inst[28] & inst[4] & inst[5] | inst[26] & ~inst[31] & ~inst[29] & ~inst[28] & inst[19]) | inst[30] & ~inst[29] & ~inst[31] + ctrl['Trap_OP'] = (~inst[26] & inst[2] | inst[26] & inst[18], ~inst[26] & inst[1] | inst[26] & inst[17]) + ctrl['WCtrl_MOV'] = ~inst[31] & ~inst[30] & ~inst[29] & ~inst[28] & ~inst[27] & ~inst[26] & ~inst[5] & ~inst[4] & inst[3] & ~inst[2] & inst[1] - ctrl['WCtrl_RW'] = (~inst[30] & (~inst[27] & (~inst[26] & (~inst[31] & (~inst[28] & (~inst[4] & (~inst[3] | ~inst[2] & (inst[1] | inst[0])) | inst[4] & ~inst[3] & ~inst[0]) | inst[29]) | inst[31] & ~inst[29]) | inst[26] & (~inst[31] & (~inst[28] & inst[20] | inst[29]) | inst[31] & ~inst[29])) | inst[27] & (~inst[31] & (~inst[28] & inst[26] | inst[29]) | inst[31] & ~inst[29])) | ~inst[31] & inst[30] & ~inst[3] & (~inst[29] & ~inst[25] & ~inst[23] | inst[29] & inst[1])) + ctrl['WCtrl_RW'] = ~inst[30] & (~inst[26] & (~inst[27] & (~inst[31] & (~inst[28] & (~inst[4] & (~inst[3] | ~inst[2] & (inst[0] | inst[1])) | inst[4] & ~inst[5] & ~inst[3] & ~inst[0]) | inst[29]) | inst[31] & ~inst[29]) | inst[27] & (~inst[31] & inst[29] | inst[31] & ~inst[29])) | inst[26] & (~inst[29] & (~inst[27] & ~inst[28] & inst[20] | inst[27] & ~inst[28] | inst[31]) | inst[29] & ~inst[31])) | inst[30] & ~inst[31] & ~inst[3] & (~inst[29] & ~inst[25] & ~inst[23] | inst[29] & inst[1]) ctrl['RD'] = (~inst[29] & inst[30] | inst[29] & ~inst[30] | inst[31], inst[26]) print(ctrl) diff --git a/tools/ectrl.txt b/tools/ectrl.txt index 74888ac..a849974 100644 --- a/tools/ectrl.txt +++ b/tools/ectrl.txt @@ -30,9 +30,21 @@ 32'b000000???????????????00000100111 OR 1 RS 1 1 RT 0 0 ? ? ? // NOR 32'b000000???????????????00000101010 SLT 1 RS 1 1 RT 0 0 ? ? ? // SLT 32'b000000???????????????00000101011 SLTU 1 RS 1 1 RT 0 0 ? ? ? // SLTU +32'b000000????????????????????110000 SLT 1 RS 1 1 RT 0 0 ? ? ? // TGE +32'b000000????????????????????110001 SLTU 1 RS 1 1 RT 0 0 ? ? ? // TGEU +32'b000000????????????????????110010 SLT 1 RS 1 1 RT 0 0 ? ? ? // TLT +32'b000000????????????????????110011 SLTU 1 RS 1 1 RT 0 0 ? ? ? // TLTU +32'b000000????????????????????110100 ADD 1 RS 1 1 RT 0 0 ? ? ? // TEQ +32'b000000????????????????????110110 ADD 1 RS 1 1 RT 0 0 ? ? ? // TNE 32'b000001?????00000???????????????? ? ? ? ? ? ? ? ? ? ? ? // BLTZ -32'b000001?????10000???????????????? ADD 0 PC 0 1 EIGHT 0 1 ? ? ? // BLTZAL 32'b000001?????00001???????????????? ? ? ? ? ? ? ? ? ? ? ? // BGEZ +32'b000001?????01000???????????????? SLT 1 RS 1 1 IMM 1 ? IX 0 1 // TGEI +32'b000001?????01001???????????????? SLTU 1 RS 1 1 IMM 1 ? IX 0 1 // TGEIU +32'b000001?????01010???????????????? SLT 1 RS 1 1 IMM 1 ? IX 0 1 // TLTI +32'b000001?????01011???????????????? SLTU 1 RS 1 1 IMM 1 ? IX 0 1 // TLTIU +32'b000001?????01110???????????????? ADD 1 RS 1 1 IMM 1 ? IX 0 1 // TNEI +32'b000001?????01100???????????????? ADD 1 RS 1 1 IMM 1 ? IX 0 1 // TEQI +32'b000001?????10000???????????????? ADD 0 PC 0 1 EIGHT 0 1 ? ? ? // BLTZAL 32'b000001?????10001???????????????? ADD 0 PC 0 1 EIGHT 0 1 ? ? ? // BGEZAL 32'b000010?????????????????????????? ? ? ? ? ? ? ? ? ? ? ? // J 32'b000011?????????????????????????? ADD 0 PC 0 1 EIGHT 0 1 ? ? ? // JAL diff --git a/tools/global.txt b/tools/global.txt index ee41f87..5726335 100644 --- a/tools/global.txt +++ b/tools/global.txt @@ -30,9 +30,21 @@ 32'b000000???????????????00000100111 0 0 0 0 1 1 0 0 1 1 // NOR 32'b000000???????????????00000101010 0 0 0 0 1 1 0 0 1 1 // SLT 32'b000000???????????????00000101011 0 0 0 0 1 1 0 0 1 1 // SLTU +32'b000000????????????????????110000 0 0 0 0 1 1 0 0 0 1 // TGE +32'b000000????????????????????110001 0 0 0 0 1 1 0 0 0 1 // TGEU +32'b000000????????????????????110010 0 0 0 0 1 1 0 0 0 1 // TLT +32'b000000????????????????????110011 0 0 0 0 1 1 0 0 0 1 // TLTU +32'b000000????????????????????110100 0 0 0 0 1 1 0 0 0 1 // TEQ +32'b000000????????????????????110110 0 0 0 0 1 1 0 0 0 1 // TNE 32'b000001?????00000???????????????? 0 0 0 0 0 0 1 0 1 1 // BLTZ -32'b000001?????10000???????????????? 0 0 0 0 0 0 1 0 1 1 // BLTZAL 32'b000001?????00001???????????????? 0 0 0 0 0 0 1 0 1 1 // BGEZ +32'b000001?????01000???????????????? 0 0 0 0 1 0 0 0 0 1 // TGEI +32'b000001?????01001???????????????? 0 0 0 0 1 0 0 0 0 1 // TGEIU +32'b000001?????01010???????????????? 0 0 0 0 1 0 0 0 0 1 // TLTI +32'b000001?????01011???????????????? 0 0 0 0 1 0 0 0 0 1 // TLTIU +32'b000001?????01110???????????????? 0 0 0 0 1 0 0 0 0 1 // TNEI +32'b000001?????01100???????????????? 0 0 0 0 1 0 0 0 0 1 // TEQI +32'b000001?????10000???????????????? 0 0 0 0 0 0 1 0 1 1 // BLTZAL 32'b000001?????10001???????????????? 0 0 0 0 0 0 1 0 1 1 // BGEZAL 32'b000010?????????????????????????? 0 0 0 0 0 0 0 0 1 1 // J 32'b000011?????????????????????????? 0 0 0 0 0 0 0 0 1 1 // JAL diff --git a/tools/mctrl0.txt b/tools/mctrl0.txt index b5e0c15..cf56b96 100644 --- a/tools/mctrl0.txt +++ b/tools/mctrl0.txt @@ -30,9 +30,21 @@ 32'b000000???????????????00000100111 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // NOR 32'b000000???????????????00000101010 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // SLT 32'b000000???????????????00000101011 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // SLTU +32'b000000????????????????????110000 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // TGE +32'b000000????????????????????110001 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // TGEU +32'b000000????????????????????110010 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // TLT +32'b000000????????????????????110011 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // TLTU +32'b000000????????????????????110100 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // TEQ +32'b000000????????????????????110110 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // TNE 32'b000001?????00000???????????????? 0 0 ? 0 ? ? ? ? ? 0 ? ? ? ? // BLTZ -32'b000001?????10000???????????????? 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // BLTZAL 32'b000001?????00001???????????????? 0 0 ? 0 ? ? ? ? ? 0 ? ? ? ? // BGEZ +32'b000001?????01000???????????????? 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // TGEI +32'b000001?????01001???????????????? 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // TGEIU +32'b000001?????01010???????????????? 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // TLTI +32'b000001?????01011???????????????? 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // TLTIU +32'b000001?????01110???????????????? 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // TNEI +32'b000001?????01100???????????????? 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // TEQI +32'b000001?????10000???????????????? 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // BLTZAL 32'b000001?????10001???????????????? 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // BGEZAL 32'b000010?????????????????????????? 0 0 ? 0 ? ? ? ? ? 0 ? ? ? ? // J 32'b000011?????????????????????????? 0 0 ? 0 ? ? ? ? ? 0 ALU 1 ? ? // JAL diff --git a/tools/mctrl1.txt b/tools/mctrl1.txt index 2cde4e0..8c57f45 100644 --- a/tools/mctrl1.txt +++ b/tools/mctrl1.txt @@ -30,9 +30,21 @@ 32'b000000???????????????00000100111 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // NOR 32'b000000???????????????00000101010 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // SLT 32'b000000???????????????00000101011 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // SLTU +32'b000000????????????????????110000 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // TGE +32'b000000????????????????????110001 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // TGEU +32'b000000????????????????????110010 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // TLT +32'b000000????????????????????110011 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // TLTU +32'b000000????????????????????110100 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // TEQ +32'b000000????????????????????110110 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // TNE 32'b000001?????00000???????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // BLTZ -32'b000001?????10000???????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // BLTZAL 32'b000001?????00001???????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // BGEZ +32'b000001?????01000???????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // TGEI +32'b000001?????01001???????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // TGEIU +32'b000001?????01010???????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // TLTI +32'b000001?????01011???????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // TLTIU +32'b000001?????01110???????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // TNEI +32'b000001?????01100???????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // TEQI +32'b000001?????10000???????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // BLTZAL 32'b000001?????10001???????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // BGEZAL 32'b000010?????????????????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // J 32'b000011?????????????????????????? 0 0 0 0 0 ? ? ? ? ? ? ? ? ? // JAL diff --git a/tools/pcs.txt b/tools/pcs.txt index 6685032..d1cf094 100644 --- a/tools/pcs.txt +++ b/tools/pcs.txt @@ -30,9 +30,21 @@ 32'b000000???????????????00000100111 0 0 0 0 // NOR 32'b000000???????????????00000101010 0 0 0 0 // SLT 32'b000000???????????????00000101011 0 0 0 0 // SLTU +32'b000000????????????????????110000 0 0 0 0 // TGE +32'b000000????????????????????110001 0 0 0 0 // TGEU +32'b000000????????????????????110010 0 0 0 0 // TLT +32'b000000????????????????????110011 0 0 0 0 // TLTU +32'b000000????????????????????110100 0 0 0 0 // TEQ +32'b000000????????????????????110110 0 0 0 0 // TNE 32'b000001?????00000???????????????? 1 1 0 0 // BLTZ -32'b000001?????10000???????????????? 1 1 0 0 // BLTZAL 32'b000001?????00001???????????????? 1 1 0 0 // BGEZ +32'b000001?????01000???????????????? 0 0 0 0 // TGEI +32'b000001?????01001???????????????? 0 0 0 0 // TGEIU +32'b000001?????01010???????????????? 0 0 0 0 // TLTI +32'b000001?????01011???????????????? 0 0 0 0 // TLTIU +32'b000001?????01110???????????????? 0 0 0 0 // TNEI +32'b000001?????01100???????????????? 0 0 0 0 // TEQI +32'b000001?????10000???????????????? 1 1 0 0 // BLTZAL 32'b000001?????10001???????????????? 1 1 0 0 // BGEZAL 32'b000010?????????????????????????? 1 0 0 1 // J 32'b000011?????????????????????????? 1 0 0 1 // JAL diff --git a/tools/privilege.txt b/tools/privilege.txt index 200ca0e..a7c0de6 100644 --- a/tools/privilege.txt +++ b/tools/privilege.txt @@ -30,9 +30,21 @@ 32'b000000???????????????00000100111 0 // NOR 32'b000000???????????????00000101010 0 // SLT 32'b000000???????????????00000101011 0 // SLTU +32'b000000????????????????????110000 0 // TGE +32'b000000????????????????????110001 0 // TGEU +32'b000000????????????????????110010 0 // TLT +32'b000000????????????????????110011 0 // TLTU +32'b000000????????????????????110100 0 // TEQ +32'b000000????????????????????110110 0 // TNE 32'b000001?????00000???????????????? 0 // BLTZ -32'b000001?????10000???????????????? 0 // BLTZAL 32'b000001?????00001???????????????? 0 // BGEZ +32'b000001?????01000???????????????? 0 // TGEI +32'b000001?????01001???????????????? 0 // TGEIU +32'b000001?????01010???????????????? 0 // TLTI +32'b000001?????01011???????????????? 0 // TLTIU +32'b000001?????01110???????????????? 0 // TNEI +32'b000001?????01100???????????????? 0 // TEQI +32'b000001?????10000???????????????? 0 // BLTZAL 32'b000001?????10001???????????????? 0 // BGEZAL 32'b000010?????????????????????????? 0 // J 32'b000011?????????????????????????? 0 // JAL diff --git a/tools/trap.txt b/tools/trap.txt new file mode 100644 index 0000000..845fdd3 --- /dev/null +++ b/tools/trap.txt @@ -0,0 +1,88 @@ +////-------------------------------- TEN TP TP1 TP0 +32'b000000000000000000000?????001111 0 ? ? ? // SYNC (NOP) +32'b00000000000???????????????000000 0 ? ? ? // SLL +32'b00000000000???????????????000010 0 ? ? ? // SRL +32'b00000000000???????????????000011 0 ? ? ? // SRA +32'b000000???????????????00000000100 0 ? ? ? // SLLV +32'b000000???????????????00000000110 0 ? ? ? // SRLV +32'b000000???????????????00000000111 0 ? ? ? // SRAV +32'b000000???????????????00000001010 0 ? ? ? // MOVZ +32'b000000???????????????00000001011 0 ? ? ? // MOVN +32'b000000?????000000000000000001000 0 ? ? ? // JR +32'b000000?????00000?????00000001001 0 ? ? ? // JALR +32'b000000????????????????????001100 0 ? ? ? // SYSCALL +32'b000000????????????????????001101 0 ? ? ? // BREAK +32'b0000000000000000?????00000010000 0 ? ? ? // MFHI +32'b000000?????000000000000000010001 0 ? ? ? // MTHI +32'b0000000000000000?????00000010010 0 ? ? ? // MFLO +32'b000000?????000000000000000010011 0 ? ? ? // MTLO +32'b000000??????????0000000000011000 0 ? ? ? // MULT +32'b000000??????????0000000000011001 0 ? ? ? // MULTU +32'b000000??????????0000000000011010 0 ? ? ? // DIV +32'b000000??????????0000000000011011 0 ? ? ? // DIVU +32'b000000???????????????00000100000 0 ? ? ? // ADD +32'b000000???????????????00000100001 0 ? ? ? // ADDU +32'b000000???????????????00000100010 0 ? ? ? // SUB +32'b000000???????????????00000100011 0 ? ? ? // SUBU +32'b000000???????????????00000100100 0 ? ? ? // AND +32'b000000???????????????00000100101 0 ? ? ? // OR +32'b000000???????????????00000100110 0 ? ? ? // XOR +32'b000000???????????????00000100111 0 ? ? ? // NOR +32'b000000???????????????00000101010 0 ? ? ? // SLT +32'b000000???????????????00000101011 0 ? ? ? // SLTU +32'b000000????????????????????110000 1 GE 0 0 // TGE +32'b000000????????????????????110001 1 GE 0 0 // TGEU +32'b000000????????????????????110010 1 LT 0 1 // TLT +32'b000000????????????????????110011 1 LT 0 1 // TLTU +32'b000000????????????????????110100 1 EQ 1 0 // TEQ +32'b000000????????????????????110110 1 NE 1 1 // TNE +32'b000001?????00000???????????????? 0 ? ? ? // BLTZ +32'b000001?????00001???????????????? 0 ? ? ? // BGEZ +32'b000001?????01000???????????????? 1 GE 0 0 // TGEI +32'b000001?????01001???????????????? 1 GE 0 0 // TGEIU +32'b000001?????01010???????????????? 1 LT 0 1 // TLTI +32'b000001?????01011???????????????? 1 LT 0 1 // TLTIU +32'b000001?????01110???????????????? 1 NE 1 1 // TNEI +32'b000001?????01100???????????????? 1 EQ 1 0 // TEQI +32'b000001?????10000???????????????? 0 ? ? ? // BLTZAL +32'b000001?????10001???????????????? 0 ? ? ? // BGEZAL +32'b000010?????????????????????????? 0 ? ? ? // J +32'b000011?????????????????????????? 0 ? ? ? // JAL +32'b000100?????????????????????????? 0 ? ? ? // BEQ +32'b000101?????????????????????????? 0 ? ? ? // BNE +32'b000110?????00000???????????????? 0 ? ? ? // BLEZ +32'b000111?????00000???????????????? 0 ? ? ? // BGTZ +32'b001000?????????????????????????? 0 ? ? ? // ADDI +32'b001001?????????????????????????? 0 ? ? ? // ADDIU +32'b001010?????????????????????????? 0 ? ? ? // SLTI +32'b001011?????????????????????????? 0 ? ? ? // SLTIU +32'b001100?????????????????????????? 0 ? ? ? // ANDI +32'b001101?????????????????????????? 0 ? ? ? // ORI +32'b001110?????????????????????????? 0 ? ? ? // XORI +32'b00111100000????????????????????? 0 ? ? ? // LUI +32'b01000000000??????????00000000??? 1 ? ? ? // MFC0 +32'b01000000100??????????00000000??? 1 ? ? ? // MTC0 +32'b01000010000000000000000000000001 1 ? ? ? // TLBR +32'b01000010000000000000000000000010 1 ? ? ? // TLBWI +32'b01000010000000000000000000000110 1 ? ? ? // TLBWR +32'b01000010000000000000000000001000 1 ? ? ? // TLBP +32'b01000010000000000000000000011000 1 ? ? ? // ERET +32'b011100??????????0000000000000000 0 ? ? ? // MADD +32'b011100??????????0000000000000001 0 ? ? ? // MADDU +32'b011100??????????0000000000000100 0 ? ? ? // MSUB +32'b011100??????????0000000000000101 0 ? ? ? // MSUBU +32'b011100???????????????00000000010 0 ? ? ? // MUL +32'b100000?????????????????????????? 0 ? ? ? // LB +32'b100001?????????????????????????? 0 ? ? ? // LH +32'h100010?????????????????????????? 0 ? ? ? // LWL +32'b100011?????????????????????????? 0 ? ? ? // LW +32'b100100?????????????????????????? 0 ? ? ? // LBU +32'b100101?????????????????????????? 0 ? ? ? // LHU +32'h100110?????????????????????????? 0 ? ? ? // LWR +32'b101000?????????????????????????? 0 ? ? ? // SB +32'b101001?????????????????????????? 0 ? ? ? // SH +32'b101010?????????????????????????? 0 ? ? ? // SWL +32'b101011?????????????????????????? 0 ? ? ? // SW +32'b101110?????????????????????????? 0 ? ? ? // SWR +32'b101111?????????????????????????? 0 ? ? ? // CACHE +32'b110011?????????????????????????? 0 ? ? ? // PREF (NOP) \ No newline at end of file diff --git a/tools/wctrl.txt b/tools/wctrl.txt index 7c6c84f..6a49917 100644 --- a/tools/wctrl.txt +++ b/tools/wctrl.txt @@ -30,9 +30,21 @@ 32'b000000???????????????00000100111 0 1 RD 0 0 // NOR 32'b000000???????????????00000101010 0 1 RD 0 0 // SLT 32'b000000???????????????00000101011 0 1 RD 0 0 // SLTU +32'b000000????????????????????110000 0 0 ? ? ? // TGE +32'b000000????????????????????110001 0 0 ? ? ? // TGEU +32'b000000????????????????????110010 0 0 ? ? ? // TLT +32'b000000????????????????????110011 0 0 ? ? ? // TLTU +32'b000000????????????????????110100 0 0 ? ? ? // TEQ +32'b000000????????????????????110110 0 0 ? ? ? // TNE 32'b000001?????00000???????????????? 0 0 ? ? ? // BLTZ -32'b000001?????10000???????????????? 0 1 31 0 1 // BLTZAL 32'b000001?????00001???????????????? 0 0 ? ? ? // BGEZ +32'b000001?????01000???????????????? 0 0 ? ? ? // TGEI +32'b000001?????01001???????????????? 0 0 ? ? ? // TGEIU +32'b000001?????01010???????????????? 0 0 ? ? ? // TLTI +32'b000001?????01011???????????????? 0 0 ? ? ? // TLTIU +32'b000001?????01110???????????????? 0 0 ? ? ? // TNEI +32'b000001?????01100???????????????? 0 0 ? ? ? // TEQI +32'b000001?????10000???????????????? 0 1 31 0 1 // BLTZAL 32'b000001?????10001???????????????? 0 1 31 0 1 // BGEZAL 32'b000010?????????????????????????? 0 0 ? ? ? // J 32'b000011?????????????????????????? 0 1 31 0 1 // JAL From de354f73d0dc9202d981abe73fd48be00d2ce743 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Wed, 22 Sep 2021 13:52:43 +0800 Subject: [PATCH 47/56] fix Datapath.sv --- src/Core/Datapath.sv | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Core/Datapath.sv b/src/Core/Datapath.sv index 3f9893a..a651dcd 100644 --- a/src/Core/Datapath.sv +++ b/src/Core/Datapath.sv @@ -1324,7 +1324,8 @@ module Datapath ( assign M_I1_Trap = M.I1.Trap.TEN & ( M.I1.Trap.TP == NE ? M.I1.ALUOut != 32'b0 : M.I1.Trap.TP == EQ ? M.I1.ALUOut == 32'b0 : M.I1.Trap.TP == LT ? M.I1.ALUOut[0] == 1'b1 - : M.I1.Trap.TP == GE ? M.I1.ALUOut[0] == 1'b0); + : M.I1.Trap.TP == GE ? M.I1.ALUOut[0] == 1'b0 + : 1'b0); assign M.en = M_go & W.en; assign M_go = (M.I0.MCtrl.HLS[2:1] != 2'b10 | M_I0_MULT_bvalid) From 62b26e3ab2fff051bddf5e592428222c5c70995f Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Wed, 22 Sep 2021 16:26:40 +0800 Subject: [PATCH 48/56] fix trap add testcases --- README.md | 28 +- resources/2021/soc_axi_func/testbench/tb2.sv | 10 +- resources/2021/soft/func/inst/n101_trap.S | 380 +++++++++++++++++++ resources/2021/soft/func/start.S | 28 +- src/Core/Datapath.sv | 2 +- src/Core/Gadgets/instr_valid.sv | 14 +- 6 files changed, 441 insertions(+), 21 deletions(-) create mode 100644 resources/2021/soft/func/inst/n101_trap.S diff --git a/README.md b/README.md index 494d0c0..f25e48e 100644 --- a/README.md +++ b/README.md @@ -39,26 +39,26 @@ Our awesome `MIPS` CPU written in `SystemVerilog` for Loongson Cup | :heavy_check_mark: | `PREF` | `SYS` | 1 | Treat as `NOP` | | :heavy_check_mark: | `SYNC` | `SYS` | 1 | Treat as `NOP` (We're strongly ordered) | | :clock3: | `WAIT` | `SYS` | 2 | | -| :clock3: | `TEQ` | `SYS` | 2 | Work as Branch | -| :clock3: | `TEQI` | `SYS` | 2 | | -| :clock3: | `TGE` | `SYS` | 2 | | -| :clock3: | `TGEI` | `SYS` | 2 | | -| :clock3: | `TGEIU` | `SYS` | 2 | | -| :clock3: | `TGEU` | `SYS` | 2 | | -| :clock3: | `TLT` | `SYS` | 2 | | -| :clock3: | `TLTI` | `SYS` | 2 | | -| :clock3: | `TLTIU` | `SYS` | 2 | | -| :clock3: | `TLTU` | `SYS` | 2 | | -| :clock3: | `TNE` | `SYS` | 2 | | -| :clock3: | `TNEI` | `SYS` | 2 | | +| :heavy_check_mark: | `TEQ` | `SYS` | 2 | | +| :heavy_check_mark: | `TEQI` | `SYS` | 2 | | +| :heavy_check_mark: | `TGE` | `SYS` | 2 | | +| :heavy_check_mark: | `TGEI` | `SYS` | 2 | | +| :heavy_check_mark: | `TGEIU` | `SYS` | 2 | | +| :heavy_check_mark: | `TGEU` | `SYS` | 2 | | +| :heavy_check_mark: | `TLT` | `SYS` | 2 | | +| :heavy_check_mark: | `TLTI` | `SYS` | 2 | | +| :heavy_check_mark: | `TLTIU` | `SYS` | 2 | | +| :heavy_check_mark: | `TLTU` | `SYS` | 2 | | +| :heavy_check_mark: | `TNE` | `SYS` | 2 | | +| :heavy_check_mark: | `TNEI` | `SYS` | 2 | | | :clock3: | `CLO` | `ARITH` | 2 | `RT == RD` | | :clock3: | `CLZ` | `ARITH` | 2 | `RT == RD` | | :heavy_check_mark: | `MADD` | `ARITH` | 2 | `M`阶段加一个流水级 | | :heavy_check_mark: | `MADDU` | `ARITH` | 2 | `M`阶段加一个流水级 | | :heavy_check_mark: | `MSUB` | `ARITH` | 2 | `M`阶段加一个流水级 | | :heavy_check_mark: | `MSUBU` | `ARITH` | 2 | `M`阶段加一个流水级 | -| :hourglass: | `MOVN` | `ARITH` | 2 | `D`阶段阻塞 | -| :hourglass: | `MOVZ` | `ARITH` | 2 | `D`阶段阻塞 | +| :heavy_check_mark: | `MOVN` | `ARITH` | 2 | | +| :heavy_check_mark: | `MOVZ` | `ARITH` | 2 | | | :x: | `LL` | `MEM` | 3 | 修改内核去除相关指令 | | :heavy_check_mark: | `LWL` | `MEM` | 1 | | | :heavy_check_mark: | `LWR` | `MEM` | 1 | | diff --git a/resources/2021/soc_axi_func/testbench/tb2.sv b/resources/2021/soc_axi_func/testbench/tb2.sv index b9b8677..3d78573 100644 --- a/resources/2021/soc_axi_func/testbench/tb2.sv +++ b/resources/2021/soc_axi_func/testbench/tb2.sv @@ -3,8 +3,8 @@ `define SIMULATION_PC `define TRACE_REF_FILE "../../../../../../../cpu132_gettrace/golden_trace.txt" `define CONFREG_NUM_REG soc_lite.u_confreg.num_data -`define CONFREG_OPEN_TRACE soc_lite.u_confreg.open_trace -//`define CONFREG_OPEN_TRACE 1'b0 +//`define CONFREG_OPEN_TRACE soc_lite.u_confreg.open_trace +`define CONFREG_OPEN_TRACE 1'b0 `define CONFREG_NUM_MONITOR soc_lite.u_confreg.num_monitor `define CONFREG_UART_DISPLAY soc_lite.u_confreg.write_uart_valid `define CONFREG_UART_DATA soc_lite.u_confreg.write_uart_data @@ -169,11 +169,11 @@ module tb2_top (); dbg_0_rf_wdata <= debug_wb_rf_wdata; end - if (|dbg_0_rf_wen) begin + if (|dbg_0_rf_wen && `CONFREG_OPEN_TRACE) begin $display("mycpu0 : PC = 0x%8h, wb_rf_wnum = 0x%2h, wb_rf_wdata = 0x%8h, wen= %d", dbg_0_pc, dbg_0_rf_wnum, dbg_0_rf_wdata, |dbg_0_rf_wen); end - if (|dbg_1_rf_wen) begin + if (|dbg_1_rf_wen && `CONFREG_OPEN_TRACE) begin $display("mycpu1 : PC = 0x%8h, wb_rf_wnum = 0x%2h, wb_rf_wdata = 0x%8h, wen= %d", dbg_1_pc, dbg_1_rf_wnum, dbg_1_rf_wdata, |dbg_1_rf_wen); end @@ -238,6 +238,7 @@ module tb2_top (); err_count, confreg_num_reg[31:24]); $display("--------------------------------------------------------------"); err_count <= err_count + 1'b1; + $finish; end else if (confreg_num_reg[31:24] != confreg_num_reg_r[31:24] + 1'b1) begin $display("--------------------------------------------------------------"); $display("[%t] Error(%d)!!! Unknown, Functional Test Point numbers are unequal!", $time, @@ -245,6 +246,7 @@ module tb2_top (); $display("--------------------------------------------------------------"); $display("=============================================================="); err_count <= err_count + 1'b1; + $finish; end else begin $display("----[%t] Number 8'd%02d Functional Test Point PASS!!!", $time, confreg_num_reg[31:24]); diff --git a/resources/2021/soft/func/inst/n101_trap.S b/resources/2021/soft/func/inst/n101_trap.S new file mode 100644 index 0000000..d25f661 --- /dev/null +++ b/resources/2021/soft/func/inst/n101_trap.S @@ -0,0 +1,380 @@ +#include +#include +#include + +LEAF(n101_trap_test) + .set noreorder + addiu s0, s0, 1 + li t0, 0x800d0000 + li s2, 0x09 + sw s2, 0(t0) # Trap EX +##clear cause.TI, status.EXL + mtc0 zero, c0_compare + lui s7,0x0040 + mtc0 s7, c0_status + nop + lui s7, 0x9 # Trap ex, ref return value. +###test inst + +################################################### +# TEQ # +################################################### + +## 1 + la s4, trap_pc1 + li a0, -1 + li a1, 0 + addi a1, a1, -1 +trap_pc1: + teq a0, a1 + bne s2, s7, inst_error + nop + +## 2 Load + la s4, trap_pc2 + li a0, 0x9 + lw a1, 0(t0) +trap_pc2: + teq a0, a1 + bne s2, s7, inst_error + nop + +## 3 DIV Zero + la s4, trap_pc3 + li a0, 1 + li a1, 0 + div zero, a0, a1 +trap_pc3: + teq a1, zero + bne s2, s7, inst_error + nop + +## 4 DIV + la s4, trap_pc4 + li a0, 5 + li a1, 2 + div zero, a0, a1 +trap_pc4: + teq zero, zero + bne s2, s7, inst_error + nop + li a1, 1 + mfhi a0 + bne a0, a1, inst_error + nop + li a1, 2 + mflo a0 + bne a0, a1, inst_error + nop + + +################################################### +# TEQI # +################################################### + +## 5 + la s4, trap_pc5 + li a0, -1 +trap_pc5: + teqi a0, -1 + bne s2, s7, inst_error + nop + +## 6 Load + la s4, trap_pc6 + lw a1, 0(t0) +trap_pc6: + teq a1, 0x9 + bne s2, s7, inst_error + nop + +## 7 DIV Zero + la s4, trap_pc7 + li a0, 1 + li a1, 0 + div zero, a0, a1 +trap_pc7: + teqi a1, 0 + bne s2, s7, inst_error + nop + +## 8 DIV + la s4, trap_pc8 + li a0, 5 + li a1, 2 + div zero, a0, a1 +trap_pc8: + teqi zero, 0 + bne s2, s7, inst_error + nop + li a1, 1 + mfhi a0 + bne a0, a1, inst_error + nop + li a1, 2 + mflo a0 + bne a0, a1, inst_error + nop + +################################################### +# TGE # +################################################### + +## 9 + la s4, trap_pc9 + li a0, -1 + li a1, 1 +trap_pc9: + tge a1, a0 + bne s2, s7, inst_error + nop + +## 10 Load + la s4, trap_pc10 + li a0, 0x8 + lw a1, 0(t0) +trap_pc10: + tge a1, a0 + bne s2, s7, inst_error + nop + +## 11 DIV Zero + la s4, trap_pc11 + li a0, 1 + li a1, 0 + div zero, a0, a1 +trap_pc11: + tge a1, zero + bne s2, s7, inst_error + nop + +## 12 DIV + la s4, trap_pc12 + li a0, 5 + li a1, 2 + div zero, a0, a1 +trap_pc12: + tge zero, zero + bne s2, s7, inst_error + nop + li a1, 1 + mfhi a0 + bne a0, a1, inst_error + nop + li a1, 2 + mflo a0 + bne a0, a1, inst_error + nop + +################################################### +# TGEI # +################################################### + +## 13 + la s4, trap_pc13 + li a0, -1 +trap_pc13: + tgei a0, -2 + bne s2, s7, inst_error + nop + +## 14 Load + la s4, trap_pc14 + lw a1, 0(t0) +trap_pc14: + tgei a1, 0x8 + bne s2, s7, inst_error + nop + +## 15 DIV Zero + la s4, trap_pc15 + li a0, 1 + li a1, 0 + div zero, a0, a1 +trap_pc15: + tgei a1, 0 + bne s2, s7, inst_error + nop + +## 16 DIV + la s4, trap_pc16 + li a0, 5 + li a1, 2 + div zero, a0, a1 +trap_pc16: + tgei zero, 0 + bne s2, s7, inst_error + nop + li a1, 1 + mfhi a0 + bne a0, a1, inst_error + nop + li a1, 2 + mflo a0 + bne a0, a1, inst_error + nop + +################################################### +# TGEIU # +################################################### + +## 17 + la s4, trap_pc17 + li a0, -1 +trap_pc17: + tgeiu a0, 0 + bne s2, s7, inst_error + nop + +################################################### +# TGEU # +################################################### + +## 18 + la s4, trap_pc18 + li a0, -1 + li a1, 0 +trap_pc18: + tgeu a0, a1 + bne s2, s7, inst_error + nop + +################################################### +# TLT # +################################################### + +## 19 + la s4, trap_pc19 + li a0, -1 + li a1, 1 +trap_pc19: + tlt a0, a1 + bne s2, s7, inst_error + nop + +## 20 Load + la s4, trap_pc20 + li a0, 0x8 + lw a1, 0(t0) +trap_pc20: + tlt a0, a1 + bne s2, s7, inst_error + nop + +## 21 DIV + la s4, trap_pc21 + li a0, 5 + li a1, 2 + div zero, a0, a1 +trap_pc21: + tlt a1, a0 + bne s2, s7, inst_error + nop + li a1, 1 + mfhi a0 + bne a0, a1, inst_error + nop + li a1, 2 + mflo a0 + bne a0, a1, inst_error + nop + +################################################### +# TLTI # +################################################### + +## 22 + la s4, trap_pc22 + li a0, -2 +trap_pc22: + tlti a0, -1 + bne s2, s7, inst_error + nop + +## 23 Load + la s4, trap_pc23 + lw a1, 0(t0) +trap_pc23: + tlti a1, 0x10 + bne s2, s7, inst_error + nop + +## 24 DIV + la s4, trap_pc24 + li a0, 5 + li a1, 2 + div zero, a0, a1 +trap_pc24: + tlti a1, 256 + bne s2, s7, inst_error + nop + li a1, 1 + mfhi a0 + bne a0, a1, inst_error + nop + li a1, 2 + mflo a0 + bne a0, a1, inst_error + nop + +################################################### +# TLTIU # +################################################### + +## 25 + la s4, trap_pc25 + li a0, 1 +trap_pc25: + tltiu a0, -1 + bne s2, s7, inst_error + nop + +################################################### +# TLTU # +################################################### + +## 26 + la s4, trap_pc26 + li a0, 0 + li a1, -1 +trap_pc26: + tltu a0, a1 + bne s2, s7, inst_error + nop + +################################################### +# TNE # +################################################### + +## 27 + la s4, trap_pc27 + li a0, 0 + li a1, -1 +trap_pc27: + tne a0, a1 + bne s2, s7, inst_error + nop + +################################################### +# TNEI # +################################################### + +## 28 + la s4, trap_pc28 + li a1, -1 +trap_pc28: + tnei a1, -2 + bne s2, s7, inst_error + nop + + +###score ++ + addiu s3, s3, 1 +###output (s0<<24)|s3 +inst_error: + sll t1, s0, 24 + or t0, t1, s3 + sw t0, 0(s1) + jr ra + nop +END(n101_trap_test) diff --git a/resources/2021/soft/func/start.S b/resources/2021/soft/func/start.S index 90ed46d..5f71e3d 100644 --- a/resources/2021/soft/func/start.S +++ b/resources/2021/soft/func/start.S @@ -2,7 +2,7 @@ #include #include -#define TEST_NUM 100 +#define TEST_NUM 101 ##s0, number @@ -83,6 +83,9 @@ test_finish: li k0, 0x08 # int beq k1, k0, int_ex nop + li k0, 0x09 # trap + beq k1, k0, trap_ex + nop syscall_ex: addu s2, zero, zero @@ -244,6 +247,25 @@ int_ex: b ex_ret nop +trap_ex: + addu s2, zero, zero + mfc0 k0, c0_epc + bne k0, s4, ex_finish + nop + mfc0 k0, c0_cause + andi k0, k0, 0x7c # 6..2 + li k1, 0x34 # Trap EXCCODE << 2 + bne k0, k1, ex_finish + nop + mfc0 k0, c0_status + andi k0, k0, 0x02 # EXL + li k1, 0x02 + bne k0, k1, ex_finish + nop + lui s2, 0x9 + b ex_finish + nop + ex_finish: mfc0 k0,c0_cause lui k1,0x8000 @@ -706,6 +728,10 @@ n99_kseg0_kseg1: nop jal wait_1s nop + jal n101_trap_test + nop + jal wait_1s + nop ###check io access LI (a0, IO_SIMU_ADDR) diff --git a/src/Core/Datapath.sv b/src/Core/Datapath.sv index a651dcd..26e75aa 100644 --- a/src/Core/Datapath.sv +++ b/src/Core/Datapath.sv @@ -1129,7 +1129,7 @@ module Datapath ( dTLBExcValid, {dTLBRefillB, dTLBInvalidB, dTLBModifiedB, dAddressErrorB} ); - assign M_I1_NowExcValid = dTLBRefillB | dTLBInvalidB | dTLBModifiedB | dAddressErrorB; + assign M_I1_NowExcValid = dTLBRefillB | dTLBInvalidB | dTLBModifiedB | dAddressErrorB | M_I1_Trap; assign M.I1.ExcValid = M_I1_PrevExcValid | M_I1_NowExcValid; assign M.I1.REFILL = M_I1_PrevREFILL | dTLBRefillB; assign M.I1.ExcCode = M_I1_PrevExcValid ? M_I1_PrevExcCode diff --git a/src/Core/Gadgets/instr_valid.sv b/src/Core/Gadgets/instr_valid.sv index c22ab47..656d4e8 100644 --- a/src/Core/Gadgets/instr_valid.sv +++ b/src/Core/Gadgets/instr_valid.sv @@ -38,9 +38,21 @@ module instr_valid ( 32'b000000???????????????00000100111: valid = 1'b1; // NOR 32'b000000???????????????00000101010: valid = 1'b1; // SLT 32'b000000???????????????00000101011: valid = 1'b1; // SLTU + 32'b000000????????????????????110000: valid = 1'b1; // TGE + 32'b000000????????????????????110001: valid = 1'b1; // TGEU + 32'b000000????????????????????110010: valid = 1'b1; // TLT + 32'b000000????????????????????110011: valid = 1'b1; // TLTU + 32'b000000????????????????????110100: valid = 1'b1; // TEQ + 32'b000000????????????????????110110: valid = 1'b1; // TNE 32'b000001?????00000????????????????: valid = 1'b1; // BLTZ - 32'b000001?????10000????????????????: valid = 1'b1; // BLTZAL 32'b000001?????00001????????????????: valid = 1'b1; // BGEZ + 32'b000001?????01000????????????????: valid = 1'b1; // TGEI + 32'b000001?????01001????????????????: valid = 1'b1; // TGEIU + 32'b000001?????01010????????????????: valid = 1'b1; // TLTI + 32'b000001?????01011????????????????: valid = 1'b1; // TLTIU + 32'b000001?????01110????????????????: valid = 1'b1; // TNEI + 32'b000001?????01100????????????????: valid = 1'b1; // TEQI + 32'b000001?????10000????????????????: valid = 1'b1; // BLTZAL 32'b000001?????10001????????????????: valid = 1'b1; // BGEZAL 32'b000010??????????????????????????: valid = 1'b1; // J 32'b000011??????????????????????????: valid = 1'b1; // JAL From a5192eb4d8829cf69992030a78d7ece77c3eacda Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Wed, 22 Sep 2021 22:29:52 +0800 Subject: [PATCH 49/56] update README.md --- README.md | 54 ++++++------------------------------------------------ 1 file changed, 6 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index f25e48e..4290b0f 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,13 @@ Our awesome `MIPS` CPU written in `SystemVerilog` for Loongson Cup ``` . +├── model <-- IP行为模型 ├── resources <-- 资源包 ├── src <-- CPU设计代码 │ ├── AXI <-- AXI总线交互 │ ├── Cache <-- Cache │ ├── Core <-- CPU核心 +│ ├── Gadgets <-- 小部件 │ ├── CP0 <-- CP0协处理器 │ ├── include <-- 头文件 │ ├── IP <-- 用到的IP @@ -26,53 +28,10 @@ Our awesome `MIPS` CPU written in `SystemVerilog` for Loongson Cup - [ ] 浮点运算单元 - [ ] ~~做一个真的`FPU`~~ :x: - [ ] 浮点运算指令报`Coprocessor Unusable`,同时`CP0`中新增`Cause.CE` :clock3: -- [ ] 新增指令 - -| Status | Instruction | Type | Tier | Comment | -| :----------------: | :-------------------------------: | :------: | :--: | :-------------------------------------- | -| :heavy_check_mark: | `I-Cache Index Invalid` | `SYS` | 2 | | -| :heavy_check_mark: | `I-Cache Hit Invalid` | `SYS` | 2 | | -| :heavy_check_mark: | `D-Cache Index Writeback Invalid` | `SYS` | 2 | :cry: | -| :heavy_check_mark: | `D-Cache Index Store Tag` | `SYS` | 2 | | -| :heavy_check_mark: | `D-Cache Hit Invalid` | `SYS` | 2 | | -| :heavy_check_mark: | `D-Cache Hit Writeback Invalid` | `SYS` | 2 | | -| :heavy_check_mark: | `PREF` | `SYS` | 1 | Treat as `NOP` | -| :heavy_check_mark: | `SYNC` | `SYS` | 1 | Treat as `NOP` (We're strongly ordered) | -| :clock3: | `WAIT` | `SYS` | 2 | | -| :heavy_check_mark: | `TEQ` | `SYS` | 2 | | -| :heavy_check_mark: | `TEQI` | `SYS` | 2 | | -| :heavy_check_mark: | `TGE` | `SYS` | 2 | | -| :heavy_check_mark: | `TGEI` | `SYS` | 2 | | -| :heavy_check_mark: | `TGEIU` | `SYS` | 2 | | -| :heavy_check_mark: | `TGEU` | `SYS` | 2 | | -| :heavy_check_mark: | `TLT` | `SYS` | 2 | | -| :heavy_check_mark: | `TLTI` | `SYS` | 2 | | -| :heavy_check_mark: | `TLTIU` | `SYS` | 2 | | -| :heavy_check_mark: | `TLTU` | `SYS` | 2 | | -| :heavy_check_mark: | `TNE` | `SYS` | 2 | | -| :heavy_check_mark: | `TNEI` | `SYS` | 2 | | -| :clock3: | `CLO` | `ARITH` | 2 | `RT == RD` | -| :clock3: | `CLZ` | `ARITH` | 2 | `RT == RD` | -| :heavy_check_mark: | `MADD` | `ARITH` | 2 | `M`阶段加一个流水级 | -| :heavy_check_mark: | `MADDU` | `ARITH` | 2 | `M`阶段加一个流水级 | -| :heavy_check_mark: | `MSUB` | `ARITH` | 2 | `M`阶段加一个流水级 | -| :heavy_check_mark: | `MSUBU` | `ARITH` | 2 | `M`阶段加一个流水级 | -| :heavy_check_mark: | `MOVN` | `ARITH` | 2 | | -| :heavy_check_mark: | `MOVZ` | `ARITH` | 2 | | -| :x: | `LL` | `MEM` | 3 | 修改内核去除相关指令 | -| :heavy_check_mark: | `LWL` | `MEM` | 1 | | -| :heavy_check_mark: | `LWR` | `MEM` | 1 | | -| :x: | `SC` | `MEM` | 3 | 修改内核去除相关指令 | -| :heavy_check_mark: | `SWL` | `MEM` | 1 | | -| :heavy_check_mark: | `SWR` | `MEM` | 1 | | -| :x: | `BEQL` | `BRANCH` | 3 | 修改编译指令 | -| :x: | `BGEZALL` | `BRANCH` | 3 | 修改编译指令 | -| :x: | `BGEZL` | `BRANCH` | 3 | 修改编译指令 | -| :x: | `BGTZL` | `BRANCH` | 3 | 修改编译指令 | -| :x: | `BLEZL` | `BRANCH` | 3 | 修改编译指令 | -| :x: | `BLTZALL` | `BRANCH` | 3 | 修改编译指令 | -| :x: | `BLTZL` | `BRANCH` | 3 | 修改编译指令 | -| :x: | `BNEL` | `BRANCH` | 3 | 修改编译指令 | +- [x] 新增指令 +- [ ] `Cache`指令修正 + - [ ] 完善 Test Cases + - [ ] 重新阻止流水线结构 (`TLB`转换) ## `Cache`指令 @@ -113,4 +72,3 @@ Hit Writeback Invalid : VA -> Lookup -> Hit? -> (Write Back) -> Write Zero | 1 | 1 | 1 | | | `I-Cache(0) or D-Cache(1)` | `Lookup(0) or Index(1)` | `WriteBack(0) or WriteOnly(1)` | | -`Todo`: 涉及`I-Cache`的`CACHE`指令需要清空流水线 From 8c7272e1f2f313ac11ed24f43ee491e6db3cf002 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Wed, 22 Sep 2021 23:07:13 +0800 Subject: [PATCH 50/56] add model --- model/div_signed.v | 30 ++++++++++++++++++++++++++++++ model/div_unsigned.v | 30 ++++++++++++++++++++++++++++++ model/mul_signed.sv | 22 ++++++++++++++++++++++ model/mul_unsigned.sv | 22 ++++++++++++++++++++++ 4 files changed, 104 insertions(+) create mode 100644 model/div_signed.v create mode 100644 model/div_unsigned.v create mode 100644 model/mul_signed.sv create mode 100644 model/mul_unsigned.sv diff --git a/model/div_signed.v b/model/div_signed.v new file mode 100644 index 0000000..99b5cfd --- /dev/null +++ b/model/div_signed.v @@ -0,0 +1,30 @@ +module div_signed( + input clk, + input s_axis_dividend_tvalid, + input [31:0] s_axis_dividend_tdata, + input s_axis_divisor_tvalid, + input [31:0] s_axis_divisor_tdata, + output m_axis_dout_tvalid, + output [63:0] m_axis_dout_tdata +); + + reg valid, nxtValid; + reg [63:0] data, nxtData; + + assign m_axis_dout_tvalid = nxtValid; + assign m_axis_dout_tdata = nxtData; + + always @(posedge clk) begin + nxtValid <= valid; + nxtData <= data; + if (s_axis_dividend_tvalid & s_axis_divisor_tvalid) begin + valid <= 1'b1; + data <= { + $signed(s_axis_divisor_tdata) % $signed(s_axis_dividend_tdata), + $signed(s_axis_divisor_tdata) / $signed(s_axis_dividend_tdata) + }; + end + end + + +endmodule \ No newline at end of file diff --git a/model/div_unsigned.v b/model/div_unsigned.v new file mode 100644 index 0000000..95aab98 --- /dev/null +++ b/model/div_unsigned.v @@ -0,0 +1,30 @@ +module div_signed( + input clk, + input s_axis_dividend_tvalid, + input [31:0] s_axis_dividend_tdata, + input s_axis_divisor_tvalid, + input [31:0] s_axis_divisor_tdata, + output m_axis_dout_tvalid, + output [63:0] m_axis_dout_tdata +); + + reg valid, nxtValid; + reg [63:0] data, nxtData; + + assign m_axis_dout_tvalid = nxtValid; + assign m_axis_dout_tdata = nxtData; + + always @(posedge clk) begin + nxtValid <= valid; + nxtData <= data; + if (s_axis_dividend_tvalid & s_axis_divisor_tvalid) begin + valid <= 1'b1; + data <= { + $unsigned(s_axis_divisor_tdata) % $unsigned(s_axis_dividend_tdata), + $unsigned(s_axis_divisor_tdata) / $unsigned(s_axis_dividend_tdata) + }; + end + end + + +endmodule \ No newline at end of file diff --git a/model/mul_signed.sv b/model/mul_signed.sv new file mode 100644 index 0000000..388871a --- /dev/null +++ b/model/mul_signed.sv @@ -0,0 +1,22 @@ +`include "defines.svh" + +module mul_signed( + input logic CLK, + input word_t A, + input word_t B, + output logic [63:0] P +); + + word_t A1, A2, A3, A4, A5, A6; + word_t B1, B2, B3, B4, B5, B6; + + ffen #(64) ff_1 (CLK, { A, B}, 1'b1, {A1, B1}); + ffen #(64) ff_2 (CLK, {A1, B1}, 1'b1, {A2, B2}); + ffen #(64) ff_3 (CLK, {A2, B2}, 1'b1, {A3, B3}); + ffen #(64) ff_4 (CLK, {A3, B3}, 1'b1, {A4, B4}); + ffen #(64) ff_5 (CLK, {A4, B4}, 1'b1, {A5, B5}); + ffen #(64) ff_6 (CLK, {A5, B5}, 1'b1, {A6, B6}); + + assign P = $signed(A) * $signed(B); + +endmodule diff --git a/model/mul_unsigned.sv b/model/mul_unsigned.sv new file mode 100644 index 0000000..ead6e29 --- /dev/null +++ b/model/mul_unsigned.sv @@ -0,0 +1,22 @@ +`include "defines.svh" + +module mul_signed( + input logic CLK, + input word_t A, + input word_t B, + output logic [63:0] P +); + + word_t A1, A2, A3, A4, A5, A6; + word_t B1, B2, B3, B4, B5, B6; + + ffen #(64) ff_1 (CLK, { A, B}, 1'b1, {A1, B1}); + ffen #(64) ff_2 (CLK, {A1, B1}, 1'b1, {A2, B2}); + ffen #(64) ff_3 (CLK, {A2, B2}, 1'b1, {A3, B3}); + ffen #(64) ff_4 (CLK, {A3, B3}, 1'b1, {A4, B4}); + ffen #(64) ff_5 (CLK, {A4, B4}, 1'b1, {A5, B5}); + ffen #(64) ff_6 (CLK, {A5, B5}, 1'b1, {A6, B6}); + + assign P = $unsigned(A) * $unsigned(B); + +endmodule From aca8490ef2e5184cff3f3e109519d0b30ad8f633 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Fri, 24 Sep 2021 16:37:47 +0800 Subject: [PATCH 51/56] deal with verilator --- .vscode/c_cpp_properties.json | 1 + model/DCData_bram.v | 14 ++++---- model/DCTag_bram.v | 14 ++++---- model/ICData_bram.v | 14 ++++---- model/ICTag_bram.v | 14 ++++---- model/div_signed.v | 6 ++-- model/div_unsigned.v | 8 ++--- model/mul_unsigned.sv | 2 +- sim/.gitignore | 2 ++ sim/Makefile | 60 ++++++++++++++++++++++++++++++++++ sim/sim_main.cpp | 47 ++++++++++++++++++++++++++ src/AXI/AXIRead_i.sv | 2 +- src/AXI/AXIWrite_i.sv | 2 +- src/Cache/DCache.sv | 8 +++-- src/Cache/DCache_i.sv | 2 +- src/Cache/ICache.sv | 4 +-- src/Cache/ICache_i.sv | 2 +- src/Core/ALU.sv | 4 +++ src/Core/Datapath.sv | 10 +++--- src/Core/Gadgets/memoutput.sv | 2 +- src/MMU/SRAM_RO_AXI_i.sv | 2 +- src/MMU/SRAM_W_AXI_i.sv | 2 +- src/MMU/TLB.sv | 2 ++ src/MMU/sram_i.sv | 2 +- src/MMU/sramro_i.sv | 2 +- src/include/CP0.svh | 2 +- src/include/defines.svh | 10 +++--- src/{MyCPU.sv => mycpu_top.sv} | 0 28 files changed, 180 insertions(+), 60 deletions(-) create mode 100644 sim/.gitignore create mode 100644 sim/Makefile create mode 100644 sim/sim_main.cpp rename src/{MyCPU.sv => mycpu_top.sv} (100%) diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 28f5a36..6c78102 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -4,6 +4,7 @@ "name": "Linux", "includePath": [ "${workspaceFolder}/**", + "${workspaceFolder}/sim/obj_dir", "/usr/share/verilator/include" ], "defines": [], diff --git a/model/DCData_bram.v b/model/DCData_bram.v index 027925d..0c69fff 100644 --- a/model/DCData_bram.v +++ b/model/DCData_bram.v @@ -1,17 +1,17 @@ module DCData_bram ( - input [ 6:0] addra, - input clka, - input [127:0] dina, - output [127:0] douta, - input wea + input [ 6:0] addra, + input clka, + input [127:0] dina, + output reg [127:0] douta, + input wea ); reg [127:0] ram [0:127]; - always @(posedge CLK) begin + always @(posedge clka) begin if(wea) begin ram[addra] <= dina; end - douta <= ~wea ? ram[addra] : {128{$random}}; + douta <= ~wea ? ram[addra] : {4{$random}}; end endmodule diff --git a/model/DCTag_bram.v b/model/DCTag_bram.v index 030bf8e..d3e148d 100644 --- a/model/DCTag_bram.v +++ b/model/DCTag_bram.v @@ -1,17 +1,17 @@ module DCTag_bram ( - input [ 6:0] addra, - input clka, - input [22:0] dina, - output [22:0] douta, - input wea + input [ 6:0] addra, + input clka, + input [22:0] dina, + output reg [22:0] douta, + input wea ); reg [22:0] ram [0:127]; - always @(posedge CLK) begin + always @(posedge clka) begin if(wea) begin ram[addra] <= dina; end - douta <= ~wea ? ram[addra] : {23{$random}}; + douta <= ~wea ? ram[addra] : {$random}[22:0]; end endmodule diff --git a/model/ICData_bram.v b/model/ICData_bram.v index 7778312..bea4730 100644 --- a/model/ICData_bram.v +++ b/model/ICData_bram.v @@ -1,16 +1,16 @@ module ICData_bram ( - input [ 5:0] addra, - input clka, - input [255:0] dina, - output [255:0] douta, - input wea + input [ 5:0] addra, + input clka, + input [255:0] dina, + output reg [255:0] douta, + input wea ); reg [255:0] ram [0:63]; - always @(posedge CLK) begin + always @(posedge clka) begin if(wea) begin ram[addra] <= dina; end - douta <= ~wea ? ram[addra] : {256{$random}}; + douta <= ~wea ? ram[addra] : {8{$random}}; end endmodule diff --git a/model/ICTag_bram.v b/model/ICTag_bram.v index aeaac26..c9cc324 100644 --- a/model/ICTag_bram.v +++ b/model/ICTag_bram.v @@ -1,17 +1,17 @@ module ICTag_bram ( - input [ 5:0] addra, - input clka, - input [21:0] dina, - output [21:0] douta, - input wea + input [ 5:0] addra, + input clka, + input [21:0] dina, + output reg [21:0] douta, + input wea ); reg [21:0] ram [0:63]; - always @(posedge CLK) begin + always @(posedge clka) begin if(wea) begin ram[addra] <= dina; end - douta <= ~wea ? ram[addra] : {21{$random}}; + douta <= ~wea ? ram[addra] : {$random}[21:0]; end endmodule diff --git a/model/div_signed.v b/model/div_signed.v index 99b5cfd..2e3ec9c 100644 --- a/model/div_signed.v +++ b/model/div_signed.v @@ -1,5 +1,5 @@ module div_signed( - input clk, + input aclk, input s_axis_dividend_tvalid, input [31:0] s_axis_dividend_tdata, input s_axis_divisor_tvalid, @@ -14,7 +14,7 @@ module div_signed( assign m_axis_dout_tvalid = nxtValid; assign m_axis_dout_tdata = nxtData; - always @(posedge clk) begin + always @(posedge aclk) begin nxtValid <= valid; nxtData <= data; if (s_axis_dividend_tvalid & s_axis_divisor_tvalid) begin @@ -27,4 +27,4 @@ module div_signed( end -endmodule \ No newline at end of file +endmodule diff --git a/model/div_unsigned.v b/model/div_unsigned.v index 95aab98..c434387 100644 --- a/model/div_unsigned.v +++ b/model/div_unsigned.v @@ -1,5 +1,5 @@ -module div_signed( - input clk, +module div_unsigned( + input aclk, input s_axis_dividend_tvalid, input [31:0] s_axis_dividend_tdata, input s_axis_divisor_tvalid, @@ -14,7 +14,7 @@ module div_signed( assign m_axis_dout_tvalid = nxtValid; assign m_axis_dout_tdata = nxtData; - always @(posedge clk) begin + always @(posedge aclk) begin nxtValid <= valid; nxtData <= data; if (s_axis_dividend_tvalid & s_axis_divisor_tvalid) begin @@ -27,4 +27,4 @@ module div_signed( end -endmodule \ No newline at end of file +endmodule diff --git a/model/mul_unsigned.sv b/model/mul_unsigned.sv index ead6e29..5a062ef 100644 --- a/model/mul_unsigned.sv +++ b/model/mul_unsigned.sv @@ -1,6 +1,6 @@ `include "defines.svh" -module mul_signed( +module mul_unsigned( input logic CLK, input word_t A, input word_t B, diff --git a/sim/.gitignore b/sim/.gitignore new file mode 100644 index 0000000..9b2e351 --- /dev/null +++ b/sim/.gitignore @@ -0,0 +1,2 @@ +logs +obj_dir \ No newline at end of file diff --git a/sim/Makefile b/sim/Makefile new file mode 100644 index 0000000..3d3c773 --- /dev/null +++ b/sim/Makefile @@ -0,0 +1,60 @@ +GENHTML = genhtml + +VERILATOR = verilator +VERILATOR_COVERAGE = verilator_coverage + +VERILATOR_FLAGS = +# Generate C++ in executable form +VERILATOR_FLAGS += -cc --exe +# Generate makefile dependencies (not shown as complicates the Makefile) +VERILATOR_FLAGS += -MMD +# Optimize +VERILATOR_FLAGS += -Os -x-assign 0 +# Warn abount lint issues; may not want this on less solid designs +VERILATOR_FLAGS += -Wall +# Make waveforms +VERILATOR_FLAGS += --trace +# Check SystemVerilog assertions +VERILATOR_FLAGS += --assert +# Generate coverage analysis +VERILATOR_FLAGS += --coverage +# Run make to compile model, with as many CPUs as are free +VERILATOR_FLAGS += --build -j + +# Get rid of annoying warnings +VERILATOR_FLAGS += -Wno-UNOPT -Wno-UNOPTFLAT -Wno-BLKSEQ +VERILATOR_FLAGS += -DSIMULATION_PC + +# Create annotated source +VERILATOR_COV_FLAGS += --annotate logs/annotated +# A single coverage hit is considered good enough +VERILATOR_COV_FLAGS += --annotate-min 1 +# Create LCOV info +VERILATOR_COV_FLAGS += --write-info logs/coverage.info +# Input file from Verilator +VERILATOR_COV_FLAGS += logs/coverage.dat + +SOURCE = $(wildcard ../model/*.v ../model/*.sv ../src/*.v ../src/*.sv ../src/**/*.v ../src/**/*.sv) +INCLUDE = $(addprefix -I, $(dir $(wildcard ../src/*/. ../src/**/*/.))) +# Input files for Verilator +VERILATOR_INPUT = $(INCLUDE) $(SOURCE) -top mycpu_top sim_main.cpp + +default: run + +test: + echo $(INCLUDE) + +verilate: + $(VERILATOR) $(VERILATOR_FLAGS) $(VERILATOR_INPUT) + +run: verilate + @rm -rf logs + @mkdir -p logs + obj_dir/Vmycpu_top + +coverage: verilate + @rm -rf logs/annotated + $(VERILATOR_COVERAGE) $(VERILATOR_COV_FLAGS) + +clean: + -rm -rf obj_dir logs *.log *.dmp *.vpd core \ No newline at end of file diff --git a/sim/sim_main.cpp b/sim/sim_main.cpp new file mode 100644 index 0000000..f02506a --- /dev/null +++ b/sim/sim_main.cpp @@ -0,0 +1,47 @@ +#include + +#include "Vmycpu_top.h" + +vluint64_t main_time = 0; +double sc_time_stamp() { + return main_time; // Note does conversion to real, to match SystemC +} + +int main(int argc, char** argv, char** env) { + if (0 && argc && argv && env) {} + + Verilated::debug(0); + Verilated::randReset(2); + Verilated::traceEverOn(true); + Verilated::commandArgs(argc, argv); + Verilated::mkdir("logs"); + + Vmycpu_top* top = new Vmycpu_top; // Or use a const unique_ptr, or the VL_UNIQUE_PTR wrapper + + top->aclk = 0; + while (!Verilated::gotFinish()) { + ++main_time; + top->aclk = !top->aclk; + top->aresetn = (main_time < 10) ? 1 : 0; + if (main_time < 5) { + // Zero coverage if still early in reset, otherwise toggles there may + // falsely indicate a signal is covered + VerilatedCov::zero(); + } + top->eval(); + + // TODO: fake AXI + } + + top->final(); + + // Coverage analysis (since test passed) +#if VM_COVERAGE + Verilated::mkdir("logs"); + VerilatedCov::write("logs/coverage.dat"); +#endif + + delete top; + top = NULL; + exit(0); +} \ No newline at end of file diff --git a/src/AXI/AXIRead_i.sv b/src/AXI/AXIRead_i.sv index 497d580..9632b3e 100644 --- a/src/AXI/AXIRead_i.sv +++ b/src/AXI/AXIRead_i.sv @@ -6,4 +6,4 @@ interface AXIRead_i; modport master(input AXIReadData, output AXIReadAddr); modport slave(input AXIReadAddr, output AXIReadData); -endinterface //AXIRead \ No newline at end of file +endinterface //AXIRead diff --git a/src/AXI/AXIWrite_i.sv b/src/AXI/AXIWrite_i.sv index 1ab4052..b50786f 100644 --- a/src/AXI/AXIWrite_i.sv +++ b/src/AXI/AXIWrite_i.sv @@ -6,4 +6,4 @@ interface AXIWrite_i; modport master(input AXIWriteData, output AXIWriteAddr); modport slave(input AXIWriteAddr, output AXIWriteData); -endinterface //AXIWrite \ No newline at end of file +endinterface //AXIWrite diff --git a/src/Cache/DCache.sv b/src/Cache/DCache.sv index ca28e62..9d5ba3e 100644 --- a/src/Cache/DCache.sv +++ b/src/Cache/DCache.sv @@ -206,12 +206,16 @@ module DCache ( always_ff @(posedge clk) begin if (rst) begin for (integer i = 0; i < 128; i++) +`ifndef VERILATOR LRU[i] <= 4'b0; +`else + LRU[i] = 4'b0; +`endif end else begin if (port.req) begin if (state != IDLE) - LRU[index1] = nextLRU; - nowLRU = LRU[port.index]; + LRU[index1] <= nextLRU; + nowLRU <= LRU[port.index]; end end end diff --git a/src/Cache/DCache_i.sv b/src/Cache/DCache_i.sv index 34e064d..76d2b8b 100644 --- a/src/Cache/DCache_i.sv +++ b/src/Cache/DCache_i.sv @@ -34,4 +34,4 @@ interface DCache_i; input hit, dirt_valid, dirt_addr, dirt_data, row, output clear, clearIdx, clearWb ); -endinterface //DCache_i \ No newline at end of file +endinterface //DCache_i diff --git a/src/Cache/ICache.sv b/src/Cache/ICache.sv index 0c305d7..f6cd622 100644 --- a/src/Cache/ICache.sv +++ b/src/Cache/ICache.sv @@ -149,8 +149,8 @@ module ICache ( always_ff @(posedge clk) begin if (port.req) begin if (state != IDLE) - LRU[index1] = nextLRU; - nowLRU = LRU[port.index]; + LRU[index1] <= nextLRU; + nowLRU <= LRU[port.index]; end end diff --git a/src/Cache/ICache_i.sv b/src/Cache/ICache_i.sv index 4957cc7..9c281b5 100644 --- a/src/Cache/ICache_i.sv +++ b/src/Cache/ICache_i.sv @@ -26,4 +26,4 @@ interface ICache_i; output rvalid, rdata, output clear, clearIdx ); -endinterface //ICache_i \ No newline at end of file +endinterface //ICache_i diff --git a/src/Core/ALU.sv b/src/Core/ALU.sv index b8b5582..82fab76 100644 --- a/src/Core/ALU.sv +++ b/src/Core/ALU.sv @@ -11,13 +11,17 @@ module ALU( wire logic [4:0] sa = a[4:0]; wire logic ex = alt & b[31]; wire word_t sl = b << sa; + /* verilator lint_off WIDTH */ wire word_t sr = {{31{ex}}, b} >> sa; + /* verilator lint_on WIDTH */ wire word_t b2 = alt ? ~b : b; wire word_t sum; wire logic lt, ltu; + /* verilator lint_off WIDTH */ assign {lt, ltu, sum} = {a[31], 1'b0, a} + {b2[31], 1'b1, b2} + alt; // alt for cin(CARRY4) at synthesis + /* verilator lint_on WIDTH */ assign aluout = (aluctrl.f_sl ? sl : 32'b0) | (aluctrl.f_sr ? sr : 32'b0) | (aluctrl.f_add ? sum : 32'b0) diff --git a/src/Core/Datapath.sv b/src/Core/Datapath.sv index 26e75aa..3c1e3dd 100644 --- a/src/Core/Datapath.sv +++ b/src/Core/Datapath.sv @@ -549,11 +549,11 @@ module Datapath ( // TODO: CACHE | D.IA.MCtrl1.TLBR & D.IB.MCtrl0.C0W | D.IA.MCtrl1.TLBP & D.IB.MCtrl0.C0W - | D.IA.MCtrl1.TLBR & D.IB.WCtrl.RW & D.IB.MCtrl0.C0D == C0_ENTRYHI & D.IB.MCtrl0.RS0 == C0 - | D.IA.MCtrl1.TLBR & D.IB.WCtrl.RW & D.IB.MCtrl0.C0D == C0_ENTRYLO0 & D.IB.MCtrl0.RS0 == C0 - | D.IA.MCtrl1.TLBR & D.IB.WCtrl.RW & D.IB.MCtrl0.C0D == C0_ENTRYLO1 & D.IB.MCtrl0.RS0 == C0 - // | D.IA.MCtrl1.TLBR & D.IB.WCtrl.RW & D.IB.MCtrl0.C0D == C0_PAGEMASK & D.IB.MCtrl0.RS0 == C0 - | D.IA.MCtrl1.TLBP & D.IB.WCtrl.RW & D.IB.MCtrl0.C0D == C0_INDEX & D.IB.MCtrl0.RS0 == C0 + | D.IA.MCtrl1.TLBR & D.IB.WCtrl.RW & D.IB.MCtrl0.C0D == C0_ENTRYHI & D.IB.MCtrl0.RS0 == RS0_C0 + | D.IA.MCtrl1.TLBR & D.IB.WCtrl.RW & D.IB.MCtrl0.C0D == C0_ENTRYLO0 & D.IB.MCtrl0.RS0 == RS0_C0 + | D.IA.MCtrl1.TLBR & D.IB.WCtrl.RW & D.IB.MCtrl0.C0D == C0_ENTRYLO1 & D.IB.MCtrl0.RS0 == RS0_C0 + // | D.IA.MCtrl1.TLBR & D.IB.WCtrl.RW & D.IB.MCtrl0.C0D == C0_PAGEMASK & D.IB.MCtrl0.RS0 == RS0_C0 + | D.IA.MCtrl1.TLBP & D.IB.WCtrl.RW & D.IB.MCtrl0.C0D == C0_INDEX & D.IB.MCtrl0.RS0 == RS0_C0 // Hazards Related to Exceptions or Interrupts | D.IA.MCtrl0.C0W & D.IB.ERET & D.IA.MCtrl0.C0D == C0_EPC ; diff --git a/src/Core/Gadgets/memoutput.sv b/src/Core/Gadgets/memoutput.sv index 03220b6..fdef24d 100644 --- a/src/Core/Gadgets/memoutput.sv +++ b/src/Core/Gadgets/memoutput.sv @@ -57,4 +57,4 @@ module memoutput ( end default: begin wstrb = 4'b0000; end endcase -endmodule \ No newline at end of file +endmodule diff --git a/src/MMU/SRAM_RO_AXI_i.sv b/src/MMU/SRAM_RO_AXI_i.sv index 3fb72d7..de3af4c 100644 --- a/src/MMU/SRAM_RO_AXI_i.sv +++ b/src/MMU/SRAM_RO_AXI_i.sv @@ -14,4 +14,4 @@ interface SRAM_RO_AXI_i; modport master(output req, addr, len, size, input addr_ok, data_ok, rdata, rvalid); modport slave(input req, addr, len, size, output addr_ok, data_ok, rdata, rvalid); -endinterface \ No newline at end of file +endinterface diff --git a/src/MMU/SRAM_W_AXI_i.sv b/src/MMU/SRAM_W_AXI_i.sv index f9c0450..ea5df08 100644 --- a/src/MMU/SRAM_W_AXI_i.sv +++ b/src/MMU/SRAM_W_AXI_i.sv @@ -17,4 +17,4 @@ interface SRAM_W_AXI_i; modport master(output req, addr, len, size, wstrb, wdata, wvalid, wlast, input addr_ok, data_ok, wready); modport slave(input req, addr, len, size, wstrb, wdata, wvalid, wlast, output addr_ok, data_ok, wready); -endinterface \ No newline at end of file +endinterface diff --git a/src/MMU/TLB.sv b/src/MMU/TLB.sv index fcac3e1..9c03ab6 100644 --- a/src/MMU/TLB.sv +++ b/src/MMU/TLB.sv @@ -118,6 +118,7 @@ module TLB ( // IF vaddr -> paddr assign fVAddr = iVAddr; + /* verilator lint_off PINCONNECTEMPTY */ TLB_Lookup Lookup_F ( .TLB_entries(TLB_entries), .VPN(fVAddr[31:12]), @@ -130,6 +131,7 @@ module TLB ( .valid(fValid), .index() ); + /* verilator lint_on PINCONNECTEMPTY */ // Output ffenr #(55) inst_ff( diff --git a/src/MMU/sram_i.sv b/src/MMU/sram_i.sv index d4554b2..13e9bed 100644 --- a/src/MMU/sram_i.sv +++ b/src/MMU/sram_i.sv @@ -14,4 +14,4 @@ interface sram_i (); modport master(output req, wr, addr, size, wstrb, wdata, input addr_ok, data_ok, rdata); modport slave(input req, wr, addr, size, wstrb, wdata, output addr_ok, data_ok, rdata); -endinterface \ No newline at end of file +endinterface diff --git a/src/MMU/sramro_i.sv b/src/MMU/sramro_i.sv index 6ccf12e..80de7a0 100644 --- a/src/MMU/sramro_i.sv +++ b/src/MMU/sramro_i.sv @@ -12,4 +12,4 @@ interface sramro_i (); modport master(output req, addr, input addr_ok, data_ok, rdata0, rdata1); modport slave(input req, addr, output addr_ok, data_ok, rdata0, rdata1); -endinterface \ No newline at end of file +endinterface diff --git a/src/include/CP0.svh b/src/include/CP0.svh index 405a634..52f275a 100644 --- a/src/include/CP0.svh +++ b/src/include/CP0.svh @@ -94,7 +94,7 @@ typedef struct packed { // word_t DESAVE, // ErrorEPC, // TagHi - word_t TagLo; + // TagLo; // CacheErr, // Errctl, // PerfCnt, diff --git a/src/include/defines.svh b/src/include/defines.svh index 54194b3..ac7aa86 100644 --- a/src/include/defines.svh +++ b/src/include/defines.svh @@ -57,11 +57,11 @@ typedef enum logic [1:0] { } SB_t; typedef enum logic [2:0] { - LO = 3'b000, - HI = 3'b001, - MUL = 3'b010, - C0 = 3'b011, - ALUOut = 3'b100 // 3'b1?? + RS0_LO = 3'b000, + RS0_HI = 3'b001, + RS0_MUL = 3'b010, + RS0_C0 = 3'b011, + RS0_ALUOut = 3'b100 // 3'b1?? } RS0_t; typedef enum logic [2:0] { diff --git a/src/MyCPU.sv b/src/mycpu_top.sv similarity index 100% rename from src/MyCPU.sv rename to src/mycpu_top.sv From 4facc2dd10952320a66aec6ca0d0fa3eb2290c15 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Fri, 24 Sep 2021 20:45:55 +0800 Subject: [PATCH 52/56] enhanced test cases --- README.md | 2 +- .../2021/soft/func/inst/n98_cache_dcache.S | 81 ++++++++++ .../2021/soft/func/inst/n99_cache_icache.S | 146 ++++++++++++++++-- resources/2021/soft/func/start.S | 39 ++--- 4 files changed, 237 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 4290b0f..8182e82 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Our awesome `MIPS` CPU written in `SystemVerilog` for Loongson Cup - [ ] 浮点运算指令报`Coprocessor Unusable`,同时`CP0`中新增`Cause.CE` :clock3: - [x] 新增指令 - [ ] `Cache`指令修正 - - [ ] 完善 Test Cases + - [x] 完善 Test Cases - [ ] 重新阻止流水线结构 (`TLB`转换) ## `Cache`指令 diff --git a/resources/2021/soft/func/inst/n98_cache_dcache.S b/resources/2021/soft/func/inst/n98_cache_dcache.S index 63bfc1f..2cfb3c4 100644 --- a/resources/2021/soft/func/inst/n98_cache_dcache.S +++ b/resources/2021/soft/func/inst/n98_cache_dcache.S @@ -222,6 +222,87 @@ TEST_CACHE_DCACHE_HIT(0xa00d0028, 0x800d0028, 4, 0xF0F0F0F0, 0xABCDEFAB) .n98_done: nop +## CACHE 1 D-Cache Index Writeback Invalid + +## Enforced test on writeback whole line + + li t0, 0xa00d0000 + li t1, 0xa00d0800 + li t2, 0xa00d1000 + li t3, 0xa00d1800 + + li v0, 0xa00d000c +.n98_en_rst: + beq t0, v0, .n98_en_w_bgn + nop + sw zero, 0(t0) + sw zero, 0(t1) + sw zero, 0(t2) + sw zero, 0(t3) + addi t0, t0, 4 + addi t1, t1, 4 + addi t2, t2, 4 + addi t3, t3, 4 + j .n98_en_rst + nop + +.n98_en_w_bgn: + li t0, 0x800d0000 + li t1, 0x800d0800 + li t2, 0x800d1000 + li t3, 0x800d1800 + + li v0, 0x800d000c + li a0, 0xa5a50000 +.n98_en_w: + beq t0, v0, .n98_en_chk_bgn + nop + sw a0, 0(t0) + sw a0, 0(t1) + sw a0, 0(t2) + sw a0, 0(t3) + addi t0, t0, 4 + addi t1, t1, 4 + addi t2, t2, 4 + addi t3, t3, 4 + addi a0, a0, 1 + j .n98_en_w + nop + +.n98_en_chk_bgn: + li t0, 0xa00d0000 + li t1, 0xa00d0800 + li t2, 0xa00d1000 + li t3, 0xa00d1800 + li v0, 0xa00d000c + li a0, 0xa5a50000 + + cache 1, 0(zero) +.n98_en_chk: + beq t0, v0, .n98_en_end + nop + lw a1, 0(t0) + bne a0, a1, inst_error + nop + lw a1, 0(t1) + bne a0, a1, inst_error + nop + lw a1, 0(t2) + bne a0, a1, inst_error + nop + lw a1, 0(t3) + bne a0, a1, inst_error + nop + addi t0, t0, 4 + addi t1, t1, 4 + addi t2, t2, 4 + addi t3, t3, 4 + addi a0, a0, 1 + j .n98_en_chk + nop +.n98_en_end: + nop + ###detect exception bne s2, zero, inst_error nop diff --git a/resources/2021/soft/func/inst/n99_cache_icache.S b/resources/2021/soft/func/inst/n99_cache_icache.S index 7830a72..4a49017 100644 --- a/resources/2021/soft/func/inst/n99_cache_icache.S +++ b/resources/2021/soft/func/inst/n99_cache_icache.S @@ -29,8 +29,8 @@ LEAF(n99_cache_icache_test) cache 16, 0(v0) # I-Cache Hit Invalid # TODO: clear Datapath on CACHE # using enough nop to stop prefetch - nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop - nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop + nop;nop;nop;nop;nop;nop; + nop;nop;nop;nop;nop;nop; j .n99_1 nop @@ -65,8 +65,8 @@ LEAF(n99_cache_icache_test) .n99_2_check: # TODO: clear Datapath on CACHE # using enough nop to stop prefetch - nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop - nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop + nop;nop;nop;nop;nop;nop; + nop;nop;nop;nop;nop;nop; j .n99_2 nop @@ -101,8 +101,8 @@ LEAF(n99_cache_icache_test) .n99_3_check: # TODO: clear Datapath on CACHE # using enough nop to stop prefetch - nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop - nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop + nop;nop;nop;nop;nop;nop; + nop;nop;nop;nop;nop;nop; j .n99_3 nop @@ -129,8 +129,8 @@ LEAF(n99_cache_icache_test) cache 0, 0(v0) # I-Cache Hit Invalid # TODO: clear Datapath on CACHE # using enough nop to stop prefetch - nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop - nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop + nop;nop;nop;nop;nop;nop; + nop;nop;nop;nop;nop;nop; j .n99_4 nop @@ -157,8 +157,8 @@ LEAF(n99_cache_icache_test) cache 8, 0(v0) # I-Cache Index Store Tag # TODO: clear Datapath on CACHE # using enough nop to stop prefetch - nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop - nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop + nop;nop;nop;nop;nop;nop; + nop;nop;nop;nop;nop;nop; j .n99_5 nop @@ -261,8 +261,8 @@ LEAF(n99_cache_icache_test) .n99_con_loop_end: # TODO: clear Datapath on CACHE # using enough nop to stop prefetch - nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop - nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop;nop + nop;nop;nop;nop;nop;nop; + nop;nop;nop;nop;nop;nop; j .n99_con nop @@ -304,6 +304,128 @@ LEAF(n99_cache_icache_test) 148 00000000 nop */ +/* + Enhanced test: + 1. fill 800d0000, 800D0800, 800D1000, 800D1800 with instructions + 2. jump to 800d0000, 800D0800, 800D1000, 800D1800 and execute + 3. return back to here and check registers + 4. modify 800d0000, 800D0800, 800D1000, 800D1800 + 5. same as 2 3 + + 20050000 addi $a1, $zero, 0 + 03e00008 jr $ra + 20a5000[] addi $a1, $a1, [case] + +*/ +.n99_en_bgn: + move a0, ra + + li t0, 0x800d0000 + li t1, 0x800d0800 + li t2, 0x800d1000 + li t3, 0x800d1800 + + li a1, 0x20050000 + li a2, 0x03e00008 + li a3, 0x20a50000 + +.n98_en_step1: + sw a1, 0(t0) + sw a1, 0(t1) + sw a1, 0(t2) + sw a1, 0(t3) + + sw a2, 4(t0) + sw a2, 4(t1) + sw a2, 4(t2) + sw a2, 4(t3) + + sw a3, 8(t0) + addi a3, a3, 1 + sw a3, 8(t1) + addi a3, a3, 1 + sw a3, 8(t2) + addi a3, a3, 1 + sw a3, 8(t3) + addi a3, a3, 1 + + cache 1, 0(zero) + cache 0, 0(zero) + +.n98_en_step23: + li a1, 0 + li a2, 0 + jalr t0 + nop + bne a1, a2, inst_error + nop + + li a1, 0 + li a2, 1 + jalr t1 + nop + bne a1, a2, inst_error + nop + + li a1, 0 + li a2, 2 + jalr t2 + nop + bne a1, a2, inst_error + nop + + li a1, 0 + li a2, 3 + jalr t3 + nop + bne a1, a2, inst_error + nop + +.n98_en_step4: + sw a3, 8(t0) + addi a3, a3, 1 + sw a3, 8(t1) + addi a3, a3, 1 + sw a3, 8(t2) + addi a3, a3, 1 + sw a3, 8(t3) + addi a3, a3, 1 + + cache 1, 0(zero) + cache 0, 0(zero) + +.n98_en_step5: + li a1, 0 + li a2, 4 + jalr t0 + nop + bne a1, a2, inst_error + nop + + li a1, 0 + li a2, 5 + jalr t1 + nop + bne a1, a2, inst_error + nop + + li a1, 0 + li a2, 6 + jalr t2 + nop + bne a1, a2, inst_error + nop + + li a1, 0 + li a2, 7 + jalr t3 + nop + bne a1, a2, inst_error + nop + +.n98_en_rst: + move ra, a0 + ###detect exception bne s2, zero, inst_error nop diff --git a/resources/2021/soft/func/start.S b/resources/2021/soft/func/start.S index 5f71e3d..3c0e5ab 100644 --- a/resources/2021/soft/func/start.S +++ b/resources/2021/soft/func/start.S @@ -320,6 +320,27 @@ inst_test: jr t9 #kseg0 -> kseg1 nop ##### kseg0_kseg1: + + jal n98_cache_dcache_test + nop + jal wait_1s + nop + + la t1, n99_kseg1_kseg0 + li t2, 0x20000000 + subu t9, t1, t2 + jr t9 + nop +n99_kseg1_kseg0: + jal n99_cache_icache_test + nop + jal wait_1s + nop + la t9, n99_kseg0_kseg1 + jr t9 + nop +n99_kseg0_kseg1: + jal n2_addu_test #addu nop jal wait_1s @@ -704,25 +725,7 @@ kseg0_kseg1: nop jal wait_1s nop - jal n98_cache_dcache_test - nop - jal wait_1s - nop - la t1, n99_kseg1_kseg0 - li t2, 0x20000000 - subu t9, t1, t2 - jr t9 - nop -n99_kseg1_kseg0: - jal n99_cache_icache_test - nop - jal wait_1s - nop - la t9, n99_kseg0_kseg1 - jr t9 - nop -n99_kseg0_kseg1: jal n100_movz_movn_test nop From c4942661dc75b3ad2696f6e505ad9b0e10e26fa5 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Mon, 27 Sep 2021 16:58:22 +0800 Subject: [PATCH 53/56] refactor cache inst on I-Cache --- .vscode/settings.json | 6 ++- src/MMU/MMU.sv | 97 ++++++++++++++++++++++++++++++------------- 2 files changed, 73 insertions(+), 30 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 9834788..7630cf2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -63,5 +63,9 @@ "typeinfo": "cpp", "iomanip": "cpp" }, - "editor.defaultFormatter": "bmpenuelas.systemverilog-formatter-vscode" + "editor.defaultFormatter": "bmpenuelas.systemverilog-formatter-vscode", + "verilog.linting.linter": "verilator", + "verilog.linting.verilator.useWSL": true, + "verilog.linting.verilator.arguments": "-x-assign 0 -Wall --assert -Wno-UNOPT -Wno-UNOPTFLAT -Wno-BLKSEQ -DSIMULATION_PC -I./src/AXI/ -I./src/Cache/ -I./src/Core/ -I./src/CP0/ -I./src/Gadgets/ -I./src/include/ -I./src/IP/ -I./src/MMU/ -I./src/Core/Gadgets/ -I./src/IP/DCData_bram/ -I./src/IP/DCTag_bram/ -I./src/IP/div_signed/ -I./src/IP/div_unsigned/ -I./src/IP/ICData_bram/ -I./src/IP/ICTag_bram/ -I./src/IP/mul_signed/ -I./src/IP/mul_unsigned/ ./model/DCData_bram.v ./model/DCTag_bram.v ./model/div_signed.v ./model/div_unsigned.v ./model/ICData_bram.v ./model/ICTag_bram.v ./model/mul_signed.sv ./model/mul_unsigned.sv ./src/mycpu_top.sv ./src/AXI/AXIRead_i.sv ./src/AXI/AXI.sv ./src/AXI/AXIWrite_i.sv ./src/Cache/DCache_i.sv ./src/Cache/DCache.sv ./src/Cache/ICache_i.sv ./src/Cache/ICache.sv ./src/Core/ALU.sv ./src/Core/Controller.sv ./src/Core/Datapath.sv ./src/Core/Queue.sv ./src/Core/RF.sv ./src/CP0/CP0.sv ./src/Gadgets/extender.sv ./src/Gadgets/ffenrc.sv ./src/Gadgets/ffenr.sv ./src/Gadgets/ffen.sv ./src/Gadgets/mux2.sv ./src/Gadgets/mux3.sv ./src/Gadgets/mux4.sv ./src/Gadgets/mux5.sv ./src/Gadgets/mux6.sv ./src/Gadgets/myBuffer0.sv ./src/Gadgets/myBuffer.sv ./src/Gadgets/onehot_bin16.sv ./src/Gadgets/onehot_bin32.sv ./src/Gadgets/onehot_bin4.sv ./src/Gadgets/onehot_bin8.sv ./src/Gadgets/prio_mux4.sv ./src/Gadgets/prio_mux5.sv ./src/MMU/MMU.sv ./src/MMU/sram_i.sv ./src/MMU/SRAM_RO_AXI_i.sv ./src/MMU/sramro_i.sv ./src/MMU/SRAM_W_AXI_i.sv ./src/MMU/TLB_Lookup.sv ./src/MMU/TLB.sv -top mycpu_top", + "files.trimTrailingWhitespace": true } diff --git a/src/MMU/MMU.sv b/src/MMU/MMU.sv index 0a5d088..363aad0 100644 --- a/src/MMU/MMU.sv +++ b/src/MMU/MMU.sv @@ -56,7 +56,7 @@ module MMU ( I_WA, I_WD1, I_WD2, I_WD3, I_WD4, I_WD5, I_WD6, I_WD7, I_WD8, I_REFILL, - I_CACHE, I_CACHE_REFILL + I_CACHE, I_CACHE_DISPATCH, I_CACHE_REFILL } istate_t; typedef enum bit [3:0] { @@ -79,6 +79,16 @@ module MMU ( DWA_WA } dwastate_t; + // ========================== + // ======== CacheVar ======== + // ========================== + + logic icReq; // whether there is a i-cache request + logic icvReq; // whether the i-cache req is valid (I_CACHE_DISPATCH) + + CacheOp_t cacheOp1; // cacheOp piped for a cycle + word_t dVA1; + // ====================== // ======== iVar ======== // ====================== @@ -96,10 +106,6 @@ module MMU ( word_t iD1, iD2, iD3, iD4, iD5, iD6, iD7; - logic diReq; - CacheOp_t cacheOp1; - word_t dVA1, diPA; - // ================================ // ======== iState Machine ======== // ================================ @@ -122,7 +128,14 @@ module MMU ( ic.clearIdx = 0; case (iState) I_IDLE: begin - if (diReq & ~iValid1) begin + if (icReq & ~iReq1) begin + /* + * Try to strip TLB-related logic from the critical path + * When there is a cache request, if the instruction queue + * has been filled, directly handle the request to avoid + * deadlock , or else the request will be handled when + * current request is finished at I-REFILL or I-WD2 + */ iNextState = I_CACHE; end else if (~iValid1) iEn = 1; else begin @@ -151,7 +164,8 @@ module MMU ( if (inst_axi.rvalid) begin inst.data_ok = 1; if (iCached2) iNextState = I_WD3; - else if (diReq) iNextState = I_CACHE; + // make sure icReq is handled + else if (icReq) iNextState = I_CACHE; else begin iEn = 1; iNextState = I_IDLE; @@ -177,29 +191,43 @@ module MMU ( if (inst_axi.rvalid) iNextState = I_REFILL; end I_REFILL: begin - if (diReq) iNextState = I_CACHE; + // make sure icReq is handled + if (icReq) iNextState = I_CACHE; else begin iEn = 1; iNextState = I_IDLE; end end I_CACHE: begin - /* - * I-Cache Cache指令实现备注: - * 在进入 I_CACHE 状态时需确保 iEn == 0 - * 跳出 I_CACHE 状态时 iEn = 0 - * 注意处理 Exceptions - * TLB 转换请求在 iNextState == I_CACHE时发送 - * I-Cache 查询请求在 iNextState == I_CACHE时发送 - * 在 I_CACHE 状态下屏蔽 iAddressError 且只有在 Address 类型请求下允许 TLBRefill 和 TLBInvalid - * I_CACHE 状态下向 I_CACHE 发送 clear 信号 - * drState 状态机同步 + /* For "I-Cache Hit Invalid": + * send TLB translation request here to reduce logic on critical path + * For "I-Cache Index Invalid" or "I-Cache Index Store Tag": + * I-Cache's request is send here too to sync with Hit Invalid + * + * Critical Signals: + * 1. ic.req = 1'b1 + * 2. iVA = dVA1 (use a dedicated var?) */ - if (~iTLBRefill & ~iTLBInvalid & (iCached1 & ic.hit | cacheOp1[1])) ic.clear = 1; + iNextState = I_CACHE_DISPATCH; + end + I_CACHE_DISPATCH: begin + /* + * State: + * 1. I-Cache state == LOOKUP + * 2. TLB iCached1 iHit1 iValid1 ... is valid + * + * Critical Signals: + * 1. ic.req = 1'b0 + * 2. ic.tag1 -> iEn2 -> iPA1 + * 3. ic.clear & ic.clearIdx + */ + + if (icvReq) ic.clear = 1; + ic.clearIdx = cacheOp1[1]; - iEn = 0; - iEn2 = 1; + iEn2 = 1; // use iPA1 as tag + iNextState = I_CACHE_REFILL; end I_CACHE_REFILL: begin @@ -230,7 +258,9 @@ module MMU ( // ========== iFunction ========== // =============================== - assign iVA = (iNextState == I_CACHE | iState == I_CACHE) ? dVA1 : inst.addr; + // On I_CACHE: sending cache request + // On I_CACHE_DISPATCH: using the same addr to clear + assign iVA = (iState == I_CACHE | iState == I_CACHE_DISPATCH) ? dVA1 : inst.addr; assign iValid1 = iReq1 & iHit1 & iMValid1 & (in_kernel | iUser1); assign inst.addr_ok = iEn; @@ -245,7 +275,7 @@ module MMU ( ); // I-Cache req on inst query or cache instruction - assign ic.req = iEn & iState != I_CACHE | iNextState == I_CACHE; + assign ic.req = iEn | iState == I_CACHE; assign ic.valid = iValid1 & iCached1; assign ic.index = iVA[`IC_TAGL-1:`IC_INDEXL]; assign ic.tag1 = iEn2 ? iPA1[31:`IC_TAGL] : iPA2[31:`IC_TAGL]; @@ -264,8 +294,8 @@ module MMU ( assign inst_axi.len = (iEn2 ? iCached1 : iCached2) ? 4'b0111 : 4'b0001; assign inst_axi.size = 3'b010; - assign iTLBRefill = (iState == I_IDLE & iReq1 | iState == I_CACHE & ~cacheOp1[1]) & ~iHit1; - assign iTLBInvalid = (iState == I_IDLE & iReq1 | iState == I_CACHE & ~cacheOp1[1]) & ~iMValid1; + assign iTLBRefill = (iState == I_IDLE & iReq1 | iState == I_CACHE_DISPATCH & ~cacheOp1[1]) & ~iHit1; + assign iTLBInvalid = (iState == I_IDLE & iReq1 | iState == I_CACHE_DISPATCH & ~cacheOp1[1]) & ~iMValid1; assign iAddressError = (iState == I_IDLE) & iReq1 & ~in_kernel & ~iUser1; // ====================== @@ -307,13 +337,11 @@ module MMU ( ffenr #(1) dvalid_ff (clk, rst, data.req, dEn, dReq1); ffen #(2) dsize_ff (clk, data.size, dEn, dSize1); - ffen #(32) dVA1_ff (clk, data.addr, dEn, dVA1); ffen #(32) dPA_ff (clk, dPA1, dEn2, dPA2); ffen #(1) dCached_ff (clk, dCached1, dEn2, dCached2); ffen #(1) dwr_ff (clk, data.wr, dEn2, dwr1); ffen #(4) dwstrb_ff (clk, data.wstrb, dEn2, dWstrb1); ffen #(32) dwdata_ff (clk, data.wdata, dEn2, dWdata1); - ffen #(3) cache_op_ff (clk, cacheOp[2:0], dEn, cacheOp1[2:0]); ffen #(1) dDirtValid_ff (clk, dc.dirt_valid, dEn2, dDirtValid); ffenr #(1) dCCached_ff (clk, dCClear | rst, 1'b1, dCEn, dCCached); @@ -348,7 +376,7 @@ module MMU ( dClrReq = 0; case (drState) DR_IDLE: begin - if (diReq) drNextState = DR_ICACHE; + if (icReq) drNextState = DR_ICACHE; else if (dReq1 & cacheOp1[2] & (dCached1 | dCCached | cacheOp1[1])) begin if (cacheOp1[0]) begin // 不需要写回的情况 @@ -474,7 +502,6 @@ module MMU ( // ================================ assign dVA = data.addr; - assign diReq = dReq1 & ~cacheOp1[2] & |cacheOp1[1:0]; assign dcReq1 = dReq1 & (cacheOp1 == CNOP | cacheOp1[2]); // exclude I-Cache clear assign dValid1 = dReq1 & dHit1 & dMValid1 & (~data.wr | dDirty1) & (in_kernel | dUser1); @@ -722,6 +749,18 @@ module MMU ( assign dc.wdata = dEn2 ? data.wdata : dWdata1; assign dc.wstrb = dEn2 ? data.wstrb : dWstrb1; + // =============================== + // ========== CacheInst ========== + // =============================== + + ffen #(3) cache_op_ff (clk, cacheOp[2:0], dEn, cacheOp1[2:0]); + ffen #(32) dVA1_ff (clk, data.addr, dEn, dVA1); + + + assign icReq = dReq1 & ~cacheOp1[2] & |cacheOp1[1:0]; + assign icvReq = ~iTLBRefill & ~iTLBInvalid & (iCached1 & ic.hit | cacheOp1[1]); + + // ============================== // ========== VA -> PA ========== // ============================== From fa0f195d17bab7c8df69d0f48b0627f0b96465d0 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Thu, 30 Sep 2021 22:45:28 +0800 Subject: [PATCH 54/56] refactor DCache --- src/Cache/DCache.sv | 7 +- src/MMU/MMU.sv | 189 ++++++++++++++++++++++++++------------------ 2 files changed, 116 insertions(+), 80 deletions(-) diff --git a/src/Cache/DCache.sv b/src/Cache/DCache.sv index ca28e62..e890264 100644 --- a/src/Cache/DCache.sv +++ b/src/Cache/DCache.sv @@ -36,7 +36,7 @@ module DCache ( DCIndexL_t index1; - logic hit; + logic hit, hit2; logic [3:0] hitWay; DCData_t cacheLine; @@ -140,14 +140,15 @@ module DCache ( assign hitWay[2] = tagV[2] & tagOut[2].tag == port.tag1; assign hitWay[3] = tagV[3] & tagOut[3].tag == port.tag1; // 在 clearWb状态下确保命中 - assign hit = |{hitWay} | port.clear & port.clearWb; + assign hit = |{hitWay} | port.clear & port.clearWb; + assign hit2 = |{hitWay}; assign cacheLine = (hitWay[0] ? dataOut[0] : `DC_DATA_LENGTH'b0) | (hitWay[1] ? dataOut[1] : `DC_DATA_LENGTH'b0) | (hitWay[2] ? dataOut[2] : `DC_DATA_LENGTH'b0) | (hitWay[3] ? dataOut[3] : `DC_DATA_LENGTH'b0); - assign port.hit = hit; + assign port.hit = hit2; assign port.row = cacheLine; // ============================== diff --git a/src/MMU/MMU.sv b/src/MMU/MMU.sv index 363aad0..cd4251b 100644 --- a/src/MMU/MMU.sv +++ b/src/MMU/MMU.sv @@ -56,7 +56,7 @@ module MMU ( I_WA, I_WD1, I_WD2, I_WD3, I_WD4, I_WD5, I_WD6, I_WD7, I_WD8, I_REFILL, - I_CACHE, I_CACHE_DISPATCH, I_CACHE_REFILL + I_CACHE_PREPARE, I_CACHE_DISPATCH, I_CACHE_REFILL } istate_t; typedef enum bit [3:0] { @@ -64,7 +64,7 @@ module MMU ( DR_WA, DR_WD1, DR_WD2, DR_WD3, DR_WD4, DR_REFILL, - DR_ICACHE, DR_CACHE, DR_CACHE_REFILL, DR_CACHE_REQ + DR_ICACHE, DR_CACHE_PREPARE, DR_CACHE_DISPATCH, DR_CACHE_REFILL, DR_CACHE_REQ } drstate_t; typedef enum bit [2:0] { @@ -83,12 +83,23 @@ module MMU ( // ======== CacheVar ======== // ========================== - logic icReq; // whether there is a i-cache request - logic icvReq; // whether the i-cache req is valid (I_CACHE_DISPATCH) + logic icReq; // whether there is an i-cache request + logic icReqV; // whether i-cache req is valid (I_CACHE_DISPATCH) CacheOp_t cacheOp1; // cacheOp piped for a cycle - word_t dVA1; + word_t dVA1; // data.addr + logic dcReq; // whether there is a d-cache request + logic dClrRv; // dc.rvalid + logic dClrReq; // dc.req + logic dClrInv; // make dc.valid false + logic dDirtValid; // whether it is still dirty + + logic dcReqV; // whether d-cache req is valid + logic dcCEn; // dCached1 en + logic dCClear; // clear dcCached1 + logic dcCached1; // dCached1 pipe + logic dc2nd; // dcache cache write // ====================== // ======== iVar ======== // ====================== @@ -136,7 +147,7 @@ module MMU ( * deadlock , or else the request will be handled when * current request is finished at I-REFILL or I-WD2 */ - iNextState = I_CACHE; + iNextState = I_CACHE_PREPARE; end else if (~iValid1) iEn = 1; else begin iEn2 = 1; @@ -165,7 +176,7 @@ module MMU ( inst.data_ok = 1; if (iCached2) iNextState = I_WD3; // make sure icReq is handled - else if (icReq) iNextState = I_CACHE; + else if (icReq) iNextState = I_CACHE_PREPARE; else begin iEn = 1; iNextState = I_IDLE; @@ -192,13 +203,13 @@ module MMU ( end I_REFILL: begin // make sure icReq is handled - if (icReq) iNextState = I_CACHE; + if (icReq) iNextState = I_CACHE_PREPARE; else begin iEn = 1; iNextState = I_IDLE; end end - I_CACHE: begin + I_CACHE_PREPARE: begin /* For "I-Cache Hit Invalid": * send TLB translation request here to reduce logic on critical path * For "I-Cache Index Invalid" or "I-Cache Index Store Tag": @@ -223,7 +234,7 @@ module MMU ( * 3. ic.clear & ic.clearIdx */ - if (icvReq) ic.clear = 1; + if (icReqV) ic.clear = 1; ic.clearIdx = cacheOp1[1]; iEn2 = 1; // use iPA1 as tag @@ -258,9 +269,9 @@ module MMU ( // ========== iFunction ========== // =============================== - // On I_CACHE: sending cache request + // On I_CACHE_PREPARE: sending cache request // On I_CACHE_DISPATCH: using the same addr to clear - assign iVA = (iState == I_CACHE | iState == I_CACHE_DISPATCH) ? dVA1 : inst.addr; + assign iVA = (iState == I_CACHE_PREPARE | iState == I_CACHE_DISPATCH) ? dVA1 : inst.addr; assign iValid1 = iReq1 & iHit1 & iMValid1 & (in_kernel | iUser1); assign inst.addr_ok = iEn; @@ -275,7 +286,7 @@ module MMU ( ); // I-Cache req on inst query or cache instruction - assign ic.req = iEn | iState == I_CACHE; + assign ic.req = iEn | iState == I_CACHE_PREPARE; assign ic.valid = iValid1 & iCached1; assign ic.index = iVA[`IC_TAGL-1:`IC_INDEXL]; assign ic.tag1 = iEn2 ? iPA1[31:`IC_TAGL] : iPA2[31:`IC_TAGL]; @@ -305,7 +316,7 @@ module MMU ( word_t dVA; logic dEn; - logic dReq1, dcReq1; + logic dReq1; logic dHit1; logic dCached1, dCached2; logic dDirty1; @@ -326,11 +337,6 @@ module MMU ( word_t ddAddr1; logic [127:0] ddData1; - // D-Cache Clear - logic dClrRv, dClrReq; - logic dDirtValid; - logic dCEn, dCClear, dCCached; - // ============================ // ======== dFlip-Flop ======== // ============================ @@ -343,9 +349,6 @@ module MMU ( ffen #(4) dwstrb_ff (clk, data.wstrb, dEn2, dWstrb1); ffen #(32) dwdata_ff (clk, data.wdata, dEn2, dWdata1); - ffen #(1) dDirtValid_ff (clk, dc.dirt_valid, dEn2, dDirtValid); - ffenr #(1) dCCached_ff (clk, dCClear | rst, 1'b1, dCEn, dCCached); - // ================================= // ======== drState Machine ======== // ================================= @@ -361,44 +364,37 @@ module MMU ( always_comb begin dEn = 0; dEn2 = 0; - dCEn = 0; - dCClear = 0; + drNextState = drState; data.data_ok = 0; rdata_axi.req = 0; + // D-Cache 清除功能 (与 req 一起发送) - dc.clear = 0; + dc.clear = 0; // dc.valid = ... (dc.clear | ...) ... dc.clearIdx = 0; dc.clearWb = 0; + // 直接发送 dc.rvalid dClrRv = 0; // 直接发送 dc.req dClrReq = 0; + // 清除 dc.valid + dClrInv = 0; + // 记录 dCached1 + dcCEn = 0; + // 清除 dcCached1 + dCClear = 0; + // CACHE 指令二阶段 + dc2nd = 0; + case (drState) DR_IDLE: begin if (icReq) drNextState = DR_ICACHE; - else if (dReq1 & cacheOp1[2] & (dCached1 | dCCached | cacheOp1[1])) begin - if (cacheOp1[0]) begin - // 不需要写回的情况 - // D-Cache 状态机处于 Lookup 阶段 - dc.clear = 1; // 发送清除 - dc.clearIdx = cacheOp1[1]; // 清除时清除整行或者命中对象 - drNextState = DR_CACHE_REFILL; // 进入 REFILL 等候写入完成 - end else begin - // 需要写回 - // 此时 D-Cache 状态机处于 Lookup 状态 - // 可能是: 1. CACHE 请求第一次发送 - // 2. Index Writeback 清除一路后返回 - dc.clear = 1; // 发送清除 - dc.clearIdx = cacheOp1[1]; // 清除时清除整行或者命中对象 - dc.clearWb = 1; // 需要写回的清除 - drNextState = DR_CACHE; // 进入 DR_CACHE 等候写入完成 - dEn2 = 1; // 二阶段 - dCEn = 1; // 缓存 dCached1 - end - end else if (dReq1 & cacheOp1[2]) begin - // avoid deadlock when address is uncached - drNextState = DR_CACHE_REFILL; + else if (dcReq & ~dTLBRefill & ~dTLBInvalid) begin + dcCEn = 1'b1; // Store dCached1 + dEn2 = 1'b1; // Store dPA1 + dClrInv = 1'b1; // clear dc.valid + drNextState = DR_CACHE_REQ; end else if (~dValid1) dEn = 1; else begin dEn2 = 1; @@ -464,22 +460,49 @@ module MMU ( drNextState = DR_IDLE; end end - DR_CACHE: begin + DR_CACHE_PREPARE: begin + if (~dcReqV) begin + /* + * Jump back when + * 1. Request is invalid + * 2. finished + */ + dc.clear = 1; // Let D-Cache state machine went back to IDLE + drNextState = DR_CACHE_REFILL; + end else if (dcCached1 | cacheOp1[1]) begin + if (cacheOp1[0]) begin + // 不需要写回的情况 + // D-Cache 状态机处于 Lookup 阶段 + dc.clear = 1; // 发送清除 + dc.clearIdx = cacheOp1[1]; // 清除时清除整行或者命中对象 + drNextState = DR_CACHE_REFILL; // 进入 REFILL 等候写入完成 + end else begin + // 需要写回 + // 此时 D-Cache 状态机处于 Lookup 状态 + // 可能是: 1. CACHE 请求第一次发送 + // 2. Index Writeback 清除一路后返回 + dc.clear = 1; // 发送清除 + dc.clearIdx = cacheOp1[1]; // 清除时清除整行或者命中对象 + dc.clearWb = 1; // 需要写回的清除 + drNextState = DR_CACHE_DISPATCH; // 进入 DR_CACHE_DISPATCH 等候写入完成 + dc2nd = 1; // 二阶段 + end + end + end + DR_CACHE_DISPATCH: begin // WriteBack // D-Cache: state == REPLACE if (wdata_ok) begin - dClrRv = 1; // 直接发送 dc.rvalid 通知可写 + dClrRv = 1; // 直接发送 dc.rvalid 通知可写 // Why cann't I send dc.clear HERE ??? // dc.clear = 1; if (cacheOp1[1]) begin // Clear by Index - if (dDirtValid) - drNextState = DR_CACHE_REQ; // 重新进入准备其它路的清除 - else - drNextState = DR_CACHE_REFILL; // 清除完了 + if (dDirtValid) drNextState = DR_CACHE_REQ; // 重新进入准备其它路的清除 + else drNextState = DR_CACHE_REFILL; // 清除完了 end else begin // Clear by Address - drNextState = DR_CACHE_REFILL; // 进入 REFILL 等候写入完成 + drNextState = DR_CACHE_REFILL; // 进入 REFILL 等候写入完成 end end end @@ -490,8 +513,9 @@ module MMU ( data.data_ok = 1; end DR_CACHE_REQ: begin + // From DR_IDLE or DR_CACHE_DISPATCH dClrReq = 1; - drNextState = DR_IDLE; + drNextState = DR_CACHE_PREPARE; end default: begin drNextState = DR_IDLE; end endcase @@ -502,11 +526,10 @@ module MMU ( // ================================ assign dVA = data.addr; - assign dcReq1 = dReq1 & (cacheOp1 == CNOP | cacheOp1[2]); // exclude I-Cache clear assign dValid1 = dReq1 & dHit1 & dMValid1 & (~data.wr | dDirty1) & (in_kernel | dUser1); - assign dTLBRefill = drState == DR_IDLE & dcReq1 & (cacheOp1 == CNOP | ~cacheOp1[1]) & ~dHit1; - assign dTLBInvalid = drState == DR_IDLE & dcReq1 & (cacheOp1 == CNOP | ~cacheOp1[1]) & ~dMValid1; + assign dTLBRefill = drState == DR_IDLE & dReq1 & (cacheOp1 == CNOP | ~cacheOp1[1]) & ~dHit1; + assign dTLBInvalid = drState == DR_IDLE & dReq1 & (cacheOp1 == CNOP | ~cacheOp1[1]) & ~dMValid1; assign dTLBModified = drState == DR_IDLE & dReq1 & cacheOp1 == CNOP & data.wr & ~dDirty1; assign dAddressError = drState == DR_IDLE & dReq1 & cacheOp1 == CNOP & ~in_kernel & ~dUser1; @@ -550,7 +573,7 @@ module MMU ( // do not request when handling CACHE instruction on I-Cache assign dc.req = dClrReq | dEn & (cacheOp[2] | ~|cacheOp[1:0]); - assign dc.valid = dValid1 & dCached1 | dc.clear; + assign dc.valid = ~dClrInv & (dValid1 & dCached1 | dc.clear); assign dc.index = dEn ? dVA[`DC_TAGL-1:`DC_INDEXL] : dVA1[`DC_TAGL-1:`DC_INDEXL]; assign dc.tag1 = dEn2 ? dPA1[31:`DC_TAGL] : dPA2[31:`DC_TAGL]; assign dc.sel1 = dEn2 ? dPA1[3:2] : dPA2[3:2]; @@ -590,12 +613,13 @@ module MMU ( case (dwState) DW_IDLE: begin - if (dEn2 & (~(dCached1 | dCEn) & data.wr - | (dCached1 | dCEn) & dc.dirt_valid - & (~cacheOp1[2] | ~cacheOp1[0]) // WriteOnly 不允许写回 - & (~dc.hit | cacheOp1[2] & ~cacheOp1[0]) // Writeback 或一般情况 + if ( (dEn2 & ~dcReq | dc2nd) + & (~(dCached1 | dcCached1) ? data.wr + : dc.dirt_valid + & (~cacheOp1[2] | ~cacheOp1[0]) // WriteOnly 不允许写回 + & (~dc.hit | cacheOp1[2] & ~cacheOp1[0]) // Writeback 或一般情况 )) begin - if (dCached1 | dCEn) begin + if (dCached1 | dcCached1) begin wdata_axi.wdata = dc.dirt_data[31:0]; wdata_axi.wstrb = 4'b1111; wdata_axi.wvalid = 1'b1; @@ -608,7 +632,7 @@ module MMU ( if (~wdata_axi.wready) dwNextState = DW_WD1; else begin - if (dCached1 | dCEn) dwNextState = DW_WD2; + if (dCached1 | dcCached1) dwNextState = DW_WD2; else begin if (~wdata_axi.data_ok) dwNextState = DW_WB; else begin @@ -621,7 +645,7 @@ module MMU ( end end DW_WD1: begin - if (dCached2 | dCCached) begin + if (dCached2 | dcCached1) begin wdata_axi.wdata = ddData1[31:0]; wdata_axi.wstrb = 4'b1111; wdata_axi.wvalid = 1'b1; @@ -633,7 +657,7 @@ module MMU ( end if (wdata_axi.wready) begin - if (dCached2 | dCCached) dwNextState = DW_WD2; + if (dCached2 | dcCached1) dwNextState = DW_WD2; else begin if (~wdata_axi.data_ok) dwNextState = DW_WB; else begin @@ -704,10 +728,11 @@ module MMU ( case (dwaState) DWA_IDLE: begin - if (dEn2 & (~(dCached1 | dCEn) & data.wr - | (dCached1 | dCEn) & dc.dirt_valid - & (~cacheOp1[2] | ~cacheOp1[0]) // WriteOnly 不允许写回 - & (~dc.hit | cacheOp1[2] & ~cacheOp1[0]) // Writeback 或一般情况 + if ( (dEn2 & ~dcReq | dc2nd) + & (~(dCached1 | dcCached1) ? data.wr + : dc.dirt_valid + & (~cacheOp1[2] | ~cacheOp1[0]) // WriteOnly 不允许写回 + & (~dc.hit | cacheOp1[2] & ~cacheOp1[0]) // Writeback 或一般情况 )) begin wdata_axi.req = 1'b1; if (~wdata_axi.addr_ok) dwaNextState = DWA_WA; @@ -742,9 +767,9 @@ module MMU ( // ========== dwFunction ========== // ================================ - assign wdata_axi.addr = ((dEn2 ? dCached1 : dCached2) | dCEn) ? (dwaState == DWA_IDLE) ? dc.dirt_addr : ddAddr1 : dEn2 ? dPA1 : dPA2; - assign wdata_axi.len = ((dEn2 ? dCached1 : dCached2) | dCEn) ? 4'b0011 : 4'b0000; - assign wdata_axi.size = ((dEn2 ? dCached1 : dCached2) | dCEn) ? 3'b010 : {1'b0, dSize1}; + assign wdata_axi.addr = ((dEn2 ? dCached1 : dCached2) | dcCached1) ? (dwaState == DWA_IDLE) ? dc.dirt_addr : ddAddr1 : dEn2 ? dPA1 : dPA2; + assign wdata_axi.len = ((dEn2 ? dCached1 : dCached2) | dcCached1) ? 4'b0011 : 4'b0000; + assign wdata_axi.size = ((dEn2 ? dCached1 : dCached2) | dcCached1) ? 3'b010 : {1'b0, dSize1}; assign dc.wvalid = dEn2 ? data.wr : dwr1; assign dc.wdata = dEn2 ? data.wdata : dWdata1; assign dc.wstrb = dEn2 ? data.wstrb : dWstrb1; @@ -753,13 +778,23 @@ module MMU ( // ========== CacheInst ========== // =============================== - ffen #(3) cache_op_ff (clk, cacheOp[2:0], dEn, cacheOp1[2:0]); - ffen #(32) dVA1_ff (clk, data.addr, dEn, dVA1); + ffen #(3) cache_op_ff (clk, cacheOp[2:0], dEn, cacheOp1[2:0]); + ffen #(32) dVA1_ff (clk, data.addr, dEn, dVA1); + ffen #(1) dDirtValid_ff (clk, dc.dirt_valid, dc.clear, dDirtValid); + ffenr #(1) dcCached1_ff ( + .clk(clk), + .rst(rst | dCClear), + .d(dCached1 | &cacheOp1[2:1]), + .en(dcCEn), + .q(dcCached1) + ); assign icReq = dReq1 & ~cacheOp1[2] & |cacheOp1[1:0]; - assign icvReq = ~iTLBRefill & ~iTLBInvalid & (iCached1 & ic.hit | cacheOp1[1]); + assign icReqV = ~iTLBRefill & ~iTLBInvalid & (iCached1 & ic.hit | cacheOp1[1]); + assign dcReq = dReq1 & cacheOp1[2]; + assign dcReqV = ~dTLBRefill & ~dTLBInvalid & (dcCached1 & dc.hit | cacheOp1[1]); // ============================== // ========== VA -> PA ========== From 24613eeadec3f2938c4d249bb187306f91275b3f Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Thu, 30 Sep 2021 22:45:28 +0800 Subject: [PATCH 55/56] Revert "refactor DCache" This reverts commit fa0f195d17bab7c8df69d0f48b0627f0b96465d0. --- src/Cache/DCache.sv | 7 +- src/MMU/MMU.sv | 189 ++++++++++++++++++-------------------------- 2 files changed, 80 insertions(+), 116 deletions(-) diff --git a/src/Cache/DCache.sv b/src/Cache/DCache.sv index e890264..ca28e62 100644 --- a/src/Cache/DCache.sv +++ b/src/Cache/DCache.sv @@ -36,7 +36,7 @@ module DCache ( DCIndexL_t index1; - logic hit, hit2; + logic hit; logic [3:0] hitWay; DCData_t cacheLine; @@ -140,15 +140,14 @@ module DCache ( assign hitWay[2] = tagV[2] & tagOut[2].tag == port.tag1; assign hitWay[3] = tagV[3] & tagOut[3].tag == port.tag1; // 在 clearWb状态下确保命中 - assign hit = |{hitWay} | port.clear & port.clearWb; - assign hit2 = |{hitWay}; + assign hit = |{hitWay} | port.clear & port.clearWb; assign cacheLine = (hitWay[0] ? dataOut[0] : `DC_DATA_LENGTH'b0) | (hitWay[1] ? dataOut[1] : `DC_DATA_LENGTH'b0) | (hitWay[2] ? dataOut[2] : `DC_DATA_LENGTH'b0) | (hitWay[3] ? dataOut[3] : `DC_DATA_LENGTH'b0); - assign port.hit = hit2; + assign port.hit = hit; assign port.row = cacheLine; // ============================== diff --git a/src/MMU/MMU.sv b/src/MMU/MMU.sv index cd4251b..363aad0 100644 --- a/src/MMU/MMU.sv +++ b/src/MMU/MMU.sv @@ -56,7 +56,7 @@ module MMU ( I_WA, I_WD1, I_WD2, I_WD3, I_WD4, I_WD5, I_WD6, I_WD7, I_WD8, I_REFILL, - I_CACHE_PREPARE, I_CACHE_DISPATCH, I_CACHE_REFILL + I_CACHE, I_CACHE_DISPATCH, I_CACHE_REFILL } istate_t; typedef enum bit [3:0] { @@ -64,7 +64,7 @@ module MMU ( DR_WA, DR_WD1, DR_WD2, DR_WD3, DR_WD4, DR_REFILL, - DR_ICACHE, DR_CACHE_PREPARE, DR_CACHE_DISPATCH, DR_CACHE_REFILL, DR_CACHE_REQ + DR_ICACHE, DR_CACHE, DR_CACHE_REFILL, DR_CACHE_REQ } drstate_t; typedef enum bit [2:0] { @@ -83,23 +83,12 @@ module MMU ( // ======== CacheVar ======== // ========================== - logic icReq; // whether there is an i-cache request - logic icReqV; // whether i-cache req is valid (I_CACHE_DISPATCH) + logic icReq; // whether there is a i-cache request + logic icvReq; // whether the i-cache req is valid (I_CACHE_DISPATCH) CacheOp_t cacheOp1; // cacheOp piped for a cycle - word_t dVA1; // data.addr + word_t dVA1; - logic dcReq; // whether there is a d-cache request - logic dClrRv; // dc.rvalid - logic dClrReq; // dc.req - logic dClrInv; // make dc.valid false - logic dDirtValid; // whether it is still dirty - - logic dcReqV; // whether d-cache req is valid - logic dcCEn; // dCached1 en - logic dCClear; // clear dcCached1 - logic dcCached1; // dCached1 pipe - logic dc2nd; // dcache cache write // ====================== // ======== iVar ======== // ====================== @@ -147,7 +136,7 @@ module MMU ( * deadlock , or else the request will be handled when * current request is finished at I-REFILL or I-WD2 */ - iNextState = I_CACHE_PREPARE; + iNextState = I_CACHE; end else if (~iValid1) iEn = 1; else begin iEn2 = 1; @@ -176,7 +165,7 @@ module MMU ( inst.data_ok = 1; if (iCached2) iNextState = I_WD3; // make sure icReq is handled - else if (icReq) iNextState = I_CACHE_PREPARE; + else if (icReq) iNextState = I_CACHE; else begin iEn = 1; iNextState = I_IDLE; @@ -203,13 +192,13 @@ module MMU ( end I_REFILL: begin // make sure icReq is handled - if (icReq) iNextState = I_CACHE_PREPARE; + if (icReq) iNextState = I_CACHE; else begin iEn = 1; iNextState = I_IDLE; end end - I_CACHE_PREPARE: begin + I_CACHE: begin /* For "I-Cache Hit Invalid": * send TLB translation request here to reduce logic on critical path * For "I-Cache Index Invalid" or "I-Cache Index Store Tag": @@ -234,7 +223,7 @@ module MMU ( * 3. ic.clear & ic.clearIdx */ - if (icReqV) ic.clear = 1; + if (icvReq) ic.clear = 1; ic.clearIdx = cacheOp1[1]; iEn2 = 1; // use iPA1 as tag @@ -269,9 +258,9 @@ module MMU ( // ========== iFunction ========== // =============================== - // On I_CACHE_PREPARE: sending cache request + // On I_CACHE: sending cache request // On I_CACHE_DISPATCH: using the same addr to clear - assign iVA = (iState == I_CACHE_PREPARE | iState == I_CACHE_DISPATCH) ? dVA1 : inst.addr; + assign iVA = (iState == I_CACHE | iState == I_CACHE_DISPATCH) ? dVA1 : inst.addr; assign iValid1 = iReq1 & iHit1 & iMValid1 & (in_kernel | iUser1); assign inst.addr_ok = iEn; @@ -286,7 +275,7 @@ module MMU ( ); // I-Cache req on inst query or cache instruction - assign ic.req = iEn | iState == I_CACHE_PREPARE; + assign ic.req = iEn | iState == I_CACHE; assign ic.valid = iValid1 & iCached1; assign ic.index = iVA[`IC_TAGL-1:`IC_INDEXL]; assign ic.tag1 = iEn2 ? iPA1[31:`IC_TAGL] : iPA2[31:`IC_TAGL]; @@ -316,7 +305,7 @@ module MMU ( word_t dVA; logic dEn; - logic dReq1; + logic dReq1, dcReq1; logic dHit1; logic dCached1, dCached2; logic dDirty1; @@ -337,6 +326,11 @@ module MMU ( word_t ddAddr1; logic [127:0] ddData1; + // D-Cache Clear + logic dClrRv, dClrReq; + logic dDirtValid; + logic dCEn, dCClear, dCCached; + // ============================ // ======== dFlip-Flop ======== // ============================ @@ -349,6 +343,9 @@ module MMU ( ffen #(4) dwstrb_ff (clk, data.wstrb, dEn2, dWstrb1); ffen #(32) dwdata_ff (clk, data.wdata, dEn2, dWdata1); + ffen #(1) dDirtValid_ff (clk, dc.dirt_valid, dEn2, dDirtValid); + ffenr #(1) dCCached_ff (clk, dCClear | rst, 1'b1, dCEn, dCCached); + // ================================= // ======== drState Machine ======== // ================================= @@ -364,37 +361,44 @@ module MMU ( always_comb begin dEn = 0; dEn2 = 0; - + dCEn = 0; + dCClear = 0; drNextState = drState; data.data_ok = 0; rdata_axi.req = 0; - // D-Cache 清除功能 (与 req 一起发送) - dc.clear = 0; // dc.valid = ... (dc.clear | ...) ... + dc.clear = 0; dc.clearIdx = 0; dc.clearWb = 0; - // 直接发送 dc.rvalid dClrRv = 0; // 直接发送 dc.req dClrReq = 0; - // 清除 dc.valid - dClrInv = 0; - // 记录 dCached1 - dcCEn = 0; - // 清除 dcCached1 - dCClear = 0; - // CACHE 指令二阶段 - dc2nd = 0; - case (drState) DR_IDLE: begin if (icReq) drNextState = DR_ICACHE; - else if (dcReq & ~dTLBRefill & ~dTLBInvalid) begin - dcCEn = 1'b1; // Store dCached1 - dEn2 = 1'b1; // Store dPA1 - dClrInv = 1'b1; // clear dc.valid - drNextState = DR_CACHE_REQ; + else if (dReq1 & cacheOp1[2] & (dCached1 | dCCached | cacheOp1[1])) begin + if (cacheOp1[0]) begin + // 不需要写回的情况 + // D-Cache 状态机处于 Lookup 阶段 + dc.clear = 1; // 发送清除 + dc.clearIdx = cacheOp1[1]; // 清除时清除整行或者命中对象 + drNextState = DR_CACHE_REFILL; // 进入 REFILL 等候写入完成 + end else begin + // 需要写回 + // 此时 D-Cache 状态机处于 Lookup 状态 + // 可能是: 1. CACHE 请求第一次发送 + // 2. Index Writeback 清除一路后返回 + dc.clear = 1; // 发送清除 + dc.clearIdx = cacheOp1[1]; // 清除时清除整行或者命中对象 + dc.clearWb = 1; // 需要写回的清除 + drNextState = DR_CACHE; // 进入 DR_CACHE 等候写入完成 + dEn2 = 1; // 二阶段 + dCEn = 1; // 缓存 dCached1 + end + end else if (dReq1 & cacheOp1[2]) begin + // avoid deadlock when address is uncached + drNextState = DR_CACHE_REFILL; end else if (~dValid1) dEn = 1; else begin dEn2 = 1; @@ -460,49 +464,22 @@ module MMU ( drNextState = DR_IDLE; end end - DR_CACHE_PREPARE: begin - if (~dcReqV) begin - /* - * Jump back when - * 1. Request is invalid - * 2. finished - */ - dc.clear = 1; // Let D-Cache state machine went back to IDLE - drNextState = DR_CACHE_REFILL; - end else if (dcCached1 | cacheOp1[1]) begin - if (cacheOp1[0]) begin - // 不需要写回的情况 - // D-Cache 状态机处于 Lookup 阶段 - dc.clear = 1; // 发送清除 - dc.clearIdx = cacheOp1[1]; // 清除时清除整行或者命中对象 - drNextState = DR_CACHE_REFILL; // 进入 REFILL 等候写入完成 - end else begin - // 需要写回 - // 此时 D-Cache 状态机处于 Lookup 状态 - // 可能是: 1. CACHE 请求第一次发送 - // 2. Index Writeback 清除一路后返回 - dc.clear = 1; // 发送清除 - dc.clearIdx = cacheOp1[1]; // 清除时清除整行或者命中对象 - dc.clearWb = 1; // 需要写回的清除 - drNextState = DR_CACHE_DISPATCH; // 进入 DR_CACHE_DISPATCH 等候写入完成 - dc2nd = 1; // 二阶段 - end - end - end - DR_CACHE_DISPATCH: begin + DR_CACHE: begin // WriteBack // D-Cache: state == REPLACE if (wdata_ok) begin - dClrRv = 1; // 直接发送 dc.rvalid 通知可写 + dClrRv = 1; // 直接发送 dc.rvalid 通知可写 // Why cann't I send dc.clear HERE ??? // dc.clear = 1; if (cacheOp1[1]) begin // Clear by Index - if (dDirtValid) drNextState = DR_CACHE_REQ; // 重新进入准备其它路的清除 - else drNextState = DR_CACHE_REFILL; // 清除完了 + if (dDirtValid) + drNextState = DR_CACHE_REQ; // 重新进入准备其它路的清除 + else + drNextState = DR_CACHE_REFILL; // 清除完了 end else begin // Clear by Address - drNextState = DR_CACHE_REFILL; // 进入 REFILL 等候写入完成 + drNextState = DR_CACHE_REFILL; // 进入 REFILL 等候写入完成 end end end @@ -513,9 +490,8 @@ module MMU ( data.data_ok = 1; end DR_CACHE_REQ: begin - // From DR_IDLE or DR_CACHE_DISPATCH dClrReq = 1; - drNextState = DR_CACHE_PREPARE; + drNextState = DR_IDLE; end default: begin drNextState = DR_IDLE; end endcase @@ -526,10 +502,11 @@ module MMU ( // ================================ assign dVA = data.addr; + assign dcReq1 = dReq1 & (cacheOp1 == CNOP | cacheOp1[2]); // exclude I-Cache clear assign dValid1 = dReq1 & dHit1 & dMValid1 & (~data.wr | dDirty1) & (in_kernel | dUser1); - assign dTLBRefill = drState == DR_IDLE & dReq1 & (cacheOp1 == CNOP | ~cacheOp1[1]) & ~dHit1; - assign dTLBInvalid = drState == DR_IDLE & dReq1 & (cacheOp1 == CNOP | ~cacheOp1[1]) & ~dMValid1; + assign dTLBRefill = drState == DR_IDLE & dcReq1 & (cacheOp1 == CNOP | ~cacheOp1[1]) & ~dHit1; + assign dTLBInvalid = drState == DR_IDLE & dcReq1 & (cacheOp1 == CNOP | ~cacheOp1[1]) & ~dMValid1; assign dTLBModified = drState == DR_IDLE & dReq1 & cacheOp1 == CNOP & data.wr & ~dDirty1; assign dAddressError = drState == DR_IDLE & dReq1 & cacheOp1 == CNOP & ~in_kernel & ~dUser1; @@ -573,7 +550,7 @@ module MMU ( // do not request when handling CACHE instruction on I-Cache assign dc.req = dClrReq | dEn & (cacheOp[2] | ~|cacheOp[1:0]); - assign dc.valid = ~dClrInv & (dValid1 & dCached1 | dc.clear); + assign dc.valid = dValid1 & dCached1 | dc.clear; assign dc.index = dEn ? dVA[`DC_TAGL-1:`DC_INDEXL] : dVA1[`DC_TAGL-1:`DC_INDEXL]; assign dc.tag1 = dEn2 ? dPA1[31:`DC_TAGL] : dPA2[31:`DC_TAGL]; assign dc.sel1 = dEn2 ? dPA1[3:2] : dPA2[3:2]; @@ -613,13 +590,12 @@ module MMU ( case (dwState) DW_IDLE: begin - if ( (dEn2 & ~dcReq | dc2nd) - & (~(dCached1 | dcCached1) ? data.wr - : dc.dirt_valid - & (~cacheOp1[2] | ~cacheOp1[0]) // WriteOnly 不允许写回 - & (~dc.hit | cacheOp1[2] & ~cacheOp1[0]) // Writeback 或一般情况 + if (dEn2 & (~(dCached1 | dCEn) & data.wr + | (dCached1 | dCEn) & dc.dirt_valid + & (~cacheOp1[2] | ~cacheOp1[0]) // WriteOnly 不允许写回 + & (~dc.hit | cacheOp1[2] & ~cacheOp1[0]) // Writeback 或一般情况 )) begin - if (dCached1 | dcCached1) begin + if (dCached1 | dCEn) begin wdata_axi.wdata = dc.dirt_data[31:0]; wdata_axi.wstrb = 4'b1111; wdata_axi.wvalid = 1'b1; @@ -632,7 +608,7 @@ module MMU ( if (~wdata_axi.wready) dwNextState = DW_WD1; else begin - if (dCached1 | dcCached1) dwNextState = DW_WD2; + if (dCached1 | dCEn) dwNextState = DW_WD2; else begin if (~wdata_axi.data_ok) dwNextState = DW_WB; else begin @@ -645,7 +621,7 @@ module MMU ( end end DW_WD1: begin - if (dCached2 | dcCached1) begin + if (dCached2 | dCCached) begin wdata_axi.wdata = ddData1[31:0]; wdata_axi.wstrb = 4'b1111; wdata_axi.wvalid = 1'b1; @@ -657,7 +633,7 @@ module MMU ( end if (wdata_axi.wready) begin - if (dCached2 | dcCached1) dwNextState = DW_WD2; + if (dCached2 | dCCached) dwNextState = DW_WD2; else begin if (~wdata_axi.data_ok) dwNextState = DW_WB; else begin @@ -728,11 +704,10 @@ module MMU ( case (dwaState) DWA_IDLE: begin - if ( (dEn2 & ~dcReq | dc2nd) - & (~(dCached1 | dcCached1) ? data.wr - : dc.dirt_valid - & (~cacheOp1[2] | ~cacheOp1[0]) // WriteOnly 不允许写回 - & (~dc.hit | cacheOp1[2] & ~cacheOp1[0]) // Writeback 或一般情况 + if (dEn2 & (~(dCached1 | dCEn) & data.wr + | (dCached1 | dCEn) & dc.dirt_valid + & (~cacheOp1[2] | ~cacheOp1[0]) // WriteOnly 不允许写回 + & (~dc.hit | cacheOp1[2] & ~cacheOp1[0]) // Writeback 或一般情况 )) begin wdata_axi.req = 1'b1; if (~wdata_axi.addr_ok) dwaNextState = DWA_WA; @@ -767,9 +742,9 @@ module MMU ( // ========== dwFunction ========== // ================================ - assign wdata_axi.addr = ((dEn2 ? dCached1 : dCached2) | dcCached1) ? (dwaState == DWA_IDLE) ? dc.dirt_addr : ddAddr1 : dEn2 ? dPA1 : dPA2; - assign wdata_axi.len = ((dEn2 ? dCached1 : dCached2) | dcCached1) ? 4'b0011 : 4'b0000; - assign wdata_axi.size = ((dEn2 ? dCached1 : dCached2) | dcCached1) ? 3'b010 : {1'b0, dSize1}; + assign wdata_axi.addr = ((dEn2 ? dCached1 : dCached2) | dCEn) ? (dwaState == DWA_IDLE) ? dc.dirt_addr : ddAddr1 : dEn2 ? dPA1 : dPA2; + assign wdata_axi.len = ((dEn2 ? dCached1 : dCached2) | dCEn) ? 4'b0011 : 4'b0000; + assign wdata_axi.size = ((dEn2 ? dCached1 : dCached2) | dCEn) ? 3'b010 : {1'b0, dSize1}; assign dc.wvalid = dEn2 ? data.wr : dwr1; assign dc.wdata = dEn2 ? data.wdata : dWdata1; assign dc.wstrb = dEn2 ? data.wstrb : dWstrb1; @@ -778,23 +753,13 @@ module MMU ( // ========== CacheInst ========== // =============================== - ffen #(3) cache_op_ff (clk, cacheOp[2:0], dEn, cacheOp1[2:0]); - ffen #(32) dVA1_ff (clk, data.addr, dEn, dVA1); - ffen #(1) dDirtValid_ff (clk, dc.dirt_valid, dc.clear, dDirtValid); + ffen #(3) cache_op_ff (clk, cacheOp[2:0], dEn, cacheOp1[2:0]); + ffen #(32) dVA1_ff (clk, data.addr, dEn, dVA1); - ffenr #(1) dcCached1_ff ( - .clk(clk), - .rst(rst | dCClear), - .d(dCached1 | &cacheOp1[2:1]), - .en(dcCEn), - .q(dcCached1) - ); assign icReq = dReq1 & ~cacheOp1[2] & |cacheOp1[1:0]; - assign icReqV = ~iTLBRefill & ~iTLBInvalid & (iCached1 & ic.hit | cacheOp1[1]); + assign icvReq = ~iTLBRefill & ~iTLBInvalid & (iCached1 & ic.hit | cacheOp1[1]); - assign dcReq = dReq1 & cacheOp1[2]; - assign dcReqV = ~dTLBRefill & ~dTLBInvalid & (dcCached1 & dc.hit | cacheOp1[1]); // ============================== // ========== VA -> PA ========== From a2f8fdae9b03ad8286dcdc8ce7225ca6cdd74735 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Thu, 14 Oct 2021 22:31:25 +0800 Subject: [PATCH 56/56] clean up --- .vscode/c_cpp_properties.json | 18 - .vscode/settings.json | 71 - README.md | 64 +- model/DCData_bram.v | 17 - model/DCTag_bram.v | 17 - model/ICData_bram.v | 16 - model/ICTag_bram.v | 17 - model/div_signed.v | 30 - model/div_unsigned.v | 30 - model/mul_signed.sv | 22 - model/mul_unsigned.sv | 22 - resources/soc/rtl/AMBA/axi2apb.v | 542 - resources/soc/rtl/AMBA/axi_mux.v | 1102 - resources/soc/rtl/APB_DEV/NAND/nand.v | 1430 - resources/soc/rtl/APB_DEV/URT/raminfr.v | 62 - resources/soc/rtl/APB_DEV/URT/uart_defines.h | 119 - resources/soc/rtl/APB_DEV/URT/uart_receiver.v | 288 - resources/soc/rtl/APB_DEV/URT/uart_regs.v | 711 - resources/soc/rtl/APB_DEV/URT/uart_rfifo.v | 193 - .../soc/rtl/APB_DEV/URT/uart_sync_flops.v | 76 - resources/soc/rtl/APB_DEV/URT/uart_tfifo.v | 129 - resources/soc/rtl/APB_DEV/URT/uart_top.v | 107 - .../soc/rtl/APB_DEV/URT/uart_transmitter.v | 281 - resources/soc/rtl/APB_DEV/apb_dev_top.v | 416 - resources/soc/rtl/APB_DEV/apb_mux2.v | 203 - resources/soc/rtl/APB_DEV/nand_module.v | 140 - resources/soc/rtl/CONFREG/confreg.v | 695 - resources/soc/rtl/DMA/dma.v | 778 - resources/soc/rtl/MAC/bd.v | 372 - resources/soc/rtl/MAC/csr.v | 2530 -- resources/soc/rtl/MAC/dma.v | 646 - resources/soc/rtl/MAC/ethernet_top.v | 368 - resources/soc/rtl/MAC/mac.v | 862 - resources/soc/rtl/MAC/mac2axi.v | 355 - resources/soc/rtl/MAC/mac_axi.v | 522 - resources/soc/rtl/MAC/mac_top.v | 445 - resources/soc/rtl/MAC/maccsr2axi.v | 291 - resources/soc/rtl/MAC/macdata2axi.v | 248 - resources/soc/rtl/MAC/rc.v | 1749 -- resources/soc/rtl/MAC/rfifo.v | 439 - resources/soc/rtl/MAC/rlsm.v | 1328 - resources/soc/rtl/MAC/rstc.v | 158 - resources/soc/rtl/MAC/tc.v | 1296 - resources/soc/rtl/MAC/tfifo.v | 815 - resources/soc/rtl/MAC/tlsm.v | 2197 -- resources/soc/rtl/MAC/utility.v | 282 - resources/soc/rtl/SPI/godson_sbridge_spi.v | 896 - resources/soc/rtl/TOP/config.h | 98 - resources/soc/rtl/TOP/soc_up_top.v | 1493 -- ...理器gs232源码,目前缺少,请联系龙芯开源获得.txt | 7 - resources/soc/simu/run/run_func/lib.list | 82 - resources/soc/simu/run/run_func/ncompile | 3 - resources/soc/simu/run/run_func/rtl.list | 117 - resources/soc/simu/run/run_func/run.f | 28 - resources/soc/simu/run/run_func/sys.list | 11 - resources/soc/simu/soft/func/Makefile | 48 - resources/soc/simu/soft/func/config.h | 179 - resources/soc/simu/soft/func/convert.c | 29 - .../soc/simu/soft/func/include/Calendar.h | 12 - .../soc/simu/soft/func/include/Infrare.h | 1 - .../soc/simu/soft/func/include/Interrupt.h | 9 - .../soc/simu/soft/func/include/MonthData.h | 23 - .../soc/simu/soft/func/include/SystemInit.h | 4 - resources/soc/simu/soft/func/include/adc.h | 2 - .../simu/soft/func/include/asm/interrupt.h | 287 - .../soc/simu/soft/func/include/asm/mipsregs.h | 38 - .../soc/simu/soft/func/include/asm/ns16550.h | 135 - .../soc/simu/soft/func/include/asm/regdef.h | 39 - .../soc/simu/soft/func/include/battery.h | 4 - .../soc/simu/soft/func/include/cmdline.h | 9 - resources/soc/simu/soft/func/include/common.h | 5 - .../soc/simu/soft/func/include/dg_rs232.h | 1 - resources/soc/simu/soft/func/include/flash.h | 6 - resources/soc/simu/soft/func/include/frame.h | 43 - resources/soc/simu/soft/func/include/isp.h | 10 - resources/soc/simu/soft/func/include/key.h | 1 - resources/soc/simu/soft/func/include/lcd.h | 132 - resources/soc/simu/soft/func/include/ls1d.h | 158 - .../soc/simu/soft/func/include/temp_flow.h | 11 - resources/soc/simu/soft/func/include/xmodem.h | 16 - resources/soc/simu/soft/func/lib/Makefile | 12 - resources/soc/simu/soft/func/lib/memcmp.c | 16 - resources/soc/simu/soft/func/lib/memcpy.c | 16 - resources/soc/simu/soft/func/lib/memset.c | 10 - resources/soc/simu/soft/func/lib/printbase.c | 28 - resources/soc/simu/soft/func/lib/printf.c | 79 - resources/soc/simu/soft/func/lib/printhex.c | 11 - resources/soc/simu/soft/func/lib/putchar.c | 5 - resources/soc/simu/soft/func/lib/puts.c | 13 - resources/soc/simu/soft/func/lib/strcat.c | 48 - resources/soc/simu/soft/func/lib/strchr.c | 44 - resources/soc/simu/soft/func/lib/strcmp.c | 11 - resources/soc/simu/soft/func/lib/strcspn.c | 48 - resources/soc/simu/soft/func/lib/strspn.c | 51 - resources/soc/simu/soft/func/lib/strtok.c | 51 - resources/soc/simu/soft/func/lib/udelay.c | 13 - resources/soc/simu/soft/func/main.c | 7 - resources/soc/simu/soft/func/nand_test.S | 284 - .../soc/simu/soft/func/source/Calendar.c | 154 - resources/soc/simu/soft/func/source/Infrare.c | 33 - .../soc/simu/soft/func/source/Interrupt.c | 6 - .../soc/simu/soft/func/source/MonthData.c | 62 - .../soc/simu/soft/func/source/SystemInit.c | 118 - resources/soc/simu/soft/func/source/adc.c | 49 - resources/soc/simu/soft/func/source/battery.c | 148 - resources/soc/simu/soft/func/source/cmdline.c | 326 - resources/soc/simu/soft/func/source/common.c | 125 - .../soc/simu/soft/func/source/dg_rs232.c | 193 - resources/soc/simu/soft/func/source/flash.c | 255 - resources/soc/simu/soft/func/source/frame.c | 449 - resources/soc/simu/soft/func/source/isp.c | 279 - resources/soc/simu/soft/func/source/key.c | 77 - resources/soc/simu/soft/func/source/lcd.c | 414 - .../soc/simu/soft/func/source/temp_flow.c | 416 - resources/soc/simu/soft/func/source/xmodem.c | 233 - resources/soc/simu/soft/func/start.S | 657 - resources/soc/simu/soft/func/test.lds | 72 - resources/soc/simu/testbench/MX25L6405D.v | 2154 -- resources/soc/simu/testbench/ddr3_model.sv | 2937 --- .../simu/testbench/ddr3_model_parameters.vh | 3412 --- .../soc/simu/testbench/ejtag_virtual_host.v | 235 - resources/soc/simu/testbench/godson_system.v | 310 - resources/soc/simu/testbench/nand_sim.v | 3680 --- resources/soc/simu/testbench/uart_dev.v | 527 - .../soc/simu/testbench/vmac/mac2ahb_package.v | 98 - resources/soc/simu/testbench/vmac/mac_ram.v | 989 - resources/soc/simu/testbench/vmac/mac_top.v | 13548 ---------- resources/soc/simu/testbench/vmac/ram.vlog | 22018 ---------------- .../soc/simu/testbench/vmac/virtual_mac.v | 406 - .../project_1/project_1/project_1.xpr | 1154 - .../axi_interconnect_0/axi_interconnect_0.xci | 1520 -- .../xilinx_ip/clk_pll_33/clk_pll_33.xci | 716 - .../xilinx_ip/clk_wiz_0/clk_wiz_0.xci | 716 - .../xilinx_ip/dpram_512x32/dpram_512x32.xci | 315 - .../project_1/xilinx_ip/mig_axi_32/mig_a.prj | 131 - .../xilinx_ip/mig_axi_32/mig_axi_32.xci | 2647 -- .../project_1/xilinx_ip/mig_axi_32/mig_b.prj | 131 - .../xilinx_ip/sram_128x22/sram_128x22.xci | 309 - .../xilinx_ip/sram_128x32/sram_128x32.xci | 309 - .../xilinx_ip/sram_128x64/sram_128x64.xci | 311 - .../xilinx_ip/sram_32x52bit/sram_32x52bit.xci | 309 - resources/soc/vivado_xpr/soc_up.xdc | 200 - resources/tft-lcd/LCD.sv | 28 - sim/.gitignore | 2 - sim/Makefile | 60 - sim/sim_main.cpp | 47 - 146 files changed, 6 insertions(+), 90462 deletions(-) delete mode 100644 .vscode/c_cpp_properties.json delete mode 100644 .vscode/settings.json delete mode 100644 model/DCData_bram.v delete mode 100644 model/DCTag_bram.v delete mode 100644 model/ICData_bram.v delete mode 100644 model/ICTag_bram.v delete mode 100644 model/div_signed.v delete mode 100644 model/div_unsigned.v delete mode 100644 model/mul_signed.sv delete mode 100644 model/mul_unsigned.sv delete mode 100644 resources/soc/rtl/AMBA/axi2apb.v delete mode 100644 resources/soc/rtl/AMBA/axi_mux.v delete mode 100644 resources/soc/rtl/APB_DEV/NAND/nand.v delete mode 100644 resources/soc/rtl/APB_DEV/URT/raminfr.v delete mode 100644 resources/soc/rtl/APB_DEV/URT/uart_defines.h delete mode 100644 resources/soc/rtl/APB_DEV/URT/uart_receiver.v delete mode 100644 resources/soc/rtl/APB_DEV/URT/uart_regs.v delete mode 100644 resources/soc/rtl/APB_DEV/URT/uart_rfifo.v delete mode 100644 resources/soc/rtl/APB_DEV/URT/uart_sync_flops.v delete mode 100644 resources/soc/rtl/APB_DEV/URT/uart_tfifo.v delete mode 100644 resources/soc/rtl/APB_DEV/URT/uart_top.v delete mode 100644 resources/soc/rtl/APB_DEV/URT/uart_transmitter.v delete mode 100644 resources/soc/rtl/APB_DEV/apb_dev_top.v delete mode 100644 resources/soc/rtl/APB_DEV/apb_mux2.v delete mode 100644 resources/soc/rtl/APB_DEV/nand_module.v delete mode 100644 resources/soc/rtl/CONFREG/confreg.v delete mode 100644 resources/soc/rtl/DMA/dma.v delete mode 100644 resources/soc/rtl/MAC/bd.v delete mode 100644 resources/soc/rtl/MAC/csr.v delete mode 100644 resources/soc/rtl/MAC/dma.v delete mode 100644 resources/soc/rtl/MAC/ethernet_top.v delete mode 100644 resources/soc/rtl/MAC/mac.v delete mode 100644 resources/soc/rtl/MAC/mac2axi.v delete mode 100644 resources/soc/rtl/MAC/mac_axi.v delete mode 100644 resources/soc/rtl/MAC/mac_top.v delete mode 100644 resources/soc/rtl/MAC/maccsr2axi.v delete mode 100644 resources/soc/rtl/MAC/macdata2axi.v delete mode 100644 resources/soc/rtl/MAC/rc.v delete mode 100644 resources/soc/rtl/MAC/rfifo.v delete mode 100644 resources/soc/rtl/MAC/rlsm.v delete mode 100644 resources/soc/rtl/MAC/rstc.v delete mode 100644 resources/soc/rtl/MAC/tc.v delete mode 100644 resources/soc/rtl/MAC/tfifo.v delete mode 100644 resources/soc/rtl/MAC/tlsm.v delete mode 100644 resources/soc/rtl/MAC/utility.v delete mode 100644 resources/soc/rtl/SPI/godson_sbridge_spi.v delete mode 100644 resources/soc/rtl/TOP/config.h delete mode 100644 resources/soc/rtl/TOP/soc_up_top.v delete mode 100644 resources/soc/rtl/cpu232/龙芯开源处理器gs232源码,目前缺少,请联系龙芯开源获得.txt delete mode 100644 resources/soc/simu/run/run_func/lib.list delete mode 100644 resources/soc/simu/run/run_func/ncompile delete mode 100644 resources/soc/simu/run/run_func/rtl.list delete mode 100644 resources/soc/simu/run/run_func/run.f delete mode 100644 resources/soc/simu/run/run_func/sys.list delete mode 100644 resources/soc/simu/soft/func/Makefile delete mode 100644 resources/soc/simu/soft/func/config.h delete mode 100644 resources/soc/simu/soft/func/convert.c delete mode 100644 resources/soc/simu/soft/func/include/Calendar.h delete mode 100644 resources/soc/simu/soft/func/include/Infrare.h delete mode 100644 resources/soc/simu/soft/func/include/Interrupt.h delete mode 100644 resources/soc/simu/soft/func/include/MonthData.h delete mode 100644 resources/soc/simu/soft/func/include/SystemInit.h delete mode 100644 resources/soc/simu/soft/func/include/adc.h delete mode 100644 resources/soc/simu/soft/func/include/asm/interrupt.h delete mode 100644 resources/soc/simu/soft/func/include/asm/mipsregs.h delete mode 100644 resources/soc/simu/soft/func/include/asm/ns16550.h delete mode 100644 resources/soc/simu/soft/func/include/asm/regdef.h delete mode 100644 resources/soc/simu/soft/func/include/battery.h delete mode 100644 resources/soc/simu/soft/func/include/cmdline.h delete mode 100644 resources/soc/simu/soft/func/include/common.h delete mode 100644 resources/soc/simu/soft/func/include/dg_rs232.h delete mode 100644 resources/soc/simu/soft/func/include/flash.h delete mode 100644 resources/soc/simu/soft/func/include/frame.h delete mode 100644 resources/soc/simu/soft/func/include/isp.h delete mode 100644 resources/soc/simu/soft/func/include/key.h delete mode 100644 resources/soc/simu/soft/func/include/lcd.h delete mode 100644 resources/soc/simu/soft/func/include/ls1d.h delete mode 100644 resources/soc/simu/soft/func/include/temp_flow.h delete mode 100644 resources/soc/simu/soft/func/include/xmodem.h delete mode 100644 resources/soc/simu/soft/func/lib/Makefile delete mode 100644 resources/soc/simu/soft/func/lib/memcmp.c delete mode 100644 resources/soc/simu/soft/func/lib/memcpy.c delete mode 100644 resources/soc/simu/soft/func/lib/memset.c delete mode 100644 resources/soc/simu/soft/func/lib/printbase.c delete mode 100644 resources/soc/simu/soft/func/lib/printf.c delete mode 100644 resources/soc/simu/soft/func/lib/printhex.c delete mode 100644 resources/soc/simu/soft/func/lib/putchar.c delete mode 100644 resources/soc/simu/soft/func/lib/puts.c delete mode 100644 resources/soc/simu/soft/func/lib/strcat.c delete mode 100644 resources/soc/simu/soft/func/lib/strchr.c delete mode 100644 resources/soc/simu/soft/func/lib/strcmp.c delete mode 100644 resources/soc/simu/soft/func/lib/strcspn.c delete mode 100644 resources/soc/simu/soft/func/lib/strspn.c delete mode 100644 resources/soc/simu/soft/func/lib/strtok.c delete mode 100644 resources/soc/simu/soft/func/lib/udelay.c delete mode 100644 resources/soc/simu/soft/func/main.c delete mode 100644 resources/soc/simu/soft/func/nand_test.S delete mode 100644 resources/soc/simu/soft/func/source/Calendar.c delete mode 100644 resources/soc/simu/soft/func/source/Infrare.c delete mode 100644 resources/soc/simu/soft/func/source/Interrupt.c delete mode 100644 resources/soc/simu/soft/func/source/MonthData.c delete mode 100644 resources/soc/simu/soft/func/source/SystemInit.c delete mode 100644 resources/soc/simu/soft/func/source/adc.c delete mode 100644 resources/soc/simu/soft/func/source/battery.c delete mode 100644 resources/soc/simu/soft/func/source/cmdline.c delete mode 100644 resources/soc/simu/soft/func/source/common.c delete mode 100644 resources/soc/simu/soft/func/source/dg_rs232.c delete mode 100644 resources/soc/simu/soft/func/source/flash.c delete mode 100644 resources/soc/simu/soft/func/source/frame.c delete mode 100644 resources/soc/simu/soft/func/source/isp.c delete mode 100644 resources/soc/simu/soft/func/source/key.c delete mode 100644 resources/soc/simu/soft/func/source/lcd.c delete mode 100644 resources/soc/simu/soft/func/source/temp_flow.c delete mode 100644 resources/soc/simu/soft/func/source/xmodem.c delete mode 100644 resources/soc/simu/soft/func/start.S delete mode 100644 resources/soc/simu/soft/func/test.lds delete mode 100644 resources/soc/simu/testbench/MX25L6405D.v delete mode 100644 resources/soc/simu/testbench/ddr3_model.sv delete mode 100644 resources/soc/simu/testbench/ddr3_model_parameters.vh delete mode 100644 resources/soc/simu/testbench/ejtag_virtual_host.v delete mode 100644 resources/soc/simu/testbench/godson_system.v delete mode 100644 resources/soc/simu/testbench/nand_sim.v delete mode 100644 resources/soc/simu/testbench/uart_dev.v delete mode 100644 resources/soc/simu/testbench/vmac/mac2ahb_package.v delete mode 100644 resources/soc/simu/testbench/vmac/mac_ram.v delete mode 100644 resources/soc/simu/testbench/vmac/mac_top.v delete mode 100644 resources/soc/simu/testbench/vmac/ram.vlog delete mode 100644 resources/soc/simu/testbench/vmac/virtual_mac.v delete mode 100644 resources/soc/vivado_xpr/project_1/project_1/project_1.xpr delete mode 100644 resources/soc/vivado_xpr/project_1/xilinx_ip/axi_interconnect_0/axi_interconnect_0.xci delete mode 100644 resources/soc/vivado_xpr/project_1/xilinx_ip/clk_pll_33/clk_pll_33.xci delete mode 100644 resources/soc/vivado_xpr/project_1/xilinx_ip/clk_wiz_0/clk_wiz_0.xci delete mode 100644 resources/soc/vivado_xpr/project_1/xilinx_ip/dpram_512x32/dpram_512x32.xci delete mode 100644 resources/soc/vivado_xpr/project_1/xilinx_ip/mig_axi_32/mig_a.prj delete mode 100644 resources/soc/vivado_xpr/project_1/xilinx_ip/mig_axi_32/mig_axi_32.xci delete mode 100644 resources/soc/vivado_xpr/project_1/xilinx_ip/mig_axi_32/mig_b.prj delete mode 100644 resources/soc/vivado_xpr/project_1/xilinx_ip/sram_128x22/sram_128x22.xci delete mode 100644 resources/soc/vivado_xpr/project_1/xilinx_ip/sram_128x32/sram_128x32.xci delete mode 100644 resources/soc/vivado_xpr/project_1/xilinx_ip/sram_128x64/sram_128x64.xci delete mode 100644 resources/soc/vivado_xpr/project_1/xilinx_ip/sram_32x52bit/sram_32x52bit.xci delete mode 100644 resources/soc/vivado_xpr/soc_up.xdc delete mode 100644 resources/tft-lcd/LCD.sv delete mode 100644 sim/.gitignore delete mode 100644 sim/Makefile delete mode 100644 sim/sim_main.cpp diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json deleted file mode 100644 index 6c78102..0000000 --- a/.vscode/c_cpp_properties.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "configurations": [ - { - "name": "Linux", - "includePath": [ - "${workspaceFolder}/**", - "${workspaceFolder}/sim/obj_dir", - "/usr/share/verilator/include" - ], - "defines": [], - "compilerPath": "/usr/sbin/clang", - "cStandard": "c17", - "cppStandard": "c++14", - "intelliSenseMode": "linux-clang-x64" - } - ], - "version": 4 -} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 7630cf2..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "files.associations": { - "cctype": "cpp", - "clocale": "cpp", - "cmath": "cpp", - "cstdarg": "cpp", - "cstddef": "cpp", - "cstdio": "cpp", - "cstdlib": "cpp", - "cstring": "cpp", - "ctime": "cpp", - "cwchar": "cpp", - "cwctype": "cpp", - "array": "cpp", - "atomic": "cpp", - "bit": "cpp", - "*.tcc": "cpp", - "bitset": "cpp", - "chrono": "cpp", - "compare": "cpp", - "concepts": "cpp", - "condition_variable": "cpp", - "cstdint": "cpp", - "deque": "cpp", - "list": "cpp", - "map": "cpp", - "set": "cpp", - "string": "cpp", - "unordered_map": "cpp", - "unordered_set": "cpp", - "vector": "cpp", - "exception": "cpp", - "algorithm": "cpp", - "functional": "cpp", - "iterator": "cpp", - "memory": "cpp", - "memory_resource": "cpp", - "numeric": "cpp", - "random": "cpp", - "ratio": "cpp", - "string_view": "cpp", - "system_error": "cpp", - "tuple": "cpp", - "type_traits": "cpp", - "utility": "cpp", - "fstream": "cpp", - "initializer_list": "cpp", - "iosfwd": "cpp", - "iostream": "cpp", - "istream": "cpp", - "limits": "cpp", - "mutex": "cpp", - "new": "cpp", - "numbers": "cpp", - "ostream": "cpp", - "semaphore": "cpp", - "sstream": "cpp", - "stdexcept": "cpp", - "stop_token": "cpp", - "streambuf": "cpp", - "thread": "cpp", - "cinttypes": "cpp", - "typeinfo": "cpp", - "iomanip": "cpp" - }, - "editor.defaultFormatter": "bmpenuelas.systemverilog-formatter-vscode", - "verilog.linting.linter": "verilator", - "verilog.linting.verilator.useWSL": true, - "verilog.linting.verilator.arguments": "-x-assign 0 -Wall --assert -Wno-UNOPT -Wno-UNOPTFLAT -Wno-BLKSEQ -DSIMULATION_PC -I./src/AXI/ -I./src/Cache/ -I./src/Core/ -I./src/CP0/ -I./src/Gadgets/ -I./src/include/ -I./src/IP/ -I./src/MMU/ -I./src/Core/Gadgets/ -I./src/IP/DCData_bram/ -I./src/IP/DCTag_bram/ -I./src/IP/div_signed/ -I./src/IP/div_unsigned/ -I./src/IP/ICData_bram/ -I./src/IP/ICTag_bram/ -I./src/IP/mul_signed/ -I./src/IP/mul_unsigned/ ./model/DCData_bram.v ./model/DCTag_bram.v ./model/div_signed.v ./model/div_unsigned.v ./model/ICData_bram.v ./model/ICTag_bram.v ./model/mul_signed.sv ./model/mul_unsigned.sv ./src/mycpu_top.sv ./src/AXI/AXIRead_i.sv ./src/AXI/AXI.sv ./src/AXI/AXIWrite_i.sv ./src/Cache/DCache_i.sv ./src/Cache/DCache.sv ./src/Cache/ICache_i.sv ./src/Cache/ICache.sv ./src/Core/ALU.sv ./src/Core/Controller.sv ./src/Core/Datapath.sv ./src/Core/Queue.sv ./src/Core/RF.sv ./src/CP0/CP0.sv ./src/Gadgets/extender.sv ./src/Gadgets/ffenrc.sv ./src/Gadgets/ffenr.sv ./src/Gadgets/ffen.sv ./src/Gadgets/mux2.sv ./src/Gadgets/mux3.sv ./src/Gadgets/mux4.sv ./src/Gadgets/mux5.sv ./src/Gadgets/mux6.sv ./src/Gadgets/myBuffer0.sv ./src/Gadgets/myBuffer.sv ./src/Gadgets/onehot_bin16.sv ./src/Gadgets/onehot_bin32.sv ./src/Gadgets/onehot_bin4.sv ./src/Gadgets/onehot_bin8.sv ./src/Gadgets/prio_mux4.sv ./src/Gadgets/prio_mux5.sv ./src/MMU/MMU.sv ./src/MMU/sram_i.sv ./src/MMU/SRAM_RO_AXI_i.sv ./src/MMU/sramro_i.sv ./src/MMU/SRAM_W_AXI_i.sv ./src/MMU/TLB_Lookup.sv ./src/MMU/TLB.sv -top mycpu_top", - "files.trimTrailingWhitespace": true -} diff --git a/README.md b/README.md index 8182e82..95b9b90 100644 --- a/README.md +++ b/README.md @@ -1,74 +1,22 @@ Magically Improved Pipeline Stages === -Our awesome `MIPS` CPU written in `SystemVerilog` for Loongson Cup +Our awesome `MIPS` CPU written in `SystemVerilog` for Loongson Cup 2021 ``` . -├── model <-- IP行为模型 -├── resources <-- 资源包 +├── resources <-- 资源 +│ ├── 2021 <-- 2021 资源包 +│ ├── ping-pong-mips32 <-- 决赛项目 ping pong +│ └── system_top <-- 决赛项目 ping pong 用的外围顶层 ├── src <-- CPU设计代码 │ ├── AXI <-- AXI总线交互 │ ├── Cache <-- Cache │ ├── Core <-- CPU核心 +│ ├── CP0 <-- CP0 协处理器 │ ├── Gadgets <-- 小部件 -│ ├── CP0 <-- CP0协处理器 │ ├── include <-- 头文件 │ ├── IP <-- 用到的IP │ └── MMU <-- 地址转换单元 └── tools <-- 控制信号生成器 ``` - -## Progress - -- [x] 特权模式 - - [x] `CP0`寄存器`Status.UM` :heavy_check_mark: - - [x] 访存异常(考虑`in_kernel`状态切换带来的冒险) :heavy_check_mark: - - [x] 特权指令异常 :heavy_check_mark: -- [ ] 浮点运算单元 - - [ ] ~~做一个真的`FPU`~~ :x: - - [ ] 浮点运算指令报`Coprocessor Unusable`,同时`CP0`中新增`Cause.CE` :clock3: -- [x] 新增指令 -- [ ] `Cache`指令修正 - - [x] 完善 Test Cases - - [ ] 重新阻止流水线结构 (`TLB`转换) - -## `Cache`指令 - -预计实现以下`7`条操作 - -```verilog -32'b101111?????00000???????????????? // I-Cache Index Invalid -32'b101111?????01000???????????????? // I-Cache Index Store Tag -32'b101111?????10000???????????????? // I-Cache Hit Invalid -32'b101111?????00001???????????????? // D-Cache Index Writeback Invalid -32'b101111?????01001???????????????? // D-Cache Index Store Tag -32'b101111?????10001???????????????? // D-Cache Hit Invalid -32'b101111?????10101???????????????? // D-Cache Hit Writeback Invalid -``` - -其中,`Index Store Tag`中使用到了`TagLo`和`TagHi`寄存器。考虑到地址最多`32`位,故不实现`TagHi`寄存器(恒`0`);同时,由于`TagLo`和`TagHi`寄存器定义与具体处理器实现相关,在应用上用于将`Cache`的`Tag`清零(可以魔改内核),故也不实现`TagLo`寄存器(恒`0`)。所以`Index Store Tag`指令在实现上变为不写回的`Index Invalid` - -对于上述操作,具体实现: - -``` -Cache -> VIPT -Index Invalid : VA -> Index -> (Write Back) -> Write Zero -Index Store Tag : VA -> Index -> Write Zero -Hit Invalid : VA -> Lookup -> Hit? -> Write Zero -Hit Writeback Invalid : VA -> Lookup -> Hit? -> (Write Back) -> Write Zero -``` - -控制信号: - -| `CacheOp[2]` | `CacheOp[1]` | `CacheOp[0]` | Name | -| :------------------------: | :---------------------: | :----------------------------: | :---: | -| 0 | 0 | 0 | `NOP` | -| 0 | 0 | 1 | | -| 0 | 1 | ? | | -| 1 | 0 | 0 | | -| 1 | 0 | 1 | | -| 1 | 1 | 0 | | -| 1 | 1 | 1 | | -| `I-Cache(0) or D-Cache(1)` | `Lookup(0) or Index(1)` | `WriteBack(0) or WriteOnly(1)` | | - diff --git a/model/DCData_bram.v b/model/DCData_bram.v deleted file mode 100644 index 0c69fff..0000000 --- a/model/DCData_bram.v +++ /dev/null @@ -1,17 +0,0 @@ -module DCData_bram ( - input [ 6:0] addra, - input clka, - input [127:0] dina, - output reg [127:0] douta, - input wea -); - - reg [127:0] ram [0:127]; - always @(posedge clka) begin - if(wea) begin - ram[addra] <= dina; - end - douta <= ~wea ? ram[addra] : {4{$random}}; - end - -endmodule diff --git a/model/DCTag_bram.v b/model/DCTag_bram.v deleted file mode 100644 index d3e148d..0000000 --- a/model/DCTag_bram.v +++ /dev/null @@ -1,17 +0,0 @@ -module DCTag_bram ( - input [ 6:0] addra, - input clka, - input [22:0] dina, - output reg [22:0] douta, - input wea -); - - reg [22:0] ram [0:127]; - always @(posedge clka) begin - if(wea) begin - ram[addra] <= dina; - end - douta <= ~wea ? ram[addra] : {$random}[22:0]; - end - -endmodule diff --git a/model/ICData_bram.v b/model/ICData_bram.v deleted file mode 100644 index bea4730..0000000 --- a/model/ICData_bram.v +++ /dev/null @@ -1,16 +0,0 @@ -module ICData_bram ( - input [ 5:0] addra, - input clka, - input [255:0] dina, - output reg [255:0] douta, - input wea -); - reg [255:0] ram [0:63]; - always @(posedge clka) begin - if(wea) begin - ram[addra] <= dina; - end - douta <= ~wea ? ram[addra] : {8{$random}}; - end - -endmodule diff --git a/model/ICTag_bram.v b/model/ICTag_bram.v deleted file mode 100644 index c9cc324..0000000 --- a/model/ICTag_bram.v +++ /dev/null @@ -1,17 +0,0 @@ -module ICTag_bram ( - input [ 5:0] addra, - input clka, - input [21:0] dina, - output reg [21:0] douta, - input wea -); - - reg [21:0] ram [0:63]; - always @(posedge clka) begin - if(wea) begin - ram[addra] <= dina; - end - douta <= ~wea ? ram[addra] : {$random}[21:0]; - end - -endmodule diff --git a/model/div_signed.v b/model/div_signed.v deleted file mode 100644 index 2e3ec9c..0000000 --- a/model/div_signed.v +++ /dev/null @@ -1,30 +0,0 @@ -module div_signed( - input aclk, - input s_axis_dividend_tvalid, - input [31:0] s_axis_dividend_tdata, - input s_axis_divisor_tvalid, - input [31:0] s_axis_divisor_tdata, - output m_axis_dout_tvalid, - output [63:0] m_axis_dout_tdata -); - - reg valid, nxtValid; - reg [63:0] data, nxtData; - - assign m_axis_dout_tvalid = nxtValid; - assign m_axis_dout_tdata = nxtData; - - always @(posedge aclk) begin - nxtValid <= valid; - nxtData <= data; - if (s_axis_dividend_tvalid & s_axis_divisor_tvalid) begin - valid <= 1'b1; - data <= { - $signed(s_axis_divisor_tdata) % $signed(s_axis_dividend_tdata), - $signed(s_axis_divisor_tdata) / $signed(s_axis_dividend_tdata) - }; - end - end - - -endmodule diff --git a/model/div_unsigned.v b/model/div_unsigned.v deleted file mode 100644 index c434387..0000000 --- a/model/div_unsigned.v +++ /dev/null @@ -1,30 +0,0 @@ -module div_unsigned( - input aclk, - input s_axis_dividend_tvalid, - input [31:0] s_axis_dividend_tdata, - input s_axis_divisor_tvalid, - input [31:0] s_axis_divisor_tdata, - output m_axis_dout_tvalid, - output [63:0] m_axis_dout_tdata -); - - reg valid, nxtValid; - reg [63:0] data, nxtData; - - assign m_axis_dout_tvalid = nxtValid; - assign m_axis_dout_tdata = nxtData; - - always @(posedge aclk) begin - nxtValid <= valid; - nxtData <= data; - if (s_axis_dividend_tvalid & s_axis_divisor_tvalid) begin - valid <= 1'b1; - data <= { - $unsigned(s_axis_divisor_tdata) % $unsigned(s_axis_dividend_tdata), - $unsigned(s_axis_divisor_tdata) / $unsigned(s_axis_dividend_tdata) - }; - end - end - - -endmodule diff --git a/model/mul_signed.sv b/model/mul_signed.sv deleted file mode 100644 index 388871a..0000000 --- a/model/mul_signed.sv +++ /dev/null @@ -1,22 +0,0 @@ -`include "defines.svh" - -module mul_signed( - input logic CLK, - input word_t A, - input word_t B, - output logic [63:0] P -); - - word_t A1, A2, A3, A4, A5, A6; - word_t B1, B2, B3, B4, B5, B6; - - ffen #(64) ff_1 (CLK, { A, B}, 1'b1, {A1, B1}); - ffen #(64) ff_2 (CLK, {A1, B1}, 1'b1, {A2, B2}); - ffen #(64) ff_3 (CLK, {A2, B2}, 1'b1, {A3, B3}); - ffen #(64) ff_4 (CLK, {A3, B3}, 1'b1, {A4, B4}); - ffen #(64) ff_5 (CLK, {A4, B4}, 1'b1, {A5, B5}); - ffen #(64) ff_6 (CLK, {A5, B5}, 1'b1, {A6, B6}); - - assign P = $signed(A) * $signed(B); - -endmodule diff --git a/model/mul_unsigned.sv b/model/mul_unsigned.sv deleted file mode 100644 index 5a062ef..0000000 --- a/model/mul_unsigned.sv +++ /dev/null @@ -1,22 +0,0 @@ -`include "defines.svh" - -module mul_unsigned( - input logic CLK, - input word_t A, - input word_t B, - output logic [63:0] P -); - - word_t A1, A2, A3, A4, A5, A6; - word_t B1, B2, B3, B4, B5, B6; - - ffen #(64) ff_1 (CLK, { A, B}, 1'b1, {A1, B1}); - ffen #(64) ff_2 (CLK, {A1, B1}, 1'b1, {A2, B2}); - ffen #(64) ff_3 (CLK, {A2, B2}, 1'b1, {A3, B3}); - ffen #(64) ff_4 (CLK, {A3, B3}, 1'b1, {A4, B4}); - ffen #(64) ff_5 (CLK, {A4, B4}, 1'b1, {A5, B5}); - ffen #(64) ff_6 (CLK, {A5, B5}, 1'b1, {A6, B6}); - - assign P = $unsigned(A) * $unsigned(B); - -endmodule diff --git a/resources/soc/rtl/AMBA/axi2apb.v b/resources/soc/rtl/AMBA/axi2apb.v deleted file mode 100644 index 79c32a6..0000000 --- a/resources/soc/rtl/AMBA/axi2apb.v +++ /dev/null @@ -1,542 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -`include "config.h" - -module axi2apb_bridge( -clk, -rst_n, -axi_s_awid, -axi_s_awaddr, -axi_s_awlen, -axi_s_awsize, -axi_s_awburst, -axi_s_awlock, -axi_s_awcache, -axi_s_awprot, -axi_s_awvalid, -axi_s_awready, -axi_s_wid, -axi_s_wdata, -axi_s_wstrb, -axi_s_wlast, -axi_s_wvalid, -axi_s_wready, -axi_s_bid, -axi_s_bresp, -axi_s_bvalid, -axi_s_bready, -axi_s_arid, -axi_s_araddr, -axi_s_arlen, -axi_s_arsize, -axi_s_arburst, -axi_s_arlock, -axi_s_arcache, -axi_s_arprot, -axi_s_arvalid, -axi_s_arready, -axi_s_rid, -axi_s_rdata, -axi_s_rresp, -axi_s_rlast, -axi_s_rvalid, -axi_s_rready, - -apb_valid_cpu, -cpu_grant, -apb_word_trans, -apb_high_24b_rd, -apb_high_24b_wr, -apb_clk, -apb_reset_n, -reg_psel, -reg_enable, -reg_rw, -reg_addr, -reg_datai, -reg_ready_1, -reg_datao -); -parameter L_ADDR_APB = 20; - -input clk; -input rst_n; - -input [`LID -1 :0] axi_s_awid; -input [`Lawaddr -1 :0] axi_s_awaddr; -input [`Lawlen -1 :0] axi_s_awlen; -input [`Lawsize -1 :0] axi_s_awsize; -input [`Lawburst -1 :0] axi_s_awburst; -input [`Lawlock -1 :0] axi_s_awlock; -input [`Lawcache -1 :0] axi_s_awcache; -input [`Lawprot -1 :0] axi_s_awprot; -input axi_s_awvalid; -output axi_s_awready; -input [`LID -1 :0] axi_s_wid; -input [`Lwdata -1 :0] axi_s_wdata; -input [`Lwstrb -1 :0] axi_s_wstrb; -input axi_s_wlast; -input axi_s_wvalid; -output axi_s_wready; -output [`LID -1 :0] axi_s_bid; -output [`Lbresp -1 :0] axi_s_bresp; -output axi_s_bvalid; -input axi_s_bready; -input [`LID -1 :0] axi_s_arid; -input [`Laraddr -1 :0] axi_s_araddr; -input [`Larlen -1 :0] axi_s_arlen; -input [`Larsize -1 :0] axi_s_arsize; -input [`Larburst -1 :0] axi_s_arburst; -input [`Larlock -1 :0] axi_s_arlock; -input [`Larcache -1 :0] axi_s_arcache; -input [`Larprot -1 :0] axi_s_arprot; -input axi_s_arvalid; -output axi_s_arready; -output [`LID -1 :0] axi_s_rid; -output [`Lrdata -1 :0] axi_s_rdata; -output [`Lrresp -1 :0] axi_s_rresp; -output axi_s_rlast; -output axi_s_rvalid; -input axi_s_rready; -input apb_word_trans; -input cpu_grant; -output apb_valid_cpu; -input [23:0] apb_high_24b_rd; -output [23:0] apb_high_24b_wr; -output apb_clk; -output apb_reset_n; -output reg_psel; -output reg_enable; -output reg_rw; -output[L_ADDR_APB-1:0] reg_addr; -output[7:0] reg_datai; -input [7:0] reg_datao; -input reg_ready_1; - -wire csr_rw_send_axi_rsp_done; -wire reg_ready; - -parameter CSR_RW_SM_IDLE = 4'b0001, - CSR_RW_SM_GET_AXI_ADDR = 4'b0010, - CSR_RW_SM_SEND_AXI_RSP = 4'b1000; - -reg reg_psel; -reg reg_enable; -reg axi_s_sel_rd; -reg axi_s_sel_wr; -reg[3:0] csr_rw_sm; -reg[3:0] csr_rw_sm_nxt; -reg[L_ADDR_APB-1:0] axi_s_req_addr; -reg[`LID-1:0] axi_s_w_id; -reg[`LID-1:0] axi_s_r_id; -reg[23:0] apb_high_24b_wr; - -assign apb_clk = clk; -assign apb_reset_n = rst_n; -assign reg_rw = axi_s_sel_wr; -assign reg_addr = axi_s_req_addr; -assign reg_ready = reg_enable & reg_ready_1; -assign apb_valid_cpu = axi_s_sel_wr | axi_s_sel_rd | axi_s_awvalid | axi_s_arvalid; -reg axi_s_rlast; -reg axi_s_rvalid; -reg axi_s_wready; -reg axi_s_awready; -reg axi_s_arready; - -reg [1:0]axi_s_rstrb; -reg [3:0]apb_s_wstrb; -reg [31:0]reg_datai_32; -reg [31:0]reg_datao_32; -reg [2:0] rd_count; -reg [2:0] apb_rd_size; -reg [2:0] apb_wr_size; -reg [7:0] reg_datai; -reg axi_s_bvalid; - -always@(posedge clk) -begin - if(!rst_n) - begin - reg_datai_32 <= 32'h0; - reg_datao_32 <= 32'h0; - axi_s_req_addr <= 20'h0; - apb_s_wstrb <= 4'b0; - axi_s_rstrb <= 2'b0; - axi_s_wready <= 1'b0; - reg_enable <= 1'b0; - reg_psel <= 1'b0; - rd_count <= 3'b0; - apb_rd_size <= 3'b0; - apb_wr_size <= 3'b0; - axi_s_rlast <= 1'b0; - axi_s_rvalid <= 1'b0; - reg_datai <= 8'b0; - axi_s_awready <= 1'b0; - axi_s_arready <= 1'b0; - axi_s_bvalid <= 1'b0; - axi_s_sel_wr <= 1'b0; - axi_s_sel_rd <= 1'b0; - axi_s_w_id <= 'h0; - axi_s_r_id <= 'h0; - apb_high_24b_wr <= 24'h0; - end - else begin - if(axi_s_awvalid & ~axi_s_bvalid & ~axi_s_sel_rd & (csr_rw_sm == CSR_RW_SM_IDLE) &cpu_grant) begin - axi_s_req_addr <= axi_s_awaddr[L_ADDR_APB-1:0]; - axi_s_awready <= 1'b1; - axi_s_sel_wr <= 1'b1; - apb_wr_size <= axi_s_awsize; - end - else if(axi_s_sel_wr) begin - axi_s_awready <= 1'b0; - if(axi_s_wvalid && ~axi_s_wready) begin - axi_s_req_addr <= (axi_s_wstrb[3:0]==4'h2)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 2'h1): - (axi_s_wstrb[3:0]==4'h4)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 2'h2): - (axi_s_wstrb[3:0]==4'h8)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 2'h3): - (axi_s_wstrb[3:0]==4'h6)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 2'h1): - (axi_s_wstrb[3:0]==4'hc)&&(axi_s_req_addr[1:0]==2'h0)? (axi_s_req_addr + 2'h2): axi_s_req_addr ; - axi_s_wready <= 1'b1; - reg_psel <= 1'b0; - reg_enable <= 1'b0; - axi_s_w_id <= axi_s_wid; - case({axi_s_req_addr[1:0]}) - 2'b00: begin apb_s_wstrb <= axi_s_wstrb[3:0]; reg_datai_32 <=axi_s_wdata[31:0]; end - 2'b01: begin apb_s_wstrb <= {1'b0,axi_s_wstrb[3:1]}; reg_datai_32 <={8'h0,axi_s_wdata[31:8]}; end - 2'b10: begin apb_s_wstrb <= {2'b0,axi_s_wstrb[3:2]}; reg_datai_32 <={16'b0,axi_s_wdata[31:16]}; end - 2'b11: begin apb_s_wstrb <= {3'b0,axi_s_wstrb[3]}; reg_datai_32 <={24'b0,axi_s_wdata[31:24]}; end - default: begin apb_s_wstrb <= 4'b0; reg_datai_32 <=32'h0; end - endcase - end - else if((~reg_psel) && (apb_s_wstrb!=4'h0) ) begin - reg_psel <= 1'b1; - reg_enable <= 1'b0; - reg_datai <= (apb_s_wstrb == 4'h1) ? reg_datai_32[7:0]: - (apb_s_wstrb == 4'h2) ? reg_datai_32[15:8]: - (apb_s_wstrb == 4'h6) ? reg_datai_32[15:8]: - (apb_s_wstrb == 4'h4) ? reg_datai_32[23:16]: - (apb_s_wstrb == 4'h8) ? reg_datai_32[31:24]: reg_datai_32[7:0]; - apb_high_24b_wr <= reg_datai_32[31:8]; - if(axi_s_bready) axi_s_bvalid <= 1'b0; - end - else if(apb_word_trans & apb_s_wstrb==4'hf ) begin - if(~reg_ready)begin - reg_psel <= 1'b1; - reg_enable <= 1'b1; - end - else begin - reg_psel <= 1'b0; - reg_enable <= 1'b0; - axi_s_sel_wr <= 1'b0; - axi_s_bvalid <= 1'b1; - apb_s_wstrb <= 4'b0; - end - reg_datai <= reg_datai_32[7:0]; - apb_high_24b_wr <= reg_datai_32[31:8]; - axi_s_wready <= 1'b0; - end - else if(apb_s_wstrb[0]) begin - if(~reg_ready)begin - reg_psel <= 1'b1; - reg_enable <= 1'b1; - reg_datai <= reg_datai_32[7:0]; - end - else begin - if(apb_s_wstrb[3:1] ==3'b0) - begin - reg_psel <= 1'b0; - axi_s_sel_wr<= 1'b0; - axi_s_bvalid <= 1'b1; - end - else - reg_psel <= 1'b1; - reg_enable <= 1'b0; - apb_s_wstrb[0] <= 1'b0; - axi_s_req_addr <= axi_s_req_addr +1'b1; - reg_datai <= reg_datai_32[15:8]; - end - axi_s_wready <= 1'b0; - end - else if (apb_s_wstrb[1]) begin - if(~reg_ready)begin - reg_psel <= 1'b1; - reg_enable <= 1'b1; - end - else begin - if(apb_s_wstrb[3:2] ==2'b0) - begin - reg_psel <= 1'b0; - axi_s_sel_wr <= 1'b0; - axi_s_bvalid <= 1'b1; - end - else - reg_psel <= 1'b1; - reg_enable <= 1'b0; - apb_s_wstrb[1] <= 1'b0; - axi_s_req_addr <= axi_s_req_addr +1'b1; - reg_datai <= reg_datai_32[23:16]; - end - axi_s_wready <= 1'b0; - end - else if (apb_s_wstrb[2]) begin - if(~reg_ready)begin - reg_psel <= 1'b1; - reg_enable <= 1'b1; - end - else begin - if(apb_s_wstrb[3] ==1'b0) - begin - reg_psel <= 1'b0; - axi_s_sel_wr <= 1'b0; - axi_s_bvalid <= 1'b1; - end - else - reg_psel <= 1'b1; - reg_enable <= 1'b0; - apb_s_wstrb[2] <= 1'b0; - axi_s_req_addr <= axi_s_req_addr +1'b1; - reg_datai <= reg_datai_32[31:24]; - end - axi_s_wready <= 1'b0; - end - else if (apb_s_wstrb[3]) begin - if(~reg_ready)begin - reg_psel <= 1'b1; - reg_enable <= 1'b1; - end - else begin - reg_psel <= 1'b0; - reg_enable <= 1'b0; - axi_s_sel_wr <= 1'b0; - axi_s_bvalid <= 1'b1; - apb_s_wstrb[3] <= 1'b0; - end - axi_s_wready <= 1'b0; - end - else begin - reg_psel <= 1'b0; - reg_enable <= 1'b0; - reg_datai <= 8'h0; - apb_s_wstrb <= 4'h0; - axi_s_wready <= 1'b0; - if(csr_rw_sm == CSR_RW_SM_IDLE) axi_s_sel_wr <= 1'b0; - end - end - else if(axi_s_arvalid & ~axi_s_arready & ~axi_s_bvalid & (csr_rw_sm == CSR_RW_SM_IDLE)&cpu_grant) - begin - reg_enable <= 1'b0; - reg_psel <= 1'b1; - axi_s_arready <= 1'b1; - axi_s_sel_rd <= 1'b1; - axi_s_r_id <= axi_s_arid; - apb_rd_size <= axi_s_arsize; - axi_s_req_addr <= axi_s_araddr[L_ADDR_APB-1:0]; - axi_s_rstrb <= axi_s_araddr[1:0]; - if(axi_s_arsize==3'b010) - rd_count<= 3'h4; - else if(axi_s_arsize==3'b01) - rd_count<= 3'h2; - else if(axi_s_arsize==3'b0) - rd_count<= 3'h1; - end - else if(axi_s_sel_rd) - begin - axi_s_arready <= 1'b0; - if(apb_word_trans) - begin - if(reg_ready) - begin - reg_psel <= rd_count==3'b10; - reg_enable <= 1'b0; - rd_count <= rd_count-3'b1; - axi_s_rlast <= apb_rd_size==3'h2|rd_count==2'b1; - axi_s_rvalid <= apb_rd_size==3'h2|rd_count==2'b1; - axi_s_sel_rd <= rd_count==3'b10; - reg_datao_32 <= {apb_high_24b_rd,reg_datao}; - end - else begin - reg_psel <= 1'b1; - reg_enable <= 1'b1; - end - end - else if(rd_count==3'h4) - begin - if(reg_ready) - begin - reg_psel <= 1'b1; - reg_enable <= 1'b0; - rd_count <= rd_count-3'h1; - reg_datao_32[7:0] <= reg_datao; - axi_s_req_addr <= axi_s_req_addr +1'b1; - end - else begin - reg_psel <= 1'b1; - reg_enable <= 1'b1; - end - end - else if(rd_count==3'h3) - begin - if(reg_ready) - begin - reg_psel <= 1'b1; - reg_enable <= 1'b0; - rd_count <= rd_count-3'h1; - reg_datao_32[15:8] <= reg_datao; - axi_s_req_addr <= axi_s_req_addr +1'b1; - end - else begin - reg_psel <= 1'b1; - reg_enable <= 1'b1; - end - end - else if(rd_count==3'h2) - begin - if(reg_ready) - begin - reg_psel <= 1'b1; - reg_enable <= 1'b0; - rd_count <= rd_count-3'h1; - axi_s_req_addr <= axi_s_req_addr +1'b1; - if(apb_rd_size==3'h2 ) - reg_datao_32[23:16] <= reg_datao; - else if(apb_rd_size==3'h1) - reg_datao_32[7:0] <= reg_datao; - end - else begin - reg_psel <= 1'b1; - reg_enable <= 1'b1; - end - end - else if(rd_count==3'h1) - begin - if(reg_ready) - begin - reg_psel <= 1'b0; - reg_enable <= 1'b0; - axi_s_rlast <= 1'b1; - axi_s_rvalid <= 1'b1; - axi_s_sel_rd <= 1'b0; - if(apb_rd_size==3'h2 ) - reg_datao_32[31:24] <= reg_datao; - else if(apb_rd_size==3'h1) - reg_datao_32[15:8] <= reg_datao; - else if(apb_rd_size==3'h0) - reg_datao_32[7:0] <= reg_datao; - end - else begin - reg_psel <= 1'b1; - reg_enable <= 1'b1; - end - end// end if(rd_count) - else begin - axi_s_arready <= 1'b0; - axi_s_rlast <= 1'b1; - axi_s_rvalid <= 1'b1; - reg_psel <= 1'b0; - reg_enable <= 1'b0; - if(axi_s_rvalid && axi_s_rready) - begin - reg_datao_32 <= 32'h0; - axi_s_rlast <= 1'b0; - axi_s_rvalid <= 1'b0; - end - if(csr_rw_sm == CSR_RW_SM_IDLE) axi_s_sel_rd <= 1'b0; - if(axi_s_bready) axi_s_bvalid <= 1'b0; - end - end//end if(axi_s_sel_rd) - else begin - reg_psel <= 1'b0; - reg_enable <= 1'b0; - axi_s_sel_wr <= 1'b0; - axi_s_sel_rd <= 1'b0; - axi_s_wready <= 1'b0; - axi_s_arready <= 1'b0; - axi_s_req_addr <= 32'h0; - reg_datai_32 <= 32'h0; - if(axi_s_bready) axi_s_bvalid <= 1'b0; - if(axi_s_rvalid && axi_s_rready) - begin - reg_datao_32 <= 32'h0; - axi_s_rlast <= 1'b0; - axi_s_rvalid <= 1'b0; - end - end - end//end if(rst_n) -end//end always - -assign csr_rw_send_axi_rsp_done = csr_rw_sm == CSR_RW_SM_SEND_AXI_RSP && axi_s_rlast && axi_s_rready || axi_s_bvalid && axi_s_bready; - -assign axi_s_bid = axi_s_w_id; -assign axi_s_rid = axi_s_r_id; -assign axi_s_bresp = 2'b00; -assign axi_s_rresp = 2'b00; - -assign axi_s_rdata= ( axi_s_rstrb == 2'h0) ? { reg_datao_32 } : - ( axi_s_rstrb == 2'h1) ? {reg_datao_32[23:0], 8'h0} : - ( axi_s_rstrb == 2'h2) ? {reg_datao_32[15:0],16'h0} : - ( axi_s_rstrb == 2'h3) ? {reg_datao_32[7:0], 24'h0} : 32'h0; - -always@(csr_rw_sm or axi_s_awvalid or axi_s_arvalid or axi_s_sel_rd or axi_s_sel_wr or - axi_s_wready or csr_rw_send_axi_rsp_done or cpu_grant) begin - case(csr_rw_sm) - CSR_RW_SM_IDLE: - if((axi_s_awvalid || axi_s_arvalid)&&~(axi_s_sel_wr||axi_s_sel_rd)&cpu_grant) - csr_rw_sm_nxt = CSR_RW_SM_GET_AXI_ADDR; - else - csr_rw_sm_nxt = CSR_RW_SM_IDLE; - CSR_RW_SM_GET_AXI_ADDR: - if(axi_s_sel_wr) - csr_rw_sm_nxt = CSR_RW_SM_SEND_AXI_RSP; - else if(axi_s_sel_rd) - csr_rw_sm_nxt = CSR_RW_SM_SEND_AXI_RSP; - else - csr_rw_sm_nxt = CSR_RW_SM_GET_AXI_ADDR; - CSR_RW_SM_SEND_AXI_RSP: - if(csr_rw_send_axi_rsp_done) - csr_rw_sm_nxt = CSR_RW_SM_IDLE; - else - csr_rw_sm_nxt = CSR_RW_SM_SEND_AXI_RSP; - default: - csr_rw_sm_nxt = CSR_RW_SM_IDLE; - endcase -end - -always@(posedge clk) begin - if(!rst_n) - csr_rw_sm <= CSR_RW_SM_IDLE; - else - csr_rw_sm <= csr_rw_sm_nxt; -end - -endmodule - diff --git a/resources/soc/rtl/AMBA/axi_mux.v b/resources/soc/rtl/AMBA/axi_mux.v deleted file mode 100644 index 6e965f4..0000000 --- a/resources/soc/rtl/AMBA/axi_mux.v +++ /dev/null @@ -1,1102 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -`define SLV_MUX_5 -`define SLV_MUX_NUM 5 -`include "config.h" -module axi_slave_mux( -spi_boot, -axi_s_aclk, -axi_s_awid, -axi_s_awaddr, -axi_s_awlen, -axi_s_awsize, -axi_s_awburst, -axi_s_awlock, -axi_s_awcache, -axi_s_awprot, -axi_s_awvalid, -axi_s_awready, -axi_s_wready, -axi_s_wid, -axi_s_wdata, -axi_s_wstrb, -axi_s_wlast, -axi_s_wvalid, -axi_s_bid, -axi_s_bresp, -axi_s_bvalid, -axi_s_bready, -axi_s_arid, -axi_s_araddr, -axi_s_arlen, -axi_s_arsize, -axi_s_arburst, -axi_s_arlock, -axi_s_arcache, -axi_s_arprot, -axi_s_arvalid, -axi_s_arready, -axi_s_rready, -axi_s_rid, -axi_s_rdata, -axi_s_rresp, -axi_s_rlast, -axi_s_rvalid, - -s0_awid, -s0_awaddr, -s0_awlen, -s0_awsize, -s0_awburst, -s0_awlock, -s0_awcache, -s0_awprot, -s0_awvalid, -s0_awready, -s0_wid, -s0_wdata, -s0_wstrb, -s0_wlast, -s0_wvalid, -s0_wready, -s0_bid, -s0_bresp, -s0_bvalid, -s0_bready, -s0_arid, -s0_araddr, -s0_arlen, -s0_arsize, -s0_arburst, -s0_arlock, -s0_arcache, -s0_arprot, -s0_arvalid, -s0_arready, -s0_rid, -s0_rdata, -s0_rresp, -s0_rlast, -s0_rvalid, -s0_rready, - -s1_awid, -s1_awaddr, -s1_awlen, -s1_awsize, -s1_awburst, -s1_awlock, -s1_awcache, -s1_awprot, -s1_awvalid, -s1_awready, -s1_wid, -s1_wdata, -s1_wstrb, -s1_wlast, -s1_wvalid, -s1_wready, -s1_bid, -s1_bresp, -s1_bvalid, -s1_bready, -s1_arid, -s1_araddr, -s1_arlen, -s1_arsize, -s1_arburst, -s1_arlock, -s1_arcache, -s1_arprot, -s1_arvalid, -s1_arready, -s1_rid, -s1_rdata, -s1_rresp, -s1_rlast, -s1_rvalid, -s1_rready, - -s2_awid, -s2_awaddr, -s2_awlen, -s2_awsize, -s2_awburst, -s2_awlock, -s2_awcache, -s2_awprot, -s2_awvalid, -s2_awready, -s2_wid, -s2_wdata, -s2_wstrb, -s2_wlast, -s2_wvalid, -s2_wready, -s2_bid, -s2_bresp, -s2_bvalid, -s2_bready, -s2_arid, -s2_araddr, -s2_arlen, -s2_arsize, -s2_arburst, -s2_arlock, -s2_arcache, -s2_arprot, -s2_arvalid, -s2_arready, -s2_rid, -s2_rdata, -s2_rresp, -s2_rlast, -s2_rvalid, -s2_rready, -s3_awid, -s3_awaddr, -s3_awlen, -s3_awsize, -s3_awburst, -s3_awlock, -s3_awcache, -s3_awprot, -s3_awvalid, -s3_awready, -s3_wid, -s3_wdata, -s3_wstrb, -s3_wlast, -s3_wvalid, -s3_wready, -s3_bid, -s3_bresp, -s3_bvalid, -s3_bready, -s3_arid, -s3_araddr, -s3_arlen, -s3_arsize, -s3_arburst, -s3_arlock, -s3_arcache, -s3_arprot, -s3_arvalid, -s3_arready, -s3_rid, -s3_rdata, -s3_rresp, -s3_rlast, -s3_rvalid, -s3_rready, -s4_awid, -s4_awaddr, -s4_awlen, -s4_awsize, -s4_awburst, -s4_awlock, -s4_awcache, -s4_awprot, -s4_awvalid, -s4_awready, -s4_wid, -s4_wdata, -s4_wstrb, -s4_wlast, -s4_wvalid, -s4_wready, -s4_bid, -s4_bresp, -s4_bvalid, -s4_bready, -s4_arid, -s4_araddr, -s4_arlen, -s4_arsize, -s4_arburst, -s4_arlock, -s4_arcache, -s4_arprot, -s4_arvalid, -s4_arready, -s4_rid, -s4_rdata, -s4_rresp, -s4_rlast, -s4_rvalid, -s4_rready, - -axi_s_aresetn -); - -input spi_boot; -input axi_s_aclk; -input axi_s_aresetn; - -input [`LID -1 :0] axi_s_awid; -input [`Lawaddr -1 :0] axi_s_awaddr; -input [`Lawlen -1 :0] axi_s_awlen; -input [`Lawsize -1 :0] axi_s_awsize; -input [`Lawburst -1 :0] axi_s_awburst; -input [`Lawlock -1 :0] axi_s_awlock; -input [`Lawcache -1 :0] axi_s_awcache; -input [`Lawprot -1 :0] axi_s_awprot; -input axi_s_awvalid; -output axi_s_awready; -input [`LID -1 :0] axi_s_wid; -input [`Lwdata -1 :0] axi_s_wdata; -input [`Lwstrb -1 :0] axi_s_wstrb; -input axi_s_wlast; -input axi_s_wvalid; -output axi_s_wready; -output [`LID -1 :0] axi_s_bid; -output [`Lbresp -1 :0] axi_s_bresp; -output axi_s_bvalid; -input axi_s_bready; -input [`LID -1 :0] axi_s_arid; -input [`Laraddr -1 :0] axi_s_araddr; -input [`Larlen -1 :0] axi_s_arlen; -input [`Larsize -1 :0] axi_s_arsize; -input [`Larburst -1 :0] axi_s_arburst; -input [`Larlock -1 :0] axi_s_arlock; -input [`Larcache -1 :0] axi_s_arcache; -input [`Larprot -1 :0] axi_s_arprot; -input axi_s_arvalid; -output axi_s_arready; -output [`LID -1 :0] axi_s_rid; -output [`Lrdata -1 :0] axi_s_rdata; -output [`Lrresp -1 :0] axi_s_rresp; -output axi_s_rlast; -output axi_s_rvalid; -input axi_s_rready; - - - - -output [`LID -1 :0] s0_awid; -output [`Lawaddr -1 :0] s0_awaddr; -output [`Lawlen -1 :0] s0_awlen; -output [`Lawsize -1 :0] s0_awsize; -output [`Lawburst -1 :0] s0_awburst; -output [`Lawlock -1 :0] s0_awlock; -output [`Lawcache -1 :0] s0_awcache; -output [`Lawprot -1 :0] s0_awprot; -output s0_awvalid; -input s0_awready; -output [`LID -1 :0] s0_wid; -output [`Lwdata -1 :0] s0_wdata; -output [`Lwstrb -1 :0] s0_wstrb; -output s0_wlast; -output s0_wvalid; -input s0_wready; -input [`LID -1 :0] s0_bid; -input [`Lbresp -1 :0] s0_bresp; -input s0_bvalid; -output s0_bready; -output [`LID -1 :0] s0_arid; -output [`Laraddr -1 :0] s0_araddr; -output [`Larlen -1 :0] s0_arlen; -output [`Larsize -1 :0] s0_arsize; -output [`Larburst -1 :0] s0_arburst; -output [`Larlock -1 :0] s0_arlock; -output [`Larcache -1 :0] s0_arcache; -output [`Larprot -1 :0] s0_arprot; -output s0_arvalid; -input s0_arready; -input [`LID -1 :0] s0_rid; -input [`Lrdata -1 :0] s0_rdata; -input [`Lrresp -1 :0] s0_rresp; -input s0_rlast; -input s0_rvalid; -output s0_rready; - -output [`LID -1 :0] s1_awid; -output [`Lawaddr -1 :0] s1_awaddr; -output [`Lawlen -1 :0] s1_awlen; -output [`Lawsize -1 :0] s1_awsize; -output [`Lawburst -1 :0] s1_awburst; -output [`Lawlock -1 :0] s1_awlock; -output [`Lawcache -1 :0] s1_awcache; -output [`Lawprot -1 :0] s1_awprot; -output s1_awvalid; -input s1_awready; -output [`LID -1 :0] s1_wid; -output [`Lwdata -1 :0] s1_wdata; -output [`Lwstrb -1 :0] s1_wstrb; -output s1_wlast; -output s1_wvalid; -input s1_wready; -input [`LID -1 :0] s1_bid; -input [`Lbresp -1 :0] s1_bresp; -input s1_bvalid; -output s1_bready; -output [`LID -1 :0] s1_arid; -output [`Laraddr -1 :0] s1_araddr; -output [`Larlen -1 :0] s1_arlen; -output [`Larsize -1 :0] s1_arsize; -output [`Larburst -1 :0] s1_arburst; -output [`Larlock -1 :0] s1_arlock; -output [`Larcache -1 :0] s1_arcache; -output [`Larprot -1 :0] s1_arprot; -output s1_arvalid; -input s1_arready; -input [`LID -1 :0] s1_rid; -input [`Lrdata -1 :0] s1_rdata; -input [`Lrresp -1 :0] s1_rresp; -input s1_rlast; -input s1_rvalid; -output s1_rready; - - -output [`LID -1 :0] s2_awid; -output [`Lawaddr -1 :0] s2_awaddr; -output [`Lawlen -1 :0] s2_awlen; -output [`Lawsize -1 :0] s2_awsize; -output [`Lawburst -1 :0] s2_awburst; -output [`Lawlock -1 :0] s2_awlock; -output [`Lawcache -1 :0] s2_awcache; -output [`Lawprot -1 :0] s2_awprot; -output s2_awvalid; -input s2_awready; -output [`LID -1 :0] s2_wid; -output [`Lwdata -1 :0] s2_wdata; -output [`Lwstrb -1 :0] s2_wstrb; -output s2_wlast; -output s2_wvalid; -input s2_wready; -input [`LID -1 :0] s2_bid; -input [`Lbresp -1 :0] s2_bresp; -input s2_bvalid; -output s2_bready; -output [`LID -1 :0] s2_arid; -output [`Laraddr -1 :0] s2_araddr; -output [`Larlen -1 :0] s2_arlen; -output [`Larsize -1 :0] s2_arsize; -output [`Larburst -1 :0] s2_arburst; -output [`Larlock -1 :0] s2_arlock; -output [`Larcache -1 :0] s2_arcache; -output [`Larprot -1 :0] s2_arprot; -output s2_arvalid; -input s2_arready; -input [`LID -1 :0] s2_rid; -input [`Lrdata -1 :0] s2_rdata; -input [`Lrresp -1 :0] s2_rresp; -input s2_rlast; -input s2_rvalid; -output s2_rready; - -output [`LID -1 :0] s3_awid; -output [`Lawaddr -1 :0] s3_awaddr; -output [`Lawlen -1 :0] s3_awlen; -output [`Lawsize -1 :0] s3_awsize; -output [`Lawburst -1 :0] s3_awburst; -output [`Lawlock -1 :0] s3_awlock; -output [`Lawcache -1 :0] s3_awcache; -output [`Lawprot -1 :0] s3_awprot; -output s3_awvalid; -input s3_awready; -output [`LID -1 :0] s3_wid; -output [`Lwdata -1 :0] s3_wdata; -output [`Lwstrb -1 :0] s3_wstrb; -output s3_wlast; -output s3_wvalid; -input s3_wready; -input [`LID -1 :0] s3_bid; -input [`Lbresp -1 :0] s3_bresp; -input s3_bvalid; -output s3_bready; -output [`LID -1 :0] s3_arid; -output [`Laraddr -1 :0] s3_araddr; -output [`Larlen -1 :0] s3_arlen; -output [`Larsize -1 :0] s3_arsize; -output [`Larburst -1 :0] s3_arburst; -output [`Larlock -1 :0] s3_arlock; -output [`Larcache -1 :0] s3_arcache; -output [`Larprot -1 :0] s3_arprot; -output s3_arvalid; -input s3_arready; -input [`LID -1 :0] s3_rid; -input [`Lrdata -1 :0] s3_rdata; -input [`Lrresp -1 :0] s3_rresp; -input s3_rlast; -input s3_rvalid; -output s3_rready; - - -output [`LID -1 :0] s4_awid; -output [`Lawaddr -1 :0] s4_awaddr; -output [`Lawlen -1 :0] s4_awlen; -output [`Lawsize -1 :0] s4_awsize; -output [`Lawburst -1 :0] s4_awburst; -output [`Lawlock -1 :0] s4_awlock; -output [`Lawcache -1 :0] s4_awcache; -output [`Lawprot -1 :0] s4_awprot; -output s4_awvalid; -input s4_awready; -output [`LID -1 :0] s4_wid; -output [`Lwdata -1 :0] s4_wdata; -output [`Lwstrb -1 :0] s4_wstrb; -output s4_wlast; -output s4_wvalid; -input s4_wready; -input [`LID -1 :0] s4_bid; -input [`Lbresp -1 :0] s4_bresp; -input s4_bvalid; -output s4_bready; -output [`LID -1 :0] s4_arid; -output [`Laraddr -1 :0] s4_araddr; -output [`Larlen -1 :0] s4_arlen; -output [`Larsize -1 :0] s4_arsize; -output [`Larburst -1 :0] s4_arburst; -output [`Larlock -1 :0] s4_arlock; -output [`Larcache -1 :0] s4_arcache; -output [`Larprot -1 :0] s4_arprot; -output s4_arvalid; -input s4_arready; -input [`LID -1 :0] s4_rid; -input [`Lrdata -1 :0] s4_rdata; -input [`Lrresp -1 :0] s4_rresp; -input s4_rlast; -input s4_rvalid; -output s4_rready; - -wire clk; -wire rst_n; - - -reg [`LID -1:0] axi_s_rid; -reg [`Lrdata-1:0]axi_s_rdata; -reg [1:0]axi_s_rresp; -reg axi_s_rlast; -reg axi_s_rvalid; -reg axi_s_arready; - -reg [`SLV_MUX_NUM-1:0]wr_data_s_hit; - -wire [`SLV_MUX_NUM-1:0]rd_addr_hit; -wire [`SLV_MUX_NUM-1:0]wr_addr_hit; -reg [`SLV_MUX_NUM-1:0]wr_resp_s_hit ; - -wire [`SLV_MUX_NUM-1:0]s_awready ; -wire [`SLV_MUX_NUM-1:0]s_wready ; -wire [`SLV_MUX_NUM-1:0]s_bvalid ; -wire [`SLV_MUX_NUM-1:0]s_arready ; -wire [`SLV_MUX_NUM-1:0]s_rlast ; -wire [`SLV_MUX_NUM-1:0]s_rvalid ; - -wire [`LID -1:0] s_bid [`SLV_MUX_NUM-1:0]; -wire [1:0] s_bresp [`SLV_MUX_NUM-1:0]; -wire [`LID -1:0] s_rid [`SLV_MUX_NUM-1:0]; -wire [`Lrdata-1:0] s_rdata [`SLV_MUX_NUM-1:0]; -wire [1:0] s_rresp [`SLV_MUX_NUM-1:0]; - -wire s0_awvalid ; -wire s0_wvalid ; -wire s0_bready ; -wire s0_arvalid ; -wire s0_rready ; - - -assign s0_awid = axi_s_awid; -assign s0_awaddr = axi_s_awaddr; -assign s0_awlen = axi_s_awlen; -assign s0_awsize = axi_s_awsize; -assign s0_awburst = axi_s_awburst; -assign s0_awlock = axi_s_awlock; -assign s0_awcache = axi_s_awcache; -assign s0_awprot = axi_s_awprot; -assign s0_wid = axi_s_wid; -assign s0_wdata = axi_s_wdata; -assign s0_wstrb = axi_s_wstrb; -assign s0_wlast = axi_s_wlast; -assign s0_arid = axi_s_arid; -assign s0_araddr = axi_s_araddr; -assign s0_arlen = axi_s_arlen; -assign s0_arsize = axi_s_arsize; -assign s0_arburst = axi_s_arburst; -assign s0_arlock = axi_s_arlock; -assign s0_arcache = axi_s_arcache; -assign s0_arprot = axi_s_arprot; - -wire s1_awvalid ; -wire s1_wvalid ; -wire s1_bready ; -wire s1_arvalid ; -wire s1_rready ; - -assign s1_awid = axi_s_awid; -assign s1_awaddr = axi_s_awaddr; -assign s1_awlen = axi_s_awlen; -assign s1_awsize = axi_s_awsize; -assign s1_awburst = axi_s_awburst; -assign s1_awlock = axi_s_awlock; -assign s1_awcache = axi_s_awcache; -assign s1_awprot = axi_s_awprot; -assign s1_wid = axi_s_wid; -assign s1_wdata = axi_s_wdata; -assign s1_wstrb = axi_s_wstrb; -assign s1_wlast = axi_s_wlast; -assign s1_arid = axi_s_arid; -assign s1_araddr = axi_s_araddr; -assign s1_arlen = axi_s_arlen; -assign s1_arsize = axi_s_arsize; -assign s1_arburst = axi_s_arburst; -assign s1_arlock = axi_s_arlock; -assign s1_arcache = axi_s_arcache; -assign s1_arprot = axi_s_arprot; - -wire s2_awvalid ; -wire s2_wvalid ; -wire s2_bready ; -wire s2_arvalid ; -wire s2_rready ; -assign s2_awid = axi_s_awid; -assign s2_awaddr = axi_s_awaddr; -assign s2_awlen = axi_s_awlen; -assign s2_awsize = axi_s_awsize; -assign s2_awburst = axi_s_awburst; -assign s2_awlock = axi_s_awlock; -assign s2_awcache = axi_s_awcache; -assign s2_awprot = axi_s_awprot; -assign s2_wid = axi_s_wid; -assign s2_wdata = axi_s_wdata; -assign s2_wstrb = axi_s_wstrb; -assign s2_wlast = axi_s_wlast; -assign s2_arid = axi_s_arid; -assign s2_araddr = axi_s_araddr; -assign s2_arlen = axi_s_arlen; -assign s2_arsize = axi_s_arsize; -assign s2_arburst = axi_s_arburst; -assign s2_arlock = axi_s_arlock; -assign s2_arcache = axi_s_arcache; -assign s2_arprot = axi_s_arprot; -wire s3_awvalid ; -wire s3_wvalid ; -wire s3_bready ; -wire s3_arvalid ; -wire s3_rready ; -assign s3_awid = axi_s_awid; -assign s3_awaddr = axi_s_awaddr; -assign s3_awlen = axi_s_awlen; -assign s3_awsize = axi_s_awsize; -assign s3_awburst = axi_s_awburst; -assign s3_awlock = axi_s_awlock; -assign s3_awcache = axi_s_awcache; -assign s3_awprot = axi_s_awprot; -assign s3_wid = axi_s_wid; -assign s3_wdata = axi_s_wdata; -assign s3_wstrb = axi_s_wstrb; -assign s3_wlast = axi_s_wlast; -assign s3_arid = axi_s_arid; -assign s3_araddr = axi_s_araddr; -assign s3_arlen = axi_s_arlen; -assign s3_arsize = axi_s_arsize; -assign s3_arburst = axi_s_arburst; -assign s3_arlock = axi_s_arlock; -assign s3_arcache = axi_s_arcache; -assign s3_arprot = axi_s_arprot; -wire s4_awvalid ; -wire s4_wvalid ; -wire s4_bready ; -wire s4_arvalid ; -wire s4_rready ; -assign s4_awid = axi_s_awid; -assign s4_awaddr = axi_s_awaddr; -assign s4_awlen = axi_s_awlen; -assign s4_awsize = axi_s_awsize; -assign s4_awburst = axi_s_awburst; -assign s4_awlock = axi_s_awlock; -assign s4_awcache = axi_s_awcache; -assign s4_awprot = axi_s_awprot; -assign s4_wid = axi_s_wid; -assign s4_wdata = axi_s_wdata; -assign s4_wstrb = axi_s_wstrb; -assign s4_wlast = axi_s_wlast; -assign s4_arid = axi_s_arid; -assign s4_araddr = axi_s_araddr; -assign s4_arlen = axi_s_arlen; -assign s4_arsize = axi_s_arsize; -assign s4_arburst = axi_s_arburst; -assign s4_arlock = axi_s_arlock; -assign s4_arcache = axi_s_arcache; -assign s4_arprot = axi_s_arprot; - -reg [`SLV_MUX_NUM-1:0] s_awvalid; -reg [`SLV_MUX_NUM-1:0] s_wvalid ; -reg [`SLV_MUX_NUM-1:0] s_bready ; -reg [`SLV_MUX_NUM-1:0] s_arvalid; -reg [`SLV_MUX_NUM-1:0] s_rready ; - -assign s0_awvalid = s_awvalid[0] ; -assign s0_wvalid = s_wvalid [0] ; -assign s0_bready = s_bready [0] ; -assign s0_arvalid = s_arvalid[0] ; -assign s0_rready = s_rready [0] ; - -assign s1_awvalid = s_awvalid[1] ; -assign s1_wvalid = s_wvalid [1] ; -assign s1_bready = s_bready [1] ; -assign s1_arvalid = s_arvalid[1] ; -assign s1_rready = s_rready [1] ; - -assign s2_awvalid = s_awvalid[2] ; -assign s2_wvalid = s_wvalid [2] ; -assign s2_bready = s_bready [2] ; -assign s2_arvalid = s_arvalid[2] ; -assign s2_rready = s_rready [2] ; -assign s3_awvalid = s_awvalid[3] ; -assign s3_wvalid = s_wvalid [3] ; -assign s3_bready = s_bready [3] ; -assign s3_arvalid = s_arvalid[3] ; -assign s3_rready = s_rready [3] ; -assign s4_awvalid = s_awvalid[4] ; -assign s4_wvalid = s_wvalid [4] ; -assign s4_bready = s_bready [4] ; -assign s4_arvalid = s_arvalid[4] ; -assign s4_rready = s_rready [4] ; - -assign s_awready[0] = s0_awready ; -assign s_wready[0] = s0_wready ; -assign s_bid[0] = s0_bid ; -assign s_bresp[0] = s0_bresp ; -assign s_bvalid[0] = s0_bvalid ; -assign s_arready[0] = s0_arready ; -assign s_rid[0] = s0_rid ; -assign s_rdata[0] = s0_rdata ; -assign s_rresp[0] = s0_rresp ; -assign s_rlast[0] = s0_rlast ; -assign s_rvalid[0] = s0_rvalid ; -assign s_awready[1] = s1_awready ; -assign s_wready[1] = s1_wready ; -assign s_bid[1] = s1_bid ; -assign s_bresp[1] = s1_bresp ; -assign s_bvalid[1] = s1_bvalid ; -assign s_arready[1] = s1_arready ; -assign s_rid[1] = s1_rid ; -assign s_rdata[1] = s1_rdata ; -assign s_rresp[1] = s1_rresp ; -assign s_rlast[1] = s1_rlast ; -assign s_rvalid[1] = s1_rvalid ; - -assign s_awready[2] = s2_awready ; -assign s_wready[2] = s2_wready ; -assign s_bid[2] = s2_bid ; -assign s_bresp[2] = s2_bresp ; -assign s_bvalid[2] = s2_bvalid ; -assign s_arready[2] = s2_arready ; -assign s_rid[2] = s2_rid ; -assign s_rdata[2] = s2_rdata ; -assign s_rresp[2] = s2_rresp ; -assign s_rlast[2] = s2_rlast ; -assign s_rvalid[2] = s2_rvalid ; -assign s_awready[3] = s3_awready ; -assign s_wready[3] = s3_wready ; -assign s_bid[3] = s3_bid ; -assign s_bresp[3] = s3_bresp ; -assign s_bvalid[3] = s3_bvalid ; -assign s_arready[3] = s3_arready ; -assign s_rid[3] = s3_rid ; -assign s_rdata[3] = s3_rdata ; -assign s_rresp[3] = s3_rresp ; -assign s_rlast[3] = s3_rlast ; -assign s_rvalid[3] = s3_rvalid ; -assign s_awready[4] = s4_awready ; -assign s_wready[4] = s4_wready ; -assign s_bid[4] = s4_bid ; -assign s_bresp[4] = s4_bresp ; -assign s_bvalid[4] = s4_bvalid ; -assign s_arready[4] = s4_arready ; -assign s_rid[4] = s4_rid ; -assign s_rdata[4] = s4_rdata ; -assign s_rresp[4] = s4_rresp ; -assign s_rlast[4] = s4_rlast ; -assign s_rvalid[4] = s4_rvalid ; - -wire [4:0]BASE_ADDR [`SLV_MUX_NUM-1:0]; -wire [2:0]wr_sel_group_0; -wire [2:0]wr_sel_group_1; -wire [2:0]bvalid_group_0; -wire [2:0]bvalid_group_1; - -wire [2:0]rd_sel_group_0; -wire [2:0]rd_sel_group_1; -wire [2:0]rd_valid_group_0; -wire [2:0]rd_valid_group_1; - -assign bvalid_group_0 = s_bvalid[2:0]; -assign bvalid_group_1 = {1'b0,s_bvalid[4:3]}; -assign rd_valid_group_0 = s_rvalid[2:0]; -assign rd_valid_group_1 = {1'b0,s_rvalid[4:3]}; - -wire wr_fifo_empty; -wire wr_fifo_full; -wire rd_fifo_empty; -wire rd_fifo_full; - -assign clk = axi_s_aclk; -assign rst_n = axi_s_aresetn; - -reg axi_s_awready ; -reg axi_s_wready ; -reg axi_s_bvalid; -reg [`LID -1:0] axi_s_bid; -reg [1:0] axi_s_bresp; -wire wr_dir_ins; -wire wr_dir_del; -wire [2:0] wr_data_dir; -reg [2:0] wr_addr_dir; -reg [2:0] wr_resp_pre_sel; -reg wr_resp_prog; -reg [2:0] wr_resp_sel_reg; -wire [2:0] wr_resp_sel; - -integer axi_s_awready_int; -always @(s_awready or wr_fifo_full or wr_addr_hit) -begin - axi_s_awready = 1'b0; - for(axi_s_awready_int= 0 ; axi_s_awready_int< `SLV_MUX_NUM ;axi_s_awready_int=axi_s_awready_int+ 1) - begin - if(!wr_fifo_full & wr_addr_hit[axi_s_awready_int]) - axi_s_awready = s_awready[axi_s_awready_int]; - end -end - -integer awvlid_int; -always @(axi_s_awvalid or wr_fifo_full or wr_addr_hit) -begin - for(awvlid_int= 0 ; awvlid_int< `SLV_MUX_NUM ;awvlid_int=awvlid_int+ 1) - s_awvalid [awvlid_int] = !wr_fifo_full && wr_addr_hit[awvlid_int] && axi_s_awvalid; -end - -integer resp_int; -always @(wr_resp_prog or wr_resp_sel or wr_resp_sel_reg ) -begin - for(resp_int= 0 ; resp_int< `SLV_MUX_NUM ;resp_int= resp_int+ 1) - wr_resp_s_hit [resp_int] = !wr_resp_prog && wr_resp_sel == resp_int|| wr_resp_prog && wr_resp_sel_reg == resp_int; -end - -assign wr_sel_group_0=get_num(bvalid_group_0,wr_resp_pre_sel,2'h0); -assign wr_sel_group_1=get_num(bvalid_group_1,wr_resp_pre_sel,2'h3); -assign wr_resp_sel= ((wr_sel_group_0== 3'h7) && (wr_sel_group_1== 3'h7) ) ? 3'h7: - ((wr_sel_group_0!= 3'h7) && (wr_sel_group_1== 3'h7) ) ?wr_sel_group_0: - ((wr_sel_group_0== 3'h7) && (wr_sel_group_1!= 3'h7) ) ?wr_sel_group_1: - (wr_resp_pre_sel > 2'h2) ? wr_sel_group_0 : wr_sel_group_1; - -integer axi_s_resp_int; -always @(*) -begin - axi_s_bid =8'h0; - axi_s_bresp =2'h0; - axi_s_bvalid =1'h0; - for(axi_s_resp_int= 0 ; axi_s_resp_int< `SLV_MUX_NUM ;axi_s_resp_int=axi_s_resp_int+ 1) - begin - s_bready [axi_s_resp_int] = 1'b0; - if(wr_resp_s_hit[axi_s_resp_int]) - begin - axi_s_bid = s_bid[axi_s_resp_int]; - axi_s_bresp = s_bresp[axi_s_resp_int]; - axi_s_bvalid = s_bvalid[axi_s_resp_int]; - s_bready [axi_s_resp_int] = axi_s_bready; - end - end -end - -assign wr_dir_ins = !wr_fifo_full && axi_s_awvalid && axi_s_awready; -assign wr_dir_del = !wr_fifo_empty && axi_s_wvalid && axi_s_wready && axi_s_wlast; - -integer w_addr_dir_int; -always @(wr_addr_hit) -begin - wr_addr_dir = 3'b0; - for(w_addr_dir_int= 0 ; w_addr_dir_int< `SLV_MUX_NUM ;w_addr_dir_int= w_addr_dir_int+ 1) - if(wr_addr_hit[w_addr_dir_int]) - wr_addr_dir =w_addr_dir_int; -end - -integer w_ad_int; -always @(wr_fifo_empty or wr_data_dir ) -begin - for(w_ad_int = 0 ; w_ad_int < `SLV_MUX_NUM ;w_ad_int = w_ad_int + 1) - wr_data_s_hit[w_ad_int] = (!wr_fifo_empty && wr_data_dir == w_ad_int); -end - -assign wr_addr_hit[1] = axi_s_awaddr[31:20]==12'h1fc || - axi_s_awaddr[31:16]==16'h1fe8; //SPI -assign wr_addr_hit[2] = axi_s_awaddr[31:16]==16'h1fe4 || - axi_s_awaddr[31:16]==16'h1fe7 ; //APB: uart and nand -assign wr_addr_hit[3] = axi_s_awaddr[31:16]==16'h1fd0; //CONF -assign wr_addr_hit[4] = axi_s_awaddr[31:16]==16'h1ff0; //MAC -assign wr_addr_hit[0] = ~|wr_addr_hit[4:1]; //DDR3 - -nb_sync_fifo_mux wr_fifo -( -.clk(clk), -.rst_n(rst_n), - -.empty(wr_fifo_empty), -.full(wr_fifo_full), - -.shift_in(wr_dir_ins), -.data_in(wr_addr_dir), - -.shift_out(wr_dir_del), -.data_out(wr_data_dir) -); - -always@(posedge clk) begin - if(!rst_n) - wr_resp_pre_sel <= 3'b0; - else if(axi_s_bvalid && axi_s_bready) - wr_resp_pre_sel <= wr_resp_sel; -end - - -always@(posedge clk) begin - if(!rst_n || axi_s_bvalid && axi_s_bready) - wr_resp_prog <= 1'b0; - else if(!wr_resp_prog && (|s_bvalid) ) - wr_resp_prog <= 1'b1; -end - -always@(posedge clk) begin - if(!rst_n) - wr_resp_sel_reg <= 3'b0; - else if(!wr_resp_prog && (|s_bvalid) ) - wr_resp_sel_reg <= wr_resp_sel; -end - -integer axi_s_wready_int; -always @(s_wready or wr_data_s_hit) -begin - axi_s_wready = 1'b0; - for(axi_s_wready_int= 0 ; axi_s_wready_int< `SLV_MUX_NUM ;axi_s_wready_int=axi_s_wready_int+ 1) - begin - if(wr_data_s_hit[axi_s_wready_int]) - begin - axi_s_wready = s_wready [axi_s_wready_int]; - end - end -end - -integer wvalid_int; -always @(wr_data_s_hit or axi_s_wvalid ) -begin - for(wvalid_int= 0 ; wvalid_int< `SLV_MUX_NUM ;wvalid_int= wvalid_int+ 1) - s_wvalid[wvalid_int] = axi_s_wvalid && wr_data_s_hit[wvalid_int]; -end - - -wire [2:0] rd_data_sel; -wire rd_dir_ins; -wire rd_dir_del; -wire [2:0] rd_data_dir; -reg [2:0] rd_addr_dir; -reg [2:0] rd_data_pre_sel; -integer rd_arready_int; -integer rd_arvalid_int; -integer rd_addr_hit_int; - -always @(s_arready or rd_fifo_full or rd_addr_hit) -begin - axi_s_arready ='h0; - for(rd_arready_int= 0 ; rd_arready_int< `SLV_MUX_NUM ;rd_arready_int=rd_arready_int+ 1) - if(!rd_fifo_full && rd_addr_hit[rd_arready_int]) - begin - axi_s_arready =s_arready[rd_arready_int]; - end -end - -always @(axi_s_arvalid or rd_fifo_full or rd_addr_hit) -begin - for(rd_arvalid_int= 0 ; rd_arvalid_int< `SLV_MUX_NUM ;rd_arvalid_int=rd_arvalid_int+ 1) - s_arvalid [rd_arvalid_int] = !rd_fifo_full && rd_addr_hit[rd_arvalid_int] && axi_s_arvalid; -end - -assign rd_addr_hit[1] = ((axi_s_araddr[31:16]) ==16'h1fe8) || ((axi_s_araddr[31:20])==12'h1fc); //SPI -assign rd_addr_hit[2] = (axi_s_araddr[31:16]) ==16'h1fe4 || - (axi_s_araddr[31:16]) ==16'h1fe7 ;//APB:uart and nand -assign rd_addr_hit[3] = (axi_s_araddr[31:16]) ==16'h1fd0; //CONF -assign rd_addr_hit[4] = (axi_s_araddr[31:16]) == 16'h1ff0; //MAC -assign rd_addr_hit[0] = ~|rd_addr_hit[4:1]; //DDR3 - -integer rd_addr_dir_int; -always @(rd_addr_hit) -begin - rd_addr_dir = 3'b0; - for(rd_addr_dir_int= 0 ; rd_addr_dir_int< `SLV_MUX_NUM ;rd_addr_dir_int= rd_addr_dir_int+ 1) - if(rd_addr_hit[rd_addr_dir_int]) - rd_addr_dir =rd_addr_dir_int; -end - -integer axi_rd_data_int; -always @(*) -begin - axi_s_rid =8'h0; - axi_s_rdata =128'h0; - axi_s_rresp =2'h0; - axi_s_rlast =1'h0; - axi_s_rvalid =1'h0; - for(axi_rd_data_int= 0 ; axi_rd_data_int< `SLV_MUX_NUM ;axi_rd_data_int=axi_rd_data_int+ 1) - begin - s_rready [axi_rd_data_int] = 1'b0; - if(rd_data_sel==axi_rd_data_int) begin - s_rready [axi_rd_data_int] = axi_s_rready; - axi_s_rid =s_rid [axi_rd_data_int]; - axi_s_rdata =s_rdata [axi_rd_data_int]; - axi_s_rresp =s_rresp [axi_rd_data_int]; - axi_s_rlast =s_rlast [axi_rd_data_int]; - axi_s_rvalid =s_rvalid [axi_rd_data_int]; - end - end -end - -always@(posedge clk) begin - if(!rst_n) - begin - rd_data_pre_sel<= 3'b0; - end - else if(axi_s_rvalid && axi_s_rready) - begin - rd_data_pre_sel <= rd_data_sel; - end -end - -assign rd_data_sel =rd_data_dir; - -nb_sync_fifo_mux rd_fifo -( -.clk(clk), -.rst_n(rst_n), - -.empty(rd_fifo_empty), -.full(rd_fifo_full), - -.shift_in(rd_dir_ins), -.data_in(rd_addr_dir), - -.shift_out(rd_dir_del), -.data_out(rd_data_dir) -); - -assign rd_dir_ins = !rd_fifo_full && axi_s_arvalid && axi_s_arready; -assign rd_dir_del = !rd_fifo_empty && axi_s_rvalid && axi_s_rready && axi_s_rlast; - -function [2:0] get_num; -input [2:0] valid; -input [2:0] pre_num; -input [1:0] group; -begin -get_num=(valid == 3'b001)? (3'h0+group) : - (valid == 3'b010)? (3'h1+group) : - (valid == 3'b100)? (3'h2+group) : - (valid == 3'b011)? (pre_num!=(3'h0+group))?(3'h0+group):(3'h1+group) : - (valid == 3'b110)? (pre_num!=(3'h1+group))?(3'h1+group):(3'h2+group) : - (valid == 3'b101)? (pre_num!=(3'h2+group))?(3'h2+group):(3'h0+group) : - (valid == 3'b111)?((pre_num==(3'h0+group))?(3'h1+group):(pre_num==(3'h1+group))?(3'h2+group):(3'h0+group)):3'h7; -end -endfunction -endmodule - -`undef SLV_MUX_5 -`undef SLV_MUX_NUM - -module nb_sync_fifo_mux -( -clk, -rst_n, - -empty, -full, - -shift_in, -data_in, - -shift_out, -data_out -); -parameter FIFO_WIDTH = 3; - -input clk; -input rst_n; - -output empty; -output full; - -input shift_in; -input [FIFO_WIDTH-1:0] data_in; - -input shift_out; -output[FIFO_WIDTH-1:0] data_out; - - -reg [FIFO_WIDTH-1:0] fifo_ram [1:0]; -reg [1:0] wr_ptr; -reg [1:0] rd_ptr; - -wire [0:0] mem_wr_pos; -wire [0:0] mem_rd_pos; - -always@(posedge clk) begin - if(!rst_n) - wr_ptr <= 2'h0; - else if(~full && shift_in) - wr_ptr <= wr_ptr + 2'h1; -end - -always@(posedge clk) begin - if(!rst_n) - rd_ptr <= 2'h0; - else if(~empty && shift_out) - rd_ptr <= rd_ptr + 2'h1; -end - -assign full = wr_ptr == {~rd_ptr[1],rd_ptr[0]}; -assign empty = wr_ptr == rd_ptr; - -assign mem_wr_pos = wr_ptr[0:0]; -assign mem_rd_pos = rd_ptr[0:0]; - -assign data_out = fifo_ram[mem_rd_pos]; - -integer i; - -always@(posedge clk) begin - if(!rst_n) - for(i=0;i<2;i=i+1) - fifo_ram[i] <= 2'b0; - else if(shift_in && ~full) - fifo_ram[mem_wr_pos] <= data_in; -end - -endmodule diff --git a/resources/soc/rtl/APB_DEV/NAND/nand.v b/resources/soc/rtl/APB_DEV/NAND/nand.v deleted file mode 100644 index f17408f..0000000 --- a/resources/soc/rtl/APB_DEV/NAND/nand.v +++ /dev/null @@ -1,1430 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -module NAND_top( - nand_type, - - pclk, - prst_, - psel, - penable, - pwrite, - ADDR, - DAT_I, - DAT_O, - - NAND_CE_o, - NAND_REQ, - NAND_I, - NAND_O, - NAND_EN_, - NAND_ALE, - NAND_CLE, - NAND_WR_, - NAND_RD_, - NAND_IORDY_i, - - nand_int -); -input [1:0]nand_type; - -input pclk; -input prst_; -input pwrite; -input psel; -input penable; -input [10:0]ADDR; -input [31:0]DAT_I; -output [31:0]DAT_O; - -output [3:0]NAND_CE_o; -output NAND_REQ; -input [7:0]NAND_I; -output [7:0]NAND_O; -output NAND_EN_; -output NAND_ALE; -output NAND_CLE; -output NAND_WR_; -output NAND_RD_; -input [3:0]NAND_IORDY_i; -output nand_int; - -/************************************************************/ - -reg [31:0]REG_DAT_T; -reg [13:0]nand_addr_c; -reg [24:0]nand_addr_r; -reg [31:0]nand_op_num; -reg [31:0]nand_parameter; -reg [31:0]nand_ce_map0; -reg [31:0]nand_ce_map1; -reg [31:0]nand_rdy_map0; -reg [31:0]nand_rdy_map1; -reg [31:0]nand_command; -reg [15:0] nand_timing; -reg [37:0] addr_in_die; -reg [4:0] NAND_STATE; -reg [31:0] NAND_OP_NUM; -reg [13:0] WRITE_MAX_COUNT; -reg [13:0] READ_MAX_COUNT; -reg nand_clr_ack; -reg NAND_DONE; -reg NAND_CE_; -reg nand_int; - -wire [13:0] op_scope; -wire [2:0] nand_id_num; -wire [3:0] nand_size; -wire main_op; -wire spare_op; -wire nand_int_en; -wire nand_dma_ack_i; -wire NANDtag; -wire NAND_IORDY; - - -wire HIT0 =psel & ADDR[10:0] == 11'h00; -wire HIT1 =psel & ADDR[10:0] == 11'h04; -wire HIT2 =psel & ADDR[10:0] == 11'h08; -wire HIT3 =psel & ADDR[10:0] == 11'h0c; -wire HIT4 =psel & ADDR[10:0] == 11'h10; -wire HIT5 =psel & ADDR[10:0] == 11'h14; -wire HIT6 =psel & ADDR[10:0] == 11'h18; -wire HIT7 =psel & ADDR[10:0] == 11'h1c; -wire HIT8 =psel & ADDR[10:0] == 11'h20; -wire HIT9 =psel & ADDR[10:0] == 11'h24; -wire HIT10=psel & ADDR[10:0] == 11'h28; -wire HIT11=psel & ADDR[10:0] == 11'h2c; -wire NAND_HIT =penable & ADDR[10:0] == 11'h40; -assign nand_dma_ack_i=psel & ADDR[10:0] == 11'h40; - -assign DAT_O = REG_DAT_T; -reg NAND_DMA_REQ; -reg nand_cmd_valid; - -always @(posedge pclk) -begin - if(~prst_) - begin - nand_int <= 1'b0; - end - else - begin - nand_int <= NAND_DONE&nand_int_en; - end -end - - - -always @(posedge pclk) -begin - if(~prst_) - begin - nand_clr_ack <= 1'b1; - nand_command <= {1'b0,1'b0,1'b0,1'b0,9'b0,1'b0,NANDtag}; - nand_timing <= {8'h4,8'h12}; - nand_op_num <= 2048; - nand_addr_c <= 14'h0; - nand_addr_r <= 25'h0; - nand_parameter<= (nand_type==2'h3) ? 32'h800_5100: - (nand_type==2'h2) ? 32'h800_5000: //2'h2 means 1Gbit - (nand_type==2'h1) ? 32'h200_4b00:32'h200_4c00; - nand_ce_map0 <= 32'h0; - nand_ce_map1 <= 32'h0; - nand_rdy_map0 <= 32'h0; - nand_rdy_map1 <= 32'h0; - nand_cmd_valid<=nand_command[0]; - end - else - begin - nand_cmd_valid<=nand_command[0]; - if(pwrite& HIT0) begin - nand_command[15:0] <= DAT_I[15:0]; - end - else if(NAND_DONE && nand_command[0]) begin - nand_command [0] <= 1'b0; - nand_command [10] <= 1'b1; - nand_clr_ack <= 1'b1; - end - else begin - nand_command[31:16] <={NAND_DMA_REQ,1'b0,1'b0,NAND_STATE,NAND_CE_o,NAND_IORDY_i}; - if(~NAND_DONE) nand_clr_ack <= 1'b0; - end - - if(pwrite& HIT1) nand_addr_c <= DAT_I[13:0]; - if(pwrite& HIT2) nand_addr_r <= DAT_I[24:0]; - if(pwrite& HIT3) begin - nand_timing[7:0] <= (DAT_I[7:0]<5) ? 8'h5: DAT_I[7:0]; - nand_timing[15:8] <= (DAT_I[15:8]<2) ? 8'h2: DAT_I[15:8]; - end - if(pwrite& HIT6) nand_parameter<= DAT_I; - if(pwrite& HIT7) nand_op_num <= DAT_I; - if(pwrite& HIT8) nand_ce_map0 <= DAT_I; - if(pwrite& HIT9) nand_ce_map1 <= DAT_I; - else nand_ce_map1 <= {READ_MAX_COUNT,NAND_OP_NUM[15:0]}; - if(pwrite& HIT10) nand_rdy_map0 <= DAT_I; - if(pwrite& HIT11) nand_rdy_map1 <= DAT_I; - else nand_rdy_map1 <= {WRITE_MAX_COUNT,NAND_OP_NUM[15:0]}; - end -end - - -assign NANDtag = ~prst_ ? 1'b0 : nand_cmd_valid; -assign op_scope = nand_parameter[29:16]; -assign nand_id_num = nand_parameter[14:12]; -assign nand_size = nand_parameter[11:8]; -assign main_op = nand_command[8]; -assign spare_op = nand_command[9]; -assign nand_int_en = nand_command[13]; - -reg [7:0] status; -reg [1:0] nand_number; -reg [47:0] ID_INFORM; -reg [31:0] NAND_DAT_O_RD; -wire [3:0] NAND_CE_pre_o; -wire [3:0] NAND_IORDY_post_i; - -always @(posedge pclk) -begin - if(~prst_) - begin - addr_in_die <= 38'h0; - nand_number <= 2'h0; - end - else begin - case(nand_size) - 4'h0: begin - nand_number <= nand_addr_r[17:16]; // 1Gb in a single die , page 2048 - addr_in_die <= {9'h0,nand_addr_r[15:0],4'b0,nand_addr_c[11:0]}; - end - 4'h1: begin - nand_number <= nand_addr_r[18:17]; - addr_in_die <= {5'h0,nand_addr_r[16:0],4'b0,nand_addr_c[11:0]}; - end - 4'h2: begin - nand_number <= nand_addr_r[19:18]; - addr_in_die <= {4'h0,nand_addr_r[17:0],4'b0,nand_addr_c[11:0]}; - end - 4'h3: begin - nand_number <= nand_addr_r[20:19]; - addr_in_die <= {3'h0,nand_addr_r[18:0],4'b0,nand_addr_c[11:0]}; - end - 4'h4: begin - nand_number <= nand_addr_r[20:19]; - addr_in_die <= {3'h0,nand_addr_r[18:0],3'b0,nand_addr_c[12:0]}; - end - 4'h5: begin - nand_number <= nand_addr_r[20:19]; - addr_in_die <= {3'h0,nand_addr_r[18:0],2'b0,nand_addr_c[13:0]}; - end - 4'h6: begin - nand_number <= nand_addr_r[21:20]; - addr_in_die <= {2'h0,nand_addr_r[19:0],2'b0,nand_addr_c[13:0]}; - end - 4'h7: begin - nand_number <= nand_addr_r[22:21]; - addr_in_die <= {1'h0,nand_addr_r[20:0],2'b0,nand_addr_c[13:0]}; - end - 4'h9: begin - nand_number <= nand_addr_r[15:14]; - addr_in_die <= {15'h0,nand_addr_r[13:0],nand_addr_c[8:0]}; - end - 4'ha: begin - nand_number <= nand_addr_r[16:15]; - addr_in_die <= {14'h0,nand_addr_r[14:0],nand_addr_c[8:0]}; - end - 4'hb: begin - nand_number <= nand_addr_r[17:16]; - addr_in_die <= {13'h0,nand_addr_r[15:0],nand_addr_c[8:0]}; - end - 4'hc: begin - nand_number <= nand_addr_r[18:17]; - addr_in_die <= {12'h0,nand_addr_r[16:0],nand_addr_c[8:0]}; - end - 4'hd: begin - nand_number <= nand_addr_r[19:18]; - addr_in_die <= {11'h0,nand_addr_r[17:0],nand_addr_c[8:0]}; - end - default: begin - nand_number <= 2'b0; - addr_in_die <= 38'b0; - end - endcase - end -end - -assign NAND_CE_pre_o[0] = (nand_number ==4'h0) ? NAND_CE_ : 1'b1; -assign NAND_CE_pre_o[1] = (nand_number ==4'h1) ? NAND_CE_ : 1'b1; -assign NAND_CE_pre_o[2] = (nand_number ==4'h2) ? NAND_CE_ : 1'b1; -assign NAND_CE_pre_o[3] = (nand_number ==4'h3) ? NAND_CE_ : 1'b1; -assign NAND_IORDY = (nand_number ==4'h0) ? NAND_IORDY_post_i[0]: - (nand_number ==4'h1) ? NAND_IORDY_post_i[1]: - (nand_number ==4'h2) ? NAND_IORDY_post_i[2]: - (nand_number ==4'h3) ? NAND_IORDY_post_i[3]:1'b1; - -assign NAND_CE_o[0] = NAND_CE_pre_o[0]; -assign NAND_IORDY_post_i[0] = NAND_IORDY_i[0]; -assign NAND_CE_o[1] = nand_ce_map0[8 ] ? NAND_CE_pre_o[0]: - nand_ce_map0[9 ] ? NAND_CE_pre_o[1]: - nand_ce_map0[10] ? NAND_CE_pre_o[2]: - nand_ce_map0[11] ? NAND_CE_pre_o[3]:1'b1; - - -assign NAND_IORDY_post_i[1] = nand_ce_map0[12] ? NAND_IORDY_i[0]: - nand_ce_map0[13] ? NAND_IORDY_i[1]: - nand_ce_map0[14] ? NAND_IORDY_i[2]: - nand_ce_map0[15] ? NAND_IORDY_i[3]:1'b1; - -assign NAND_CE_o[2] = nand_ce_map0[16] ? NAND_CE_pre_o[0]: - nand_ce_map0[17] ? NAND_CE_pre_o[1]: - nand_ce_map0[18] ? NAND_CE_pre_o[2]: - nand_ce_map0[19] ? NAND_CE_pre_o[3]:1'b1; - -assign NAND_IORDY_post_i[2] = nand_ce_map0[20] ? NAND_IORDY_i[0]: - nand_ce_map0[21] ? NAND_IORDY_i[1]: - nand_ce_map0[22] ? NAND_IORDY_i[2]: - nand_ce_map0[23] ? NAND_IORDY_i[3]:1'b1; - -assign NAND_CE_o[3] = nand_ce_map0[24] ? NAND_CE_pre_o[0]: - nand_ce_map0[25] ? NAND_CE_pre_o[1]: - nand_ce_map0[26] ? NAND_CE_pre_o[2]: - nand_ce_map0[27] ? NAND_CE_pre_o[3]:1'b1; - -assign NAND_IORDY_post_i[3] = nand_ce_map0[28] ? NAND_IORDY_i[0]: - nand_ce_map0[29] ? NAND_IORDY_i[1]: - nand_ce_map0[30] ? NAND_IORDY_i[2]: - nand_ce_map0[31] ? NAND_IORDY_i[3]:1'b1; - -always @(pwrite or penable or NAND_HIT or - HIT0 or HIT1 or HIT2 or HIT3 or - HIT4 or HIT5 or HIT6 or HIT7 or - HIT8 or HIT9 or HIT10 or HIT11 or - nand_command or nand_op_num or nand_addr_c or nand_addr_r or - nand_ce_map0 or nand_ce_map1 or nand_rdy_map0 or nand_rdy_map1 or - nand_timing or nand_parameter or status or ID_INFORM or NAND_DAT_O_RD) -begin - if(~pwrite & HIT0 &penable) - REG_DAT_T = nand_command; - else if(~pwrite & HIT1&penable) - REG_DAT_T = {20'b0,nand_addr_c}; - else if(~pwrite & HIT2&penable) - REG_DAT_T = {7'b0,nand_addr_r}; - else if(~pwrite & HIT3&penable) - REG_DAT_T = nand_timing; - else if(~pwrite & HIT4&penable) - REG_DAT_T = ID_INFORM[31:0]; - else if(~pwrite & HIT5&penable) - REG_DAT_T = {status,ID_INFORM[47:32]}; - else if(~pwrite & HIT6&penable) - REG_DAT_T = nand_parameter; - else if(~pwrite & HIT7&penable) - REG_DAT_T = nand_op_num; - else if(~pwrite & HIT8&penable) - REG_DAT_T = nand_ce_map0 ; - else if(~pwrite & HIT9&penable) - REG_DAT_T = nand_ce_map1; - else if(~pwrite & HIT10&penable) - REG_DAT_T = nand_rdy_map0 ; - else if(~pwrite & HIT11&penable) - REG_DAT_T = nand_rdy_map1 ; - else if(~pwrite & NAND_HIT &penable) - REG_DAT_T = NAND_DAT_O_RD; - else REG_DAT_T = 0; -end - -reg [1:0] ADDR_pointer; -reg [7:0] NAND_O; -reg [2:0] NAND_ADDR_COUNT; -reg [7:0] WAIT_NUM; -reg [7:0] HOLD_NUM; -reg [7:0] COMMAND; -reg [4:0] PRE_STATE; -reg [2:0] READ_ID_NUM; -reg [13:0] data_count; -reg [37:0] NAND_ADDR; -reg [31:0] NAND_DAT_I_WR; - -reg NAND_WR_; -reg NAND_RD_; -reg NAND_CLE; -reg NAND_ALE; -reg NAND_GO; -reg NAND_ACK; -reg DMA_OP_DONE; -reg ERASE_SERIAL; -reg NAND_EN_; - -reg now_up_half; -reg now_oob; -assign NAND_REQ =NAND_DMA_REQ; - -parameter - NAND_IDLE = 5'b00000, - COMMAND_IN = 5'b00001, - - ADDR_4_RD_WR = 5'b00010, - ADDR_4_ERASE_ID = 5'b01010, - - READ_START = 5'b00011, - READ_WAIT = 5'b00100, - READ_WAIT_2 = 5'b00110, - READ_TRANSFER = 5'b00111, - - WRITE_START = 5'b10000, - WRITE_DATA = 5'b10001, - PROGRAM = 5'b10010, - PROGRAM_FAIL = 5'b10011, - - READ_ID = 5'b10100, - READ_STATUS = 5'b10101, - ID_TO_STATUS = 5'b10110, - - ERASE = 5'b10111, - WAIT_ERASE = 5'b11000, - ERASE_FAIL = 5'b11001, - - RESET = 5'b11010, - WAIT_RESET = 5'b11011; -always @(posedge pclk) -begin - if (~prst_||~NANDtag) - begin - now_up_half <= 1'b0; - now_oob <= 1'b0; - NAND_ACK <= 1'b0; - NAND_CLE <= 1'b0; - NAND_ALE <= 1'b0; - NAND_CE_ <= 1'b1; - NAND_WR_ <= 1'b1; - NAND_RD_ <= 1'b1; - NAND_O <= 8'b0; - COMMAND <= 8'h55; - data_count <= 14'b0; - NAND_ADDR <= 38'b0; - NAND_DONE <= 1'b0; - NAND_GO <= 1'b0; - if(~prst_) status <= 8'b0; - if(~prst_) ID_INFORM <= 48'h0; - WAIT_NUM <= 8'h14; - HOLD_NUM <= 8'h4; - PRE_STATE <= 5'b0; - ADDR_pointer <= 2'b0; - NAND_DMA_REQ <= 1'b0; - ERASE_SERIAL <= 1'b0; - NAND_OP_NUM <= 32'h0; - NAND_EN_ <= 1'b0; - NAND_ADDR_COUNT <= 3'b0; - READ_MAX_COUNT <= 14'b0; - WRITE_MAX_COUNT <= 14'b0; - DMA_OP_DONE <= 1'b0; - NAND_DAT_I_WR <= 32'b0; - NAND_DAT_O_RD <= 32'h12345678; - READ_ID_NUM <= 3'b100; - NAND_STATE <= NAND_IDLE; - end - else - begin - case(NAND_STATE) - NAND_IDLE: - begin - HOLD_NUM <= nand_timing[15:8]; - if(nand_command[0]) - begin - DMA_OP_DONE <= 1'b0; - if(nand_clr_ack) - NAND_DONE <= 1'b0; - if(NAND_OP_NUM==32'b0) begin - NAND_ADDR <= addr_in_die; - NAND_OP_NUM <= nand_op_num; - end - if(nand_command[1] &&NAND_GO && ~NAND_DONE&& (nand_size[3])&&(~main_op||main_op&&NAND_ADDR[8]&&now_up_half)&&spare_op) - begin - COMMAND <= 8'h50; - NAND_EN_ <= 1'b0; - NAND_GO <= 1'b0; - now_oob <= 1'b1; - now_up_half <= 1'b0; - end - else if(nand_command[1] && NAND_ADDR[8]&&nand_size[3]&&NAND_GO && ~NAND_DONE) - begin - COMMAND <= 8'h01; - NAND_EN_ <= 1'b0; - NAND_GO <= 1'b0; - now_oob <= 1'b0; - now_up_half <= main_op&spare_op; - end - else if(nand_command[1] && NAND_GO && ~NAND_DONE) - begin - COMMAND <= 8'h00; - NAND_EN_ <= 1'b0; - NAND_GO <= 1'b0; - now_oob <= 1'b0; - now_up_half <= 1'b0; - end - else if(nand_command[2]&&NAND_GO && ~NAND_DONE&& nand_size[3]&&(~main_op||main_op&&NAND_ADDR[8]&&now_up_half)&&spare_op) - begin - COMMAND <= 8'h50; - NAND_GO <= 1'b0; - now_oob <= 1'b1; - now_up_half <= 1'b0; - end - else if(nand_command[2]&&NAND_GO && ~NAND_DONE&& nand_size[3]&&NAND_ADDR[8]) - begin - COMMAND <= 8'h01; - NAND_GO <= 1'b0; - now_oob <= 1'b0; - now_up_half <= main_op&spare_op; - end - else if(nand_command[2]&&NAND_GO && ~NAND_DONE&& nand_size[3]&&~NAND_ADDR[8]) - begin - COMMAND <= 8'h0; - NAND_GO <= 1'b0; - now_oob <= 1'b0; - now_up_half <= 1'b0; - end - else if(nand_command[2]&&NAND_GO && ~NAND_DONE) - begin - COMMAND <= 8'h80; - NAND_GO <= 1'b0; - end - else if(nand_command[3]&&NAND_GO&& ~NAND_DONE ) - begin - COMMAND <= 8'h60; - NAND_GO <= 1'b0; - ERASE_SERIAL <= nand_command[4]; - end - else if(nand_command[5]&&NAND_GO&& ~NAND_DONE) - begin - COMMAND <= 8'h90; - NAND_GO <= 1'b0; - end - else if(nand_command[6]&&NAND_GO&& ~NAND_DONE) - begin - COMMAND <= 8'hFF; - NAND_GO <= 1'b0; - end - else if(nand_command[7]&&NAND_GO&& ~NAND_DONE) - begin - COMMAND <= 8'h70; - NAND_GO <= 1'b0; - end - else if((COMMAND==8'h00 || COMMAND==8'h70 || COMMAND==8'h80 || COMMAND==8'h01 || COMMAND==8'h50 || - COMMAND==8'h60 || COMMAND==8'h90 || COMMAND==8'hFF)&& ~NAND_DONE) begin - NAND_STATE<= COMMAND_IN; - PRE_STATE <= NAND_IDLE; - WAIT_NUM <= nand_timing[7:0]; - NAND_CE_ <= 1'b0; - NAND_CLE <= 1'b0; - NAND_ALE <= 1'b0; - NAND_WR_ <= 1'b1; - NAND_RD_ <= 1'b1; - NAND_EN_ <= 1'b0; - end - else begin - COMMAND <= 8'h55; - NAND_GO <= ~NAND_DONE & nand_command[0]; - if (~nand_command[0]) NAND_DONE <=1'b0; - end - end else begin - COMMAND <= 8'h55; - NAND_CE_ <= 1'b1; - NAND_WR_ <= 1'b1; - NAND_RD_ <= 1'b1; - NAND_STATE <= NAND_IDLE; - NAND_GO <= ~NAND_DONE&nand_command[0]; - if(~NAND_GO) begin - NAND_ADDR <= nand_command[0] ? addr_in_die : 38'h3f_ffff_ffff; - NAND_OP_NUM <= nand_command[0] ? nand_op_num : 32'b0; - end - if(nand_clr_ack) - NAND_DONE <= 1'b0; - end - end - COMMAND_IN: - begin - if(WAIT_NUM == nand_timing[7:0]) begin - NAND_CLE <= 1'b0; - NAND_WR_ <= 1'b1; - WAIT_NUM <= WAIT_NUM - 1'b1; - end - else if(WAIT_NUM == (nand_timing[7:0]-1)) begin - NAND_CLE <= 1'b1; - NAND_WR_ <= 1'b1; - WAIT_NUM <= WAIT_NUM - 1'b1; - end - else if(WAIT_NUM < nand_timing[7:0] && WAIT_NUM>HOLD_NUM) begin - NAND_O <= COMMAND; - NAND_CLE <= 1'b1; - NAND_WR_ <= 1'b0; - WAIT_NUM <= WAIT_NUM - 1'b1; - end - else if(WAIT_NUM<=HOLD_NUM && WAIT_NUM) begin - NAND_CLE <= 1'b1; - NAND_WR_ <= 1'b1; - WAIT_NUM <= WAIT_NUM - 1'b1; - end - else - begin - if(PRE_STATE==NAND_IDLE) begin - NAND_CE_ <= 1'b0; - NAND_CLE <= 1'b0; - NAND_WR_ <= 1'b1; - NAND_ALE <= 1'b0; - NAND_DONE <= 1'b0; - NAND_O <= 8'b0; - PRE_STATE <= COMMAND_IN; - if((nand_command[1]||nand_command[2])&&(COMMAND==8'h00||COMMAND==8'h01||COMMAND==8'h50)) begin - NAND_STATE <= nand_command[1] ? READ_START:WRITE_START; - WAIT_NUM <= nand_timing[7:0]; - end - else if(nand_command[2]&&(COMMAND==8'h80)) begin - NAND_STATE <= WRITE_START; - WAIT_NUM <= nand_timing[7:0]; - end - else if((COMMAND==8'h60)) begin - NAND_STATE <= ERASE; - PRE_STATE <= COMMAND_IN; - WAIT_NUM <= nand_timing[7:0]+2'b11; - end - else if((COMMAND==8'h70)) begin - NAND_STATE <= READ_STATUS; - WAIT_NUM <= nand_timing[7:0]+2'b11; - end - else if((COMMAND==8'h90)) begin - NAND_STATE <= READ_ID; - WAIT_NUM <= nand_timing[7:0]+2'b11; - end - else if((COMMAND==8'hFF)) begin - NAND_STATE <= RESET; - WAIT_NUM <= nand_timing[7:0]+2'b11; - end - else begin - NAND_STATE <= NAND_IDLE; - NAND_OP_NUM <= 32'b0; - NAND_CE_ <= 1'b1; - NAND_DONE <= 1'b1; - end - end - else - begin - NAND_CLE <= 1'b0; - NAND_ALE <= 1'b0; - NAND_WR_ <= 1'b1; - NAND_GO <= 1'b1; - NAND_STATE <= PRE_STATE; - PRE_STATE <= COMMAND_IN; - WAIT_NUM <= nand_timing[7:0]; - end - end - end - ADDR_4_ERASE_ID: - begin - if(NAND_ADDR_COUNT != 3'b0) - begin - if(WAIT_NUM > (nand_timing[7:0] - HOLD_NUM+1'b1)) - begin - NAND_ALE <= 1'b0; - NAND_WR_ <= 1'b1; - WAIT_NUM <= WAIT_NUM - 1'b1; - end - else if(WAIT_NUM > (nand_timing[7:0] - HOLD_NUM)) - begin - NAND_ALE <= 1'b1; - NAND_WR_ <= 1'b1; - WAIT_NUM <= WAIT_NUM - 1'b1; - end - else if(WAIT_NUM>=HOLD_NUM) - begin - NAND_ALE <= 1'b1; - NAND_WR_ <= 1'b0; - WAIT_NUM <= WAIT_NUM - 1'b1; - if(NAND_ADDR_COUNT == 2'b11) begin - if(nand_size==4'hc||nand_size==4'hd) NAND_O <= NAND_ADDR[16:9]; - else NAND_O <= NAND_ADDR[23:16]; - end - else if(NAND_ADDR_COUNT==2'b10) begin - if(nand_size==4'h9||nand_size==4'ha||nand_size==4'hb) NAND_O <= NAND_ADDR[16:9]; - else if(nand_size==4'hc||nand_size==4'hd) NAND_O <= NAND_ADDR[24:17]; - else if(nand_size==4'h0) NAND_O <= NAND_ADDR[23:16]; - else NAND_O <= NAND_ADDR[31:24]; - end - else if(NAND_ADDR_COUNT==3'b001) begin - if(PRE_STATE == READ_ID) - NAND_O <= NAND_ADDR[7:0]; - else - if(nand_size==4'h9||nand_size==4'ha||nand_size==4'hb) NAND_O <= NAND_ADDR[24:17]; - else if(nand_size==4'hc||nand_size==4'hd) NAND_O <= NAND_ADDR[32:25]; - else if(nand_size==4'h0) NAND_O <= NAND_ADDR[31:24]; - else NAND_O <= NAND_ADDR[35:32]; - end - end - else if((WAIT_NUM (nand_timing[7:0] - HOLD_NUM + 1'b1)) begin - NAND_ALE <= 1'b0; - NAND_WR_ <= 1'b1; - WAIT_NUM <= WAIT_NUM - 1'b1; - end - else if(WAIT_NUM > (nand_timing[7:0]- HOLD_NUM)) begin - NAND_ALE <= 1'b1; - NAND_WR_ <= 1'b1; - WAIT_NUM <= WAIT_NUM - 1'b1; - end - else if(WAIT_NUM>=HOLD_NUM) begin - NAND_ALE <= 1'b1; - NAND_WR_ <= 1'b0; - WAIT_NUM <= WAIT_NUM - 1'b1; - if(NAND_ADDR_COUNT==3'b101) - NAND_O <= NAND_ADDR[7:0]; - else if(NAND_ADDR_COUNT==3'b100) begin - if(nand_size==4'hc||nand_size==4'hd) NAND_O <= NAND_ADDR[7:0]; - else if(nand_size==4'h0) NAND_O <= NAND_ADDR[7:0]; - else NAND_O <= NAND_ADDR[15:8]; - end - else if(NAND_ADDR_COUNT==3'b11) begin - if(nand_size==4'h9||nand_size==4'ha||nand_size==4'hb) NAND_O <= NAND_ADDR[7:0]; - else if(nand_size==4'hc||nand_size==4'hd) NAND_O <= NAND_ADDR[16:9]; - else if(nand_size==4'h0) NAND_O <= NAND_ADDR[15:8]; - else NAND_O <= NAND_ADDR[23:16]; - end - else if(NAND_ADDR_COUNT==3'b10)begin - if(nand_size==4'h9||nand_size==4'ha||nand_size==4'hb) NAND_O <= NAND_ADDR[16:9]; - else if(nand_size==4'hc||nand_size==4'hd) NAND_O <= NAND_ADDR[24:17]; - else if(nand_size==4'h0) NAND_O <= NAND_ADDR[23:16]; - else NAND_O <= NAND_ADDR[31:24]; - end - else if(NAND_ADDR_COUNT==3'b1) begin - if(nand_size==4'h9||nand_size==4'ha||nand_size==4'hb) NAND_O <= NAND_ADDR[24:17]; - else if(nand_size==4'hc||nand_size==4'hd) NAND_O <= NAND_ADDR[32:25]; - else if(nand_size==4'h0) NAND_O <= NAND_ADDR[31:24]; - else NAND_O <= NAND_ADDR[37:32]; - end - end - else if((WAIT_NUM(256-NAND_ADDR[7:0]))? (256-NAND_ADDR[7:0]) : NAND_OP_NUM; - else if(now_oob) - READ_MAX_COUNT <= (NAND_OP_NUM>(16-NAND_ADDR[3:0]))? (16-NAND_ADDR[3:0]) : NAND_OP_NUM; - else - READ_MAX_COUNT <= (NAND_OP_NUM>(256-NAND_ADDR[7:0]))? (256-NAND_ADDR[7:0]) : NAND_OP_NUM; - end - - 4'h0, - 4'h1, - 4'h2, - 4'h3: begin - NAND_ADDR[10:0] <= 11'h0; - NAND_ADDR[11] <= spare_op&(~main_op); - NAND_ADDR[35:16] <= NAND_ADDR[35:16] +1'b1; - if(spare_op && main_op) - READ_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[11:0]))? (op_scope-NAND_ADDR[11:0]) : NAND_OP_NUM; - else if(spare_op) - READ_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[5:0])) ? (op_scope-NAND_ADDR[5:0]) : NAND_OP_NUM; - else - READ_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[10:0]))? (op_scope-NAND_ADDR[10:0]) : NAND_OP_NUM; - end - 4'h4: begin - NAND_ADDR[11:0] <= 12'h0; - NAND_ADDR[12] <= spare_op&(~main_op); - NAND_ADDR[35:16] <= NAND_ADDR[35:16] +1'b1; - if(spare_op && main_op) - READ_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[12:0]))? (op_scope-NAND_ADDR[12:0]) : NAND_OP_NUM; - else if(spare_op) - READ_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[6:0])) ? (op_scope-NAND_ADDR[6:0]) : NAND_OP_NUM; - else - READ_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[11:0]))? (op_scope-NAND_ADDR[11:0]) : NAND_OP_NUM; - end - 4'h5, - 4'h6, - 4'h7: begin - NAND_ADDR[12:0] <= 13'h0; - NAND_ADDR[13] <= spare_op&(~main_op); - NAND_ADDR[35:16] <= NAND_ADDR[35:16] +1'b1; - if(spare_op && main_op) - READ_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[13:0]))? (op_scope-NAND_ADDR[13:0]) : NAND_OP_NUM; - else if(spare_op) - READ_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[7:0])) ? (op_scope-NAND_ADDR[7:0]) : NAND_OP_NUM; - else - READ_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[12:0]))? (op_scope-NAND_ADDR[12:0]) : NAND_OP_NUM; - end - default: begin end - endcase - end - - READ_TRANSFER: - begin - if(~NAND_IORDY) - begin - if (~DMA_OP_DONE && ~NAND_HIT) - begin - NAND_DMA_REQ <= 1'b1; - end - else if(NAND_DMA_REQ && NAND_HIT) - begin - NAND_DMA_REQ <= 1'b0; - DMA_OP_DONE <= 1'b1; - ADDR_pointer <= 2'b0; - WAIT_NUM <= nand_timing[7:0]; - end - end - else if((data_count != READ_MAX_COUNT) && ~NAND_CE_) - begin - if ((~DMA_OP_DONE||DMA_OP_DONE &&ADDR_pointer==2'h3&&WAIT_NUM==2&&(data_count < (READ_MAX_COUNT-3'h4))) && ~NAND_HIT ) - begin - NAND_DMA_REQ <= 1'b1; - end - else if(NAND_HIT && NAND_DMA_REQ) begin - NAND_DMA_REQ <= 1'b0; - DMA_OP_DONE <= 1'b1; - if(data_count == READ_MAX_COUNT -1'b1) begin - data_count <= READ_MAX_COUNT; - end - end - - if ((WAIT_NUM > (nand_timing[7:0]-HOLD_NUM+1'b1))&&(DMA_OP_DONE||NAND_HIT)) begin - NAND_RD_ <= 1'b1; - WAIT_NUM <= WAIT_NUM - 1'b1; - end - else if ((WAIT_NUM > 1) && (DMA_OP_DONE&&~NAND_DMA_REQ) ) - begin - NAND_RD_ <= 1'b0; - WAIT_NUM <= WAIT_NUM - 1'b1; - end - else if((WAIT_NUM==1)&& (DMA_OP_DONE)) - begin - NAND_RD_ <= 1'b1; - WAIT_NUM <= nand_timing[7:0]; - ADDR_pointer <= ADDR_pointer + 1'b1; - if(data_count!=READ_MAX_COUNT -1'b1) data_count <= data_count + 1'b1; - if(NAND_OP_NUM!=32'b0) NAND_OP_NUM <= NAND_OP_NUM - 1'b1; - if(ADDR_pointer==2'b0) NAND_DAT_O_RD[7:0] <= NAND_I; - else if(ADDR_pointer==2'b01) NAND_DAT_O_RD[15:8] <= NAND_I; - else if(ADDR_pointer==2'b10) NAND_DAT_O_RD[23:16] <= NAND_I; - else if(ADDR_pointer==2'b11) begin - NAND_DAT_O_RD[31:24] <= NAND_I; - DMA_OP_DONE <= 1'b0; - end - end - end - else - begin - NAND_DMA_REQ <= 1'b0; - data_count <= 14'b0; - NAND_STATE <= NAND_IDLE; - WAIT_NUM <= nand_timing[7:0]; - if(NAND_OP_NUM==32'b0) begin - NAND_GO <= 1'b0; - NAND_DONE <= 1'b1; - NAND_CE_ <= 1'b1; - end - else begin - NAND_GO <= 1'b1; - NAND_DONE <= 1'b0; - NAND_CE_ <= 1'b0; - end - end - end - - WRITE_START: begin - if(PRE_STATE == COMMAND_IN&&COMMAND!=8'h80) begin - NAND_CE_ <= 1'b0; - NAND_CLE <= 1'b0; - NAND_ALE <= 1'b0; - NAND_WR_ <= 1'b1; - WAIT_NUM <= nand_timing[7:0]; - PRE_STATE <= WRITE_START; - NAND_STATE<= COMMAND_IN; - COMMAND <= 8'h80; - end - else if(PRE_STATE == COMMAND_IN) begin - NAND_CE_ <= 1'b0; - NAND_CLE <= 1'b0; - NAND_ALE <= 1'b0; - NAND_WR_ <= 1'b1; - WAIT_NUM <= nand_timing[7:0]; - PRE_STATE <= WRITE_START; - NAND_STATE<= ADDR_4_RD_WR; - NAND_ADDR_COUNT <= (nand_size==4'h9||nand_size==4'ha||nand_size==4'hb) ? 3'b011 : (nand_size==4'h0||nand_size==4'hc||nand_size==4'hd) ? 3'b100:3'b101; - end - else if(PRE_STATE==ADDR_4_RD_WR) begin - NAND_CE_ <= 1'b0; - NAND_CLE <= 1'b0; - NAND_ALE <= 1'b0; - NAND_WR_ <= 1'b1; - ADDR_pointer<= 2'b0; - data_count <= 14'h0; - WAIT_NUM <= nand_timing[7:0]; - NAND_STATE <= WRITE_DATA; - case(nand_size) - 4'h9, - 4'ha, - 4'hb, - 4'hc, - 4'hd: - begin - NAND_ADDR[7:0] <= 8'h0; - NAND_ADDR[30:8] <= spare_op&& (~main_op)? (NAND_ADDR[30:8] +2'b10) : now_up_half ? NAND_ADDR[30:8] : (NAND_ADDR[30:8] +1'b1); - if(spare_op && main_op&&~now_oob) - WRITE_MAX_COUNT <= (NAND_OP_NUM>(256-NAND_ADDR[7:0]))? (256-NAND_ADDR[7:0]) : NAND_OP_NUM; - else if(now_oob) - WRITE_MAX_COUNT <= (NAND_OP_NUM>(16-NAND_ADDR[3:0])) ? (16-NAND_ADDR[3:0]) : NAND_OP_NUM; - else - WRITE_MAX_COUNT <= (NAND_OP_NUM>(256-NAND_ADDR[7:0]))? (256-NAND_ADDR[7:0]) : NAND_OP_NUM; - end - - 4'h0, - 4'h1, - 4'h2, - 4'h3: begin - NAND_ADDR[10:0] <= 11'h0; - NAND_ADDR[11] <= spare_op&(~main_op); - NAND_ADDR[35:16] <= NAND_ADDR[35:16] +1'b1; - if(spare_op && main_op) - WRITE_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[11:0]))? (op_scope-NAND_ADDR[11:0]) : NAND_OP_NUM; - else if(spare_op) - WRITE_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[5:0])) ? (op_scope-NAND_ADDR[5:0]) : NAND_OP_NUM; - else - WRITE_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[10:0]))? (op_scope-NAND_ADDR[10:0]) : NAND_OP_NUM; - end - 4'h4: begin - NAND_ADDR[11:0] <= 12'h0; - NAND_ADDR[12] <= spare_op&(~main_op); - NAND_ADDR[35:16] <= NAND_ADDR[35:16] +1'b1; - if(spare_op && main_op) - WRITE_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[12:0]))? (op_scope-NAND_ADDR[12:0]) : NAND_OP_NUM; - else if(spare_op) - WRITE_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[6:0])) ? (op_scope-NAND_ADDR[6:0]) : NAND_OP_NUM; - else - WRITE_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[11:0]))? (op_scope-NAND_ADDR[11:0]) : NAND_OP_NUM; - end - 4'h5, - 4'h6, - 4'h7: begin - NAND_ADDR[12:0] <= 13'h0; - NAND_ADDR[13] <= spare_op&(~main_op); - NAND_ADDR[35:16] <= NAND_ADDR[35:16] +1'b1; - if(spare_op && main_op) - WRITE_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[13:0]))? (op_scope-NAND_ADDR[13:0]) : NAND_OP_NUM; - else if(spare_op) - WRITE_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[7:0])) ? (op_scope-NAND_ADDR[7:0]) : NAND_OP_NUM; - else - WRITE_MAX_COUNT <= (NAND_OP_NUM>(op_scope-NAND_ADDR[12:0]))? (op_scope-NAND_ADDR[12:0]) : NAND_OP_NUM; - end - default: begin end - endcase - - end - end - - WRITE_DATA: - begin - if(data_count != WRITE_MAX_COUNT ) - begin - if(~DMA_OP_DONE&&~NAND_HIT) - NAND_DMA_REQ <= 1'b1; - else if(DMA_OP_DONE&&~NAND_HIT&&ADDR_pointer==2'h3&&WAIT_NUM==2&&(data_count < (WRITE_MAX_COUNT-3'h4))) - NAND_DMA_REQ <= 1'b1; - else if(NAND_DMA_REQ && NAND_HIT) begin - NAND_DMA_REQ <= 1'b0; - ADDR_pointer <= 2'b0; - DMA_OP_DONE <= 1'b1; - NAND_DAT_I_WR <= DAT_I; - end - - if ((WAIT_NUM > (nand_timing[7:0]-HOLD_NUM+1'b1))&&(DMA_OP_DONE||NAND_HIT)) begin - NAND_WR_ <= 1'b1; - WAIT_NUM <= WAIT_NUM - 1'b1; - end - else if ((WAIT_NUM > 1'b1) && DMA_OP_DONE) begin - NAND_WR_ <= 1'b0; - WAIT_NUM <= WAIT_NUM - 1'b1; - if (ADDR_pointer ==2'b0) - NAND_O <= NAND_DAT_I_WR[7:0]; - else if (ADDR_pointer ==2'b1) - NAND_O <= NAND_DAT_I_WR[15:8]; - else if (ADDR_pointer ==2'b10) - NAND_O<= NAND_DAT_I_WR[23:16]; - else if (ADDR_pointer ==2'b11) - begin - NAND_O <= NAND_DAT_I_WR[31:24]; - end - end - else if((WAIT_NUM == 1'b1)&&DMA_OP_DONE) begin - NAND_WR_ <= 1'b1; - WAIT_NUM <= nand_timing[7:0]; - ADDR_pointer <= ADDR_pointer + 1'b1; - if(ADDR_pointer ==2'b11) begin - DMA_OP_DONE <= 1'b0; - if(NAND_OP_NUM >=32'h4) - NAND_OP_NUM <= NAND_OP_NUM - 3'b100; - else - NAND_OP_NUM <= 32'h0; - if(NAND_OP_NUM == 32'h4) - data_count <= WRITE_MAX_COUNT; - else - data_count <= data_count + 3'b100; - end - end - end - else if(PRE_STATE != COMMAND_IN && COMMAND==8'h80) - begin - NAND_CE_ <= 1'b0; - NAND_CLE <= 1'b0; - NAND_ALE <= 1'b0; - NAND_WR_ <= 1'b1; - NAND_STATE <= COMMAND_IN; - PRE_STATE <= WRITE_DATA; - COMMAND <= 8'h10; - DMA_OP_DONE <= 1'b0; - WAIT_NUM <= nand_timing[7:0]; - end - else if(PRE_STATE == COMMAND_IN && COMMAND==8'h10) begin - NAND_CE_ <= 1'b0; - NAND_STATE <= NAND_IORDY ? WRITE_DATA:PROGRAM; - end - else if(PRE_STATE == PROGRAM && COMMAND==8'h10) begin - NAND_STATE <= COMMAND_IN; - PRE_STATE <= WRITE_DATA; - COMMAND <= 8'h70; - WAIT_NUM <= nand_timing[7:0]; - NAND_CE_ <= 1'b0; - end - else if(PRE_STATE == COMMAND_IN && COMMAND==8'h70) begin - NAND_CE_ <= 1'b0; - NAND_CLE <= 1'b0; - NAND_ALE <= 1'b0; - NAND_WR_ <= 1'b1; - NAND_RD_ <= 1'b1; - NAND_STATE<= READ_STATUS; - PRE_STATE <= WRITE_DATA; - WAIT_NUM <= nand_timing[7:0]+2'b11; - NAND_EN_ <= 1'b1; - end - else if(PRE_STATE == READ_STATUS) - begin - if(status[0]==0 && NAND_OP_NUM ==32'b0) - begin - NAND_STATE <= NAND_IDLE; - NAND_DONE <= 1'b1; - NAND_DMA_REQ <= 1'b0; - end - else if(status[0]==0) - begin - NAND_STATE <= NAND_IDLE; - NAND_DONE <= 1'b0; - end - else - begin - NAND_STATE <= PROGRAM_FAIL; - NAND_DONE <= 1'b1; - NAND_DMA_REQ<= 1'b0; - end - end - else - begin - NAND_STATE <= NAND_IDLE; - NAND_DONE <=1; - NAND_DMA_REQ <= 1'b0; - end - end - PROGRAM: - begin - if(NAND_IORDY==1'b0) begin - NAND_STATE <= PROGRAM; - end - else begin - PRE_STATE <= PROGRAM; - NAND_STATE <= WRITE_DATA; - DMA_OP_DONE <= 1'b0; - end - end - RESET: - begin - if(NAND_IORDY==1'b1) begin - NAND_STATE <= RESET; - end - else begin - NAND_STATE <= WAIT_RESET; - PRE_STATE <= RESET; - end - end - WAIT_RESET: - begin - if(NAND_IORDY) begin - NAND_STATE <= NAND_IDLE; - PRE_STATE <= WAIT_RESET; - NAND_CE_ <= 1'b1; - NAND_DONE <= 1'b1; - NAND_GO <= 1'b0; - end - else - NAND_STATE <= WAIT_RESET; - end - - READ_STATUS: - begin - if(WAIT_NUM >= (nand_timing[7:0]- HOLD_NUM+1'b1)) begin - WAIT_NUM <= WAIT_NUM - 1'b1; - NAND_STATE <= READ_STATUS; - NAND_RD_ <= 1'b1; - NAND_EN_ <= 1'b1; - end - else if(WAIT_NUM && WAIT_NUM >1 ) begin - WAIT_NUM <= WAIT_NUM - 1'b1; - NAND_STATE <= READ_STATUS; - NAND_RD_ <= 1'b0; - NAND_EN_ <= 1'b1; - end - else if(WAIT_NUM == 1) begin - WAIT_NUM <= WAIT_NUM - 1'b1; - NAND_STATE <= READ_STATUS; - status <= NAND_I; - NAND_RD_ <= 1'b1; - NAND_EN_ <= 1'b1; - end - else if(WAIT_NUM==8'b0) begin - NAND_RD_ <= 1'b1; - NAND_CE_ <= 1'b0; - PRE_STATE <= READ_STATUS; - NAND_STATE <= PRE_STATE; - WAIT_NUM <= nand_timing[7:0]; - if(PRE_STATE == 5'h1) - NAND_DONE <= 1'b1; - end - else begin - WAIT_NUM <= WAIT_NUM - 1'b1; - NAND_STATE <= READ_STATUS; - NAND_RD_ <= 1'b1; - NAND_EN_ <= 1'b1; - end - end - - PROGRAM_FAIL,ERASE_FAIL: - begin - NAND_STATE <= NAND_IDLE; - NAND_CE_ <= 1'b1; - NAND_DONE <= 1'b1; - end - ERASE: - begin - if( (PRE_STATE != ADDR_4_ERASE_ID) && (COMMAND == 8'h60) ) - begin - NAND_STATE <= ADDR_4_ERASE_ID; - PRE_STATE <= ERASE; - WAIT_NUM <= nand_timing[7:0]; - NAND_ADDR_COUNT <= (nand_size==4'h9||nand_size==4'ha||nand_size==4'hb||nand_size==4'h0) ? 3'b10:3'b011; - end - else if( (PRE_STATE != COMMAND_IN) && (COMMAND == 8'h60) ) - begin - NAND_STATE <= COMMAND_IN; - PRE_STATE <= ERASE; - COMMAND <= 8'hD0; - WAIT_NUM <= nand_timing[7:0]; - end - else if(PRE_STATE==COMMAND_IN && COMMAND== 8'hd0) - begin - NAND_STATE <= NAND_IORDY ? ERASE : WAIT_ERASE; - end - end - WAIT_ERASE: - begin - if(NAND_IORDY==1'b0) begin - NAND_STATE <= WAIT_ERASE; - end - else if(NAND_IORDY && PRE_STATE == COMMAND_IN && COMMAND == 8'h60) - begin - NAND_STATE <= ERASE; - PRE_STATE <= WAIT_ERASE; - end - else if(NAND_IORDY && COMMAND ==8'hd0 ) - begin - NAND_OP_NUM <= NAND_OP_NUM - 1'b1; - NAND_STATE <= COMMAND_IN; - PRE_STATE <= WAIT_ERASE; - COMMAND <= 8'h70; - WAIT_NUM <= nand_timing[7:0]; - NAND_CE_ <= 1'b0; - end - else if(NAND_IORDY && PRE_STATE == COMMAND_IN && COMMAND==8'h70) - begin - NAND_CE_ <= 1'b0; - NAND_CLE <= 1'b0; - NAND_ALE <= 1'b0; - NAND_WR_ <= 1'b1; - NAND_RD_ <= 1'b1; - NAND_STATE<= READ_STATUS; - PRE_STATE <= WAIT_ERASE; - WAIT_NUM <= nand_timing[7:0]+2'b11; - NAND_EN_ <= 1'b1; - end - else if(NAND_IORDY && PRE_STATE == READ_STATUS) - begin - if(status[0]==1'b0 && (NAND_OP_NUM==32'b0 || ERASE_SERIAL == 1'b0) ) - begin - NAND_STATE <= NAND_IDLE; - NAND_CE_ <= 1'b1; - NAND_DONE <= 1'b1; - NAND_ADDR <= 36'h0; - ERASE_SERIAL<= 1'b0; - end - else if(status[0]== 1'b0 && NAND_OP_NUM!=32'b0) - begin - NAND_STATE <= COMMAND_IN; - PRE_STATE <= WAIT_ERASE; - COMMAND <= 8'h60; - NAND_DONE <= 1'b0; - WAIT_NUM <= nand_timing[7:0]; - NAND_CE_ <= 1'b0; - NAND_EN_ <= 1'b0; - if(nand_size[3]) NAND_ADDR[27:14] <= NAND_ADDR[27:14] + 1'b1; - else if(nand_size==4'h1||nand_size==4'h2||nand_size==4'h3) NAND_ADDR[35:22] <= NAND_ADDR[35:22] + 1'b1; - else if(nand_size==4'h4) NAND_ADDR[33:22] <= NAND_ADDR[33:22] + 1'b1; - else if(nand_size==4'h5) NAND_ADDR[33:24] <= NAND_ADDR[33:24] + 1'b1; - else NAND_ADDR[35:25] <= NAND_ADDR[35:25] + 1'b1; - end - else - begin - NAND_STATE <= ERASE_FAIL; - NAND_DONE <= 1'b1; - end - end - else begin - NAND_STATE <= NAND_IDLE; - NAND_CE_ <= 1'b1; - NAND_DONE <= 1'b1; - end - end - READ_ID: - begin - if((PRE_STATE != ADDR_4_ERASE_ID) && COMMAND == 8'h90) - begin - NAND_STATE <= ADDR_4_ERASE_ID; - PRE_STATE <= READ_ID; - WAIT_NUM <= nand_timing[7:0]+1'b1; - READ_ID_NUM <= nand_id_num; - NAND_ADDR_COUNT <= 3'b1; - end - else if (COMMAND != 8'h70) - begin - if (READ_ID_NUM!=3'b0) - begin - NAND_EN_ <= 1'b1; - if(WAIT_NUM>(nand_timing[7:0]+1'b1-HOLD_NUM)) - begin - NAND_RD_ <= 1'b1; - WAIT_NUM <= WAIT_NUM - 1'b1; - NAND_STATE<= READ_ID; - end - else if (WAIT_NUM > 1) - begin - WAIT_NUM <= WAIT_NUM - 1'b1; - NAND_RD_ <= 1'b0; - NAND_STATE<= READ_ID; - end - else if(WAIT_NUM==1) - begin - NAND_STATE <= READ_ID; - NAND_RD_ <= 1'b1; - WAIT_NUM <= nand_timing[7:0]; - READ_ID_NUM <= READ_ID_NUM - 2'b1; - if (READ_ID_NUM==3'b01) - ID_INFORM[7:0] <= NAND_I; - else if (READ_ID_NUM==3'b10) - ID_INFORM[15:8] <= NAND_I; - else if (READ_ID_NUM==3'b11) - ID_INFORM[23:16] <= NAND_I; - else if (READ_ID_NUM==3'b100) - ID_INFORM[31:24] <= NAND_I; - else if (READ_ID_NUM==3'b101) - ID_INFORM[39:32] <= NAND_I; - else if (READ_ID_NUM==3'b110) - ID_INFORM[47:40] <= NAND_I; - end - end - else - begin - NAND_STATE <= COMMAND_IN; - PRE_STATE <= READ_ID; - COMMAND <= 8'h70; - WAIT_NUM <= nand_timing[7:0]; - NAND_CE_ <= 1'b0; - NAND_EN_ <= 1'b0; - end - end - else - begin - NAND_STATE <= ID_TO_STATUS; - PRE_STATE <= READ_ID; - NAND_EN_ <= 1'b1; - COMMAND <= 8'h70; - end - end - ID_TO_STATUS: - begin - if(PRE_STATE != READ_STATUS) - begin - NAND_CE_ <= 1'b0; - NAND_CLE <= 1'b0; - NAND_ALE <= 1'b0; - NAND_WR_ <= 1'b1; - NAND_RD_ <= 1'b1; - NAND_STATE<= READ_STATUS; - PRE_STATE <= ID_TO_STATUS; - WAIT_NUM <= nand_timing[7:0]+2'b11; - NAND_EN_ <= 1'b1; - end - else - begin - NAND_DONE <= 1'b1; - NAND_GO <= 1'b0; - NAND_STATE <= NAND_IDLE; - NAND_CE_ <= 1'b1; - end - end - default : - begin - NAND_STATE <= NAND_IDLE; - NAND_CE_ <= 1'b1; - NAND_GO <= 1'b0; - NAND_DONE <= 1'b0; - NAND_DMA_REQ <= 1'b0; - end - endcase - end -end -endmodule diff --git a/resources/soc/rtl/APB_DEV/URT/raminfr.v b/resources/soc/rtl/APB_DEV/URT/raminfr.v deleted file mode 100644 index ddb6ae5..0000000 --- a/resources/soc/rtl/APB_DEV/URT/raminfr.v +++ /dev/null @@ -1,62 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -module raminfr(clk, we, a, dpra, di, dpo); - -parameter addr_width = 4; -parameter data_width = 8; -parameter depth = 16; - -input clk; -input we; -input [addr_width-1:0] a; -input [addr_width-1:0] dpra; -input [data_width-1:0] di; -output [data_width-1:0] dpo; -reg [data_width-1:0] ram [depth-1:0]; - -wire [data_width-1:0] di; -wire [addr_width-1:0] a; -wire [addr_width-1:0] dpra; - -always @(posedge clk) begin - if (we) - ram[a] <= di; -end -reg [data_width-1:0] dpo; - -always @(posedge clk) - dpo <= ram[dpra]; - -endmodule - diff --git a/resources/soc/rtl/APB_DEV/URT/uart_defines.h b/resources/soc/rtl/APB_DEV/URT/uart_defines.h deleted file mode 100644 index 76cd1dd..0000000 --- a/resources/soc/rtl/APB_DEV/URT/uart_defines.h +++ /dev/null @@ -1,119 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -`define UART_ADDR_WIDTH 3 -`define UART_DATA_WIDTH 8 - -// Register addresses -`define UART_REG_RB `UART_ADDR_WIDTH'd0 // receiver buffer -`define UART_REG_TR `UART_ADDR_WIDTH'd0 // transmitter -`define UART_REG_IE `UART_ADDR_WIDTH'd1 // Interrupt enable -`define UART_REG_II `UART_ADDR_WIDTH'd2 // Interrupt identification -`define UART_REG_FC `UART_ADDR_WIDTH'd2 // FIFO control -`define UART_REG_LC `UART_ADDR_WIDTH'd3 // Line Control -`define UART_REG_MC `UART_ADDR_WIDTH'd4 // Modem control -`define UART_REG_LS `UART_ADDR_WIDTH'd5 // Line status -`define UART_REG_MS `UART_ADDR_WIDTH'd6 // Modem status -`define UART_REG_SR `UART_ADDR_WIDTH'd7 // Scratch register -`define UART_REG_DL1 `UART_ADDR_WIDTH'd0 // Divisor latch bytes (1-2) -`define UART_REG_DL2 `UART_ADDR_WIDTH'd1 - -// Interrupt Enable register bits -`define UART_IE_RDA 0 // Received Data available interrupt -`define UART_IE_THRE 1 // Transmitter Holding Register empty interrupt -`define UART_IE_RLS 2 // Receiver Line Status Interrupt -`define UART_IE_MS 3 // Modem Status Interrupt - -// Interrupt Identification register bits -`define UART_II_IP 0 // Interrupt pending when 0 -`define UART_II_II 3:1 // Interrupt identification - -// Interrupt identification values for bits 3:1 -`define UART_II_RLS 3'b011 // Receiver Line Status -`define UART_II_RDA 3'b010 // Receiver Data available -`define UART_II_TI 3'b110 // Timeout Indication -`define UART_II_THRE 3'b001 // Transmitter Holding Register empty -`define UART_II_MS 3'b000 // Modem Status - -// FIFO Control Register bits -`define UART_FC_TL 1:0 // Trigger level - -// FIFO trigger level values -`define UART_FC_1 2'b00 -`define UART_FC_4 2'b01 -`define UART_FC_8 2'b10 -`define UART_FC_14 2'b11 - -// Line Control register bits -`define UART_LC_BITS 1:0 // bits in character -`define UART_LC_SB 2 // stop bits -`define UART_LC_PE 3 // parity enable -`define UART_LC_EP 4 // even parity -`define UART_LC_SP 5 // stick parity -`define UART_LC_BC 6 // Break control -`define UART_LC_DL 7 // Divisor Latch access bit - -// Modem Control register bits -`define UART_MC_DTR 0 -`define UART_MC_RTS 1 -`define UART_MC_OUT1 2 -`define UART_MC_OUT2 3 -`define UART_MC_LB 4 // Loopback mode - -// Line Status Register bits -`define UART_LS_DR 0 // Data ready -`define UART_LS_OE 1 // Overrun Error -`define UART_LS_PE 2 // Parity Error -`define UART_LS_FE 3 // Framing Error -`define UART_LS_BI 4 // Break interrupt -`define UART_LS_TFE 5 // Transmit FIFO is empty -`define UART_LS_TE 6 // Transmitter Empty indicator -`define UART_LS_EI 7 // Error indicator - -// Modem Status Register bits -`define UART_MS_DCTS 0 // Delta signals -`define UART_MS_DDSR 1 -`define UART_MS_TERI 2 -`define UART_MS_DDCD 3 -`define UART_MS_CCTS 4 // Complement signals -`define UART_MS_CDSR 5 -`define UART_MS_CRI 6 -`define UART_MS_CDCD 7 - -// FIFO parameter defines - -`define UART_FIFO_WIDTH 8 -`define UART_FIFO_DEPTH 16 -`define UART_FIFO_POINTER_W 4 -`define UART_FIFO_COUNTER_W 5 -`define UART_FIFO_REC_WIDTH 11 diff --git a/resources/soc/rtl/APB_DEV/URT/uart_receiver.v b/resources/soc/rtl/APB_DEV/URT/uart_receiver.v deleted file mode 100644 index e09d50d..0000000 --- a/resources/soc/rtl/APB_DEV/URT/uart_receiver.v +++ /dev/null @@ -1,288 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -`include "uart_defines.h" - -module uart_receiver (clk, wb_rst_i, lcr, rf_pop, srx_pad_i, enable, - counter_t, rf_count, rf_data_out, rf_error_bit, - rf_overrun, rx_reset, lsr_mask, rstate, rf_push_pulse); - -input clk; -input wb_rst_i; -input [7:0] lcr; -input rf_pop; -input srx_pad_i; -input enable; -input rx_reset; -input lsr_mask; - -output [9:0] counter_t; -output [`UART_FIFO_COUNTER_W-1:0] rf_count; -output [`UART_FIFO_REC_WIDTH-1:0] rf_data_out; -output rf_overrun; -output rf_error_bit; -output [3:0] rstate; -output rf_push_pulse; - -reg [3:0] rstate; -reg [3:0] rcounter16; -reg [2:0] rbit_counter; -reg [7:0] rshift; -reg rparity; -reg rparity_error; -reg rframing_error; -reg rbit_in; -reg rparity_xor; -reg [7:0] counter_b; -reg rf_push_q; - -reg [`UART_FIFO_REC_WIDTH-1:0] rf_data_in; -wire[`UART_FIFO_REC_WIDTH-1:0] rf_data_out; -wire rf_push_pulse; -reg rf_push; -wire rf_pop; -wire rf_overrun; -wire[`UART_FIFO_COUNTER_W-1:0] rf_count; -wire rf_error_bit; -wire break_error = (counter_b == 0); - -uart_rfifo #(`UART_FIFO_REC_WIDTH) fifo_rx( - .clk ( clk ), - .wb_rst_i ( wb_rst_i ), - .data_in ( rf_data_in ), - .data_out ( rf_data_out ), - .push ( rf_push_pulse), - .pop ( rf_pop ), - .overrun ( rf_overrun ), - .count ( rf_count ), - .error_bit ( rf_error_bit ), - .fifo_reset ( rx_reset ), - .reset_status( lsr_mask ) -); - -wire rcounter16_eq_7 = (rcounter16 == 4'd7); -wire rcounter16_eq_0 = (rcounter16 == 4'd0); -wire rcounter16_eq_1 = (rcounter16 == 4'd1); - -wire [3:0] rcounter16_minus_1 = rcounter16 - 1'b1; - -parameter sr_idle = 4'd0; -parameter sr_rec_start = 4'd1; -parameter sr_rec_bit = 4'd2; -parameter sr_rec_parity = 4'd3; -parameter sr_rec_stop = 4'd4; -parameter sr_check_parity = 4'd5; -parameter sr_rec_prepare = 4'd6; -parameter sr_end_bit = 4'd7; -parameter sr_ca_lc_parity = 4'd8; -parameter sr_wait1 = 4'd9; -parameter sr_push = 4'd10; - - -always @(posedge clk ) begin - if (wb_rst_i) begin - rstate <= sr_idle; - rbit_in <= 1'b0; - rcounter16 <= 0; - rbit_counter <= 0; - rparity_xor <= 1'b0; - rframing_error <= 1'b0; - rparity_error <= 1'b0; - rparity <= 1'b0; - rshift <= 0; - rf_push <= 1'b0; - rf_data_in <= 0; - end - else if (enable) begin - case (rstate) - sr_idle : begin - rf_push <= 1'b0; - rf_data_in <= 0; - rcounter16 <= 4'b1110; - if (srx_pad_i==1'b0 & ~break_error) begin - rstate <= sr_rec_start; - end - end - sr_rec_start : begin - rf_push <= 1'b0; - if (rcounter16_eq_7) - if (srx_pad_i==1'b1) - rstate <= sr_idle; - else - rstate <= sr_rec_prepare; - else rstate<=rstate; - rcounter16 <= rcounter16_minus_1; - end - sr_rec_prepare: begin - case (lcr[1:0]) - 2'b00 : rbit_counter <= 3'b100; - 2'b01 : rbit_counter <= 3'b101; - 2'b10 : rbit_counter <= 3'b110; - 2'b11 : rbit_counter <= 3'b111; - endcase - if (rcounter16_eq_0) begin - rstate <= sr_rec_bit; - rcounter16 <= 4'b1110; - rshift <= 0; - end - else - rstate <= sr_rec_prepare; - rcounter16 <= rcounter16_minus_1; - end - sr_rec_bit : begin - if (rcounter16_eq_0) rstate <= sr_end_bit; - if (rcounter16_eq_7) - case (lcr[1:0]) - 2'b00 : rshift[4:0] <= {srx_pad_i, rshift[4:1]}; - 2'b01 : rshift[5:0] <= {srx_pad_i, rshift[5:1]}; - 2'b10 : rshift[6:0] <= {srx_pad_i, rshift[6:1]}; - 2'b11 : rshift[7:0] <= {srx_pad_i, rshift[7:1]}; - endcase - rcounter16 <= rcounter16_minus_1; - end - sr_end_bit : begin - if (rbit_counter==3'b0) - if (lcr[`UART_LC_PE]) - rstate <= sr_rec_parity; - else begin - rstate <= sr_rec_stop; - rparity_error<= 1'b0; - end - else begin - rstate <= sr_rec_bit; - rbit_counter <= rbit_counter - 1'b1; - end - rcounter16 <= 4'b1110; - end - sr_rec_parity : begin - if (rcounter16_eq_7) begin - rparity <= srx_pad_i; - rstate <= sr_ca_lc_parity; - end - rcounter16 <= rcounter16_minus_1; - end - sr_ca_lc_parity:begin - rcounter16 <= rcounter16_minus_1; - rparity_xor <= ^{rshift,rparity}; - rstate <= sr_check_parity; - end - sr_check_parity: begin - case ({lcr[`UART_LC_EP],lcr[`UART_LC_SP]}) - 2'b00: rparity_error <= rparity_xor == 0; - 2'b01: rparity_error <= ~rparity; - 2'b10: rparity_error <= rparity_xor == 1; - 2'b11: rparity_error <= rparity; - endcase - rcounter16 <= rcounter16_minus_1; - rstate <= sr_wait1; - end - sr_wait1 : - if (rcounter16_eq_0) begin - rstate <= sr_rec_stop; - rcounter16 <= 4'b1110; - end - else rcounter16 <= rcounter16_minus_1; - sr_rec_stop : begin - if (rcounter16_eq_7) begin - rframing_error <= !srx_pad_i; - rstate <= sr_push; - end - rcounter16 <= rcounter16_minus_1; - end - sr_push : begin - if(srx_pad_i | break_error) begin - if(break_error) - rf_data_in <= {8'b0, 3'b100}; - else - rf_data_in <= {rshift, 1'b0, rparity_error, rframing_error}; - rf_push <= 1'b1; - rstate <= sr_idle; - end - else if(~rframing_error) begin - rf_data_in <= {rshift, 1'b0, rparity_error, rframing_error}; - rf_push <= 1'b1; - rcounter16 <= 4'b1110; - rstate <= sr_rec_start; - end - - end - default : rstate <= sr_idle; - endcase - end -end - -always @ (posedge clk ) begin - if(wb_rst_i) rf_push_q <= 0; - else rf_push_q <= rf_push; -end - -assign rf_push_pulse = rf_push & ~rf_push_q; - - -reg [9:0] toc_value; - -always @(lcr) - case (lcr[3:0]) - 4'b0000 : toc_value = 447; - 4'b0100 : toc_value = 479; - 4'b0001, 4'b1000 : toc_value = 511; - 4'b1100 : toc_value = 543; - 4'b0010, 4'b0101, 4'b1001 : toc_value = 575; - 4'b0011, 4'b0110, 4'b1010, 4'b1101 : toc_value = 639; - 4'b0111, 4'b1011, 4'b1110 : toc_value = 703; - 4'b1111 : toc_value = 767; - endcase - -wire [7:0] brc_value; -assign brc_value = toc_value[9:2]; - -always @(posedge clk ) begin - if (wb_rst_i) counter_b <= 8'd159; - else if (srx_pad_i) counter_b <= brc_value; - else if (enable & counter_b != 8'b0) - counter_b <= counter_b - 1; -end - - -reg [9:0] counter_t; - -always @(posedge clk ) begin - if (wb_rst_i) counter_t <= 10'd639; - else if(rf_push_pulse || rf_pop || rf_count == 0) - counter_t <= toc_value; - else if (enable && counter_t != 10'b0) - counter_t <= counter_t - 1; -end - -endmodule - diff --git a/resources/soc/rtl/APB_DEV/URT/uart_regs.v b/resources/soc/rtl/APB_DEV/URT/uart_regs.v deleted file mode 100644 index 63757cd..0000000 --- a/resources/soc/rtl/APB_DEV/URT/uart_regs.v +++ /dev/null @@ -1,711 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -`include "uart_defines.h" - -`define UART_DL1 7:0 -`define UART_DL2 15:8 -`define UART_DL3 23:16 -module uart_regs (clk, rst, clk_carrier, - addr, dat_i, dat_o, we, re, - - modem_inputs, - rts_pad_o, dtr_pad_o, - stx_pad_o,TXD_i,srx_pad_i,RXD_o, - int_o, - usart_mode, - rx_en, - tx2rx_en -); -input clk; -input rst ; -input clk_carrier; -input [2:0] addr; -input [7:0] dat_i; -output [7:0] dat_o; -input we; -input re; - -output stx_pad_o; -input srx_pad_i; -input TXD_i; -output RXD_o; - -input [3:0] modem_inputs; -output rts_pad_o; -output dtr_pad_o; -output int_o; - -output usart_mode; -output tx2rx_en; -output rx_en; - -wire [3:0] modem_inputs; -reg enable; - -wire stx_pad_o; -wire srx_pad_i; -wire srx_pad; - -reg [7:0] dat_o; - -wire [2:0] addr; -wire [7:0] dat_i; - -reg [3:0] ier; -reg [3:0] iir; -reg [1:0] fcr; -reg [4:0] mcr; -reg infrared; -reg rx_pol; -reg [7:0] lcr; -reg [7:0] msr; -reg [23:0] dl; -reg start_dlc; -reg lsr_mask_d; -reg msi_reset; - -reg [15:0] dlc; -reg int_o; - -reg [3:0] trigger_level; -reg rx_reset; -reg tx_reset; -wire dlab; - -wire usart_mode; -wire usart_rx_en; -wire usart_tx_en; -wire tx2rx_en; -reg sclk_reg; -reg sclk_en_reg; -reg [7:0] mode_reg; -reg [7:0] fi_di_reg; -reg [7:0] sclk_count; -reg [2:0] repeat_reg; - -wire usart_normal; -wire usart_irda; -wire usart_t0; -wire usart_t1; -wire rx_en; -wire tx_en; -wire sclk_por; - -assign usart_normal = mode_reg[1:0]==2'h0; -assign usart_irda = mode_reg[1:0]==2'h1; -assign usart_t0 = mode_reg[1:0]==2'h2; -assign usart_t1 = mode_reg[1:0]==2'h3; -assign usart_tx_en = mode_reg[2]==1'b0; -assign usart_rx_en = mode_reg[2]==1'b1; -assign sclk_por = mode_reg[3]; -assign RXD_o = sclk_reg^sclk_por; - -assign usart_mode = usart_t0 || usart_t1; -assign rx_en = usart_normal || usart_irda || usart_mode && usart_rx_en; -assign tx_en = usart_normal || usart_irda || usart_mode && usart_tx_en; - - -always @(posedge clk ) -begin - if (rst) begin - mode_reg <= 8'h0; - fi_di_reg <= 8'h0; - repeat_reg<= 3'h4; - sclk_en_reg<= 1'b0; - end - else if (we && addr==`UART_REG_SR)begin - if(dlab) - fi_di_reg <= dat_i; - else - mode_reg <= dat_i; - end - else begin - if(enable) sclk_en_reg <= mode_reg[4]; - repeat_reg <= mode_reg[7:5]; - end -end - -always @(posedge clk) -begin - if(rst) begin - sclk_count <= 8'b0; - sclk_reg <=1'b0; - end - else if(usart_mode&&(fi_di_reg>8'h1)&&sclk_en_reg) begin - if(sclk_count == fi_di_reg[7:1]) begin - sclk_reg <= 1'b1; - sclk_count <= sclk_count + 1'b1; - end - else if(sclk_count == fi_di_reg) begin - sclk_reg <= 1'b0; - sclk_count <= 8'b0; - end - else begin - sclk_count <= sclk_count + 1'b1; - end - end - else begin - sclk_reg <=1'b0; - sclk_count <= 8'b0; - end -end - -wire cts_pad_i, dsr_pad_i, ri_pad_i, dcd_pad_i; -wire loopback; -wire cts, dsr, ri, dcd; -wire cts_c, dsr_c, ri_c, dcd_c; -wire rts_pad_o, dtr_pad_o; - -wire [7:0] lsr; -wire lsr0, lsr1, lsr2, lsr3, lsr4, lsr5, lsr6, lsr7; -reg lsr0r, lsr1r, lsr2r, lsr3r, lsr4r, lsr5r, lsr6r, lsr7r; -wire lsr_mask; - -assign lsr[7:0] = { lsr7r, lsr6r, lsr5r, lsr4r, lsr3r, lsr2r, lsr1r, lsr0r }; - -assign {cts_pad_i, dsr_pad_i, ri_pad_i, dcd_pad_i} = modem_inputs; -assign {cts, dsr, ri, dcd} = ~{cts_pad_i,dsr_pad_i,ri_pad_i,dcd_pad_i}; - -assign {cts_c, dsr_c, ri_c, dcd_c} = loopback ? {mcr[`UART_MC_RTS],mcr[`UART_MC_DTR],mcr[`UART_MC_OUT1],mcr[`UART_MC_OUT2]} - : {cts_pad_i,dsr_pad_i,ri_pad_i,dcd_pad_i}; - -assign dlab = lcr[`UART_LC_DL]; -assign loopback = mcr[4]; - -assign rts_pad_o = mcr[`UART_MC_RTS]; -assign dtr_pad_o = mcr[`UART_MC_DTR]; - -wire rls_int; -wire rda_int; -wire ti_int; -wire thre_int; -wire ms_int; - -wire tf_push; -reg rf_pop; -wire [`UART_FIFO_REC_WIDTH-1:0] rf_data_out; -wire rf_error_bit; -wire [`UART_FIFO_COUNTER_W-1:0] rf_count; -wire [`UART_FIFO_COUNTER_W-1:0] tf_count; -wire [2:0] tstate; -wire [3:0] rstate; -wire [9:0] counter_t; - -wire thre_set_en; -reg [7:0] block_cnt; -reg [7:0] block_value; -wire current_finish; -wire max_repeat_time; - -wire serial_out; -wire serial_out_modulated = ~ (clk_carrier & serial_out); - -uart_transmitter transmitter(.clk(clk), .wb_rst_i(rst), .lcr(lcr), .tf_push(tf_push), .wb_dat_i(dat_i), - - .tx2rx_en (tx2rx_en), - .usart_mode(usart_mode), - .srx_pad_i(TXD_i), - .enable (enable && tx_en), - .usart_t0(usart_t0), - .repeat_time(repeat_reg ), - .current_finish(current_finish), - .max_repeat_time(max_repeat_time), - - .stx_pad_o(serial_out), .tstate(tstate), .tf_count(tf_count), - .tx_reset(tx_reset), .lsr_mask(lsr_mask)); -wire rcv_pad_i; -assign rcv_pad_i = ~usart_mode ? srx_pad_i : (rx_en ? TXD_i : 1'b1); - -uart_sync_flops i_uart_sync_flops( - .rst_i (rst), - .clk_i (clk), - .stage1_rst_i (1'b0), - .stage1_clk_en_i (1'b1), - .async_dat_i (rcv_pad_i), - .sync_dat_o (srx_pad) - ); - - defparam i_uart_sync_flops.width = 1; - defparam i_uart_sync_flops.init_value = 1'b1; -wire serial_in = loopback ? serial_out : rx_pol ? ~srx_pad : srx_pad; -assign stx_pad_o = loopback ? 1'b1 : infrared ? serial_out_modulated : serial_out; - -wire rf_overrun; -wire rf_push_pulse; -uart_receiver receiver(.clk(clk), .wb_rst_i(rst), .lcr(lcr), .rf_pop(rf_pop), .srx_pad_i(serial_in), - .enable(enable && rx_en), - .counter_t(counter_t), .rf_count(rf_count), .rf_data_out(rf_data_out), .rf_error_bit(rf_error_bit), - .rf_overrun(rf_overrun), .rx_reset(rx_reset), .lsr_mask(lsr_mask), .rstate(rstate), .rf_push_pulse(rf_push_pulse)); - - -always @(dl or dlab or ier or iir or fi_di_reg or mode_reg - or lcr or lsr or msr or rf_data_out or addr ) -begin - case (addr) - `UART_REG_RB : dat_o = dlab ? dl[`UART_DL1] : rf_data_out[10:3]; - `UART_REG_IE : dat_o = dlab ? dl[`UART_DL2] : ier; - `UART_REG_II : dat_o = dlab ? dl[`UART_DL3] : {4'b1100,iir}; - `UART_REG_LC : dat_o = lcr; - `UART_REG_LS : dat_o = lsr; - `UART_REG_MS : dat_o = msr; - `UART_REG_SR : dat_o = dlab ? fi_di_reg : mode_reg; - default : dat_o = 8'b0; - endcase -end - -always @(posedge clk ) -begin - if (rst) - rf_pop <= 0; - else - if (rf_pop) - rf_pop <= 0; - else - if (re && addr == `UART_REG_RB && !dlab) - rf_pop <= 1; -end - -wire lsr_mask_condition; -wire iir_read; -wire msr_read; -wire fifo_read; -wire fifo_write; - -assign lsr_mask_condition = (re && addr == `UART_REG_LS && !dlab); -assign iir_read = (re && addr == `UART_REG_II && !dlab); -assign msr_read = (re && addr == `UART_REG_MS && !dlab); -assign fifo_read = (re && addr == `UART_REG_RB && !dlab); -assign fifo_write = (we && addr == `UART_REG_TR && !dlab); - -always @(posedge clk ) -begin - if (rst) - lsr_mask_d <= 0; - else - lsr_mask_d <= lsr_mask_condition; -end - -assign lsr_mask = lsr_mask_condition && ~lsr_mask_d; - -always @(posedge clk ) -begin - if (rst) - msi_reset <= 1; - else - if (msi_reset) - msi_reset <= 0; - else - if (msr_read) - msi_reset <= 1; -end - -always @(posedge clk ) - if (rst) - lcr <= 8'b00000011; - else - if (we && addr==`UART_REG_LC) - lcr <= dat_i; - -always @(posedge clk ) - if (rst) - begin - ier <= 4'b0000; - dl[`UART_DL2] <= 8'b0; - end - else - if (we && addr==`UART_REG_IE) - if (dlab) - begin - dl[`UART_DL2] <= dat_i; - end - else - ier <= dat_i[3:0]; - else - ier<= ier; - -always @(posedge clk ) - if (rst) begin - fcr <= 2'b11; - rx_reset <= 0; - tx_reset <= 0; - dl[`UART_DL3] <= 8'h0; - end else - if (we && addr==`UART_REG_FC) begin - if(dlab) dl[`UART_DL3] <= dat_i; - else begin - fcr <= dat_i[7:6]; - rx_reset <= dat_i[1]; - tx_reset <= dat_i[2]; - end - end else begin - rx_reset <= 0; - tx_reset <= 0; - end - -always @(posedge clk ) - if (rst) begin - mcr <= 5'b0; - infrared <= 1'b0; - rx_pol <= 1'b0; end - else - if(we && addr==`UART_REG_MC) begin - mcr <= dat_i[4:0]; - infrared <= dat_i[7]; - rx_pol <= dat_i[6]; end - -assign tf_push = we & addr==`UART_REG_TR & !dlab; -always @(posedge clk ) - if (rst) - begin - dl[`UART_DL1] <= 8'b0; - start_dlc <= 1'b0; - end - else - if (we && addr==`UART_REG_TR) - if (dlab) - begin - dl[`UART_DL1] <= dat_i; - start_dlc <= 1'b1; - end - else - begin - start_dlc <= 1'b0; - end - else - begin - start_dlc <= 1'b0; - end - -always @(fcr) - case (fcr[`UART_FC_TL]) - 2'b00 : trigger_level = 1; - 2'b01 : trigger_level = 4; - 2'b10 : trigger_level = 8; - 2'b11 : trigger_level = 14; - endcase - -reg [3:0] delayed_modem_signals; -always @(posedge clk ) -begin - if (rst) - begin - msr <= 0; - delayed_modem_signals[3:0] <= 0; - end - else begin - msr[`UART_MS_DDCD:`UART_MS_DCTS] <= msi_reset ? 4'b0 : - msr[`UART_MS_DDCD:`UART_MS_DCTS] | ({dcd, ri, dsr, cts} ^ delayed_modem_signals[3:0]); - msr[`UART_MS_CDCD:`UART_MS_CCTS] <= {dcd_c, ri_c, dsr_c, cts_c}; - delayed_modem_signals[3:0] <= {dcd, ri, dsr, cts}; - end -end - -assign lsr0 = (rf_count==0 && rf_push_pulse); -assign lsr1 = rf_overrun; -assign lsr2 = rf_data_out[1]; -assign lsr3 = rf_data_out[0]; -assign lsr4 = rf_data_out[2]; -assign lsr5 = current_finish && (tf_count==5'b0 && thre_set_en); -assign lsr6 = (tf_count==5'b0 && thre_set_en && (tstate == 3'd0)); -assign lsr7 = rf_error_bit | rf_overrun; - -reg lsr0_d; - -always @(posedge clk ) - if (rst) lsr0_d <= 0; - else lsr0_d <= lsr0; - -always @(posedge clk ) - if (rst) lsr0r <= 0; - else lsr0r <= (rf_count==1 && rf_pop && !rf_push_pulse || rx_reset) ? 0 : - lsr0r || (lsr0 && ~lsr0_d); - -reg lsr1_d; - -always @(posedge clk ) - if (rst) lsr1_d <= 0; - else lsr1_d <= lsr1; - -always @(posedge clk ) - if (rst) lsr1r <= 0; - else lsr1r <= lsr_mask ? 0 : lsr1r || (lsr1 && ~lsr1_d); - -reg lsr2_d; - -always @(posedge clk ) - if (rst) lsr2_d <= 0; - else lsr2_d <= lsr2; - -always @(posedge clk ) - if (rst) lsr2r <= 0; - else lsr2r <= lsr_mask ? 0 : lsr2r || (lsr2 && ~lsr2_d); - -reg lsr3_d; - -always @(posedge clk ) - if (rst) lsr3_d <= 0; - else lsr3_d <= lsr3; - -always @(posedge clk ) - if (rst) lsr3r <= 0; - else lsr3r <= lsr_mask ? 0 : lsr3r || (lsr3 && ~lsr3_d); - -reg lsr4_d; - -always @(posedge clk ) - if (rst) lsr4_d <= 0; - else lsr4_d <= lsr4; - -always @(posedge clk ) - if (rst) lsr4r <= 0; - else lsr4r <= lsr_mask ? 0 : lsr4r || (lsr4 && ~lsr4_d); - -reg lsr5_d; -always @(posedge clk ) - if (rst) lsr5_d <= 1; - else lsr5_d <= lsr5; - -always @(posedge clk ) - if (rst) lsr5r <= 1; - else lsr5r <= (fifo_write) ? 0 : lsr5r || (lsr5 && ~lsr5_d); - -reg lsr6_d; - -always @(posedge clk ) - if (rst) lsr6_d <= 1; - else lsr6_d <= lsr6; - -always @(posedge clk ) - if (rst) lsr6r <= 1; - else lsr6r <= (fifo_write) ? 0 : lsr6r || (lsr6 && ~lsr6_d); - -reg lsr7_d; - -always @(posedge clk ) - if (rst) lsr7_d <= 0; - else lsr7_d <= lsr7; - -always @(posedge clk ) - if (rst) lsr7r <= 0; - else lsr7r <= lsr_mask ? 0 : lsr7r || (lsr7 && ~lsr7_d); - -reg [8:0] M_cnt; -wire [8:0] M_next = M_cnt + dl[`UART_DL3]; -wire M_toggle = M_cnt[8] ^ M_next[8]; - -always @(posedge clk ) -begin - if (rst) begin - dlc <= 0; - M_cnt <= 8'h0; - end - else if (start_dlc | ~ (|dlc)) begin - dlc <= dl - 1 + M_toggle; - M_cnt <= M_next; - end - else - dlc <= dlc - 1; -end - -always @(posedge clk ) -begin - if (rst) - enable <= 1'b0; - else if (|dl & ~(|dlc)) - enable <= 1'b1; - else - enable <= 1'b0; -end - -always @(lcr) - case (lcr[3:0]) - 4'b0000 : block_value = 95; - 4'b0100 : block_value = 103; - 4'b0001, 4'b1000 : block_value = 111; - 4'b1100 : block_value = 119; - 4'b0010, 4'b0101, 4'b1001 : block_value = 127; - 4'b0011, 4'b0110, 4'b1010, 4'b1101 : block_value = 143; - 4'b0111, 4'b1011, 4'b1110 : block_value = 159; - 4'b1111 : block_value = 175; - endcase - -always @(posedge clk ) -begin - if (rst) - block_cnt <= 8'd0; - else - if(lsr5r & fifo_write) - block_cnt <= usart_t0 ? (block_value + 8'h16) : block_value; - else - if (enable & block_cnt != 8'b0) - block_cnt <= block_cnt - 1; -end - -assign thre_set_en = ~(|block_cnt); - -assign rls_int = ier[`UART_IE_RLS] && (lsr[`UART_LS_OE] || lsr[`UART_LS_PE] || lsr[`UART_LS_FE] || lsr[`UART_LS_BI]); -assign rda_int = ier[`UART_IE_RDA] && (rf_count >= {1'b0,trigger_level}); -assign thre_int = ier[`UART_IE_THRE]&& lsr[`UART_LS_TFE]; -assign ms_int = ier[`UART_IE_MS] && (usart_t0 ? max_repeat_time : (| msr[3:0])); -assign ti_int = ier[`UART_IE_RDA] && (counter_t == 10'b0) && (|rf_count); - -reg rls_int_d; -reg thre_int_d; -reg ms_int_d; -reg ti_int_d; -reg rda_int_d; - -always @(posedge clk ) - if (rst) rls_int_d <= 0; - else rls_int_d <= rls_int; - -always @(posedge clk ) - if (rst) rda_int_d <= 0; - else rda_int_d <= rda_int; - -always @(posedge clk ) - if (rst) thre_int_d <= 0; - else thre_int_d <= thre_int; - -always @(posedge clk ) - if (rst) ms_int_d <= 0; - else ms_int_d <= ms_int; - -always @(posedge clk ) - if (rst) ti_int_d <= 0; - else ti_int_d <= ti_int; - - -wire rls_int_rise; -wire thre_int_rise; -wire ms_int_rise; -wire ti_int_rise; -wire rda_int_rise; - -assign rda_int_rise = rda_int & ~rda_int_d; -assign rls_int_rise = rls_int & ~rls_int_d; -assign thre_int_rise = thre_int & ~thre_int_d; -assign ms_int_rise = ms_int & ~ms_int_d; -assign ti_int_rise = ti_int & ~ti_int_d; - -reg rls_int_pnd; -reg rda_int_pnd; -reg thre_int_pnd; -reg ms_int_pnd; -reg ti_int_pnd; - -always @(posedge clk ) - if (rst) rls_int_pnd <= 0; - else - rls_int_pnd <= lsr_mask ? 0 : - rls_int_rise ? 1 : - rls_int_pnd && ier[`UART_IE_RLS]; - -reg d1_fifo_read; -always @( posedge clk ) d1_fifo_read <= fifo_read; - -always @(posedge clk) - if (rst) rda_int_pnd <= 0; - else rda_int_pnd <= ((rf_count == {1'b0,trigger_level}) && d1_fifo_read) ? 0 : - rda_int_rise ? 1 : - rda_int_pnd && ier[`UART_IE_RDA]; - -always @(posedge clk ) - if (rst) thre_int_pnd <= 0; - else - thre_int_pnd <= fifo_write || (iir_read & ~iir[`UART_II_IP] & iir[`UART_II_II] == `UART_II_THRE)? 0 : - thre_int_rise ? 1 : - thre_int_pnd && ier[`UART_IE_THRE]; - -always @(posedge clk ) - if (rst) ms_int_pnd <= 0; - else - ms_int_pnd <= msr_read ? 0 : ms_int_rise ? 1 : - ms_int_pnd && ier[`UART_IE_MS]; - -always @(posedge clk ) - if (rst) ti_int_pnd <= 0; - else - ti_int_pnd <= fifo_read ? 0 : ti_int_rise ? 1 : - ti_int_pnd && ier[`UART_IE_RDA]; - -always @(posedge clk ) -begin - if (rst) int_o <= 1'b0; - else int_o <= rls_int_pnd ? ~lsr_mask : - rda_int_pnd ? 1 : - ti_int_pnd ? ~fifo_read: - thre_int_pnd? !(fifo_write & iir_read) : - ms_int_pnd ? ~msr_read : - 0; -end - - -always @(posedge clk ) -begin - if (rst) - iir <= 1; - else - if (rls_int_pnd) - begin - iir[`UART_II_II] <= `UART_II_RLS; - iir[`UART_II_IP] <= 1'b0; - end else - if (rda_int_pnd) - begin - iir[`UART_II_II] <= `UART_II_RDA; - iir[`UART_II_IP] <= 1'b0; - end - else if (ti_int_pnd) - begin - iir[`UART_II_II] <= `UART_II_TI; - iir[`UART_II_IP] <= 1'b0; - end - else if (thre_int_pnd) - begin - iir[`UART_II_II] <= `UART_II_THRE; - iir[`UART_II_IP] <= 1'b0; - end - else if (ms_int_pnd) - begin - iir[`UART_II_II] <= `UART_II_MS; - iir[`UART_II_IP] <= 1'b0; - end else - begin - iir[`UART_II_II] <= 0; - iir[`UART_II_IP] <= 1'b1; - end -end - -endmodule diff --git a/resources/soc/rtl/APB_DEV/URT/uart_rfifo.v b/resources/soc/rtl/APB_DEV/URT/uart_rfifo.v deleted file mode 100644 index ba5dcb9..0000000 --- a/resources/soc/rtl/APB_DEV/URT/uart_rfifo.v +++ /dev/null @@ -1,193 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -`include "uart_defines.h" - -module uart_rfifo (clk, - wb_rst_i, data_in, data_out, - push, - pop, - overrun, - count, - error_bit, - fifo_reset, - reset_status -); - -parameter fifo_width = `UART_FIFO_WIDTH; -parameter fifo_depth = `UART_FIFO_DEPTH; -parameter fifo_pointer_w = `UART_FIFO_POINTER_W; -parameter fifo_counter_w = `UART_FIFO_COUNTER_W; - -input clk; -input wb_rst_i; -input push; -input pop; -input [fifo_width-1:0] data_in; -input fifo_reset; -input reset_status; - -output [fifo_width-1:0] data_out; -output overrun; -output [fifo_counter_w-1:0] count; -output error_bit; - -wire [fifo_width-1:0] data_out; -wire [7:0] data8_out; -reg [2:0] fifo[fifo_depth-1:0]; - -reg [fifo_pointer_w-1:0] top; -reg [fifo_pointer_w-1:0] bottom; - -reg [fifo_counter_w-1:0] count; -reg overrun; - -wire [fifo_pointer_w-1:0] top_plus_1 = top + 1'b1; - -raminfr #(fifo_pointer_w,8,fifo_depth) rfifo (.clk(clk), - .we(push), - .a(top), - .dpra(bottom), - .di(data_in[fifo_width-1:fifo_width-8]), - .dpo(data8_out) -); - -always @(posedge clk) -begin - if (wb_rst_i) - begin - top <= 0; - bottom <= 1'b0; - count <= 0; - fifo[0] <= 0; - fifo[1] <= 0; - fifo[2] <= 0; - fifo[3] <= 0; - fifo[4] <= 0; - fifo[5] <= 0; - fifo[6] <= 0; - fifo[7] <= 0; - fifo[8] <= 0; - fifo[9] <= 0; - fifo[10]<= 0; - fifo[11]<= 0; - fifo[12]<= 0; - fifo[13]<= 0; - fifo[14]<= 0; - fifo[15]<= 0; - end - else - if (fifo_reset) begin - top <= 0; - bottom <= 1'b0; - count <= 0; - fifo[0] <= 0; - fifo[1] <= 0; - fifo[2] <= 0; - fifo[3] <= 0; - fifo[4] <= 0; - fifo[5] <= 0; - fifo[6] <= 0; - fifo[7] <= 0; - fifo[8] <= 0; - fifo[9] <= 0; - fifo[10]<= 0; - fifo[11]<= 0; - fifo[12]<= 0; - fifo[13]<= 0; - fifo[14]<= 0; - fifo[15]<= 0; - end - else - begin - case ({push, pop}) - 2'b10 : if (count0) - begin - fifo[bottom] <= 0; - bottom <= bottom + 1'b1; - count <= count - 1'b1; - end - 2'b11 : begin - bottom <= bottom + 1'b1; - top <= top_plus_1; - fifo[top] <= data_in[2:0]; - end - default: ; - endcase - end -end - -always @(posedge clk) -begin - if (wb_rst_i) - overrun <= 1'b0; - else - if(fifo_reset | reset_status) - overrun <= 1'b0; - else - if(push & ~pop & (count==fifo_depth)) - overrun <= 1'b1; -end - -assign data_out = {data8_out,fifo[bottom]}; - -wire [2:0] word0 = fifo[0]; -wire [2:0] word1 = fifo[1]; -wire [2:0] word2 = fifo[2]; -wire [2:0] word3 = fifo[3]; -wire [2:0] word4 = fifo[4]; -wire [2:0] word5 = fifo[5]; -wire [2:0] word6 = fifo[6]; -wire [2:0] word7 = fifo[7]; - -wire [2:0] word8 = fifo[8]; -wire [2:0] word9 = fifo[9]; -wire [2:0] word10 = fifo[10]; -wire [2:0] word11 = fifo[11]; -wire [2:0] word12 = fifo[12]; -wire [2:0] word13 = fifo[13]; -wire [2:0] word14 = fifo[14]; -wire [2:0] word15 = fifo[15]; - -assign error_bit = |(word0[2:0] | word1[2:0] | word2[2:0] | word3[2:0] | - word4[2:0] | word5[2:0] | word6[2:0] | word7[2:0] | - word8[2:0] | word9[2:0] | word10[2:0] | word11[2:0] | - word12[2:0] | word13[2:0] | word14[2:0] | word15[2:0] ); - -endmodule diff --git a/resources/soc/rtl/APB_DEV/URT/uart_sync_flops.v b/resources/soc/rtl/APB_DEV/URT/uart_sync_flops.v deleted file mode 100644 index 12d87b6..0000000 --- a/resources/soc/rtl/APB_DEV/URT/uart_sync_flops.v +++ /dev/null @@ -1,76 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -module uart_sync_flops -( - rst_i, - clk_i, - stage1_rst_i, - stage1_clk_en_i, - async_dat_i, - sync_dat_o -); - -parameter Tp = 1; -parameter width = 1; -parameter init_value = 1'b0; - -input rst_i; -input clk_i; -input stage1_rst_i; -input stage1_clk_en_i; -input [width-1:0] async_dat_i; -output [width-1:0] sync_dat_o; - -reg [width-1:0] sync_dat_o; -reg [width-1:0] flop_0; - -always @ (posedge clk_i) -begin - if (rst_i) - flop_0 <= {width{init_value}}; - else - flop_0 <= async_dat_i; -end - -always @ (posedge clk_i) -begin - if (rst_i) - sync_dat_o <= {width{init_value}}; - else if (stage1_rst_i) - sync_dat_o <= {width{init_value}}; - else if (stage1_clk_en_i) - sync_dat_o <= flop_0; -end - -endmodule diff --git a/resources/soc/rtl/APB_DEV/URT/uart_tfifo.v b/resources/soc/rtl/APB_DEV/URT/uart_tfifo.v deleted file mode 100644 index ce658a7..0000000 --- a/resources/soc/rtl/APB_DEV/URT/uart_tfifo.v +++ /dev/null @@ -1,129 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -`include "uart_defines.h" - -module uart_tfifo (clk, - wb_rst_i, data_in, data_out, - push, - pop, - overrun, - count, - fifo_reset, - reset_status -); - -parameter fifo_width = `UART_FIFO_WIDTH; -parameter fifo_depth = `UART_FIFO_DEPTH; -parameter fifo_pointer_w = `UART_FIFO_POINTER_W; -parameter fifo_counter_w = `UART_FIFO_COUNTER_W; - -input clk; -input wb_rst_i; -input push; -input pop; -input [fifo_width-1:0] data_in; -input fifo_reset; -input reset_status; - -output [fifo_width-1:0] data_out; -output overrun; -output [fifo_counter_w-1:0] count; - -wire [fifo_width-1:0] data_out; - -reg [fifo_pointer_w-1:0] top; -reg [fifo_pointer_w-1:0] bottom; - -reg [fifo_counter_w-1:0] count; -reg overrun; -wire [fifo_pointer_w-1:0] top_plus_1 = top + 1'b1; - -raminfr #(fifo_pointer_w,fifo_width,fifo_depth) tfifo (.clk(clk), - .we(push), - .a(top), - .dpra(bottom), - .di(data_in), - .dpo(data_out) -); - - -always @(posedge clk) -begin - if (wb_rst_i) - begin - top <= 0; - bottom <= 1'b0; - count <= 0; - end - else - if (fifo_reset) begin - top <= 0; - bottom <= 1'b0; - count <= 0; - end - else - begin - case ({push, pop}) - 2'b10 : if (count0) - begin - bottom <= bottom + 1'b1; - count <= count - 1'b1; - end - 2'b11 : begin - bottom <= bottom + 1'b1; - top <= top_plus_1; - end - default: ; - endcase - end -end - -always @(posedge clk) -begin - if (wb_rst_i) - overrun <= 1'b0; - else - if(fifo_reset | reset_status) - overrun <= 1'b0; - else - if(push & (count==fifo_depth)) - overrun <= 1'b1; -end - -endmodule diff --git a/resources/soc/rtl/APB_DEV/URT/uart_top.v b/resources/soc/rtl/APB_DEV/URT/uart_top.v deleted file mode 100644 index 2d1237f..0000000 --- a/resources/soc/rtl/APB_DEV/URT/uart_top.v +++ /dev/null @@ -1,107 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -`include "uart_defines.h" - -module UART_TOP( - PCLK, PRST_, - PSEL, PENABLE, PADDR, PWRITE, - PWDATA, URT_PRDATA, - - INT, clk_carrier, - - TXD_i, TXD_o, TXD_oe, - RXD_i, RXD_o, RXD_oe, - - RTS, CTS, DSR, - DCD, DTR, RI - ); - -input PCLK, PRST_; -input PSEL, PENABLE, PWRITE; -input [7:0] PADDR; -input [7:0] PWDATA; -output [7:0] URT_PRDATA; - -output INT; -input clk_carrier; - -input TXD_i; -output TXD_o; -output TXD_oe; -input RXD_i; -output RXD_o; -output RXD_oe; - -output RTS; -input CTS, DSR, DCD; -output DTR; -input RI; - -wire prst = !PRST_; -wire we = PSEL & PENABLE & PWRITE; -wire re = PSEL & PENABLE & !PWRITE; - -wire rx_en; -wire tx2rx_en; -wire isomode; - -assign TXD_oe = isomode&&(rx_en||tx2rx_en) ? 1'b1:1'b0; -assign RXD_oe =~isomode; - -uart_regs regs( - .clk (PCLK ), - .rst (prst ), - .clk_carrier (clk_carrier), - .addr (PADDR[2:0] ), - .dat_i (PWDATA ), - .dat_o (URT_PRDATA ), - .we (we ), - .re (re ), - - .modem_inputs({ CTS, DSR, RI, DCD } ), - .rts_pad_o (RTS ), - .dtr_pad_o (DTR ), - .stx_pad_o (TXD_o ), - .TXD_i (TXD_i ), - .srx_pad_i (RXD_i ), - .RXD_o (RXD_o ), - .int_o ( INT ), - .tx2rx_en (tx2rx_en ), - .rx_en (rx_en ), - .usart_mode (isomode ) - -); - - -endmodule diff --git a/resources/soc/rtl/APB_DEV/URT/uart_transmitter.v b/resources/soc/rtl/APB_DEV/URT/uart_transmitter.v deleted file mode 100644 index 000cc4b..0000000 --- a/resources/soc/rtl/APB_DEV/URT/uart_transmitter.v +++ /dev/null @@ -1,281 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -`include "uart_defines.h" - -module uart_transmitter (clk, wb_rst_i, lcr, tf_push, wb_dat_i, - enable,stx_pad_o, tstate, tf_count, tx_reset, lsr_mask, - usart_t0,srx_pad_i,repeat_time,max_repeat_time,current_finish, - usart_mode,tx2rx_en); - -input clk; -input wb_rst_i; -input [7:0] lcr; -input tf_push; -input [7:0] wb_dat_i; -input enable; -input tx_reset; -input lsr_mask; -input usart_mode; -input usart_t0,srx_pad_i; -input [2:0] repeat_time; -output current_finish; -output max_repeat_time; - -output tx2rx_en; -reg tx2rx_en; -output stx_pad_o; -output [2:0] tstate; -output [`UART_FIFO_COUNTER_W-1:0] tf_count; - -reg [2:0] tstate; -reg [4:0] counter; -reg [2:0] bit_counter; -reg [6:0] shift_out; -reg stx_o_tmp; -reg parity_xor; -reg tf_pop; -reg bit_out; -reg tx_error; -reg [2:0] error_time; - -wire [`UART_FIFO_WIDTH-1:0] tf_data_in; -wire [`UART_FIFO_WIDTH-1:0] tf_data_out; -wire tf_push; -wire tf_overrun; -wire [`UART_FIFO_COUNTER_W-1:0]tf_count; - -assign tf_data_in = wb_dat_i; - -uart_tfifo fifo_tx( - .clk ( clk ), - .wb_rst_i( wb_rst_i ), - .data_in ( tf_data_in ), - .data_out( tf_data_out ), - .push ( tf_push ), - .pop ( tf_pop ), - .overrun ( tf_overrun ), - .count ( tf_count ), - .fifo_reset ( tx_reset), - .reset_status(lsr_mask ) -); - -parameter s_idle = 3'd0; -parameter s_send_start = 3'd1; -parameter s_send_byte = 3'd2; -parameter s_send_parity = 3'd3; -parameter s_send_stop = 3'd4; -parameter s_pop_byte = 3'd5; -parameter s_send_guard1 = 3'd6; -reg [7:0]tf_data_bak; - -wire max_repeat_time = (error_time==(repeat_time+1'b1)) & usart_mode & usart_t0; - -always @(posedge clk ) -begin - if (wb_rst_i) - begin - tx_error <= 1'b0; - error_time <= 3'b0; - tstate <= s_idle; - stx_o_tmp <= 1'b1; - counter <= 5'b0; - shift_out <= 7'b0; - bit_out <= 1'b0; - parity_xor <= 1'b0; - tf_pop <= 1'b0; - bit_counter <= 3'b0; - tx2rx_en <= 1'b0; - tf_data_bak <= 8'h0; - end - else - if (enable) - begin - case (tstate) - s_idle :if ((~|tf_count)&(error_time==(repeat_time+1'b1)||~tx_error||~usart_mode)) - begin - tstate <= s_idle; - stx_o_tmp <= 1'b1; - tx_error <= 1'b0; - end - else begin - tf_pop <= 1'b0; - stx_o_tmp <= 1'b1; - tstate <= s_pop_byte; - end - s_pop_byte : begin - - if(tx_error&(error_time !=(repeat_time+1'b1))) - begin - tf_pop <= 1'b0; - case (lcr[1:0]) - 2'b00 : begin - bit_counter <= 3'b100; - parity_xor <= ^tf_data_bak[4:0]; - end - 2'b01 : begin - bit_counter <= 3'b101; - parity_xor <= ^tf_data_bak[5:0]; - end - 2'b10 : begin - bit_counter <= 3'b110; - parity_xor <= ^tf_data_bak[6:0]; - end - 2'b11 : begin - bit_counter <= 3'b111; - parity_xor <= ^tf_data_bak[7:0]; - end - endcase - {shift_out[6:0], bit_out} <= tf_data_bak; - end - else begin - tf_pop <= 1'b1; - error_time <= 3'h0; - case (lcr[1:0]) - 2'b00 : begin - bit_counter <= 3'b100; - parity_xor <= ^tf_data_out[4:0]; - end - 2'b01 : begin - bit_counter <= 3'b101; - parity_xor <= ^tf_data_out[5:0]; - end - 2'b10 : begin - bit_counter <= 3'b110; - parity_xor <= ^tf_data_out[6:0]; - end - 2'b11 : begin - bit_counter <= 3'b111; - parity_xor <= ^tf_data_out[7:0]; - end - endcase - {shift_out[6:0], bit_out} <= tf_data_out; - tf_data_bak <= tf_data_out; - end - tstate <= s_send_start; - end - s_send_start : begin - tf_pop <= 1'b0; - if (~|counter) - counter <= 5'b01111; - else if (counter == 5'b00001) - begin - counter <= 0; - tstate <= s_send_byte; - end - else - counter <= counter - 1'b1; - stx_o_tmp <= 1'b0; - end - s_send_byte : begin - if (~|counter) - counter <= 5'b01111; - else if (counter == 5'b00001) - begin - if (bit_counter > 3'b0) begin - bit_counter <= bit_counter - 1'b1; - {shift_out[5:0],bit_out } <= {shift_out[6:1], shift_out[0]}; - tstate <= s_send_byte; - end - else - if (~lcr[`UART_LC_PE]) begin - tstate <= s_send_stop; - end - else begin - case ({lcr[`UART_LC_EP],lcr[`UART_LC_SP]}) - 2'b00: bit_out <= ~parity_xor; - 2'b01: bit_out <= 1'b1; - 2'b10: bit_out <= parity_xor; - 2'b11: bit_out <= 1'b0; - endcase - tstate <= s_send_parity; - end - counter <= 0; - end - else counter <= counter - 1'b1; - stx_o_tmp <= bit_out; - end - s_send_parity : begin - if (~|counter) counter <= 5'b01111; - else if (counter == 5'b00001) begin - counter <= 4'b0; - tstate <= usart_mode ? s_send_guard1 : s_send_stop; - end - else counter <= counter - 1'b1; - stx_o_tmp <= bit_out; - end - s_send_stop : begin - if (~|counter) begin - if(usart_t0) - counter <= tx_error ? 5'b11101 : 5'b01101; - else - casex ({lcr[`UART_LC_SB],lcr[`UART_LC_BITS]}) - 3'b0xx: counter <= 5'b01101; - 3'b100: counter <= 5'b10101; - default: counter <= 5'b11101; - endcase - end - else if (counter == 5'b00001) begin - counter <= 5'b0; - tx2rx_en<= 1'b0; - tstate <= s_idle; - end - else counter <= counter - 1'b1; - stx_o_tmp <= 1'b1; - end - s_send_guard1:begin - if (~|counter) begin - tx2rx_en <= 1'b1; - counter <= usart_t0 ? 5'b01111:5'b01101; - end - else if (counter == 5'b00001) begin - counter <= 5'b0; - tx_error <= !srx_pad_i; - error_time<= error_time + !srx_pad_i; - tx2rx_en <= usart_t0 ? 1'b1 : 1'b0; - tstate <= usart_t0 ? s_send_stop : s_idle; - end - else counter <= counter - 1'b1; - stx_o_tmp <= 1'b1; - end - default : - tstate <= s_idle; - endcase - end - else tf_pop <= 1'b0; -end - -assign stx_pad_o = lcr[`UART_LC_BC] ? 1'b0 : stx_o_tmp; -assign current_finish = usart_mode ? ( (tstate==3'b0)&(tx_error & (error_time ==repeat_time+1'b1) |~tx_error) ) : 1'b1; - -endmodule diff --git a/resources/soc/rtl/APB_DEV/apb_dev_top.v b/resources/soc/rtl/APB_DEV/apb_dev_top.v deleted file mode 100644 index 213f014..0000000 --- a/resources/soc/rtl/APB_DEV/apb_dev_top.v +++ /dev/null @@ -1,416 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -`include "config.h" - -module axi2apb_misc -( -clk, -rst_n, - -axi_s_awid, -axi_s_awaddr, -axi_s_awlen, -axi_s_awsize, -axi_s_awburst, -axi_s_awlock, -axi_s_awcache, -axi_s_awprot, -axi_s_awvalid, -axi_s_awready, -axi_s_wid, -axi_s_wdata, -axi_s_wstrb, -axi_s_wlast, -axi_s_wvalid, -axi_s_wready, -axi_s_bid, -axi_s_bresp, -axi_s_bvalid, -axi_s_bready, -axi_s_arid, -axi_s_araddr, -axi_s_arlen, -axi_s_arsize, -axi_s_arburst, -axi_s_arlock, -axi_s_arcache, -axi_s_arprot, -axi_s_arvalid, -axi_s_arready, -axi_s_rid, -axi_s_rdata, -axi_s_rresp, -axi_s_rlast, -axi_s_rvalid, -axi_s_rready, - -apb_rw_dma, -apb_psel_dma, -apb_enab_dma, -apb_addr_dma, -apb_valid_dma, -apb_wdata_dma, -apb_rdata_dma, -apb_ready_dma, -dma_grant, - -dma_req_o, -dma_ack_i, - -uart0_txd_i, -uart0_txd_o, -uart0_txd_oe, -uart0_rxd_i, -uart0_rxd_o, -uart0_rxd_oe, -uart0_rts_o, -uart0_dtr_o, -uart0_cts_i, -uart0_dsr_i, -uart0_dcd_i, -uart0_ri_i, - -uart0_int, -nand_int, - -nand_type, -nand_cle , -nand_ale , -nand_rdy , -nand_rd , -nand_ce, -nand_wr , -nand_dat_i , -nand_dat_o , -nand_dat_oe -); - -parameter ADDR_APB = 20, - DATA_APB = 8, - L_ADDR = 64, - L_ID = 8, - L_DATA = 128, - L_MASK = 16; - -input clk; -input rst_n; - -input [`LID -1 :0] axi_s_awid; -input [`Lawaddr -1 :0] axi_s_awaddr; -input [`Lawlen -1 :0] axi_s_awlen; -input [`Lawsize -1 :0] axi_s_awsize; -input [`Lawburst -1 :0] axi_s_awburst; -input [`Lawlock -1 :0] axi_s_awlock; -input [`Lawcache -1 :0] axi_s_awcache; -input [`Lawprot -1 :0] axi_s_awprot; -input axi_s_awvalid; -output axi_s_awready; -input [`LID -1 :0] axi_s_wid; -input [`Lwdata -1 :0] axi_s_wdata; -input [`Lwstrb -1 :0] axi_s_wstrb; -input axi_s_wlast; -input axi_s_wvalid; -output axi_s_wready; -output [`LID -1 :0] axi_s_bid; -output [`Lbresp -1 :0] axi_s_bresp; -output axi_s_bvalid; -input axi_s_bready; -input [`LID -1 :0] axi_s_arid; -input [`Laraddr -1 :0] axi_s_araddr; -input [`Larlen -1 :0] axi_s_arlen; -input [`Larsize -1 :0] axi_s_arsize; -input [`Larburst -1 :0] axi_s_arburst; -input [`Larlock -1 :0] axi_s_arlock; -input [`Larcache -1 :0] axi_s_arcache; -input [`Larprot -1 :0] axi_s_arprot; -input axi_s_arvalid; -output axi_s_arready; -output [`LID -1 :0] axi_s_rid; -output [`Lrdata -1 :0] axi_s_rdata; -output [`Lrresp -1 :0] axi_s_rresp; -output axi_s_rlast; -output axi_s_rvalid; -input axi_s_rready; - -output apb_ready_dma; -input apb_rw_dma; -input apb_psel_dma; -input apb_enab_dma; -input [ADDR_APB-1:0] apb_addr_dma; -input [31:0] apb_wdata_dma; -output[31:0] apb_rdata_dma; -input apb_valid_dma; -output dma_grant; - -output dma_req_o; -input dma_ack_i; - -input uart0_txd_i; -output uart0_txd_o; -output uart0_txd_oe; -input uart0_rxd_i; -output uart0_rxd_o; -output uart0_rxd_oe; -output uart0_rts_o; -output uart0_dtr_o; -input uart0_cts_i; -input uart0_dsr_i; -input uart0_dcd_i; -input uart0_ri_i; - -input [3:0]nand_rdy; -output [3:0]nand_ce; -output nand_cle; -output nand_ale; -output nand_rd; -output nand_wr; -output nand_dat_oe; -input [7:0]nand_dat_i ; -output [7:0]nand_dat_o ; - -output uart0_int; -output nand_int; -input [1:0]nand_type; - -wire nand_dma_req_o; -assign dma_req_o = nand_dma_req_o; -assign nand_dma_ack_i = dma_ack_i; - -wire apb_ready_cpu; -wire apb_rw_cpu; -wire apb_psel_cpu; -wire apb_enab_cpu; -wire [ADDR_APB-1 :0] apb_addr_cpu; -wire [DATA_APB-1:0] apb_datai_cpu; -wire [DATA_APB-1:0] apb_datao_cpu; -wire apb_clk_cpu; -wire apb_reset_n_cpu; -wire apb_word_trans_cpu; -wire apb_valid_cpu; -wire dma_grant; -wire [23:0] apb_high_24b_rd; -wire [23:0] apb_high_24b_wr; - -wire apb_rw_dma; -wire apb_psel_dma; -wire apb_enab_dma; -wire [31:0] apb_wdata_dma; -wire [31:0] apb_rdata_dma; -wire apb_clk_dma; -wire apb_reset_n_dma; - -wire apb_uart0_req; -wire apb_uart0_ack; -wire apb_uart0_rw; -wire apb_uart0_enab; -wire apb_uart0_psel; -wire [ADDR_APB -1:0] apb_uart0_addr; -wire [DATA_APB -1:0] apb_uart0_datai; -wire [DATA_APB -1:0] apb_uart0_datao; - -wire apb_nand_req; -wire apb_nand_ack; -wire apb_nand_rw; -wire apb_nand_enab; -wire apb_nand_psel; -wire [ADDR_APB -1:0] apb_nand_addr; -wire [31:0] apb_nand_datai; -wire [31:0] apb_nand_datao; - -axi2apb_bridge AA_axi2apb_bridge_cpu -( -.clk (clk ), -.rst_n (rst_n ), -.axi_s_awid (axi_s_awid ), -.axi_s_awaddr (axi_s_awaddr ), -.axi_s_awlen (axi_s_awlen ), -.axi_s_awsize (axi_s_awsize ), -.axi_s_awburst (axi_s_awburst ), -.axi_s_awlock (axi_s_awlock ), -.axi_s_awcache (axi_s_awcache ), -.axi_s_awprot (axi_s_awprot ), -.axi_s_awvalid (axi_s_awvalid ), -.axi_s_awready (axi_s_awready ), -.axi_s_wid (axi_s_wid ), -.axi_s_wdata (axi_s_wdata ), -.axi_s_wstrb (axi_s_wstrb ), -.axi_s_wlast (axi_s_wlast ), -.axi_s_wvalid (axi_s_wvalid ), -.axi_s_wready (axi_s_wready ), -.axi_s_bid (axi_s_bid ), -.axi_s_bresp (axi_s_bresp ), -.axi_s_bvalid (axi_s_bvalid ), -.axi_s_bready (axi_s_bready ), -.axi_s_arid (axi_s_arid ), -.axi_s_araddr (axi_s_araddr ), -.axi_s_arlen (axi_s_arlen ), -.axi_s_arsize (axi_s_arsize ), -.axi_s_arburst (axi_s_arburst ), -.axi_s_arlock (axi_s_arlock ), -.axi_s_arcache (axi_s_arcache ), -.axi_s_arprot (axi_s_arprot ), -.axi_s_arvalid (axi_s_arvalid ), -.axi_s_arready (axi_s_arready ), -.axi_s_rid (axi_s_rid ), -.axi_s_rdata (axi_s_rdata ), -.axi_s_rresp (axi_s_rresp ), -.axi_s_rlast (axi_s_rlast ), -.axi_s_rvalid (axi_s_rvalid ), -.axi_s_rready (axi_s_rready ), - -.apb_word_trans (apb_word_trans_cpu ), -.apb_high_24b_rd (apb_high_24b_rd ), -.apb_high_24b_wr (apb_high_24b_wr ), -.apb_valid_cpu (apb_valid_cpu ), -.cpu_grant (~dma_grant ), - -.apb_clk (apb_clk_cpu ), -.apb_reset_n (apb_reset_n_cpu ), -.reg_psel (apb_psel_cpu ), -.reg_enable (apb_enab_cpu ), -.reg_rw (apb_rw_cpu ), -.reg_addr (apb_addr_cpu ), -.reg_datai (apb_datai_cpu ), -.reg_datao (apb_datao_cpu ), -.reg_ready_1 (apb_ready_cpu ) -); - -apb_mux2 AA_apb_mux16 -( -.clk (clk ), -.rst_n (rst_n ), -.apb_ready_dma (apb_ready_dma ), -.apb_rw_dma (apb_rw_dma ), -.apb_addr_dma (apb_addr_dma ), -.apb_psel_dma (apb_psel_dma ), -.apb_enab_dma (apb_enab_dma ), -.apb_wdata_dma (apb_wdata_dma ), -.apb_rdata_dma (apb_rdata_dma ), -.apb_valid_dma (apb_valid_dma ), -.apb_valid_cpu (apb_valid_cpu ), -.dma_grant (dma_grant ), - -.apb_ack_cpu (apb_ready_cpu ), -.apb_rw_cpu (apb_rw_cpu ), -.apb_addr_cpu (apb_addr_cpu ), -.apb_psel_cpu (apb_psel_cpu ), -.apb_enab_cpu (apb_enab_cpu ), -.apb_datai_cpu (apb_datai_cpu ), -.apb_datao_cpu (apb_datao_cpu ), -.apb_high_24b_rd (apb_high_24b_rd), -.apb_high_24b_wr (apb_high_24b_wr), -.apb_word_trans_cpu (apb_word_trans_cpu ), - -.apb0_req (apb_uart0_req ), -.apb0_ack (apb_uart0_ack ), -.apb0_rw (apb_uart0_rw ), -.apb0_psel (apb_uart0_psel ), -.apb0_enab (apb_uart0_enab ), -.apb0_addr (apb_uart0_addr ), -.apb0_datai (apb_uart0_datai ), -.apb0_datao (apb_uart0_datao ), - -.apb1_req (apb_nand_req ), -.apb1_ack (apb_nand_ack ), -.apb1_rw (apb_nand_rw ), -.apb1_enab (apb_nand_enab ), -.apb1_psel (apb_nand_psel ), -.apb1_addr (apb_nand_addr ), -.apb1_datai (apb_nand_datai ), -.apb1_datao (apb_nand_datao ) - -); - -//uart0 -assign apb_uart0_ack = apb_uart0_enab; -UART_TOP uart0 -( -.PCLK (clk ), -.clk_carrier (1'b0 ), -.PRST_ (rst_n ), -.PSEL (apb_uart0_psel ), -.PENABLE (apb_uart0_enab ), -.PADDR (apb_uart0_addr[7:0] ), -.PWRITE (apb_uart0_rw ), -.PWDATA (apb_uart0_datai ), -.URT_PRDATA (apb_uart0_datao ), -.INT (uart0_int ), -.TXD_o (uart0_txd_o ), -.TXD_i (uart0_txd_i ), -.TXD_oe (uart0_txd_oe ), -.RXD_o (uart0_rxd_o ), -.RXD_i (uart0_rxd_i ), -.RXD_oe (uart0_rxd_oe ), -.RTS (uart0_rts_o ), -.CTS (uart0_cts_i ), -.DSR (uart0_dsr_i ), -.DCD (uart0_dcd_i ), -.DTR (uart0_dtr_o ), -.RI (uart0_ri_i ) -); - -//NAND -nand_module nand_module -( -.nand_type (nand_type ), - -.clk (clk ), -.rst_n (rst_n ), - -.apb_psel (apb_nand_psel ), -.apb_enab (apb_nand_enab ), -.apb_rw (apb_nand_rw ), -.apb_addr (apb_nand_addr ), -.apb_datai (apb_nand_datai ), -.apb_datao (apb_nand_datao ), -.apb_ack (apb_nand_ack ), - -.nand_dma_req_o (nand_dma_req_o ), -.nand_dma_ack_i (nand_dma_ack_i ), - -.nand_ce (nand_ce ), -.nand_dat_i (nand_dat_i ), -.nand_dat_o (nand_dat_o ), -.nand_dat_oe (nand_dat_oe ), -.nand_ale (nand_ale ), -.nand_cle (nand_cle ), -.nand_wr (nand_wr ), -.nand_rd (nand_rd ), -.nand_rdy (nand_rdy ), -.nand_int (nand_int ) -); - -endmodule - - diff --git a/resources/soc/rtl/APB_DEV/apb_mux2.v b/resources/soc/rtl/APB_DEV/apb_mux2.v deleted file mode 100644 index 38ce4dd..0000000 --- a/resources/soc/rtl/APB_DEV/apb_mux2.v +++ /dev/null @@ -1,203 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -`define APB_DEV0 6'h10 -`define APB_DEV1 6'h1e -module apb_mux2 ( -clk, -rst_n, -apb_ack_cpu, -apb_rw_cpu, -apb_psel_cpu, -apb_enab_cpu, -apb_addr_cpu, -apb_datai_cpu, -apb_datao_cpu, -apb_high_24b_rd, -apb_high_24b_wr, -apb_word_trans_cpu, - -apb_ready_dma, -apb_rw_dma, -apb_psel_dma, -apb_enab_dma, -apb_addr_dma, -apb_wdata_dma, -apb_rdata_dma, -apb_valid_dma, -apb_valid_cpu, -dma_grant, - -apb0_req, -apb0_ack, -apb0_rw, -apb0_psel, -apb0_enab, -apb0_addr, -apb0_datai, -apb0_datao, - -apb1_req, -apb1_ack, -apb1_rw, -apb1_psel, -apb1_enab, -apb1_addr, -apb1_datai, -apb1_datao -); - -parameter ADDR_APB = 20, - DATA_APB = 8, - DATA_APB_32 = 32; -input clk,rst_n; -output apb_ready_dma; -input apb_rw_dma; -input apb_psel_dma; -input apb_enab_dma; -input [ADDR_APB-1:0] apb_addr_dma; -input [31:0] apb_wdata_dma; -output[31:0] apb_rdata_dma; -output dma_grant; -input apb_valid_dma; -input apb_valid_cpu; - -output apb_ack_cpu; -input apb_rw_cpu; -input apb_psel_cpu; -input apb_enab_cpu; -input [ADDR_APB-1:0] apb_addr_cpu; -input [DATA_APB-1:0] apb_datai_cpu; -output[DATA_APB-1:0] apb_datao_cpu; -output [23:0] apb_high_24b_rd; -input [23:0] apb_high_24b_wr; - -output apb_word_trans_cpu; -output apb0_req; -input apb0_ack; -output apb0_rw; -output apb0_psel; -output apb0_enab; -output[ADDR_APB-1:0] apb0_addr; -output[DATA_APB-1:0] apb0_datai; -input [DATA_APB-1:0] apb0_datao; - -output apb1_req; -input apb1_ack; -output apb1_rw; -output apb1_psel; -output apb1_enab; -output[ADDR_APB-1:0] apb1_addr; -output[31:0] apb1_datai; -input [31:0] apb1_datao; - -wire apb_ack; -wire apb_rw; -wire apb_psel; -wire apb_enab; -wire [ADDR_APB-1:0] apb_addr; -wire [DATA_APB-1:0] apb_datai; -wire [23:0]high_24b_wr; -wire [23:0]high_24b_rd; -wire [7:0]apb_datao ; -wire dma_grant; - -arb_2_1 arb_2_1(.clk(clk), .rst_n(rst_n), .valid0(apb_valid_cpu), .valid1(apb_valid_dma), .dma_grant(dma_grant)); - -assign apb_addr = dma_grant ? apb_addr_dma:apb_addr_cpu; -assign apb_rw = dma_grant ? apb_rw_dma:apb_rw_cpu; -assign apb_psel = dma_grant ? apb_psel_dma:apb_psel_cpu; -assign apb_enab = dma_grant ? apb_enab_dma:apb_enab_cpu; -assign apb_datai = dma_grant ? apb_wdata_dma[7:0]:apb_datai_cpu; -assign high_24b_wr = dma_grant ? apb_wdata_dma[31:8]:apb_high_24b_wr; -assign high_24b_rd = apb1_req ? apb1_datao[31:8] : 24'h0; - -assign apb_word_trans_cpu = dma_grant ? 1'h0: apb1_req; - -assign apb_high_24b_rd = dma_grant ? 24'h0: high_24b_rd; -assign apb_datao_cpu = dma_grant ? 8'h0: apb_datao; -assign apb_rdata_dma = dma_grant ? {high_24b_rd,apb_datao }:32'h0; -assign apb_ack_cpu = ~dma_grant & apb_ack; -assign apb_ready_dma = dma_grant & apb_ack; - -assign apb0_req = (apb_addr[ADDR_APB-1:14] ==`APB_DEV0); -assign apb1_req = (apb_addr[ADDR_APB-1:14] ==`APB_DEV1); - -assign apb0_psel = apb_psel && apb0_req ; -assign apb1_psel = apb_psel && apb1_req; - -assign apb0_enab = apb_enab && apb0_req ; -assign apb1_enab = apb_enab && apb1_req; - -assign apb_ack = apb0_req ? apb0_ack : - apb1_req ? apb1_ack : - 1'b0; - -assign apb_datao = apb0_req ? apb0_datao : - apb1_req ? apb1_datao[7:0] : - 8'b0; - - - -assign apb0_addr = apb_addr; -assign apb0_datai = apb_datai; -assign apb0_rw = apb_rw; - -assign apb1_addr = apb_addr; -assign apb1_datai = {high_24b_wr,apb_datai}; -assign apb1_rw = apb_rw; - -endmodule - -module arb_2_1( clk, rst_n, valid0, valid1, dma_grant); -input clk; -input rst_n; -input valid0; -input valid1; -output dma_grant; -reg dma_grant; - -always @(posedge clk) - if(~rst_n) - dma_grant<= 1'b0; - else if(valid0&&~valid1) - dma_grant<= 1'b0; - else if(valid1&&~valid0) - dma_grant<= 1'b1; - else if(valid0&&valid1&&~dma_grant) - dma_grant<= 1'b0; - else if(valid0&&valid1&&dma_grant) - dma_grant<= 1'b1; - else dma_grant<= 1'b0; - -endmodule diff --git a/resources/soc/rtl/APB_DEV/nand_module.v b/resources/soc/rtl/APB_DEV/nand_module.v deleted file mode 100644 index be6cc5d..0000000 --- a/resources/soc/rtl/APB_DEV/nand_module.v +++ /dev/null @@ -1,140 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -module nand_module -( -nand_type , - -clk, -rst_n, - -apb_psel, -apb_enab, -apb_rw, -apb_addr, -apb_datai, -apb_datao, -apb_ack, - -nand_dma_req_o, -nand_dma_ack_i, - -nand_ce , -nand_dat_i , -nand_dat_o , -nand_dat_oe, -nand_ale , -nand_cle , -nand_wr , -nand_rd , -nand_rdy , - -nand_int - -); -input [1:0]nand_type; -input clk; -input rst_n; -input apb_psel; -input apb_enab; -input apb_rw; -input [19:0] apb_addr; -input [31:0] apb_datai; -output[31:0] apb_datao; -output apb_ack; - -output nand_dma_req_o; -input nand_dma_ack_i; - -output [3:0] nand_ce; -input [7:0] nand_dat_i ; -output [7:0] nand_dat_o ; -output nand_dat_oe; -output nand_ale; -output nand_cle; -output nand_wr; -output nand_rd; -input [3:0] nand_rdy; -output nand_int; - -wire psel; -wire penable; -wire [10:0] paddr; -wire pwr; -assign apb_ack = apb_enab; -assign psel = apb_psel; -assign penable = apb_enab; -assign paddr = apb_addr[10:0]; -assign pwr = apb_rw; - -reg [3:0] nand_iordy_r0; -reg [3:0] nand_iordy_r1; -always @(posedge clk) begin - nand_iordy_r0 <= nand_rdy; - nand_iordy_r1 <= nand_iordy_r0; -end -reg [1:0] nand_type_r1; -reg [1:0] nand_type_r2; - -always @(posedge clk) -if(~rst_n)begin - nand_type_r1 <= nand_type; - nand_type_r2 <= nand_type_r1; -end - -NAND_top NAND -( -.nand_type (nand_type_r2 ), -.pclk (clk ), -.prst_ (rst_n ), -.psel (psel ), -.penable (penable ), -.pwrite (pwr ), -.ADDR (paddr ), -.DAT_I (apb_datai ), -.DAT_O (apb_datao ), - -.NAND_CE_o (nand_ce ), -.NAND_REQ (nand_dma_req_o ), -.NAND_I (nand_dat_i ), -.NAND_O (nand_dat_o ), -.NAND_EN_ (nand_dat_oe ), -.NAND_ALE (nand_ale ), -.NAND_CLE (nand_cle ), -.NAND_RD_ (nand_rd ), -.NAND_WR_ (nand_wr ), -.NAND_IORDY_i (nand_iordy_r1 ), - -.nand_int (nand_int ) -); -endmodule diff --git a/resources/soc/rtl/CONFREG/confreg.v b/resources/soc/rtl/CONFREG/confreg.v deleted file mode 100644 index 5b2745a..0000000 --- a/resources/soc/rtl/CONFREG/confreg.v +++ /dev/null @@ -1,695 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -`define ORDER_REG_ADDR 16'h1160 //32'hbfd0_1160 -`define LED_ADDR 16'hf000 //32'hbfd0_f000 -`define LED_RG0_ADDR 16'hf004 //32'hbfd0_f004 -`define LED_RG1_ADDR 16'hf008 //32'hbfd0_f008 -`define NUM_ADDR 16'hf010 //32'hbfd0_f010 -`define SWITCH_ADDR 16'hf020 //32'hbfd0_f020 -`define BTN_KEY_ADDR 16'hf024 //32'hbfd0_f024 -`define BTN_STEP_ADDR 16'hf028 //32'hbfd0_f028 -`define TIMER_ADDR 16'he000 //32'hbfd0_e000 -module confreg( - aclk, - aresetn, - - s_awid, - s_awaddr, - s_awlen, - s_awsize, - s_awburst, - s_awlock, - s_awcache, - s_awprot, - s_awvalid, - s_awready, - s_wid, - s_wdata, - s_wstrb, - s_wlast, - s_wvalid, - s_wready, - s_bid, - s_bresp, - s_bvalid, - s_bready, - s_arid, - s_araddr, - s_arlen, - s_arsize, - s_arburst, - s_arlock, - s_arcache, - s_arprot, - s_arvalid, - s_arready, - s_rid, - s_rdata, - s_rresp, - s_rlast, - s_rvalid, - s_rready, - - order_addr_reg, - finish_read_order, - write_dma_end, - - cr00, - cr01, - cr02, - cr03, - cr04, - cr05, - cr06, - cr07, - - led, - led_rg0, - led_rg1, - num_csn, - num_a_g, - switch, - btn_key_col, - btn_key_row, - btn_step -); - input aclk; - input aresetn; - - input [3 :0] s_awid; - input [31:0] s_awaddr; - input [7 :0] s_awlen; - input [2 :0] s_awsize; - input [1 :0] s_awburst; - input s_awlock; - input [3 :0] s_awcache; - input [2 :0] s_awprot; - input s_awvalid; - output s_awready; - input [3 :0] s_wid; - input [31:0] s_wdata; - input [3 :0] s_wstrb; - input s_wlast; - input s_wvalid; - output s_wready; - output [3 :0] s_bid; - output [1 :0] s_bresp; - output s_bvalid; - input s_bready; - input [3 :0] s_arid; - input [31:0] s_araddr; - input [7 :0] s_arlen; - input [2 :0] s_arsize; - input [1 :0] s_arburst; - input s_arlock; - input [3 :0] s_arcache; - input [2 :0] s_arprot; - input s_arvalid; - output s_arready; - output [3 :0] s_rid; - output [31:0] s_rdata; - output [1 :0] s_rresp; - output s_rlast; - output s_rvalid; - input s_rready; - - output reg [31:0] order_addr_reg; - input finish_read_order; - input write_dma_end; - - output [31:0] cr00; - output [31:0] cr01; - output [31:0] cr02; - output [31:0] cr03; - output [31:0] cr04; - output [31:0] cr05; - output [31:0] cr06; - output [31:0] cr07; - - output [15:0] led; - output [1 :0] led_rg0; - output [1 :0] led_rg1; - output reg [7 :0] num_csn; - output reg [6 :0] num_a_g; - input [7 :0] switch; - output [3 :0] btn_key_col; - input [3 :0] btn_key_row; - input [1 :0] btn_step; - -// -reg [31:0] led_data; -reg [31:0] led_rg0_data; -reg [31:0] led_rg1_data; -reg [31:0] num_data; -wire [31:0] switch_data; -wire [31:0] btn_key_data; -wire [31:0] btn_step_data; -reg [31:0] timer; - -reg [31:0] cr00,cr01,cr02,cr03,cr04,cr05,cr06,cr07; -reg busy,write,R_or_W; -reg s_wready; - -wire ar_enter = s_arvalid & s_arready; -wire r_retire = s_rvalid & s_rready & s_rlast; -wire aw_enter = s_awvalid & s_awready; -wire w_enter = s_wvalid & s_wready & s_wlast; -wire b_retire = s_bvalid & s_bready; - -wire s_arready = ~busy & (!R_or_W| !s_awvalid); -wire s_awready = ~busy & ( R_or_W| !s_arvalid); - -always@(posedge aclk) - if(~aresetn) busy <= 1'b0; - else if(ar_enter|aw_enter) busy <= 1'b1; - else if(r_retire|b_retire) busy <= 1'b0; - -reg [3 :0] buf_id; -reg [31:0] buf_addr; -reg [7 :0] buf_len; -reg [2 :0] buf_size; -reg [1 :0] buf_burst; -reg buf_lock; -reg [3 :0] buf_cache; -reg [2 :0] buf_prot; - -always@(posedge aclk) - if(~aresetn) begin - R_or_W <= 1'b0; - buf_id <= 'b0; - buf_addr <= 'b0; - buf_len <= 'b0; - buf_size <= 'b0; - buf_burst <= 'b0; - buf_lock <= 'b0; - buf_cache <= 'b0; - buf_prot <= 'b0; - end - else - if(ar_enter | aw_enter) begin - R_or_W <= ar_enter; - buf_id <= ar_enter ? s_arid : s_awid ; - buf_addr <= ar_enter ? s_araddr : s_awaddr ; - buf_len <= ar_enter ? s_arlen : s_awlen ; - buf_size <= ar_enter ? s_arsize : s_awsize ; - buf_burst <= ar_enter ? s_arburst: s_awburst; - buf_lock <= ar_enter ? s_arlock : s_awlock ; - buf_cache <= ar_enter ? s_arcache: s_awcache; - buf_prot <= ar_enter ? s_arprot : s_awprot ; - end - -always@(posedge aclk) - if(~aresetn) write <= 1'b0; - else if(aw_enter) write <= 1'b1; - else if(ar_enter) write <= 1'b0; - -always@(posedge aclk) - if(~aresetn) s_wready <= 1'b0; - else if(aw_enter) s_wready <= 1'b1; - else if(w_enter & s_wlast) s_wready <= 1'b0; - -always@(posedge aclk) - if(~aresetn) begin - cr00 <= 32'd0; - cr01 <= 32'd0; - cr02 <= 32'd0; - cr03 <= 32'd0; - cr04 <= 32'd0; - cr05 <= 32'd0; - cr06 <= 32'd0; - cr07 <= 32'd0; - end - else if(w_enter) begin - case (buf_addr[15:2]) - 14'd0: cr00 <= s_wdata; - 14'd1: cr01 <= s_wdata; - 14'd2: cr02 <= s_wdata; - 14'd3: cr03 <= s_wdata; - 14'd4: cr04 <= s_wdata; - 14'd5: cr05 <= s_wdata; - 14'd6: cr06 <= s_wdata; - 14'd7: cr07 <= s_wdata; - endcase - end - -reg [31:0] s_rdata; -reg s_rvalid,s_rlast; -wire [31:0] rdata_d = buf_addr[15:2] == 14'd0 ? cr00 : - buf_addr[15:2] == 14'd1 ? cr01 : - buf_addr[15:2] == 14'd2 ? cr02 : - buf_addr[15:2] == 14'd3 ? cr03 : - buf_addr[15:2] == 14'd4 ? cr04 : - buf_addr[15:2] == 14'd5 ? cr05 : - buf_addr[15:2] == 14'd6 ? cr06 : - buf_addr[15:2] == 14'd7 ? cr07 : - buf_addr[15:0] == `ORDER_REG_ADDR ? order_addr_reg : - buf_addr[15:0] == `LED_ADDR ? led_data : - buf_addr[15:0] == `LED_RG0_ADDR ? led_rg0_data : - buf_addr[15:0] == `LED_RG1_ADDR ? led_rg1_data : - buf_addr[15:0] == `NUM_ADDR ? num_data : - buf_addr[15:0] == `SWITCH_ADDR ? switch_data : - buf_addr[15:0] == `BTN_KEY_ADDR ? btn_key_data : - buf_addr[15:0] == `BTN_STEP_ADDR ? btn_step_data : - buf_addr[15:0] == `TIMER_ADDR ? timer : 32'd0; - -always@(posedge aclk) - if(~aresetn) begin - s_rdata <= 'b0; - s_rvalid <= 1'b0; - s_rlast <= 1'b0; - end - else if(busy & !write & !r_retire) - begin - s_rdata <= rdata_d; - s_rvalid <= 1'b1; - s_rlast <= 1'b1; - end - else if(r_retire) - begin - s_rvalid <= 1'b0; - end - -reg s_bvalid; -always@(posedge aclk) - if(~aresetn) s_bvalid <= 1'b0; - else if(w_enter) s_bvalid <= 1'b1; - else if(b_retire) s_bvalid <= 1'b0; - -assign s_rid = buf_id; -assign s_bid = buf_id; -assign s_bresp = 2'b0; -assign s_rresp = 2'b0; - -wire write_order_reg = w_enter & (buf_addr[15:0]==`ORDER_REG_ADDR); -always @(posedge aclk) -begin - if(!aresetn) - begin - order_addr_reg <= 32'h0; - end - else if(write_order_reg) - begin - order_addr_reg <= s_wdata[31:0]; - end - else if(write_dma_end | finish_read_order) - begin - order_addr_reg[2] <= write_dma_end ? 1'b0 : order_addr_reg[2]; - order_addr_reg[3] <= finish_read_order ? 1'b0 : order_addr_reg[3]; - end -end -//-------------------------------{timer}begin----------------------------// -wire write_timer = w_enter & (buf_addr[15:0]==`TIMER_ADDR); -always @(posedge aclk) -begin - if(!aresetn) - begin - timer <= 32'd0; - end - else if (write_timer) - begin - timer <= s_wdata[31:0]; - end - else - begin - timer <= timer + 1'b1; - end -end -//--------------------------------{timer}end-----------------------------// - -//--------------------------------{led}begin-----------------------------// -//led display -//led_data[31:0] -wire write_led = w_enter & (buf_addr[15:0]==`LED_ADDR); -assign led = led_data[15:0]; -always @(posedge aclk) -begin - if(!aresetn) - begin - led_data <= 32'h0; - end - else if(write_led) - begin - led_data <= s_wdata[31:0]; - end -end -//---------------------------------{led}end------------------------------// - -//-------------------------------{switch}begin---------------------------// -//switch data -//switch_data[7:0] -assign switch_data = {24'd0,switch}; -//--------------------------------{switch}end----------------------------// - -//------------------------------{btn key}begin---------------------------// -//btn key data -reg [15:0] btn_key_r; -assign btn_key_data = {16'd0,btn_key_r}; - -//state machine -reg [2:0] state; -wire [2:0] next_state; - -//eliminate jitter -reg key_flag; -reg [19:0] key_count; -reg [3:0] state_count; -wire key_start = (state==3'b000) && !(&btn_key_row); -wire key_end = (state==3'b111) && (&btn_key_row); -wire key_sample= key_count[19]; -always @(posedge aclk) -begin - if(!aresetn) - begin - key_flag <= 1'd0; - end - else if (key_sample && state_count[3]) - begin - key_flag <= 1'b0; - end - else if( key_start || key_end ) - begin - key_flag <= 1'b1; - end - - if(!aresetn || !key_flag) - begin - key_count <= 20'd0; - end - else - begin - key_count <= key_count + 1'b1; - end -end - -always @(posedge aclk) -begin - if(!aresetn || state_count[3]) - begin - state_count <= 4'd0; - end - else - begin - state_count <= state_count + 1'b1; - end -end - -always @(posedge aclk) -begin - if(!aresetn) - begin - state <= 3'b000; - end - else if (state_count[3]) - begin - state <= next_state; - end -end - -assign next_state = (state == 3'b000) ? ( (key_sample && !(&btn_key_row)) ? 3'b001 : 3'b000 ) : - (state == 3'b001) ? ( !(&btn_key_row) ? 3'b111 : 3'b010 ) : - (state == 3'b010) ? ( !(&btn_key_row) ? 3'b111 : 3'b011 ) : - (state == 3'b011) ? ( !(&btn_key_row) ? 3'b111 : 3'b100 ) : - (state == 3'b100) ? ( !(&btn_key_row) ? 3'b111 : 3'b000 ) : - (state == 3'b111) ? ( (key_sample && (&btn_key_row)) ? 3'b000 : 3'b111 ) : - 3'b000; -assign btn_key_col = (state == 3'b000) ? 4'b0000: - (state == 3'b001) ? 4'b1110: - (state == 3'b010) ? 4'b1101: - (state == 3'b011) ? 4'b1011: - (state == 3'b100) ? 4'b0111: - 4'b0000; -wire [15:0] btn_key_tmp; -always @(posedge aclk) begin - if(!aresetn) begin - btn_key_r <= 16'd0; - end - else if(next_state==3'b000) - begin - btn_key_r <=16'd0; - end - else if(next_state == 3'b111 && state != 3'b111) begin - btn_key_r <= btn_key_tmp; - end -end - -assign btn_key_tmp = (state == 3'b001)&(btn_key_row == 4'b1110) ? 16'h0001: - (state == 3'b001)&(btn_key_row == 4'b1101) ? 16'h0010: - (state == 3'b001)&(btn_key_row == 4'b1011) ? 16'h0100: - (state == 3'b001)&(btn_key_row == 4'b0111) ? 16'h1000: - (state == 3'b010)&(btn_key_row == 4'b1110) ? 16'h0002: - (state == 3'b010)&(btn_key_row == 4'b1101) ? 16'h0020: - (state == 3'b010)&(btn_key_row == 4'b1011) ? 16'h0200: - (state == 3'b010)&(btn_key_row == 4'b0111) ? 16'h2000: - (state == 3'b011)&(btn_key_row == 4'b1110) ? 16'h0004: - (state == 3'b011)&(btn_key_row == 4'b1101) ? 16'h0040: - (state == 3'b011)&(btn_key_row == 4'b1011) ? 16'h0400: - (state == 3'b011)&(btn_key_row == 4'b0111) ? 16'h4000: - (state == 3'b100)&(btn_key_row == 4'b1110) ? 16'h0008: - (state == 3'b100)&(btn_key_row == 4'b1101) ? 16'h0080: - (state == 3'b100)&(btn_key_row == 4'b1011) ? 16'h0800: - (state == 3'b100)&(btn_key_row == 4'b0111) ? 16'h8000:16'h0000; -//-------------------------------{btn key}end----------------------------// - -//-----------------------------{btn step}begin---------------------------// -//btn step data -reg btn_step0_r; //0:press -reg btn_step1_r; //0:press -assign btn_step_data = {30'd0,~btn_step0_r,~btn_step1_r}; //1:press - -//-----step0 -//eliminate jitter -reg step0_flag; -reg [19:0] step0_count; -wire step0_start = btn_step0_r && !btn_step[0]; -wire step0_end = !btn_step0_r && btn_step[0]; -wire step0_sample= step0_count[19]; -always @(posedge aclk) -begin - if(!aresetn) - begin - step0_flag <= 1'd0; - end - else if (step0_sample) - begin - step0_flag <= 1'b0; - end - else if( step0_start || step0_end ) - begin - step0_flag <= 1'b1; - end - - if(!aresetn || !step0_flag) - begin - step0_count <= 20'd0; - end - else - begin - step0_count <= step0_count + 1'b1; - end - - if(!aresetn) - begin - btn_step0_r <= 1'b1; - end - else if(step0_sample) - begin - btn_step0_r <= btn_step[0]; - end -end - -//-----step1 -//eliminate jitter -reg step1_flag; -reg [19:0] step1_count; -wire step1_start = btn_step1_r && !btn_step[1]; -wire step1_end = !btn_step1_r && btn_step[1]; -wire step1_sample= step1_count[19]; -always @(posedge aclk) -begin - if(!aresetn) - begin - step1_flag <= 1'd0; - end - else if (step1_sample) - begin - step1_flag <= 1'b0; - end - else if( step1_start || step1_end ) - begin - step1_flag <= 1'b1; - end - - if(!aresetn || !step1_flag) - begin - step1_count <= 20'd0; - end - else - begin - step1_count <= step1_count + 1'b1; - end - - if(!aresetn) - begin - btn_step1_r <= 1'b1; - end - else if(step1_sample) - begin - btn_step1_r <= btn_step[1]; - end -end -//------------------------------{btn step}end----------------------------// - -//-------------------------------{led rg}begin---------------------------// -//led_rg0_data[31:0] led_rg0_data[31:0] -//bfd0_f010 bfd0_f014 -wire write_led_rg0 = w_enter & (buf_addr[15:0]==`LED_RG0_ADDR); -wire write_led_rg1 = w_enter & (buf_addr[15:0]==`LED_RG1_ADDR); -assign led_rg0 = led_rg0_data[1:0]; -assign led_rg1 = led_rg1_data[1:0]; -always @(posedge aclk) -begin - if(!aresetn) - begin - led_rg0_data <= 32'h0; - end - else if(write_led_rg0) - begin - led_rg0_data <= s_wdata[31:0]; - end - - if(!aresetn) - begin - led_rg1_data <= 32'h0; - end - else if(write_led_rg1) - begin - led_rg1_data <= s_wdata[31:0]; - end -end -//--------------------------------{led rg}end----------------------------// - -//---------------------------{digital number}begin-----------------------// -//digital number display -//num_data[31:0] -wire write_num = w_enter & (buf_addr[15:0]==`NUM_ADDR); -always @(posedge aclk) -begin - if(!aresetn) - begin - num_data <= 32'h0; - end - else if(write_num) - begin - num_data <= s_wdata[31:0]; - end -end - - -reg [19:0] count; -always @(posedge aclk) -begin - if(!aresetn) - begin - count <= 20'd0; - end - else - begin - count <= count + 1'b1; - end -end -//scan data -reg [3:0] scan_data; -always @ ( posedge aclk ) -begin - if ( !aresetn ) - begin - scan_data <= 32'd0; - num_csn <= 8'b1111_1111; - end - else - begin - case(count[19:17]) - 3'b000 : scan_data <= num_data[31:28]; - 3'b001 : scan_data <= num_data[27:24]; - 3'b010 : scan_data <= num_data[23:20]; - 3'b011 : scan_data <= num_data[19:16]; - 3'b100 : scan_data <= num_data[15:12]; - 3'b101 : scan_data <= num_data[11: 8]; - 3'b110 : scan_data <= num_data[7 : 4]; - 3'b111 : scan_data <= num_data[3 : 0]; - endcase - - case(count[19:17]) - 3'b000 : num_csn <= 8'b0111_1111; - 3'b001 : num_csn <= 8'b1011_1111; - 3'b010 : num_csn <= 8'b1101_1111; - 3'b011 : num_csn <= 8'b1110_1111; - 3'b100 : num_csn <= 8'b1111_0111; - 3'b101 : num_csn <= 8'b1111_1011; - 3'b110 : num_csn <= 8'b1111_1101; - 3'b111 : num_csn <= 8'b1111_1110; - endcase - end -end - -always @(posedge aclk) -begin - if ( !aresetn ) - begin - num_a_g <= 7'b0000000; - end - else - begin - case ( scan_data ) - 4'd0 : num_a_g <= 7'b1111110; //0 - 4'd1 : num_a_g <= 7'b0110000; //1 - 4'd2 : num_a_g <= 7'b1101101; //2 - 4'd3 : num_a_g <= 7'b1111001; //3 - 4'd4 : num_a_g <= 7'b0110011; //4 - 4'd5 : num_a_g <= 7'b1011011; //5 - 4'd6 : num_a_g <= 7'b1011111; //6 - 4'd7 : num_a_g <= 7'b1110000; //7 - 4'd8 : num_a_g <= 7'b1111111; //8 - 4'd9 : num_a_g <= 7'b1111011; //9 - 4'd10: num_a_g <= 7'b1110111; //a - 4'd11: num_a_g <= 7'b0011111; //b - 4'd12: num_a_g <= 7'b1001110; //c - 4'd13: num_a_g <= 7'b0111101; //d - 4'd14: num_a_g <= 7'b1001111; //e - 4'd15: num_a_g <= 7'b1000111; //f - endcase - end -end -//----------------------------{digital number}end------------------------// -endmodule diff --git a/resources/soc/rtl/DMA/dma.v b/resources/soc/rtl/DMA/dma.v deleted file mode 100644 index 04ec940..0000000 --- a/resources/soc/rtl/DMA/dma.v +++ /dev/null @@ -1,778 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -`define DMA_ORDERSIZE 32 -`define DMA_WORDSIZE 32 -`include "config.h" -`define WRITE_LENGTH 16 -`define READ_LENGTH 16 -module dma_master( - clk, - rst_n, - arid, araddr, arlen ,arsize, arburst, arlock, arcache, arprot, arvalid, arready, - rid , rdata , rresp ,rlast , rvalid , rready, - awid, awaddr, awlen ,awsize, awburst, awlock, awcache, awprot, awvalid, awready, - wid , wdata , wstrb ,wlast , wvalid , wready, - bid , bresp , bvalid,bready, - dma_int, order_addr_in,dma_req_in,dma_ack_out, - finish_read_order, write_dma_end,dma_gnt, - apb_valid_req,apb_psel, apb_penable, apb_rw, apb_addr,apb_rdata,apb_wdata - ); -input clk; -input rst_n; -input dma_gnt; - -output [`LID -1 :0] awid; -output [`Lawaddr -1 :0] awaddr; -output [`Lawlen -1 :0] awlen; -output [`Lawsize -1 :0] awsize; -output [`Lawburst -1 :0] awburst; -output [`Lawlock -1 :0] awlock; -output [`Lawcache -1 :0] awcache; -output [`Lawprot -1 :0] awprot; -output awvalid; -input awready; -output [`LID -1 :0] wid; -output [64 -1 :0] wdata; -output [8 -1 :0] wstrb; -output wlast; -output wvalid; -input wready; -input [`LID -1 :0] bid; -input [`Lbresp -1 :0] bresp; -input bvalid; -output bready; -output [`LID -1 :0] arid; -output [`Laraddr -1 :0] araddr; -output [`Larlen -1 :0] arlen; -output [`Larsize -1 :0] arsize; -output [`Larburst -1 :0] arburst; -output [`Larlock -1 :0] arlock; -output [`Larcache -1 :0] arcache; -output [`Larprot -1 :0] arprot; -output arvalid; -input arready; -input [`LID -1 :0] rid; -input [64 -1 :0] rdata; -input [`Lrresp -1 :0] rresp; -input rlast; -input rvalid; -output rready; - -output dma_int; -output dma_ack_out; -input [31:0] order_addr_in; -input dma_req_in; -output finish_read_order; -output write_dma_end; - -output apb_psel; -output apb_valid_req; -output apb_penable; -output apb_rw; -output [31:0] apb_addr; -input [31:0] apb_rdata; -output [31:0] apb_wdata; - -wire read_idle; -wire read_ready; -wire get_order; -wire read_order; -wire finish_read_order; -wire r_ddr_wait; -wire read_ddr; -wire read_ddr_end; -wire read_dev; -wire read_dev_end; -wire read_step_end; -wire write_idle; -wire write_ready; -wire w_ddr_wait; -wire write_ddr; -wire write_ddr_end; -wire w_dma_wait; -wire write_dma; -wire write_dma_end ; -wire write_step_end; -wire rresp_ok = (rresp==2'h0); -wire bresp_ok = (bresp==2'h0); - -wire dma_start; -wire dma_stop; -wire ask_valid; -wire [31:0] ask_addr; -wire [ 1:0] device_num_tmp; -assign device_num_tmp = order_addr_in[1:0]; -assign ask_valid = order_addr_in[2] ; -assign dma_start = order_addr_in[3] ; -assign dma_stop = order_addr_in[4] & - (read_ddr_end | read_dev_end | read_step_end | read_idle ) & - (write_ddr_end | write_dma_end | write_step_end | write_idle); -assign ask_addr = {order_addr_in[31:5], 5'h0}; - -reg [ 3:0] dma_read_state; -reg [ 3:0] dma_write_state; -reg [31:0] count_length; -reg [ 4:0] count_fifo_r; -reg [ 4:0] count_fifo_w; -reg [ 5:0] count_fifo; -reg [31:0] mem [31:0]; -reg dma_r_w; -reg [31:0] dma_order_addr; -reg [31:0] dma_mem_addr; -reg [31:0] dma_dev_addr; -reg [31:0] dma_length; -reg [31:0] dma_step_length; -reg [31:0] dma_step_times; -reg [31:0] dma_state_reg; -reg dma_get_order; - -wire [31:0]mem0 = mem[0]; -wire [31:0]mem1 = mem[1]; -wire [31:0]mem2 = mem[2]; -wire [31:0]mem3 = mem[3]; -wire [31:0]mem4 = mem[4]; -wire [31:0]mem5 = mem[5]; -wire [31:0]mem6 = mem[6]; -wire [31:0]mem7 = mem[7]; -wire [31:0]mem8 = mem[8]; -wire [31:0]mem9 = mem[9]; -wire [31:0]mem10 = mem[10]; -wire [31:0]mem11 = mem[11]; -wire [31:0]mem12 = mem[12]; -wire [31:0]mem13 = mem[13]; -wire [31:0]mem14 = mem[14]; -wire [31:0]mem15 = mem[15]; -wire [31:0]mem16 = mem[16]; -wire [31:0]mem17 = mem[17]; -wire [31:0]mem18 = mem[18]; -wire [31:0]mem19 = mem[19]; -wire [31:0]mem20 = mem[20]; -wire [31:0]mem21 = mem[21]; -wire [31:0]mem22 = mem[22]; -wire [31:0]mem23 = mem[23]; -wire [31:0]mem24 = mem[24]; -wire [31:0]mem25 = mem[25]; -wire [31:0]mem26 = mem[26]; -wire [31:0]mem27 = mem[27]; -wire [31:0]mem28 = mem[28]; -wire [31:0]mem29 = mem[29]; -wire [31:0]mem30 = mem[30]; -wire [31:0]mem31 = mem[31]; - -wire dma_order_en; -wire[ 3:0] dma_next_read_state; -wire[ 3:0] dma_next_write_state; -wire[31:0] count_obj; -wire dma_single_trans_over; -wire dma_trans_over; -wire dma_state_change_en; -wire dma_int_mask; - -assign dma_int_mask = dma_state_reg[0]; -assign dma_int = dma_state_reg[1]; -assign dma_order_en = dma_order_addr[0]; - -reg dma_req_in_reg_1, dma_req_in_reg_2; -reg dma_req_r; -reg dma_req; -always @(posedge clk)begin - if (~rst_n) begin - dma_req_in_reg_1 <= 1'b0; - dma_req_in_reg_2 <= 1'b0; - end else begin - dma_req_in_reg_1 <= dma_req_in; - dma_req_in_reg_2 <= dma_req_in_reg_1; - end -end -always @(posedge clk)begin - if (~rst_n) - dma_req_r <= 1'b0; - else - dma_req_r <= dma_req_in_reg_2; -end -always @(posedge clk)begin - if (~rst_n) - dma_req <= 1'b0; - else if (dma_ack_out | !dma_req_in_reg_2) - dma_req <= 1'b0; - else if (~dma_req_r & dma_req_in_reg_2) - dma_req <= 1'b1; -end - -parameter READ_IDLE = 4'h0; -parameter READ_READY = 4'h1; -parameter GET_ORDER = 4'h2; -parameter READ_ORDER = 4'h3; -parameter FINISH_READ_ORDER = 4'h4; -parameter R_DDR_WAIT = 4'h5; -parameter READ_DDR = 4'h6; -parameter READ_DDR_END = 4'h7; -parameter READ_DEV = 4'h8; -parameter READ_DEV_END = 4'h9; -parameter READ_STEP_END = 4'ha; - -assign read_idle = dma_read_state==READ_IDLE; -assign read_ready = dma_read_state==READ_READY; -assign get_order = dma_read_state==GET_ORDER; -assign read_order = dma_read_state==READ_ORDER; -assign finish_read_order = dma_read_state==FINISH_READ_ORDER; -assign r_ddr_wait = dma_read_state==R_DDR_WAIT; -assign read_ddr = dma_read_state==READ_DDR; -assign read_ddr_end = dma_read_state==READ_DDR_END; -assign read_dev = dma_read_state==READ_DEV; -assign read_dev_end = dma_read_state==READ_DEV_END; -assign read_step_end = dma_read_state==READ_STEP_END; - -assign dma_single_trans_over = (write_step_end | read_step_end & (count_fifo==0)) & (count_length==32'b0) & (dma_step_times==32'b1) ? 1'b1 : 1'b0; -assign dma_trans_over = dma_single_trans_over & !dma_order_en; -reg dma_trans_over_reg; -always @(posedge clk)begin - if(!rst_n) - dma_trans_over_reg <= 1'b0; - else if(dma_trans_over) - dma_trans_over_reg <= 1'b1; - else if((read_idle & write_idle) & dma_start) - dma_trans_over_reg <= 1'b0; -end - -wire [5:0] num_fifo; -wire read_ddr_again = !dma_get_order & dma_r_w & (count_fifo <= `READ_LENGTH) & (count_length!=0) & (num_fifo >6'h0); -wire read_dev_again = !dma_get_order & !dma_r_w & dma_req & (count_fifo < 6'h20); - -assign dma_next_read_state = read_idle ? (dma_start ? READ_READY : READ_IDLE) : - read_ready ? (dma_get_order ? GET_ORDER : read_ddr_again ? R_DDR_WAIT : read_dev_again ? READ_DEV : READ_READY) : - get_order ? (arready ? READ_ORDER : GET_ORDER) : - read_order ? (rvalid & rlast & rready & rresp_ok ? FINISH_READ_ORDER : READ_ORDER) : - finish_read_order ? READ_READY : - r_ddr_wait ? (arready ? READ_DDR : R_DDR_WAIT) : - read_ddr ? (rvalid & rready & rlast & rresp_ok ? READ_DDR_END : READ_DDR) : - read_ddr_end ? ((count_length==0) ? READ_STEP_END : read_ddr_again ? R_DDR_WAIT : READ_DDR_END) : - read_step_end ? ((dma_trans_over | dma_stop) ? READ_IDLE : dma_get_order ? GET_ORDER : read_ddr_again ? R_DDR_WAIT : READ_STEP_END) : - read_dev ? ((dma_trans_over | dma_stop) ? READ_IDLE : dma_get_order ? GET_ORDER : apb_penable ? READ_DEV_END : READ_DEV) : - read_dev_end ? ((dma_trans_over | dma_stop) ? READ_IDLE : dma_get_order ? GET_ORDER : read_dev_again ? READ_DEV : READ_DEV_END) : READ_IDLE; - - -reg [1:0]arb_write_op; -wire aw_empty = (arb_write_op==2'b01) & write_ddr_end || (arb_write_op==2'b00) & write_dma_end || (arb_write_op==2'b11); -wire write_ddr_ok = ((count_fifo >= `WRITE_LENGTH) | (count_fifo >= count_length)) & (count_length!=0); -always @(posedge clk)begin - if(!rst_n | dma_stop) - arb_write_op <= 2'b11; - else if(ask_valid & aw_empty & (arb_write_op!=0)) - arb_write_op <= 2'b00; - else if(!dma_r_w & write_ddr_ok & aw_empty) - arb_write_op <= 2'b01; - else if(aw_empty) - arb_write_op <= 2'b11; -end - -wire write_ddr_again = !dma_get_order & (arb_write_op==2'b01) & write_ddr_ok; -wire write_dma_again = !dma_get_order & (arb_write_op==2'b00); - -parameter WRITE_IDLE = 4'h0; -parameter W_DDR_WAIT = 4'h1; -parameter WRITE_DDR = 4'h2; -parameter WRITE_DDR_END = 4'h3; -parameter W_DMA_WAIT = 4'h4; -parameter WRITE_DMA = 4'h5; -parameter WRITE_DMA_END = 4'h6; -parameter WRITE_STEP_END = 4'h7; -assign write_idle = dma_write_state==WRITE_IDLE; -assign w_ddr_wait = dma_write_state==W_DDR_WAIT; -assign write_ddr = dma_write_state==WRITE_DDR; -assign write_ddr_end = dma_write_state==WRITE_DDR_END; -assign w_dma_wait = dma_write_state==W_DMA_WAIT; -assign write_dma = dma_write_state==WRITE_DMA; -assign write_dma_end = dma_write_state==WRITE_DMA_END; -assign write_step_end = dma_write_state==WRITE_STEP_END; -reg awvalid_dma; -assign dma_next_write_state = write_idle ? (write_dma_again ? W_DMA_WAIT : write_ddr_again ? W_DDR_WAIT : WRITE_IDLE) : - w_ddr_wait ? (awready ? WRITE_DDR : W_DDR_WAIT) : - write_ddr ? (bvalid & bresp_ok & bready ? WRITE_DDR_END : WRITE_DDR) : - write_ddr_end ? (write_dma_again ? W_DMA_WAIT : (count_length==0) ? WRITE_STEP_END : write_ddr_again ? W_DDR_WAIT : WRITE_DDR_END): - w_dma_wait ? (awvalid_dma & awready ? WRITE_DMA : W_DMA_WAIT) : - write_dma ? (bvalid & bresp_ok & bready ? WRITE_DMA_END : WRITE_DMA) : - write_dma_end ? (dma_r_w ? WRITE_IDLE : (count_length==0) ? WRITE_STEP_END : write_ddr_again ? W_DDR_WAIT : WRITE_DMA_END) : - write_step_end ? ((dma_trans_over | dma_stop | (count_length==0)&(dma_step_times==32'h1)) ? WRITE_IDLE : - write_dma_again ? W_DMA_WAIT : write_ddr_again ? W_DDR_WAIT : WRITE_STEP_END) : WRITE_IDLE; - -wire [1:0] ac97_mod = dma_dev_addr[29:28]; -wire byte_mod = (ac97_mod == 2'b00); -wire half_mod = (ac97_mod == 2'b01); -wire word_mod = (ac97_mod == 2'b10); -wire [31:0] mem_0 = mem[count_fifo_w]; -wire [31:0] mem_1 = mem[count_fifo_w+1]; -wire [31:0] wdata_tmp0_tmp = byte_mod ? {mem_1[23:16], mem_1[7 :0], mem_0[23:16], mem_0[7 :0]} : half_mod ? {mem_1[15: 0], mem_0[15: 0]} : mem_0; -wire [31:0] wdata_tmp1_tmp = byte_mod ? {mem_1[31:24], mem_1[15:8], mem_0[31:24], mem_0[15:8]} : half_mod ? {mem_1[31:16], mem_0[31:16]} : mem_1; -wire [31:0] wdata_tmp0 = dma_dev_addr[30] ? wdata_tmp0_tmp : mem_0; -wire [31:0] wdata_tmp1 = dma_dev_addr[30] ? wdata_tmp1_tmp : mem_0; -reg [32:0] reg_ac97; -wire write_dev_ok = ((dma_dev_addr[31:30]==2'b11) ? (reg_ac97[32] | (count_fifo>=6'h2)) : (count_fifo>=6'h1)) & dma_req & dma_r_w; -always@(posedge clk)begin - if(!rst_n) - reg_ac97 <= 33'h0; - else if(apb_penable & dma_dev_addr[31] & !reg_ac97[32]) - reg_ac97 <= {1'b1, wdata_tmp1}; - else if(apb_penable & reg_ac97[32]) - reg_ac97[32] <= 1'b0; -end - -reg arvalid_dev; -always @(posedge clk)begin - if(!rst_n) - arvalid_dev <= 1'b0; - else if(arvalid_dev & apb_penable) - arvalid_dev <= 1'b0; - else if((read_dev & !dma_get_order | read_dev_end) & read_dev_again) - arvalid_dev <= 1'b1; -end - -reg awvalid_dev; -always @(posedge clk)begin - if(!rst_n) - awvalid_dev <= 1'b0; - else if(awvalid_dev & apb_penable) - awvalid_dev <= 1'b0; - else if(write_dev_ok) - awvalid_dev <= 1'b1; -end -assign dma_ack_out = apb_psel; - -assign dma_state_change_en = (dma_read_state !=dma_next_read_state) | (dma_write_state!=dma_next_write_state); -always@(posedge clk)begin - if(!rst_n | dma_trans_over | dma_stop)begin - dma_read_state <= READ_IDLE; - dma_write_state <= WRITE_IDLE; - end else if(dma_state_change_en)begin - dma_read_state <= dma_next_read_state; - dma_write_state <= dma_next_write_state; - end -end - -always@(posedge clk)begin - if(~rst_n | finish_read_order | dma_stop) - dma_get_order <= 1'b0; - else if((read_idle & write_idle) & dma_start | dma_single_trans_over & dma_order_en) - dma_get_order <= 1'b1; -end - -wire [2:0] size_tmp = read_ddr ? arsize : awsize; -wire [1:0] read_size = read_dev ? 2'h1 : (arsize==3'h3) ? 2'h2 : 2'h1; -wire [1:0] write_size = awvalid_dev ? (((dma_dev_addr[31:30]==2'b11) & (count_fifo>32'h1)) ? 2'h2 : 2'h1) : (awsize==3'h3) ? 2'h2 : 2'h1; - -always@(posedge clk)begin - if(~rst_n) - count_length <= 32'b0; - else if (dma_stop) - count_length <= 32'b0; - else if(finish_read_order) - count_length <= dma_length; - else if(dma_get_order) - count_length <= `DMA_ORDERSIZE; - else if(((read_ddr_end | write_ddr_end) & count_length==32'b0) & (dma_step_times > 32'h1)) - count_length <= dma_length; - else if(read_ddr & rvalid & rready & rresp_ok | write_ddr & wvalid & wready) - count_length <= count_length - ((size_tmp==3'h3) ? 2'h2 : 2'h1); -end - -reg [4:0] read_num; -reg [4:0] write_num; -always@(posedge clk)begin - if(~rst_n | dma_single_trans_over | dma_stop)begin - count_fifo_r <= 5'h0; - read_num <= 5'h0; - end else if(read_ddr & rvalid & rready & rresp_ok | read_dev & apb_penable)begin - count_fifo_r <= count_fifo_r + read_size; - read_num <= read_ddr ? (rlast ? 5'h0 : read_num + 1'b1) : read_num; - end -end -always@(posedge clk)begin - if(~rst_n | dma_single_trans_over | dma_stop)begin - count_fifo_w <= 5'h0; - write_num <= 5'h0; - end else if(write_ddr & wvalid & wready | awvalid_dev & apb_penable & !reg_ac97[32])begin - count_fifo_w <= count_fifo_w + write_size; - write_num <= write_ddr ? (wlast ? 5'h0 : write_num + 1'b1) : write_num; - end -end - -reg write_dma_to_ddr; -reg [1:0]dma_num; - -always@(posedge clk)begin - if(~rst_n)begin - dma_num <= 2'h0; - write_dma_to_ddr <= 1'h0; -end - else if(write_dma & wvalid & wready)begin - dma_num <= dma_num + 1'b1; - write_dma_to_ddr <= !write_dma_to_ddr; -end -end - -wire [1:0] fifo_read_add = {2{(read_ddr & rvalid & rready | read_dev & apb_penable)}} & read_size; -wire [1:0] fifo_write_sum = {2{(write_ddr & wvalid & wready | awvalid_dev & apb_penable & !reg_ac97[32])}} & write_size; -always@(posedge clk)begin - if(~rst_n | dma_single_trans_over | dma_stop) - count_fifo <= 6'h0; - else - count_fifo <= count_fifo + fifo_read_add - fifo_write_sum; -end - -reg arvalid_dma; -wire [31:0] araddr_dma; -wire [3 :0] arlen_dma; -wire [2 :0] arsize_dma; -reg getting_dma; -always @(posedge clk)begin - if(!rst_n)begin - arvalid_dma <= 1'b0; - getting_dma <= 1'b0; - end else if(arvalid_dma & arready) - arvalid_dma <= 1'b0; - else if(dma_get_order & !getting_dma)begin - arvalid_dma <= 1'b1; - getting_dma <= 1'b1; - end else if(finish_read_order | dma_stop) - getting_dma <= 1'b0; -end -assign araddr_dma = (dma_start & dma_get_order) ? ask_addr : {dma_order_addr[31:5], 5'h0}; -assign arlen_dma = 4'h3; -assign arsize_dma = 3'h3; - -wire [2:0] arsize_ddr_tmp; -wire [3:0] arlen_ddr_tmp; -wire [5:0] left_fifo = `DMA_WORDSIZE - count_fifo; -wire enough_8; -assign num_fifo = (count_length >= left_fifo) ? left_fifo : count_length; -wire [3:0] arlen_tmp = (num_fifo >= 6'h10) ? 4'hf : (num_fifo-1'b1); -assign enough_8 = (num_fifo >= 6'h2); -assign arsize_ddr_tmp = (dma_mem_addr[2:0]==3'h0) & enough_8 ? 3'h3 : 3'h2; -assign arlen_ddr_tmp = (dma_mem_addr[2:0]==3'h0) & enough_8 ? (num_fifo[5] ? 4'hf : (num_fifo[5:1]-1'b1)): arlen_tmp; - -reg arvalid_ddr; -reg [31:0] araddr_ddr; -reg [3 :0] arlen_ddr; -reg [2: 0] arsize_ddr; -always @(posedge clk)begin - if(!rst_n) - arvalid_ddr <= 1'b0; - else if(arready & arvalid_ddr) - arvalid_ddr <= 1'b0; - else if((read_ready & !dma_get_order | read_ddr_end | read_step_end) & read_ddr_again & !dma_stop) - arvalid_ddr <= 1'b1; -end - -always @(posedge clk)begin - if(!rst_n) - begin - araddr_ddr <= 32'b0; - arsize_ddr <= 3'b0; - arlen_ddr <= 4'b0; - end - else if((read_ready & !dma_get_order | read_ddr_end | read_step_end) & read_ddr_again)begin - araddr_ddr <= dma_mem_addr; - arsize_ddr <= arsize_ddr_tmp; - arlen_ddr <= arlen_ddr_tmp; - end -end - -assign arvalid = dma_get_order ? arvalid_dma : dma_r_w ? arvalid_ddr : 1'b0; -assign araddr = dma_get_order ? {32'h0, araddr_dma} : {32'h0, araddr_ddr}; -assign arsize = dma_get_order ? arsize_dma : arsize_ddr; -assign arlen = dma_get_order ? arlen_dma : arlen_ddr; -assign arid = dma_get_order ? {4'h0, 4'h1} : {4'h0, 4'h2}; -assign arburst = 2'h1; -assign arlock = 2'h0; -assign arprot = 3'h0; -assign arcache = 4'h0; -assign rready = 1'h1; - -wire[31:0] count_sou; -assign count_sou = araddr_ddr + {read_num, 2'h0}; -wire [31:0]read_data_word = !count_sou[2] ? rdata[31:0] : rdata[63:32]; - -integer i; -always@(posedge clk) -begin - if(~rst_n | dma_stop | dma_single_trans_over) - begin - for(i=0;i<=31;i=i+1) mem[i] <= 32'b0; - end - else if(read_ddr & rvalid & rready & rresp_ok & arsize==3'h2) - mem[count_fifo_r] <= read_data_word; - else if(read_ddr & rvalid & rready & rresp_ok & arsize==3'h3) - {mem[count_fifo_r+1], mem[count_fifo_r]} <= rdata; - else if(read_dev & apb_penable) - mem[count_fifo_r] <= apb_rdata; -end - -reg [1:0]reg_num; -always@(posedge clk)begin - if(~rst_n | dma_stop)begin - dma_r_w <= 1'b0; - dma_order_addr <= 32'b0; - dma_mem_addr <= 32'b0; - dma_dev_addr <= 32'b0; - dma_length <= 32'b0; - dma_step_length<= 32'b0; - dma_step_times <= 32'b0; - reg_num <= 2'b0; - end - else begin - if(read_ddr & rvalid & rready & rresp_ok | write_ddr & wvalid & wready) - dma_mem_addr <= dma_mem_addr + ((size_tmp==3'h3) ? 4'h8 : 3'h4); - else if((write_ddr_end | read_ddr_end) & (count_length==32'b0) & dma_step_times>32'b1)begin - dma_step_times <= dma_step_times - 1; - dma_mem_addr <= dma_mem_addr + {dma_step_length, 2'h0}; - end else if(read_order & rvalid & rready & rresp_ok & (reg_num==2'h0))begin - dma_order_addr <= rdata[31 : 0]; - dma_mem_addr <= rdata[63 :32]; - reg_num <= reg_num + 1'b1; - end else if(read_order & rvalid & rready & rresp_ok & (reg_num==2'h1))begin - dma_dev_addr <= rdata[31 : 0]; - dma_length <= rdata[63 :32]; - reg_num <= reg_num + 1'b1; - end else if(read_order & rvalid & rready & rresp_ok & (reg_num==2'h2))begin - dma_step_length<= rdata[31: 0]; - dma_step_times <= rdata[63:32]; - reg_num <= reg_num + 1'b1; - end else if(read_order & rvalid & rready & rresp_ok & rlast)begin - dma_r_w <= rdata[12]; - reg_num <= 2'b0; - end - end -end - -reg dma_int_en; -reg dma_int_i; -always@(posedge clk)begin - if(~rst_n) - dma_state_reg <= 32'b0; - else if(read_order & rvalid & rready & rresp_ok & rlast) - dma_state_reg <= rdata[31:0]; - else if(dma_start == 1'b1) - dma_state_reg[1] <= 1'b0; - else if(dma_int_i & dma_int_en) - dma_state_reg[1] <= 1'b1; - else if(dma_state_reg[1]) - dma_state_reg[1] <= 1'b0; -end - -reg dma_int_tmp; -always@(posedge clk) -begin - if(!rst_n) - dma_int_i <= 1'b0; - else if(dma_single_trans_over & dma_int_mask & !dma_int_i) - dma_int_i <= 1'b1; - else if(dma_int_i & dma_int_en) - dma_int_i <= 1'b0; -end - -always@(posedge clk) -begin - if(!rst_n) - dma_int_tmp <= 1'b0; - else - dma_int_tmp <= dma_int_i; -end -always@(posedge clk) -begin - if(!rst_n) - dma_int_en <= 1'b1; - else if(dma_int_tmp & dma_int_en) - dma_int_en <= 1'b0; - else if(!dma_int_i) - dma_int_en <= 1'b1; -end - -wire [5:0] write_length; -wire enough_8_1; -wire [2:0] awsize_ddr_tmp; -wire [3:0] awlen_ddr_tmp; -wire [3:0] awlen_tmp; -assign write_length = (count_fifo >= count_length) ? count_length[5:0] : count_fifo; -assign enough_8_1 = (write_length >= 3'h2); -assign awlen_tmp = (write_length >= 5'h10) ? 4'hf : (write_length - 1'b1); -assign awsize_ddr_tmp = (dma_mem_addr[2:0]==3'h0) & enough_8_1 ? 3'h3 : 3'h2; -assign awlen_ddr_tmp = (dma_mem_addr[2:0]==3'h0) & enough_8_1 ? (write_length[5]? 4'hf : (write_length[5:1] - 1'b1)) : awlen_tmp; -reg awvalid_ddr; -reg [31:0] awaddr_ddr; -reg [3 :0] awlen_ddr; -reg [2 :0] awsize_ddr; -reg wvalid_ddr; -always @(posedge clk)begin - if(!rst_n) - awvalid_ddr <= 1'b0; - else if(awvalid_ddr & awready) - awvalid_ddr <= 1'b0; - else if(write_ddr_again & !write_dma_again & (write_idle | write_ddr_end | write_dma_end | write_step_end) & !dma_stop) - awvalid_ddr <= 1'b1; -end -always @(posedge clk)begin - if(!rst_n) - begin - awaddr_ddr <= 32'b0; - awsize_ddr <= 3'b0; - awlen_ddr <= 4'b0; - end - else if(write_ddr)begin - awaddr_ddr <= awaddr_ddr; - awsize_ddr <= awsize_ddr; - awlen_ddr <= awlen_ddr; - end else if(write_ddr_again & !write_dma_again & (write_idle | write_ddr_end | write_dma_end | write_step_end))begin - awaddr_ddr <= dma_mem_addr; - awsize_ddr <= awsize_ddr_tmp; - awlen_ddr <= awlen_ddr_tmp; - end -end -always @(posedge clk)begin - if(!rst_n) - wvalid_ddr <= 1'b0; - else if (awvalid_ddr & awready)begin - wvalid_ddr <= 1'b1; - end - else if(write_ddr & wvalid & wready)begin - wvalid_ddr <= !wlast; - end -end -assign count_obj = awaddr_ddr + {write_num, 2'h0}; -wire [63:0] wdata_word = !count_obj[2] ? {32'h0, mem[count_fifo_w]} : {mem[count_fifo_w], 32'h0}; -wire [7 :0] wstrb_word = !count_obj[2] ? 8'h0f : 8'hf0; -wire [63:0] wdata_64 = {mem[count_fifo_w+1], mem[count_fifo_w]}; -wire [63:0] wdata_ddr; -wire [15:0] wstrb_ddr; -wire wlast_ddr; -assign wdata_ddr = (awsize_ddr==3'h2) ? wdata_word : wdata_64; -assign wstrb_ddr = (awsize_ddr==3'h2) ? wstrb_word : 8'hff; -assign wlast_ddr = (write_num==awlen_ddr); - -reg wvalid_dma; -wire [31:0] awaddr_dma; -wire [3 :0] awlen_dma; -wire [2 :0] awsize_dma; -wire [63:0] wdata_dma; -wire [15 :0] wstrb_dma; -wire wlast_dma; -always @(posedge clk)begin - if(!rst_n) - awvalid_dma <= 1'b0; - else if(awvalid_dma & awready) - awvalid_dma <= 1'b0; - else if(write_dma_again & !dma_stop & w_dma_wait) - awvalid_dma <= 1'b1; -end -always @(posedge clk)begin - if(!rst_n) - wvalid_dma <= 1'b0; - else if (awvalid_dma & awready) - wvalid_dma <= 1'b1; - else if(write_dma & wvalid & wready) - wvalid_dma <= !wlast; -end - -wire [63:0] dma_data0; -wire [63:0] dma_data1; -wire [63:0] dma_data2; -wire [63:0] dma_data3; -wire [31:0] dma_state_tmp = {19'h0, dma_r_w, dma_write_state, dma_read_state, dma_trans_over_reg, - dma_single_trans_over, dma_int, dma_int_mask}; - -assign dma_data0 = {dma_mem_addr, dma_order_addr }; -assign dma_data1 = {dma_length, dma_dev_addr }; -assign dma_data2 = {dma_step_times, dma_step_length}; -assign dma_data3 = {32'h0, dma_state_tmp }; - -assign awaddr_dma = ask_addr; -assign awlen_dma = 4'h3; -assign awsize_dma = 3'h3; - -assign wlast_dma = (dma_num== 2'h3); -assign wdata_dma = (dma_num==2'h0) ? dma_data0 : (dma_num==2'h1) ? dma_data1 : (dma_num==2'h2) ? dma_data2 : dma_data3; -assign wstrb_dma = (dma_num!=2'h3) ? 8'hff : 8'h0f; - -assign awvalid = awvalid_dma | awvalid_ddr ; -assign awaddr = awvalid_dma ? {32'h0, awaddr_dma} : {32'h0, awaddr_ddr}; -assign awlen = awvalid_dma ? awlen_dma : awlen_ddr; -assign awsize = awvalid_dma ? awsize_dma : awsize_ddr; -assign awid = awvalid_dma ? {4'h0, 4'h1} : {4'h0, 4'h2}; -assign awburst = 2'h1; -assign awlock = 2'h0; -assign awprot = 3'h0; -assign awcache = 4'h0; -assign wvalid = wvalid_dma | wvalid_ddr ; -assign wid = wvalid_dma ? {4'h0, 4'h1} : {4'h0, 4'h2}; -assign wdata = wvalid_dma ? wdata_dma : wdata_ddr; -assign wstrb = wvalid_dma ? wstrb_dma : wstrb_ddr; -assign wlast = wvalid_dma ? wlast_dma : wlast_ddr; -assign bready = 1'b1; - -wire apb_valid_req; -reg apb_psel; -reg apb_penable; -reg apb_rw; -wire [31:0]apb_addr; -wire [31:0]apb_wdata; -assign apb_valid_req = arvalid_dev || awvalid_dev ; -assign apb_addr = dma_dev_addr[31] ? (reg_ac97[32] ? {24'h1fe600, dma_dev_addr[15:8]} :{24'h1fe600, dma_dev_addr[7:0]}) : dma_dev_addr; -assign apb_wdata= reg_ac97[32] ? reg_ac97[31:0] : wdata_tmp0; -always@(posedge clk) -begin - if(~rst_n)begin - apb_psel<= 1'b0; - apb_penable <= 1'b0; - apb_rw <= 1'b0; - end - else begin - if(dma_gnt) begin - if(apb_penable)begin - apb_psel <= 1'b0; - apb_rw <= 1'b0; - apb_penable <= 1'b0; - end else if(arvalid_dev | awvalid_dev) begin - apb_psel <= 1'b1; - apb_rw <= awvalid_dev ; - apb_penable <= apb_psel; - end else - apb_penable <= apb_psel; - end else begin - apb_psel<= 1'b0; - apb_penable <= 1'b0; - apb_rw <= 1'b0; - end - end -end - -endmodule diff --git a/resources/soc/rtl/MAC/bd.v b/resources/soc/rtl/MAC/bd.v deleted file mode 100644 index 2a4146f..0000000 --- a/resources/soc/rtl/MAC/bd.v +++ /dev/null @@ -1,372 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -module BD ( - clk, - rst, - col, - crs, - fdp, - tprog, - preamble, - tpend, - winp, - tiack, - coll, - carrier, - bkoff, - lc, - lo, - nc, - ec, - cc - ); - - `include "utility.v" - - input clk; - input rst; - - input col; - input crs; - - input fdp; - - input tprog; - input preamble; - input tpend; - output winp; - wire winp; - input tiack; - output coll; - wire coll; - output carrier; - wire carrier; - output bkoff; - wire bkoff; - output lc; - wire lc; - output lo; - reg lo; - output nc; - wire nc; - output ec; - reg ec; - output [3:0] cc; - wire [3:0] cc; - - - reg crs_r; - reg inc; - - reg ibkoff; - reg ibkoff_r; - reg icoll; - reg ilc; - reg [3:0] ccnt; - reg [9:0] bkcnt; - reg [8:0] slcnt; - reg [9:0] bkrel_c; - wire [9:0] p_rand; - reg [31:0] lfsr; - reg [31:0] lfsr_c; - reg iwinp; - - always @(posedge clk) - begin : crs_reg_proc - if (rst) - begin - crs_r <= 1'b0 ; - lo <= 1'b0 ; - inc <= 1'b0 ; - end - else - begin - if (fdp) - begin - crs_r <= 1'b0 ; - end - else - begin - crs_r <= crs ; - end - - if (tprog & !inc & !crs_r) - begin - lo <= 1'b1 ; - end - else if(!tpend & !tprog) - begin - lo <= 1'b0 ; - end - - if (tprog & crs_r) - begin - inc <= 1'b0 ; - end - else if (!tpend & !tprog) - begin - inc <= 1'b1 ; - end - end - end - - assign nc = inc ; - - always @(ccnt or p_rand) - begin : bkrel_proc - case (ccnt) - 4'b0000 : - begin - bkrel_c <= {9'b000000000, p_rand[0]} ; - end - 4'b0001 : - begin - bkrel_c <= {8'b00000000, p_rand[1:0]} ; - end - 4'b0010 : - begin - bkrel_c <= {7'b0000000, p_rand[2:0]} ; - end - 4'b0011 : - begin - bkrel_c <= {6'b000000, p_rand[3:0]} ; - end - 4'b0100 : - begin - bkrel_c <= {5'b00000, p_rand[4:0]} ; - end - 4'b0101 : - begin - bkrel_c <= {4'b0000, p_rand[5:0]} ; - end - 4'b0110 : - begin - bkrel_c <= {3'b000, p_rand[6:0]} ; - end - 4'b0111 : - begin - bkrel_c <= {2'b00, p_rand[7:0]} ; - end - 4'b1000 : - begin - bkrel_c <= {1'b0, p_rand[8:0]} ; - end - default : - begin - bkrel_c <= p_rand[9:0] ; - end - endcase - end - - always @(posedge clk) - begin : slcnt_reg_proc - if (rst) - begin - slcnt <= {9{1'b1}} ; - end - else - begin - if (tprog & !preamble & !icoll) - begin - if (slcnt != 9'b000000000) - begin - slcnt <= slcnt - 1 ; - end - end - else if (ibkoff) - begin - if (slcnt == 9'b000000000 | icoll) - begin - slcnt <= SLOT_TIME ; - end - else - begin - slcnt <= slcnt - 1 ; - end - end - else - begin - slcnt <= SLOT_TIME ; - end - end - end - - always @(posedge clk) - begin : bkcnt_reg_proc - if (rst) - begin - bkcnt <= {10{1'b1}} ; - end - else - begin - if (icoll & !ibkoff) - begin - bkcnt <= bkrel_c ; - end - else if (slcnt == 9'b000000000) - begin - bkcnt <= bkcnt - 1 ; - end - end - end - - always @(posedge clk) - begin : rand_reg_proc - if (rst) - begin - lfsr <= {31{1'b1}}; - end - else - begin - lfsr <= lfsr_c; - end - end - - always @(lfsr) - begin : lfsr_drv - - reg [31:0] lfsr_n; - - integer i; - for(i=0; i<=30; i=i+1) - begin - lfsr_n[i] = lfsr[i+1]; - end - - lfsr_n[31] = 1'b0; - if(lfsr[0]==1'b1) - begin - lfsr_n = lfsr_n ^ 32'b10000000000000000000111010100110; - end - - lfsr_c <= lfsr_n; - - end - - assign p_rand = lfsr[9:0] ; - - - always @(posedge clk) - begin : ibkoff_reg_proc - if (rst) - begin - ibkoff <= 1'b0 ; - ibkoff_r <= 1'b0 ; - end - else - begin - ibkoff_r <= ibkoff ; - if(icoll & ccnt!=4'b1111 & !iwinp & !ilc) - begin - ibkoff <= 1'b1 ; - end - else if (bkcnt == 10'b0000000000) - begin - ibkoff <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : coll_reg_proc - if (rst) - begin - icoll <= 1'b0 ; - ilc <= 1'b0 ; - ec <= 1'b0 ; - iwinp <= 1'b1 ; - ccnt <= 4'b0000 ; - end - else - begin - if ((preamble | tprog) & col & !fdp) - begin - icoll <= 1'b1 ; - end - else if (!tprog & !preamble) - begin - icoll <= 1'b0 ; - end - - if (tiack) - begin - ilc <= 1'b0 ; - end - else if (tprog & icoll & iwinp) - begin - ilc <= 1'b1 ; - end - - if (tiack) - begin - ec <= 1'b0 ; - end - else if (icoll & ccnt == 4'b1111 & tprog) - begin - ec <= 1'b1 ; - end - - if (slcnt == 9'b000000000 | !tprog) - begin - iwinp <= 1'b1 ; - end - else - begin - iwinp <= 1'b0 ; - end - - if (!tpend & !tprog) - begin - ccnt <= 4'b0000 ; - end - else if (ibkoff & !ibkoff_r) - begin - ccnt <= ccnt + 4'b0001 ; - end - end - end - - assign winp = iwinp ; - - assign lc = ilc; - - assign carrier = crs_r ; - - assign coll = icoll ; - - assign bkoff = ibkoff ; - - assign cc = ccnt ; - -endmodule diff --git a/resources/soc/rtl/MAC/csr.v b/resources/soc/rtl/MAC/csr.v deleted file mode 100644 index 46b8e77..0000000 --- a/resources/soc/rtl/MAC/csr.v +++ /dev/null @@ -1,2530 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -module CSR ( - clk, - rst, - interrupt, - csrreq, - csrrw, - csrbe, - csraddr, - csrdatai, - csrack, - csrdatao, - rstsofto, - tprog, - tireq, - unf, - tcsreq, - tiack, - tcsack, - fd, - ic, - etireq, - etiack, - tm, - sf, - tset, - tdes, - tbuf, - tstat, - tu, - tpollack, - ft, - tpoll, - tdbadc, - tdbad, - rcsreq, - rprog, - rcsack, - ren, - ra, - pm, - pr, - pb, - rif, - ho, - hp, - foclack, - mfclack, - oco, - mfo, - focg, - mfcg, - focl, - mfcl, - rireq, - erireq, - ru, - rpollack, - rdes, - rbuf, - rstat, - riack, - eriack, - rpoll, - rdbadc, - rdbad, - ble, - dbo, - dma_priority, - pbl, - dsl, - stoptc, - stoptlsm, - stoptfifo, - stopt, - tps, - stoprc, - stoprlsm, - stopr, - rps, - sdi, - sclk, - scs, - sdo, - mdi, - mdc, - mdo, - mden, - - insert_en_o - ); - - parameter CSRWIDTH = 32; - parameter DATAWIDTH = 32; - parameter DATADEPTH = 32; - parameter RFIFODEPTH = 9; - parameter RCDEPTH = 2; - - `include "utility.v" - - input clk; - input rst; - output interrupt; - wire interrupt; - - input csrreq; - input csrrw; - input [CSRWIDTH / 8 - 1:0] csrbe; - input [CSRDEPTH - 1:0] csraddr; - input [CSRWIDTH - 1:0] csrdatai; - output csrack; - wire csrack; - output [CSRWIDTH - 1:0] csrdatao; - reg [CSRWIDTH - 1:0] csrdatao; - - output rstsofto; - reg rstsofto; - - input tprog; - input tireq; - input unf; - input tcsreq; - output tiack; - wire tiack; - output tcsack; - wire tcsack; - output fd; - wire fd; - - input ic; - input etireq; - output etiack; - wire etiack; - output [2:0] tm; - wire [2:0] tm; - output sf; - wire sf; - - input tset; - input tdes; - input tbuf; - input tstat; - input tu; - input tpollack; - input [1:0] ft; - output tpoll; - wire tpoll; - output tdbadc; - reg tdbadc; - output [DATADEPTH - 1:0] tdbad; - wire [DATADEPTH - 1:0] tdbad; - - input rcsreq; - input rprog; - output rcsack; - wire rcsack; - output ren; - wire ren; - output ra; - wire ra; - output pm; - wire pm; - output pr; - wire pr; - output pb; - wire pb; - output rif; - wire rif; - output ho; - wire ho; - output hp; - wire hp; - - input foclack; - input mfclack; - input oco; - input mfo; - input [10:0] focg; - input [15:0] mfcg; - output focl; - reg focl; - output mfcl; - reg mfcl; - - input rireq; - input erireq; - input ru; - input rpollack; - input rdes; - input rbuf; - input rstat; - output riack; - wire riack; - output eriack; - wire eriack; - output rpoll; - reg rpoll; - output rdbadc; - reg rdbadc; - output [DATADEPTH - 1:0] rdbad; - wire [DATADEPTH - 1:0] rdbad; - - output ble; - wire ble; - output dbo; - wire dbo; - output [1:0] dma_priority; - wire [1:0] dma_priority; - output [5:0] pbl; - wire [5:0] pbl; - output [4:0] dsl; - wire [4:0] dsl; - - input stoptc; - input stoptlsm; - input stoptfifo; - output stopt; - wire stopt; - output tps; - reg tps; - - input stoprc; - input stoprlsm; - output stopr; - wire stopr; - output rps; - reg rps; - - input sdi; - output sclk; - wire sclk; - output scs; - wire scs; - output sdo; - wire sdo; - - input mdi; - output mdc; - wire mdc; - output mdo; - wire mdo; - output mden; - wire mden; - - - output insert_en_o; - wire insert_en_o; - - reg [31:0] csrdata_c; - reg [3:0] csrdbe_c; - wire [1:0] csraddr10; - wire [5:0] csraddr72; - wire [1:0] csrbe10; - wire [31:0] csr0; - wire [31:0] csr5; - wire [31:0] csr6; - wire [31:0] csr7; - wire [31:0] csr8; - wire [31:0] csr9; - wire [31:0] csr10; - wire [31:0] csr11; - - reg csr0_dbo; - reg [2:0] csr0_tap; - reg [5:0] csr0_pbl; - reg csr0_ble; - reg [4:0] csr0_dsl; - reg csr0_bar; - reg csr0_swr; - - reg [31:0] csr3; - - reg [31:0] csr4; - - reg [2:0] csr5_ts; - reg [2:0] csr5_rs; - reg csr5_nis; - reg csr5_ais; - reg csr5_eri; - reg csr5_gte; - reg csr5_eti; - reg csr5_rps; - reg csr5_ru; - reg csr5_ri; - reg csr5_unf; - reg csr5_tu; - reg csr5_tps; - reg csr5_ti; - - reg csr6_ra; - reg csr6_ttm; - reg csr6_sf; - reg [1:0] csr6_tr; - reg csr6_st; - reg csr6_fd; - reg csr6_pm; - reg csr6_pr; - reg csr6_if; - reg csr6_pb; - reg csr6_ho; - reg csr6_sr; - reg csr6_hp; - - reg csr7_nie; - reg csr7_aie; - reg csr7_ere; - reg csr7_gte; - reg csr7_ete; - reg csr7_rse; - reg csr7_rue; - reg csr7_rie; - reg csr7_une; - reg csr7_tue; - reg csr7_tse; - reg csr7_tie; - - reg [10:0] csr8_foc; - reg csr8_oco; - reg [15:0] csr8_mfc; - reg csr8_mfo; - reg csr8read; - - reg csr9_mdi; - reg csr9_mii; - reg csr9_mdo; - reg csr9_mdc; - reg csr9_sdi; - reg csr9_sclk; - reg csr9_scs; - reg csr9_sdo; - - reg csr10_insert_en; - - reg csr11_cs; - reg [3:0] csr11_tt; - reg [2:0] csr11_ntp; - reg [3:0] csr11_rt; - reg [2:0] csr11_nrp; - reg csr11_con; - reg [15:0] csr11_tim; - reg csr11wr; - - reg tapwr; - reg tpollcmd; - reg itpoll; - reg [2:0] tapcnt; - - reg [1:0] tpsm_c; - reg [1:0] tpsm; - reg tstopcmd; - reg tstartcmd; - reg stoptc_r; - reg stoptlsm_r; - reg stoptfifo_r; - wire [2:0] ts_c; - - reg [1:0] rpsm_c; - reg [1:0] rpsm; - reg rstopcmd; - reg rstartcmd; - reg stoprc_r; - reg stoprlsm_r; - wire [2:0] rs_c; - - reg rpollcmd; - - wire csr5wr_c; - reg csr5wr; - reg gte; - reg iint; - reg rireq_r; - reg rireq_r2; - reg eri; - reg erireq_r; - reg erireq_r2; - reg tireq_r; - reg tireq_r2; - reg eti; - reg etireq_r; - reg etireq_r2; - reg unfi; - reg unf_r; - reg unf_r2; - reg tui; - reg tu_r; - reg tu_r2; - reg rui; - reg ru_r; - reg ru_r2; - reg iic; - - reg rcsreq_r; - reg rcsreq_r1; - reg rimprog; - reg [3:0] rcscnt; - reg rcs2048; - reg rcs128; - reg [3:0] rtcnt; - reg [2:0] rcnt; - reg rimex; - - reg timprog; - reg [7:0] ttcnt; - reg [2:0] tcnt; - reg timex; - reg tcsreq_r1; - reg tcsreq_r2; - reg [3:0] tcscnt; - reg tcs2048; - reg tcs128; - - reg [10:0] foc_c; - reg [15:0] mfc_c; - reg [10:0] focg_r; - reg [15:0] mfcg_r; - - reg gstart; - reg gstart_r; - reg [15:0] gcnt; - wire [CSRWIDTH_MAX + 1:0] csrdatai_max; - wire [CSRWIDTH_MAX + 1:0] czero_max; - wire [CSRWIDTH_MAX/8 + 1:0] csrbe_max; - - assign csraddr10 = csraddr[1:0] ; - - assign csraddr72 = csraddr[7:2] ; - - assign csrbe10 = (CSRWIDTH == 16) ? csrbe_max[1:0] : {2{1'b1}} ; - - always @(csrdatai_max or csrbe_max or csraddr or csraddr10 or csrbe10) - begin : csrdata_proc - csrdata_c <= {32{1'b1}} ; - csrdbe_c <= {4{1'b1}} ; - case (CSRWIDTH) - 8 : - begin - if (csrbe_max[0]) - begin - case (csraddr10) - 2'b00 : - begin - csrdata_c[7:0] <= csrdatai_max[CSRWIDTH-1:0] ; - csrdbe_c <= 4'b0001 ; - end - 2'b01 : - begin - csrdata_c[15:8] <= csrdatai_max[CSRWIDTH-1:0] ; - csrdbe_c <= 4'b0010 ; - end - 2'b10 : - begin - csrdata_c[23:16] <= csrdatai_max[CSRWIDTH-1:0] ; - csrdbe_c <= 4'b0100 ; - end - default : - begin - csrdata_c[31:24] <= csrdatai_max[CSRWIDTH-1:0] ; - csrdbe_c <= 4'b1000 ; - end - endcase - end - else - begin - csrdbe_c <= 4'b0000 ; - end - end - 16 : - begin - case (csrbe10) - 2'b11 : - begin - if (csraddr[1]) - begin - csrdata_c[31:16] <= csrdatai_max[CSRWIDTH-1:0] ; - csrdbe_c <= 4'b1100 ; - end - else - begin - csrdata_c[15:0] <= csrdatai_max[CSRWIDTH-1:0] ; - csrdbe_c <= 4'b0011 ; - end - end - 2'b10 : - begin - if (csraddr[1]) - begin - csrdata_c[31:24] <= - csrdatai_max[CSRWIDTH - 1:CSRWIDTH / 2] ; - csrdbe_c <= 4'b1000 ; - end - else - begin - csrdata_c[15: 8] <= - csrdatai_max[CSRWIDTH - 1:CSRWIDTH / 2] ; - csrdbe_c <= 4'b0010 ; - end - end - 2'b01 : - begin - if (csraddr[1]) - begin - csrdata_c[23:16] <= csrdatai_max[7:0] ; - csrdbe_c <= 4'b0100 ; - end - else - begin - csrdata_c[7:0] <= csrdatai_max[7:0] ; - csrdbe_c <= 4'b0001 ; - end - end - default : - begin - csrdbe_c <= 4'b0000 ; - end - endcase - end - default : - begin - csrdata_c <= csrdatai_max[31:0] ; - csrdbe_c <= csrbe_max[3:0] ; - end - endcase - end - - always @(posedge clk) - begin : csr0_reg_proc - if (rst) - begin - csr0_dbo <= CSR0_RV[20] ; - csr0_tap <= CSR0_RV[19:17] ; - csr0_pbl <= CSR0_RV[13:8] ; - csr0_ble <= CSR0_RV[7] ; - csr0_dsl <= CSR0_RV[6:2] ; - csr0_bar <= CSR0_RV[1] ; - csr0_swr <= CSR0_RV[0] ; - tapwr <= 1'b0 ; - end - else - begin - if (!csrrw & csrreq & csraddr72 == CSR0_ID) - begin - if (csrdbe_c[2]) - begin - csr0_dbo <= csrdata_c[20] ; - csr0_tap <= csrdata_c[19:17] ; - tapwr <= 1'b1 ; - end - else - begin - tapwr <= 1'b0 ; - end - if (csrdbe_c[1]) - begin - csr0_pbl <= csrdata_c[13:8] ; - end - if (csrdbe_c[0]) - begin - csr0_ble <= csrdata_c[7] ; - csr0_dsl <= csrdata_c[6:2] ; - csr0_bar <= csrdata_c[1] ; - csr0_swr <= csrdata_c[0] ; - end - end - else - begin - tapwr <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : tpoolcmd_reg_proc - if (rst) - begin - tpollcmd <= 1'b0 ; - end - else - begin - if (!csrrw & csrreq & csraddr72 == CSR1_ID) - begin - tpollcmd <= 1'b1 ; - end - else - begin - tpollcmd <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : rpoolcmd_reg_proc - if (rst) - begin - rpollcmd <= 1'b0 ; - end - else - begin - if (!csrrw & csrreq & csraddr72 == CSR2_ID) - begin - rpollcmd <= 1'b1 ; - end - else - begin - rpollcmd <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : csr3_reg_proc - if (rst) - begin - csr3 <= CSR3_RV ; - end - else - begin - if (!csrrw & csrreq & csraddr72 == CSR3_ID) - begin - if (csrdbe_c[0]) - begin - csr3[7:0] <= csrdata_c[7:0] ; - end - if (csrdbe_c[1]) - begin - csr3[15:8] <= csrdata_c[15:8] ; - end - if (csrdbe_c[2]) - begin - csr3[23:16] <= csrdata_c[23:16] ; - end - if (csrdbe_c[3]) - begin - csr3[31:24] <= csrdata_c[31:24] ; - end - end - end - end - - assign rdbad = csr3[DATADEPTH - 1:0] ; - - always @(posedge clk) - begin : rdbadc_reg_proc - if (rst) - begin - rdbadc <= 1'b1 ; - end - else - begin - if (!csrrw & csrreq & csraddr72 == CSR3_ID & rpsm == PSM_STOP) - begin - rdbadc <= 1'b1 ; - end - else if (rpsm == PSM_RUN) - begin - rdbadc <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : csr4_reg_proc - if (rst) - begin - csr4 <= CSR4_RV ; - end - else - begin - if (!csrrw & csrreq & csraddr72 == CSR4_ID) - begin - if (csrdbe_c[0]) - begin - csr4[7:0] <= csrdata_c[7:0] ; - end - if (csrdbe_c[1]) - begin - csr4[15:8] <= csrdata_c[15:8] ; - end - if (csrdbe_c[2]) - begin - csr4[23:16] <= csrdata_c[23:16] ; - end - if (csrdbe_c[3]) - begin - csr4[31:24] <= csrdata_c[31:24] ; - end - end - end - end - - always @(posedge clk) - begin : tdbadc_reg_proc - if (rst) - begin - tdbadc <= 1'b1 ; - end - else - begin - if (!csrrw & csrreq & csraddr72 == CSR4_ID) - begin - tdbadc <= 1'b1 ; - end - else if (tpsm == PSM_RUN) - begin - tdbadc <= 1'b0 ; - end - end - end - - assign csr5wr_c = (!csrrw & csrreq & csraddr72 == CSR5_ID) ? 1'b1 : - 1'b0 ; - - always @(posedge clk) - begin : csr5wr_reg_proc - if (rst) - begin - csr5wr <= 1'b0 ; - end - else - begin - csr5wr <= csr5wr_c ; - end - end - - always @(posedge clk) - begin : csr5_reg_proc - if (rst) - begin - csr5_ts <= CSR5_RV[22:20] ; - csr5_rs <= CSR5_RV[19:17] ; - csr5_nis <= CSR5_RV[16] ; - csr5_ais <= CSR5_RV[15] ; - csr5_eri <= CSR5_RV[14] ; - csr5_gte <= CSR5_RV[11] ; - csr5_eti <= CSR5_RV[10] ; - csr5_rps <= CSR5_RV[8] ; - csr5_ru <= CSR5_RV[7] ; - csr5_ri <= CSR5_RV[6] ; - csr5_unf <= CSR5_RV[5] ; - csr5_tu <= CSR5_RV[2] ; - csr5_tps <= CSR5_RV[1] ; - csr5_ti <= CSR5_RV[0] ; - end - else - begin - if (csr5wr_c) - begin - if (csrdbe_c[2]) - begin - csr5_nis <= ~csrdata_c[16] & csr5_nis ; - end - if (csrdbe_c[1]) - begin - csr5_ais <= ~csrdata_c[15] & csr5_ais ; - csr5_eri <= ~csrdata_c[14] & csr5_eri ; - csr5_gte <= ~csrdata_c[11] & csr5_gte ; - csr5_eti <= ~csrdata_c[10] & csr5_eti ; - csr5_rps <= ~csrdata_c[8] & csr5_rps ; - end - if (csrdbe_c[0]) - begin - csr5_ru <= ~csrdata_c[7] & csr5_ru ; - csr5_ri <= ~csrdata_c[6] & csr5_ri ; - csr5_unf <= ~csrdata_c[5] & csr5_unf ; - csr5_tu <= ~csrdata_c[2] & csr5_tu ; - csr5_tps <= ~csrdata_c[1] & csr5_tps ; - csr5_ti <= ~csrdata_c[0] & csr5_ti ; - end - end - else - begin - if (timex) - begin - csr5_ti <= 1'b1 ; - end - if (rimex) - begin - csr5_ri <= 1'b1 ; - end - if (eti) - begin - csr5_eti <= 1'b1 ; - end - if (eri) - begin - csr5_eri <= 1'b1 ; - end - if (gte) - begin - csr5_gte <= 1'b1 ; - end - if (tpsm_c == PSM_STOP & - (tpsm == PSM_RUN | tpsm == PSM_SUSPEND)) - begin - csr5_tps <= 1'b1 ; - end - if (rpsm_c == PSM_STOP & - (rpsm == PSM_RUN | rpsm == PSM_SUSPEND)) - begin - csr5_rps <= 1'b1 ; - end - if (rui) - begin - csr5_ru <= 1'b1 ; - end - if (tui) - begin - csr5_tu <= 1'b1 ; - end - if (unfi) - begin - csr5_unf <= 1'b1 ; - end - if ((csr5_ri & csr7_rie) | - (csr5_ti & csr7_tie) | - (csr5_eri & csr7_ere) | - (csr5_tu & csr7_tue) | - (csr5_gte & csr7_gte)) - begin - csr5_nis <= 1'b1 ; - end - else - begin - csr5_nis <= 1'b0 ; - end - if ((csr5_eti & csr7_ete) | - (csr5_rps & csr7_rse) | - (csr5_ru & csr7_rue) | - (csr5_unf & csr7_une) | - (csr5_tps & csr7_tse)) - begin - csr5_ais <= 1'b1 ; - end - else - begin - csr5_ais <= 1'b0 ; - end - csr5_ts <= ts_c ; - csr5_rs <= rs_c ; - end - end - end - - always @(posedge clk) - begin : csr6_reg_proc - if (rst) - begin - csr6_ra <= CSR6_RV[30] ; - csr6_ttm <= CSR6_RV[22] ; - csr6_sf <= CSR6_RV[21] ; - csr6_tr <= CSR6_RV[15:14] ; - csr6_st <= CSR6_RV[13] ; - csr6_fd <= CSR6_RV[9] ; - csr6_pm <= CSR6_RV[7] ; - csr6_pr <= CSR6_RV[6] ; - csr6_if <= CSR6_RV[4] ; - csr6_pb <= CSR6_RV[3] ; - csr6_ho <= CSR6_RV[2] ; - csr6_sr <= CSR6_RV[1] ; - csr6_hp <= CSR6_RV[0] ; - end - else - begin - if (!csrrw & csrreq & csraddr72 == CSR6_ID) - begin - if (csrdbe_c[3]) - begin - csr6_ra <= csrdata_c[30] ; - end - if (csrdbe_c[2]) - begin - csr6_ttm <= csrdata_c[22] ; - if (tpsm == PSM_STOP) - begin - csr6_sf <= csrdata_c[21] ; - end - end - if (csrdbe_c[1]) - begin - csr6_tr <= csrdata_c[15:14] ; - csr6_st <= csrdata_c[13] ; - csr6_fd <= csrdata_c[9] ; - end - if (csrdbe_c[0]) - begin - csr6_pm <= csrdata_c[7] ; - csr6_pr <= csrdata_c[6] ; - csr6_pb <= csrdata_c[3] ; - csr6_sr <= csrdata_c[1] ; - end - end - case (ft) - FT_PERFECT : - begin - csr6_ho <= 1'b0 ; - csr6_if <= 1'b0 ; - csr6_hp <= 1'b0 ; - end - FT_HASH : - begin - csr6_ho <= 1'b0 ; - csr6_if <= 1'b0 ; - csr6_hp <= 1'b1 ; - end - FT_INVERSE : - begin - csr6_ho <= 1'b0 ; - csr6_if <= 1'b1 ; - csr6_hp <= 1'b0 ; - end - default : - begin - csr6_ho <= 1'b1 ; - csr6_if <= 1'b0 ; - csr6_hp <= 1'b1 ; - end - endcase - end - end - - always @(posedge clk) - begin : csr7_reg_proc - if (rst) - begin - csr7_nie <= CSR7_RV[16] ; - csr7_aie <= CSR7_RV[15] ; - csr7_ere <= CSR7_RV[14] ; - csr7_gte <= CSR7_RV[11] ; - csr7_ete <= CSR7_RV[10] ; - csr7_rse <= CSR7_RV[8] ; - csr7_rue <= CSR7_RV[7] ; - csr7_rie <= CSR7_RV[6] ; - csr7_une <= CSR7_RV[5] ; - csr7_tue <= CSR7_RV[2] ; - csr7_tse <= CSR7_RV[1] ; - csr7_tie <= CSR7_RV[0] ; - end - else - begin - if (!csrrw & csrreq & csraddr72 == CSR7_ID) - begin - if (csrdbe_c[2]) - begin - csr7_nie <= csrdata_c[16] ; - end - if (csrdbe_c[1]) - begin - csr7_aie <= csrdata_c[15] ; - csr7_ere <= csrdata_c[14] ; - csr7_gte <= csrdata_c[11] ; - csr7_ete <= csrdata_c[10] ; - csr7_rse <= csrdata_c[8] ; - end - if (csrdbe_c[0]) - begin - csr7_rue <= csrdata_c[7] ; - csr7_rie <= csrdata_c[6] ; - csr7_une <= csrdata_c[5] ; - csr7_tue <= csrdata_c[2] ; - csr7_tse <= csrdata_c[1] ; - csr7_tie <= csrdata_c[0] ; - end - end - end - end - - always @(posedge clk) - begin : csr8_reg_proc - if (rst) - begin - csr8_oco <= 1'b0 ; - csr8_mfo <= 1'b0 ; - csr8_foc <= {11{1'b0}} ; - csr8_mfc <= {16{1'b0}} ; - end - else - begin - if (!(csrrw & csrreq & csraddr72 == CSR8_ID)) - begin - if (!csr8read) - begin - csr8_foc <= foc_c ; - csr8_mfc <= mfc_c ; - csr8_oco <= oco ; - csr8_mfo <= mfo ; - end - end - end - end - - always @(posedge clk) - begin : csr8read_reg_proc - if (rst) - begin - csr8read <= 1'b0 ; - end - else - begin - if (csrrw & csrreq & csraddr72 == CSR8_ID) - begin - csr8read <= csrdbe_c[3] ; - end - else - begin - csr8read <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : csr9_reg_proc - if (rst) - begin - csr9_mdi <= CSR9_RV[19] ; - csr9_mii <= CSR9_RV[18] ; - csr9_mdo <= CSR9_RV[17] ; - csr9_mdc <= CSR9_RV[16] ; - csr9_sdi <= CSR9_RV[2] ; - csr9_sclk <= CSR9_RV[1] ; - csr9_scs <= CSR9_RV[0] ; - csr9_sdo <= CSR9_RV[3] ; - end - else - begin - if (!csrrw & csrreq & csraddr72 == CSR9_ID) - begin - if (csrdbe_c[0]) - begin - csr9_sclk <= csrdata_c[1] ; - csr9_scs <= csrdata_c[0] ; - csr9_sdo <= csrdata_c[3] ; - end - if (csrdbe_c[2]) - begin - csr9_mii <= csrdata_c[18] ; - csr9_mdo <= csrdata_c[17] ; - csr9_mdc <= csrdata_c[16] ; - end - end - csr9_mdi <= mdi ; - csr9_sdi <= sdi ; - end - end - - always @(posedge clk) - begin : csr10_reg_proc - if (rst) - begin - csr10_insert_en <= CSR10_RV[0]; - end - else - begin - if (!csrrw & csrreq & csraddr72 == CSR10_ID) - begin - csr10_insert_en <= csrdata_c[0]; - end - end - end - - always @(posedge clk) - begin : csr11_reg_proc - if (rst) - begin - csr11_cs <= CSR11_RV[31] ; - csr11_tt <= CSR11_RV[30:27] ; - csr11_ntp <= CSR11_RV[26:24] ; - csr11_rt <= CSR11_RV[23:20] ; - csr11_nrp <= CSR11_RV[19:17] ; - csr11_con <= CSR11_RV[16] ; - csr11_tim <= CSR11_RV[15:0] ; - end - else - begin - if (!csrrw & csrreq & csraddr72 == CSR11_ID) - begin - if (csrdbe_c[3]) - begin - csr11_cs <= csrdata_c[31] ; - csr11_tt <= csrdata_c[30:27] ; - csr11_ntp <= csrdata_c[26:24] ; - end - if (csrdbe_c[2]) - begin - csr11_rt <= csrdata_c[23:20] ; - csr11_nrp <= csrdata_c[19:17] ; - csr11_con <= csrdata_c[16] ; - end - if (csrdbe_c[1]) - begin - csr11_tim[15:8] <= csrdata_c[15:8] ; - end - if (csrdbe_c[0]) - begin - csr11_tim[7:0] <= csrdata_c[7:0] ; - end - end - end - end - - always @(posedge clk) - begin : csr11wr_reg_proc - if (rst) - begin - csr11wr <= 1'b0 ; - end - else - begin - if (!csrrw & csrreq & csraddr72 == CSR11_ID) - begin - csr11wr <= 1'b1 ; - end - else - begin - csr11wr <= 1'b0 ; - end - end - end - - assign csr0 = {CSR0_RV[31:26], CSR0_RV[25:21], csr0_dbo, csr0_tap, - CSR0_RV[16:14], csr0_pbl, csr0_ble, - csr0_dsl, csr0_bar, (rst | csr0_swr)} ; - - assign csr5 = {CSR5_RV[31:23], csr5_ts, csr5_rs, csr5_nis, - csr5_ais, csr5_eri, CSR5_RV[13:12], csr5_gte, csr5_eti, - CSR5_RV[9], csr5_rps, csr5_ru, csr5_ri, csr5_unf, - CSR5_RV[4:3], csr5_tu, csr5_tps, csr5_ti} ; - - assign csr6 = {CSR6_RV[31], csr6_ra, CSR6_RV[29:26], - CSR6_RV[25:23], csr6_ttm, csr6_sf, CSR6_RV[20], - CSR6_RV[19], CSR6_RV[18], CSR6_RV[17], CSR6_RV[16], - csr6_tr, csr6_st, CSR6_RV[13], CSR6_RV[12:11], - csr6_fd, CSR6_RV[8], csr6_pm, csr6_pr, CSR6_RV[5], - csr6_if, csr6_pb, csr6_ho, csr6_sr, csr6_hp} ; - - assign csr7 = {CSR7_RV[31:17], csr7_nie, csr7_aie, csr7_ere, - CSR7_RV[13:12], csr7_gte, csr7_ete, CSR6_RV[9], - csr7_rse, csr7_rue, csr7_rie, csr7_une, - CSR7_RV[4:3], csr7_tue, csr7_tse, csr7_tie} ; - - assign csr8 = {CSR8_RV[31:29], csr8_oco, csr8_foc, - csr8_mfo, csr8_mfc} ; - - assign csr9 = {CSR9_RV[31:20], csr9_mdi, csr9_mii, csr9_mdo, - csr9_mdc, CSR9_RV[15:4], csr9_sdo, csr9_sdi, - csr9_sclk, csr9_scs} ; - - assign csr10 = {CSR10_RV[31:1], csr10_insert_en}; - - assign csr11 = {csr11_cs, ttcnt[7:4], tcnt[2:0], rtcnt[3:0], - rcnt[2:0], csr11_con, gcnt} ; - - always @(csr0 or - csr3 or - csr4 or - csr5 or - csr6 or - csr7 or - csr8 or - csr9 or - csr10 or - csr11 or - csraddr or - csraddr72 or - csraddr10) - begin : csrmux_proc - case (CSRWIDTH) - 8 : - begin - case (csraddr10) - 2'b00 : - begin - case (csraddr72) - CSR0_ID : - begin - csrdatao <= csr0[7:0] ; - end - CSR3_ID : - begin - csrdatao <= csr3[7:0] ; - end - CSR4_ID : - begin - csrdatao <= csr4[7:0] ; - end - CSR5_ID : - begin - csrdatao <= csr5[7:0] ; - end - CSR6_ID : - begin - csrdatao <= csr6[7:0] ; - end - CSR7_ID : - begin - csrdatao <= csr7[7:0] ; - end - CSR8_ID : - begin - csrdatao <= csr8[7:0] ; - end - CSR9_ID : - begin - csrdatao <= csr9[7:0] ; - end - CSR10_ID : - begin - csrdatao <= csr10[7:0] ; - end - CSR11_ID : - begin - csrdatao <= csr11[7:0] ; - end - default : - begin - csrdatao <= {CSRWIDTH{1'b0}} ; - end - endcase - end - 2'b01 : - begin - case (csraddr72) - CSR0_ID : - begin - csrdatao <= csr0[15:8] ; - end - CSR3_ID : - begin - csrdatao <= csr3[15:8] ; - end - CSR4_ID : - begin - csrdatao <= csr4[15:8] ; - end - CSR5_ID : - begin - csrdatao <= csr5[15:8] ; - end - CSR6_ID : - begin - csrdatao <= csr6[15:8] ; - end - CSR7_ID : - begin - csrdatao <= csr7[15:8] ; - end - CSR8_ID : - begin - csrdatao <= csr8[15:8] ; - end - CSR9_ID : - begin - csrdatao <= csr9[15:8] ; - end - CSR10_ID : - begin - csrdatao <= csr10[15:8] ; - end - CSR11_ID : - begin - csrdatao <= csr11[15:8] ; - end - default : - begin - csrdatao <= {CSRWIDTH{1'b0}} ; - end - endcase - end - 2'b10 : - begin - case (csraddr72) - CSR0_ID : - begin - csrdatao <= csr0[23:16] ; - end - CSR3_ID : - begin - csrdatao <= csr3[23:16] ; - end - CSR4_ID : - begin - csrdatao <= csr4[23:16] ; - end - CSR5_ID : - begin - csrdatao <= csr5[23:16] ; - end - CSR6_ID : - begin - csrdatao <= csr6[23:16] ; - end - CSR7_ID : - begin - csrdatao <= csr7[23:16] ; - end - CSR8_ID : - begin - csrdatao <= csr8[23:16] ; - end - CSR9_ID : - begin - csrdatao <= csr9[23:16] ; - end - CSR10_ID : - begin - csrdatao <= csr10[23:16] ; - end - CSR11_ID : - begin - csrdatao <= csr11[23:16] ; - end - default : - begin - csrdatao <= {CSRWIDTH{1'b0}} ; - end - endcase - end - 2'b11 : - begin - case (csraddr72) - CSR0_ID : - begin - csrdatao <= csr0[31:24] ; - end - CSR3_ID : - begin - csrdatao <= csr3[31:24] ; - end - CSR4_ID : - begin - csrdatao <= csr4[31:24] ; - end - CSR5_ID : - begin - csrdatao <= csr5[31:24] ; - end - CSR6_ID : - begin - csrdatao <= csr6[31:24] ; - end - CSR7_ID : - begin - csrdatao <= csr7[31:24] ; - end - CSR8_ID : - begin - csrdatao <= csr8[31:24] ; - end - CSR9_ID : - begin - csrdatao <= csr9[31:24] ; - end - CSR10_ID : - begin - csrdatao <= csr10[31:24] ; - end - CSR11_ID : - begin - csrdatao <= csr11[31:24] ; - end - default : - begin - csrdatao <= {CSRWIDTH{1'b0}} ; - end - endcase - end - default : - begin - csrdatao <= {CSRWIDTH{1'b0}} ; - end - endcase - end - 16 : - begin - case (csraddr[1]) - 1'b0 : - begin - case (csraddr72) - CSR0_ID : - begin - csrdatao <= csr0[15:0] ; - end - CSR3_ID : - begin - csrdatao <= csr3[15:0] ; - end - CSR4_ID : - begin - csrdatao <= csr4[15:0] ; - end - CSR5_ID : - begin - csrdatao <= csr5[15:0] ; - end - CSR6_ID : - begin - csrdatao <= csr6[15:0] ; - end - CSR7_ID : - begin - csrdatao <= csr7[15:0] ; - end - CSR8_ID : - begin - csrdatao <= csr8[15:0] ; - end - CSR9_ID : - begin - csrdatao <= csr9[15:0] ; - end - CSR10_ID : - begin - csrdatao <= csr10[15:0] ; - end - CSR11_ID : - begin - csrdatao <= csr11[15:0] ; - end - default : - begin - csrdatao <= {CSRWIDTH{1'b0}} ; - end - endcase - end - 1'b1 : - begin - case (csraddr72) - CSR0_ID : - begin - csrdatao <= csr0[31:16] ; - end - CSR3_ID : - begin - csrdatao <= csr3[31:16] ; - end - CSR4_ID : - begin - csrdatao <= csr4[31:16] ; - end - CSR5_ID : - begin - csrdatao <= csr5[31:16] ; - end - CSR6_ID : - begin - csrdatao <= csr6[31:16] ; - end - CSR7_ID : - begin - csrdatao <= csr7[31:16] ; - end - CSR8_ID : - begin - csrdatao <= csr8[31:16] ; - end - CSR9_ID : - begin - csrdatao <= csr9[31:16] ; - end - CSR10_ID : - begin - csrdatao <= csr10[31:16] ; - end - CSR11_ID : - begin - csrdatao <= csr11[31:16] ; - end - default : - begin - csrdatao <= {CSRWIDTH{1'b0}} ; - end - endcase - end - default : - begin - csrdatao <= {CSRWIDTH{1'b0}} ; - end - endcase - end - default : - begin - case (csraddr72) - CSR0_ID : - begin - csrdatao <= csr0 ; - end - CSR3_ID : - begin - csrdatao <= csr3 ; - end - CSR4_ID : - begin - csrdatao <= csr4 ; - end - CSR5_ID : - begin - csrdatao <= csr5 ; - end - CSR6_ID : - begin - csrdatao <= csr6 ; - end - CSR7_ID : - begin - csrdatao <= csr7 ; - end - CSR8_ID : - begin - csrdatao <= csr8 ; - end - CSR9_ID : - begin - csrdatao <= csr9 ; - end - CSR10_ID : - begin - csrdatao <= csr10 ; - end - CSR11_ID : - begin - csrdatao <= csr11 ; - end - default : - begin - csrdatao <= {CSRWIDTH{1'b0}} ; - end - endcase - end - endcase - end - - assign csrack = 1'b1 ; - - assign dma_priority = (csr0_bar & !tprog) ? 2'b01 : - (csr0_bar & tprog) ? 2'b10 : - 2'b00 ; - - assign dbo = csr0_dbo ; - - assign pbl = csr0_pbl ; - - assign dsl = csr0_dsl ; - - assign ble = csr0_ble ; - - assign tdbad = csr4[DATADEPTH - 1:0] ; - - always @(posedge clk) - begin : itpoll_reg_proc - if (rst) - begin - itpoll <= 1'b0 ; - end - else - begin - if (((((csr0_tap == 3'b001 | - csr0_tap == 3'b010 | - csr0_tap == 3'b011) & tcs2048) | - ((csr0_tap == 3'b100 | - csr0_tap == 3'b101 | - csr0_tap == 3'b110 | - csr0_tap == 3'b111) & tcs128)) & - tapcnt == 3'b000 & tpsm == PSM_SUSPEND) | - tpollcmd | tstartcmd) - begin - itpoll <= 1'b1 ; - end - else if (tpollack) - begin - itpoll <= 1'b0 ; - end - end - end - - assign tpoll = itpoll ; - - always @(posedge clk) - begin : tap_reg_proc - if (rst) - begin - tapcnt <= {3{1'b1}} ; - end - else - begin - if (((csr0_tap == 3'b001 | - csr0_tap == 3'b010 | - csr0_tap == 3'b011) & (tcs2048 | tapwr)) | - ((csr0_tap == 3'b100 | - csr0_tap == 3'b101 | - csr0_tap == 3'b110 | - csr0_tap == 3'b111) & (tcs128 | tapwr))) - begin - if (tapcnt == 3'b000 | tapwr) - begin - case (csr0_tap) - 3'b001 : - begin - tapcnt <= 3'b000 ; - end - 3'b010 : - begin - tapcnt <= 3'b010 ; - end - 3'b011 : - begin - tapcnt <= 3'b110 ; - end - 3'b100 : - begin - tapcnt <= 3'b000 ; - end - 3'b101 : - begin - tapcnt <= 3'b001 ; - end - 3'b110 : - begin - tapcnt <= 3'b010 ; - end - default : - begin - tapcnt <= 3'b111 ; - end - endcase - end - else - begin - tapcnt <= tapcnt - 1 ; - end - end - end - end - - assign tm = {csr6_ttm, csr6_tr} ; - - assign sf = csr6_sf ; - - always @(posedge clk) - begin : tim_reg_proc - if (rst) - begin - timprog <= 1'b0 ; - timex <= 1'b0 ; - ttcnt <= {8{1'b1}} ; - tcnt <= {3{1'b1}} ; - end - else - begin - if (csr5_ti) - begin - timprog <= 1'b0 ; - end - else if (tireq_r & !tireq_r2) - begin - timprog <= 1'b1 ; - end - - if (csr5_ti) - begin - timex <= 1'b0 ; - end - else if (timprog & - ((ttcnt == 8'b00000000 & csr11_tt != 4'b0000) | - (tcnt == 3'b000 & csr11_ntp != 3'b000) | - (iic) | - (csr11_tt == 4'b0000 & csr11_ntp == 3'b000))) - begin - timex <= 1'b1 ; - end - - if ((tireq_r & !tireq_r2) | csr5_ti | csr11wr) - begin - ttcnt <= {csr11_tt, 4'b0000} ; - end - else if (((tcs128 & csr11_cs) | - (tcs2048 & !csr11_cs)) & - ttcnt != 8'b00000000 & timprog) - begin - ttcnt <= ttcnt - 1 ; - end - - if (csr5_ti | csr11wr) - begin - tcnt <= csr11_ntp ; - end - else if (tireq_r & !tireq_r2 & - tcnt != 3'b000 & csr11_ntp != 3'b000) - begin - tcnt <= tcnt - 1 ; - end - end - end - - always @(posedge clk) - begin : tcscnt_reg_proc - if (rst) - begin - tcsreq_r1 <= 1'b0 ; - tcsreq_r2 <= 1'b0 ; - tcs2048 <= 1'b0 ; - tcs128 <= 1'b0 ; - tcscnt <= {4{1'b1}} ; - end - else - begin - tcsreq_r1 <= tcsreq ; - tcsreq_r2 <= tcsreq_r1 ; - - if (tcs128) - begin - if (tcscnt == 4'b0000) - begin - tcscnt <= 4'b1111 ; - end - else - begin - tcscnt <= tcscnt - 1 ; - end - end - - if (tcsreq_r1 & !tcsreq_r2) - begin - tcs128 <= 1'b1 ; - end - else - begin - tcs128 <= 1'b0 ; - end - - if (tcscnt == 4'b0000 & tcs128) - begin - tcs2048 <= 1'b1 ; - end - else - begin - tcs2048 <= 1'b0 ; - end - - end - end - - assign tcsack = tcsreq_r2 ; - - always @(posedge clk) - begin : st_reg_proc - if (rst) - begin - tstopcmd <= 1'b1 ; - tstartcmd <= 1'b0 ; - end - else - begin - if (tstartcmd) - begin - tstopcmd <= 1'b0 ; - end - else if (!csrrw & csrreq & !(csrdata_c[13]) & - csraddr72 == CSR6_ID & (csrdbe_c[1])) - begin - tstopcmd <= 1'b1 ; - end - - if (tpsm == PSM_RUN | tpsm == PSM_SUSPEND) - begin - tstartcmd <= 1'b0 ; - end - else if (!csrrw & csrreq & (csrdata_c[13]) & - csraddr72 == CSR6_ID & (csrdbe_c[1])) - begin - tstartcmd <= 1'b1 ; - end - - end - end - - assign ts_c = (tpsm == PSM_STOP) ? 3'b000 : - (tpsm == PSM_SUSPEND) ? 3'b110 : - (tstat) ? 3'b111 : - (tdes) ? 3'b001 : - (tset) ? 3'b101 : - (tbuf) ? 3'b011 : - (tprog) ? 3'b010 : - csr5_ts ; - - always @(posedge clk) - begin : tpsack_reg_proc - if (rst) - begin - stoptc_r <= 1'b0 ; - stoptlsm_r <= 1'b0 ; - stoptfifo_r <= 1'b0 ; - end - else - begin - stoptc_r <= stoptc ; - stoptlsm_r <= stoptlsm ; - stoptfifo_r <= stoptfifo ; - end - end - - always @(tpsm or - tstartcmd or - tstopcmd or - tu_r or - stoptc_r or - stoptlsm_r or - stoptfifo_r) - begin : tpsm_proc - case (tpsm) - PSM_STOP : - begin - if (tstartcmd & !stoptc_r & !stoptlsm_r & !stoptfifo_r) - begin - tpsm_c <= PSM_RUN ; - end - else - begin - tpsm_c <= PSM_STOP ; - end - end - PSM_SUSPEND : - begin - if (tstopcmd & stoptc_r & stoptlsm_r & stoptfifo_r) - begin - tpsm_c <= PSM_STOP ; - end - else if (!tu_r) - begin - tpsm_c <= PSM_RUN ; - end - else - begin - tpsm_c <= PSM_SUSPEND ; - end - end - default : - begin - if (tstopcmd & stoptc_r & stoptlsm_r & stoptfifo_r) - begin - tpsm_c <= PSM_STOP ; - end - else if (tu_r) - begin - tpsm_c <= PSM_SUSPEND ; - end - else - begin - tpsm_c <= PSM_RUN ; - end - end - endcase - end - - always @(posedge clk) - begin : tpsm_reg_proc - if (rst) - begin - tpsm <= PSM_STOP ; - end - else - begin - tpsm <= tpsm_c ; - end - end - - always @(posedge clk) - begin : tps_reg_proc - if (rst) - begin - tps <= 1'b0 ; - end - else - begin - if (tstartcmd) - begin - tps <= 1'b0 ; - end - else if (tpsm == PSM_STOP) - begin - tps <= 1'b1 ; - end - end - end - - assign stopt = tstopcmd ; - - assign ren = csr6_sr ; - - assign fd = csr6_fd ; - - assign ra = csr6_ra ; - - assign pm = csr6_pm ; - - assign pr = csr6_pr ; - - assign rif = csr6_if ; - - assign pb = csr6_pb ; - - assign ho = csr6_ho ; - - assign hp = csr6_hp ; - - always @(posedge clk) - begin : rpoll_reg_proc - if (rst) - begin - rpoll <= 1'b0 ; - end - else - begin - if (rpollcmd | rstartcmd) - begin - rpoll <= 1'b1 ; - end - else if (rpollack) - begin - rpoll <= 1'b0 ; - end - end - end - - assign rs_c = (rpsm == PSM_STOP) ? 3'b000 : - (rpsm == PSM_SUSPEND) ? 3'b100 : - (rstat) ? 3'b101 : - (rdes) ? 3'b001 : - (rbuf) ? 3'b111 : - (rprog) ? 3'b010 : - 3'b011 ; - - always @(posedge clk) - begin : rpsack_reg_proc - if (rst) - begin - stoprc_r <= 1'b0 ; - stoprlsm_r <= 1'b0 ; - end - else - begin - stoprc_r <= stoprc ; - stoprlsm_r <= stoprlsm ; - end - end - - always @(rpsm or - rstartcmd or - rstopcmd or - rui or - ru_r or - stoprc_r or - stoprlsm_r) - begin : rpsm_proc - case (rpsm) - PSM_STOP : - begin - if (rstartcmd & !stoprc_r & !stoprlsm_r) - begin - rpsm_c <= PSM_RUN ; - end - else - begin - rpsm_c <= PSM_STOP ; - end - end - PSM_SUSPEND : - begin - if (rstopcmd & stoprc_r & stoprlsm_r) - begin - rpsm_c <= PSM_STOP ; - end - else if (!ru_r) - begin - rpsm_c <= PSM_RUN ; - end - else - begin - rpsm_c <= PSM_SUSPEND ; - end - end - default : - begin - if (rstopcmd & stoprc_r & stoprlsm_r) - begin - rpsm_c <= PSM_STOP ; - end - else if (rui) - begin - rpsm_c <= PSM_SUSPEND ; - end - else - begin - rpsm_c <= PSM_RUN ; - end - end - endcase - end - - always @(posedge clk) - begin : rpsm_reg_proc - if (rst) - begin - rpsm <= PSM_STOP ; - end - else - begin - rpsm <= rpsm_c ; - end - end - - always @(posedge clk) - begin : rps_reg_proc - if (rst) - begin - rps <= 1'b0 ; - end - else - begin - if (rstartcmd) - begin - rps <= 1'b0 ; - end - else if (rpsm == PSM_STOP) - begin - rps <= 1'b1 ; - end - end - end - - always @(posedge clk) - begin : rstartcmd_reg_proc - if (rst) - begin - rstartcmd <= 1'b0 ; - rstopcmd <= 1'b0 ; - end - else - begin - if (rpsm == PSM_RUN) - begin - rstartcmd <= 1'b0 ; - end - else if (!csrrw & csrreq & (csrdata_c[1]) & - csraddr72 == CSR6_ID & (csrdbe_c[0])) - begin - rstartcmd <= 1'b1 ; - end - - if (rpsm == PSM_STOP) - begin - rstopcmd <= 1'b0 ; - end - else if (!csrrw & csrreq & !(csrdata_c[1]) & - csraddr72 == CSR6_ID & (csrdbe_c[0])) - begin - rstopcmd <= 1'b1 ; - end - end - end - - assign stopr = rstopcmd ; - - always @(posedge clk) - begin : rim_reg_proc - if (rst) - begin - rimex <= 1'b0 ; - rimprog <= 1'b0 ; - rtcnt <= {4{1'b1}} ; - rcnt <= {3{1'b1}} ; - end - else - begin - if (csr5_ri) - begin - rimex <= 1'b0 ; - end - else if (rimprog & - ((rtcnt == 4'b0000 & csr11_rt != 4'b0000) | - (rcnt == 3'b000 & csr11_nrp != 3'b000) | - (csr11_rt == 4'b0000 & csr11_nrp == 3'b000))) - begin - rimex <= 1'b1 ; - end - - if (csr5_ri) - begin - rimprog <= 1'b0 ; - end - else if (rireq_r & !rireq_r2) - begin - rimprog <= 1'b1 ; - end - - if ((rireq_r & !rireq_r2) | csr5_ri) - begin - rtcnt <= csr11_rt ; - end - else if (((rcs128 & csr11_cs) | - (rcs2048 & !csr11_cs)) & - rtcnt != 4'b0000 & rimprog) - begin - rtcnt <= rtcnt - 1 ; - end - - if (csr5_ri | csr11wr) - begin - rcnt <= csr11_nrp ; - end - else if (rireq_r & !rireq_r2 & - rcnt != 3'b000 & csr11_nrp != 3'b000) - begin - rcnt <= rcnt - 1 ; - end - - end - end - - always @(posedge clk) - begin : rcscnt_reg_proc - if (rst) - begin - rcsreq_r <= 1'b0 ; - rcsreq_r1 <= 1'b0 ; - rcscnt <= {4{1'b1}} ; - rcs128 <= 1'b0 ; - rcs2048 <= 1'b0 ; - end - else - begin - - rcsreq_r <= rcsreq ; - rcsreq_r1 <= rcsreq_r ; - - if (rcs128) - begin - if (rcscnt == 4'b0000) - begin - rcscnt <= 4'b1111 ; - end - else - begin - rcscnt <= rcscnt - 1 ; - end - end - - if (rcsreq_r & !rcsreq_r1) - begin - rcs128 <= 1'b1 ; - end - else - begin - rcs128 <= 1'b0 ; - end - - if (rcscnt == 4'b0000 & rcs128) - begin - rcs2048 <= 1'b1 ; - end - else - begin - rcs2048 <= 1'b0 ; - end - end - end - - assign rcsack = rcsreq_r ; - - always @(posedge clk) - begin : ireq_reg_proc - if (rst) - begin - rireq_r <= 1'b0 ; - rireq_r2 <= 1'b0 ; - erireq_r <= 1'b0 ; - erireq_r2 <= 1'b0 ; - tireq_r <= 1'b0 ; - tireq_r2 <= 1'b0 ; - etireq_r <= 1'b0 ; - etireq_r2 <= 1'b0 ; - unf_r <= 1'b0 ; - unf_r2 <= 1'b0 ; - tu_r <= 1'b0 ; - tu_r2 <= 1'b0 ; - ru_r <= 1'b0 ; - ru_r2 <= 1'b0 ; - end - else - begin - rireq_r <= rireq ; - rireq_r2 <= rireq_r ; - erireq_r <= erireq ; - erireq_r2 <= erireq_r ; - tireq_r <= tireq ; - tireq_r2 <= tireq_r ; - etireq_r <= etireq ; - etireq_r2 <= etireq_r ; - unf_r <= unf ; - unf_r2 <= unf_r ; - tu_r <= tu ; - tu_r2 <= tu_r ; - ru_r <= ru ; - ru_r2 <= ru_r ; - end - end - - always @(posedge clk) - begin : iic_reg_proc - if (rst) - begin - iic <= 1'b0 ; - end - else - begin - if (tireq_r & !tireq_r2) - begin - if (!ic & !iint) - begin - iic <= 1'b0 ; - end - else - begin - iic <= 1'b1 ; - end - end - end - end - - always @(posedge clk) - begin : eti_reg_proc - if (rst) - begin - eti <= 1'b0 ; - end - else - begin - if (etireq_r & !etireq_r2) - begin - eti <= 1'b1 ; - end - else if (!csr5wr_c) - begin - eti <= 1'b0 ; - end - end - end - - assign etiack = etireq_r2 ; - - always @(posedge clk) - begin : eri_reg_proc - if (rst) - begin - eri <= 1'b0 ; - end - else - begin - if (erireq_r & !erireq_r2) - begin - eri <= 1'b1 ; - end - else if (!csr5wr_c) - begin - eri <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : unfi_reg_proc - if (rst) - begin - unfi <= 1'b0 ; - end - else - begin - if (unf_r & !unf_r2) - begin - unfi <= 1'b1 ; - end - else if (!csr5wr_c) - begin - unfi <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : tui_reg_proc - if (rst) - begin - tui <= 1'b0 ; - end - else - begin - if (tu_r & !tu_r2) - begin - tui <= 1'b1 ; - end - else if (!csr5wr_c) - begin - tui <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : rui_reg_proc - if (rst) - begin - rui <= 1'b0 ; - end - else - begin - if (ru_r & !ru_r2) - begin - rui <= 1'b1 ; - end - else if (!csr5wr_c) - begin - rui <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : iint_reg_proc - if (rst) - begin - iint <= 1'b0 ; - end - else - begin - iint <= ((csr5_nis && csr7_nie) || - (csr5_ais && csr7_aie)) && ~csr5wr; - end - end - - assign interrupt = iint ; - - assign riack = rireq_r2 ; - - assign eriack = erireq_r2 ; - - assign tiack = tireq_r2 ; - - always @(focg_r) - begin : foc_proc - reg [10:0] foc_v; - - foc_v[10] = focg_r[10] ; - begin : foc_loop - integer i; - for(i = 9; i >= 0; i = i - 1) - begin - foc_v[i] = foc_v[i + 1] ^ focg_r[i] ; - end - end - foc_c = foc_v; - end - - always @(mfcg_r) - begin : mfc_proc - reg [15:0] mfc_v; - - mfc_v[15] = mfcg_r[10] ; - begin : mfc_loop - integer i; - for(i = 14; i >= 0; i = i - 1) - begin - mfc_v[i] = mfc_v[i + 1] ^ mfcg_r[i] ; - end - end - mfc_c = mfc_v; - end - - always @(posedge clk) - begin : sc_reg_proc - if (rst) - begin - focl <= 1'b0 ; - mfcl <= 1'b0 ; - focg_r <= {11{1'b0}} ; - mfcg_r <= {16{1'b0}} ; - end - else - begin - if (csr8read) - begin - focl <= 1'b1 ; - end - else if (foclack) - begin - focl <= 1'b0 ; - end - - if (csr8read) - begin - mfcl <= 1'b1 ; - end - else if (mfclack) - begin - mfcl <= 1'b0 ; - end - - mfcg_r <= mfcg ; - - focg_r <= focg ; - - end - end - - assign mdo = csr9_mdo ; - - assign mden = csr9_mii ; - - assign mdc = csr9_mdc ; - - assign sclk = csr9_sclk ; - - assign scs = csr9_scs ; - - assign sdo = csr9_sdo ; - - - assign insert_en_o = csr10_insert_en; - - always @(posedge clk) - begin : gpt_reg_proc - if (rst) - begin - gstart <= 1'b0 ; - gstart_r <= 1'b0 ; - gcnt <= {16{1'b0}} ; - gte <= 1'b0 ; - end - else - begin - if (!csrrw & csrreq & (csrdbe_c[3]) & csraddr72 == CSR11_ID) - begin - gstart <= 1'b1 ; - end - else if ((!csr11_con & gte) | - csr11_tim == 16'b0000000000000000) - begin - gstart <= 1'b0 ; - end - - if(csr11_tim != 16'b0000000000000000) - begin - gstart_r <= gstart ; - end - else - begin - gstart_r <= 1'b0 ; - end - - if (gstart & !gstart_r) - begin - gcnt <= csr11_tim ; - end - else if (gcnt == 16'b0000000000000000) - begin - if (csr11_con) - begin - gcnt <= csr11_tim ; - end - end - else if (tcs2048) - begin - gcnt <= gcnt - 1 ; - end - - if (csr5wr_c) - begin - gte <= 1'b0 ; - end - else if (gstart_r & gcnt == 16'b0000000000000000 & - csr11_tim != 16'b0000000000000000) - begin - gte <= 1'b1 ; - end - - end - end - - always @(posedge clk) - begin : rstsofto_reg_proc - rstsofto <= csr0_swr; - end - - assign czero_max = {CSRWIDTH_MAX{1'b0}} ; - - assign csrdatai_max = {czero_max[CSRWIDTH_MAX+1:CSRWIDTH], - csrdatai}; - - assign csrbe_max = {czero_max[CSRWIDTH_MAX/8+1:CSRWIDTH/8], - csrbe}; - -endmodule diff --git a/resources/soc/rtl/MAC/dma.v b/resources/soc/rtl/MAC/dma.v deleted file mode 100644 index 62292bb..0000000 --- a/resources/soc/rtl/MAC/dma.v +++ /dev/null @@ -1,646 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -module DMA ( - clk, - rst, - dma_priority, - ble, - dbo, - rdes, - rbuf, - rstat, - tdes, - tbuf, - tstat, - dataack, - datai, - datareq, - datareqc, - datarw, - dataeob, - dataeobc, - datao, - dataaddr, - idataaddr, - req1, - write1, - tcnt1, - addr1, - datai1, - ack1, - eob1, - datao1, - req2, - write2, - tcnt2, - addr2, - datai2, - ack2, - eob2, - datao2); - - parameter DATAWIDTH = 32; - parameter DATADEPTH = 32; - - `include "utility.v" - - input clk; - input rst; - - input [1:0] dma_priority; - input ble; - input dbo; - input rdes; - input rbuf; - input rstat; - input tdes; - input tbuf; - input tstat; - - - input dataack; - input [DATAWIDTH - 1:0] datai; - output datareq; - wire datareq; - output datareqc; - wire datareqc; - output datarw; - reg datarw; - output dataeob; - wire dataeob; - output dataeobc; - wire dataeobc; - output [DATAWIDTH - 1:0] datao; - wire [DATAWIDTH - 1:0] datao; - output [DATADEPTH - 1:0] dataaddr; - wire [DATADEPTH - 1:0] dataaddr; - output [DATADEPTH - 1:0] idataaddr; - wire [DATADEPTH - 1:0] idataaddr; - - input req1; - input write1; - input [FIFODEPTH_MAX - 1:0] tcnt1; - input [DATADEPTH - 1:0] addr1; - input [DATAWIDTH - 1:0] datai1; - output ack1; - wire ack1; - output eob1; - wire eob1; - output [DATAWIDTH - 1:0] datao1; - wire [DATAWIDTH - 1:0] datao1; - - input req2; - input write2; - input [FIFODEPTH_MAX - 1:0] tcnt2; - input [DATADEPTH - 1:0] addr2; - input [DATAWIDTH - 1:0] datai2; - output ack2; - wire ack2; - output eob2; - wire eob2; - output [DATAWIDTH - 1:0] datao2; - wire [DATAWIDTH - 1:0] datao2; - - - reg [1:0] dsm_c; - reg [1:0] dsm; - reg hist1; - reg hist2; - wire [1:0] dmareq; - reg [FIFODEPTH_MAX - 1:0] msmbcnt; - reg idatareq; - reg idatareqc; - reg eob; - reg eobc; - reg [DATADEPTH - 1:0] addr_c; - reg [DATADEPTH - 1:0] addr; - reg blesel_c; - reg [DATAWIDTH - 1:0] dataible_c; - reg [DATAWIDTH - 1:0] dataoble_c; - wire [DATAWIDTH_MAX + 1:0] datai_max; - reg req_c; - reg write_c; - reg [FIFODEPTH_MAX - 1:0] tcnt_c; - reg [DATADEPTH - 1:0] saddr_c; - reg [DATAWIDTH_MAX - 1:0] datai_c; - wire [DATAWIDTH_MAX + 1:0] datai_max_c; - wire [FIFODEPTH_MAX - 1:0] fzero; - wire [DATAWIDTH_MAX + 1:0] dzero; - - assign dmareq = {req2, req1} ; - - always @(dsm or - dmareq or - hist1 or - hist2 or - dma_priority or - eob or - dataack) - begin : dsm_proc - case (dsm) - DSM_IDLE : - begin - case (dmareq) - 2'b11 : - begin - case (dma_priority) - 2'b01 : - begin - if (!hist1 & !hist2) - begin - dsm_c <= DSM_CH2 ; - end - else - begin - dsm_c <= DSM_CH1 ; - end - end - 2'b10 : - begin - if (hist1 & hist2) - begin - dsm_c <= DSM_CH1 ; - end - else - begin - dsm_c <= DSM_CH2 ; - end - end - default : - begin - if (hist1) - begin - dsm_c <= DSM_CH1 ; - end - else - begin - dsm_c <= DSM_CH2 ; - end - end - endcase - end - 2'b01 : - begin - dsm_c <= DSM_CH1 ; - end - 2'b10 : - begin - dsm_c <= DSM_CH2 ; - end - default : - begin - dsm_c <= DSM_IDLE ; - end - endcase - end - DSM_CH1 : - begin - if (eob & dataack) - begin - dsm_c <= DSM_IDLE ; - end - else - begin - dsm_c <= DSM_CH1 ; - end - end - default : - begin - if (eob & dataack) - begin - dsm_c <= DSM_IDLE ; - end - else - begin - dsm_c <= DSM_CH2 ; - end - end - endcase - end - - always @(posedge clk) - begin : dsm_reg_proc - if (rst) - begin - dsm <= DSM_IDLE ; - end - else - begin - dsm <= dsm_c ; - end - end - - always @(posedge clk) - begin : hist_reg_proc - if (rst) - begin - hist1 <= 1'b1 ; - hist2 <= 1'b1 ; - end - else - begin - if (eob) - begin - case (dsm) - DSM_CH1 : - begin - hist1 <= 1'b1 ; - end - DSM_CH2 : - begin - hist1 <= 1'b0 ; - end - default : - begin - hist1 <= hist1 ; - end - endcase - end - hist2 <= hist1 ; - end - end - - always @(dbo or - ble or - dsm_c or - dsm or - tdes or - tbuf or - tstat or - rdes or - rbuf or - rstat) - begin : blesel_proc - if (dsm_c == DSM_CH1 | dsm == DSM_CH1) - begin - if ((tbuf & ble) | - ((tdes | tstat) & dbo)) - begin - blesel_c <= 1'b1 ; - end - else - begin - blesel_c <= 1'b0 ; - end - end - else - begin - if ((rbuf & ble) | - ((rdes | rstat) & dbo)) - begin - blesel_c <= 1'b1 ; - end - else - begin - blesel_c <= 1'b0 ; - end - end - end - - always @(dsm_c or - dsm or - req1 or - write1 or - tcnt1 or - addr1 or - datai1 or - req2 or - write2 or - tcnt2 or - addr2 or - datai2) - begin : chmux_proc - if (dsm_c == DSM_CH1 | dsm == DSM_CH1) - begin - req_c <= req1 ; - write_c <= write1 ; - tcnt_c <= tcnt1 ; - saddr_c <= addr1 ; - datai_c <= {{((DATAWIDTH_MAX+1)-DATAWIDTH){1'b0}},datai1} ; - end - else - begin - req_c <= req2 ; - write_c <= write2 ; - tcnt_c <= tcnt2 ; - saddr_c <= addr2 ; - datai_c <= {{((DATAWIDTH_MAX+1)-DATAWIDTH){1'b0}},datai2} ; - end - end - - assign datai_max_c = {dzero[DATAWIDTH_MAX+1:DATAWIDTH],datai_c}; - - always @(datai_max_c or blesel_c) - begin : dataoble_proc - case (DATAWIDTH) - 32 : - begin - if (blesel_c) - begin - dataoble_c <= {datai_max_c[ 7: 0], - datai_max_c[15: 8], - datai_max_c[23:16], - datai_max_c[31:24]}; - end - else - begin - dataoble_c <= datai_max_c[31:0]; - end - end - 16 : - begin - if (blesel_c) - begin - dataoble_c <= {datai_max_c[7 :0], - datai_max_c[15:8]}; - end - else - begin - dataoble_c <= datai_max_c[15:0]; - end - end - default : - begin - dataoble_c <= datai_max_c[7:0]; - end - endcase - end - - assign datai_max = {dzero[DATAWIDTH_MAX+1:DATAWIDTH],datai}; - - always @(datai_max or blesel_c) - begin : dataible_proc - case (DATAWIDTH) - 32 : - begin - if (blesel_c) - begin - dataible_c <= {datai_max[ 7: 0], - datai_max[15: 8], - datai_max[23:16], - datai_max[31:24]}; - end - else - begin - dataible_c <= datai_max[31:0]; - end - end - 16 : - begin - if (blesel_c) - begin - dataible_c <= {datai_max[7 :0], - datai_max[15:8]}; - end - else - begin - dataible_c <= datai_max[15:0]; - end - end - default : - begin - dataible_c <= datai_max[7:0]; - end - endcase - end - - always @(posedge clk) - begin : msmbcnt_reg_proc - if (rst) - begin - msmbcnt <= {FIFODEPTH_MAX{1'b0}} ; - end - else - begin - if (!idatareq) - begin - msmbcnt <= tcnt_c ; - end - else if (dataack & idatareq) - begin - msmbcnt <= msmbcnt - 1 ; - end - end - end - - always @(posedge clk) - begin : datarw_reg_proc - if (rst) - begin - datarw <= 1'b1 ; - end - else - begin - if (req_c) - begin - datarw <= ~write_c ; - end - end - end - - always @(posedge clk) - begin : idatareq_reg_proc - if (rst) - begin - idatareq <= 1'b0 ; - end - else - begin - if (eob & dataack & idatareq) - begin - idatareq <= 1'b0 ; - end - else if (req1 | req2) - begin - idatareq <= 1'b1 ; - end - end - end - - assign datareq = idatareq ; - - always @(idatareq or - dataack or - req1 or - req2 or - eob - ) - begin : idatareqc_comb_proc - if (eob & dataack & idatareq) - begin - idatareqc <= 1'b0 ; - end - else if (req1 | req2) - begin - idatareqc <= 1'b1 ; - end - else - begin - idatareqc <= idatareq ; - end - end - - assign datareqc = idatareqc ; - - assign dataeob = eob ; - - assign dataeobc = eobc ; - - assign datao1 = dataible_c ; - - assign datao2 = dataible_c ; - - assign datao = dataoble_c ; - - always @(dataack or - idatareq or - addr or - saddr_c or - req_c or - dsm) - begin : addr_proc - if (dataack & idatareq) - begin - case (DATAWIDTH) - 8 : - begin - addr_c <= addr + 1 ; - end - 16 : - begin - addr_c <= {addr[DATADEPTH - 1:1] + 1, 1'b0} ; - end - default : - begin - addr_c <= {addr[DATADEPTH - 1:2] + 1, 2'b00} ; - end - endcase - end - else if (req_c & dsm == DSM_IDLE) - begin - addr_c <= saddr_c ; - end - else - begin - addr_c <= addr ; - end - end - - always @(posedge clk) - begin : addr_reg_proc - if (rst) - begin - addr <= {DATADEPTH{1'b1}} ; - end - else - begin - addr <= addr_c ; - end - end - - assign dataaddr = addr ; - - assign idataaddr = addr ; - - assign ack1 = (dataack & dsm == DSM_CH1) ? 1'b1 : 1'b0 ; - - assign ack2 = (dataack & dsm == DSM_CH2) ? 1'b1 : 1'b0 ; - - always @(posedge clk) - begin : eob_reg_proc - if (rst) - begin - eob <= 1'b0 ; - end - else if (req_c | idatareq) - begin - if ((idatareq & - (msmbcnt == fzero | - msmbcnt == {fzero[FIFODEPTH_MAX-1:1], 1'b1} | - (msmbcnt == {fzero[FIFODEPTH_MAX-1:2], 2'b10} & dataack))) - | - (!idatareq & - (tcnt_c == fzero | - tcnt_c == {fzero[FIFODEPTH_MAX-1:1], 1'b1}))) - begin - eob <= 1'b1 ; - end - else - begin - eob <= 1'b0 ; - end - end - end - - always @(req_c or - idatareq or - msmbcnt or - dataack or - tcnt_c or - fzero or - eob) - begin : eob_comb_proc - if (req_c | idatareq) - begin - if ((idatareq & - (msmbcnt == fzero | - msmbcnt == {fzero[FIFODEPTH_MAX-1:1], 1'b1} | - (msmbcnt == {fzero[FIFODEPTH_MAX-1:2], 2'b10} & dataack))) - | - (!idatareq & - (tcnt_c == fzero | - tcnt_c == {fzero[FIFODEPTH_MAX-1:1], 1'b1}))) - begin - eobc <= 1'b1 ; - end - else - begin - eobc <= 1'b0 ; - end - end - else - begin - eobc <= eob; - end - end - - assign eob1 = eob ; - - assign eob2 = eob ; - - assign fzero = {FIFODEPTH_MAX{1'b0}} ; - - assign dzero = {(DATAWIDTH_MAX+1){1'b0}} ; - -endmodule diff --git a/resources/soc/rtl/MAC/ethernet_top.v b/resources/soc/rtl/MAC/ethernet_top.v deleted file mode 100644 index 6239f5f..0000000 --- a/resources/soc/rtl/MAC/ethernet_top.v +++ /dev/null @@ -1,368 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -module ethernet_top -( - hclk, - hrst_, - mawid_o , - mawaddr_o , - mawlen_o , - mawsize_o , - mawburst_o , - mawlock_o , - mawcache_o , - mawprot_o , - mawvalid_o , - mawready_i , - mwid_o , - mwdata_o , - mwstrb_o , - mwlast_o , - mwvalid_o , - mwready_i , - mbid_i , - mbresp_i , - mbvalid_i , - mbready_o , - marid_o , - maraddr_o , - marlen_o , - marsize_o , - marburst_o , - marlock_o , - marcache_o , - marprot_o , - marvalid_o , - marready_i , - mrid_i , - mrdata_i , - mrresp_i , - mrlast_i , - mrvalid_i , - mrready_o , - sawid_i , - sawaddr_i , - sawlen_i , - sawsize_i , - sawburst_i , - sawlock_i , - sawcache_i , - sawprot_i , - sawvalid_i , - sawready_o , - swid_i , - swdata_i , - swstrb_i , - swlast_i , - swvalid_i , - swready_o , - sbid_o , - sbresp_o , - sbvalid_o , - sbready_i , - sarid_i , - saraddr_i , - sarlen_i , - sarsize_i , - sarburst_i , - sarlock_i , - sarcache_i , - sarprot_i , - sarvalid_i , - sarready_o , - srid_o , - srdata_o , - srresp_o , - srlast_o , - srvalid_o , - srready_i , - - interrupt_0, - - mtxclk_0, - mtxen_0, - mtxd_0, - mtxerr_0, - mrxclk_0, - mrxdv_0, - mrxd_0, - mrxerr_0, - mcoll_0, - mcrs_0, - mdc_0, - md_i_0, - md_o_0, - md_oe_0 -); - -input hclk; -input hrst_; - - output [ 3:0] mawid_o ; - output [ 31:0] mawaddr_o ; - output [ 3:0] mawlen_o ; - output [ 2:0] mawsize_o ; - output [ 1:0] mawburst_o ; - output [ 1:0] mawlock_o ; - output [ 3:0] mawcache_o ; - output [ 2:0] mawprot_o ; - output mawvalid_o ; - input mawready_i ; - output [ 3:0] mwid_o ; - output [ 31:0] mwdata_o ; - output [ 3:0] mwstrb_o ; - output mwlast_o ; - output mwvalid_o ; - input mwready_i ; - input [ 3:0] mbid_i ; - input [ 1:0] mbresp_i ; - input mbvalid_i ; - output mbready_o ; - output [ 3:0] marid_o ; - output [ 31:0] maraddr_o ; - output [ 3:0] marlen_o ; - output [ 2:0] marsize_o ; - output [ 1:0] marburst_o ; - output [ 1:0] marlock_o ; - output [ 3:0] marcache_o ; - output [ 2:0] marprot_o ; - output marvalid_o ; - input marready_i ; - input [ 3:0] mrid_i ; - input [ 31:0] mrdata_i ; - input [ 1:0] mrresp_i ; - input mrlast_i ; - input mrvalid_i ; - output mrready_o ; - - input [ 3:0] sawid_i ; - input [ 31:0] sawaddr_i ; - input [ 3:0] sawlen_i ; - input [ 2:0] sawsize_i ; - input [ 1:0] sawburst_i ; - input [ 1:0] sawlock_i ; - input [ 3:0] sawcache_i ; - input [ 2:0] sawprot_i ; - input sawvalid_i ; - output sawready_o ; - input [ 3:0] swid_i ; - input [ 31:0] swdata_i ; - input [ 3:0] swstrb_i ; - input swlast_i ; - input swvalid_i ; - output swready_o ; - output [ 3:0] sbid_o ; - output [ 1:0] sbresp_o ; - output sbvalid_o ; - input sbready_i ; - input [ 3:0] sarid_i ; - input [ 31:0] saraddr_i ; - input [ 3:0] sarlen_i ; - input [ 2:0] sarsize_i ; - input [ 1:0] sarburst_i ; - input [ 1:0] sarlock_i ; - input [ 3:0] sarcache_i ; - input [ 2:0] sarprot_i ; - input sarvalid_i ; - output sarready_o ; - output [ 3:0] srid_o ; - output [ 31:0] srdata_o ; - output [ 1:0] srresp_o ; - output srlast_o ; - output srvalid_o ; - input srready_i ; - -input mtxclk_0; -output [3:0] mtxd_0; -output mtxen_0; -output mtxerr_0; - -input mrxclk_0; -input [3:0] mrxd_0; -input mrxdv_0; -input mrxerr_0; - -input mcoll_0; -input mcrs_0; - -input md_i_0; -output mdc_0; -output md_o_0; -output md_oe_0; - -output interrupt_0; - - -`define MAHBDATAWIDTH 32 -`define TFIFODEPTH 9 -`define RFIFODEPTH 9 -`define ADDRDEPTH 6 - -wire [`MAHBDATAWIDTH - 1:0] trdata_0; -wire twe_0; -wire [`TFIFODEPTH - 1:0] twaddr_0; -wire [`TFIFODEPTH - 1:0] traddr_0; -wire [`MAHBDATAWIDTH - 1:0] twdata_0; - -wire [`MAHBDATAWIDTH - 1:0] rrdata_0; -wire rwe_0; -wire [`RFIFODEPTH - 1:0] rwaddr_0; -wire [`RFIFODEPTH - 1:0] rraddr_0; -wire [`MAHBDATAWIDTH - 1:0] rwdata_0; - - -mac_top u_mac_top_0 -( - .hclk(hclk), - .hrst_(hrst_), - - .mawid_o (mawid_o ), - .mawaddr_o (mawaddr_o ), - .mawlen_o (mawlen_o ), - .mawsize_o (mawsize_o ), - .mawburst_o (mawburst_o ), - .mawlock_o (mawlock_o ), - .mawcache_o (mawcache_o ), - .mawprot_o (mawprot_o ), - .mawvalid_o (mawvalid_o ), - .mawready_i (mawready_i ), - .mwid_o (mwid_o ), - .mwdata_o (mwdata_o ), - .mwstrb_o (mwstrb_o ), - .mwlast_o (mwlast_o ), - .mwvalid_o (mwvalid_o ), - .mwready_i (mwready_i ), - .mbid_i (mbid_i ), - .mbresp_i (mbresp_i ), - .mbvalid_i (mbvalid_i ), - .mbready_o (mbready_o ), - .marid_o (marid_o ), - .maraddr_o (maraddr_o ), - .marlen_o (marlen_o ), - .marsize_o (marsize_o ), - .marburst_o (marburst_o ), - .marlock_o (marlock_o ), - .marcache_o (marcache_o ), - .marprot_o (marprot_o ), - .marvalid_o (marvalid_o ), - .marready_i (marready_i ), - .mrid_i (mrid_i ), - .mrdata_i (mrdata_i ), - .mrresp_i (mrresp_i ), - .mrlast_i (mrlast_i ), - .mrvalid_i (mrvalid_i ), - .mrready_o (mrready_o ), - .sawid_i (sawid_i ), - .sawaddr_i (sawaddr_i ), - .sawlen_i (sawlen_i ), - .sawsize_i (sawsize_i ), - .sawburst_i (sawburst_i ), - .sawlock_i (sawlock_i ), - .sawcache_i (sawcache_i ), - .sawprot_i (sawprot_i ), - .sawvalid_i (sawvalid_i ), - .sawready_o (sawready_o ), - .swid_i (swid_i ), - .swdata_i (swdata_i ), - .swstrb_i (swstrb_i ), - .swlast_i (swlast_i ), - .swvalid_i (swvalid_i ), - .swready_o (swready_o ), - .sbid_o (sbid_o ), - .sbresp_o (sbresp_o ), - .sbvalid_o (sbvalid_o ), - .sbready_i (sbready_i ), - .sarid_i (sarid_i ), - .saraddr_i (saraddr_i ), - .sarlen_i (sarlen_i ), - .sarsize_i (sarsize_i ), - .sarburst_i (sarburst_i ), - .sarlock_i (sarlock_i ), - .sarcache_i (sarcache_i ), - .sarprot_i (sarprot_i ), - .sarvalid_i (sarvalid_i ), - .sarready_o (sarready_o ), - .srid_o (srid_o ), - .srdata_o (srdata_o ), - .srresp_o (srresp_o ), - .srlast_o (srlast_o ), - .srvalid_o (srvalid_o ), - .srready_i (srready_i ), - - .interrupt(interrupt_0), - - .mtxclk(mtxclk_0), .mtxen(mtxen_0), .mtxd(mtxd_0), .mtxerr(mtxerr_0), - .mrxclk(mrxclk_0), .mrxdv(mrxdv_0), .mrxd(mrxd_0), .mrxerr(mrxerr_0), - .mcoll(mcoll_0), .mcrs(mcrs_0), - .mdc(mdc_0), .md_i(md_i_0), .md_o(md_o_0), .md_oe(md_oe_0), - - .trdata(trdata_0), - .twe(twe_0), - .twaddr(twaddr_0), - .traddr(traddr_0), - .twdata(twdata_0), - - .rrdata(rrdata_0), - .rwe(rwe_0), - .rwaddr(rwaddr_0), - .rraddr(rraddr_0), - .rwdata(rwdata_0) -); - -wire [31:0] douta_nc; -dpram_512x32 dpram_512x32_tx( - .clka (hclk ), - .ena (twe_0 ), - .wea (twe_0 ), - .addra (twaddr_0), - .dina (twdata_0), - .clkb (mtxclk_0), - .addrb (traddr_0), - .doutb (trdata_0) -); - -wire [31:0] doutb_nc; -dpram_512x32 dpram_512x32_rx( - .clka (mrxclk_0), - .ena (rwe_0 ), - .wea (rwe_0 ), - .addra (rwaddr_0), - .dina (rwdata_0), - .clkb (hclk ), - .addrb (rraddr_0), - .doutb (rrdata_0) -); - -endmodule - diff --git a/resources/soc/rtl/MAC/mac.v b/resources/soc/rtl/MAC/mac.v deleted file mode 100644 index 278bf28..0000000 --- a/resources/soc/rtl/MAC/mac.v +++ /dev/null @@ -1,862 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -module MAC ( - clkdma, - clkcsr, - rstcsr, - clkt, - clkr, - rsttco, - rstrco, - interrupt, - tps, - rps, - csrreq, - csrrw, - csrbe, - csrdatai, - csraddr, - csrack, - csrdatao, - dataack, - datareq, - datareqc, - datarw, - dataeob, - dataeobc, - datai, - dataaddr, - datao, - trdata, - twe, - twaddr, - traddr, - twdata, - rrdata, - rwe, - rwaddr, - rraddr, - rwdata, - frdata, - fwe, - fwaddr, - fraddr, - fwdata, - match, - matchval, - matchen, - matchdata, - sdi, - sclk, - scs, - sdo, - rxer, - rxdv, - col, - crs, - rxd, - txen, - txer, - txd, - mdc, - mdi, - mdo, - mden - ); - - parameter CSRWIDTH = 32; - parameter DATAWIDTH = 32; - parameter DATADEPTH = 32; - parameter TFIFODEPTH = 9; - parameter RFIFODEPTH = 9; - parameter TCDEPTH = 1; - parameter RCDEPTH = 2; - - `include "utility.v" - - input clkdma; - input clkcsr; - input rstcsr; - input clkt; - input clkr; - output rsttco; - wire rsttco; - output rstrco; - wire rstrco; - - output interrupt; - wire interrupt; - - output tps; - wire tps; - output rps; - wire rps; - - input csrreq; - input csrrw; - input [CSRWIDTH / 8 - 1:0] csrbe; - input [CSRWIDTH - 1:0] csrdatai; - input [7:0] csraddr; - output csrack; - wire csrack; - output [CSRWIDTH - 1:0] csrdatao; - wire [CSRWIDTH - 1:0] csrdatao; - - input dataack; - output datareq; - wire datareq; - output datareqc; - wire datareqc; - output datarw; - wire datarw; - output dataeob; - wire dataeob; - output dataeobc; - wire dataeobc; - input [DATAWIDTH - 1:0] datai; - output [DATADEPTH - 1:0] dataaddr; - wire [DATADEPTH - 1:0] dataaddr; - output [DATAWIDTH - 1:0] datao; - wire [DATAWIDTH - 1:0] datao; - - input [DATAWIDTH - 1:0] trdata; - output twe; - wire twe; - output [TFIFODEPTH - 1:0] twaddr; - wire [TFIFODEPTH - 1:0] twaddr; - output [TFIFODEPTH - 1:0] traddr; - wire [TFIFODEPTH - 1:0] traddr; - output [DATAWIDTH - 1:0] twdata; - wire [DATAWIDTH - 1:0] twdata; - - input [DATAWIDTH - 1:0] rrdata; - output rwe; - wire rwe; - output [RFIFODEPTH - 1:0] rwaddr; - wire [RFIFODEPTH - 1:0] rwaddr; - output [RFIFODEPTH - 1:0] rraddr; - wire [RFIFODEPTH - 1:0] rraddr; - output [DATAWIDTH - 1:0] rwdata; - wire [DATAWIDTH - 1:0] rwdata; - - input [15:0] frdata; - output fwe; - wire fwe; - output [ADDRDEPTH - 1:0] fwaddr; - wire [ADDRDEPTH - 1:0] fwaddr; - output [ADDRDEPTH - 1:0] fraddr; - wire [ADDRDEPTH - 1:0] fraddr; - output [15:0] fwdata; - wire [15:0] fwdata; - - input match; - input matchval; - output matchen; - wire matchen; - output [47:0] matchdata; - wire [47:0] matchdata; - - input sdi; - output sclk; - wire sclk; - output scs; - wire scs; - output sdo; - wire sdo; - - input rxer; - input rxdv; - input col; - input crs; - input [MIIWIDTH - 1:0] rxd; - output txen; - wire txen; - output txer; - wire txer; - output [MIIWIDTH - 1:0] txd; - wire [MIIWIDTH - 1:0] txd; - output mdc; - wire mdc; - input mdi; - output mdo; - wire mdo; - output mden; - wire mden; - - - wire rstsoft; - wire rsttc; - wire rstrc; - wire rstdmao; - wire rstcsro; - - wire [5:0] pbl; - wire ac; - wire dpd; - wire [4:0] dsl; - wire tpoll; - wire [DATADEPTH - 1:0] tdbad; - wire sf; - wire [2:0] tm; - wire fd; - wire ble; - wire dbo; - wire ra; - wire pm; - wire pr; - wire pb; - wire rif; - wire ho; - wire hp; - wire rpoll; - wire rpollack; - wire [DATADEPTH - 1:0] rdbad; - - wire insert_en; - - wire tdes; - wire tbuf; - wire tset; - wire tstat; - wire tu; - wire [1:0] ft; - wire rdes; - wire rstat; - wire ru; - wire rcomp; - wire rcompack; - wire tcomp; - wire tcompack; - - wire [1:0] dma_priority; - wire treq; - wire twrite; - wire [FIFODEPTH_MAX - 1:0] tcnt; - wire [DATADEPTH - 1:0] taddr; - wire [DATAWIDTH - 1:0] tdatai; - wire tack; - wire teob; - wire [DATAWIDTH - 1:0] tdatao; - wire rreq; - wire rwrite; - wire [FIFODEPTH_MAX - 1:0] rcnt; - wire [DATADEPTH - 1:0] raddr; - wire [DATAWIDTH - 1:0] rdatai; - wire rack; - wire reob; - wire [DATAWIDTH - 1:0] rdatao; - wire [DATADEPTH - 1:0] idataaddr; - - wire tfifonf; - wire tfifocnf; - wire tfifoval; - wire tfifowe; - wire tfifoeof; - wire [DATAWIDTH / 8 - 1:0] tfifobe; - wire [DATAWIDTH - 1:0] tfifodata; - wire [TFIFODEPTH - 1:0] tfifolev; - wire [TFIFODEPTH - 1:0] tradg; - - wire etiack; - wire etireq; - wire tcsne; - wire tcachere; - wire ic; - wire ici; - wire aci; - wire dpdi; - wire lo_o; - wire nc_o; - wire lc_o; - wire ec_o; - wire de_o; - wire ur_o; - wire [3:0] cc_o; - wire lo_i; - wire nc_i; - wire lc_i; - wire ec_i; - wire de_i; - wire ur_i; - wire [3:0] cc_i; - - wire tpollack; - wire tdbadc; - wire [DATADEPTH - 1:0] statado; - wire [DATADEPTH - 1:0] statadi; - - wire sofreq; - wire eofreq; - wire [DATAWIDTH / 8 - 1:0] be; - wire [TFIFODEPTH - 1:0] eofad; - wire [TFIFODEPTH - 1:0] twadg; - wire tireq; - wire tiack; - wire winp; - - wire coll; - wire carrier; - wire bkoff; - wire tpend; - wire tprog; - wire preamble; - - wire tcsreq; - wire tcsack; - - wire stopt; - wire stoptc; - wire stoptfifo; - wire stoptlsm; - - wire [RFIFODEPTH - 1:0] rradg; - wire [RFIFODEPTH - 1:0] rwadg; - wire rfifore; - wire [DATAWIDTH - 1:0] rfifodata; - wire rcachere; - wire rcachene; - wire rcachenf; - wire [DATAWIDTH - 1:0] irwdata; - wire irwe; - - wire riack; - wire ren; - wire rireq; - wire ff; - wire rf; - wire mf; - wire db; - wire re; - wire ce; - wire tl; - wire ftp; - wire ov; - wire cs; - wire [13:0] length; - wire rprog; - wire rcpoll; - - - wire ff_o; - wire rf_o; - wire mf_o; - wire tl_o; - wire re_o; - wire db_o; - wire ce_o; - wire ov_o; - wire cs_o; - wire [13:0] fl_o; - - wire rdbadc; - wire erireq; - wire eriack; - wire rbuf; - - wire foclack; - wire mfclack; - wire oco; - wire mfo; - wire [10:0] focg; - wire [15:0] mfcg; - wire focl; - wire mfcl; - - wire stopr; - wire stoprc; - wire stoprfifo; - wire stoprlsm; - - wire rcsack; - wire rcsreq; - - DMA #(DATAWIDTH, DATADEPTH) U_DMA( - .clk (clkdma), - .rst (rstdmao), - .dma_priority (dma_priority), - .ble (ble), - .dbo (dbo), - .rdes (rdes), - .rbuf (rbuf), - .rstat (rstat), - .tdes (tdes), - .tbuf (tbuf), - .tstat (tstat), - .dataack (dataack), - .datai (datai), - .datareq (datareq), - .datareqc (datareqc), - .datarw (datarw), - .dataeob (dataeob), - .dataeobc (dataeobc), - .datao (datao), - .dataaddr (dataaddr), - .idataaddr (idataaddr), - .req1 (treq), - .write1 (twrite), - .tcnt1 (tcnt), - .addr1 (taddr), - .datai1 (tdatao), - .ack1 (tack), - .eob1 (teob), - .datao1 (tdatai), - .req2 (rreq), - .write2 (rwrite), - .tcnt2 (rcnt), - .addr2 (raddr), - .datai2 (rdatao), - .ack2 (rack), - .eob2 (reob), - .datao2 (rdatai) - ); - - TLSM #(DATAWIDTH, DATADEPTH, TFIFODEPTH) U_TLSM( - .clk (clkdma), - .rst (rstdmao), - .fifonf (tfifonf), - .fifocnf (tfifocnf), - .fifoval (tfifoval), - .fifowe (tfifowe), - .fifoeof (tfifoeof), - .fifobe (tfifobe), - .fifodata (tfifodata), - .fifolev (tfifolev), - .ic (ici), - .ac (aci), - .dpd (dpdi), - .statado (statadi), - .csne (tcsne), - .lo (lo_i), - .nc (nc_i), - .lc (lc_i), - .ec (ec_i), - .de (de_i), - .ur (ur_i), - .cc (cc_i), - .cachere (tcachere), - .statadi (statado), - .dmaack (tack), - .dmaeob (teob), - .dmadatai (tdatai), - .dmaaddr (idataaddr), - .dmareq (treq), - .dmawr (twrite), - .dmacnt (tcnt), - .dmaaddro (taddr), - .dmadatao (tdatao), - .fwe (fwe), - .fdata (fwdata), - .faddr (fwaddr), - .dsl (dsl), - .pbl (pbl), - .poll (tpoll), - .dbadc (tdbadc), - .dbad (tdbad), - .pollack (tpollack), - .tcompack (tcompack), - .tcomp (tcomp), - .des (tdes), - .fbuf (tbuf), - .stat (tstat), - .setp (tset), - .tu (tu), - .ft (ft), - .stopi (stopt), - .stopo (stoptlsm) - ); - - TFIFO #(DATAWIDTH, DATADEPTH, TFIFODEPTH, TCDEPTH) U_TFIFO( - .clk (clkdma), - .rst (rstdmao), - .ramwe (twe), - .ramaddr (twaddr), - .ramdata (twdata), - .fifowe (tfifowe), - .fifoeof (tfifoeof), - .fifobe (tfifobe), - .fifodata (tfifodata), - .fifonf (tfifonf), - .fifocnf (tfifocnf), - .fifoval (tfifoval), - .flev (tfifolev), - .ici (ici), - .dpdi (dpdi), - .aci (aci), - .statadi (statadi), - .cachere (tcachere), - .deo (de_i), - .lco (lc_i), - .loo (lo_i), - .nco (nc_i), - .eco (ec_i), - .ico (ic), - .uro (ur_i), - .csne (tcsne), - .cco (cc_i), - .statado (statado), - .sofreq (sofreq), - .eofreq (eofreq), - .dpdo (dpd), - .aco (ac), - .beo (be), - .eofad (eofad), - .wadg (twadg), - .tireq (tireq), - .winp (winp), - .dei (de_o), - .lci (lc_o), - .loi (lo_o), - .nci (nc_o), - .eci (ec_o), - .uri (ur_o), - .cci (cc_o), - .radg (tradg), - .tiack (tiack), - .sf (sf), - .fdp (fd), - .tm (tm), - .pbl (pbl), - .etiack (etiack), - .etireq (etireq), - .stopi (stopt), - .stopo (stoptfifo) - ); - - TC #(TFIFODEPTH, DATAWIDTH) U_TC( - .clk (clkt), - .rst (rsttc), - .txen (txen), - .txer (txer), - .txd (txd), - .ramdata (trdata), - .ramaddr (traddr), - .wadg (twadg), - .radg (tradg), - .dpd (dpd), - .ac (ac), - .sofreq (sofreq), - .eofreq (eofreq), - .tiack (tiack), - .lastbe (be), - .eofadg (eofad), - .tireq (tireq), - .ur (ur_o), - .de (de_o), - .coll (coll), - .carrier (carrier), - .bkoff (bkoff), - .tpend (tpend), - .tprog (tprog), - .preamble (preamble), - .stopi (stopt), - .stopo (stoptc), - .tcsack (tcsack), - .tcsreq (tcsreq) - ); - - BD U_BD( - .clk (clkt), - .rst (rsttc), - .col (col), - .crs (crs), - .fdp (fd), - .tprog (tprog), - .preamble (preamble), - .tpend (tpend), - .winp (winp), - .tiack (tiack), - .coll (coll), - .carrier (carrier), - .bkoff (bkoff), - .lc (lc_o), - .lo (lo_o), - .nc (nc_o), - .ec (ec_o), - .cc (cc_o) - ); - - - RC #(RFIFODEPTH, DATAWIDTH) U_RC( - .clk (clkr), - .rst (rstrc), - .col (col), - .rxdv (rxdv), - .rxer (rxer), - .rxd (rxd), - .ramwe (irwe), - .ramaddr (rwaddr), - .ramdata (irwdata), - .fdata (frdata), - .faddr (fraddr), - .cachenf (rcachenf), - .radg (rradg), - .wadg (rwadg), - .rprog (rprog), - .rcpoll (rcpoll), - .riack (riack), - .ren (ren), - .ra (ra), - .pm (pm), - .pr (pr), - .pb (pb), - .rif (rif), - .ho (ho), - .hp (hp), - .rireq (rireq), - .ff (ff), - .rf (rf), - .mf (mf), - .db (db), - .re (re), - .ce (ce), - .tl (tl), - .ftp (ftp), - .ov (ov), - .cs (cs), - .length (length), - .match (match), - .matchval (matchval), - .matchen (matchen), - .matchdata (matchdata), - .focl (focl), - .foclack (foclack), - .oco (oco), - .focg (focg), - .mfcl (mfcl), - .mfclack (mfclack), - .mfo (mfo), - .mfcg (mfcg), - .stopi (stopr), - .stopo (stoprc), - .rcsack (rcsack), - .rcsreq (rcsreq), - .insert_en_i (insert_en) - ); - - RFIFO #(DATAWIDTH, DATADEPTH, RFIFODEPTH, RCDEPTH) U_RFIFO( - .clk (clkdma), - .rst (rstdmao), - .ramdata (rrdata), - .ramaddr (rraddr), - .fifore (rfifore), - .ffo (ff_o), - .rfo (rf_o), - .mfo (mf_o), - .tlo (tl_o), - .reo (re_o), - .dbo (db_o), - .ceo (ce_o), - .ovo (ov_o), - .cso (cs_o), - .flo (fl_o), - .fifodata (rfifodata), - .cachere (rcachere), - .cachene (rcachene), - .cachenf (rcachenf), - .radg (rradg), - .rireq (rireq), - .ffi (ff), - .rfi (rf), - .mfi (mf), - .tli (tl), - .rei (re), - .dbi (db), - .cei (ce), - .ovi (ov), - .csi (cs), - .fli (length), - .wadg (rwadg), - .riack (riack) - ); - - RLSM #(DATAWIDTH, DATADEPTH, RFIFODEPTH) U_RLSM( - .clk (clkdma), - .rst (rstdmao), - .fifodata (rfifodata), - .fifore (rfifore), - .cachere (rcachere), - .dmaack (rack), - .dmaeob (reob), - .dmadatai (rdatai), - .dmaaddr (idataaddr), - .dmareq (rreq), - .dmawr (rwrite), - .dmacnt (rcnt), - .dmaaddro (raddr), - .dmadatao (rdatao), - .rprog (rprog), - .rcpoll (rcpoll), - .fifocne (rcachene), - .ff (ff_o), - .rf (rf_o), - .mf (mf_o), - .db (db_o), - .re (re_o), - .ce (ce_o), - .tl (tl_o), - .ftp (ftp), - .ov (ov_o), - .cs (cs_o), - .length (fl_o), - .pbl (pbl), - .dsl (dsl), - .rpoll (rpoll), - .rdbadc (rdbadc), - .rdbad (rdbad), - .rpollack (rpollack), - .bufack (eriack), - .rcompack (rcompack), - .des (rdes), - .fbuf (rbuf), - .stat (rstat), - .ru (ru), - .rcomp (rcomp), - .bufcomp (erireq), - .stopi (stopr), - .stopo (stoprlsm), - .insert_en_i (insert_en) - ); - - CSR #(CSRWIDTH, DATAWIDTH, DATADEPTH, RFIFODEPTH, RCDEPTH) U_CSR( - .clk (clkcsr), - .rst (rstcsro), - .interrupt (interrupt), - .rstsofto (rstsoft), - .csrreq (csrreq), - .csrrw (csrrw), - .csrbe (csrbe), - .csraddr (csraddr), - .csrdatai (csrdatai), - .csrack (csrack), - .csrdatao (csrdatao), - .tprog (tprog), - .tireq (tcomp), - .unf (ur_i), - .tiack (tcompack), - .tcsreq (tcsreq), - .tcsack (tcsack), - .fd (fd), - .ic (ic), - .etireq (etireq), - .etiack (etiack), - .tm (tm), - .sf (sf), - .tset (tset), - .tdes (tdes), - .tbuf (tbuf), - .tstat (tstat), - .tu (tu), - .tpollack (tpollack), - .ft (ft), - .tpoll (tpoll), - .tdbadc (tdbadc), - .tdbad (tdbad), - .rireq (rcomp), - .rcsreq (rcsreq), - .rprog (rprog), - .riack (rcompack), - .rcsack (rcsack), - .ren (ren), - .ra (ra), - .pm (pm), - .pr (pr), - .pb (pb), - .rif (rif), - .ho (ho), - .hp (hp), - .foclack (foclack), - .mfclack (mfclack), - .oco (oco), - .mfo (mfo), - .focg (focg), - .mfcg (mfcg), - .focl (focl), - .mfcl (mfcl), - .erireq (erireq), - .ru (ru), - .rpollack (rpollack), - .rdes (rdes), - .rbuf (rbuf), - .rstat (rstat), - .eriack (eriack), - .rpoll (rpoll), - .rdbadc (rdbadc), - .rdbad (rdbad), - .ble (ble), - .dbo (dbo), - .dma_priority (dma_priority), - .pbl (pbl), - .dsl (dsl), - .stoptc (stoptc), - .stoptlsm (stoptlsm), - .stoptfifo (stoptfifo), - .stopt (stopt), - .tps (tps), - .stoprc (stoprc), - .stoprlsm (stoprlsm), - .stopr (stopr), - .rps (rps), - .sdi (sdi), - .sclk (sclk), - .scs (scs), - .sdo (sdo), - .mdi (mdi), - .mdc (mdc), - .mdo (mdo), - .mden (mden), - .insert_en_o (insert_en) - ); - - RSTC U_RSTC ( - .clkdma(clkdma), - .clkcsr(clkcsr), - .clkt(clkt), - .clkr(clkr), - .rstcsr(rstcsr), - .rstsoft(rstsoft), - .rsttc(rsttc), - .rstrc(rstrc), - .rstdmao(rstdmao), - .rstcsro(rstcsro) - ); - - assign rwe = irwe ; - - assign rwdata = irwdata ; - - assign rsttco = rsttc ; - - assign rstrco = rstrc ; - -endmodule diff --git a/resources/soc/rtl/MAC/mac2axi.v b/resources/soc/rtl/MAC/mac2axi.v deleted file mode 100644 index 9754451..0000000 --- a/resources/soc/rtl/MAC/mac2axi.v +++ /dev/null @@ -1,355 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -module MAC2AXI ( - mhclk, - mhresetn, - shclk, - shresetn, - - mawid_o , - mawaddr_o , - mawlen_o , - mawsize_o , - mawburst_o , - mawlock_o , - mawcache_o , - mawprot_o , - mawvalid_o , - mawready_i , - mwid_o , - mwdata_o , - mwstrb_o , - mwlast_o , - mwvalid_o , - mwready_i , - mbid_i , - mbresp_i , - mbvalid_i , - mbready_o , - marid_o , - maraddr_o , - marlen_o , - marsize_o , - marburst_o , - marlock_o , - marcache_o , - marprot_o , - marvalid_o , - marready_i , - mrid_i , - mrdata_i , - mrresp_i , - mrlast_i , - mrvalid_i , - mrready_o , - - sawid_i , - sawaddr_i , - sawlen_i , - sawsize_i , - sawburst_i , - sawlock_i , - sawcache_i , - sawprot_i , - sawvalid_i , - sawready_o , - swid_i , - swdata_i , - swstrb_i , - swlast_i , - swvalid_i , - swready_o , - sbid_o , - sbresp_o , - sbvalid_o , - sbready_i , - sarid_i , - saraddr_i , - sarlen_i , - sarsize_i , - sarburst_i , - sarlock_i , - sarcache_i , - sarprot_i , - sarvalid_i , - sarready_o , - srid_o , - srdata_o , - srresp_o , - srlast_o , - srvalid_o , - srready_i , - - datareq, - datareqc, - datarw, - dataeob, - dataeobc, - dataaddr, - datao, - dataack, - datai, - rstcsr, - csrack, - csrdatao, - csrreq, - csrrw, - csrbe, - csrdatai, - csraddr - ); - - parameter MAXIDATAWIDTH = 32; - parameter MAXIADDRESSWIDTH = 32; - - parameter SAXIDATAWIDTH = 32; - parameter SAXIADDRESSWIDTH = 32; - - parameter MACDATAWIDTH = 32; - parameter MACADDRESSWIDTH = 32; - - parameter CSRDATAWIDTH = 32; - parameter CSRADDRESSWIDTH = 8; - - - input mhclk; - input mhresetn; - output [ 3:0] mawid_o ; - output [ 31:0] mawaddr_o ; - output [ 3:0] mawlen_o ; - output [ 2:0] mawsize_o ; - output [ 1:0] mawburst_o ; - output [ 1:0] mawlock_o ; - output [ 3:0] mawcache_o ; - output [ 2:0] mawprot_o ; - output mawvalid_o ; - input mawready_i ; - output [ 3:0] mwid_o ; - output [ 31:0] mwdata_o ; - output [ 3:0] mwstrb_o ; - output mwlast_o ; - output mwvalid_o ; - input mwready_i ; - input [ 3:0] mbid_i ; - input [ 1:0] mbresp_i ; - input mbvalid_i ; - output mbready_o ; - output [ 3:0] marid_o ; - output [ 31:0] maraddr_o ; - output [ 3:0] marlen_o ; - output [ 2:0] marsize_o ; - output [ 1:0] marburst_o ; - output [ 1:0] marlock_o ; - output [ 3:0] marcache_o ; - output [ 2:0] marprot_o ; - output marvalid_o ; - input marready_i ; - input [ 3:0] mrid_i ; - input [ 31:0] mrdata_i ; - input [ 1:0] mrresp_i ; - input mrlast_i ; - input mrvalid_i ; - output mrready_o ; - - input shclk; - input shresetn; - - input [ 3:0] sawid_i ; - input [ 31:0] sawaddr_i ; - input [ 3:0] sawlen_i ; - input [ 2:0] sawsize_i ; - input [ 1:0] sawburst_i ; - input [ 1:0] sawlock_i ; - input [ 3:0] sawcache_i ; - input [ 2:0] sawprot_i ; - input sawvalid_i ; - output sawready_o ; - input [ 3:0] swid_i ; - input [ 31:0] swdata_i ; - input [ 3:0] swstrb_i ; - input swlast_i ; - input swvalid_i ; - output swready_o ; - output [ 3:0] sbid_o ; - output [ 1:0] sbresp_o ; - output sbvalid_o ; - input sbready_i ; - input [ 3:0] sarid_i ; - input [ 31:0] saraddr_i ; - input [ 3:0] sarlen_i ; - input [ 2:0] sarsize_i ; - input [ 1:0] sarburst_i ; - input [ 1:0] sarlock_i ; - input [ 3:0] sarcache_i ; - input [ 2:0] sarprot_i ; - input sarvalid_i ; - output sarready_o ; - output [ 3:0] srid_o ; - output [ 31:0] srdata_o ; - output [ 1:0] srresp_o ; - output srlast_o ; - output srvalid_o ; - input srready_i ; - input datareq; - input datareqc; - input datarw; - input dataeob; - input dataeobc; - input [MACADDRESSWIDTH - 1:0] dataaddr; - input [MACDATAWIDTH - 1:0] datao; - output dataack; - wire dataack; - output [MACDATAWIDTH - 1:0] datai; - wire [MACDATAWIDTH - 1:0] datai; - - - output rstcsr; - wire rstcsr; - input csrack; - input [CSRDATAWIDTH - 1:0] csrdatao; - output csrreq; - wire csrreq; - output csrrw; - wire csrrw; - output [CSRDATAWIDTH / 8 - 1:0] csrbe; - wire [CSRDATAWIDTH / 8 - 1:0] csrbe; - output [CSRDATAWIDTH - 1:0] csrdatai; - wire [CSRDATAWIDTH - 1:0] csrdatai; - output [CSRADDRESSWIDTH - 1:0] csraddr; - wire [CSRADDRESSWIDTH - 1:0] csraddr; - - - MACDATA2AXI - #(MAXIDATAWIDTH, MAXIADDRESSWIDTH, MACDATAWIDTH, MACADDRESSWIDTH) - U_MACDATA2AXI ( - .maclk (mhclk ), - .maresetn (mhresetn ), - .awid_o (mawid_o ), - .awaddr_o (mawaddr_o ), - .awlen_o (mawlen_o ), - .awsize_o (mawsize_o ), - .awburst_o (mawburst_o ), - .awlock_o (mawlock_o ), - .awcache_o (mawcache_o ), - .awprot_o (mawprot_o ), - .awvalid_o (mawvalid_o ), - .awready_i (mawready_i ), - .wid_o (mwid_o ), - .wdata_o (mwdata_o ), - .wstrb_o (mwstrb_o ), - .wlast_o (mwlast_o ), - .wvalid_o (mwvalid_o ), - .wready_i (mwready_i ), - .bid_i (mbid_i ), - .bresp_i (mbresp_i ), - .bvalid_i (mbvalid_i ), - .bready_o (mbready_o ), - .arid_o (marid_o ), - .araddr_o (maraddr_o ), - .arlen_o (marlen_o ), - .arsize_o (marsize_o ), - .arburst_o (marburst_o ), - .arlock_o (marlock_o ), - .arcache_o (marcache_o ), - .arprot_o (marprot_o ), - .arvalid_o (marvalid_o ), - .arready_i (marready_i ), - .rid_i (mrid_i ), - .rdata_i (mrdata_i ), - .rresp_i (mrresp_i ), - .rlast_i (mrlast_i ), - .rvalid_i (mrvalid_i ), - .rready_o (mrready_o ), - .datareq (datareq ), - .datareqc (datareqc ), - .datarw (datarw ), - .dataeob (dataeob ), - .dataeobc (dataeobc ), - .dataaddr (dataaddr ), - .datao (datao ), - .dataack (dataack ), - .datai (datai ) - ); - MACCSR2AXI - #(SAXIDATAWIDTH, SAXIADDRESSWIDTH, CSRDATAWIDTH, CSRADDRESSWIDTH) - U_MACCSR2AXI( - .saclk (shclk ), - .saresetn (shresetn ), - .awid_i (sawid_i ), - .awaddr_i (sawaddr_i ), - .awlen_i (sawlen_i ), - .awsize_i (sawsize_i ), - .awburst_i (sawburst_i), - .awlock_i (sawlock_i ), - .awcache_i (sawcache_i), - .awprot_i (sawprot_i ), - .awvalid_i (sawvalid_i), - .awready_o (sawready_o), - .wid_i (swid_i ), - .wdata_i (swdata_i ), - .wstrb_i (swstrb_i ), - .wlast_i (swlast_i ), - .wvalid_i (swvalid_i ), - .wready_o (swready_o ), - .bid_o (sbid_o ), - .bresp_o (sbresp_o ), - .bvalid_o (sbvalid_o ), - .bready_i (sbready_i ), - .arid_i (sarid_i ), - .araddr_i (saraddr_i ), - .arlen_i (sarlen_i ), - .arsize_i (sarsize_i ), - .arburst_i (sarburst_i), - .arlock_i (sarlock_i ), - .arcache_i (sarcache_i), - .arprot_i (sarprot_i ), - .arvalid_i (sarvalid_i), - .arready_o (sarready_o), - .rid_o (srid_o ), - .rdata_o (srdata_o ), - .rresp_o (srresp_o ), - .rlast_o (srlast_o ), - .rvalid_o (srvalid_o ), - .rready_i (srready_i ), - .rstcsr (rstcsr ) , - .csrack (csrack ) , - .csrdatao (csrdatao ) , - .csrreq (csrreq ) , - .csrrw (csrrw ) , - .csrbe (csrbe ) , - .csrdatai (csrdatai ) , - .csraddr (csraddr ) - ); - -endmodule diff --git a/resources/soc/rtl/MAC/mac_axi.v b/resources/soc/rtl/MAC/mac_axi.v deleted file mode 100644 index 3023ec8..0000000 --- a/resources/soc/rtl/MAC/mac_axi.v +++ /dev/null @@ -1,522 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -module MAC_AXI ( - clkt, - clkr, - rsttco, - rstrco, - interrupt, - tps, - rps, - mhclk, - mhresetn, - mawid_o , - mawaddr_o , - mawlen_o , - mawsize_o , - mawburst_o , - mawlock_o , - mawcache_o , - mawprot_o , - mawvalid_o , - mawready_i , - mwid_o , - mwdata_o , - mwstrb_o , - mwlast_o , - mwvalid_o , - mwready_i , - mbid_i , - mbresp_i , - mbvalid_i , - mbready_o , - marid_o , - maraddr_o , - marlen_o , - marsize_o , - marburst_o , - marlock_o , - marcache_o , - marprot_o , - marvalid_o , - marready_i , - mrid_i , - mrdata_i , - mrresp_i , - mrlast_i , - mrvalid_i , - mrready_o , - shclk, - shresetn, - sawid_i , - sawaddr_i , - sawlen_i , - sawsize_i , - sawburst_i , - sawlock_i , - sawcache_i , - sawprot_i , - sawvalid_i , - sawready_o , - swid_i , - swdata_i , - swstrb_i , - swlast_i , - swvalid_i , - swready_o , - sbid_o , - sbresp_o , - sbvalid_o , - sbready_i , - sarid_i , - saraddr_i , - sarlen_i , - sarsize_i , - sarburst_i , - sarlock_i , - sarcache_i , - sarprot_i , - sarvalid_i , - sarready_o , - srid_o , - srdata_o , - srresp_o , - srlast_o , - srvalid_o , - srready_i , - trdata, - twe, - twaddr, - traddr, - twdata, - rrdata, - rwe, - rwaddr, - rraddr, - rwdata, - frdata, - fwe, - fwaddr, - fraddr, - fwdata, - match, - matchval, - matchen, - matchdata, - sdi, - sclk, - scs, - sdo, - rxer, - rxdv, - col, - crs, - rxd, - txen, - txer, - txd, - mdc, - mdi, - mdo, - mden - ); - - parameter MAXIADDRESSWIDTH = 32; - parameter SAXIADDRESSWIDTH = 32; - parameter TFIFODEPTH = 9; - parameter RFIFODEPTH = 9; - parameter TCDEPTH = 1; - parameter RCDEPTH = 2; - parameter MAXIDATAWIDTH = 32; - parameter SAXIDATAWIDTH = 32; - `include "utility.v" - - - input clkt; - input clkr; - output rsttco; - wire rsttco; - output rstrco; - wire rstrco; - - - output interrupt; - wire interrupt; - - output tps; - wire tps; - output rps; - wire rps; - - input mhclk; - input mhresetn; - output [ 3:0] mawid_o ; - output [ 31:0] mawaddr_o ; - output [ 3:0] mawlen_o ; - output [ 2:0] mawsize_o ; - output [ 1:0] mawburst_o ; - output [ 1:0] mawlock_o ; - output [ 3:0] mawcache_o ; - output [ 2:0] mawprot_o ; - output mawvalid_o ; - input mawready_i ; - output [ 3:0] mwid_o ; - output [ 31:0] mwdata_o ; - output [ 3:0] mwstrb_o ; - output mwlast_o ; - output mwvalid_o ; - input mwready_i ; - input [ 3:0] mbid_i ; - input [ 1:0] mbresp_i ; - input mbvalid_i ; - output mbready_o ; - output [ 3:0] marid_o ; - output [ 31:0] maraddr_o ; - output [ 3:0] marlen_o ; - output [ 2:0] marsize_o ; - output [ 1:0] marburst_o ; - output [ 1:0] marlock_o ; - output [ 3:0] marcache_o ; - output [ 2:0] marprot_o ; - output marvalid_o ; - input marready_i ; - input [ 3:0] mrid_i ; - input [ 31:0] mrdata_i ; - input [ 1:0] mrresp_i ; - input mrlast_i ; - input mrvalid_i ; - output mrready_o ; - input shclk; - input shresetn; - - input [ 3:0] sawid_i ; - input [ 31:0] sawaddr_i ; - input [ 3:0] sawlen_i ; - input [ 2:0] sawsize_i ; - input [ 1:0] sawburst_i ; - input [ 1:0] sawlock_i ; - input [ 3:0] sawcache_i ; - input [ 2:0] sawprot_i ; - input sawvalid_i ; - output sawready_o ; - input [ 3:0] swid_i ; - input [ 31:0] swdata_i ; - input [ 3:0] swstrb_i ; - input swlast_i ; - input swvalid_i ; - output swready_o ; - output [ 3:0] sbid_o ; - output [ 1:0] sbresp_o ; - output sbvalid_o ; - input sbready_i ; - input [ 3:0] sarid_i ; - input [ 31:0] saraddr_i ; - input [ 3:0] sarlen_i ; - input [ 2:0] sarsize_i ; - input [ 1:0] sarburst_i ; - input [ 1:0] sarlock_i ; - input [ 3:0] sarcache_i ; - input [ 2:0] sarprot_i ; - input sarvalid_i ; - output sarready_o ; - output [ 3:0] srid_o ; - output [ 31:0] srdata_o ; - output [ 1:0] srresp_o ; - output srlast_o ; - output srvalid_o ; - input srready_i ; - input [MAXIDATAWIDTH - 1:0] trdata; - output twe; - wire twe; - output [TFIFODEPTH - 1:0] twaddr; - wire [TFIFODEPTH - 1:0] twaddr; - output [TFIFODEPTH - 1:0] traddr; - wire [TFIFODEPTH - 1:0] traddr; - output [MAXIDATAWIDTH - 1:0] twdata; - wire [MAXIDATAWIDTH - 1:0] twdata; - - - input [MAXIDATAWIDTH - 1:0] rrdata; - output rwe; - wire rwe; - output [RFIFODEPTH - 1:0] rwaddr; - wire [RFIFODEPTH - 1:0] rwaddr; - output [RFIFODEPTH - 1:0] rraddr; - wire [RFIFODEPTH - 1:0] rraddr; - output [MAXIDATAWIDTH - 1:0] rwdata; - wire [MAXIDATAWIDTH - 1:0] rwdata; - - input [15:0] frdata; - output fwe; - wire fwe; - output [ADDRDEPTH - 1:0] fwaddr; - wire [ADDRDEPTH - 1:0] fwaddr; - output [ADDRDEPTH - 1:0] fraddr; - wire [ADDRDEPTH - 1:0] fraddr; - output [15:0] fwdata; - wire [15:0] fwdata; - - input match; - input matchval; - output matchen; - wire matchen; - output [47:0] matchdata; - wire [47:0] matchdata; - - input sdi; - output sclk; - wire sclk; - output scs; - wire scs; - output sdo; - wire sdo; - - input rxer; - input rxdv; - input col; - input crs; - input [MIIWIDTH - 1:0] rxd; - output txen; - wire txen; - output txer; - wire txer; - output [MIIWIDTH - 1:0] txd; - wire [MIIWIDTH - 1:0] txd; - output mdc; - wire mdc; - input mdi; - output mdo; - wire mdo; - output mden; - wire mden; - - - wire datareq; - wire datareqc; - wire datarw; - wire dataeob; - wire dataeobc; - wire [(MAXIADDRESSWIDTH - 1):0] dataaddr; - wire [(MAXIDATAWIDTH - 1):0] datao; - wire dataack; - wire [(MAXIDATAWIDTH - 1):0] datai; - - wire rstcsr; - wire csrack; - wire [SAXIDATAWIDTH - 1:0] csrdatao; - wire csrreq; - wire csrrw; - wire [SAXIDATAWIDTH / 8 - 1:0] csrbe; - wire [SAXIDATAWIDTH - 1:0] csrdatai; - wire [7:0] csraddr; - - MAC - #(SAXIDATAWIDTH, - MAXIDATAWIDTH, - MAXIADDRESSWIDTH, - TFIFODEPTH, - RFIFODEPTH, - TCDEPTH, - RCDEPTH) - U_MAC ( - .clkdma (mhclk), - .clkcsr (shclk), - .clkt (clkt), - .clkr (clkr), - .rstcsr (rstcsr), - .rsttco (rsttco), - .rstrco (rstrco), - .interrupt (interrupt), - .rps (rps), - .tps (tps), - .csrreq (csrreq), - .csrrw (csrrw), - .csrbe (csrbe), - .csrdatai (csrdatai), - .csrack (csrack), - .csraddr (csraddr), - .csrdatao (csrdatao), - .dataack (dataack), - .datareq (datareq), - .datareqc (datareqc), - .datarw (datarw), - .dataeob (dataeob), - .dataeobc (dataeobc), - .datai (datai), - .dataaddr (dataaddr), - .datao (datao), - .trdata (trdata), - .twe (twe), - .twaddr (twaddr), - .traddr (traddr), - .twdata (twdata), - .rrdata (rrdata), - .rwe (rwe), - .rwaddr (rwaddr), - .rraddr (rraddr), - .rwdata (rwdata), - .frdata (frdata), - .fwe (fwe), - .fraddr (fraddr), - .fwaddr (fwaddr), - .fwdata (fwdata), - .match (match), - .matchval (matchval), - .matchen (matchen), - .matchdata (matchdata), - .sdi (sdi), - .sclk (sclk), - .scs (scs), - .sdo (sdo), - .rxer (rxer), - .rxdv (rxdv), - .col (col), - .crs (crs), - .rxd (rxd), - .txen (txen), - .txer (txer), - .txd (txd), - .mdi (mdi), - .mdo (mdo), - .mden (mden), - .mdc (mdc) - ); - - MAC2AXI - #(MAXIDATAWIDTH, - MAXIADDRESSWIDTH, - SAXIDATAWIDTH, - SAXIADDRESSWIDTH, - MAXIDATAWIDTH, - MAXIADDRESSWIDTH, - SAXIDATAWIDTH, - 8) - U_MAC2AXI ( - - .mhclk (mhclk ), - .mhresetn (mhresetn ), - .shclk (shclk ), - .shresetn (shresetn ), - .mawid_o (mawid_o ), - .mawaddr_o (mawaddr_o ), - .mawlen_o (mawlen_o ), - .mawsize_o (mawsize_o ), - .mawburst_o (mawburst_o ), - .mawlock_o (mawlock_o ), - .mawcache_o (mawcache_o ), - .mawprot_o (mawprot_o ), - .mawvalid_o (mawvalid_o ), - .mawready_i (mawready_i ), - .mwid_o (mwid_o ), - .mwdata_o (mwdata_o ), - .mwstrb_o (mwstrb_o ), - .mwlast_o (mwlast_o ), - .mwvalid_o (mwvalid_o ), - .mwready_i (mwready_i ), - .mbid_i (mbid_i ), - .mbresp_i (mbresp_i ), - .mbvalid_i (mbvalid_i ), - .mbready_o (mbready_o ), - .marid_o (marid_o ), - .maraddr_o (maraddr_o ), - .marlen_o (marlen_o ), - .marsize_o (marsize_o ), - .marburst_o (marburst_o ), - .marlock_o (marlock_o ), - .marcache_o (marcache_o ), - .marprot_o (marprot_o ), - .marvalid_o (marvalid_o ), - .marready_i (marready_i ), - .mrid_i (mrid_i ), - .mrdata_i (mrdata_i ), - .mrresp_i (mrresp_i ), - .mrlast_i (mrlast_i ), - .mrvalid_i (mrvalid_i ), - .mrready_o (mrready_o ), - .sawid_i (sawid_i ), - .sawaddr_i (sawaddr_i ), - .sawlen_i (sawlen_i ), - .sawsize_i (sawsize_i ), - .sawburst_i (sawburst_i ), - .sawlock_i (sawlock_i ), - .sawcache_i (sawcache_i ), - .sawprot_i (sawprot_i ), - .sawvalid_i (sawvalid_i ), - .sawready_o (sawready_o ), - .swid_i (swid_i ), - .swdata_i (swdata_i ), - .swstrb_i (swstrb_i ), - .swlast_i (swlast_i ), - .swvalid_i (swvalid_i ), - .swready_o (swready_o ), - .sbid_o (sbid_o ), - .sbresp_o (sbresp_o ), - .sbvalid_o (sbvalid_o ), - .sbready_i (sbready_i ), - .sarid_i (sarid_i ), - .saraddr_i (saraddr_i ), - .sarlen_i (sarlen_i ), - .sarsize_i (sarsize_i ), - .sarburst_i (sarburst_i ), - .sarlock_i (sarlock_i ), - .sarcache_i (sarcache_i ), - .sarprot_i (sarprot_i ), - .sarvalid_i (sarvalid_i ), - .sarready_o (sarready_o ), - .srid_o (srid_o ), - .srdata_o (srdata_o ), - .srresp_o (srresp_o ), - .srlast_o (srlast_o ), - .srvalid_o (srvalid_o ), - .srready_i (srready_i ), - .datareq (datareq ), - .datareqc (datareqc ), - .datarw (datarw ), - .dataeob (dataeob ), - .dataeobc (dataeobc ), - .dataaddr (dataaddr ), - .datao (datao ), - .dataack (dataack ), - .datai (datai ), - .rstcsr (rstcsr ), - .csrack (csrack ), - .csrdatao (csrdatao ), - .csrreq (csrreq ), - .csrrw (csrrw ), - .csrbe (csrbe ), - .csrdatai (csrdatai ), - .csraddr (csraddr ) - ); - -endmodule diff --git a/resources/soc/rtl/MAC/mac_top.v b/resources/soc/rtl/MAC/mac_top.v deleted file mode 100644 index f20c1df..0000000 --- a/resources/soc/rtl/MAC/mac_top.v +++ /dev/null @@ -1,445 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -module mac_top -( - hclk, - hrst_, - - mawid_o , - mawaddr_o , - mawlen_o , - mawsize_o , - mawburst_o , - mawlock_o , - mawcache_o , - mawprot_o , - mawvalid_o , - mawready_i , - mwid_o , - mwdata_o , - mwstrb_o , - mwlast_o , - mwvalid_o , - mwready_i , - mbid_i , - mbresp_i , - mbvalid_i , - mbready_o , - marid_o , - maraddr_o , - marlen_o , - marsize_o , - marburst_o , - marlock_o , - marcache_o , - marprot_o , - marvalid_o , - marready_i , - mrid_i , - mrdata_i , - mrresp_i , - mrlast_i , - mrvalid_i , - mrready_o , - sawid_i , - sawaddr_i , - sawlen_i , - sawsize_i , - sawburst_i , - sawlock_i , - sawcache_i , - sawprot_i , - sawvalid_i , - sawready_o , - swid_i , - swdata_i , - swstrb_i , - swlast_i , - swvalid_i , - swready_o , - sbid_o , - sbresp_o , - sbvalid_o , - sbready_i , - sarid_i , - saraddr_i , - sarlen_i , - sarsize_i , - sarburst_i , - sarlock_i , - sarcache_i , - sarprot_i , - sarvalid_i , - sarready_o , - srid_o , - srdata_o , - srresp_o , - srlast_o , - srvalid_o , - srready_i , - - interrupt , - - mtxclk , - mtxen , - mtxd , - mtxerr , - mrxclk , - mrxdv , - mrxd , - mrxerr , - mcoll , - mcrs , - mdc , - md_i , - md_o , - md_oe , - - trdata , - twe , - twaddr , - traddr , - twdata , - - rrdata , - rwe , - rwaddr , - rraddr , - rwdata - -); - - -input hclk; -input hrst_; - output [ 3:0] mawid_o ; - output [ 31:0] mawaddr_o ; - output [ 3:0] mawlen_o ; - output [ 2:0] mawsize_o ; - output [ 1:0] mawburst_o ; - output [ 1:0] mawlock_o ; - output [ 3:0] mawcache_o ; - output [ 2:0] mawprot_o ; - output mawvalid_o ; - input mawready_i ; - output [ 3:0] mwid_o ; - output [ 31:0] mwdata_o ; - output [ 3:0] mwstrb_o ; - output mwlast_o ; - output mwvalid_o ; - input mwready_i ; - input [ 3:0] mbid_i ; - input [ 1:0] mbresp_i ; - input mbvalid_i ; - output mbready_o ; - output [ 3:0] marid_o ; - output [ 31:0] maraddr_o ; - output [ 3:0] marlen_o ; - output [ 2:0] marsize_o ; - output [ 1:0] marburst_o ; - output [ 1:0] marlock_o ; - output [ 3:0] marcache_o ; - output [ 2:0] marprot_o ; - output marvalid_o ; - input marready_i ; - input [ 3:0] mrid_i ; - input [ 31:0] mrdata_i ; - input [ 1:0] mrresp_i ; - input mrlast_i ; - input mrvalid_i ; - output mrready_o ; - - input [ 3:0] sawid_i ; - input [ 31:0] sawaddr_i ; - input [ 3:0] sawlen_i ; - input [ 2:0] sawsize_i ; - input [ 1:0] sawburst_i ; - input [ 1:0] sawlock_i ; - input [ 3:0] sawcache_i ; - input [ 2:0] sawprot_i ; - input sawvalid_i ; - output sawready_o ; - input [ 3:0] swid_i ; - input [ 31:0] swdata_i ; - input [ 3:0] swstrb_i ; - input swlast_i ; - input swvalid_i ; - output swready_o ; - output [ 3:0] sbid_o ; - output [ 1:0] sbresp_o ; - output sbvalid_o ; - input sbready_i ; - input [ 3:0] sarid_i ; - input [ 31:0] saraddr_i ; - input [ 3:0] sarlen_i ; - input [ 2:0] sarsize_i ; - input [ 1:0] sarburst_i ; - input [ 1:0] sarlock_i ; - input [ 3:0] sarcache_i ; - input [ 2:0] sarprot_i ; - input sarvalid_i ; - output sarready_o ; - output [ 3:0] srid_o ; - output [ 31:0] srdata_o ; - output [ 1:0] srresp_o ; - output srlast_o ; - output srvalid_o ; - input srready_i ; -input mtxclk; -output [3:0] mtxd; -output mtxen; -output mtxerr; - -input mrxclk; -input [3:0] mrxd; -input mrxdv; -input mrxerr; - -input mcoll; -input mcrs; - -input md_i; -output mdc; -output md_o; -output md_oe; - -output interrupt; - - -`define MAHBDATAWIDTH 32 -`define TFIFODEPTH 9 -`define RFIFODEPTH 9 -`define ADDRDEPTH 6 - -input [`MAHBDATAWIDTH - 1:0] trdata; -output twe; -wire twe; -output [`TFIFODEPTH - 1:0] twaddr; -wire [`TFIFODEPTH - 1:0] twaddr; -output [`TFIFODEPTH - 1:0] traddr; -wire [`TFIFODEPTH - 1:0] traddr; -output [`MAHBDATAWIDTH - 1:0] twdata; -wire [`MAHBDATAWIDTH - 1:0] twdata; - -input [`MAHBDATAWIDTH - 1:0] rrdata; -output rwe; -wire rwe; -output [`RFIFODEPTH - 1:0] rwaddr; -wire [`RFIFODEPTH - 1:0] rwaddr; -output [`RFIFODEPTH - 1:0] rraddr; -wire [`RFIFODEPTH - 1:0] rraddr; -output [`MAHBDATAWIDTH - 1:0] rwdata; -wire [`MAHBDATAWIDTH - 1:0] rwdata; - -wire tps,rps,rsttco,rstrco,sclk,scs,sdo; - -wire [15:0] frdata; -wire fwe; -wire [`ADDRDEPTH - 1:0] fwaddr; -wire [`ADDRDEPTH - 1:0] fraddr; -wire [15:0] fwdata; - -wire match; -wire matchval; -wire matchen; -wire [47:0] matchdata; - -assign match = 1'b0; -assign matchval = 1'b0; - -RegFile2_64x16 u_addr_ram -( -.CLKA(mrxclk), .CENA(1'b0), .AA(fraddr), .QA(frdata), -.CLKB(hclk), .CENB(!fwe), .AB(fwaddr), .DB(fwdata) -); - -MAC_AXI u_mac_axi ( - .clkt(mtxclk), - .clkr(mrxclk), - .rsttco(rsttco), - .rstrco(rstrco), - .interrupt(interrupt), - .tps(tps), - .rps(rps), - - .mhclk (hclk ), - .mhresetn (hrst_ ), - .mawid_o (mawid_o ), - .mawaddr_o (mawaddr_o ), - .mawlen_o (mawlen_o ), - .mawsize_o (mawsize_o ), - .mawburst_o (mawburst_o ), - .mawlock_o (mawlock_o ), - .mawcache_o (mawcache_o ), - .mawprot_o (mawprot_o ), - .mawvalid_o (mawvalid_o ), - .mawready_i (mawready_i ), - .mwid_o (mwid_o ), - .mwdata_o (mwdata_o ), - .mwstrb_o (mwstrb_o ), - .mwlast_o (mwlast_o ), - .mwvalid_o (mwvalid_o ), - .mwready_i (mwready_i ), - .mbid_i (mbid_i ), - .mbresp_i (mbresp_i ), - .mbvalid_i (mbvalid_i ), - .mbready_o (mbready_o ), - .marid_o (marid_o ), - .maraddr_o (maraddr_o ), - .marlen_o (marlen_o ), - .marsize_o (marsize_o ), - .marburst_o (marburst_o ), - .marlock_o (marlock_o ), - .marcache_o (marcache_o ), - .marprot_o (marprot_o ), - .marvalid_o (marvalid_o ), - .marready_i (marready_i ), - .mrid_i (mrid_i ), - .mrdata_i (mrdata_i ), - .mrresp_i (mrresp_i ), - .mrlast_i (mrlast_i ), - .mrvalid_i (mrvalid_i ), - .mrready_o (mrready_o ), - .shclk (hclk ), - .shresetn (hrst_ ), - .sawid_i (sawid_i ), - .sawaddr_i (sawaddr_i ), - .sawlen_i (sawlen_i ), - .sawsize_i (sawsize_i ), - .sawburst_i (sawburst_i ), - .sawlock_i (sawlock_i ), - .sawcache_i (sawcache_i ), - .sawprot_i (sawprot_i ), - .sawvalid_i (sawvalid_i ), - .sawready_o (sawready_o ), - .swid_i (swid_i ), - .swdata_i (swdata_i ), - .swstrb_i (swstrb_i ), - .swlast_i (swlast_i ), - .swvalid_i (swvalid_i ), - .swready_o (swready_o ), - .sbid_o (sbid_o ), - .sbresp_o (sbresp_o ), - .sbvalid_o (sbvalid_o ), - .sbready_i (sbready_i ), - .sarid_i (sarid_i ), - .saraddr_i (saraddr_i ), - .sarlen_i (sarlen_i ), - .sarsize_i (sarsize_i ), - .sarburst_i (sarburst_i ), - .sarlock_i (sarlock_i ), - .sarcache_i (sarcache_i ), - .sarprot_i (sarprot_i ), - .sarvalid_i (sarvalid_i ), - .sarready_o (sarready_o ), - .srid_o (srid_o ), - .srdata_o (srdata_o ), - .srresp_o (srresp_o ), - .srlast_o (srlast_o ), - .srvalid_o (srvalid_o ), - .srready_i (srready_i ), - .trdata(trdata), - .twe(twe), - .twaddr(twaddr), - .traddr(traddr), - .twdata(twdata), - .rrdata(rrdata), - .rwe(rwe), - .rwaddr(rwaddr), - .rraddr(rraddr), - .rwdata(rwdata), - .frdata(frdata), - .fwe(fwe), - .fwaddr(fwaddr), - .fraddr(fraddr), - .fwdata(fwdata), - .match(match), - .matchval(matchval), - .matchen(matchen), - .matchdata(matchdata), - .sdi(1'b0), - .sclk(sclk), - .scs(scs), - .sdo(sdo), - .rxer(mrxerr), - .rxdv(mrxdv), - .col(mcoll), - .crs(mcrs), - .rxd(mrxd), - .txen(mtxen), - .txer(mtxerr), - .txd(mtxd), - .mdc(mdc), - .mdi(md_i), - .mdo(md_o), - .mden(md_oe) - ); - -endmodule - -module RegFile2_64x16 ( - QA, - AA, - CLKA, - CENA, - AB, - DB, - CLKB, - CENB -); - parameter BITS = 16; - parameter word_depth = 64; - parameter addr_width = 6; - output [15:0] QA; - input [5:0] AA; - input CLKA; - input CENA; - input [5:0] AB; - input [15:0] DB; - input CLKB; - input CENB; - reg [15:0] QA; - - reg [BITS-1:0] mem [word_depth-1:0]; - - wire NOT_CENA; - wire NOT_CENB; - - not (NOT_CENA, CENA); - always @ ( posedge CLKA ) if ( NOT_CENA ) QA<=mem[AA]; - - not (NOT_CENB, CENB); - always @ ( posedge CLKB ) if ( NOT_CENB ) mem[AB]<=DB; - -endmodule diff --git a/resources/soc/rtl/MAC/maccsr2axi.v b/resources/soc/rtl/MAC/maccsr2axi.v deleted file mode 100644 index 15e9d7a..0000000 --- a/resources/soc/rtl/MAC/maccsr2axi.v +++ /dev/null @@ -1,291 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -module MACCSR2AXI ( - saclk , - saresetn , - awid_i , - awaddr_i , - awlen_i , - awsize_i , - awburst_i , - awlock_i , - awcache_i , - awprot_i , - awvalid_i , - awready_o , - wid_i , - wdata_i , - wstrb_i , - wlast_i , - wvalid_i , - wready_o , - bid_o , - bresp_o , - bvalid_o , - bready_i , - arid_i , - araddr_i , - arlen_i , - arsize_i , - arburst_i , - arlock_i , - arcache_i , - arprot_i , - arvalid_i , - arready_o , - rid_o , - rdata_o , - rresp_o , - rlast_o , - rvalid_o , - rready_i , - - rstcsr , - csrack , - csrdatao , - csrreq , - csrrw , - csrbe , - csrdatai , - csraddr - ); - - - parameter SAXIDATAWIDTH = 32; - parameter SAXIADDRESSWIDTH = 32; - parameter CSRDATAWIDTH = 32; - parameter CSRADDRESSWIDTH = 8; - - - - input saclk; - input saresetn; - input [ 3:0] awid_i ; - input [ 31:0] awaddr_i ; - input [ 3:0] awlen_i ; - input [ 2:0] awsize_i ; - input [ 1:0] awburst_i ; - input [ 1:0] awlock_i ; - input [ 3:0] awcache_i ; - input [ 2:0] awprot_i ; - input awvalid_i ; - output awready_o ; - input [ 3:0] wid_i ; - input [ 31:0] wdata_i ; - input [ 3:0] wstrb_i ; - input wlast_i ; - input wvalid_i ; - output wready_o ; - output [ 3:0] bid_o ; - output [ 1:0] bresp_o ; - output bvalid_o ; - input bready_i ; - input [ 3:0] arid_i ; - input [ 31:0] araddr_i ; - input [ 3:0] arlen_i ; - input [ 2:0] arsize_i ; - input [ 1:0] arburst_i ; - input [ 1:0] arlock_i ; - input [ 3:0] arcache_i ; - input [ 2:0] arprot_i ; - input arvalid_i ; - output arready_o ; - output [ 3:0] rid_o ; - output [ 31:0] rdata_o ; - output [ 1:0] rresp_o ; - output rlast_o ; - output rvalid_o ; - input rready_i ; - - - output rstcsr; - wire rstcsr; - input csrack; - input [CSRDATAWIDTH - 1:0] csrdatao; - output csrreq; - wire csrreq; - output csrrw; - wire csrrw; - output [CSRDATAWIDTH / 8 - 1:0] csrbe; - wire [CSRDATAWIDTH / 8 - 1:0] csrbe; - output [CSRDATAWIDTH - 1:0] csrdatai; - wire [CSRDATAWIDTH - 1:0] csrdatai; - output [CSRADDRESSWIDTH - 1:0] csraddr; - wire [CSRADDRESSWIDTH - 1:0] csraddr; - - -reg isWriting; -reg isReading; -wire awready; -wire arready; -wire wvalid; -wire wlast; -wire wready; -wire rvalid; -wire rlast; -wire rready; - -assign wvalid = wvalid_i; -assign wlast = wlast_i; - -always @(posedge saclk) -begin - if (!saresetn || (wlast && wvalid && wready)) - begin - isWriting <= 1'b0; - end - else if (awvalid_i && awready) - begin - isWriting <= 1'b1; - end -end -always @(posedge saclk) -begin - if (!saresetn || (rlast && rvalid && rready)) - begin - isReading <= 1'b0; - end - else if (arvalid_i && arready) - begin - isReading <= 1'b1; - end -end - -wire arvalid; -wire rd_valid; -wire [1:0] rresp; -wire [31:0] rdata; -reg [31:0] rd_addr; -reg [3:0] rid; -reg [2:0] rd_size; - - -assign arvalid = arvalid_i; -assign rd_valid = arvalid & arready; -assign rready = rready_i; -assign rresp = 2'b00; - -always @(posedge saclk) - if(rd_valid) begin - rid <= arid_i; - end - -always @(posedge saclk) -begin - if(!saresetn) begin - rd_addr <= 32'h0; - end - else if (rd_valid) begin - rd_addr <= araddr_i; - end -end - -assign arready = csrack & !isWriting & !isReading; -assign rvalid = csrrw & csrack; -assign rlast = 1'b1; -assign rdata = csrdatao; - -reg [31:0] wr_addr; -wire wr_valid; -wire [3:0] wr_strb; -wire awvalid; -wire bready; - -assign awvalid = awvalid_i; -assign awready = csrack & !isWriting & !isReading; -assign wready = !csrrw && csrack; -assign bready = bready_i; -assign wr_strb = {4{wvalid}} & wstrb_i; -assign wr_valid = awvalid & awready; - - -always @(posedge saclk) -begin - if(!saresetn) begin - wr_addr <= 32'h0; - end - else if (wr_valid) begin - wr_addr <= awaddr_i; - end -end - - -wire w_resp_valid; -reg w_resp_valid_r; -reg[3:0] bid_r; -assign w_resp_valid = wvalid & wlast & wready; -always @(posedge saclk) - if(!saresetn) begin - w_resp_valid_r <= 1'b0; - bid_r <= 4'b0; - end - else if(w_resp_valid) begin - w_resp_valid_r <= 1'b1; - bid_r <= wid_i; - end - else if(bready) begin - w_resp_valid_r <= 1'b0; - end - -wire [1:0] bresp = 2'b00; -wire [3:0] bid = bid_r; -wire bvalid = w_resp_valid_r; - -assign csrdatai = wdata_i; - -assign csrbe = wr_strb; - -assign csraddr = csrrw ? rd_addr[7:0]: wr_addr[7:0]; - -assign csrreq = isWriting | isReading; - -assign csrrw = isReading; - -assign rstcsr = ~saresetn; - -assign awready_o = awready; -assign wready_o = wready; - -assign bid_o = bid; -assign bresp_o = bresp; -assign bvalid_o = bvalid; - -assign arready_o = arready; -assign rid_o = rid; -assign rdata_o = rdata; -assign rresp_o = rresp; -assign rlast_o = rlast; -assign rvalid_o = rvalid; - -endmodule diff --git a/resources/soc/rtl/MAC/macdata2axi.v b/resources/soc/rtl/MAC/macdata2axi.v deleted file mode 100644 index ca70bea..0000000 --- a/resources/soc/rtl/MAC/macdata2axi.v +++ /dev/null @@ -1,248 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -module MACDATA2AXI ( - maclk , - maresetn , - - awid_o , - awaddr_o , - awlen_o , - awsize_o , - awburst_o , - awlock_o , - awcache_o , - awprot_o , - awvalid_o , - awready_i , - wid_o , - wdata_o , - wstrb_o , - wlast_o , - wvalid_o , - wready_i , - bid_i , - bresp_i , - bvalid_i , - bready_o , - arid_o , - araddr_o , - arlen_o , - arsize_o , - arburst_o , - arlock_o , - arcache_o , - arprot_o , - arvalid_o , - arready_i , - rid_i , - rdata_i , - rresp_i , - rlast_i , - rvalid_i , - rready_o , - datareq , - datareqc , - datarw , - dataeob , - dataeobc , - dataaddr , - datao , - dataack , - datai - ); - - parameter MAXIDATAWIDTH = 32; - parameter MAXIADDRESSWIDTH = 32; - parameter MACDATAWIDTH = 32; - parameter MACADDRESSWIDTH = 32; - - -input maclk; -input maresetn; -output [ 3:0] awid_o ; -output [ 31:0] awaddr_o ; -output [ 3:0] awlen_o ; -output [ 2:0] awsize_o ; -output [ 1:0] awburst_o ; -output [ 1:0] awlock_o ; -output [ 3:0] awcache_o ; -output [ 2:0] awprot_o ; -output awvalid_o ; -input awready_i ; -output [ 3:0] wid_o ; -output [ 31:0] wdata_o ; -output [ 3:0] wstrb_o ; -output wlast_o ; -output wvalid_o ; -input wready_i ; -input [ 3:0] bid_i ; -input [ 1:0] bresp_i ; -input bvalid_i ; -output bready_o ; -output [ 3:0] arid_o ; -output [ 31:0] araddr_o ; -output [ 3:0] arlen_o ; -output [ 2:0] arsize_o ; -output [ 1:0] arburst_o ; -output [ 1:0] arlock_o ; -output [ 3:0] arcache_o ; -output [ 2:0] arprot_o ; -output arvalid_o ; -input arready_i ; -input [ 3:0] rid_i ; -input [ 31:0] rdata_i ; -input [ 1:0] rresp_i ; -input rlast_i ; -input rvalid_i ; -output rready_o ; - - -input datareq; -input datareqc; -input datarw; -input dataeob; -input dataeobc; -input [MACADDRESSWIDTH - 1:0] dataaddr; -input [MACDATAWIDTH - 1:0] datao; -output dataack; -wire dataack; -output [MACDATAWIDTH - 1:0] datai; -wire [MACDATAWIDTH - 1:0] datai; - - -assign arid_o = 4'h1; -assign arsize_o = 3'b010; -assign arlen_o = 4'b0000; -assign arburst_o = 2'b01; -assign arlock_o = 2'b00; -assign arcache_o = 4'b0000; -assign arprot_o = 3'b110; - -reg isWriting; -reg isReading; - -always @(posedge maclk) -begin - if (!maresetn || (wlast_o && wvalid_o && wready_i)) - begin - isWriting <= 1'b0; - end - else if (awvalid_o && awready_i) - begin - isWriting <= 1'b1; - end -end - -always @(posedge maclk) -begin - if (!maresetn || (rlast_i && rvalid_i && rready_o)) - begin - isReading <= 1'b0; - end - else if (arvalid_o && arready_i) - begin - isReading <= 1'b1; - end -end - -reg [MACADDRESSWIDTH-1:0] dataAddr_c_r; -wire [MACADDRESSWIDTH-1:0] dataAddr_c; -wire dataAddr_sel; -reg dataReq_r; - -always @(posedge maclk) -begin - dataReq_r <= datareq; -end - -wire dataAddr_c_r_en; -assign dataAddr_c_r_en = (awvalid_o & awready_i) | - (arvalid_o & arready_i); -always @(posedge maclk) -begin - if (!maresetn) - begin - dataAddr_c_r <= 32'd0; - end - else if ( dataAddr_c_r_en) - begin - dataAddr_c_r <= dataAddr_c; - end -end - -assign dataAddr_sel = datareq & (~dataReq_r | dataeob); -assign dataAddr_c = dataAddr_sel ? dataaddr : dataAddr_c_r+3'b100; - -wire arvalid; -assign arvalid = datareq & datarw & ~isWriting & ~isReading; - -assign araddr_o = dataAddr_c; -assign arvalid_o = arvalid; - -assign rready_o = 1'b1; -assign datai = rdata_i; -wire readDataAck; -assign readDataAck = rvalid_i & rready_o; - -assign awid_o = 4'h1; -assign awsize_o = 3'b010; -assign awlen_o = 4'b0000; -assign awburst_o = 2'b01; -assign awlock_o = 2'b00; -assign awcache_o = 4'b0000; -assign awprot_o = 3'b110; - -wire awvalid; -assign awvalid = datareq & ~datarw & ~isWriting & ~isReading; - -assign awvalid_o = awvalid; -assign awaddr_o = dataAddr_c; - -wire wvalid; -assign wid_o = 4'h1; -assign wlast_o = 1'b1; -assign wdata_o = datao; -assign wstrb_o = 4'b1111; - -assign wvalid = (awvalid_o & awready_i) | isWriting; -assign wvalid_o = wvalid; - -wire writeDataAck; -assign writeDataAck = wvalid & wready_i; - -assign bready_o = 1'b1; - -assign dataack = readDataAck | writeDataAck; - -endmodule diff --git a/resources/soc/rtl/MAC/rc.v b/resources/soc/rtl/MAC/rc.v deleted file mode 100644 index 2e26c57..0000000 --- a/resources/soc/rtl/MAC/rc.v +++ /dev/null @@ -1,1749 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -module RC ( - clk, - rst, - rxdv, - rxer, - rxd, - col, - ramwe, - ramaddr, - ramdata, - fdata, - faddr, - cachenf, - radg, - wadg, - rprog, - rcpoll, - riack, - ren, - ra, - pm, - pr, - pb, - rif, - ho, - hp, - rireq, - ff, - rf, - mf, - db, - re, - ce, - tl, - ftp, - ov, - cs, - length, - match, - matchval, - matchen, - matchdata, - focl, - foclack, - oco, - focg, - mfcl, - mfclack, - mfo, - mfcg, - stopi, - stopo, - rcsack, - rcsreq, - insert_en_i -); - - parameter FIFODEPTH = 9; - parameter DATAWIDTH = 32; - - `include "utility.v" - - input clk; - input rst; - - input col; - input rxdv; - input rxer; - input [MIIWIDTH - 1:0] rxd; - - output ramwe; - wire ramwe; - output [FIFODEPTH - 1:0] ramaddr; - wire [FIFODEPTH - 1:0] ramaddr; - output [DATAWIDTH - 1:0] ramdata; - wire [DATAWIDTH - 1:0] ramdata; - - input [ADDRWIDTH - 1:0] fdata; - output [ADDRDEPTH - 1:0] faddr; - wire [ADDRDEPTH - 1:0] faddr; - - input cachenf; - input [FIFODEPTH - 1:0] radg; - output [FIFODEPTH - 1:0] wadg; - wire [FIFODEPTH - 1:0] wadg; - output rprog; - reg rprog; - output rcpoll; - wire rcpoll; - - input riack; - input ren; - input ra; - input pm; - input pr; - input pb; - input rif; - input ho; - input hp; - output rireq; - reg rireq; - output ff; - reg ff; - output rf; - reg rf; - output mf; - reg mf; - output db; - reg db; - output re; - reg re; - output ce; - reg ce; - output tl; - reg tl; - output ftp; - reg ftp; - output cs; - reg cs; - output ov; - reg ov; - output [13:0] length; - reg [13:0] length; - - input match; - input matchval; - output matchen; - reg matchen; - output [47:0] matchdata; - wire [47:0] matchdata; - - input focl; - output foclack; - wire foclack; - output oco; - reg oco; - output [10:0] focg; - reg [10:0] focg; - input mfcl; - output mfclack; - output mfo; - reg mfo; - output [15:0] mfcg; - reg [15:0] mfcg; - - input stopi; - output stopo; - reg stopo; - - input rcsack; - output rcsreq; - reg rcsreq; - - input insert_en_i; - - - reg insert_en_0_r; - reg insert_en_r; - - reg we; - reg full; - reg [FIFODEPTH - 1:0] wad; - reg [FIFODEPTH - 1:0] wadi; - reg [FIFODEPTH - 1:0] iwadg; - reg [FIFODEPTH - 1:0] wadig; - reg [FIFODEPTH - 1:0] radg_0_r; - reg [FIFODEPTH - 1:0] radg_r; - reg [FIFODEPTH - 1:0] isofad; - reg cachenf_r; - reg cachenf_2r; - reg fcfbci; - reg fcfbci_r; - reg eorfff; - - - reg col_r; - reg rxdv_r; - reg rxer_r; - reg [MIIWIDTH - 1:0] rxd_r; - wire [3:0] rxd_r4; - - reg [3:0] rsm_c; - reg [3:0] rsm; - reg [3:0] ncnt; - wire [1:0] ncnt10; - wire [2:0] ncnt20; - reg [DATAWIDTH - 1:0] data_c; - reg [DATAWIDTH - 1:0] data; - reg [31:0] crc_c; - reg [31:0] crc; - reg [6:0] bcnt; - wire [2:0] bcnt20; - reg bz; - reg winp; - wire iri_c; - reg iri; - reg riack_r; - reg [13:0] lcnt; - reg [15:0] lfield; - reg ren_r; - reg irprog; - - reg [2:0] fsm_c; - reg [2:0] fsm; - reg perfm_c; - reg perfm; - reg invm; - reg [8:0] crchash; - reg hash; - reg [47:0] dest; - reg [2:0] flcnt; - reg [ADDRDEPTH - 1:0] fa; - reg [15:0] fdata_r; - - reg rcs; - reg rcsack_r; - reg [7:0] rcscnt; - - reg [10:0] focnt; - reg focl_r; - reg [15:0] mfcnt; - reg mfcl_r; - - reg stop_r; - - wire [FIFODEPTH - 1:0] fzero; - wire [MIIWIDTH_MAX + 1:0] mzero_max; - wire [MIIWIDTH_MAX + 1:0] rxd_r_max; - - always @(posedge clk) - begin : mii_reg_proc - if (rst) - begin - col_r <= 1'b0; - rxdv_r <= 1'b0 ; - rxer_r <= 1'b0 ; - rxd_r <= {MIIWIDTH{1'b0}} ; - data <= {DATAWIDTH{1'b1}} ; - end - else - begin - col_r <= col ; - rxdv_r <= rxdv ; - rxer_r <= rxer ; - rxd_r <= rxd ; - data <= data_c ; - end - end - - assign rxd_r4 = rxd_r_max[MIIWIDTH-1:0]; - - assign ncnt10 = ncnt[1:0] ; - - assign ncnt20 = ncnt[2:0] ; - - wire [2:0] n_offset; - assign n_offset = (insert_en_r) ? ((ncnt20 + 3'b100) & 3'b111) : ncnt20; - - always @(ncnt or ncnt10 or n_offset or rxd_r_max or data) - begin : data_proc - reg[15:0] data16; - reg[31:0] data32; - case (DATAWIDTH) - 8 : - begin - data_c <= data ; - if (!(ncnt[0])) - begin - data_c[3:0] <= rxd_r_max[MIIWIDTH-1:0] ; - end - else - begin - data_c[7:4] <= rxd_r_max[MIIWIDTH-1:0] ; - end - end - 16 : - begin - data16 = data; - case (ncnt10) - 2'b00 : - begin - data16[3:0] = rxd_r_max[MIIWIDTH-1:0]; - end - 2'b01 : - begin - data16[7:4] = rxd_r_max[MIIWIDTH-1:0]; - end - 2'b10 : - begin - data16[11:8] = rxd_r_max[MIIWIDTH-1:0]; - end - default : - begin - data16[15:12] = rxd_r_max[MIIWIDTH-1:0]; - end - endcase - data_c <= data16 ; - end - default : - begin - data32 = data; - case (n_offset) - 3'b000 : - begin - data32[3:0] = rxd_r_max[MIIWIDTH-1:0]; - end - 3'b001 : - begin - data32[7:4] = rxd_r_max[MIIWIDTH-1:0]; - end - 3'b010 : - begin - data32[11:8] = rxd_r_max[MIIWIDTH-1:0]; - end - 3'b011 : - begin - data32[15:12] = rxd_r_max[MIIWIDTH-1:0]; - end - 3'b100 : - begin - data32[19:16] = rxd_r_max[MIIWIDTH-1:0]; - end - 3'b101 : - begin - data32[23:20] = rxd_r_max[MIIWIDTH-1:0]; - end - 3'b110 : - begin - data32[27:24] = rxd_r_max[MIIWIDTH-1:0]; - end - default : - begin - data32[31:28] = rxd_r_max[MIIWIDTH-1:0]; - end - endcase - data_c <= data32 ; - end - endcase - end - - always @(posedge clk) - begin : fifofull_reg_proc - if (rst) - begin - cachenf_r <= 1'b1 ; - cachenf_2r <= 1'b1 ; - full <= 1'b0 ; - end - else - begin - cachenf_r <= cachenf ; - - if(cachenf_2r | - ( - (!rxdv_r & cachenf_r) | - ( rxdv_r & cachenf_r & - (rsm==RSM_IDLE_RCSMT | rsm==RSM_SFD) - ) - ) - ) - begin - cachenf_2r <= cachenf ; - end - - if ((wadig == radg_r) | (iwadg == radg_r & full)) - begin - full <= 1'b1 ; - end - else - begin - full <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : addr_reg_proc - if (rst) - begin - wad <= {FIFODEPTH{1'b0}} ; - wadi <= {fzero[FIFODEPTH - 1:1], 1'b1} ; - iwadg <= {FIFODEPTH{1'b0}} ; - isofad <= {FIFODEPTH{1'b0}} ; - wadig <= {fzero[FIFODEPTH - 1:1],1'b1} ; - radg_0_r <= {FIFODEPTH{1'b0}} ; - radg_r <= {FIFODEPTH{1'b0}} ; - insert_en_0_r <= 1'b0; - insert_en_r <= 1'b0; - end - else - begin - if (rsm == RSM_BAD) - begin - wad <= isofad ; - end - else if (we) - begin - wad <= wad + 1 ; - end - - if (rsm == RSM_BAD) - begin - wadi <= isofad + 1 ; - end - else if (we) - begin - wadi <= wadi + 1 ; - end - - iwadg[FIFODEPTH - 1] <= wad[FIFODEPTH - 1] ; - begin : iwaddrg_loop - integer i; - for(i = FIFODEPTH - 2; i >= 0; i = i - 1) - begin - iwadg[i] <= wad[i + 1] ^ wad[i] ; - end - end - - wadig[FIFODEPTH - 1] <= wadi[FIFODEPTH - 1] ; - begin : waddrig_loop - integer i; - for(i = FIFODEPTH - 2; i >= 0; i = i - 1) - begin - wadig[i] <= wadi[i + 1] ^ wadi[i] ; - end - end - - if (rsm == RSM_IDLE_RCSMT) - begin - isofad <= wad ; - end - - radg_0_r <= radg ; - radg_r <= radg_0_r ; - - insert_en_0_r <= insert_en_i; - insert_en_r <= insert_en_0_r; - - end - end - - always @(posedge clk) - begin : we_reg_proc - if (rst) - begin - we <= 1'b0 ; - end - else - begin - if ((rsm == RSM_INFO | - rsm == RSM_DEST | - rsm == RSM_LENGTH | - rsm == RSM_SOURCE) & - ((rxdv_r & ((DATAWIDTH == 8 & (ncnt[0])) | - (DATAWIDTH == 16 & ncnt[1:0] == 2'b11) | - (DATAWIDTH == 32 & n_offset[2:0] == 3'b111))) | - (!rxdv_r & !we & - ( - (DATAWIDTH==32 & n_offset[2:1]!=2'b00) | - (DATAWIDTH==16 & ncnt[1] !=1'b0) - ) - ) | - (full & !we))) - begin - we <= 1'b1 ; - end - else - begin - we <= 1'b0 ; - end - end - end - - assign ramdata = data ; - - assign ramwe = we ; - - assign ramaddr = wad ; - - assign wadg = iwadg ; - - always @(rsm or - rxdv_r or - rxd_r_max or - rxd_r4 or - stop_r or - bz or - fsm or - ra or - pm or - pb or - dest or - riack_r or - full or - ren_r or - winp or - irprog or - cachenf_r) - begin : rsm_proc - case (rsm) - RSM_IDLE_RCSMT : - begin - if (rxdv_r & !stop_r & ren_r) - begin - if (rxd_r_max[MIIWIDTH-1:0] == 4'b0101) - begin - rsm_c <= RSM_SFD ; - end - else - begin - rsm_c <= RSM_IDLE_RCSMT ; - end - end - else - begin - rsm_c <= RSM_IDLE_RCSMT ; - end - end - RSM_SFD : - begin - if (rxdv_r & !full & cachenf_r) - begin - case (rxd_r4) - 4'b1101 : - begin - rsm_c <= RSM_DEST ; - end - 4'b0101 : - begin - rsm_c <= RSM_SFD ; - end - default : - begin - rsm_c <= RSM_IDLE_RCSMT ; - end - endcase - end - else if (full | !cachenf_r) - begin - rsm_c <= RSM_BAD ; - end - else - begin - rsm_c <= RSM_IDLE_RCSMT ; - end - end - RSM_DEST : - begin - if (!rxdv_r | full | !cachenf_r) - begin - rsm_c <= RSM_BAD ; - end - else if (bz) - begin - rsm_c <= RSM_SOURCE ; - end - else - begin - rsm_c <= RSM_DEST ; - end - end - RSM_SOURCE : - begin - if (!rxdv_r) - begin - if ((pb) & (fsm == FSM_MATCH | ra | (pm & (dest[0])))) - begin - rsm_c <= RSM_SUCC ; - end - else - begin - rsm_c <= RSM_BAD ; - end - end - else if (full | !cachenf_r) - begin - rsm_c <= RSM_BAD ; - end - else if (bz) - begin - rsm_c <= RSM_LENGTH ; - end - else - begin - rsm_c <= RSM_SOURCE ; - end - end - RSM_LENGTH : - begin - if (!rxdv_r) - begin - if ((pb) & (fsm == FSM_MATCH | ra | (pm & (dest[0])))) - begin - rsm_c <= RSM_SUCC ; - end - else - begin - rsm_c <= RSM_BAD ; - end - end - else if (full | !cachenf_r) - begin - rsm_c <= RSM_BAD ; - end - else if (bz) - begin - rsm_c <= RSM_INFO ; - end - else - begin - rsm_c <= RSM_LENGTH ; - end - end - RSM_INFO : - begin - if (!rxdv_r) - begin - if ((winp | pb) & - (fsm == FSM_MATCH | ra | (pm & (dest[0])))) - begin - rsm_c <= RSM_SUCC ; - end - else - begin - rsm_c <= RSM_BAD ; - end - end - else if (full | !cachenf_r) - begin - if (winp) - begin - rsm_c <= RSM_SUCC ; - end - else - begin - rsm_c <= RSM_BAD ; - end - end - else if (fsm == FSM_FAIL & !ra & ~(pm & (dest[0]))) - begin - rsm_c <= RSM_BAD ; - end - else - begin - rsm_c <= RSM_INFO ; - end - end - RSM_SUCC : - begin - rsm_c <= RSM_INT ; - end - RSM_INT : - begin - if (riack_r) - begin - rsm_c <= RSM_INT1 ; - end - else - begin - rsm_c <= RSM_INT ; - end - end - RSM_INT1 : - begin - if (!rxdv_r & !riack_r) - begin - rsm_c <= RSM_IDLE_RCSMT ; - end - else - begin - rsm_c <= RSM_INT1 ; - end - end - default : - begin - if (!rxdv_r & !riack_r & !irprog) - begin - rsm_c <= RSM_IDLE_RCSMT ; - end - else - begin - rsm_c <= RSM_BAD ; - end - end - endcase - end - - always @(posedge clk) - begin : rsm_reg_proc - if (rst) - begin - rsm <= RSM_IDLE_RCSMT ; - end - else - begin - rsm <= rsm_c ; - end - end - - always @(posedge clk) - begin : rprog_reg_proc - if (rst) - begin - irprog <= 1'b0 ; - rprog <= 1'b0 ; - end - else - begin - if (rsm == RSM_IDLE_RCSMT | - rsm == RSM_BAD | - rsm == RSM_INT | - rsm == RSM_INT1) - begin - irprog <= 1'b0 ; - end - else - begin - irprog <= 1'b1 ; - end - - if (winp & irprog) - begin - rprog <= 1'b1 ; - end - else - begin - rprog <= 1'b0 ; - end - end - end - - assign rcpoll = irprog ; - - always @(posedge clk) - begin : bncnt_reg_proc - if (rst) - begin - bcnt <= {7{1'b0}} ; - bz <= 1'b0 ; - ncnt <= 4'b0000 ; - end - else - begin - if(cachenf_r) - begin - if (bz | rsm == RSM_IDLE_RCSMT) - begin - case (rsm) - RSM_IDLE_RCSMT : - begin - bcnt <= 7'b0000101 ; - end - RSM_DEST : - begin - bcnt <= 7'b0000101 ; - end - RSM_SOURCE : - begin - bcnt <= 7'b0000001 ; - end - default : - begin - bcnt <= 7'b0110001 ; - end - endcase - end - else - begin - if (ncnt[0]) - begin - bcnt <= bcnt - 1 ; - end - end - end - else - begin - if(!fcfbci_r) - begin - bcnt <= 7'b0111110 ; - end - else - begin - if (!ncnt[0]) - begin - bcnt <= bcnt - 1 ; - end - end - end - - if (bcnt == 7'b0000000 & !ncnt[0]) - begin - bz <= 1'b1 ; - end - else - begin - bz <= 1'b0 ; - end - - if (rsm == RSM_SFD | rsm == RSM_IDLE_RCSMT) - begin - ncnt <= 4'b0000 ; - end - else - begin - ncnt <= ncnt + 1 ; - end - end - end - - always @(posedge clk) - begin : winp_reg_proc - if (rst) - begin - winp <= 1'b0 ; - end - else - begin - if (rsm == RSM_IDLE_RCSMT) - begin - winp <= 1'b0 ; - end - else if ((rsm == RSM_INFO & bz & cachenf_2r) | - (rsm == RSM_BAD & bz & !cachenf_2r)) - begin - winp <= 1'b1 ; - end - end - end - - always @(crc or rsm or rxd_r_max) - begin : crc_proc - case (rsm) - RSM_IDLE_RCSMT : - begin - crc_c <= {32{1'b1}} ; - end - RSM_DEST, RSM_SOURCE, RSM_LENGTH, RSM_INFO : - begin - crc_c[0] <= crc[28] ^ - rxd_r_max[3] ; - crc_c[1] <= crc[28] ^ crc[29] ^ - rxd_r_max[2] ^ rxd_r_max[3] ; - crc_c[2] <= crc[28] ^ crc[29] ^ crc[30] ^ - rxd_r_max[1] ^ rxd_r_max[2] ^ rxd_r_max[3] ; - crc_c[3] <= crc[29] ^ crc[30] ^ crc[31] ^ - rxd_r_max[0] ^ rxd_r_max[1] ^ rxd_r_max[2] ; - crc_c[4] <= crc[0] ^ crc[28] ^ crc[30] ^ crc[31] ^ - rxd_r_max[0] ^ rxd_r_max[1] ^ rxd_r_max[3] ; - crc_c[5] <= crc[1] ^ crc[28] ^ crc[29] ^ crc[31] ^ - rxd_r_max[0] ^ rxd_r_max[2] ^ rxd_r_max[3] ; - crc_c[6] <= crc[2] ^ crc[29] ^ crc[30] ^ - rxd_r_max[1] ^ rxd_r_max[2] ; - crc_c[7] <= crc[3] ^ crc[28] ^ crc[30] ^ crc[31] ^ - rxd_r_max[0] ^ rxd_r_max[1] ^ rxd_r_max[3] ; - crc_c[8] <= crc[4] ^ crc[28] ^ crc[29] ^ crc[31] ^ - rxd_r_max[0] ^ rxd_r_max[2] ^ rxd_r_max[3] ; - crc_c[9] <= crc[5] ^ crc[29] ^ crc[30] ^ - rxd_r_max[1] ^ rxd_r_max[2] ; - crc_c[10] <= crc[6] ^ crc[28] ^ crc[30] ^ crc[31] ^ - rxd_r_max[0] ^ rxd_r_max[1] ^ rxd_r_max[3] ; - crc_c[11] <= crc[7] ^ crc[28] ^ crc[29] ^ crc[31] ^ - rxd_r_max[0] ^ rxd_r_max[2] ^ rxd_r_max[3] ; - crc_c[12] <= crc[8] ^ crc[28] ^ crc[29] ^ crc[30] ^ - rxd_r_max[1] ^ rxd_r_max[2] ^ rxd_r_max[3] ; - crc_c[13] <= crc[9] ^ crc[29] ^ crc[30] ^ crc[31] ^ - rxd_r_max[0] ^ rxd_r_max[1] ^ rxd_r_max[2] ; - crc_c[14] <= crc[10] ^ crc[30] ^ crc[31] ^ - rxd_r_max[0] ^ rxd_r_max[1] ; - crc_c[15] <= crc[11] ^ crc[31] ^ - rxd_r_max[0] ; - crc_c[16] <= crc[12] ^ crc[28] ^ - rxd_r_max[3] ; - crc_c[17] <= crc[13] ^ crc[29] ^ - rxd_r_max[2] ; - crc_c[18] <= crc[14] ^ crc[30] ^ - rxd_r_max[1] ; - crc_c[19] <= crc[15] ^ crc[31] ^ - rxd_r_max[0] ; - crc_c[20] <= crc[16] ; - crc_c[21] <= crc[17] ; - crc_c[22] <= crc[18] ^ crc[28] ^ - rxd_r_max[3] ; - crc_c[23] <= crc[19] ^ crc[28] ^ crc[29] ^ - rxd_r_max[2] ^ rxd_r_max[3] ; - crc_c[24] <= crc[20] ^ crc[29] ^ crc[30] ^ - rxd_r_max[1] ^ rxd_r_max[2] ; - crc_c[25] <= crc[21] ^ crc[30] ^ crc[31] ^ - rxd_r_max[0] ^ rxd_r_max[1] ; - crc_c[26] <= crc[22] ^ crc[28] ^ crc[31] ^ - rxd_r_max[0] ^ rxd_r_max[3] ; - crc_c[27] <= crc[23] ^ crc[29] ^ - rxd_r_max[2] ; - crc_c[28] <= crc[24] ^ crc[30] ^ - rxd_r_max[1] ; - crc_c[29] <= crc[25] ^ crc[31] ^ - rxd_r_max[0] ; - crc_c[30] <= crc[26] ; - crc_c[31] <= crc[27] ; - end - default : - begin - crc_c <= crc ; - end - endcase - end - - always @(posedge clk) - begin : crc_reg_proc - if (rst) - begin - crc <= {32{1'b1}} ; - end - else - begin - crc <= crc_c ; - end - end - - assign iri_c = (rsm == RSM_INT) ? 1'b1 : 1'b0 ; - - always @(posedge clk) - begin : rint_reg_proc - if (rst) - begin - iri <= 1'b0 ; - riack_r <= 1'b0 ; - rireq <= 1'b0 ; - end - else - begin - iri <= iri_c ; - riack_r <= riack ; - rireq <= iri ; - end - end - - wire [13:0] new_lcnt; - assign new_lcnt = (insert_en_r) ? (lcnt + 2'b10) : lcnt; - - always @(posedge clk) - begin : length_reg_proc - if (rst) - begin - lcnt <= {14{1'b0}} ; - length <= {14{1'b0}} ; - end - else - begin - if ((rsm == RSM_IDLE_RCSMT && cachenf_2r) | - (!fcfbci && !cachenf_2r) | - rsm == RSM_INT1) - begin - lcnt <= {14{1'b0}} ; - end - else if (((rsm == RSM_INFO | - rsm == RSM_LENGTH | - rsm == RSM_DEST | - rsm == RSM_SOURCE) & rxdv_r) | - (fcfbci && !cachenf_2r)) - begin - if (ncnt[0]) - begin - lcnt <= lcnt + 1 ; - end - end - - length[13] <= new_lcnt[13] ; - begin : length_loop - integer i; - for(i = 12; i >= 0; i = i - 1) - begin - length[i] <= new_lcnt[i + 1] ^ new_lcnt[i] ; - end - end - end - end - - always @(posedge clk) - begin : fcfbci_reg_proc - if (rst) - begin - fcfbci <= 1'b0 ; - fcfbci_r <= 1'b0 ; - end - else - begin - - fcfbci_r <= fcfbci ; - - if(!cachenf_2r) - begin - if(rxdv_r && rxd_r4==4'b1101) - begin - fcfbci <= 1'b1 ; - end - else if(!rxdv_r) - begin - fcfbci <= 1'b0 ; - end - end - else - begin - fcfbci <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : eorfff_reg_proc - if (rst) - begin - eorfff <= 1'b0 ; - end - else - begin - if(rsm_c==RSM_IDLE_RCSMT && rsm==RSM_BAD && !cachenf_2r) - begin - eorfff <= 1'b1 ; - end - else - begin - eorfff <= 1'b0 ; - end - end - end - - - always @(posedge clk) - begin : stat_reg_proc - if (rst) - begin - lfield <= {16{1'b0}} ; - ftp <= 1'b0 ; - tl <= 1'b0 ; - ff <= 1'b0 ; - mf <= 1'b0 ; - re <= 1'b0 ; - ce <= 1'b0 ; - db <= 1'b0 ; - rf <= 1'b0 ; - ov <= 1'b0 ; - cs <= 1'b0 ; - end - else - begin - if (rsm == RSM_LENGTH) - begin - if (bcnt[1:0] == 2'b00) - begin - if (!(ncnt[0])) - begin - lfield[3:0] <= rxd_r_max[MIIWIDTH-1:0] ; - end - else - begin - lfield[7:4] <= rxd_r_max[MIIWIDTH-1:0] ; - end - end - else - begin - if (!(ncnt[0])) - begin - lfield[11:8] <= rxd_r_max[MIIWIDTH-1:0] ; - end - else - begin - lfield[15:12] <= rxd_r_max[MIIWIDTH-1:0] ; - end - end - end - - if (lfield > MAX_SIZE) - begin - ftp <= 1'b1 ; - end - else - begin - ftp <= 1'b0 ; - end - - if (lcnt == MAX_FRAME & !iri_c) - begin - tl <= 1'b1 ; - end - else if (rsm == RSM_IDLE_RCSMT) - begin - tl <= 1'b0 ; - end - - if (!iri_c) - begin - if (fsm == FSM_MATCH) - begin - ff <= 1'b0 ; - end - else - begin - ff <= 1'b1 ; - end - end - - if (!iri_c) - begin - mf <= dest[0] ; - end - - if (rxer_r & !iri_c) - begin - re <= 1'b1 ; - end - else if (rsm == RSM_IDLE_RCSMT) - begin - re <= 1'b0 ; - end - - if (rsm == RSM_INFO & !(ncnt[0])) - begin - if (crc == CRCVAL) - begin - ce <= 1'b0 ; - end - else - begin - ce <= 1'b1 ; - end - end - - if (rsm == RSM_INFO) - begin - if (!rxdv_r & (ncnt[0])) - begin - db <= 1'b1 ; - end - else - begin - db <= 1'b0 ; - end - end - - if (!winp & iri_c) - begin - rf <= 1'b1 ; - end - else if (rsm == RSM_IDLE_RCSMT) - begin - rf <= 1'b0 ; - end - - if (rsm == RSM_IDLE_RCSMT) - begin - ov <= 1'b0 ; - end - else if (full | !cachenf_r) - begin - ov <= 1'b1 ; - end - - if (col_r & !iri_c) - begin - cs <= 1'b1 ; - end - else if (rsm == RSM_IDLE_RCSMT) - begin - cs <= 1'b0 ; - end - - - end - end - - always @(posedge clk) - begin : ren_reg_proc - if (rst) - begin - ren_r <= 1'b0 ; - end - else - begin - if (rsm == RSM_IDLE_RCSMT) - begin - ren_r <= ren ; - end - end - end - - always @(fsm or - rsm or - ho or - hp or - dest or - lcnt or - ncnt or - flcnt or - perfm or - hash or - pr or - fa or - invm or - rif or - matchval or - match) - begin : fsm_proc - case (fsm) - FSM_IDLE : - begin - if (lcnt[2:0] == 3'b101 & (ncnt[0])) - begin - if (pr) - begin - fsm_c <= FSM_MATCH ; - end - else if (ho | (hp & (dest[0]))) - begin - fsm_c <= FSM_HASH ; - end - else if (!hp) - begin - fsm_c <= FSM_PERF16 ; - end - else - begin - fsm_c <= FSM_PERF1 ; - end - end - else - begin - fsm_c <= FSM_IDLE ; - end - end - FSM_PERF1 : - begin - if (fa == 6'b101100) - begin - if(perfm | - (matchval & match)) - begin - fsm_c <= FSM_MATCH ; - end - else - begin - fsm_c <= FSM_FAIL ; - end - end - else - begin - fsm_c <= FSM_PERF1 ; - end - end - FSM_PERF16 : - begin - if ((flcnt == 3'b010 & perfm & !rif) | - (fa == 6'b110010 & rif & invm) | - (matchval & match)) - begin - fsm_c <= FSM_MATCH ; - end - else if (fa == 6'b110010) - begin - fsm_c <= FSM_FAIL ; - end - else - begin - fsm_c <= FSM_PERF16 ; - end - end - FSM_HASH : - begin - if (matchval & match) - begin - fsm_c <= FSM_MATCH ; - end - else if (flcnt == 3'b101) - begin - if (hash) - begin - fsm_c <= FSM_MATCH ; - end - else - begin - fsm_c <= FSM_FAIL ; - end - end - else - begin - fsm_c <= FSM_HASH ; - end - end - FSM_MATCH : - begin - if (rsm == RSM_IDLE_RCSMT) - begin - fsm_c <= FSM_IDLE ; - end - else - begin - fsm_c <= FSM_MATCH ; - end - end - default : - begin - if (rsm == RSM_IDLE_RCSMT) - begin - fsm_c <= FSM_IDLE ; - end - else - begin - fsm_c <= FSM_FAIL ; - end - end - endcase - end - - always @(posedge clk) - begin : fsm_reg_proc - if (rst) - begin - fsm <= FSM_IDLE ; - end - else - begin - fsm <= fsm_c ; - end - end - - assign bcnt20 = bcnt[2:0] ; - - always @(posedge clk) - begin : dest_reg_proc - if (rst) - begin - dest <= {48{1'b0}} ; - end - else - begin - if (rsm == RSM_DEST) - begin - if (!(ncnt[0])) - begin - case (bcnt20) - 3'b101 : - begin - dest[3:0] <= rxd_r_max[MIIWIDTH-1:0] ; - end - 3'b100 : - begin - dest[11:8] <= rxd_r_max[MIIWIDTH-1:0] ; - end - 3'b011 : - begin - dest[19:16] <= rxd_r_max[MIIWIDTH-1:0] ; - end - 3'b010 : - begin - dest[27:24] <= rxd_r_max[MIIWIDTH-1:0] ; - end - 3'b001 : - begin - dest[35:32] <= rxd_r_max[MIIWIDTH-1:0] ; - end - default : - begin - dest[43:40] <= rxd_r_max[MIIWIDTH-1:0] ; - end - endcase - end - else - begin - case (bcnt20) - 3'b101 : - begin - dest[7:4] <= rxd_r_max[MIIWIDTH-1:0] ; - end - 3'b100 : - begin - dest[15:12] <= rxd_r_max[MIIWIDTH-1:0] ; - end - 3'b011 : - begin - dest[23:20] <= rxd_r_max[MIIWIDTH-1:0] ; - end - 3'b010 : - begin - dest[31:28] <= rxd_r_max[MIIWIDTH-1:0] ; - end - 3'b001 : - begin - dest[39:36] <= rxd_r_max[MIIWIDTH-1:0] ; - end - default : - begin - dest[47:44] <= rxd_r_max[MIIWIDTH-1:0] ; - end - endcase - end - end - end - end - - always @(posedge clk) - begin : hash_reg_proc - if (rst) - begin - crchash <= {9{1'b0}} ; - hash <= 1'b0 ; - fdata_r <= {16{1'b0}} ; - end - else - begin - if (fsm == FSM_HASH & flcnt == 3'b000) - begin - crchash <= {crc[23], crc[24], crc[25], crc[26], - crc[27], crc[28], crc[29], crc[30], crc[31]} ; - end - - hash <= fdata_r[crchash[3:0]] ; - - fdata_r <= fdata ; - end - end - - always @(perfm or flcnt or fsm or fdata_r or dest) - begin : perfm_proc - if ((flcnt == 3'b001 & fdata_r != dest[47:32]) | - (flcnt == 3'b000 & fdata_r != dest[31:16]) | - (flcnt == 3'b010 & fdata_r != dest[15:0]) | fsm == FSM_IDLE) - begin - perfm_c <= 1'b0 ; - end - else if (flcnt == 3'b010 & fdata_r == dest[15:0]) - begin - perfm_c <= 1'b1 ; - end - else - begin - perfm_c <= perfm ; - end - end - - always @(posedge clk) - begin : perfm_reg_proc - if (rst) - begin - invm <= 1'b0 ; - perfm <= 1'b0 ; - end - else - begin - perfm <= perfm_c ; - - if (fsm == FSM_IDLE) - begin - invm <= 1'b1 ; - end - else if (flcnt == 3'b001 & perfm_c) - begin - invm <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : fa_reg_proc - if (rst) - begin - flcnt <= {3{1'b0}} ; - fa <= {ADDRDEPTH{1'b0}} ; - end - else - begin - case (fsm) - FSM_PERF1, FSM_PERF16 : - begin - fa <= fa + 1 ; - end - FSM_HASH : - begin - fa[5:0] <= {1'b0, crchash[8:4]} ; - end - default : - begin - if (hp & !(dest[0])) - begin - fa <= PERF1_ADDR ; - end - else - begin - fa <= {ADDRDEPTH{1'b0}} ; - end - end - endcase - - if (fsm_c == FSM_IDLE | - (flcnt == 3'b010 & fsm_c == FSM_PERF16) | - (flcnt == 3'b010 & fsm_c == FSM_PERF1)) - begin - flcnt <= {3{1'b0}} ; - end - else if (fsm == FSM_PERF1 | - fsm == FSM_PERF16 | - fsm == FSM_HASH) - begin - flcnt <= flcnt + 1 ; - end - end - end - - assign faddr = fa ; - - assign matchdata = dest ; - - always @(posedge clk) - begin : matchen_reg_proc - if (rst) - begin - matchen <= 1'b0 ; - end - else - begin - if (fsm == FSM_PERF1 | fsm == FSM_HASH | fsm == FSM_PERF16) - begin - matchen <= 1'b1 ; - end - else - begin - matchen <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : stop_reg_proc - if (rst) - begin - stop_r <= 1'b0 ; - stopo <= 1'b0 ; - end - else - begin - stop_r <= stopi ; - - if (stop_r & rsm == RSM_IDLE_RCSMT) - begin - stopo <= 1'b1 ; - end - else - begin - stopo <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : rcscnt_reg_proc - if (rst) - begin - rcscnt <= {8{1'b0}} ; - rcs <= 1'b0 ; - rcsreq <= 1'b0 ; - rcsack_r <= 1'b0 ; - end - else - begin - if (rcscnt == 8'b00000000) - begin - rcscnt <= 8'b10000000 ; - end - else - begin - rcscnt <= rcscnt - 1 ; - end - - if (rcscnt == 8'b00000000) - begin - rcs <= 1'b1 ; - end - else if (rcsack_r) - begin - rcs <= 1'b0 ; - end - - if (rcs & !rcsack_r) - begin - rcsreq <= 1'b1 ; - end - else if (rcsack_r) - begin - rcsreq <= 1'b0 ; - end - - rcsack_r <= rcsack ; - end - end - - always @(posedge clk) - begin : focnt_reg_proc - if (rst) - begin - focnt <= {11{1'b0}} ; - oco <= 1'b0 ; - focl_r <= 1'b0 ; - focg <= {11{1'b0}} ; - end - else - begin - if (focl_r) - begin - focnt <= {11{1'b0}} ; - end - else if ((rsm == RSM_DEST | - rsm == RSM_SOURCE | - rsm == RSM_LENGTH | - rsm == RSM_INFO | - rsm == RSM_SFD) & - full) - begin - focnt <= focnt + 1 ; - end - - if (focl_r) - begin - oco <= 1'b0 ; - end - else if ((rsm == RSM_DEST | - rsm == RSM_SOURCE | - rsm == RSM_LENGTH | - rsm == RSM_INFO) & - focnt == 11'b11111111111 & - (full | !cachenf_r)) - begin - oco <= 1'b1 ; - end - - focl_r <= focl ; - - focg[10] <= focnt[10] ; - begin : focg_loop - integer i; - for(i = 9; i >= 0; i = i - 1) - begin - focg[i] <= focnt[i] ^ focnt[i + 1] ; - end - end - end - end - - assign foclack = focl_r ; - - always @(posedge clk) - begin : mfcnt_reg_proc - if (rst) - begin - mfcnt <= {16{1'b0}} ; - mfo <= 1'b0 ; - mfcl_r <= 1'b0 ; - mfcg <= {16{1'b0}} ; - end - else - begin - if (mfcl_r) - begin - mfcnt <= {16{1'b0}} ; - end - else if ( - eorfff && - (pb | winp) && - ( - fsm==FSM_MATCH | ra | - ( - pm && dest[0] - ) - ) - ) - begin - mfcnt <= mfcnt + 1'b1 ; - end - - if (mfcl_r) - begin - mfo <= 1'b0 ; - end - else if ( - mfcnt=={16{1'b1}} && pb && - ( - fsm==FSM_MATCH | ra | - ( - pm && dest[0] - ) - ) - ) - begin - mfo <= 1'b1 ; - end - - mfcl_r <= mfcl; - - begin : mfcg_reg_write - integer i; - mfcg[15] <= mfcnt[15]; - for(i = 14; i >= 0; i = i - 1) - begin - mfcg[i] <= mfcnt[i] ^ mfcnt[i + 1]; - end - end - end - end - - assign mfclack = mfcl_r ; - - assign fzero = {FIFODEPTH{1'b0}} ; - - assign mzero_max = {(MIIWIDTH_MAX + 1){1'b0}} ; - - assign rxd_r_max = {mzero_max[MIIWIDTH_MAX + 1:MIIWIDTH], - rxd_r}; - -endmodule diff --git a/resources/soc/rtl/MAC/rfifo.v b/resources/soc/rtl/MAC/rfifo.v deleted file mode 100644 index 631c9c2..0000000 --- a/resources/soc/rtl/MAC/rfifo.v +++ /dev/null @@ -1,439 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -module RFIFO ( - clk, - rst, - ramdata, - ramaddr, - fifore, - ffo, - rfo, - mfo, - tlo, - reo, - dbo, - ceo, - ovo, - cso, - flo, - fifodata, - cachere, - cachene, - cachenf, - radg, - rireq, - ffi, - rfi, - mfi, - tli, - rei, - dbi, - cei, - ovi, - csi, - fli, - wadg, - riack - ); - - parameter DATAWIDTH = 32; - parameter DATADEPTH = 32; - parameter FIFODEPTH = 9; - parameter CACHEDEPTH = 2; - - input clk; - input rst; - - input [DATAWIDTH - 1:0] ramdata; - output [FIFODEPTH - 1:0] ramaddr; - wire [FIFODEPTH - 1:0] ramaddr; - - input fifore; - output ffo; - wire ffo; - output rfo; - wire rfo; - output mfo; - wire mfo; - output tlo; - wire tlo; - output reo; - wire reo; - output dbo; - wire dbo; - output ceo; - wire ceo; - output ovo; - wire ovo; - output cso; - wire cso; - output [13:0] flo; - wire [13:0] flo; - output [DATAWIDTH - 1:0] fifodata; - wire [DATAWIDTH - 1:0] fifodata; - - input cachere; - output cachene; - wire cachene; - - output cachenf; - wire cachenf; - output [FIFODEPTH - 1:0] radg; - reg [FIFODEPTH - 1:0] radg; - - input rireq; - input ffi; - input rfi; - input mfi; - input tli; - input rei; - input dbi; - input cei; - input ovi; - input csi; - input [13:0] fli; - input [FIFODEPTH - 1:0] wadg; - output riack; - wire riack; - - - parameter CSWIDTH = 23; - reg [CSWIDTH - 1:0] csmem[(1'b1 << CACHEDEPTH) - 1:0]; - wire cswe; - wire csre; - reg csnf; - reg csne; - reg [CACHEDEPTH - 1:0] cswad; - reg [CACHEDEPTH - 1:0] cswadi; - reg [CACHEDEPTH - 1:0] csrad; - reg [CACHEDEPTH - 1:0] csrad_r; - wire [CSWIDTH - 1:0] csdi; - wire [CSWIDTH - 1:0] csdo; - - reg [FIFODEPTH - 1:0] stat; - reg [FIFODEPTH - 1:0] rad_c; - reg [FIFODEPTH - 1:0] rad; - reg [FIFODEPTH - 1:0] wad_c; - reg [FIFODEPTH - 1:0] wad; - reg [FIFODEPTH - 1:0] wadg_0_r; - reg [FIFODEPTH - 1:0] wadg_r; - reg [13:0] flibin_c; - reg [13:0] flibin; - reg [13:0] fli_r; - - reg rireq_r; - reg iriack; - - wire [FIFODEPTH - 1:0] fzero; - - always @(posedge clk) - begin : csmem_reg_proc - if (rst) - begin : csmem_reset - integer i; - for(i = ((1'b1 << CACHEDEPTH) - 1); i >= 0; i = i - 1) - begin - csmem[i] <= {CSWIDTH{1'b0}}; - end - csrad_r <= csrad ; - end - else - begin - csmem[cswad] <= csdi ; - csrad_r <= csrad ; - end - end - - always @(posedge clk) - begin : cswad_reg_proc - if (rst) - begin - cswad <= {CACHEDEPTH{1'b1}} ; - end - else - begin - if (cswe) - begin - cswad <= cswad + 1 ; - end - end - end - - always @(posedge clk) - begin : csrad_reg_proc - if (rst) - begin - csrad <= {CACHEDEPTH{1'b1}} ; - end - else - begin - if (csre) - begin - csrad <= csrad + 1 ; - end - end - end - - always @(posedge clk) - begin : csne_reg_proc - if (rst) - begin - csne <= 1'b0 ; - end - else - begin - if (cswad == csrad) - begin - csne <= 1'b0 ; - end - else - begin - csne <= 1'b1 ; - end - end - end - - always @(cswad) - begin : cswadi_drv - cswadi <= cswad + 1; - end - - always @(posedge clk) - begin : csnf_reg_proc - if (rst) - begin - csnf <= 1'b0 ; - end - else - begin - if (cswadi == csrad) - begin - csnf <= 1'b0 ; - end - else - begin - csnf <= 1'b1 ; - end - end - end - - always @(fli_r) - begin : flibin_proc - reg[13:0] flibin_v; - flibin_v[13] = fli_r[13]; - begin : flibin_loop - integer i; - for(i = 12; i >= 0; i = i - 1) - begin - flibin_v[i] = flibin_v[i + 1] ^ fli_r[i]; - end - end - flibin_c = flibin_v ; - end - - always @(posedge clk) - begin : flibin_reg_proc - if (rst) - begin - flibin <= {14{1'b0}} ; - fli_r <= {14{1'b0}} ; - end - else - begin - flibin <= flibin_c ; - fli_r <= fli ; - end - end - - assign cachene = csne ; - - assign cachenf = csnf ; - - assign cswe = rireq_r & ~iriack ; - - assign csdo = csmem[csrad_r] ; - - assign csdi = {ffi, rfi, mfi, tli, rei, dbi, cei, ovi, csi, flibin} ; - - assign ffo = csdo[CSWIDTH - 1] ; - - assign rfo = csdo[CSWIDTH - 2] ; - - assign mfo = csdo[CSWIDTH - 3] ; - - assign tlo = csdo[CSWIDTH - 4] ; - - assign reo = csdo[CSWIDTH - 5] ; - - assign dbo = csdo[CSWIDTH - 6] ; - - assign ceo = csdo[CSWIDTH - 7] ; - - assign ovo = csdo[CSWIDTH - 8] ; - - assign cso = csdo[CSWIDTH - 9]; - - assign flo = csdo[13:0] ; - - assign csre = cachere ; - - always @(posedge clk) - begin : rireq_reg_proc - if (rst) - begin - rireq_r <= 1'b0 ; - end - else - begin - rireq_r <= rireq ; - end - end - - always @(posedge clk) - begin : irecack_reg_proc - if (rst) - begin - iriack <= 1'b0 ; - end - else - begin - iriack <= rireq_r ; - end - end - - assign riack = iriack ; - - always @(rad or fifore) - begin : rad_proc - if (fifore) - begin - rad_c <= rad + 1 ; - end - else - begin - rad_c <= rad ; - end - end - - always @(posedge clk) - begin : rad_reg_proc - if (rst) - begin - rad <= {FIFODEPTH{1'b0}} ; - end - else - begin - rad <= rad_c ; - end - end - - always @(posedge clk) - begin : radg_reg_proc - if (rst) - begin - radg <= {FIFODEPTH{1'b0}} ; - end - else - begin - radg[FIFODEPTH - 1] <= rad[FIFODEPTH - 1] ; - begin : radg_loop - integer i; - for(i = FIFODEPTH - 2; i >= 0; i = i - 1) - begin - radg[i] <= rad[i] ^ rad[i + 1] ; - end - end - end - end - - always @(posedge clk) - begin : wadg_reg_proc - if (rst) - begin - wadg_0_r <= {FIFODEPTH{1'b0}} ; - wadg_r <= {FIFODEPTH{1'b0}} ; - end - else - begin - wadg_0_r <= wadg; - wadg_r <= wadg_0_r; - end - end - - always @(wadg_r) - begin : wad_proc - reg[FIFODEPTH - 1:0] wad_v; - wad_v[FIFODEPTH - 1] = wadg_r[FIFODEPTH - 1]; - begin : wad_loop - integer i; - for(i = FIFODEPTH - 2; i >= 0; i = i - 1) - begin - wad_v[i] = wad_v[i + 1] ^ wadg_r[i]; - end - end - wad_c = wad_v ; - end - - always @(posedge clk) - begin : ad_reg_proc - if (rst) - begin - wad <= {FIFODEPTH{1'b0}} ; - end - else - begin - wad <= wad_c ; - end - end - - always @(posedge clk) - begin : stat_reg_proc - if (rst) - begin - stat <= {FIFODEPTH{1'b0}} ; - end - else - begin - stat <= wad - rad ; - end - end - - assign ramaddr = rad_c ; - - assign fifodata = ramdata ; - - - assign fzero = {FIFODEPTH{1'b0}}; - -endmodule diff --git a/resources/soc/rtl/MAC/rlsm.v b/resources/soc/rtl/MAC/rlsm.v deleted file mode 100644 index 72bad4d..0000000 --- a/resources/soc/rtl/MAC/rlsm.v +++ /dev/null @@ -1,1328 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -module RLSM ( - clk, - rst, - fifodata, - fifore, - cachere, - dmaack, - dmaeob, - dmadatai, - dmaaddr, - dmareq, - dmawr, - dmacnt, - dmaaddro, - dmadatao, - rprog, - rcpoll, - fifocne, - ff, - rf, - mf, - db, - re, - ce, - tl, - ftp, - ov, - cs, - length, - pbl, - dsl, - rpoll, - rdbadc, - rdbad, - rpollack, - rcompack, - bufack, - des, - fbuf, - stat, - ru, - rcomp, - bufcomp, - stopi, - stopo, - insert_en_i - ); - - parameter DATAWIDTH = 32; - parameter DATADEPTH = 32; - parameter FIFODEPTH = 9; - - `include "utility.v" - - input clk; - input rst; - - input [DATAWIDTH - 1:0] fifodata; - output fifore; - wire fifore; - output cachere; - wire cachere; - - input dmaack; - input dmaeob; - input [DATAWIDTH - 1:0] dmadatai; - input [DATADEPTH - 1:0] dmaaddr; - output dmareq; - wire dmareq; - output dmawr; - wire dmawr; - output [FIFODEPTH_MAX - 1:0] dmacnt; - reg [FIFODEPTH_MAX - 1:0] dmacnt; - output [DATADEPTH - 1:0] dmaaddro; - reg [DATADEPTH - 1:0] dmaaddro; - output [DATAWIDTH - 1:0] dmadatao; - reg [DATAWIDTH - 1:0] dmadatao; - - input rprog; - input rcpoll; - input fifocne; - input ff; - input rf; - input mf; - input db; - input re; - input ce; - input tl; - input ftp; - input ov; - input cs; - input [13:0] length; - - input [5:0] pbl; - input [4:0] dsl; - input rpoll; - input rdbadc; - input [DATADEPTH - 1:0] rdbad; - output rpollack; - reg rpollack; - - input rcompack; - input bufack; - output des; - reg des; - output fbuf; - reg fbuf; - output stat; - reg stat; - output ru; - reg ru; - output rcomp; - reg rcomp; - output bufcomp; - reg bufcomp; - - input stopi; - output stopo; - reg stopo; - - input insert_en_i; - - - - reg [3:0] lsm_c; - reg [3:0] lsm; - reg [3:0] lsm_r; - reg own_c; - reg own; - reg rch; - reg rer; - reg rls; - reg rfs; - reg rde; - wire res_c; - reg [10:0] bs1; - reg [10:0] bs2; - - reg adwrite; - reg [DATADEPTH - 1:0] bad; - reg [DATADEPTH - 1:0] dad; - reg [10:0] bcnt; - reg [DATADEPTH - 1:0] statad; - reg [DATADEPTH - 1:0] tstatad; - reg dbadc_r; - - reg req_c; - reg req; - wire [2:0] dmaaddr20; - wire [1:0] addr10; - reg [DATADEPTH_MAX - 1:0] dataimax_r; - wire [31:0] fstat; - - reg rprog_r; - reg rcpoll_r; - reg rcpoll_r2; - reg whole; - - reg [13:0] fifolev_r; - reg [13:0] fbcnt; - reg [13:0] fbcnt_c; - reg [13:0] length_r; - wire ififore; - reg ififore_r; - reg icachere; - wire [FIFODEPTH_MAX - 1:0] bsmax; - wire [FIFODEPTH_MAX - 1:0] flmax; - wire [FIFODEPTH_MAX - 1:0] blmax; - reg fl_g_16; - reg fl_g_bs; - reg fl_g_bl; - reg bl_g_bs; - reg pblz; - - reg stop_r; - - wire [FIFODEPTH_MAX - 1:0] fzero_max; - wire [DATAWIDTH_MAX + 1:0] dmadatai_max; - wire [DATAWIDTH_MAX + 1:0] dzero_max; - - always @(posedge clk) - begin : dataimax_reg_proc - if (rst) - begin - dataimax_r <= {DATADEPTH_MAX{1'b1}} ; - end - else - begin - case (DATAWIDTH) - 8 : - begin - case (dmaaddr20) - 3'b000, 3'b100 : - begin - dataimax_r[7:0] <= dmadatai_max[DATAWIDTH-1:0] ; - end - 3'b001, 3'b101 : - begin - dataimax_r[15:8] <= dmadatai_max[DATAWIDTH-1:0] ; - end - 3'b010, 3'b110 : - begin - dataimax_r[23:16] <= dmadatai_max[DATAWIDTH-1:0] ; - end - default : - begin - dataimax_r[31:24] <= dmadatai_max[DATAWIDTH-1:0] ; - end - endcase - end - 16 : - begin - if (!(dmaaddr[1])) - begin - dataimax_r[15:0] <= dmadatai_max[DATAWIDTH-1:0] ; - end - else - begin - dataimax_r[31:16] <= dmadatai_max[DATAWIDTH-1:0] ; - end - end - default : - begin - dataimax_r <= dmadatai_max[31:0] ; - end - endcase - end - end - - always @(posedge clk) - begin : fifolev_reg_proc - if (rst) - begin - length_r <= {14{1'b0}} ; - fifolev_r <= {14{1'b0}} ; - fl_g_bs <= 1'b0 ; - fl_g_16 <= 1'b0 ; - fl_g_bl <= 1'b0 ; - bl_g_bs <= 1'b0 ; - pblz <= 1'b0 ; - end - else - begin - length_r <= length; - - fifolev_r <= length_r - fbcnt_c ; - - if (flmax >= bsmax) - begin - fl_g_bs <= 1'b1 ; - end - else - begin - fl_g_bs <= 1'b0 ; - end - - case (DATAWIDTH) - 8 : - begin - if (flmax > ({fzero_max[FIFODEPTH_MAX - 1:6], - 6'b111111})) - begin - fl_g_16 <= 1'b1 ; - end - else - begin - fl_g_16 <= 1'b0 ; - end - end - 16 : - begin - if (flmax > ({fzero_max[FIFODEPTH_MAX - 1:5], - 5'b11111})) - begin - fl_g_16 <= 1'b1 ; - end - else - begin - fl_g_16 <= 1'b0 ; - end - end - default : - begin - if (flmax > ({fzero_max[FIFODEPTH_MAX - 1:4], - 4'b1111})) - begin - fl_g_16 <= 1'b1 ; - end - else - begin - fl_g_16 <= 1'b0 ; - end - end - endcase - - if (flmax >= (blmax + 1'b1)) - begin - fl_g_bl <= 1'b1 ; - end - else - begin - fl_g_bl <= 1'b0 ; - end - - if (blmax >= bsmax) - begin - bl_g_bs <= 1'b1 ; - end - else - begin - bl_g_bs <= 1'b0 ; - end - - if (pbl == 6'b000000) - begin - pblz <= 1'b1 ; - end - else - begin - pblz <= 1'b0 ; - end - end - end - - assign flmax = (DATAWIDTH == 8) ? {fzero_max[FIFODEPTH_MAX - 1:14], - fifolev_r} : - (DATAWIDTH == 16) ? {fzero_max[FIFODEPTH_MAX - 1:13], - fifolev_r[13:1]} : - {fzero_max[FIFODEPTH_MAX - 1:12], - fifolev_r[13:2]} ; - - assign blmax = {fzero_max[FIFODEPTH_MAX - 1:6], pbl} ; - - assign bsmax = (DATAWIDTH == 8) ? {fzero_max[FIFODEPTH_MAX - 1:11], - bcnt} : - (DATAWIDTH == 16) ? {fzero_max[FIFODEPTH_MAX - 1:10], - bcnt[10:1]} : - {fzero_max[FIFODEPTH_MAX - 1:9], - bcnt[10:2]} ; - - always @(lsm or - fl_g_bs or - fl_g_bl or - bl_g_bs or - pblz or - blmax or - bsmax or - flmax or - fzero_max) - begin : dmacnt_proc - if (lsm == LSM_DES0 | - lsm == LSM_DES1 | - lsm == LSM_DES2 | - lsm == LSM_DES3 | - lsm == LSM_STAT | - lsm == LSM_FSTAT | - lsm == LSM_DES0P) - begin - case (DATAWIDTH) - 8 : - begin - dmacnt <= {fzero_max[FIFODEPTH_MAX - 1:3], 3'b100} ; - end - 16 : - begin - dmacnt <= {fzero_max[FIFODEPTH_MAX - 1:3], 3'b010} ; - end - default : - begin - dmacnt <= {fzero_max[FIFODEPTH_MAX - 1:3], 3'b001} ; - end - endcase - end - else - begin - if (pblz) - begin - if (fl_g_bs) - begin - dmacnt <= bsmax ; - end - else - begin - dmacnt <= flmax ; - end - end - else - begin - if (fl_g_bl) - begin - if (bl_g_bs) - begin - dmacnt <= bsmax ; - end - else - begin - dmacnt <= blmax ; - end - end - else - begin - if (fl_g_bs) - begin - dmacnt <= bsmax ; - end - else - begin - dmacnt <= flmax ; - end - end - end - end - end - - always @(req or - lsm or - lsm_c or - fifocne or - fl_g_bl or - fl_g_16 or - pblz or - whole or - rprog_r or - dmaack or - dmaeob or - flmax or - fzero_max) - begin : req_proc - case (lsm) - LSM_BUF1, LSM_BUF2 : - begin - if ((dmaack & dmaeob) | lsm_c==LSM_NXT) - begin - req_c <= 1'b0 ; - end - else if (fifocne | (rprog_r & ((fl_g_bl & !pblz) | - (fl_g_16 & pblz)))) - begin - req_c <= 1'b1 ; - end - else - begin - req_c <= req ; - end - end - LSM_DES0, LSM_DES1, LSM_DES2, - LSM_DES3, LSM_STAT, LSM_DES0P : - begin - if (dmaack) - begin - req_c <= 1'b0 ; - end - else - begin - req_c <= 1'b1 ; - end - end - LSM_FSTAT : - begin - if (dmaack | !whole | - (DATAWIDTH == 8 & flmax[1:0] != fzero_max[1:0]) - | - (DATAWIDTH == 16 & flmax[ 1] != fzero_max[1])) - begin - req_c <= 1'b0 ; - end - else - begin - req_c <= 1'b1 ; - end - end - default : - begin - req_c <= 1'b0 ; - end - endcase - end - - always @(posedge clk) - begin : req_reg_proc - if (rst) - begin - req <= 1'b0 ; - end - else - begin - req <= req_c ; - end - end - - always @(lsm or bad or dad or statad) - begin : dmaaddro_proc - case (lsm) - LSM_BUF1, LSM_BUF2 : - begin - dmaaddro <= bad ; - end - LSM_STAT, LSM_FSTAT : - begin - dmaaddro <= statad ; - end - default : - begin - dmaaddro <= dad ; - end - endcase - end - - wire [13:0] real_length; - assign real_length = (insert_en_i) ? (length - 2'b10) : length; - - assign fstat = {1'b0, ff, real_length, res_c, rde, - RDES0_RV[13:12], rf, mf, rfs, rls, tl, - cs, ftp, RDES0_RV[4], re, db, ce, ov} ; - - assign dmawr = (lsm == LSM_STAT | - lsm == LSM_FSTAT | - lsm == LSM_BUF1 | - lsm == LSM_BUF2) ? 1'b1 : 1'b0 ; - - always @(fifodata or lsm or addr10 or fstat) - begin : dmadatao_proc - if (lsm == LSM_BUF1 | lsm == LSM_BUF2) - begin - dmadatao <= fifodata ; - end - else - begin - case (DATAWIDTH) - 8 : - begin - case (addr10) - 2'b00 : - begin - dmadatao <= fstat[7:0] ; - end - 2'b01 : - begin - dmadatao <= fstat[15:8] ; - end - 2'b10 : - begin - dmadatao <= fstat[23:16] ; - end - default : - begin - dmadatao <= fstat[31:24] ; - end - endcase - end - 16 : - begin - if (addr10 == 2'b00) - begin - dmadatao <= fstat[15:0] ; - end - else - begin - dmadatao <= fstat[31:16] ; - end - end - default : - begin - dmadatao <= fstat ; - end - endcase - end - end - - assign dmareq = req ; - - always @(lsm or - rcpoll_r or - rcpoll_r2 or - rpoll or - dmaack or - dmaeob or - own_c or - bs1 or - bs2 or - whole or - rch or - stop_r or - own or - bcnt or - dbadc_r) - begin : lsm_proc - case (lsm) - LSM_IDLE : - begin - if (!dbadc_r & !stop_r & ((rcpoll_r & !rcpoll_r2) | rpoll)) - begin - lsm_c <= LSM_DES0 ; - end - else - begin - lsm_c <= LSM_IDLE ; - end - end - LSM_DES0 : - begin - if (dmaack & dmaeob) - begin - if (own_c) - begin - lsm_c <= LSM_DES1 ; - end - else - begin - lsm_c <= LSM_IDLE ; - end - end - else - begin - lsm_c <= LSM_DES0 ; - end - end - LSM_DES0P : - begin - if (dmaack & dmaeob) - begin - if (!own_c | whole) - begin - lsm_c <= LSM_FSTAT ; - end - else - begin - lsm_c <= LSM_STAT ; - end - end - else - begin - lsm_c <= LSM_DES0P ; - end - end - LSM_DES1 : - begin - if (dmaack & dmaeob) - begin - lsm_c <= LSM_DES2 ; - end - else - begin - lsm_c <= LSM_DES1 ; - end - end - LSM_DES2 : - begin - if (dmaack & dmaeob) - begin - if (bs1 == 11'b00000000000) - begin - lsm_c <= LSM_DES3 ; - end - else - begin - lsm_c <= LSM_BUF1 ; - end - end - else - begin - lsm_c <= LSM_DES2 ; - end - end - LSM_DES3 : - begin - if (dmaack & dmaeob) - begin - if (bs2 != 11'b00000000000 & !rch) - begin - lsm_c <= LSM_BUF2 ; - end - else - begin - lsm_c <= LSM_NXT ; - end - end - else - begin - lsm_c <= LSM_DES3 ; - end - end - LSM_BUF1 : - begin - if (whole | bcnt == 11'b00000000000) - begin - lsm_c <= LSM_DES3 ; - end - else if(dbadc_r) - begin - lsm_c <= LSM_IDLE ; - end - else - begin - lsm_c <= LSM_BUF1 ; - end - end - LSM_BUF2 : - begin - if (whole | bcnt == 11'b00000000000) - begin - lsm_c <= LSM_NXT ; - end - else if(dbadc_r) - begin - lsm_c <= LSM_IDLE ; - end - else - begin - lsm_c <= LSM_BUF2 ; - end - end - LSM_NXT : - begin - if (whole) - begin - if (stop_r) - begin - lsm_c <= LSM_FSTAT ; - end - else - begin - lsm_c <= LSM_DES0P ; - end - end - else - begin - lsm_c <= LSM_DES0P ; - end - end - LSM_STAT : - begin - if (dmaack & dmaeob) - begin - lsm_c <= LSM_DES1 ; - end - else - begin - lsm_c <= LSM_STAT ; - end - end - default : - begin - if (dmaack & dmaeob) - begin - if (own & !stop_r) - begin - lsm_c <= LSM_DES1 ; - end - else - begin - lsm_c <= LSM_IDLE ; - end - end - else - begin - lsm_c <= LSM_FSTAT ; - end - end - endcase - end - - always @(posedge clk) - begin : rlsm_reg_proc - if (rst) - begin - lsm <= LSM_IDLE ; - lsm_r <= LSM_IDLE ; - end - else - begin - lsm <= lsm_c ; - lsm_r <= lsm ; - end - end - - always @(posedge clk) - begin : rpollack_reg_proc - if (rst) - begin - rpollack <= 1'b0 ; - end - else - begin - if (rpoll & !dbadc_r) - begin - rpollack <= 1'b1 ; - end - else if (!rpoll) - begin - rpollack <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : bcnt_reg_proc - if (rst) - begin - bcnt <= {11{1'b1}} ; - end - else - begin - if (lsm == LSM_DES2) - begin - bcnt <= bs1 ; - end - else if (lsm == LSM_DES3) - begin - bcnt <= bs2 ; - end - else - begin - if (dmaack) - begin - case (DATAWIDTH) - 8 : - begin - bcnt <= bcnt - 1 ; - end - 16 : - begin - bcnt <= {(bcnt[10:1] - 1), 1'b0} ; - end - default : - begin - bcnt <= {(bcnt[10:2] - 1), 2'b00} ; - end - endcase - end - end - end - end - - always @(own or - dmaack or - dmaeob or - lsm or - dmadatai_max) - begin : own_proc - if (dmaack & dmaeob & (lsm == LSM_DES0 | lsm == LSM_DES0P)) - begin - own_c <= dmadatai_max[DATAWIDTH - 1] ; - end - else - begin - own_c <= own ; - end - end - - always @(posedge clk) - begin : des1_reg_proc - reg ft22; - if (rst) - begin - rer <= 1'b0 ; - rch <= 1'b0 ; - bs2 <= {11{1'b0}} ; - bs1 <= {11{1'b0}} ; - end - else - begin - if (lsm == LSM_DES1 & dmaack) - begin - case (DATAWIDTH) - 8 : - begin - case (dmaaddr20) - 3'b000, 3'b100 : - begin - bs1[7:0] <= dmadatai_max[7:0] ; - end - 3'b001, 3'b101 : - begin - bs1[10:8] <= dmadatai_max[2:0] ; - bs2[4:0] <= dmadatai_max[7:3] ; - end - 3'b010, 3'b110 : - begin - bs2[10:5] <= dmadatai_max[5:0] ; - end - default : - begin - rer <= dmadatai_max[1] ; - rch <= dmadatai_max[0] ; - end - endcase - end - 16 : - begin - case (dmaaddr20) - 3'b000, 3'b100 : - begin - bs1[10:0] <= dmadatai_max[10:0] ; - bs2[4:0] <= dmadatai_max[15:11] ; - end - default : - begin - bs2[10:5] <= dmadatai_max[5:0] ; - rer <= dmadatai_max[9] ; - rch <= dmadatai_max[8] ; - end - endcase - end - default : - begin - rer <= dmadatai_max[25] ; - rch <= dmadatai_max[24] ; - bs2 <= dmadatai_max[21:11] ; - bs1 <= dmadatai_max[10:0] ; - end - endcase - end - end - end - - always @(posedge clk) - begin : rdes_reg_proc - if (rst) - begin - own <= 1'b0 ; - rfs <= 1'b1 ; - rls <= 1'b0 ; - rde <= 1'b0 ; - end - else - begin - if (lsm == LSM_FSTAT & dmaack & dmaeob) - begin - rfs <= 1'b1 ; - end - else if (lsm == LSM_STAT & dmaack & dmaeob) - begin - rfs <= 1'b0 ; - end - - if (lsm == LSM_FSTAT) - begin - rls <= 1'b1 ; - end - else - begin - rls <= 1'b0 ; - end - - if (lsm == LSM_FSTAT & !whole) - begin - rde <= 1'b1 ; - end - else if (lsm == LSM_IDLE) - begin - rde <= 1'b0 ; - end - - own <= own_c ; - end - end - - assign res_c = rf | ce | rde | cs | tl ; - - always @(posedge clk) - begin : adwrite_reg_proc - if (rst) - begin - adwrite <= 1'b0 ; - dbadc_r <= 1'b0 ; - end - else - begin - if (dmaack & dmaeob) - begin - adwrite <= 1'b1 ; - end - else - begin - adwrite <= 1'b0 ; - end - - dbadc_r <= rdbadc ; - end - end - - always @(posedge clk) - begin : dad_reg_proc - if (rst) - begin - dad <= {DATADEPTH{1'b1}} ; - end - else - begin - if (dbadc_r) - begin - dad <= rdbad ; - end - else if (adwrite & lsm == LSM_NXT & rch) - begin - dad <= dataimax_r[DATADEPTH - 1:0] ; - end - else if (adwrite) - begin - case (lsm_r) - LSM_DES3 : - begin - if (rer) - begin - dad <= rdbad ; - end - else - begin - dad <= dmaaddr + ({dsl, 2'b00}) ; - end - end - LSM_DES0, LSM_DES0P : - begin - if (own) - begin - dad <= dmaaddr ; - end - end - LSM_DES2 : - begin - dad <= dmaaddr ; - end - LSM_DES1 : - begin - dad <= dmaaddr ; - end - default : - begin - dad <= dad ; - end - endcase - end - end - end - - always @(posedge clk) - begin : bad_reg_proc - if (rst) - begin - bad <= {DATADEPTH{1'b1}} ; - end - else - begin - if (adwrite) - begin - if (lsm_r == LSM_BUF1 | lsm_r == LSM_BUF2) - begin - bad <= dmaaddr ; - end - else - begin - bad <= dataimax_r[DATADEPTH - 1:0] ; - end - end - end - end - - always @(posedge clk) - begin : stataddr_reg_proc - if (rst) - begin - tstatad <= {DATADEPTH{1'b1}} ; - statad <= {DATADEPTH{1'b1}} ; - end - else - begin - if (lsm == LSM_DES1 & adwrite) - begin - statad <= tstatad ; - end - - if ((lsm == LSM_DES0 | lsm == LSM_DES0P) & dmaack & dmaeob) - begin - tstatad <= dad ; - end - end - end - - always @(fbcnt or icachere or ififore) - begin : fbcnt_proc - if (icachere) - begin - fbcnt_c <= {14{1'b0}} ; - end - else - begin - if (ififore) - begin - case (DATAWIDTH) - 8 : - begin - fbcnt_c <= fbcnt + 1 ; - end - 16 : - begin - fbcnt_c <= fbcnt + 2'b10 ; - end - default : - begin - fbcnt_c <= fbcnt + 3'b100 ; - end - endcase - end - else - begin - fbcnt_c <= fbcnt; - end - end - end - - always @(posedge clk) - begin : fbcnt_reg_proc - if(rst) - begin - fbcnt <= {14{1'b0}}; - end - else - begin - fbcnt <= fbcnt_c; - end - end - - always @(fbcnt or length or fifocne) - begin : whole_proc - if (fbcnt >= length & fifocne) - begin - whole <= 1'b1 ; - end - else - begin - whole <= 1'b0 ; - end - end - - assign ififore = (((lsm == LSM_BUF1 | lsm == LSM_BUF2) & dmaack) | - (lsm == LSM_FSTAT & !whole & - flmax != fzero_max[14:0] & !ififore_r) | - (lsm == LSM_FSTAT & !whole & - fifocne & !ififore_r)) ? 1'b1 : 1'b0 ; - - always @(posedge clk) - begin : ififore_reg_proc - if (rst) - begin - ififore_r <= 1'b0 ; - icachere <= 1'b0 ; - end - else - begin - ififore_r <= ififore ; - - if (lsm == LSM_FSTAT & dmaack & dmaeob) - begin - icachere <= 1'b1 ; - end - else - begin - icachere <= 1'b0 ; - end - end - end - - assign fifore = ififore ; - - assign cachere = icachere ; - - always @(posedge clk) - begin : rprog_reg_proc - if (rst) - begin - rprog_r <= 1'b0 ; - rcpoll_r <= 1'b0 ; - rcpoll_r2 <= 1'b0 ; - end - else - begin - rprog_r <= rprog ; - rcpoll_r <= rcpoll ; - if (lsm == LSM_IDLE) - begin - rcpoll_r2 <= rcpoll_r ; - end - end - end - - always @(posedge clk) - begin : stat_reg_drv - if (rst) - begin - des <= 1'b0 ; - fbuf <= 1'b0 ; - stat <= 1'b0 ; - rcomp <= 1'b0 ; - bufcomp <= 1'b0 ; - ru <= 1'b0 ; - end - else - begin - if (lsm == LSM_DES0 | - lsm == LSM_DES1 | - lsm == LSM_DES2 | - lsm == LSM_DES3 | - lsm == LSM_DES0P) - begin - des <= 1'b1 ; - end - else - begin - des <= 1'b0 ; - end - - if ((lsm == LSM_BUF1 | lsm == LSM_BUF2) & req) - begin - fbuf <= 1'b1 ; - end - else - begin - fbuf <= 1'b0 ; - end - - if (lsm == LSM_STAT | lsm == LSM_FSTAT) - begin - stat <= 1'b1 ; - end - else - begin - stat <= 1'b0 ; - end - - if (lsm == LSM_FSTAT & dmaack & dmaeob) - begin - rcomp <= 1'b1 ; - end - else if (rcompack) - begin - rcomp <= 1'b0 ; - end - - if (lsm == LSM_STAT & dmaack & dmaeob) - begin - bufcomp <= 1'b1 ; - end - else if (bufack) - begin - bufcomp <= 1'b0 ; - end - - if (own & !own_c) - begin - ru <= 1'b1 ; - end - else if (own) - begin - ru <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : stop_reg_proc - if (rst) - begin - stop_r <= 1'b1 ; - stopo <= 1'b1 ; - end - else - begin - stop_r <= stopi ; - - if (stop_r & (lsm == LSM_IDLE | - ((lsm == LSM_BUF1 | lsm == LSM_BUF2) & - !fifocne & !rprog_r))) - begin - stopo <= 1'b1 ; - end - else - begin - stopo <= 1'b0 ; - end - end - end - - assign dzero_max = {DATAWIDTH_MAX{1'b0}} ; - - assign fzero_max = {FIFODEPTH_MAX{1'b0}} ; - - assign dmadatai_max = {dzero_max[DATAWIDTH_MAX+1:DATAWIDTH], - dmadatai}; - - assign dmaaddr20 = dmaaddr[2:0] ; - - assign addr10 = dmaaddr[1:0] ; - -endmodule diff --git a/resources/soc/rtl/MAC/rstc.v b/resources/soc/rtl/MAC/rstc.v deleted file mode 100644 index 7bedc55..0000000 --- a/resources/soc/rtl/MAC/rstc.v +++ /dev/null @@ -1,158 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -module RSTC ( - clkdma, - clkcsr, - clkt, - clkr, - rstcsr, - rstsoft, - rsttc, - rstrc, - rstdmao, - rstcsro - ); - - input clkdma; - input clkcsr; - input clkt; - input clkr; - - input rstcsr; - input rstsoft; - output rsttc; - reg rsttc; - output rstrc; - reg rstrc; - output rstdmao; - reg rstdmao; - output rstcsro; - reg rstcsro; - - - reg rstsoft_rc1; - reg rstsoft_rc2; - reg rstsoft_rc3; - reg rstsoft_tc1; - reg rstsoft_tc2; - reg rstsoft_tc3; - reg rstsoft_dma1; - reg rstsoft_dma2; - reg rstsoft_dma3; - reg rstsoft_csr; - reg rstsoft_dma_csr1; - reg rstsoft_dma_csr2; - reg rstsoft_rc_csr1; - reg rstsoft_rc_csr2; - reg rstsoft_tc_csr1; - reg rstsoft_tc_csr2; - reg rstcsr_r1; - reg rstcsr_r2; - reg rstcsr_tc1; - reg rstcsr_tc2; - reg rstcsr_rc1; - reg rstcsr_rc2; - reg rstcsr_dma1; - reg rstcsr_dma2; - - - always @(posedge clkcsr) - begin : rstsoft_csr_reg_proc - if (rstcsr_r2) - begin - rstsoft_csr <= 1'b0 ; - rstsoft_dma_csr1 <= 1'b0 ; - rstsoft_dma_csr2 <= 1'b0 ; - rstsoft_tc_csr1 <= 1'b0 ; - rstsoft_tc_csr2 <= 1'b0 ; - rstsoft_rc_csr1 <= 1'b0 ; - rstsoft_rc_csr2 <= 1'b0 ; - end - else - begin - if (rstsoft) - begin - rstsoft_csr <= 1'b1 ; - end - else if (rstsoft_rc_csr2 & rstsoft_tc_csr2 & rstsoft_dma_csr2) - begin - rstsoft_csr <= 1'b0 ; - end - rstsoft_dma_csr1 <= rstsoft_dma3; - rstsoft_dma_csr2 <= rstsoft_dma_csr1; - rstsoft_tc_csr1 <= rstsoft_tc3; - rstsoft_tc_csr2 <= rstsoft_tc_csr1; - rstsoft_rc_csr1 <= rstsoft_rc3; - rstsoft_rc_csr2 <= rstsoft_rc_csr1; - end - end - - always @(posedge clkcsr) - begin : rstcsro_reg_proc - rstcsr_r1 <= rstcsr; - rstcsr_r2 <= rstcsr_r1; - rstcsro <= rstcsr_r2 | rstsoft_csr; - end - - always @(posedge clkr) - begin : rstrc_reg_proc - rstcsr_rc1 <= rstcsr; - rstcsr_rc2 <= rstcsr_rc1; - rstsoft_rc1 <= rstsoft_csr; - rstsoft_rc2 <= rstsoft_rc1; - rstsoft_rc3 <= rstsoft_rc2; - rstrc <= rstcsr_rc2 | rstsoft_rc2; - end - - always @(posedge clkt) - begin : rsttc_proc - rstcsr_tc1 <= rstcsr; - rstcsr_tc2 <= rstcsr_tc1; - rstsoft_tc1 <= rstsoft_csr; - rstsoft_tc2 <= rstsoft_tc1; - rstsoft_tc3 <= rstsoft_tc2; - rsttc <= rstcsr_tc2 | rstsoft_tc2; - end - - always @(posedge clkdma) - begin : rstdma_reg_proc - rstcsr_dma1 <= rstcsr; - rstcsr_dma2 <= rstcsr_dma1; - rstsoft_dma1 <= rstsoft_csr; - rstsoft_dma2 <= rstsoft_dma1; - rstsoft_dma3 <= rstsoft_dma2; - rstdmao <= rstcsr_dma2 | rstsoft_dma2; - end - -endmodule diff --git a/resources/soc/rtl/MAC/tc.v b/resources/soc/rtl/MAC/tc.v deleted file mode 100644 index 337157a..0000000 --- a/resources/soc/rtl/MAC/tc.v +++ /dev/null @@ -1,1296 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -module TC ( - clk, - rst, - txen, - txer, - txd, - ramdata, - ramaddr, - wadg, - radg, - dpd, - ac, - sofreq, - eofreq, - tiack, - lastbe, - eofadg, - tireq, - ur, - de, - coll, - carrier, - bkoff, - tpend, - tprog, - preamble, - stopi, - stopo, - tcsack, - tcsreq - ); - - parameter FIFODEPTH = 9; - parameter DATAWIDTH = 32; - - `include "utility.v" - - input clk; - input rst; - - output txen; - reg txen; - output txer; - wire txer; - output [MIIWIDTH - 1:0] txd; - reg [MIIWIDTH - 1:0] txd; - - input [DATAWIDTH - 1:0] ramdata; - output [FIFODEPTH - 1:0] ramaddr; - wire [FIFODEPTH - 1:0] ramaddr; - - input [FIFODEPTH - 1:0] wadg; - output [FIFODEPTH - 1:0] radg; - wire [FIFODEPTH - 1:0] radg; - - input dpd; - input ac; - input sofreq; - input eofreq; - input tiack; - input [DATAWIDTH / 8 - 1:0] lastbe; - input [FIFODEPTH - 1:0] eofadg; - output tireq; - reg tireq; - output ur; - wire ur; - output de; - reg de; - - input coll; - input carrier; - input bkoff; - output tpend; - wire tpend; - output tprog; - reg tprog; - output preamble; - reg preamble; - - input stopi; - output stopo; - reg stopo; - - input tcsack; - output tcsreq; - reg tcsreq; - - - reg re_c; - reg re; - reg empty_c; - reg empty; - reg [FIFODEPTH - 1:0] rad_r; - reg [FIFODEPTH - 1:0] rad; - reg [FIFODEPTH - 1:0] iradg; - reg [FIFODEPTH - 1:0] wadg_0_r; - reg [FIFODEPTH - 1:0] iwadg; - reg [FIFODEPTH - 1:0] iwad_c; - reg [FIFODEPTH - 1:0] iwad; - reg [FIFODEPTH - 1:0] sofad; - reg [FIFODEPTH - 1:0] eofadg_r; - reg sofreq_r; - reg eofreq_r; - reg whole; - reg eof; - reg [DATAWIDTH - 1:0] ramdata_r; - - reg [MIIWIDTH - 1:0] itxd0; - reg [DATAWIDTH - 1:0] pmux; - reg [DATAWIDTH - 1:0] datamux_c; - wire [DATAWIDTH_MAX + 1:0] datamux_c_max; - reg txen1; - reg txen_rise; - reg [MIIWIDTH - 1:0] txd_rise; - - reg [3:0] tsm_c; - reg [3:0] tsm; - reg nset; - reg [3:0] ncnt; - wire [1:0] ncnt10; - wire [2:0] ncnt20; - reg [6:0] brel; - reg bset; - reg [6:0] bcnt; - reg bz; - reg nopad; - reg crcgen; - reg crcsend; - reg [31:0] crc_c; - reg [31:0] crc; - reg [31:0] crcneg_c; - reg itprog; - reg itpend; - reg iur; - reg iti; - reg tiack_r; - reg [3:0] ifscnt; - - reg tcsack_r; - reg [7:0] tcscnt; - reg tcs; - - reg ifs1p; - reg ifs2p; - wire defer; - - reg bkoff_r; - - reg stop_r; - wire [3:0] hnibble; - wire [MIIWIDTH_MAX + 1:0] itxd0_max; - wire [MIIWIDTH_MAX + 1:0] itxd0zero_max; - wire [DATAWIDTH_MAX + 1:0] dzero_max; - - always @(posedge clk) - begin : faddr_reg_proc - if (rst) - begin - rad <= {FIFODEPTH{1'b0}} ; - rad_r <= {FIFODEPTH{1'b0}} ; - iradg <= {FIFODEPTH{1'b0}} ; - sofad <= {FIFODEPTH{1'b0}} ; - eofadg_r <= {FIFODEPTH{1'b0}} ; - iwad <= {FIFODEPTH{1'b0}} ; - wadg_0_r <= {FIFODEPTH{1'b0}} ; - iwadg <= {FIFODEPTH{1'b0}} ; - end - else - begin - if (bkoff_r) - begin - rad <= sofad ; - end - else if (re_c) - begin - rad <= rad + 1 ; - end - else if (eof & tsm == TSM_FLUSH) - begin - rad <= iwad ; - end - - rad_r <= rad ; - - iradg <= rad ^ {1'b0, rad[FIFODEPTH - 1:1]} ; - - if (tsm == TSM_IDLE_TCSMT) - begin - sofad <= rad_r ; - end - - eofadg_r <= eofadg ; - - iwad <= iwad_c ; - - wadg_0_r <= wadg; - if (eofreq_r) - begin - iwadg <= eofadg_r ; - end - else - begin - iwadg <= wadg_0_r ; - end - end - end - - always @(iwadg) - begin : iwad_proc - reg[FIFODEPTH - 1:0] wad_v; - wad_v[FIFODEPTH - 1] = iwadg[FIFODEPTH - 1]; - begin : iwad_loop - integer i; - for(i = FIFODEPTH - 2; i >= 0; i = i - 1) - begin - wad_v[i] = wad_v[i + 1] ^ iwadg[i]; - end - end - iwad_c = wad_v ; - end - - always @(rad or iwad) - begin : empty_proc - if (rad == iwad) - begin - empty_c <= 1'b1 ; - end - else - begin - empty_c <= 1'b0 ; - end - end - - always @(posedge clk) - begin : empty_reg_proc - if (rst) - begin - empty <= 1'b1 ; - end - else - begin - empty <= empty_c ; - end - end - - always @(tsm or empty_c or ncnt) - begin : re_proc - if ((tsm == TSM_INFO | - tsm == TSM_SFD | - tsm == TSM_FLUSH) & !empty_c & - ((DATAWIDTH == 8 & !(ncnt[0])) | - (DATAWIDTH == 16 & ncnt[1:0] == 2'b10) | - (DATAWIDTH == 32 & ncnt[2:0] == 3'b110))) - begin - re_c <= 1'b1 ; - end - else - begin - re_c <= 1'b0 ; - end - end - - always @(posedge clk) - begin : re_reg_proc - if (rst) - begin - re <= 1'b0 ; - end - else - begin - re <= re_c ; - end - end - - assign ramaddr = rad ; - - assign radg = iradg ; - - always @(posedge clk) - begin : whole_reg_proc - if (rst) - begin - whole <= 1'b0 ; - end - else - begin - if (iti) - begin - whole <= 1'b0 ; - end - else if (eofreq_r) - begin - whole <= 1'b1 ; - end - end - end - - always @(posedge clk) - begin : se_reg_proc - if (rst) - begin - sofreq_r <= 1'b0 ; - eofreq_r <= 1'b0 ; - end - else - begin - sofreq_r <= sofreq ; - eofreq_r <= eofreq ; - end - end - - always @(tsm or - itpend or - bkoff_r or - defer or bz or - ncnt or dpd or - iur or - hnibble or - ac or - empty or - whole or - tiack_r or - nopad or - coll or - eof) - begin : tsm_proc - case (tsm) - TSM_IDLE_TCSMT : - begin - if (itpend & !bkoff_r & !defer) - begin - tsm_c <= TSM_PREA ; - end - else - begin - tsm_c <= TSM_IDLE_TCSMT ; - end - end - TSM_PREA : - begin - if (bz & (ncnt[0])) - begin - tsm_c <= TSM_SFD ; - end - else - begin - tsm_c <= TSM_PREA ; - end - end - TSM_SFD : - begin - if (bz & (ncnt[0])) - begin - tsm_c <= TSM_INFO ; - end - else - begin - tsm_c <= TSM_SFD ; - end - end - TSM_INFO : - begin - if (coll) - begin - tsm_c <= TSM_JAM ; - end - else if (empty) - begin - if (!whole & ncnt == hnibble) - begin - tsm_c <= TSM_JAM ; - end - else if (eof & (nopad | dpd)) - begin - if (ac) - begin - tsm_c <= TSM_INT ; - end - else - begin - tsm_c <= TSM_CRC ; - end - end - else if (eof) - begin - tsm_c <= TSM_PAD ; - end - else - begin - tsm_c <= TSM_INFO ; - end - end - else - begin - tsm_c <= TSM_INFO ; - end - end - TSM_PAD : - begin - if (coll) - begin - tsm_c <= TSM_JAM ; - end - else if (nopad & (ncnt[0])) - begin - tsm_c <= TSM_CRC ; - end - else - begin - tsm_c <= TSM_PAD ; - end - end - TSM_CRC : - begin - if (coll) - begin - tsm_c <= TSM_JAM ; - end - else if (bz & (ncnt[0])) - begin - tsm_c <= TSM_INT ; - end - else - begin - tsm_c <= TSM_CRC ; - end - end - TSM_JAM : - begin - if (bz & (ncnt[0])) - begin - if (!bkoff_r | iur) - begin - tsm_c <= TSM_FLUSH ; - end - else - begin - tsm_c <= TSM_IDLE_TCSMT ; - end - end - else - begin - tsm_c <= TSM_JAM ; - end - end - TSM_FLUSH : - begin - if (whole & empty) - begin - tsm_c <= TSM_INT ; - end - else - begin - tsm_c <= TSM_FLUSH ; - end - end - default : - begin - if (tiack_r) - begin - tsm_c <= TSM_IDLE_TCSMT ; - end - else - begin - tsm_c <= TSM_INT ; - end - end - endcase - end - - always @(posedge clk) - begin : tsm_reg_proc - if (rst) - begin - tsm <= TSM_IDLE_TCSMT ; - end - else - begin - tsm <= tsm_c ; - end - end - - assign defer = ifs1p | ifs2p ; - - always @(posedge clk) - begin : ifs_reg_proc - if (rst) - begin - ifs1p <= 1'b0 ; - ifs2p <= 1'b0 ; - ifscnt <= IFS1_TIME ; - end - else - begin - if (!itprog & !ifs1p & !ifs2p & ifscnt != 4'b0000) - begin - ifs1p <= 1'b1 ; - end - else if (ifscnt == 4'b0000 | ifs2p) - begin - ifs1p <= 1'b0 ; - end - - if (ifs1p & ifscnt == 4'b0000) - begin - ifs2p <= 1'b1 ; - end - else if (ifs2p & ifscnt == 4'b0000) - begin - ifs2p <= 1'b0 ; - end - - if (itprog | - (carrier & ifs1p) | - (carrier & ifscnt == 4'b0000 & !itpend) | - (carrier & ifscnt == 4'b0000 & bkoff_r)) - begin - ifscnt <= IFS1_TIME ; - end - else if (ifs1p & ifscnt == 4'b0000) - begin - ifscnt <= IFS2_TIME ; - end - else if (ifscnt != 4'b0000) - begin - ifscnt <= ifscnt - 1 ; - end - end - end - - always @(posedge clk) - begin : de_reg_proc - if (rst) - begin - de <= 1'b0 ; - end - else - begin - if (ifs1p & itpend & carrier & tsm == TSM_IDLE_TCSMT) - begin - de <= 1'b1 ; - end - else if (tiack_r) - begin - de <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : eof_reg_proc - if (rst) - begin - eof <= 1'b0 ; - end - else - begin - case (DATAWIDTH) - 8 : - begin - if (whole & !(ncnt[0])) - begin - eof <= 1'b1 ; - end - else - begin - eof <= 1'b0 ; - end - end - 16 : - begin - if (whole & ((lastbe == 2'b11 & ncnt[1:0] == 2'b10) | - (lastbe == 2'b01 & ncnt[1:0] == 2'b00))) - begin - eof <= 1'b1 ; - end - else - begin - eof <= 1'b0 ; - end - end - default : - begin - if (whole & ((lastbe == 4'b1111 & ncnt[2:0] == 3'b110) | - (lastbe == 4'b0111 & ncnt[2:0] == 3'b100) | - (lastbe == 4'b0011 & ncnt[2:0] == 3'b010) | - (lastbe == 4'b0001 & ncnt[2:0] == 3'b000))) - begin - eof <= 1'b1 ; - end - else - begin - eof <= 1'b0 ; - end - end - endcase - end - end - - always @(coll or tsm or ncnt or bz or empty or eof or nopad) - begin : bset_reg_proc - if ((coll & (tsm == TSM_INFO | - tsm == TSM_PAD | - tsm == TSM_CRC)) | - (tsm == TSM_PAD & nopad & !(ncnt[0])) | - (tsm == TSM_PREA & bz & !(ncnt[0])) | - (tsm == TSM_SFD & (ncnt[0])) | - (tsm == TSM_INFO & empty & eof & nopad) | - (tsm == TSM_IDLE_TCSMT)) - begin - bset <= 1'b1 ; - end - else - begin - bset <= 1'b0 ; - end - end - - always @(posedge clk) - begin : bcnt_reg_proc - if (rst) - begin - bcnt <= {7{1'b1}} ; - brel <= 7'b0000110 ; - bz <= 1'b0 ; - end - else - begin - if (bset) - begin - if(coll & tsm==TSM_INFO) - begin - bcnt <= 7'b0000011; - end - else - begin - bcnt <= brel ; - end - end - else if ((ncnt[0]) & !bz) - begin - bcnt <= bcnt - 1 ; - end - - case (tsm) - TSM_IDLE_TCSMT : - begin - brel <= 7'b0000110 ; - end - TSM_PREA : - begin - brel <= 7'b0000000 ; - end - TSM_SFD : - begin - if (coll) - begin - brel <= 7'b0000011 ; - end - else - begin - brel <= MIN_FRAME - 1 ; - end - end - default : - begin - brel <= 7'b0000011 ; - end - endcase - - if (bset & brel != 7'b0000000) - begin - bz <= 1'b0 ; - end - else if (bcnt == 7'b0000001 & (ncnt[0]) & !bz) - begin - bz <= 1'b1 ; - end - end - end - - always @(posedge clk) - begin : nopad_reg_proc - if (rst) - begin - nopad <= 1'b0 ; - end - else - begin - if ((tsm == TSM_INFO & bcnt == 7'b0000100 & !ac) | - (tsm == TSM_INFO & bcnt == 7'b0000001 & ac) | - (tsm == TSM_PAD & bcnt == 7'b0000100) | (dpd & !ac)) - begin - nopad <= 1'b1 ; - end - else if (tsm == TSM_IDLE_TCSMT) - begin - nopad <= 1'b0 ; - end - end - end - - always @(tsm or - itpend or - bkoff_r or - defer or - ncnt or - eof or - empty or - nopad) - begin : nset_proc - if ((tsm == TSM_IDLE_TCSMT & ~(itpend & !bkoff_r & !defer)) | - (tsm == TSM_INFO & empty & eof) | - (tsm == TSM_PAD & nopad & (ncnt[0]))) - begin - nset <= 1'b1 ; - end - else - begin - nset <= 1'b0 ; - end - end - - always @(posedge clk) - begin : ncnt_reg_proc - if (rst) - begin - ncnt <= {4{1'b0}} ; - end - else - begin - if (nset) - begin - ncnt <= {4{1'b0}} ; - end - else if (tsm != TSM_IDLE_TCSMT) - begin - ncnt <= ncnt + 1 ; - end - end - end - - always @(tsm or crc or itxd0_max or crcgen) - begin : crc_proc - if (tsm == TSM_PREA) - begin - crc_c <= {32{1'b1}} ; - end - else if (crcgen) - begin - crc_c[0] <= crc[28] ^ - itxd0_max[3] ; - crc_c[1] <= crc[28] ^ crc[29] ^ - itxd0_max[2] ^ itxd0_max[3] ; - crc_c[2] <= crc[28] ^ crc[29] ^ crc[30] ^ - itxd0_max[1] ^ itxd0_max[2] ^ itxd0_max[3] ; - crc_c[3] <= crc[29] ^ crc[30] ^ crc[31] ^ - itxd0_max[0] ^ itxd0_max[1] ^ itxd0_max[2] ; - crc_c[4] <= crc[0] ^ crc[28] ^ crc[30] ^ crc[31] ^ - itxd0_max[0] ^ itxd0_max[1] ^ itxd0_max[3] ; - crc_c[5] <= crc[1] ^ crc[28] ^ crc[29] ^ crc[31] ^ - itxd0_max[0] ^ itxd0_max[2] ^ itxd0_max[3] ; - crc_c[6] <= crc[2] ^ crc[29] ^ crc[30] ^ - itxd0_max[1] ^ itxd0_max[2] ; - crc_c[7] <= crc[3] ^ crc[28] ^ crc[30] ^ crc[31] ^ - itxd0_max[0] ^ itxd0_max[1] ^ itxd0_max[3] ; - crc_c[8] <= crc[4] ^ crc[28] ^ crc[29] ^ crc[31] ^ - itxd0_max[0] ^ itxd0_max[2] ^ itxd0_max[3] ; - crc_c[9] <= crc[5] ^ crc[29] ^ crc[30] ^ - itxd0_max[1] ^ itxd0_max[2] ; - crc_c[10] <= crc[6] ^ crc[28] ^ crc[30] ^ crc[31] ^ - itxd0_max[0] ^ itxd0_max[1] ^ itxd0_max[3] ; - crc_c[11] <= crc[7] ^ crc[28] ^ crc[29] ^ crc[31] ^ - itxd0_max[0] ^ itxd0_max[2] ^ itxd0_max[3] ; - crc_c[12] <= crc[8] ^ crc[28] ^ crc[29] ^ crc[30] ^ - itxd0_max[1] ^ itxd0_max[2] ^ itxd0_max[3] ; - crc_c[13] <= crc[9] ^ crc[29] ^ crc[30] ^ crc[31] ^ - itxd0_max[0] ^ itxd0_max[1] ^ itxd0_max[2] ; - crc_c[14] <= crc[10] ^ crc[30] ^ crc[31] ^ - itxd0_max[0] ^ itxd0_max[1] ; - crc_c[15] <= crc[11] ^ crc[31] ^ - itxd0_max[0] ; - crc_c[16] <= crc[12] ^ crc[28] ^ - itxd0_max[3] ; - crc_c[17] <= crc[13] ^ crc[29] ^ - itxd0_max[2] ; - crc_c[18] <= crc[14] ^ crc[30] ^ - itxd0_max[1] ; - crc_c[19] <= crc[15] ^ crc[31] ^ - itxd0_max[0] ; - crc_c[20] <= crc[16] ; - crc_c[21] <= crc[17] ; - crc_c[22] <= crc[18] ^ crc[28] ^ - itxd0_max[3] ; - crc_c[23] <= crc[19] ^ crc[28] ^ crc[29] ^ - itxd0_max[2] ^ itxd0_max[3] ; - crc_c[24] <= crc[20] ^ crc[29] ^ crc[30] ^ - itxd0_max[1] ^ itxd0_max[2] ; - crc_c[25] <= crc[21] ^ crc[30] ^ crc[31] ^ - itxd0_max[0] ^ itxd0_max[1] ; - crc_c[26] <= crc[22] ^ crc[28] ^ crc[31] ^ - itxd0_max[0] ^ itxd0_max[3] ; - crc_c[27] <= crc[23] ^ crc[29] ^ - itxd0_max[2] ; - crc_c[28] <= crc[24] ^ crc[30] ^ - itxd0_max[1] ; - crc_c[29] <= crc[25] ^ crc[31] ^ - itxd0_max[0] ; - crc_c[30] <= crc[26] ; - crc_c[31] <= crc[27] ; - end - else - begin - crc_c <= crc ; - end - end - - always @(posedge clk) - begin : crc_reg_proc - if (rst) - begin - crcgen <= 1'b0 ; - crcsend <= 1'b0 ; - crc <= {32{1'b1}} ; - end - else - begin - crc <= crc_c ; - - if (tsm == TSM_INFO | tsm == TSM_PAD) - begin - crcgen <= 1'b1 ; - end - else - begin - crcgen <= 1'b0 ; - end - - if (tsm == TSM_CRC) - begin - crcsend <= 1'b1 ; - end - else - begin - crcsend <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : tstate_reg_proc - if (rst) - begin - itprog <= 1'b0 ; - itpend <= 1'b0 ; - tprog <= 1'b0 ; - preamble <= 1'b0 ; - end - else - begin - if (tsm == TSM_INFO | tsm == TSM_PAD | tsm == TSM_CRC | - tsm == TSM_JAM) - begin - itprog <= 1'b1 ; - end - else - begin - itprog <= 1'b0 ; - end - - if (sofreq_r) - begin - itpend <= 1'b1 ; - end - else - begin - itpend <= 1'b0 ; - end - - if (tsm == TSM_PREA | - tsm == TSM_SFD | - tsm == TSM_INFO | - tsm == TSM_PAD | - tsm == TSM_CRC | - tsm == TSM_JAM) - begin - tprog <= 1'b1 ; - end - else - begin - tprog <= 1'b0 ; - end - - if (tsm == TSM_PREA | tsm == TSM_SFD) - begin - preamble <= 1'b1 ; - end - else - begin - preamble <= 1'b0 ; - end - end - end - - assign tpend = itpend ; - - always @(posedge clk) - begin : iti_reg_proc - if (rst) - begin - iti <= 1'b0 ; - tireq <= 1'b0 ; - tiack_r <= 1'b0 ; - end - else - begin - if (tsm == TSM_INT) - begin - iti <= 1'b1 ; - end - else if (tiack) - begin - iti <= 1'b0 ; - end - - tireq <= iti ; - tiack_r <= tiack ; - end - end - - always @(posedge clk) - begin : iur_reg_proc - if (rst) - begin - iur <= 1'b0 ; - end - else - begin - if (itprog & empty & !whole) - begin - iur <= 1'b1 ; - end - else if (tiack_r) - begin - iur <= 1'b0 ; - end - end - end - - assign ur = iur ; - - always @(tsm or ramdata_r or pmux) - begin : datamux_proc - if (tsm == TSM_INFO) - begin - datamux_c <= ramdata_r ; - end - else - begin - datamux_c <= pmux ; - end - end - - assign ncnt10 = ncnt[1:0] ; - - assign ncnt20 = ncnt[2:0] ; - - assign datamux_c_max = {dzero_max[DATAWIDTH_MAX + 1:DATAWIDTH], - datamux_c}; - - always @(crc) - begin : crcneg_proc - begin : crcneg_loop - integer i; - for(i = 31; i >= 0; i = i - 1) - begin - crcneg_c[i] <= ~crc[31 - i] ; - end - end - end - - always @(posedge clk) - begin : txd_proc - if (rst) - begin - txd_rise <= {MIIWIDTH{1'b1}} ; - pmux <= {DATAWIDTH{1'b1}} ; - itxd0 <= {MIIWIDTH{1'b1}} ; - ramdata_r <= {DATAWIDTH{1'b0}} ; - end - else - begin - case (tsm_c) - TSM_PAD : - begin - pmux <= PAD_PATTERN[63:64 - DATAWIDTH] ; - end - TSM_JAM : - begin - pmux <= JAM_PATTERN[63:64 - DATAWIDTH] ; - end - TSM_PREA : - begin - pmux <= PRE_PATTERN[63:64 - DATAWIDTH] ; - end - TSM_SFD : - begin - pmux <= SFD_PATTERN[63:64 - DATAWIDTH] ; - end - default : - begin - pmux <= {DATAWIDTH{1'b1}} ; - end - endcase - - case (DATAWIDTH) - 32 : - begin - case (ncnt20) - 3'b000 : - begin - itxd0 <= datamux_c_max[3:0] ; - end - 3'b001 : - begin - itxd0 <= datamux_c_max[7:4] ; - end - 3'b010 : - begin - itxd0 <= datamux_c_max[11:8] ; - end - 3'b011 : - begin - itxd0 <= datamux_c_max[15:12] ; - end - 3'b100 : - begin - itxd0 <= datamux_c_max[19:16] ; - end - 3'b101 : - begin - itxd0 <= datamux_c_max[23:20] ; - end - 3'b110 : - begin - itxd0 <= datamux_c_max[27:24] ; - end - default : - begin - itxd0 <= datamux_c_max[31:28] ; - end - endcase - end - 16 : - begin - case (ncnt10) - 2'b00 : - begin - itxd0 <= datamux_c_max[3:0] ; - end - 2'b01 : - begin - itxd0 <= datamux_c_max[7:4] ; - end - 2'b10 : - begin - itxd0 <= datamux_c_max[11:8] ; - end - default : - begin - itxd0 <= datamux_c_max[15:12] ; - end - endcase - end - default : - begin - if (!(ncnt[0])) - begin - itxd0 <= datamux_c_max[3:0] ; - end - else - begin - itxd0 <= datamux_c_max[7:4] ; - end - end - endcase - - if (re) - begin - ramdata_r <= ramdata ; - end - - if (crcsend) - begin - case (ncnt) - 4'b0001 : - begin - txd_rise <= crcneg_c[3:0] ; - end - 4'b0010 : - begin - txd_rise <= crcneg_c[7:4] ; - end - 4'b0011 : - begin - txd_rise <= crcneg_c[11:8] ; - end - 4'b0100 : - begin - txd_rise <= crcneg_c[15:12] ; - end - 4'b0101 : - begin - txd_rise <= crcneg_c[19:16] ; - end - 4'b0110 : - begin - txd_rise <= crcneg_c[23:20] ; - end - 4'b0111 : - begin - txd_rise <= crcneg_c[27:24] ; - end - default : - begin - txd_rise <= crcneg_c[31:28] ; - end - endcase - end - else - begin - txd_rise <= itxd0 ; - end - end - end - - always @(posedge clk) - begin : txen_reg_proc - if (rst) - begin - txen1 <= 1'b0 ; - txen_rise <= 1'b0 ; - end - else - begin - txen_rise <= txen1 ; - if (tsm == TSM_IDLE_TCSMT | - tsm == TSM_INT | - tsm == TSM_FLUSH) - begin - txen1 <= 1'b0 ; - end - else - begin - txen1 <= 1'b1 ; - end - end - end - - always @(posedge clk) - begin : mii_fall_reg_proc - txen <= txen_rise ; - txd <= txd_rise; - end - - assign txer = 1'b0 ; - - always @(posedge clk) - begin : bkoff_reg_proc - if (rst) - begin - bkoff_r <= 1'b0 ; - end - else - begin - if (bkoff) - begin - bkoff_r <= 1'b1 ; - end - else if (tsm != TSM_JAM) - begin - bkoff_r <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : stopo_reg_proc - if (rst) - begin - stop_r <= 1'b0 ; - stopo <= 1'b0 ; - end - else - begin - stop_r <= stopi; - - if (stop_r & tsm == TSM_IDLE_TCSMT & !itpend) - begin - stopo <= 1'b1 ; - end - else - begin - stopo <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : cscnt_reg_proc - if (rst) - begin - tcscnt <= {8{1'b0}} ; - tcs <= 1'b0 ; - tcsreq <= 1'b0 ; - tcsack_r <= 1'b0 ; - end - else - begin - if (tcscnt == 8'b00000000) - begin - tcscnt <= 8'b10000000 ; - end - else - begin - tcscnt <= tcscnt - 1 ; - end - - if (tcscnt == 8'b00000000) - begin - tcs <= 1'b1 ; - end - else if (tcsack_r) - begin - tcs <= 1'b0 ; - end - - if (tcs & !tcsack_r) - begin - tcsreq <= 1'b1 ; - end - else if (tcsack_r) - begin - tcsreq <= 1'b0 ; - end - - tcsack_r <= tcsack ; - - end - end - - assign hnibble = (DATAWIDTH == 32) ? 4'b0111 : - (DATAWIDTH == 16) ? 4'b0011 : - 4'b0001 ; - - assign itxd0zero_max = {(MIIWIDTH_MAX + 1){1'b0}} ; - - assign itxd0_max = {itxd0zero_max[MIIWIDTH_MAX + 1:MIIWIDTH], - itxd0}; - - assign dzero_max = {(DATAWIDTH_MAX + 1){1'b0}} ; - -endmodule diff --git a/resources/soc/rtl/MAC/tfifo.v b/resources/soc/rtl/MAC/tfifo.v deleted file mode 100644 index dca5758..0000000 --- a/resources/soc/rtl/MAC/tfifo.v +++ /dev/null @@ -1,815 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -module TFIFO ( - clk, - rst, - ramwe, - ramaddr, - ramdata, - fifowe, - fifoeof, - fifobe, - fifodata, - fifonf, - fifocnf, - fifoval, - flev, - ici, - dpdi, - aci, - statadi, - cachere, - deo, - lco, - loo, - nco, - eco, - csne, - ico, - uro, - cco, - statado, - sofreq, - eofreq, - dpdo, - aco, - beo, - eofad, - wadg, - tireq, - winp, - dei, - lci, - loi, - nci, - eci, - uri, - cci, - radg, - tiack, - sf, - fdp, - tm, - pbl, - etiack, - etireq, - stopi, - stopo - ); - - parameter DATAWIDTH = 32; - parameter DATADEPTH = 32; - parameter FIFODEPTH = 9; - parameter CACHEDEPTH = 1; - - `include "utility.v" - - input clk; - input rst; - - output ramwe; - wire ramwe; - output [FIFODEPTH - 1:0] ramaddr; - wire [FIFODEPTH - 1:0] ramaddr; - output [DATAWIDTH - 1:0] ramdata; - wire [DATAWIDTH - 1:0] ramdata; - - input fifowe; - input fifoeof; - input [DATAWIDTH / 8 - 1:0] fifobe; - input [DATAWIDTH - 1:0] fifodata; - output fifonf; - reg fifonf; - output fifocnf; - wire fifocnf; - output fifoval; - reg fifoval; - output [FIFODEPTH - 1:0] flev; - wire [FIFODEPTH - 1:0] flev; - - input ici; - input dpdi; - input aci; - input [DATADEPTH - 1:0] statadi; - - input cachere; - output deo; - wire deo; - output lco; - wire lco; - output loo; - wire loo; - output nco; - wire nco; - output eco; - wire eco; - output csne; - wire csne; - output ico; - wire ico; - output uro; - wire uro; - output [3:0] cco; - wire [3:0] cco; - output [DATADEPTH - 1:0] statado; - wire [DATADEPTH - 1:0] statado; - - output sofreq; - wire sofreq; - output eofreq; - reg eofreq; - output dpdo; - wire dpdo; - output aco; - wire aco; - output [DATAWIDTH / 8 - 1:0] beo; - wire [DATAWIDTH / 8 - 1:0] beo; - output [FIFODEPTH - 1:0] eofad; - reg [FIFODEPTH - 1:0] eofad; - output [FIFODEPTH - 1:0] wadg; - reg [FIFODEPTH - 1:0] wadg; - - input tireq; - input winp; - input dei; - input lci; - input loi; - input nci; - input eci; - input uri; - input [3:0] cci; - input [FIFODEPTH - 1:0] radg; - output tiack; - wire tiack; - - input sf; - input fdp; - input [2:0] tm; - input [5:0] pbl; - - input etiack; - output etireq; - reg etireq; - - input stopi; - output stopo; - reg stopo; - - - parameter CCWIDTH = (3 + DATADEPTH + DATAWIDTH / 8 + FIFODEPTH); - reg [CCWIDTH - 1:0] ccmem[(1'b1 << CACHEDEPTH) - 1:0]; - wire ccwe; - wire ccre; - reg ccne; - reg iccnf; - wire [CACHEDEPTH - 1:0] ccwad_c; - reg [CACHEDEPTH - 1:0] ccwad; - reg [CACHEDEPTH - 1:0] ccrad; - reg [CACHEDEPTH - 1:0] ccrad_r; - wire [CCWIDTH - 1:0] ccdi; - wire [CCWIDTH - 1:0] ccdo; - - parameter CSWIDTH = (DATADEPTH + 11); - reg [CSWIDTH - 1:0] csmem[(1'b1 << CACHEDEPTH) - 1:0]; - wire cswe; - reg csre; - reg [CACHEDEPTH - 1:0] cswad; - wire [CACHEDEPTH - 1:0] csrad_c; - reg [CACHEDEPTH - 1:0] csrad; - reg [CACHEDEPTH - 1:0] csrad_r; - wire [CSWIDTH - 1:0] csdi; - wire [CSWIDTH - 1:0] csdo; - wire [DATADEPTH - 1:0] statad; - wire ic; - reg icsne; - - reg tprog; - reg tprog_r; - - reg winp_r; - reg [FIFODEPTH_MAX - 1:0] tlev_c; - reg tresh; - reg [FIFODEPTH - 1:0] stat; - reg [FIFODEPTH - 1:0] wad; - reg [FIFODEPTH - 1:0] rad_c; - reg [FIFODEPTH - 1:0] rad; - reg [FIFODEPTH - 1:0] radg_0_r; - reg [FIFODEPTH - 1:0] radg_r; - reg [FIFODEPTH - 1:0] sad; - wire [FIFODEPTH - 1:0] eofad_bin; - reg pblz; - reg [FIFODEPTH_MAX - 1:0] sflev_c; - - reg tireq_r; - reg tireq_r2; - - reg stop_r; - - wire [FIFODEPTH - 1:0] fone; - wire [FIFODEPTH - 1:0] fzero; - - always @(posedge clk) - begin : ccmem_reg_proc - if (rst) - begin : ccmem_reset - integer i; - for(i = ((1'b1 << CACHEDEPTH) - 1); i >= 0; i = i - 1) - begin - ccmem[i] <= {CCWIDTH{1'b0}}; - end - ccrad_r <= {CACHEDEPTH{1'b0}} ; - end - else - begin - if (fifowe | fifoeof) - begin - ccmem[ccwad] <= ccdi ; - end - ccrad_r <= ccrad ; - end - end - - assign ccwad_c = (fifoeof) ? ccwad + 1 : ccwad ; - - always @(posedge clk) - begin : ccaddr_reg_proc - if (rst) - begin - ccwad <= {CACHEDEPTH{1'b0}} ; - ccrad <= {CACHEDEPTH{1'b0}} ; - end - else - begin - ccwad <= ccwad_c ; - - if (ccre) - begin - ccrad <= ccrad + 1 ; - end - end - end - - always @(posedge clk) - begin : ccfe_reg_proc - if (rst) - begin - iccnf <= 1'b1 ; - ccne <= 1'b0 ; - end - else - begin - if ((ccwad_c == ccrad) & ccwe) - begin - iccnf <= 1'b0 ; - end - else if (ccre) - begin - iccnf <= 1'b1 ; - end - - if (ccwad == ccrad & iccnf) - begin - ccne <= 1'b0 ; - end - else - begin - ccne <= 1'b1 ; - end - end - end - - assign fifocnf = iccnf ; - - assign ccdo = ccmem[ccrad_r] ; - - assign ccdi = {ici, aci, dpdi, wad, fifobe, statadi} ; - - assign ccwe = fifoeof ; - - assign ccre = tireq_r & ~tireq_r2 ; - - assign ic = ccdo[CCWIDTH - 1] ; - - assign aco = ccdo[CCWIDTH - 2] ; - - assign dpdo = ccdo[CCWIDTH - 3] ; - - assign eofad_bin = ccdo[CCWIDTH - 4:CCWIDTH - 3 - FIFODEPTH] ; - - always @(posedge clk) - begin : eofad_reg_proc - if (rst) - begin - eofad <= {FIFODEPTH{1'b0}} ; - end - else - begin - eofad[FIFODEPTH - 1] <= eofad_bin[FIFODEPTH - 1] ; - begin : eofad_loop - integer i; - for(i = FIFODEPTH - 2; i >= 0; i = i - 1) - begin - eofad[i] <= eofad_bin[i] ^ eofad_bin[i + 1] ; - end - end - end - end - - assign beo = ccdo[DATADEPTH + DATAWIDTH / 8 - 1:DATADEPTH] ; - - assign statad = ccdo[DATADEPTH - 1:0] ; - - always @(posedge clk) - begin : csmem_reg_proc - if (rst) - begin : csmem_reset - integer i; - for(i = ((1'b1 << CACHEDEPTH) - 1); i >= 0; i = i - 1) - begin - csmem[i] <= {CSWIDTH{1'b0}}; - end - csrad_r <= {CACHEDEPTH{1'b0}}; - end - else - begin - csmem[cswad] <= csdi ; - csrad_r <= csrad ; - end - end - - always @(posedge clk) - begin : csaddr_reg_proc - if (rst) - begin - cswad <= {CACHEDEPTH{1'b0}} ; - csrad <= {CACHEDEPTH{1'b0}} ; - end - else - begin - if (cswe) - begin - cswad <= cswad + 1 ; - end - - csrad <= csrad_c ; - end - end - - assign csrad_c = (csre) ? csrad + 1 : csrad ; - - always @(posedge clk) - begin : icsne_reg_proc - if (rst) - begin - icsne <= 1'b0 ; - end - else - begin - if (cswad == csrad | (csre & cswad == csrad_c)) - begin - icsne <= 1'b0 ; - end - else - begin - icsne <= 1'b1 ; - end - end - end - - assign csne = icsne; - - assign csdo = csmem[csrad_r] ; - - assign csdi = {dei, lci, loi, nci, eci, ic, cci, uri, statad} ; - - assign deo = csdo[CSWIDTH - 1] ; - - assign lco = csdo[CSWIDTH - 2] ; - - assign loo = csdo[CSWIDTH - 3] ; - - assign nco = csdo[CSWIDTH - 4] ; - - assign eco = csdo[CSWIDTH - 5] ; - - assign ico = csdo[CSWIDTH - 6] ; - - assign cco = csdo[CSWIDTH - 7:CSWIDTH - 10] ; - - assign uro = csdo[CSWIDTH - 11] ; - - assign statado = csdo[DATADEPTH - 1:0] ; - - assign cswe = tireq_r & tprog ; - - always @(posedge clk) - begin : csre_reg_proc - if (rst) - begin - csre <= 1'b0 ; - end - else - begin - csre <= cachere ; - end - end - - always @(posedge clk) - begin : tprog_reg_proc - if (rst) - begin - tprog <= 1'b0 ; - tprog_r <= 1'b0 ; - end - else - begin - tprog_r <= tprog ; - if (tireq_r) - begin - tprog <= 1'b0 ; - end - else if ((!sf & !tprog & !tireq_r & tresh) | ccne) - begin - tprog <= 1'b1 ; - end - end - end - - always @(posedge clk) - begin : eofreq_reg_proc - if (rst) - begin - eofreq <= 1'b0 ; - end - else - begin - if (tprog & ccne) - begin - eofreq <= 1'b1 ; - end - else if (tireq_r) - begin - eofreq <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : tireq_reg_proc - if (rst) - begin - tireq_r <= 1'b0 ; - tireq_r2 <= 1'b0 ; - end - else - begin - tireq_r <= tireq ; - tireq_r2 <= tireq_r ; - end - end - - always @(posedge clk) - begin : etireq_reg_proc - if (rst) - begin - etireq <= 1'b0 ; - end - else - begin - if (fifoeof) - begin - etireq <= 1'b1 ; - end - else if (etiack) - begin - etireq <= 1'b0 ; - end - end - end - - assign tiack = tireq_r2 ; - - assign sofreq = tprog ; - - always @(posedge clk) - begin : addr_reg_proc - if (rst) - begin - wad <= {FIFODEPTH{1'b0}} ; - wadg <= {FIFODEPTH{1'b0}} ; - radg_0_r <= {FIFODEPTH{1'b0}} ; - radg_r <= {FIFODEPTH{1'b0}} ; - rad <= {FIFODEPTH{1'b0}} ; - sad <= {FIFODEPTH{1'b0}} ; - end - else - begin - if (fifowe) - begin - wad <= wad + 1 ; - end - - wadg[FIFODEPTH - 1] <= wad[FIFODEPTH - 1] ; - begin : wadg_loop - integer i; - for(i = FIFODEPTH - 2; i >= 0; i = i - 1) - begin - wadg[i] <= wad[i] ^ wad[i + 1] ; - end - end - - radg_0_r <= radg ; - radg_r <= radg_0_r ; - - rad <= rad_c ; - - if (!tprog & tprog_r) - begin - sad <= eofad_bin ; - end - end - end - - always @(radg_r) - begin : rad_proc - reg[FIFODEPTH - 1:0] rad_v; - rad_v[FIFODEPTH - 1] = radg_r[FIFODEPTH - 1]; - begin : rad_loop - integer i; - for(i = FIFODEPTH - 2; i >= 0; i = i - 1) - begin - rad_v[i] = rad_v[i + 1] ^ radg_r[i]; - end - end - rad_c = rad_v ; - end - - always @(posedge clk) - begin : stat_reg_proc - if (rst) - begin - stat <= {FIFODEPTH{1'b0}} ; - end - else - begin - if ((!winp_r & !fdp & tprog & !tireq_r) | !tprog_r) - begin - stat <= wad - sad ; - end - else - begin - stat <= wad - rad ; - end - end - end - - always @(posedge clk) - begin : winp_reg_proc - if (rst) - begin - winp_r <= 1'b0 ; - end - else - begin - winp_r <= winp ; - end - end - - always @(tm) - begin : tresh_proc - tlev_c <= {FIFODEPTH_MAX{1'b0}} ; - case (DATAWIDTH) - 8 : - begin - case (tm) - 3'b000, 3'b101, 3'b110 : - begin - tlev_c[10:0] <= 11'b00010000000 ; - end - 3'b001, 3'b111 : - begin - tlev_c[10:0] <= 11'b00100000000 ; - end - 3'b010 : - begin - tlev_c[10:0] <= 11'b01000000000 ; - end - 3'b011 : - begin - tlev_c[10:0] <= 11'b10000000000 ; - end - default : - begin - tlev_c[10:0] <= 11'b00001000000 ; - end - endcase - end - 16 : - begin - case (tm) - 3'b000, 3'b101, 3'b110 : - begin - tlev_c[10:0] <= 11'b00001000000 ; - end - 3'b001, 3'b111 : - begin - tlev_c[10:0] <= 11'b00010000000 ; - end - 3'b010 : - begin - tlev_c[10:0] <= 11'b00100000000 ; - end - 3'b011 : - begin - tlev_c[10:0] <= 11'b01000000000 ; - end - default : - begin - tlev_c[10:0] <= 11'b00000100000 ; - end - endcase - end - default : - begin - case (tm) - 3'b000, 3'b101, 3'b110 : - begin - tlev_c[10:0] <= 11'b00000100000 ; - end - 3'b001, 3'b111 : - begin - tlev_c[10:0] <= 11'b00001000000 ; - end - 3'b010 : - begin - tlev_c[10:0] <= 11'b00010000000 ; - end - 3'b011 : - begin - tlev_c[10:0] <= 11'b00100000000 ; - end - default : - begin - tlev_c[10:0] <= 11'b00000010000 ; - end - endcase - end - endcase - end - - always @(posedge clk) - begin : tresh_reg_proc - if (rst) - begin - tresh <= 1'b0 ; - end - else - begin - if (stat >= tlev_c[FIFODEPTH - 1:0]) - begin - tresh <= 1'b1 ; - end - else - begin - tresh <= 1'b0 ; - end - end - end - - always @(pbl or pblz) - begin : sflev_proc - sflev_c[FIFODEPTH_MAX - 1:6] <= {(FIFODEPTH_MAX-6){1'b1}} ; - if (pblz) - begin - sflev_c[5:0] <= 6'b000000 ; - end - else - begin - sflev_c[5:0] <= ~pbl ; - end - end - - always @(posedge clk) - begin : fifoval_reg_proc - if (rst) - begin - fifoval <= 1'b0 ; - end - else - begin - if (stat <= sflev_c[FIFODEPTH - 1:0]) - begin - fifoval <= 1'b1 ; - end - else - begin - fifoval <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : pblz_reg_proc - if (rst) - begin - pblz <= 1'b0 ; - end - else - begin - if (pbl == 6'b000000) - begin - pblz <= 1'b1 ; - end - else - begin - pblz <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : fifonf_reg_proc - if (rst) - begin - fifonf <= 1'b1 ; - end - else - begin - if ((stat == {fone[FIFODEPTH - 1:1], 1'b0} & fifowe) | - (stat == fone)) - begin - fifonf <= 1'b0 ; - end - else - begin - fifonf <= 1'b1 ; - end - end - end - - assign flev = stat ; - - assign ramaddr = wad ; - - assign ramdata = fifodata ; - - assign ramwe = fifowe ; - - always @(posedge clk) - begin : tstop_reg_proc - if (rst) - begin - stop_r <= 1'b1 ; - stopo <= 1'b0 ; - end - else - begin - stop_r <= stopi ; - - if (stop_r & !ccne & !icsne & stat == fzero & !tprog) - begin - stopo <= 1'b1 ; - end - else - begin - stopo <= 1'b0 ; - end - end - end - - assign fone = {FIFODEPTH{1'b1}} ; - - assign fzero = {FIFODEPTH{1'b0}} ; - -endmodule diff --git a/resources/soc/rtl/MAC/tlsm.v b/resources/soc/rtl/MAC/tlsm.v deleted file mode 100644 index c98093a..0000000 --- a/resources/soc/rtl/MAC/tlsm.v +++ /dev/null @@ -1,2197 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -module TLSM ( - clk, - rst, - fifonf, - fifocnf, - fifoval, - fifolev, - fifowe, - fifoeof, - fifobe, - fifodata, - ic, - ac, - dpd, - statado, - csne, - lo, - nc, - lc, - ec, - de, - ur, - cc, - statadi, - cachere, - dmaack, - dmaeob, - dmadatai, - dmaaddr, - dmareq, - dmawr, - dmacnt, - dmaaddro, - dmadatao, - fwe, - fdata, - faddr, - dsl, - pbl, - poll, - dbadc, - dbad, - pollack, - tcompack, - tcomp, - des, - fbuf, - stat, - setp, - tu, - ft, - stopi, - stopo - ); - - parameter DATAWIDTH = 32; - parameter DATADEPTH = 32; - parameter FIFODEPTH = 9; - - `include "utility.v" - - input clk; - input rst; - - input fifonf; - input fifocnf; - input fifoval; - input [FIFODEPTH - 1:0] fifolev; - output fifowe; - wire fifowe; - output fifoeof; - wire fifoeof; - output [DATAWIDTH / 8 - 1:0] fifobe; - reg [DATAWIDTH / 8 - 1:0] fifobe; - output [DATAWIDTH - 1:0] fifodata; - wire [DATAWIDTH - 1:0] fifodata; - - output ic; - reg ic; - output ac; - reg ac; - output dpd; - reg dpd; - output [DATADEPTH - 1:0] statado; - wire [DATADEPTH - 1:0] statado; - - input csne; - input lo; - input nc; - input lc; - input ec; - input de; - input ur; - input [3:0] cc; - input [DATADEPTH - 1:0] statadi; - output cachere; - wire cachere; - - input dmaack; - input dmaeob; - input [DATAWIDTH - 1:0] dmadatai; - input [DATADEPTH - 1:0] dmaaddr; - output dmareq; - wire dmareq; - output dmawr; - wire dmawr; - output [FIFODEPTH_MAX - 1:0] dmacnt; - wire [FIFODEPTH_MAX - 1:0] dmacnt; - output [DATADEPTH - 1:0] dmaaddro; - reg [DATADEPTH - 1:0] dmaaddro; - output [DATAWIDTH - 1:0] dmadatao; - reg [DATAWIDTH - 1:0] dmadatao; - - output fwe; - wire fwe; - output [ADDRWIDTH - 1:0] fdata; - wire [ADDRWIDTH - 1:0] fdata; - output [ADDRDEPTH - 1:0] faddr; - wire [ADDRDEPTH - 1:0] faddr; - - input [4:0] dsl; - input [5:0] pbl; - input poll; - input dbadc; - input [DATADEPTH - 1:0] dbad; - output pollack; - wire pollack; - - input tcompack; - output tcomp; - wire tcomp; - output des; - reg des; - output fbuf; - reg fbuf; - output stat; - reg stat; - output setp; - reg setp; - output tu; - reg tu; - output [1:0] ft; - reg [1:0] ft; - - input stopi; - output stopo; - reg stopo; - - - wire [DATAWIDTH_MAX + 1:0] dmadatai_max; - reg [DATAWIDTH_MAX - 1:0] dataimax_r; - wire [1:0] dataimax_r10; - wire [2:0] dmaaddr20; - reg req_c; - reg req; - reg [2:0] req_r; - - reg idmareq; - wire [31:0] datao32; - wire [FIFODEPTH_MAX - 1:0] bsmax; - wire [FIFODEPTH_MAX - 1:0] flmax; - wire [FIFODEPTH - 1:0] flmax_sub; - wire [FIFODEPTH_MAX - 1:0] blmax; - reg fl_g_bs; - reg fl_g_bl; - reg bl_g_bs; - reg pblz; - reg buffetch; - reg dmaack_r; - - reg [3:0] lsm_c; - reg [3:0] lsm; - reg [3:0] lsm_r; - reg [2:0] csm_c; - reg [2:0] csm; - reg [2:0] lsmcnt; - reg tsprog; - reg [DATADEPTH - 1:0] statad; - wire es_c; - reg own_c; - reg own; - reg tch; - reg ter; - reg set; - reg tls; - reg tfs; - wire [10:0] bs_c; - wire [1:0] bs_c10; - reg [10:0] bs1; - reg [10:0] bs2; - reg adwrite; - reg [DATADEPTH - 1:0] bad; - reg [DATADEPTH - 1:0] dad; - reg dbadc_r; - wire [31:0] tstat; - reg lastdma; - reg icachere; - reg poll_r; - reg [FIFODEPTH_MAX - 1:0] dmacnt_c; - reg [FIFODEPTH_MAX - 1:0] dmacnt_r; - - wire [1:0] addsel16; - wire [3:0] addsel32; - reg [3:0] addv_c; - reg [1:0] badd_c; - reg [11:0] bcnt; - reg ififowe; - wire bufwe; - wire firstb_c; - reg firstb; - reg [DATAWIDTH - 1:0] buf0_c; - reg [DATAWIDTH * 2 - 9:0] buf_c; - reg [DATAWIDTH * 2 - 9:0] buf_r; - reg [3:0] buflev_c; - reg [3:0] buflev; - reg [DATAWIDTH / 8 - 1:0] firstbe; - reg [DATAWIDTH / 8 - 1:0] lastbe; - reg [DATAWIDTH / 8 - 1:0] be; - wire [1:0] be10; - wire [3:0] be30; - - reg itcomp; - reg tcompack_r; - - reg ifwe; - reg [ADDRDEPTH - 1:0] ifaddr; - - reg stop_r; - - wire [FIFODEPTH_MAX - 1:0] fzero_max; - wire [DATAWIDTH_MAX + 1:0] dzero_max; - wire [DATAWIDTH_MAX * 2 - 7:0] buf_r_max; - wire [DATAWIDTH_MAX * 2 - 7:0] bufzero_max; - - - always @(posedge clk) - begin : idmareq_reg_proc - if (rst) - begin - idmareq <= 1'b0 ; - end - else - begin - if (req_c) - begin - idmareq <= 1'b1 ; - end - else if (dmaack & dmaeob) - begin - idmareq <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : cachere_reg_proc - if (rst) - begin - icachere <= 1'b0 ; - end - else - begin - if (itcomp & tcompack_r) - begin - icachere <= 1'b1 ; - end - else - begin - icachere <= 1'b0 ; - end - end - end - - assign cachere = icachere ; - - always @(lsm or - csm or - poll_r or - dmaack or - dmaeob or - own_c or - tch or - bs1 or - bs2 or - stop_r or - lsmcnt or - fifocnf or - tsprog or - lastdma or - dbadc_r) - begin : lsm_proc - case (lsm) - LSM_IDLE : - begin - if (!dbadc_r & !stop_r & fifocnf & (poll_r | (tsprog & dmaack & dmaeob))) - begin - lsm_c <= LSM_DES0 ; - end - else - begin - lsm_c <= LSM_IDLE ; - end - end - LSM_DES0 : - begin - if (dmaack & dmaeob & !tsprog) - begin - if (own_c) - begin - lsm_c <= LSM_DES1 ; - end - else - begin - lsm_c <= LSM_IDLE ; - end - end - else - begin - lsm_c <= LSM_DES0 ; - end - end - LSM_DES1 : - begin - if (dmaack & dmaeob & !tsprog) - begin - lsm_c <= LSM_DES2 ; - end - else - begin - lsm_c <= LSM_DES1 ; - end - end - LSM_DES2 : - begin - if (dmaack & dmaeob & !tsprog) - begin - if (bs1 == 11'b00000000000 | csm == CSM_IDLE) - begin - lsm_c <= LSM_DES3 ; - end - else - begin - lsm_c <= LSM_BUF1 ; - end - end - else - begin - lsm_c <= LSM_DES2 ; - end - end - LSM_DES3 : - begin - if (dmaack & dmaeob & !tsprog) - begin - if (bs2 == 11'b00000000000 | tch | csm == CSM_IDLE) - begin - lsm_c <= LSM_NXT ; - end - else - begin - lsm_c <= LSM_BUF2 ; - end - end - else - begin - lsm_c <= LSM_DES3 ; - end - end - LSM_BUF1 : - begin - if (!tsprog & dmaack & dmaeob & lastdma) - begin - lsm_c <= LSM_DES3 ; - end - else - begin - lsm_c <= LSM_BUF1 ; - end - end - LSM_BUF2 : - begin - if (!tsprog & dmaack & dmaeob & lastdma) - begin - lsm_c <= LSM_NXT ; - end - else - begin - lsm_c <= LSM_BUF2 ; - end - end - LSM_NXT : - begin - if (lsmcnt == 3'b000) - begin - if (csm == CSM_L | csm == CSM_FL) - begin - if (stop_r | !fifocnf) - begin - lsm_c <= LSM_IDLE ; - end - else - begin - lsm_c <= LSM_DES0 ; - end - end - else - begin - lsm_c <= LSM_STAT ; - end - end - else - begin - lsm_c <= LSM_NXT ; - end - end - default : - begin - if (dmaack & dmaeob & !tsprog) - begin - if (stop_r) - begin - lsm_c <= LSM_IDLE ; - end - else - begin - lsm_c <= LSM_DES0 ; - end - end - else - begin - lsm_c <= LSM_STAT ; - end - end - endcase - end - - always @(posedge clk) - begin : lsm_reg_proc - if (rst) - begin - lsm <= LSM_IDLE ; - lsm_r <= LSM_IDLE ; - end - else - begin - lsm <= lsm_c ; - lsm_r <= lsm ; - end - end - - always @(csm or lsm or tfs or tls or own or set or bs1 or bs2) - begin : csm_proc - case (csm) - CSM_IDLE : - begin - if (lsm == LSM_DES2) - begin - if (!set & tfs & tls) - begin - csm_c <= CSM_FL ; - end - else if (!set & tfs & !tls) - begin - csm_c <= CSM_F ; - end - else if (set & !tfs & !tls) - begin - csm_c <= CSM_SET ; - end - else - begin - csm_c <= CSM_IDLE ; - end - end - else - begin - csm_c <= CSM_IDLE ; - end - end - CSM_FL : - begin - if (lsm == LSM_DES0 | lsm == LSM_IDLE) - begin - csm_c <= CSM_IDLE ; - end - else if (lsm == LSM_DES2 & - bs1 == 11'b00000000000 & - bs2 == 11'b00000000000) - begin - csm_c <= CSM_BAD ; - end - else - begin - csm_c <= CSM_FL ; - end - end - CSM_F : - begin - if (tls) - begin - csm_c <= CSM_L ; - end - else if (lsm == LSM_DES1 & !tfs) - begin - csm_c <= CSM_I ; - end - else - begin - csm_c <= CSM_F ; - end - end - CSM_L : - begin - if (lsm == LSM_DES0 | lsm == LSM_IDLE) - begin - csm_c <= CSM_IDLE ; - end - else - begin - csm_c <= CSM_L ; - end - end - CSM_SET : - begin - if (lsm == LSM_DES0 | lsm == LSM_IDLE) - begin - csm_c <= CSM_IDLE ; - end - else - begin - csm_c <= CSM_SET ; - end - end - CSM_I : - begin - if (tls) - begin - csm_c <= CSM_L ; - end - else - begin - csm_c <= CSM_I ; - end - end - default : - begin - if (lsm == LSM_NXT) - begin - csm_c <= CSM_IDLE ; - end - else - begin - csm_c <= CSM_BAD ; - end - end - endcase - end - - always @(posedge clk) - begin : csm_reg_proc - if (rst) - begin - csm <= CSM_IDLE ; - end - else - begin - csm <= csm_c ; - end - end - - always @(posedge clk) - begin : lsmcnt_reg_proc - if (rst) - begin - lsmcnt <= {3{1'b1}} ; - end - else - begin - if (lsm == LSM_NXT) - begin - lsmcnt <= lsmcnt - 1 ; - end - else - begin - lsmcnt <= {3{1'b1}} ; - end - end - end - - always @(posedge clk) - begin : poll_reg_proc - if (rst) - begin - poll_r <= 1'b0 ; - end - else - begin - if (poll) - begin - poll_r <= 1'b1 ; - end - else if (!dbadc_r) - begin - poll_r <= 1'b0 ; - end - end - end - - assign pollack = poll_r ; - - always @(own or dmaack or dmaeob or lsm or dmadatai_max or tsprog) - begin : own_proc - if (dmaack & dmaeob & lsm == LSM_DES0 & !tsprog) - begin - own_c <= dmadatai_max[DATAWIDTH - 1] ; - end - else - begin - own_c <= own ; - end - end - - always @(posedge clk) - begin : own_reg_proc - if (rst) - begin - own <= 1'b1 ; - end - else - begin - own <= own_c ; - end - end - - always @(posedge clk) - begin : des1_reg_proc - reg ft22; - if (rst) - begin - ft22 = 1'b0; - tls <= 1'b0 ; - tfs <= 1'b0 ; - set <= 1'b0 ; - ac <= 1'b0 ; - ter <= 1'b0 ; - tch <= 1'b0 ; - dpd <= 1'b0 ; - ic <= 1'b0 ; - bs2 <= {11{1'b0}} ; - bs1 <= {11{1'b0}} ; - ft <= {2{1'b0}} ; - end - else - begin - if (lsm == LSM_DES1 & dmaack & !tsprog) - begin - case (DATAWIDTH) - 8 : - begin - case (dmaaddr20) - 3'b000, 3'b100 : - begin - bs1[7:0] <= dmadatai_max[7:0] ; - end - 3'b001, 3'b101 : - begin - bs1[10:8] <= dmadatai_max[2:0] ; - bs2[4:0] <= dmadatai_max[7:3] ; - end - 3'b010, 3'b110 : - begin - bs2[10:5] <= dmadatai_max[5:0] ; - dpd <= dmadatai_max[7] ; - ft22 = dmadatai_max[6]; - end - default : - begin - ic <= dmadatai_max[7] ; - tls <= dmadatai_max[6] ; - tfs <= dmadatai_max[5] ; - set <= dmadatai_max[3] ; - ac <= dmadatai_max[2] ; - ter <= dmadatai_max[1] ; - tch <= dmadatai_max[0] ; - if (dmadatai_max[3]) - begin - ft <= {dmadatai_max[4], ft22} ; - end - end - endcase - end - 16 : - begin - case (dmaaddr20) - 3'b000, 3'b100 : - begin - bs1[10:0] <= dmadatai_max[10:0] ; - bs2[4:0] <= dmadatai_max[15:11] ; - end - default : - begin - bs2[10:5] <= dmadatai_max[5:0] ; - ic <= dmadatai_max[15] ; - tls <= dmadatai_max[14] ; - tfs <= dmadatai_max[13] ; - set <= dmadatai_max[11] ; - ac <= dmadatai_max[10] ; - ter <= dmadatai_max[9] ; - tch <= dmadatai_max[8] ; - dpd <= dmadatai_max[7] ; - if (dmadatai_max[11]) - begin - ft <= {dmadatai_max[12], dmadatai_max[6]} ; - end - end - endcase - end - default : - begin - ic <= dmadatai_max[31] ; - tls <= dmadatai_max[30] ; - tfs <= dmadatai_max[29] ; - set <= dmadatai_max[27] ; - ac <= dmadatai_max[26] ; - ter <= dmadatai_max[25] ; - tch <= dmadatai_max[24] ; - dpd <= dmadatai_max[23] ; - bs2 <= dmadatai_max[21:11] ; - bs1 <= dmadatai_max[10:0] ; - if (dmadatai_max[27]) - begin - ft <= {dmadatai_max[28], dmadatai_max[22]} ; - end - end - endcase - end - end - end - - always @(posedge clk) - begin : adwrite_reg_proc - if (rst) - begin - adwrite <= 1'b0 ; - end - else - begin - if (dmaack & dmaeob & !tsprog) - begin - adwrite <= 1'b1 ; - end - else - begin - adwrite <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : dbadc_reg_proc - if (rst) - begin - dbadc_r <= 1'b0 ; - end - else - begin - dbadc_r <= dbadc ; - end - end - - always @(posedge clk) - begin : dad_reg_proc - if (rst) - begin - dad <= {DATADEPTH{1'b1}} ; - end - else - begin - if (dbadc_r) - begin - dad <= dbad ; - end - else if (adwrite) - begin - case (lsm_r) - LSM_DES3 : - begin - if (ter) - begin - dad <= dbad ; - end - else if (tch) - begin - dad <= dataimax_r[DATADEPTH - 1:0] ; - end - else - begin - dad <= dmaaddr + ({dsl, 2'b00}) ; - end - end - LSM_DES0 : - begin - if (own) - begin - dad <= dmaaddr ; - end - end - LSM_DES2 : - begin - dad <= dmaaddr ; - end - LSM_DES1 : - begin - dad <= dmaaddr ; - end - default : - begin - end - endcase - end - end - end - - always @(posedge clk) - begin : bad_reg_proc - if (rst) - begin - bad <= {DATADEPTH{1'b1}} ; - end - else - begin - if (adwrite) - begin - if (lsm_r == LSM_DES2 | lsm_r == LSM_DES3) - begin - case (DATAWIDTH) - 8 : - begin - bad <= dataimax_r[DATADEPTH - 1:0] ; - end - 16 : - begin - bad <= {dataimax_r[DATADEPTH - 1:1], 1'b0} ; - end - default : - begin - bad <= {dataimax_r[DATADEPTH - 1:2], 2'b00} ; - end - endcase - end - else - begin - bad <= dmaaddr ; - end - end - end - end - - always @(posedge clk) - begin : stataddr_reg_proc - if (rst) - begin - statad <= {DATADEPTH{1'b1}} ; - end - else - begin - if (lsm_r == LSM_DES0 & adwrite & own) - begin - statad <= dad ; - end - end - end - - assign statado = statad ; - - assign bs_c = (lsm_r == LSM_DES2) ? bs1 : bs2 ; - - assign addsel16 = {dataimax_r[0], bs_c[0]} ; - - assign addsel32 = {dataimax_r10, bs_c10} ; - - always @(addsel16 or addsel32) - begin : badd_proc - case (DATAWIDTH) - 8 : - begin - badd_c <= 2'b00 ; - end - 16 : - begin - if (addsel16 == 2'b01 | - addsel16 == 2'b10 | - addsel16 == 2'b11) - begin - badd_c <= 2'b01 ; - end - else - begin - badd_c <= 2'b00 ; - end - end - default : - begin - case (addsel32) - 4'b0000 : - begin - badd_c <= 2'b00 ; - end - 4'b1011, 4'b1110, 4'b1111 : - begin - badd_c <= 2'b10 ; - end - default : - begin - badd_c <= 2'b01 ; - end - endcase - end - endcase - end - - always @(posedge clk) - begin : bcnt_reg_proc - if (rst) - begin - bcnt <= {12{1'b1}} ; - end - else - begin - case (DATAWIDTH) - 8 : - begin - if (lsm_r == LSM_DES2 | lsm_r == LSM_DES3) - begin - bcnt <= {1'b0, bs_c} ; - end - else if (dmaack & !tsprog) - begin - bcnt <= bcnt - 1 ; - end - end - 16 : - begin - if (lsm_r == LSM_DES2 | lsm_r == LSM_DES3) - begin - bcnt <= {(({1'b0, bs_c[10:1]}) + badd_c), 1'b0} ; - end - else if (dmaack & !tsprog) - begin - bcnt <= {(bcnt[11:1] - 1), 1'b0} ; - end - end - default : - begin - if (lsm_r == LSM_DES2 | lsm_r == LSM_DES3) - begin - bcnt <= {(({1'b0, bs_c[10:2]}) + badd_c), 2'b00} ; - end - else if (dmaack & !tsprog) - begin - bcnt <= {(bcnt[11:2] - 1), 2'b00} ; - end - end - endcase - end - end - - - assign bs_c10 = bs_c[1:0] ; - - assign dataimax_r10 = dataimax_r[1:0] ; - - always @(posedge clk) - begin : firstbe_reg_proc - if (rst) - begin - firstbe <= {(DATAWIDTH/8){1'b1}} ; - end - else - begin - if (lsm_r == LSM_DES2 | lsm_r == LSM_DES3) - begin - case (DATAWIDTH) - 8 : - begin - firstbe <= 1'b1 ; - end - 16 : - begin - if (dataimax_r[0]) - begin - firstbe <= 2'b10 ; - end - else - begin - firstbe <= 2'b11 ; - end - end - default : - begin - case (dataimax_r10) - 2'b00 : - begin - firstbe <= 4'b1111 ; - end - 2'b01 : - begin - firstbe <= 4'b1110 ; - end - 2'b10 : - begin - firstbe <= 4'b1100 ; - end - default : - begin - firstbe <= 4'b1000 ; - end - endcase - end - endcase - end - end - end - - always @(posedge clk) - begin : lastbe_reg_proc - if (rst) - begin - lastbe <= {(DATAWIDTH/8){1'b1}} ; - end - else - begin - if (lsm_r == LSM_DES2 | lsm_r == LSM_DES3) - begin - case (DATAWIDTH) - 8 : - begin - lastbe <= 1'b1 ; - end - 16 : - begin - if ((!(dataimax_r[0]) & !(bs_c[0])) | - ((dataimax_r[0]) & (bs_c[0]))) - begin - lastbe <= 2'b11 ; - end - else - begin - lastbe <= 2'b01 ; - end - end - default : - begin - case (dataimax_r10) - 2'b00 : - begin - case (bs_c10) - 2'b00 : - begin - lastbe <= 4'b1111 ; - end - 2'b01 : - begin - lastbe <= 4'b0001 ; - end - 2'b10 : - begin - lastbe <= 4'b0011 ; - end - default : - begin - lastbe <= 4'b0111 ; - end - endcase - end - 2'b01 : - begin - case (bs_c10) - 2'b00 : - begin - lastbe <= 4'b0001 ; - end - 2'b01 : - begin - lastbe <= 4'b0011 ; - end - 2'b10 : - begin - lastbe <= 4'b0111 ; - end - default : - begin - lastbe <= 4'b1111 ; - end - endcase - end - 2'b10 : - begin - case (bs_c10) - 2'b00 : - begin - lastbe <= 4'b0011 ; - end - 2'b01 : - begin - lastbe <= 4'b0111 ; - end - 2'b10 : - begin - lastbe <= 4'b1111 ; - end - default : - begin - lastbe <= 4'b0001 ; - end - endcase - end - default : - begin - case (bs_c10) - 2'b00 : - begin - lastbe <= 4'b0111 ; - end - 2'b01 : - begin - lastbe <= 4'b1111 ; - end - 2'b10 : - begin - lastbe <= 4'b0001 ; - end - default : - begin - lastbe <= 4'b0011 ; - end - endcase - end - endcase - end - endcase - end - end - end - - always @(posedge clk) - begin : tfwe_reg_proc - if (rst) - begin - ififowe <= 1'b0 ; - end - else - begin - if (((DATAWIDTH == 8 & buflev_c >= 4'b0001 & bufwe) | - (DATAWIDTH ==16 & buflev_c >= 4'b0010 & bufwe) | - (DATAWIDTH ==32 & buflev_c >= 4'b0100 & bufwe) | - (buflev_c != 4'b0000 & lsm == LSM_NXT & - (csm == CSM_L | csm == CSM_FL))) & fifonf) - begin - ififowe <= 1'b1 ; - end - else - begin - ififowe <= 1'b0 ; - end - end - end - - assign fifoeof = ((csm == CSM_L | csm == CSM_FL) & - lsm == LSM_NXT & lsmcnt == 3'b001) ? 1'b1 : 1'b0 ; - - assign fifowe = ififowe ; - - assign firstb_c = (bufwe) ? 1'b0 : - (lsm == LSM_DES2 | lsm == LSM_DES3) ? 1'b1 : - firstb ; - - always @(firstb or firstbe or lastbe or dmaeob or lastdma) - begin : be_proc - if (dmaeob & lastdma) - begin - be <= lastbe ; - end - else if (firstb) - begin - be <= firstbe ; - end - else - begin - be <= {(DATAWIDTH/8){1'b1}} ; - end - end - - always @(be or be30 or dmadatai_max) - begin : tbuf0_proc - reg[15:0] buf0_16; - reg[31:0] buf0_32; - buf0_c <= {DATAWIDTH{1'b0}} ; - case (DATAWIDTH) - 8 : - begin - buf0_c <= dmadatai_max[7:0]; - end - 16 : - begin - buf0_16 = {16{1'b0}}; - if (be == 2'b10) - begin - buf0_16[7:0] = dmadatai_max[15:8]; - end - else - begin - buf0_16 = dmadatai_max[15:0]; - end - buf0_c <= buf0_16 ; - end - default : - begin - buf0_32 = {32{1'b0}}; - case (be30) - 4'b1110 : - begin - buf0_32[23:0] = dmadatai_max[31:8]; - end - 4'b1100 : - begin - buf0_32[15:0] = dmadatai_max[31:16]; - end - 4'b1000 : - begin - buf0_32[7:0] = dmadatai_max[31:24]; - end - default : - begin - buf0_32 = dmadatai_max[31:0]; - end - endcase - buf0_c <= buf0_32 ; - end - endcase - end - - always @(buflev or buf_r_max or buf0_c or bufwe or ififowe) - begin : tbuf_proc - reg[23:0] buf_16; - reg[55:0] buf_32; - case (DATAWIDTH) - 8 : - begin - buf_c <= buf0_c ; - end - 16 : - begin - buf_16 = buf_r_max[DATAWIDTH * 2 - 9:0]; - if (bufwe) - begin - case (buflev) - 4'b0000 : - begin - buf_16[15:0] = buf0_c; - end - 4'b0001 : - begin - buf_16[23:8] = buf0_c; - end - 4'b0010 : - begin - buf_16[15:0] = buf0_c; - end - default : - begin - buf_16[23:8] = buf0_c; - buf_16[7:0] = buf_r_max[23:16]; - end - endcase - end - else if (ififowe) - begin - buf_16 = {buf_r_max[23:8], buf_r_max[23:16]}; - end - buf_c <= buf_16 ; - end - default : - begin - buf_32 = buf_r_max[DATAWIDTH * 2 - 9:0]; - if (bufwe) - begin - case (buflev) - 4'b0000 : - begin - buf_32[31:0] = buf0_c; - end - 4'b0001 : - begin - buf_32[39:8] = buf0_c; - end - 4'b0010 : - begin - buf_32[47:16] = buf0_c; - end - 4'b0011 : - begin - buf_32[55:24] = buf0_c; - end - 4'b0100 : - begin - buf_32[31:0] = buf0_c; - end - 4'b0101 : - begin - buf_32[39:8] = buf0_c; - buf_32[7:0] = buf_r_max[39:32]; - end - 4'b0110 : - begin - buf_32[47:16] = buf0_c; - buf_32[15:0] = buf_r_max[47:32]; - end - default : - begin - buf_32[55:24] = buf0_c; - buf_32[23:0] = buf_r_max[55:32]; - end - endcase - end - else if (ififowe) - begin - buf_32 = {buf_r_max[55:24], buf_r_max[55:32]}; - end - buf_c <= buf_32 ; - end - endcase - end - - assign bufwe = (dmaack & !set & fifonf & !tsprog & - (lsm == LSM_BUF1 | lsm == LSM_BUF2)) ? 1'b1 : 1'b0 ; - - assign fifodata = buf_r_max[DATAWIDTH - 1:0] ; - - assign be10 = (DATAWIDTH == 16) ? be : {2{1'b1}} ; - - assign be30 = (DATAWIDTH == 32) ? be : {4{1'b1}} ; - - always @(be10 or be30) - begin : addv_proc - case (DATAWIDTH) - 8 : - begin - addv_c <= 4'b0000 ; - end - 16 : - begin - case (be10) - 2'b01, 2'b10 : - begin - addv_c <= 4'b0001 ; - end - default : - begin - addv_c <= 4'b0010 ; - end - endcase - end - default : - begin - case (be30) - 4'b0001, 4'b1000 : - begin - addv_c <= 4'b0001 ; - end - 4'b0011, 4'b1100 : - begin - addv_c <= 4'b0010 ; - end - 4'b0111, 4'b1110 : - begin - addv_c <= 4'b0011 ; - end - default : - begin - addv_c <= 4'b0100 ; - end - endcase - end - endcase - end - - always @(buflev or bufwe or ififowe or addv_c) - begin : buflev_proc - case (DATAWIDTH) - 8 : - begin - if (bufwe) - begin - buflev_c <= 4'b0001 ; - end - else if (ififowe) - begin - buflev_c <= 4'b0000 ; - end - else - begin - buflev_c <= buflev ; - end - end - 16 : - begin - if (bufwe) - begin - buflev_c <= ({buflev[3:2], 1'b0, buflev[0]}) + addv_c ; - end - else if (ififowe & (buflev[1])) - begin - buflev_c <= {buflev[3:2], 1'b0, buflev[0]} ; - end - else if (ififowe & !(buflev[1])) - begin - buflev_c <= {buflev[3:1], 1'b0} ; - end - else - begin - buflev_c <= buflev ; - end - end - default : - begin - if (bufwe) - begin - buflev_c <= ({buflev[3:3], 1'b0, buflev[1:0]}) + addv_c ; - end - else if (ififowe & (buflev[2])) - begin - buflev_c <= {buflev[3:3], 1'b0, buflev[1:0]} ; - end - else if (ififowe & !(buflev[2])) - begin - buflev_c <= {buflev[3:2], 2'b00} ; - end - else - begin - buflev_c <= buflev ; - end - end - endcase - end - - always @(posedge clk) - begin : buf_reg_proc - if (rst) - begin - buflev <= {4{1'b0}} ; - firstb <= 1'b1 ; - buf_r <= {(DATAWIDTH*2){1'b0}} ; - end - else - begin - buflev <= buflev_c ; - firstb <= firstb_c ; - buf_r <= buf_c ; - end - end - - always @(posedge clk) - begin : lbe_reg_proc - if (rst) - begin - fifobe <= {(DATAWIDTH/8){1'b1}} ; - end - else - begin - if (ififowe) - begin - case (DATAWIDTH) - 8 : - begin - fifobe <= 1'b1 ; - end - 16 : - begin - case (buflev) - 4'b0001 : - begin - fifobe <= 2'b01 ; - end - default : - begin - fifobe <= 2'b11 ; - end - endcase - end - default : - begin - case (buflev) - 4'b0001 : - begin - fifobe <= 4'b0001 ; - end - 4'b0010 : - begin - fifobe <= 4'b0011 ; - end - 4'b0011 : - begin - fifobe <= 4'b0111 ; - end - default : - begin - fifobe <= 4'b1111 ; - end - endcase - end - endcase - end - end - end - - assign es_c = ur | lc | lo | nc | ec ; - - assign tstat = {1'b0, TDES0_RV[30:16], - es_c, TDES0_RV[14:12], lo, nc, lc, - ec, TDES0_RV[7], - cc, TDES0_RV[2], ur, de}; - - assign datao32 = (tsprog) ? tstat : (set) ? SET0_RV : TDES0_RV ; - - always @(posedge clk) - begin : dataimax_reg_proc - if (rst) - begin - dataimax_r <= {DATADEPTH_MAX{1'b1}} ; - end - else - begin - case (DATAWIDTH) - 8 : - begin - case (dmaaddr20) - 3'b000, 3'b100 : - begin - dataimax_r[7:0] <= dmadatai_max[DATAWIDTH-1:0] ; - end - 3'b001, 3'b101 : - begin - dataimax_r[15:8] <= dmadatai_max[DATAWIDTH-1:0] ; - end - 3'b010, 3'b110 : - begin - dataimax_r[23:16] <= dmadatai_max[DATAWIDTH-1:0] ; - end - default : - begin - dataimax_r[31:24] <= dmadatai_max[DATAWIDTH-1:0] ; - end - endcase - end - 16 : - begin - if (!(dmaaddr[1])) - begin - dataimax_r[15:0] <= dmadatai_max[DATAWIDTH-1:0] ; - end - else - begin - dataimax_r[31:16] <= dmadatai_max[DATAWIDTH-1:0] ; - end - end - default : - begin - dataimax_r <= dmadatai_max[31:0] ; - end - endcase - end - end - - always @(datao32 or dmaaddr) - begin : datao_proc - reg[1:0] addr10; - addr10 = dmaaddr[1:0]; - case (DATAWIDTH) - 8 : - begin - case (addr10) - 2'b00 : - begin - dmadatao <= datao32[7:0] ; - end - 2'b01 : - begin - dmadatao <= datao32[15:8] ; - end - 2'b10 : - begin - dmadatao <= datao32[23:16] ; - end - default : - begin - dmadatao <= datao32[31:24] ; - end - endcase - end - 16 : - begin - if (!(addr10[1])) - begin - dmadatao <= datao32[15:0] ; - end - else - begin - dmadatao <= datao32[31:16] ; - end - end - default : - begin - dmadatao <= datao32 ; - end - endcase - end - - assign flmax_sub = fzero_max[FIFODEPTH - 1:0] - 1 - fifolev ; - - assign flmax = {fzero_max[FIFODEPTH_MAX - 1:FIFODEPTH], - flmax_sub} ; - - assign blmax = {fzero_max[FIFODEPTH_MAX - 1:6], pbl} ; - - assign bsmax = (DATAWIDTH == 8) ? {fzero_max[FIFODEPTH_MAX - 1:12], - bcnt} : - (DATAWIDTH ==16) ? {fzero_max[FIFODEPTH_MAX - 1:11], - bcnt[11:1]} : - {fzero_max[FIFODEPTH_MAX - 1:10], - bcnt[11:2]} ; - - always @(posedge clk) - begin : fifolev_reg_proc - if (rst) - begin - fl_g_bs <= 1'b0 ; - fl_g_bl <= 1'b0 ; - bl_g_bs <= 1'b0 ; - pblz <= 1'b0 ; - end - else - begin - if (flmax >= bsmax) - begin - fl_g_bs <= 1'b1 ; - end - else - begin - fl_g_bs <= 1'b0 ; - end - - if (flmax >= blmax) - begin - fl_g_bl <= 1'b1 ; - end - else - begin - fl_g_bl <= 1'b0 ; - end - - if (blmax >= bsmax) - begin - bl_g_bs <= 1'b1 ; - end - else - begin - bl_g_bs <= 1'b0 ; - end - - if (pbl == 6'b000000) - begin - pblz <= 1'b1 ; - end - else - begin - pblz <= 1'b0 ; - end - end - end - - always @(csm or - lsm or - pblz or - tsprog or - fl_g_bs or - fl_g_bl or - bl_g_bs or - blmax or - bsmax or - flmax or - fzero_max or - buffetch or - dmacnt_r) - begin : dmacnt_proc - if (lsm == LSM_DES0 | - lsm == LSM_DES1 | - lsm == LSM_DES2 | - lsm == LSM_DES3 | - lsm == LSM_STAT | tsprog) - begin - case (DATAWIDTH) - 8 : - begin - dmacnt_c <= {fzero_max[FIFODEPTH_MAX - 1:3], 3'b100} ; - end - 16 : - begin - dmacnt_c <= {fzero_max[FIFODEPTH_MAX - 1:3], 3'b010} ; - end - default : - begin - dmacnt_c <= {fzero_max[FIFODEPTH_MAX - 1:3], 3'b001} ; - end - endcase - end - else if(!buffetch) - begin - if (pblz) - begin - if (fl_g_bs | csm == CSM_SET) - begin - dmacnt_c <= bsmax ; - end - else - begin - dmacnt_c <= flmax ; - end - end - else - begin - if (fl_g_bl | csm == CSM_SET) - begin - if (bl_g_bs) - begin - dmacnt_c <= bsmax ; - end - else - begin - dmacnt_c <= blmax ; - end - end - else - begin - if (fl_g_bs) - begin - dmacnt_c <= bsmax ; - end - else - begin - dmacnt_c <= flmax ; - end - end - end - end - else - begin - dmacnt_c <= dmacnt_r; - end - end - - always @(posedge clk) - begin : dmacnt_reg_proc - if (rst) - begin - dmacnt_r <= {FIFODEPTH_MAX{1'b0}}; - end - else - begin - dmacnt_r <= dmacnt_c; - end - end - - assign dmacnt = dmacnt_c; - - always @(posedge clk) - begin : lastdma_reg_proc - if (rst) - begin - lastdma <= 1'b1 ; - end - else - begin - if (lsm == LSM_DES0 | - lsm == LSM_DES1 | - lsm == LSM_DES2 | - lsm == LSM_DES3 | - lsm == LSM_STAT | tsprog) - begin - lastdma <= 1'b1 ; - end - else if (!buffetch) - begin - if (pblz) - begin - if (fl_g_bs | csm == CSM_SET) - begin - lastdma <= 1'b1 ; - end - else - begin - lastdma <= 1'b0 ; - end - end - else - begin - if (fl_g_bl | csm == CSM_SET) - begin - if (bl_g_bs) - begin - lastdma <= 1'b1 ; - end - else - begin - lastdma <= 1'b0 ; - end - end - else - begin - if (fl_g_bs) - begin - lastdma <= 1'b1 ; - end - else - begin - lastdma <= 1'b0 ; - end - end - end - end - end - end - - always @(tsprog or lsm or statadi or bad or dad or statad) - begin : dmaaddro_proc - if (tsprog) - begin - dmaaddro <= statadi ; - end - else - begin - case (lsm) - LSM_BUF1, LSM_BUF2 : - begin - dmaaddro <= bad ; - end - LSM_STAT : - begin - dmaaddro <= statad ; - end - default : - begin - dmaaddro <= dad ; - end - endcase - end - end - - always @(req or - dmaack or - dmaeob or - lsm or - tsprog or - fifoval or - req_r) - begin : req_proc - case (lsm) - LSM_BUF1, LSM_BUF2 : - begin - if (dmaack & dmaeob) - begin - req_c <= 1'b0 ; - end - else if ((fifoval & req_r == 3'b000) | tsprog) - begin - req_c <= 1'b1 ; - end - else - begin - req_c <= req ; - end - end - LSM_DES0, LSM_DES1, LSM_DES2, LSM_DES3, LSM_STAT : - begin - if (dmaack) - begin - req_c <= 1'b0 ; - end - else - begin - req_c <= 1'b1 ; - end - end - default : - begin - if (dmaack) - begin - req_c <= 1'b0 ; - end - else if (tsprog) - begin - req_c <= 1'b1 ; - end - else - begin - req_c <= 1'b0 ; - end - end - endcase - end - - always @(posedge clk) - begin : req_reg_proc - if (rst) - begin - req <= 1'b0 ; - req_r <= {3{1'b0 }}; - dmaack_r <= 1'b0 ; - end - else - begin - req <= req_c ; - req_r[0] <= req; - req_r[1] <= req_r[0]; - req_r[2] <= req_r[1]; - dmaack_r <= dmaack & dmaeob ; - end - end - - assign dmawr = (tsprog | lsm == LSM_STAT) ? 1'b1 : 1'b0 ; - - assign dmareq = req ; - - always @(posedge clk) - begin : stat_reg_proc - if (rst) - begin - des <= 1'b0 ; - fbuf <= 1'b0 ; - stat <= 1'b0 ; - tsprog <= 1'b0 ; - buffetch <= 1'b0 ; - tu <= 1'b0 ; - end - else - begin - if (lsm == LSM_DES0 | - lsm == LSM_DES1 | - lsm == LSM_DES2 | - lsm == LSM_DES3) - begin - des <= 1'b1 ; - end - else - begin - des <= 1'b0 ; - end - - if (lsm == LSM_BUF1 | lsm == LSM_BUF2) - begin - fbuf <= 1'b1 ; - end - else - begin - fbuf <= 1'b0 ; - end - - if (tsprog) - begin - stat <= 1'b1 ; - end - else - begin - stat <= 1'b0 ; - end - - if ((dmaeob & dmaack) | itcomp | tcompack_r) - begin - tsprog <= 1'b0 ; - end - else if (csne & !idmareq & !icachere) - begin - tsprog <= 1'b1 ; - end - - if (dmaack_r) - begin - buffetch <= 1'b0 ; - end - else if (req_r[0] & (lsm == LSM_BUF1 | lsm == LSM_BUF2)) - begin - buffetch <= 1'b1 ; - end - - if (lsm == LSM_IDLE & !own) - begin - tu <= 1'b1 ; - end - else if (own_c) - begin - tu <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : tcompack_reg_proc - if (rst) - begin - tcompack_r <= 1'b0 ; - itcomp <= 1'b0 ; - end - else - begin - tcompack_r <= tcompack ; - - if (tsprog & dmaeob & dmaack) - begin - itcomp <= 1'b1 ; - end - else if (tcompack_r) - begin - itcomp <= 1'b0 ; - end - end - end - - assign tcomp = itcomp ; - - always @(posedge clk) - begin : setp_reg_proc - if (rst) - begin - setp <= 1'b0 ; - end - else - begin - if (csm == CSM_SET) - begin - setp <= 1'b1 ; - end - else - begin - setp <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : ifaddr_reg_proc - if (rst) - begin - ifaddr <= {ADDRDEPTH{1'b0}} ; - end - else - begin - if (csm == CSM_IDLE) - begin - ifaddr <= {ADDRDEPTH{1'b0}} ; - end - else if (ifwe) - begin - ifaddr <= ifaddr + 1 ; - end - end - end - - always @(posedge clk) - begin : ifwe_reg_proc - if (rst) - begin - ifwe <= 1'b0 ; - end - else - begin - case (DATAWIDTH) - 8 : - begin - if (csm == CSM_SET & - dmaack & - dmaaddr[1:0] == 2'b11 & - lsm == LSM_BUF1) - begin - ifwe <= 1'b1 ; - end - else - begin - ifwe <= 1'b0 ; - end - end - 16 : - begin - if (csm == CSM_SET & - dmaack & - dmaaddr[1] & - lsm == LSM_BUF1) - begin - ifwe <= 1'b1 ; - end - else - begin - ifwe <= 1'b0 ; - end - end - default : - begin - if (csm == CSM_SET & dmaack & - lsm == LSM_BUF1) - begin - ifwe <= 1'b1 ; - end - else - begin - ifwe <= 1'b0 ; - end - end - endcase - end - end - - assign faddr = ifaddr ; - - assign fwe = ifwe ; - - assign fdata = dataimax_r[15:0] ; - - always @(posedge clk) - begin : stop_reg_proc - if (rst) - begin - stop_r <= 1'b1 ; - stopo <= 1'b1 ; - end - else - begin - stop_r <= stopi ; - - if (lsm == LSM_IDLE & stop_r) - begin - stopo <= 1'b1 ; - end - else - begin - stopo <= 1'b0 ; - end - end - end - - assign fzero_max = {FIFODEPTH_MAX{1'b0}} ; - - assign dzero_max = {DATAWIDTH_MAX{1'b0}} ; - - assign bufzero_max = {(DATAWIDTH_MAX * 2 - 9){1'b0}} ; - - assign dmaaddr20 = dmaaddr[2:0] ; - - assign dmadatai_max = {dzero_max[DATAWIDTH_MAX+1:DATAWIDTH], - dmadatai}; - - assign buf_r_max = {bufzero_max[DATAWIDTH_MAX * 2 - 7: - DATAWIDTH * 2 - 8], - buf_r}; - -endmodule diff --git a/resources/soc/rtl/MAC/utility.v b/resources/soc/rtl/MAC/utility.v deleted file mode 100644 index aeef9aa..0000000 --- a/resources/soc/rtl/MAC/utility.v +++ /dev/null @@ -1,282 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - - //----------------------------------------------------------------- - // 802.3 parameters - //----------------------------------------------------------------- - // interframe space 1 interval = 60 bit times - parameter [3:0] IFS1_TIME = 4'b1110; - // interframe space 2 interval = 36 bit times - //parameter [3:0] IFS2_TIME = 4'b1000; - parameter [3:0] IFS2_TIME = 4'b0110; - // slot time interfal = 512 bit times - parameter [8:0] SLOT_TIME = 9'b001111111; - // maximum number of retransmission attempts = 16 - parameter [4:0] ATT_MAX = 5'b10000; - // proper crc remainder value = 0xc704dd7b - parameter [31:0] CRCVAL = 32'b11000111000001001101110101111011; - // minimum frame size = 64 - parameter [6:0] MIN_FRAME = 7'b1000000; - // maximum ethernet frame length field value = 1500 - parameter [15:0] MAX_SIZE = 16'b0000010111011100; - // maximum frame size - parameter [13:0] MAX_FRAME = 14'b00010111101111; // 1519 - - //_________________________________________________________________ - // Control and Status Register summary - //_________________________________________________________________ - // Register | ID | RV | Description - //_________________________________________________________________ - // CSR0 | 00h | fe000000h | Bus mode - // CSR1 | 08h | ffffffffh | Transmit pool demand - // CSR2 | 10h | ffffffffh | Teceive pool demand - // CSR3 | 18h | ffffffffh | Receive list base address - // CSR4 | 20h | ffffffffh | Rransmit list base address - // CSR5 | 28h | f0000000h | Status - // CSR6 | 30h | 32000040h | Operation mode - // CSR7 | 38h | f3fe0000h | Interrupt enable - // CSR8 | 40h | e0000000h | Missed frames and overflow cnt - // CSR9 | 48h | fff483ffh | MII management - // CSR11 | 58h | fffe0000h | Timer and interrupt mitigation - //_________________________________________________________________ - - //----------------------------------------------------------------- - // Special Function Register locations and reset values - //----------------------------------------------------------------- - // CSR0 : 00h : fe000000h : Bus mode - parameter [5:0] CSR0_ID = 6'b000000; - // CSR0 reset value - parameter [31:0] CSR0_RV = 32'b11111110000000000000000000000000; - - // CSR1 : 08h : ffffffffh : Transmit pool demand - parameter [5:0] CSR1_ID = 6'b000010; - // CSR1 reset value - parameter [31:0] CSR1_RV = 32'b11111111111111111111111111111111; - - // CSR2 : 10h : ffffffffh : Receive pool demand - parameter [5:0] CSR2_ID = 6'b000100; - // CSR2 reset value - parameter [31:0] CSR2_RV = 32'b11111111111111111111111111111111; - - // CSR3 : 18h : ffffffffh : Receive list base address - parameter [5:0] CSR3_ID = 6'b000110; - // CSR3 reset value - parameter [31:0] CSR3_RV = 32'b11111111111111111111111111111111; - - // CSR4 : 20h : ffffffffh : Transmit list base address - parameter [5:0] CSR4_ID = 6'b001000; - // CSR4 reset value - parameter [31:0] CSR4_RV = 32'b11111111111111111111111111111111; - - // CSR5 : 28h : f0000000h : Status - parameter [5:0] CSR5_ID = 6'b001010; - // CSR5 reset value - parameter [31:0] CSR5_RV = 32'b11110000000000000000000000000000; - - // CSR6 : 30h : 32000040h : Operation mode - parameter [5:0] CSR6_ID = 6'b001100; - // CSR6 reset value - parameter [31:0] CSR6_RV = 32'b00110010000000000000000001000000; - - // CSR7 : 38h : f3fe0000h : Interrupt enable - parameter [5:0] CSR7_ID = 6'b001110; - // CSR7 reset value - parameter [31:0] CSR7_RV = 32'b11110011111111100000000000000000; - - // CSR8 : 40h : e0000000h : Missed frames and overflow cnt - parameter [5:0] CSR8_ID = 6'b010000; - // CSR8 reset value - parameter [31:0] CSR8_RV = 32'b11100000000000000000000000000000; - - // CSR9 : 48h : fff483ffh : MII menagement - parameter [5:0] CSR9_ID = 6'b010010; - // CSR9 reset value - parameter [31:0] CSR9_RV = 32'b11111111111101001000001111111111; - - // CSR10 : 50h : 00000000h : Insert function enable - parameter [5:0] CSR10_ID = 6'b010100; - // CSR11 reset value - parameter [31:0] CSR10_RV = 32'b00000000000000000000000000000000; - - // CSR11 : 58h : fffe0000h : Timer and interrupt mitigation - parameter [5:0] CSR11_ID = 6'b010110; - // CSR11 reset value - parameter [31:0] CSR11_RV = 32'b11111111111111100000000000000000; - - // TDES0 - parameter [31:0] TDES0_RV = 32'b00000000000000000000000000000000; - - // SET0 - parameter [31:0] SET0_RV = 32'b00000000000000000000000000000000; - - // RDES0 - parameter [31:0] RDES0_RV = 32'b00000000000000000000000000000000; - - //----------------------------------------------------------------- - // Internal interface parameters - //----------------------------------------------------------------- - // CSR interface address width - parameter CSRDEPTH = 8; - // Filtering RAM address width - parameter ADDRDEPTH = 6; - // Filtering RAM data width - parameter ADDRWIDTH = 16; - // Maximum FIFO depth - parameter FIFODEPTH_MAX = 15; - // Maximum Data interface address width - parameter DATADEPTH_MAX = 32; - // Maximum Data interface width - parameter DATAWIDTH_MAX = 32; - // Maximum CSR interface width - parameter CSRWIDTH_MAX = 32; - // MII width - parameter MIIWIDTH = 4; - parameter MIIWIDTH_MAX = 8; - - - //----------------------------------------------------------------- - // Filtering modes - //----------------------------------------------------------------- - // Filtering mode - PREFECT -- - parameter [1:0] FT_PERFECT = 2'b00; - // Filtering mode - HASH -- - parameter [1:0] FT_HASH = 2'b01; - // Filtering mode - INVERSE -- - parameter [1:0] FT_INVERSE = 2'b10; - // Filtering mode - HONLY -- - parameter [1:0] FT_HONLY = 2'b11; - - //----------------------------------------------------------------- - // Phisical address position in setup frame - //----------------------------------------------------------------- - parameter [5:0] PERF1_ADDR = 6'b100111; - - //----------------------------------------------------------------- - // Ethernet frame fields - //----------------------------------------------------------------- - // jam field pattern - parameter [63:0] JAM_PATTERN = 64'b1010101010101010101010101010101010101010101010101010101010101010; - // preamble field pattern - parameter [63:0] PRE_PATTERN = 64'b0101010101010101010101010101010101010101010101010101010101010101; - // start of frame delimiter pattern - parameter [63:0] SFD_PATTERN = 64'b1101010111010101110101011101010111010101110101011101010111010101; - // padding field pattern - parameter [63:0] PAD_PATTERN = 64'b0000000000000000000000000000000000000000000000000000000000000000; - // carrier extension pattern - parameter [63:0] EXT_PATTERN = 64'b0000111100001111000011110000111100001111000011110000111100001111; - - //----------------------------------------------------------------- - // Enumeration types - //----------------------------------------------------------------- - - // DMA state machine - parameter [1:0] DSM_IDLE = 0; - parameter [1:0] DSM_CH1 = 1; - parameter [1:0] DSM_CH2 = 2; - - // process state machine type for HC - parameter [1:0] PSM_RUN = 0; - parameter [1:0] PSM_SUSPEND = 1; - parameter [1:0] PSM_STOP = 2; - - // receive state machine for HC - parameter [2:0] RSM_IDLE = 0; - parameter [2:0] RSM_ACQ1 = 1; // trying to acquire free descriptor - parameter [2:0] RSM_ACQ2 = 2; // trying to acquire free descriptor - parameter [2:0] RSM_REC = 3; // receiving frame - parameter [2:0] RSM_STORE = 4; // storing frame - parameter [2:0] RSM_STAT = 5; // status of the frame - - // linked list state machine for HC - parameter [3:0] LSM_IDLE = 0; - parameter [3:0] LSM_DES0P = 1; // des0 prefetching - parameter [3:0] LSM_DES0 = 2; // des0 fetching - parameter [3:0] LSM_DES1 = 3; // des1 fetching - parameter [3:0] LSM_DES2 = 4; // des2 fetching - parameter [3:0] LSM_DES3 = 5; // des3 fetching - parameter [3:0] LSM_BUF1 = 6; // buffer 1 fetching - parameter [3:0] LSM_BUF2 = 7; // buffer 2 fetching - parameter [3:0] LSM_STAT = 8; // descriptor status storing - parameter [3:0] LSM_FSTAT = 9; // frame status storing - parameter [3:0] LSM_NXT = 10; // next descriptor's address computing - - // descriptor's control state machine for HC - parameter [2:0] CSM_IDLE = 0; - parameter [2:0] CSM_F = 1; // first descriptor - parameter [2:0] CSM_I = 2; // intermediate descriptor - parameter [2:0] CSM_L = 3; // last descriptor - parameter [2:0] CSM_FL = 4; // first and last descriptor - parameter [2:0] CSM_SET = 5; // setup frame descriptor - parameter [2:0] CSM_BAD = 6; // invalid descriptor - - // master interface state machine for HC - parameter [1:0] MSM_IDLE = 0; - parameter [1:0] MSM_REQ = 1; - parameter [1:0] MSM_BURST = 2; - - // receive state machine for RC - parameter [3:0] RSM_IDLE_RCSMT = 0; - parameter [3:0] RSM_SFD = 1; - parameter [3:0] RSM_DEST = 2; - parameter [3:0] RSM_SOURCE = 3; - parameter [3:0] RSM_LENGTH = 4; - parameter [3:0] RSM_INFO = 5; - parameter [3:0] RSM_SUCC = 6; - parameter [3:0] RSM_INT = 7; - parameter [3:0] RSM_INT1 = 8; - parameter [3:0] RSM_BAD = 9; // flushing received frame from fifo - - // address filtering state machine - parameter [2:0] FSM_IDLE = 0; - parameter [2:0] FSM_PERF1 = 1; // checking single physical address - parameter [2:0] FSM_PERF16 = 2; // checking 16 addresses - parameter [2:0] FSM_HASH = 3; // hash fitering - parameter [2:0] FSM_MATCH = 4; // address match - parameter [2:0] FSM_FAIL = 5; // address failed - - // deffering state machine for TC - parameter [1:0] DSM_WAIT = 0; // end of IFS, waiting for pending frame - parameter [1:0] DSM_IFS1 = 1; // calculating interframe space time 1 - parameter [1:0] DSM_IFS2 = 2; // calculating interframe space time 2 - - // transmit state machine for TC - parameter [3:0] TSM_IDLE_TCSMT = 0; - parameter [3:0] TSM_PREA = 1; - parameter [3:0] TSM_SFD = 2; - parameter [3:0] TSM_INFO = 3; - parameter [3:0] TSM_PAD = 4; - parameter [3:0] TSM_CRC = 5; - parameter [3:0] TSM_BURST = 6; - parameter [3:0] TSM_JAM = 7; - parameter [3:0] TSM_FLUSH = 8; - parameter [3:0] TSM_INT = 9; diff --git a/resources/soc/rtl/SPI/godson_sbridge_spi.v b/resources/soc/rtl/SPI/godson_sbridge_spi.v deleted file mode 100644 index 1928447..0000000 --- a/resources/soc/rtl/SPI/godson_sbridge_spi.v +++ /dev/null @@ -1,896 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -module spi_flash_ctrl( - input aclk, - input aresetn, - input [15:0] spi_addr, - input power_down_req, - output power_down_ack, - input fast_startup, - - input [3:0] s_awlen, - input [3:0] s_awcache, - input [3:0] s_awid, - input [31:0] s_awaddr, - input [2:0] s_awsize, - input [2:0] s_awprot, - input [1:0] s_awburst, - input [1:0] s_awlock, - input s_awvalid, - output s_awready, - - input [3:0] s_wid, - input [31:0] s_wdata, - input [3:0] s_wstrb, - input s_wlast, - input s_wvalid, - output s_wready, - - output [3:0] s_bid, - output [1:0] s_bresp, - output s_bvalid, - input s_bready, - - input [3:0] s_arlen, - input [3:0] s_arcache, - input [3:0] s_arid, - input [31:0] s_araddr, - input [2:0] s_arsize, - input [2:0] s_arprot, - input [1:0] s_arburst, - input [1:0] s_arlock, - input s_arvalid, - output s_arready, - - output [3:0] s_rid, - output [31:0] s_rdata, - output [1:0] s_rresp, - output s_rlast, - output s_rvalid, - input s_rready, - - output [3:0] csn_o, - output [3:0] csn_en, - output sck_o, - input sdo_i, - output sdo_o, - output sdo_en, - input sdi_i, - output sdi_o, - output sdi_en, - output inta_o -); - - wire areset = ~aresetn; - - wire param_memory_en; - wire param_burst_en; - wire param_fast_read; - wire param_dual_io; - wire [1:0] param_tCSH; - wire param_tFAST; - - reg [9:0] rd_state; - reg [9:0] rd_state_nxt; - - parameter S_IDLE = 10'b0000000001; - parameter S_IOREAD = 10'b0000000010; - parameter S_CSTURN = 10'b0000000100; - parameter S_ADDR = 10'b0000001000; - parameter S_DATA = 10'b0000010000; - parameter S_WAITBUS= 10'b0000100000; - parameter S_PDENTER= 10'b0001000000; - parameter S_PDEXIT = 10'b0010000000; - parameter S_STARTUP= 10'b0100000000; - parameter S_PWRDOWN= 10'b1000000000; - - wire s_idle = rd_state[0]; - wire s_ioread = rd_state[1]; - wire s_csturn = rd_state[2]; - wire s_addr = rd_state[3]; - wire s_data = rd_state[4]; - wire s_waitbus= rd_state[5]; - wire s_pdenter= rd_state[6]; - wire s_pdexit = rd_state[7]; - wire s_startup= rd_state[8]; - wire s_pwrdown= rd_state[9]; - - wire ns_idle = rd_state_nxt[0]; - wire ns_ioread = rd_state_nxt[1]; - wire ns_csturn = rd_state_nxt[2]; - wire ns_addr = rd_state_nxt[3]; - wire ns_data = rd_state_nxt[4]; - wire ns_waitbus= rd_state_nxt[5]; - wire ns_pdenter= rd_state_nxt[6]; - wire ns_pdexit = rd_state_nxt[7]; - wire ns_startup= rd_state_nxt[8]; - wire ns_pwrdown= rd_state_nxt[9]; - - reg pdreq_r; - - reg [15:0] cs_timer; - reg cs; - reg [23:0] nxt_addr; - - wire write_valid; - wire reg_acc = s_ioread | write_valid; - wire reg_ack; - wire [7:0] reg_dat_i, reg_dat_o; - wire [7:0] param_o; - - reg [31:0] shift_reg; - reg [ 1:0] sample; - wire [31:0] shift_reg_nxt; - wire sr_shift_inst; - wire sr_shift_one; - wire sr_shift_two; - reg sr_shift_inst_r; - reg sr_shift_two_r; - wire sample_en; - wire shift_en; - wire dual_out; - wire dual_in; - wire [1:0] serial_out; - wire cyc_end; - - - reg [2:0] bit_cnt; - wire spi_pause; - wire spibus_busy; - - reg [5:0] adbit_cnt; - reg spi_run; - reg sck; - - reg buf_busy; - reg [31:0] buf_addr; - reg [ 3:0] buf_len; - reg [ 2:0] buf_size; - reg [ 3:0] buf_id; - reg buf_write; - reg buf_wrap; - - assign s_arready = s_idle & ~pdreq_r & ~buf_busy & ~s_awvalid; - assign s_awready = s_idle & ~pdreq_r & ~buf_busy; - - reg buf_busy_d; - wire new_axireq = ~buf_busy_d & buf_busy; - wire io_hit =(buf_addr[31:4] == {spi_addr, 12'b0}) & - (buf_len == 4'b0); - - wire [63:0] buf_addr_t = (buf_addr[31:20]==12'h1fc)? - {12'h0, buf_addr[19:0]}: - { 8'h0, buf_addr[23:0]}; - - wire burst_cont = param_burst_en & cs & - (buf_addr_t[23:0] == nxt_addr[23:0]); - - wire burst_switch = param_burst_en & cs & - (buf_addr_t[23:0] != nxt_addr[23:0]); - - reg [7:0] tot_bytes; - wire byte_ready; - - always @(posedge aclk) begin - if (areset) begin - buf_busy <= 1'b0; - buf_write <= 1'b0; - tot_bytes <= 8'b0; - end else begin - if ((s_arvalid|s_awvalid)&~buf_busy&s_idle&~pdreq_r) begin - buf_busy <= 1'b1; - buf_addr <= s_awvalid ? s_awaddr : s_araddr; - buf_size <= s_awvalid ? s_awsize : s_arsize; - buf_len <= s_awvalid ? s_awlen : s_arlen; - buf_id <= s_awvalid ? s_awid : s_arid; - buf_write<= s_awvalid; - buf_wrap <= s_arvalid & (s_arburst==2'b10) & - (|s_araddr[4:2]) & (|s_arlen); - tot_bytes<= {8{s_arvalid&~s_awvalid}}& - (({4'b0,s_arlen} << s_arsize)| - ((8'b1<=6'd8) | s_data) & param_dual_io; - always @(posedge aclk) begin - sr_shift_inst_r <= areset ? 1'b0 : - cyc_end|(~s_addr&ns_addr) ? ns_addr & (adbit_cnt < 6'd7) : - sr_shift_inst_r; - sr_shift_two_r <= areset ? 1'b0 : - cyc_end|(~s_data&ns_data) ? (s_addr & (adbit_cnt >=6'd7) | ns_data) & param_dual_io : - sr_shift_two_r; - end - - assign sr_shift_one = 1'bz; - wire addr_done; - assign addr_done = param_dual_io ? adbit_cnt == 6'd23 : - param_fast_read ? adbit_cnt == 6'd39 : - adbit_cnt == 6'd31 ; - assign dual_out = param_dual_io & - (adbit_cnt >= 6'd8 && adbit_cnt < 6'd22); - reg dual_in_r; - assign dual_in = param_dual_io & - (adbit_cnt >= 6'd22 | s_data | dual_in_r); - always @(posedge aclk) begin - dual_in_r <= areset ? 1'b0 : - s_csturn&cswcnt[0]? 1'b0 : - ~cs ? 1'b0 : - dual_in ? 1'b1 : dual_in_r; - end - - - always @(posedge aclk) begin - pdreq_r <= power_down_req; - end - wire go_power_down = pdreq_r & ~buf_busy; - assign power_down_ack = s_pwrdown | s_pdexit | s_startup; - - always @(posedge aclk) begin - rd_state <= areset ? S_PWRDOWN : rd_state_nxt; - end - - always @(*) begin - rd_state_nxt = rd_state; - case (rd_state) // synopsys parallel_case - S_IDLE :if (new_axireq & ~buf_write) begin - rd_state_nxt = io_hit ? S_IOREAD: - spibus_busy ? S_WAITBUS: - burst_cont ? S_DATA : - S_CSTURN; - end else if (go_power_down) begin - rd_state_nxt = cs ? S_CSTURN : - S_PDENTER; - end - S_IOREAD: rd_state_nxt = S_IDLE; - S_CSTURN: rd_state_nxt = clkena & (&cswcnt_w)? (go_power_down? S_PDENTER:S_ADDR): - S_CSTURN; - S_ADDR : rd_state_nxt = clkena & sck & - addr_done ? S_DATA : S_ADDR; - S_DATA : rd_state_nxt = byte_ready & ~spi_pause & ~|tot_bytes ? S_IDLE: - byte_ready & ~spi_pause & buf_wrap - & (&nxt_addr[4:0])? S_CSTURN: - byte_ready & ~spi_pause & ~param_burst_en ? S_CSTURN: - S_DATA; - S_WAITBUS:rd_state_nxt = spibus_busy ? S_WAITBUS : S_ADDR; - - S_PWRDOWN:rd_state_nxt = go_power_down ? S_PWRDOWN : S_PDEXIT; - S_PDEXIT :rd_state_nxt = cyc_end & (&bit_cnt[2:0]) ? S_STARTUP : S_PDEXIT; - S_PDENTER:rd_state_nxt = cyc_end & (&bit_cnt[2:0]) ? S_PWRDOWN : S_PDENTER; - S_STARTUP:rd_state_nxt = &(cs_timer[10:0]|{{5{fast_startup}}, 6'b0}) ? S_IDLE : - S_STARTUP; - endcase - end - - - wire ss_sck, ss_mosi, ss_miso; - wire [7:0] param, softcs, param2; - wire sspi_write = buf_write | second_write; - - simple_spi_top simple_spi( - .clk_i (aclk ), - .rst_i (aresetn ), - .cyc_i (buf_busy ), - .stb_i (reg_acc ), - .adr_i (buf_addr[3:0] ), - .we_i (sspi_write ), - .dat_i (reg_dat_i ), - .dat_o (reg_dat_o ), - .ack_o (reg_ack ), - .inta_o (inta_o ), - - .sck_o (ss_sck ), - .mosi_o (ss_mosi ), - .miso_i (ss_miso ), - - .param (param ), - .param2 (param2 ), - .softcs (softcs ), - .busy (spibus_busy ) - ); - assign ss_miso = sdi_i; - - assign reg_dat_i = second_write ? s_wdata[ 31: 24] : - buf_addr[1:0]==2'h0 ? s_wdata[ 7: 0] : - buf_addr[1:0]==2'h1 ? s_wdata[ 15: 8] : - buf_addr[1:0]==2'h2 ? s_wdata[ 23: 16] : - s_wdata[ 31: 24] ; - - assign param_memory_en = param[0]; - assign param_burst_en = param[1]; - assign param_fast_read = param[2]; - assign param_dual_io = param[3]; - assign espr = param[7:4]; - - assign param_tCSH = param2[1:0]; - assign param_tFAST = param2[2]; - assign param_scs = param2[3]; - - assign csn_en[0] = param_memory_en? 1'b0: ~softcs[0]; - assign csn_o [0] = param_memory_en? ~cs : softcs[4]; - - assign csn_en[3:1] =~softcs[3:1]; - assign csn_o [3:1] = softcs[7:5]|{3{cs|(~spibus_busy & param_scs)}}; - - assign sdi_en = ~spibus_busy¶m_memory_en? ~dual_out : 1'b1; - assign sdi_o = ~spibus_busy¶m_memory_en? serial_out[1] : 1'b0; - - assign sdo_en = ~spibus_busy¶m_memory_en? dual_in : 1'b0; - assign sdo_o = ~spibus_busy¶m_memory_en? serial_out[0] | s_data - : ss_mosi; - - assign sck_o = ~spibus_busy¶m_memory_en? sck : ss_sck; - -endmodule - - -module simple_spi_top( - input wire clk_i, - input wire rst_i, - input wire cyc_i, - input wire stb_i, - input wire [3:0] adr_i, - input wire we_i, - input wire [7:0] dat_i, - output reg [7:0] dat_o, - output reg ack_o, - output reg inta_o, - - output reg sck_o, - output wire mosi_o, - input wire miso_i, - - output reg [7:0] param, - output reg [7:0] param2, - output reg [7:0] softcs, - output reg busy -); - - reg [7:0] spcr; - wire [7:0] spsr; - reg [7:0] sper; - reg [7:0] treg, rreg; - - wire [7:0] rfdout; - reg wfre, rfwe; - wire rfre, rffull, rfempty; - wire [7:0] wfdout; - wire wfwe, wffull, wfempty; - - wire tirq; - wire wfov; - reg [1:0] state; - reg [2:0] bcnt; - - wire wb_acc = cyc_i & stb_i; - wire wb_wr = wb_acc & we_i; - - always @(posedge clk_i) - if (~rst_i) - begin - spcr <= 8'h12; - sper <= 8'h00; - `ifdef FAST_SIMU - param<= 8'h1; - param2<=8'h07; - `else - param<= 8'h1; - param2<=8'h03; - `endif - softcs<=8'hf0; - end - else if (wb_wr) - begin - if (adr_i == 4'b00) - spcr <= dat_i | 8'h10; - - if (adr_i == 4'b11) - sper <= dat_i; - - if (adr_i == 4'b0100) - param <= dat_i; - if (adr_i == 4'b0101) - softcs<= dat_i; - if (adr_i == 4'b0110) - param2 <= dat_i; - end - - assign wfwe = wb_acc & (adr_i == 4'b10) & ack_o & we_i; - assign wfov = wfwe & wffull; - - always @(*) - case(adr_i) // synopsys full_case parallel_case - 4'b0000: dat_o = spcr; - 4'b0001: dat_o = spsr; - 4'b0010: dat_o = rfdout; - 4'b0011: dat_o = sper; - 4'b0100: dat_o = param; - 4'b0101: dat_o = softcs; - 4'b0110: dat_o = param2; - default dat_o = 8'h0; - endcase - - assign rfre = wb_acc & (adr_i == 2'b10) & ack_o & ~we_i; - - always @(posedge clk_i) - ack_o <= 1'b1; - - wire spie = spcr[7]; - wire spe = spcr[6]; - wire dwom = spcr[5]; - wire mstr = spcr[4]; - wire cpol = spcr[3]; - wire cpha = spcr[2]; - wire [1:0] spr = spcr[1:0]; - - wire [1:0] icnt = sper[7:6]; - wire [1:0] spre = sper[1:0]; - wire smh_spi= sper[2]; - - wire [3:0] espr = {spre, spr}; - - wire wr_spsr = wb_wr & (adr_i == 2'b01); - - reg spif; - always @(posedge clk_i) - if (~spe) - spif <= 1'b0; - else - spif <= (tirq | spif) & ~(wr_spsr & dat_i[7]); - - reg wcol; - always @(posedge clk_i) - if (~spe) - wcol <= 1'b0; - else - wcol <= (wfov | wcol) & ~(wr_spsr & dat_i[6]); - - assign spsr[7] = spif; - assign spsr[6] = wcol; - assign spsr[5:4] = 2'b00; - assign spsr[3] = wffull; - assign spsr[2] = wfempty; - assign spsr[1] = rffull; - assign spsr[0] = rfempty; - - - always @(posedge clk_i) - inta_o <= spif & spie; - - spi_fifo4 #(8) - rfifo( - .clk ( clk_i ), - .rst ( rst_i ), - .clr ( ~spe ), - .din ( treg ), - .we ( rfwe ), - .dout ( rfdout ), - .re ( rfre ), - .full ( rffull ), - .empty ( rfempty ) - ), - wfifo( - .clk ( clk_i ), - .rst ( rst_i ), - .clr ( ~spe ), - .din ( dat_i ), - .we ( wfwe ), - .dout ( wfdout ), - .re ( wfre ), - .full ( wffull ), - .empty ( wfempty ) - ); - - reg [11:0] clkcnt; - always @(posedge clk_i) - if(spe & (|clkcnt & |state)) - clkcnt <= clkcnt - 11'h1; - else - case (espr) // synopsys full_case parallel_case - 4'b0000: clkcnt <= 12'h0; - 4'b0001: clkcnt <= 12'h1; - 4'b0010: clkcnt <= 12'h7; - 4'b0011: clkcnt <= 12'hf; - 4'b0100: clkcnt <= 12'h3; - 4'b0101: clkcnt <= 12'h1f; - 4'b0110: clkcnt <= 12'h3f; - 4'b0111: clkcnt <= 12'h7f; - 4'b1000: clkcnt <= 12'hff; - 4'b1001: clkcnt <= 12'h1ff; - 4'b1010: clkcnt <= 12'h3ff; - 4'b1011: clkcnt <= 12'h7ff; - default:; - endcase - - wire ena = ~|clkcnt; - reg sample; - always @(posedge clk_i) - if (~spe) - begin - state <= 2'b00; - bcnt <= 3'h0; - treg <= 8'h00; - wfre <= 1'b0; - rfwe <= 1'b0; - sck_o <= 1'b0; - end - else if (smh_spi) - begin - wfre <= 1'b0; - rfwe <= 1'b0; - - case (state) //synopsys full_case parallel_case - 2'b00: - begin - bcnt <= 3'h7; - treg <= wfdout; - sck_o <= cpol; - - if (~wfempty) begin - wfre <= 1'b1; - state <= 2'b01; - end - end - - 2'b01: - if (ena) begin - sck_o <= ~sck_o; - state <= 2'b10; - if (cpha==0) sample <= miso_i; - end - - 2'b10: - if (ena) begin - sck_o <= ~sck_o; - state <= 2'b11; - if (cpha==0) begin - treg <= {treg[6:0], sample}; - end else begin - sample <= miso_i; - end - end - - 2'b11: - if (ena) begin - bcnt <= bcnt -3'h1; - if (cpha==0) begin - sample <= miso_i; - end else begin - treg <= {treg[6:0], sample}; - end - - if (~|bcnt) begin - state <= 2'b00; - sck_o <= cpol; - rfwe <= 1'b1; - end else begin - state <= 2'b10; - sck_o <= ~sck_o; - end - - end - - endcase - end - else - begin - wfre <= 1'b0; - rfwe <= 1'b0; - - case (state) //synopsys full_case parallel_case - 2'b00: - begin - bcnt <= 3'h7; - treg <= wfdout; - sck_o <= cpol; - - if (~wfempty) begin - wfre <= 1'b1; - state <= 2'b01; - if (cpha) sck_o <= ~sck_o; - end - end - - 2'b01: - if (ena) begin - sck_o <= ~sck_o; - state <= 2'b11; - end - - 2'b11: - if (ena) begin - treg <= {treg[6:0], miso_i}; - bcnt <= bcnt -3'h1; - - if (~|bcnt) begin - state <= 2'b00; - sck_o <= cpol; - rfwe <= 1'b1; - end - else begin - state <= 2'b01; - sck_o <= ~sck_o; - end - end - - 2'b10: state <= 2'b00; - default: state <=2'b00; - endcase - end - - assign mosi_o = treg[7]; - - reg [1:0] tcnt; - always @(posedge clk_i) - if (~spe) - tcnt <= icnt; - else if (rfwe) begin - if (|tcnt) - tcnt <= tcnt - 2'h1; - else - tcnt <= icnt; - end - - assign tirq = ~|tcnt & rfwe; - - always @(posedge clk_i) - busy <= ~wfempty | (|state); -endmodule - -module spi_fifo4(clk, rst, clr, din, we, dout, re, full, empty); - -parameter dw = 8; - -input clk, rst; -input clr; -input [dw:1] din; -input we; -output [dw:1] dout; -input re; -output full, empty; - -reg [dw:1] mem[0:3]; -reg [1:0] wp; -reg [1:0] rp; -wire [1:0] wp_p1; -wire [1:0] wp_p2; -wire [1:0] rp_p1; -wire full, empty; -reg gb; - -always @(posedge clk) - if(!rst) wp <= 2'h0; - else - if(clr) wp <= 2'h0; - else - if(we) wp <= wp_p1; - -assign wp_p1 = wp + 2'h1; -assign wp_p2 = wp + 2'h2; - -always @(posedge clk) - if(!rst) rp <= 2'h0; - else - if(clr) rp <= 2'h0; - else - if(re) rp <= rp_p1; - -assign rp_p1 = rp + 2'h1; - -assign dout = mem[ rp ]; - -always @(posedge clk) - if(we) mem[ wp ] <= din; - -assign empty = (wp == rp) & !gb; -assign full = (wp == rp) & gb; - -always @(posedge clk) - if(!rst) gb <= 1'b0; - else - if(clr) gb <= 1'b0; - else - if((wp_p1 == rp) & we) gb <= 1'b1; - else - if(re) gb <= 1'b0; - -endmodule diff --git a/resources/soc/rtl/TOP/config.h b/resources/soc/rtl/TOP/config.h deleted file mode 100644 index b52301e..0000000 --- a/resources/soc/rtl/TOP/config.h +++ /dev/null @@ -1,98 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -`define Lconfbus 10 -`define Lconfret 9 -`define Lconfbusreg 64 -`define Lconfbusaddr 16 - -`define ORDER_REG_ADDR 16'h1160 - -`define Lawcmd 4 -`define Lawdirqid 4 -`define Lawstate 2 -`define Lawscseti 2 -`define Lawid 4 -`define Lawaddr 32 -`define Lawlen 4 -`define Lawsize 3 -`define Lawburst 2 -`define Lawlock 2 -`define Lawcache 4 -`define Lawprot 3 -`define Lawvalid 1 -`define Lawready 1 -`define Lwid 4 -`define Lwdata 32 -`define Lwstrb 4 -`define Lwlast 1 -`define Lwvalid 1 -`define Lwready 1 -`define Lbid 4 -`define Lbresp 2 -`define Lbvalid 1 -`define Lbready 1 -`define Larcmd 4 -`define Larcpuno 10 -`define Larid 4 -`define Laraddr 32 -`define Larlen 4 -`define Larsize 3 -`define Larburst 2 -`define Larlock 2 -`define Larcache 4 -`define Larprot 3 -`define Larvalid 1 -`define Larready 1 -`define Lrstate 2 -`define Lrscseti 2 -`define Lrid 4 -`define Lrdata 32 -`define Lrresp 2 -`define Lrlast 1 -`define Lrvalid 1 -`define Lrready 1 -`define Lrrequest 1 -/*************************/ -`define LID 4 -`define LADDR 32 -`define LLEN 4 -`define LSIZE 3 -`define LDATA 32 -`define LSTRB 4 -`define LBURST 2 -`define LLOCK 2 -`define LCACHE 4 -`define LPROT 3 -`define LRESP 2 -/************************************/ diff --git a/resources/soc/rtl/TOP/soc_up_top.v b/resources/soc/rtl/TOP/soc_up_top.v deleted file mode 100644 index ab0661f..0000000 --- a/resources/soc/rtl/TOP/soc_up_top.v +++ /dev/null @@ -1,1493 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -`include "config.h" - -module soc_up_top( - input resetn, - input clk, - - //------gpio---------------- - output [15:0] led, - output [1 :0] led_rg0, - output [1 :0] led_rg1, - output [7 :0] num_csn, - output [6 :0] num_a_g, - input [7 :0] switch, - output [3 :0] btn_key_col, - input [3 :0] btn_key_row, - input [1 :0] btn_step, - - //------DDR3 interface------ - inout [15:0] ddr3_dq, - output [12:0] ddr3_addr, - output [2 :0] ddr3_ba, - output ddr3_ras_n, - output ddr3_cas_n, - output ddr3_we_n, - output ddr3_odt, - output ddr3_reset_n, - output ddr3_cke, - output [1:0] ddr3_dm, - inout [1:0] ddr3_dqs_p, - inout [1:0] ddr3_dqs_n, - output ddr3_ck_p, - output ddr3_ck_n, - - //------mac controller------- - //TX - input mtxclk_0, - output mtxen_0, - output [3:0] mtxd_0, - output mtxerr_0, - //RX - input mrxclk_0, - input mrxdv_0, - input [3:0] mrxd_0, - input mrxerr_0, - input mcoll_0, - input mcrs_0, - // MIIM - output mdc_0, - inout mdio_0, - - output phy_rstn, - - //------EJTAG------- - // input EJTAG_TRST, - // input EJTAG_TCK, - // input EJTAG_TDI, - // input EJTAG_TMS, - // output EJTAG_TDO, - - //------uart------- - inout UART_RX, - inout UART_TX, - - //------nand------- - output NAND_CLE , - output NAND_ALE , - input NAND_RDY , - inout [7:0] NAND_DATA, - output NAND_RD , - output NAND_CE , //low active - output NAND_WR , - - //------spi flash------- - output SPI_CLK, - output SPI_CS, - inout SPI_MISO, - inout SPI_MOSI -); -wire aclk; -wire aresetn; - -wire [`LID -1 :0] m0_awid; -wire [`Lawaddr -1 :0] m0_awaddr; -wire [`Lawlen -1 :0] m0_awlen; -wire [`Lawsize -1 :0] m0_awsize; -wire [`Lawburst -1 :0] m0_awburst; -wire [`Lawlock -1 :0] m0_awlock; -wire [`Lawcache -1 :0] m0_awcache; -wire [`Lawprot -1 :0] m0_awprot; -wire m0_awvalid; -wire m0_awready; -wire [`LID -1 :0] m0_wid; -wire [`Lwdata -1 :0] m0_wdata; -wire [`Lwstrb -1 :0] m0_wstrb; -wire m0_wlast; -wire m0_wvalid; -wire m0_wready; -wire [`LID -1 :0] m0_bid; -wire [`Lbresp -1 :0] m0_bresp; -wire m0_bvalid; -wire m0_bready; -wire [`LID -1 :0] m0_arid; -wire [`Laraddr -1 :0] m0_araddr; -wire [`Larlen -1 :0] m0_arlen; -wire [`Larsize -1 :0] m0_arsize; -wire [`Larburst -1 :0] m0_arburst; -wire [`Larlock -1 :0] m0_arlock; -wire [`Larcache -1 :0] m0_arcache; -wire [`Larprot -1 :0] m0_arprot; -wire m0_arvalid; -wire m0_arready; -wire [`LID -1 :0] m0_rid; -wire [`Lrdata -1 :0] m0_rdata; -wire [`Lrresp -1 :0] m0_rresp; -wire m0_rlast; -wire m0_rvalid; -wire m0_rready; - -wire [`LID -1 :0] spi_s_awid; -wire [`Lawaddr -1 :0] spi_s_awaddr; -wire [`Lawlen -1 :0] spi_s_awlen; -wire [`Lawsize -1 :0] spi_s_awsize; -wire [`Lawburst -1 :0] spi_s_awburst; -wire [`Lawlock -1 :0] spi_s_awlock; -wire [`Lawcache -1 :0] spi_s_awcache; -wire [`Lawprot -1 :0] spi_s_awprot; -wire spi_s_awvalid; -wire spi_s_awready; -wire [`LID -1 :0] spi_s_wid; -wire [`Lwdata -1 :0] spi_s_wdata; -wire [`Lwstrb -1 :0] spi_s_wstrb; -wire spi_s_wlast; -wire spi_s_wvalid; -wire spi_s_wready; -wire [`LID -1 :0] spi_s_bid; -wire [`Lbresp -1 :0] spi_s_bresp; -wire spi_s_bvalid; -wire spi_s_bready; -wire [`LID -1 :0] spi_s_arid; -wire [`Laraddr -1 :0] spi_s_araddr; -wire [`Larlen -1 :0] spi_s_arlen; -wire [`Larsize -1 :0] spi_s_arsize; -wire [`Larburst -1 :0] spi_s_arburst; -wire [`Larlock -1 :0] spi_s_arlock; -wire [`Larcache -1 :0] spi_s_arcache; -wire [`Larprot -1 :0] spi_s_arprot; -wire spi_s_arvalid; -wire spi_s_arready; -wire [`LID -1 :0] spi_s_rid; -wire [`Lrdata -1 :0] spi_s_rdata; -wire [`Lrresp -1 :0] spi_s_rresp; -wire spi_s_rlast; -wire spi_s_rvalid; -wire spi_s_rready; - -wire [`LID -1 :0] conf_s_awid; -wire [`Lawaddr -1 :0] conf_s_awaddr; -wire [`Lawlen -1 :0] conf_s_awlen; -wire [`Lawsize -1 :0] conf_s_awsize; -wire [`Lawburst -1 :0] conf_s_awburst; -wire [`Lawlock -1 :0] conf_s_awlock; -wire [`Lawcache -1 :0] conf_s_awcache; -wire [`Lawprot -1 :0] conf_s_awprot; -wire conf_s_awvalid; -wire conf_s_awready; -wire [`LID -1 :0] conf_s_wid; -wire [`Lwdata -1 :0] conf_s_wdata; -wire [`Lwstrb -1 :0] conf_s_wstrb; -wire conf_s_wlast; -wire conf_s_wvalid; -wire conf_s_wready; -wire [`LID -1 :0] conf_s_bid; -wire [`Lbresp -1 :0] conf_s_bresp; -wire conf_s_bvalid; -wire conf_s_bready; -wire [`LID -1 :0] conf_s_arid; -wire [`Laraddr -1 :0] conf_s_araddr; -wire [`Larlen -1 :0] conf_s_arlen; -wire [`Larsize -1 :0] conf_s_arsize; -wire [`Larburst -1 :0] conf_s_arburst; -wire [`Larlock -1 :0] conf_s_arlock; -wire [`Larcache -1 :0] conf_s_arcache; -wire [`Larprot -1 :0] conf_s_arprot; -wire conf_s_arvalid; -wire conf_s_arready; -wire [`LID -1 :0] conf_s_rid; -wire [`Lrdata -1 :0] conf_s_rdata; -wire [`Lrresp -1 :0] conf_s_rresp; -wire conf_s_rlast; -wire conf_s_rvalid; -wire conf_s_rready; - -wire [`LID -1 :0] mac_s_awid; -wire [`Lawaddr -1 :0] mac_s_awaddr; -wire [`Lawlen -1 :0] mac_s_awlen; -wire [`Lawsize -1 :0] mac_s_awsize; -wire [`Lawburst -1 :0] mac_s_awburst; -wire [`Lawlock -1 :0] mac_s_awlock; -wire [`Lawcache -1 :0] mac_s_awcache; -wire [`Lawprot -1 :0] mac_s_awprot; -wire mac_s_awvalid; -wire mac_s_awready; -wire [`LID -1 :0] mac_s_wid; -wire [`Lwdata -1 :0] mac_s_wdata; -wire [`Lwstrb -1 :0] mac_s_wstrb; -wire mac_s_wlast; -wire mac_s_wvalid; -wire mac_s_wready; -wire [`LID -1 :0] mac_s_bid; -wire [`Lbresp -1 :0] mac_s_bresp; -wire mac_s_bvalid; -wire mac_s_bready; -wire [`LID -1 :0] mac_s_arid; -wire [`Laraddr -1 :0] mac_s_araddr; -wire [`Larlen -1 :0] mac_s_arlen; -wire [`Larsize -1 :0] mac_s_arsize; -wire [`Larburst -1 :0] mac_s_arburst; -wire [`Larlock -1 :0] mac_s_arlock; -wire [`Larcache -1 :0] mac_s_arcache; -wire [`Larprot -1 :0] mac_s_arprot; -wire mac_s_arvalid; -wire mac_s_arready; -wire [`LID -1 :0] mac_s_rid; -wire [`Lrdata -1 :0] mac_s_rdata; -wire [`Lrresp -1 :0] mac_s_rresp; -wire mac_s_rlast; -wire mac_s_rvalid; -wire mac_s_rready; - -wire [`LID -1 :0] mac_m_awid; -wire [`Lawaddr -1 :0] mac_m_awaddr; -wire [`Lawlen -1 :0] mac_m_awlen; -wire [`Lawsize -1 :0] mac_m_awsize; -wire [`Lawburst -1 :0] mac_m_awburst; -wire [`Lawlock -1 :0] mac_m_awlock; -wire [`Lawcache -1 :0] mac_m_awcache; -wire [`Lawprot -1 :0] mac_m_awprot; -wire mac_m_awvalid; -wire mac_m_awready; -wire [`LID -1 :0] mac_m_wid; -wire [`Lwdata -1 :0] mac_m_wdata; -wire [`Lwstrb -1 :0] mac_m_wstrb; -wire mac_m_wlast; -wire mac_m_wvalid; -wire mac_m_wready; -wire [`LID -1 :0] mac_m_bid; -wire [`Lbresp -1 :0] mac_m_bresp; -wire mac_m_bvalid; -wire mac_m_bready; -wire [`LID -1 :0] mac_m_arid; -wire [`Laraddr -1 :0] mac_m_araddr; -wire [`Larlen -1 :0] mac_m_arlen; -wire [`Larsize -1 :0] mac_m_arsize; -wire [`Larburst -1 :0] mac_m_arburst; -wire [`Larlock -1 :0] mac_m_arlock; -wire [`Larcache -1 :0] mac_m_arcache; -wire [`Larprot -1 :0] mac_m_arprot; -wire mac_m_arvalid; -wire mac_m_arready; -wire [`LID -1 :0] mac_m_rid; -wire [`Lrdata -1 :0] mac_m_rdata; -wire [`Lrresp -1 :0] mac_m_rresp; -wire mac_m_rlast; -wire mac_m_rvalid; -wire mac_m_rready; - -wire [`LID -1 :0] s0_awid; -wire [`Lawaddr -1 :0] s0_awaddr; -wire [`Lawlen -1 :0] s0_awlen; -wire [`Lawsize -1 :0] s0_awsize; -wire [`Lawburst -1 :0] s0_awburst; -wire [`Lawlock -1 :0] s0_awlock; -wire [`Lawcache -1 :0] s0_awcache; -wire [`Lawprot -1 :0] s0_awprot; -wire s0_awvalid; -wire s0_awready; -wire [`LID -1 :0] s0_wid; -wire [`Lwdata -1 :0] s0_wdata; -wire [`Lwstrb -1 :0] s0_wstrb; -wire s0_wlast; -wire s0_wvalid; -wire s0_wready; -wire [`LID -1 :0] s0_bid; -wire [`Lbresp -1 :0] s0_bresp; -wire s0_bvalid; -wire s0_bready; -wire [`LID -1 :0] s0_arid; -wire [`Laraddr -1 :0] s0_araddr; -wire [`Larlen -1 :0] s0_arlen; -wire [`Larsize -1 :0] s0_arsize; -wire [`Larburst -1 :0] s0_arburst; -wire [`Larlock -1 :0] s0_arlock; -wire [`Larcache -1 :0] s0_arcache; -wire [`Larprot -1 :0] s0_arprot; -wire s0_arvalid; -wire s0_arready; -wire [`LID -1 :0] s0_rid; -wire [`Lrdata -1 :0] s0_rdata; -wire [`Lrresp -1 :0] s0_rresp; -wire s0_rlast; -wire s0_rvalid; -wire s0_rready; - -wire [8 -1 :0] mig_awid; -wire [`Lawaddr -1 :0] mig_awaddr; -wire [8 -1 :0] mig_awlen; -wire [`Lawsize -1 :0] mig_awsize; -wire [`Lawburst -1 :0] mig_awburst; -wire [`Lawlock -1 :0] mig_awlock; -wire [`Lawcache -1 :0] mig_awcache; -wire [`Lawprot -1 :0] mig_awprot; -wire mig_awvalid; -wire mig_awready; -wire [8 -1 :0] mig_wid; -wire [`Lwdata -1 :0] mig_wdata; -wire [`Lwstrb -1 :0] mig_wstrb; -wire mig_wlast; -wire mig_wvalid; -wire mig_wready; -wire [8 -1 :0] mig_bid; -wire [`Lbresp -1 :0] mig_bresp; -wire mig_bvalid; -wire mig_bready; -wire [8 -1 :0] mig_arid; -wire [`Laraddr -1 :0] mig_araddr; -wire [8 -1 :0] mig_arlen; -wire [`Larsize -1 :0] mig_arsize; -wire [`Larburst -1 :0] mig_arburst; -wire [`Larlock -1 :0] mig_arlock; -wire [`Larcache -1 :0] mig_arcache; -wire [`Larprot -1 :0] mig_arprot; -wire mig_arvalid; -wire mig_arready; -wire [8 -1 :0] mig_rid; -wire [`Lrdata -1 :0] mig_rdata; -wire [`Lrresp -1 :0] mig_rresp; -wire mig_rlast; -wire mig_rvalid; -wire mig_rready; - -wire [`LID -1 :0] dma0_awid ; -wire [`Lawaddr -1 :0] dma0_awaddr ; -wire [`Lawlen -1 :0] dma0_awlen ; -wire [`Lawsize -1 :0] dma0_awsize ; -wire [`Lawburst -1 :0] dma0_awburst ; -wire [`Lawlock -1 :0] dma0_awlock ; -wire [`Lawcache -1 :0] dma0_awcache ; -wire [`Lawprot -1 :0] dma0_awprot ; -wire dma0_awvalid ; -wire dma0_awready ; -wire [`LID -1 :0] dma0_wid ; -wire [64 -1 :0] dma0_wdata ; -wire [8 -1 :0] dma0_wstrb ; -wire dma0_wlast ; -wire dma0_wvalid ; -wire dma0_wready ; -wire [`LID -1 :0] dma0_bid ; -wire [`Lbresp -1 :0] dma0_bresp ; -wire dma0_bvalid ; -wire dma0_bready ; -wire [`LID -1 :0] dma0_arid ; -wire [`Laraddr -1 :0] dma0_araddr ; -wire [`Larlen -1 :0] dma0_arlen ; -wire [`Larsize -1 :0] dma0_arsize ; -wire [`Larburst -1 :0] dma0_arburst ; -wire [`Larlock -1 :0] dma0_arlock ; -wire [`Larcache -1 :0] dma0_arcache ; -wire [`Larprot -1 :0] dma0_arprot ; -wire dma0_arvalid ; -wire dma0_arready ; -wire [`LID -1 :0] dma0_rid ; -wire [64 -1 :0] dma0_rdata ; -wire [`Lrresp -1 :0] dma0_rresp ; -wire dma0_rlast ; -wire dma0_rvalid ; -wire dma0_rready ; - -wire [`LID -1 :0] apb_s_awid; -wire [`Lawaddr -1 :0] apb_s_awaddr; -wire [`Lawlen -1 :0] apb_s_awlen; -wire [`Lawsize -1 :0] apb_s_awsize; -wire [`Lawburst -1 :0] apb_s_awburst; -wire [`Lawlock -1 :0] apb_s_awlock; -wire [`Lawcache -1 :0] apb_s_awcache; -wire [`Lawprot -1 :0] apb_s_awprot; -wire apb_s_awvalid; -wire apb_s_awready; -wire [`LID -1 :0] apb_s_wid; -wire [`Lwdata -1 :0] apb_s_wdata; -wire [`Lwstrb -1 :0] apb_s_wstrb; -wire apb_s_wlast; -wire apb_s_wvalid; -wire apb_s_wready; -wire [`LID -1 :0] apb_s_bid; -wire [`Lbresp -1 :0] apb_s_bresp; -wire apb_s_bvalid; -wire apb_s_bready; -wire [`LID -1 :0] apb_s_arid; -wire [`Laraddr -1 :0] apb_s_araddr; -wire [`Larlen -1 :0] apb_s_arlen; -wire [`Larsize -1 :0] apb_s_arsize; -wire [`Larburst -1 :0] apb_s_arburst; -wire [`Larlock -1 :0] apb_s_arlock; -wire [`Larcache -1 :0] apb_s_arcache; -wire [`Larprot -1 :0] apb_s_arprot; -wire apb_s_arvalid; -wire apb_s_arready; -wire [`LID -1 :0] apb_s_rid; -wire [`Lrdata -1 :0] apb_s_rdata; -wire [`Lrresp -1 :0] apb_s_rresp; -wire apb_s_rlast; -wire apb_s_rvalid; -wire apb_s_rready; - -wire apb_ready_dma0; -wire apb_start_dma0; -wire apb_rw_dma0; -wire apb_psel_dma0; -wire apb_penable_dma0; -wire[31:0] apb_addr_dma0; -wire[31:0] apb_wdata_dma0; -wire[31:0] apb_rdata_dma0; - -wire dma_int; -wire dma_ack; -wire dma_req; - -wire dma0_gnt; -wire[31:0] order_addr_in; -wire write_dma_end; -wire finish_read_order; - -//spi -wire [3:0]spi_csn_o ; -wire [3:0]spi_csn_en; -wire spi_sck_o ; -wire spi_sdo_i ; -wire spi_sdo_o ; -wire spi_sdo_en; -wire spi_sdi_i ; -wire spi_sdi_o ; -wire spi_sdi_en; -wire spi_inta_o; -assign SPI_CLK = spi_sck_o; -assign SPI_CS = ~spi_csn_en[0] & spi_csn_o[0]; -assign SPI_MOSI = spi_sdo_en ? 1'bz : spi_sdo_o ; -assign SPI_MISO = spi_sdi_en ? 1'bz : spi_sdi_o ; -assign spi_sdo_i = SPI_MOSI; -assign spi_sdi_i = SPI_MISO; - -// confreg -wire [31:0] cr00,cr01,cr02,cr03,cr04,cr05,cr06,cr07; - -//mac -wire md_i_0; // MII data input (from I/O cell) -wire md_o_0; // MII data output (to I/O cell) -wire md_oe_0; // MII data output enable (to I/O cell) -IOBUF mac_mdio(.IO(mdio_0),.I(md_o_0),.T(~md_oe_0),.O(md_i_0)); -assign phy_rstn = aresetn; - -//nand -wire nand_cle ; -wire nand_ale ; -wire [3:0] nand_rdy ; -wire [3:0] nand_ce ; -wire nand_rd ; -wire nand_wr ; -wire nand_dat_oe; -wire [7:0] nand_dat_i ; -wire [7:0] nand_dat_o ; -wire nand_int ; -assign NAND_CLE = nand_cle; -assign NAND_ALE = nand_ale; -assign nand_rdy = {3'd0,NAND_RDY}; -assign NAND_RD = nand_rd; -assign NAND_CE = nand_ce[0]; //low active -assign NAND_WR = nand_wr; -generate - genvar i; - for(i=0;i<8;i=i+1) - begin: nand_data_loop - IOBUF nand_data(.IO(NAND_DATA[i]),.I(nand_dat_o[i]),.T(nand_dat_oe),.O(nand_dat_i[i])); - end -endgenerate - -//uart -wire UART_CTS, UART_RTS; -wire UART_DTR, UART_DSR; -wire UART_RI, UART_DCD; -assign UART_CTS = 1'b0; -assign UART_DSR = 1'b0; -assign UART_DCD = 1'b0; -wire uart0_int ; -wire uart0_txd_o ; -wire uart0_txd_i ; -wire uart0_txd_oe; -wire uart0_rxd_o ; -wire uart0_rxd_i ; -wire uart0_rxd_oe; -wire uart0_rts_o ; -wire uart0_cts_i ; -wire uart0_dsr_i ; -wire uart0_dcd_i ; -wire uart0_dtr_o ; -wire uart0_ri_i ; -assign UART_RX = uart0_rxd_oe ? 1'bz : uart0_rxd_o ; -assign UART_TX = uart0_txd_oe ? 1'bz : uart0_txd_o ; -assign UART_RTS = uart0_rts_o ; -assign UART_DTR = uart0_dtr_o ; -assign uart0_txd_i = UART_TX; -assign uart0_rxd_i = UART_RX; -assign uart0_cts_i = UART_CTS; -assign uart0_dcd_i = UART_DCD; -assign uart0_dsr_i = UART_DSR; -assign uart0_ri_i = UART_RI ; - -//interrupt -wire mac_int; -wire [5:0] int_out; -wire [5:0] int_n_i; -assign int_out = {1'b0,dma_int,nand_int,spi_inta_o,uart0_int,mac_int}; -assign int_n_i = ~int_out; - -// cpu -mycpu_top mycpu( - .aclk (aclk ), - .ext_int (int_out ), - .aresetn (aresetn ), - .arid (m0_arid[3:0] ), - .araddr (m0_araddr ), - .arlen (m0_arlen ), - .arsize (m0_arsize ), - .arburst (m0_arburst ), - .arlock (m0_arlock ), - .arcache (m0_arcache ), - .arprot (m0_arprot ), - .arvalid (m0_arvalid ), - .arready (m0_arready ), - .rid (m0_rid[3:0] ), - .rdata (m0_rdata ), - .rresp (m0_rresp ), - .rlast (m0_rlast ), - .rvalid (m0_rvalid ), - .rready (m0_rready ), - .awid (m0_awid[3:0] ), - .awaddr (m0_awaddr ), - .awlen (m0_awlen ), - .awsize (m0_awsize ), - .awburst (m0_awburst ), - .awlock (m0_awlock ), - .awcache (m0_awcache ), - .awprot (m0_awprot ), - .awvalid (m0_awvalid ), - .awready (m0_awready ), - .wid (m0_wid[3:0] ), - .wdata (m0_wdata ), - .wstrb (m0_wstrb ), - .wlast (m0_wlast ), - .wvalid (m0_wvalid ), - .wready (m0_wready ), - .bid (m0_bid[3:0] ), - .bresp (m0_bresp ), - .bvalid (m0_bvalid ), - .bready (m0_bready ) -); - -// AXI_MUX -axi_slave_mux AXI_SLAVE_MUX -( -.axi_s_aresetn (aresetn ), -.spi_boot (1'b1 ), - -.axi_s_awid (m0_awid ), -.axi_s_awaddr (m0_awaddr ), -.axi_s_awlen (m0_awlen ), -.axi_s_awsize (m0_awsize ), -.axi_s_awburst (m0_awburst ), -.axi_s_awlock (m0_awlock ), -.axi_s_awcache (m0_awcache ), -.axi_s_awprot (m0_awprot ), -.axi_s_awvalid (m0_awvalid ), -.axi_s_awready (m0_awready ), -.axi_s_wready (m0_wready ), -.axi_s_wid (m0_wid ), -.axi_s_wdata (m0_wdata ), -.axi_s_wstrb (m0_wstrb ), -.axi_s_wlast (m0_wlast ), -.axi_s_wvalid (m0_wvalid ), -.axi_s_bid (m0_bid ), -.axi_s_bresp (m0_bresp ), -.axi_s_bvalid (m0_bvalid ), -.axi_s_bready (m0_bready ), -.axi_s_arid (m0_arid ), -.axi_s_araddr (m0_araddr ), -.axi_s_arlen (m0_arlen ), -.axi_s_arsize (m0_arsize ), -.axi_s_arburst (m0_arburst ), -.axi_s_arlock (m0_arlock ), -.axi_s_arcache (m0_arcache ), -.axi_s_arprot (m0_arprot ), -.axi_s_arvalid (m0_arvalid ), -.axi_s_arready (m0_arready ), -.axi_s_rready (m0_rready ), -.axi_s_rid (m0_rid ), -.axi_s_rdata (m0_rdata ), -.axi_s_rresp (m0_rresp ), -.axi_s_rlast (m0_rlast ), -.axi_s_rvalid (m0_rvalid ), - -.s0_awid (s0_awid ), -.s0_awaddr (s0_awaddr ), -.s0_awlen (s0_awlen ), -.s0_awsize (s0_awsize ), -.s0_awburst (s0_awburst ), -.s0_awlock (s0_awlock ), -.s0_awcache (s0_awcache ), -.s0_awprot (s0_awprot ), -.s0_awvalid (s0_awvalid ), -.s0_awready (s0_awready ), -.s0_wid (s0_wid ), -.s0_wdata (s0_wdata ), -.s0_wstrb (s0_wstrb ), -.s0_wlast (s0_wlast ), -.s0_wvalid (s0_wvalid ), -.s0_wready (s0_wready ), -.s0_bid (s0_bid ), -.s0_bresp (s0_bresp ), -.s0_bvalid (s0_bvalid ), -.s0_bready (s0_bready ), -.s0_arid (s0_arid ), -.s0_araddr (s0_araddr ), -.s0_arlen (s0_arlen ), -.s0_arsize (s0_arsize ), -.s0_arburst (s0_arburst ), -.s0_arlock (s0_arlock ), -.s0_arcache (s0_arcache ), -.s0_arprot (s0_arprot ), -.s0_arvalid (s0_arvalid ), -.s0_arready (s0_arready ), -.s0_rid (s0_rid ), -.s0_rdata (s0_rdata ), -.s0_rresp (s0_rresp ), -.s0_rlast (s0_rlast ), -.s0_rvalid (s0_rvalid ), -.s0_rready (s0_rready ), - -.s1_awid (spi_s_awid ), -.s1_awaddr (spi_s_awaddr ), -.s1_awlen (spi_s_awlen ), -.s1_awsize (spi_s_awsize ), -.s1_awburst (spi_s_awburst ), -.s1_awlock (spi_s_awlock ), -.s1_awcache (spi_s_awcache ), -.s1_awprot (spi_s_awprot ), -.s1_awvalid (spi_s_awvalid ), -.s1_awready (spi_s_awready ), -.s1_wid (spi_s_wid ), -.s1_wdata (spi_s_wdata ), -.s1_wstrb (spi_s_wstrb ), -.s1_wlast (spi_s_wlast ), -.s1_wvalid (spi_s_wvalid ), -.s1_wready (spi_s_wready ), -.s1_bid (spi_s_bid ), -.s1_bresp (spi_s_bresp ), -.s1_bvalid (spi_s_bvalid ), -.s1_bready (spi_s_bready ), -.s1_arid (spi_s_arid ), -.s1_araddr (spi_s_araddr ), -.s1_arlen (spi_s_arlen ), -.s1_arsize (spi_s_arsize ), -.s1_arburst (spi_s_arburst ), -.s1_arlock (spi_s_arlock ), -.s1_arcache (spi_s_arcache ), -.s1_arprot (spi_s_arprot ), -.s1_arvalid (spi_s_arvalid ), -.s1_arready (spi_s_arready ), -.s1_rid (spi_s_rid ), -.s1_rdata (spi_s_rdata ), -.s1_rresp (spi_s_rresp ), -.s1_rlast (spi_s_rlast ), -.s1_rvalid (spi_s_rvalid ), -.s1_rready (spi_s_rready ), - -.s2_awid (apb_s_awid ), -.s2_awaddr (apb_s_awaddr ), -.s2_awlen (apb_s_awlen ), -.s2_awsize (apb_s_awsize ), -.s2_awburst (apb_s_awburst ), -.s2_awlock (apb_s_awlock ), -.s2_awcache (apb_s_awcache ), -.s2_awprot (apb_s_awprot ), -.s2_awvalid (apb_s_awvalid ), -.s2_awready (apb_s_awready ), -.s2_wid (apb_s_wid ), -.s2_wdata (apb_s_wdata ), -.s2_wstrb (apb_s_wstrb ), -.s2_wlast (apb_s_wlast ), -.s2_wvalid (apb_s_wvalid ), -.s2_wready (apb_s_wready ), -.s2_bid (apb_s_bid ), -.s2_bresp (apb_s_bresp ), -.s2_bvalid (apb_s_bvalid ), -.s2_bready (apb_s_bready ), -.s2_arid (apb_s_arid ), -.s2_araddr (apb_s_araddr ), -.s2_arlen (apb_s_arlen ), -.s2_arsize (apb_s_arsize ), -.s2_arburst (apb_s_arburst ), -.s2_arlock (apb_s_arlock ), -.s2_arcache (apb_s_arcache ), -.s2_arprot (apb_s_arprot ), -.s2_arvalid (apb_s_arvalid ), -.s2_arready (apb_s_arready ), -.s2_rid (apb_s_rid ), -.s2_rdata (apb_s_rdata ), -.s2_rresp (apb_s_rresp ), -.s2_rlast (apb_s_rlast ), -.s2_rvalid (apb_s_rvalid ), -.s2_rready (apb_s_rready ), - -.s3_awid (conf_s_awid ), -.s3_awaddr (conf_s_awaddr ), -.s3_awlen (conf_s_awlen ), -.s3_awsize (conf_s_awsize ), -.s3_awburst (conf_s_awburst ), -.s3_awlock (conf_s_awlock ), -.s3_awcache (conf_s_awcache ), -.s3_awprot (conf_s_awprot ), -.s3_awvalid (conf_s_awvalid ), -.s3_awready (conf_s_awready ), -.s3_wid (conf_s_wid ), -.s3_wdata (conf_s_wdata ), -.s3_wstrb (conf_s_wstrb ), -.s3_wlast (conf_s_wlast ), -.s3_wvalid (conf_s_wvalid ), -.s3_wready (conf_s_wready ), -.s3_bid (conf_s_bid ), -.s3_bresp (conf_s_bresp ), -.s3_bvalid (conf_s_bvalid ), -.s3_bready (conf_s_bready ), -.s3_arid (conf_s_arid ), -.s3_araddr (conf_s_araddr ), -.s3_arlen (conf_s_arlen ), -.s3_arsize (conf_s_arsize ), -.s3_arburst (conf_s_arburst ), -.s3_arlock (conf_s_arlock ), -.s3_arcache (conf_s_arcache ), -.s3_arprot (conf_s_arprot ), -.s3_arvalid (conf_s_arvalid ), -.s3_arready (conf_s_arready ), -.s3_rid (conf_s_rid ), -.s3_rdata (conf_s_rdata ), -.s3_rresp (conf_s_rresp ), -.s3_rlast (conf_s_rlast ), -.s3_rvalid (conf_s_rvalid ), -.s3_rready (conf_s_rready ), - -.s4_awid (mac_s_awid ), -.s4_awaddr (mac_s_awaddr ), -.s4_awlen (mac_s_awlen ), -.s4_awsize (mac_s_awsize ), -.s4_awburst (mac_s_awburst ), -.s4_awlock (mac_s_awlock ), -.s4_awcache (mac_s_awcache ), -.s4_awprot (mac_s_awprot ), -.s4_awvalid (mac_s_awvalid ), -.s4_awready (mac_s_awready ), -.s4_wid (mac_s_wid ), -.s4_wdata (mac_s_wdata ), -.s4_wstrb (mac_s_wstrb ), -.s4_wlast (mac_s_wlast ), -.s4_wvalid (mac_s_wvalid ), -.s4_wready (mac_s_wready ), -.s4_bid (mac_s_bid ), -.s4_bresp (mac_s_bresp ), -.s4_bvalid (mac_s_bvalid ), -.s4_bready (mac_s_bready ), -.s4_arid (mac_s_arid ), -.s4_araddr (mac_s_araddr ), -.s4_arlen (mac_s_arlen ), -.s4_arsize (mac_s_arsize ), -.s4_arburst (mac_s_arburst ), -.s4_arlock (mac_s_arlock ), -.s4_arcache (mac_s_arcache ), -.s4_arprot (mac_s_arprot ), -.s4_arvalid (mac_s_arvalid ), -.s4_arready (mac_s_arready ), -.s4_rid (mac_s_rid ), -.s4_rdata (mac_s_rdata ), -.s4_rresp (mac_s_rresp ), -.s4_rlast (mac_s_rlast ), -.s4_rvalid (mac_s_rvalid ), -.s4_rready (mac_s_rready ), - -.axi_s_aclk (aclk ) -); - -//SPI -spi_flash_ctrl SPI -( -.aclk (aclk ), -.aresetn (aresetn ), -.spi_addr (16'h1fe8 ), -.fast_startup (1'b0 ), -.s_awid (spi_s_awid ), -.s_awaddr (spi_s_awaddr ), -.s_awlen (spi_s_awlen ), -.s_awsize (spi_s_awsize ), -.s_awburst (spi_s_awburst ), -.s_awlock (spi_s_awlock ), -.s_awcache (spi_s_awcache ), -.s_awprot (spi_s_awprot ), -.s_awvalid (spi_s_awvalid ), -.s_awready (spi_s_awready ), -.s_wready (spi_s_wready ), -.s_wid (spi_s_wid ), -.s_wdata (spi_s_wdata ), -.s_wstrb (spi_s_wstrb ), -.s_wlast (spi_s_wlast ), -.s_wvalid (spi_s_wvalid ), -.s_bid (spi_s_bid ), -.s_bresp (spi_s_bresp ), -.s_bvalid (spi_s_bvalid ), -.s_bready (spi_s_bready ), -.s_arid (spi_s_arid ), -.s_araddr (spi_s_araddr ), -.s_arlen (spi_s_arlen ), -.s_arsize (spi_s_arsize ), -.s_arburst (spi_s_arburst ), -.s_arlock (spi_s_arlock ), -.s_arcache (spi_s_arcache ), -.s_arprot (spi_s_arprot ), -.s_arvalid (spi_s_arvalid ), -.s_arready (spi_s_arready ), -.s_rready (spi_s_rready ), -.s_rid (spi_s_rid ), -.s_rdata (spi_s_rdata ), -.s_rresp (spi_s_rresp ), -.s_rlast (spi_s_rlast ), -.s_rvalid (spi_s_rvalid ), - -.power_down_req (1'b0 ), -.power_down_ack ( ), -.csn_o (spi_csn_o ), -.csn_en (spi_csn_en ), -.sck_o (spi_sck_o ), -.sdo_i (spi_sdo_i ), -.sdo_o (spi_sdo_o ), -.sdo_en (spi_sdo_en ), // active low -.sdi_i (spi_sdi_i ), -.sdi_o (spi_sdi_o ), -.sdi_en (spi_sdi_en ), -.inta_o (spi_inta_o ) -); - -//confreg -confreg CONFREG( -.aclk (aclk ), -.aresetn (aresetn ), -.s_awid (conf_s_awid ), -.s_awaddr (conf_s_awaddr ), -.s_awlen (conf_s_awlen ), -.s_awsize (conf_s_awsize ), -.s_awburst (conf_s_awburst ), -.s_awlock (conf_s_awlock ), -.s_awcache (conf_s_awcache ), -.s_awprot (conf_s_awprot ), -.s_awvalid (conf_s_awvalid ), -.s_awready (conf_s_awready ), -.s_wready (conf_s_wready ), -.s_wid (conf_s_wid ), -.s_wdata (conf_s_wdata ), -.s_wstrb (conf_s_wstrb ), -.s_wlast (conf_s_wlast ), -.s_wvalid (conf_s_wvalid ), -.s_bid (conf_s_bid ), -.s_bresp (conf_s_bresp ), -.s_bvalid (conf_s_bvalid ), -.s_bready (conf_s_bready ), -.s_arid (conf_s_arid ), -.s_araddr (conf_s_araddr ), -.s_arlen (conf_s_arlen ), -.s_arsize (conf_s_arsize ), -.s_arburst (conf_s_arburst ), -.s_arlock (conf_s_arlock ), -.s_arcache (conf_s_arcache ), -.s_arprot (conf_s_arprot ), -.s_arvalid (conf_s_arvalid ), -.s_arready (conf_s_arready ), -.s_rready (conf_s_rready ), -.s_rid (conf_s_rid ), -.s_rdata (conf_s_rdata ), -.s_rresp (conf_s_rresp ), -.s_rlast (conf_s_rlast ), -.s_rvalid (conf_s_rvalid ), - -//dma -.order_addr_reg (order_addr_in ), -.write_dma_end (write_dma_end ), -.finish_read_order (finish_read_order ), - -//cr00~cr07 -.cr00 (cr00 ), -.cr01 (cr01 ), -.cr02 (cr02 ), -.cr03 (cr03 ), -.cr04 (cr04 ), -.cr05 (cr05 ), -.cr06 (cr06 ), -.cr07 (cr07 ), - -.led (led ), -.led_rg0 (led_rg0 ), -.led_rg1 (led_rg1 ), -.num_csn (num_csn ), -.num_a_g (num_a_g ), -.switch (switch ), -.btn_key_col (btn_key_col ), -.btn_key_row (btn_key_row ), -.btn_step (btn_step ) -); - -//MAC top -ethernet_top ETHERNET_TOP( - - .hclk (aclk ), - .hrst_ (aresetn), - //axi master - .mawid_o (mac_m_awid ), - .mawaddr_o (mac_m_awaddr ), - .mawlen_o (mac_m_awlen ), - .mawsize_o (mac_m_awsize ), - .mawburst_o (mac_m_awburst ), - .mawlock_o (mac_m_awlock ), - .mawcache_o (mac_m_awcache ), - .mawprot_o (mac_m_awprot ), - .mawvalid_o (mac_m_awvalid ), - .mawready_i (mac_m_awready ), - .mwid_o (mac_m_wid ), - .mwdata_o (mac_m_wdata ), - .mwstrb_o (mac_m_wstrb ), - .mwlast_o (mac_m_wlast ), - .mwvalid_o (mac_m_wvalid ), - .mwready_i (mac_m_wready ), - .mbid_i (mac_m_bid ), - .mbresp_i (mac_m_bresp ), - .mbvalid_i (mac_m_bvalid ), - .mbready_o (mac_m_bready ), - .marid_o (mac_m_arid ), - .maraddr_o (mac_m_araddr ), - .marlen_o (mac_m_arlen ), - .marsize_o (mac_m_arsize ), - .marburst_o (mac_m_arburst ), - .marlock_o (mac_m_arlock ), - .marcache_o (mac_m_arcache ), - .marprot_o (mac_m_arprot ), - .marvalid_o (mac_m_arvalid ), - .marready_i (mac_m_arready ), - .mrid_i (mac_m_rid ), - .mrdata_i (mac_m_rdata ), - .mrresp_i (mac_m_rresp ), - .mrlast_i (mac_m_rlast ), - .mrvalid_i (mac_m_rvalid ), - .mrready_o (mac_m_rready ), - //axi slaver - .sawid_i (mac_s_awid ), - .sawaddr_i (mac_s_awaddr ), - .sawlen_i (mac_s_awlen ), - .sawsize_i (mac_s_awsize ), - .sawburst_i (mac_s_awburst ), - .sawlock_i (mac_s_awlock ), - .sawcache_i (mac_s_awcache ), - .sawprot_i (mac_s_awprot ), - .sawvalid_i (mac_s_awvalid ), - .sawready_o (mac_s_awready ), - .swid_i (mac_s_wid ), - .swdata_i (mac_s_wdata ), - .swstrb_i (mac_s_wstrb ), - .swlast_i (mac_s_wlast ), - .swvalid_i (mac_s_wvalid ), - .swready_o (mac_s_wready ), - .sbid_o (mac_s_bid ), - .sbresp_o (mac_s_bresp ), - .sbvalid_o (mac_s_bvalid ), - .sbready_i (mac_s_bready ), - .sarid_i (mac_s_arid ), - .saraddr_i (mac_s_araddr ), - .sarlen_i (mac_s_arlen ), - .sarsize_i (mac_s_arsize ), - .sarburst_i (mac_s_arburst ), - .sarlock_i (mac_s_arlock ), - .sarcache_i (mac_s_arcache ), - .sarprot_i (mac_s_arprot ), - .sarvalid_i (mac_s_arvalid ), - .sarready_o (mac_s_arready ), - .srid_o (mac_s_rid ), - .srdata_o (mac_s_rdata ), - .srresp_o (mac_s_rresp ), - .srlast_o (mac_s_rlast ), - .srvalid_o (mac_s_rvalid ), - .srready_i (mac_s_rready ), - - .interrupt_0 (mac_int), - - // I/O pad interface signals - //TX - .mtxclk_0 (mtxclk_0 ), - .mtxen_0 (mtxen_0 ), - .mtxd_0 (mtxd_0 ), - .mtxerr_0 (mtxerr_0 ), - //RX - .mrxclk_0 (mrxclk_0 ), - .mrxdv_0 (mrxdv_0 ), - .mrxd_0 (mrxd_0 ), - .mrxerr_0 (mrxerr_0 ), - .mcoll_0 (mcoll_0 ), - .mcrs_0 (mcrs_0 ), - // MIIM - .mdc_0 (mdc_0 ), - .md_i_0 (md_i_0 ), - .md_o_0 (md_o_0 ), - .md_oe_0 (md_oe_0 ) - -); - -//ddr3 -wire c1_sys_clk_i; -wire c1_clk_ref_i; -wire c1_sys_rst_i; -wire c1_calib_done; -wire c1_clk0; -wire c1_rst0; -wire ddr_aresetn; -reg interconnect_aresetn; - -wire cpu_clk; -clk_pll_33 clk_pll_33 - ( - // Clock out ports - .clk_out1(cpu_clk), //33MHz - // Clock in ports - .clk_in1(clk) //100MHz - ); - -clk_wiz_0 clk_pll_1 -( - .clk_out1(c1_clk_ref_i), //200MHz - .clk_in1(clk) //100MHz -); - -assign c1_sys_clk_i = clk; -assign c1_sys_rst_i = resetn; -assign aclk = cpu_clk; -//assign aclk = c1_clk0; -// Reset to the AXI shim -reg c1_calib_done_0; -reg c1_calib_done_1; -reg c1_rst0_0; -reg c1_rst0_1; -reg interconnect_aresetn_0; -/*always @(posedge aclk) -begin - c1_calib_done_0 <= c1_calib_done; - c1_calib_done_1 <= c1_calib_done_0; - c1_rst0_0 <= c1_rst0; - c1_rst0_1 <= c1_rst0_0; - - interconnect_aresetn_0 <= ~c1_rst0_1 && c1_calib_done_1; - interconnect_aresetn <= interconnect_aresetn_0 ; -end*/ -always @(posedge c1_clk0) -begin - interconnect_aresetn <= ~c1_rst0 && c1_calib_done; -end - -//axi 3x1 -axi_interconnect_0 mig_axi_interconnect ( - .INTERCONNECT_ACLK (c1_clk0 ), - .INTERCONNECT_ARESETN (interconnect_aresetn), - .S00_AXI_ARESET_OUT_N (aresetn ), - .S00_AXI_ACLK (aclk ), - .S00_AXI_AWID (s0_awid[3:0] ), - .S00_AXI_AWADDR (s0_awaddr ), - .S00_AXI_AWLEN ({4'b0,s0_awlen} ), - .S00_AXI_AWSIZE (s0_awsize ), - .S00_AXI_AWBURST (s0_awburst ), - .S00_AXI_AWLOCK (s0_awlock[0:0] ), - .S00_AXI_AWCACHE (s0_awcache ), - .S00_AXI_AWPROT (s0_awprot ), - .S00_AXI_AWQOS (4'b0 ), - .S00_AXI_AWVALID (s0_awvalid ), - .S00_AXI_AWREADY (s0_awready ), - .S00_AXI_WDATA (s0_wdata ), - .S00_AXI_WSTRB (s0_wstrb ), - .S00_AXI_WLAST (s0_wlast ), - .S00_AXI_WVALID (s0_wvalid ), - .S00_AXI_WREADY (s0_wready ), - .S00_AXI_BID (s0_bid[3:0] ), - .S00_AXI_BRESP (s0_bresp ), - .S00_AXI_BVALID (s0_bvalid ), - .S00_AXI_BREADY (s0_bready ), - .S00_AXI_ARID (s0_arid[3:0] ), - .S00_AXI_ARADDR (s0_araddr ), - .S00_AXI_ARLEN ({4'b0,s0_arlen} ), - .S00_AXI_ARSIZE (s0_arsize ), - .S00_AXI_ARBURST (s0_arburst ), - .S00_AXI_ARLOCK (s0_arlock[0:0] ), - .S00_AXI_ARCACHE (s0_arcache ), - .S00_AXI_ARPROT (s0_arprot ), - .S00_AXI_ARQOS (4'b0 ), - .S00_AXI_ARVALID (s0_arvalid ), - .S00_AXI_ARREADY (s0_arready ), - .S00_AXI_RID (s0_rid[3:0] ), - .S00_AXI_RDATA (s0_rdata ), - .S00_AXI_RRESP (s0_rresp ), - .S00_AXI_RLAST (s0_rlast ), - .S00_AXI_RVALID (s0_rvalid ), - .S00_AXI_RREADY (s0_rready ), - - .S01_AXI_ARESET_OUT_N ( ), - .S01_AXI_ACLK (aclk ), - .S01_AXI_AWID (mac_m_awid[3:0] ), - .S01_AXI_AWADDR (mac_m_awaddr ), - .S01_AXI_AWLEN ({4'b0,mac_m_awlen} ), - .S01_AXI_AWSIZE (mac_m_awsize ), - .S01_AXI_AWBURST (mac_m_awburst ), - .S01_AXI_AWLOCK (mac_m_awlock[0:0] ), - .S01_AXI_AWCACHE (mac_m_awcache ), - .S01_AXI_AWPROT (mac_m_awprot ), - .S01_AXI_AWQOS (4'b0 ), - .S01_AXI_AWVALID (mac_m_awvalid ), - .S01_AXI_AWREADY (mac_m_awready ), - .S01_AXI_WDATA (mac_m_wdata ), - .S01_AXI_WSTRB (mac_m_wstrb ), - .S01_AXI_WLAST (mac_m_wlast ), - .S01_AXI_WVALID (mac_m_wvalid ), - .S01_AXI_WREADY (mac_m_wready ), - .S01_AXI_BID (mac_m_bid[3:0] ), - .S01_AXI_BRESP (mac_m_bresp ), - .S01_AXI_BVALID (mac_m_bvalid ), - .S01_AXI_BREADY (mac_m_bready ), - .S01_AXI_ARID (mac_m_arid[3:0] ), - .S01_AXI_ARADDR (mac_m_araddr ), - .S01_AXI_ARLEN ({4'b0,mac_m_arlen} ), - .S01_AXI_ARSIZE (mac_m_arsize ), - .S01_AXI_ARBURST (mac_m_arburst ), - .S01_AXI_ARLOCK (mac_m_arlock[0:0] ), - .S01_AXI_ARCACHE (mac_m_arcache ), - .S01_AXI_ARPROT (mac_m_arprot ), - .S01_AXI_ARQOS (4'b0 ), - .S01_AXI_ARVALID (mac_m_arvalid ), - .S01_AXI_ARREADY (mac_m_arready ), - .S01_AXI_RID (mac_m_rid[3:0] ), - .S01_AXI_RDATA (mac_m_rdata ), - .S01_AXI_RRESP (mac_m_rresp ), - .S01_AXI_RLAST (mac_m_rlast ), - .S01_AXI_RVALID (mac_m_rvalid ), - .S01_AXI_RREADY (mac_m_rready ), - - .S02_AXI_ARESET_OUT_N ( ), - .S02_AXI_ACLK (aclk ), - .S02_AXI_AWID (dma0_awid ), - .S02_AXI_AWADDR (dma0_awaddr ), - .S02_AXI_AWLEN ({4'd0,dma0_awlen} ), - .S02_AXI_AWSIZE (dma0_awsize ), - .S02_AXI_AWBURST (dma0_awburst ), - .S02_AXI_AWLOCK (dma0_awlock[0:0] ), - .S02_AXI_AWCACHE (dma0_awcache ), - .S02_AXI_AWPROT (dma0_awprot ), - .S02_AXI_AWQOS (4'b0 ), - .S02_AXI_AWVALID (dma0_awvalid ), - .S02_AXI_AWREADY (dma0_awready ), - .S02_AXI_WDATA (dma0_wdata ), - .S02_AXI_WSTRB (dma0_wstrb ), - .S02_AXI_WLAST (dma0_wlast ), - .S02_AXI_WVALID (dma0_wvalid ), - .S02_AXI_WREADY (dma0_wready ), - .S02_AXI_BID (dma0_bid ), - .S02_AXI_BRESP (dma0_bresp ), - .S02_AXI_BVALID (dma0_bvalid ), - .S02_AXI_BREADY (dma0_bready ), - .S02_AXI_ARID (dma0_arid ), - .S02_AXI_ARADDR (dma0_araddr ), - .S02_AXI_ARLEN ({4'd0,dma0_arlen} ), - .S02_AXI_ARSIZE (dma0_arsize ), - .S02_AXI_ARBURST (dma0_arburst ), - .S02_AXI_ARLOCK (dma0_arlock[0:0] ), - .S02_AXI_ARCACHE (dma0_arcache ), - .S02_AXI_ARPROT (dma0_arprot ), - .S02_AXI_ARQOS (4'b0 ), - .S02_AXI_ARVALID (dma0_arvalid ), - .S02_AXI_ARREADY (dma0_arready ), - .S02_AXI_RID (dma0_rid ), - .S02_AXI_RDATA (dma0_rdata ), - .S02_AXI_RRESP (dma0_rresp ), - .S02_AXI_RLAST (dma0_rlast ), - .S02_AXI_RVALID (dma0_rvalid ), - .S02_AXI_RREADY (dma0_rready ), - - .M00_AXI_ARESET_OUT_N (ddr_aresetn ), - .M00_AXI_ACLK (c1_clk0 ), - .M00_AXI_AWID (mig_awid ), - .M00_AXI_AWADDR (mig_awaddr ), - .M00_AXI_AWLEN ({mig_awlen} ), - .M00_AXI_AWSIZE (mig_awsize ), - .M00_AXI_AWBURST (mig_awburst ), - .M00_AXI_AWLOCK (mig_awlock[0:0] ), - .M00_AXI_AWCACHE (mig_awcache ), - .M00_AXI_AWPROT (mig_awprot ), - .M00_AXI_AWQOS ( ), - .M00_AXI_AWVALID (mig_awvalid ), - .M00_AXI_AWREADY (mig_awready ), - .M00_AXI_WDATA (mig_wdata ), - .M00_AXI_WSTRB (mig_wstrb ), - .M00_AXI_WLAST (mig_wlast ), - .M00_AXI_WVALID (mig_wvalid ), - .M00_AXI_WREADY (mig_wready ), - .M00_AXI_BID (mig_bid ), - .M00_AXI_BRESP (mig_bresp ), - .M00_AXI_BVALID (mig_bvalid ), - .M00_AXI_BREADY (mig_bready ), - .M00_AXI_ARID (mig_arid ), - .M00_AXI_ARADDR (mig_araddr ), - .M00_AXI_ARLEN ({mig_arlen} ), - .M00_AXI_ARSIZE (mig_arsize ), - .M00_AXI_ARBURST (mig_arburst ), - .M00_AXI_ARLOCK (mig_arlock[0:0] ), - .M00_AXI_ARCACHE (mig_arcache ), - .M00_AXI_ARPROT (mig_arprot ), - .M00_AXI_ARQOS ( ), - .M00_AXI_ARVALID (mig_arvalid ), - .M00_AXI_ARREADY (mig_arready ), - .M00_AXI_RID (mig_rid ), - .M00_AXI_RDATA (mig_rdata ), - .M00_AXI_RRESP (mig_rresp ), - .M00_AXI_RLAST (mig_rlast ), - .M00_AXI_RVALID (mig_rvalid ), - .M00_AXI_RREADY (mig_rready ) -); -//ddr3 controller -mig_axi_32 mig_axi ( - // Inouts - .ddr3_dq (ddr3_dq ), - .ddr3_dqs_p (ddr3_dqs_p ), // for X16 parts - .ddr3_dqs_n (ddr3_dqs_n ), // for X16 parts - // Outputs - .ddr3_addr (ddr3_addr ), - .ddr3_ba (ddr3_ba ), - .ddr3_ras_n (ddr3_ras_n ), - .ddr3_cas_n (ddr3_cas_n ), - .ddr3_we_n (ddr3_we_n ), - .ddr3_reset_n (ddr3_reset_n ), - .ddr3_ck_p (ddr3_ck_p ), - .ddr3_ck_n (ddr3_ck_n ), - .ddr3_cke (ddr3_cke ), - .ddr3_dm (ddr3_dm ), - .ddr3_odt (ddr3_odt ), - - .ui_clk (c1_clk0 ), - .ui_clk_sync_rst (c1_rst0 ), - - .sys_clk_i (c1_sys_clk_i ), - .sys_rst (c1_sys_rst_i ), - .init_calib_complete (c1_calib_done ), - .clk_ref_i (c1_clk_ref_i ), - .mmcm_locked ( ), - - .app_sr_active ( ), - .app_ref_ack ( ), - .app_zq_ack ( ), - .app_sr_req (1'b0 ), - .app_ref_req (1'b0 ), - .app_zq_req (1'b0 ), - - .aresetn (ddr_aresetn ), - .s_axi_awid (mig_awid ), - .s_axi_awaddr (mig_awaddr[26:0]), - .s_axi_awlen ({mig_awlen} ), - .s_axi_awsize (mig_awsize ), - .s_axi_awburst (mig_awburst ), - .s_axi_awlock (mig_awlock[0:0] ), - .s_axi_awcache (mig_awcache ), - .s_axi_awprot (mig_awprot ), - .s_axi_awqos (4'b0 ), - .s_axi_awvalid (mig_awvalid ), - .s_axi_awready (mig_awready ), - .s_axi_wdata (mig_wdata ), - .s_axi_wstrb (mig_wstrb ), - .s_axi_wlast (mig_wlast ), - .s_axi_wvalid (mig_wvalid ), - .s_axi_wready (mig_wready ), - .s_axi_bid (mig_bid ), - .s_axi_bresp (mig_bresp ), - .s_axi_bvalid (mig_bvalid ), - .s_axi_bready (mig_bready ), - .s_axi_arid (mig_arid ), - .s_axi_araddr (mig_araddr[26:0]), - .s_axi_arlen ({mig_arlen} ), - .s_axi_arsize (mig_arsize ), - .s_axi_arburst (mig_arburst ), - .s_axi_arlock (mig_arlock[0:0] ), - .s_axi_arcache (mig_arcache ), - .s_axi_arprot (mig_arprot ), - .s_axi_arqos (4'b0 ), - .s_axi_arvalid (mig_arvalid ), - .s_axi_arready (mig_arready ), - .s_axi_rid (mig_rid ), - .s_axi_rdata (mig_rdata ), - .s_axi_rresp (mig_rresp ), - .s_axi_rlast (mig_rlast ), - .s_axi_rvalid (mig_rvalid ), - .s_axi_rready (mig_rready ) -); - -//DMA -dma_master DMA_MASTER0 -( -.clk (aclk ), -.rst_n (aresetn ), -.awid (dma0_awid ), -.awaddr (dma0_awaddr ), -.awlen (dma0_awlen ), -.awsize (dma0_awsize ), -.awburst (dma0_awburst ), -.awlock (dma0_awlock ), -.awcache (dma0_awcache ), -.awprot (dma0_awprot ), -.awvalid (dma0_awvalid ), -.awready (dma0_awready ), -.wid (dma0_wid ), -.wdata (dma0_wdata ), -.wstrb (dma0_wstrb ), -.wlast (dma0_wlast ), -.wvalid (dma0_wvalid ), -.wready (dma0_wready ), -.bid (dma0_bid ), -.bresp (dma0_bresp ), -.bvalid (dma0_bvalid ), -.bready (dma0_bready ), -.arid (dma0_arid ), -.araddr (dma0_araddr ), -.arlen (dma0_arlen ), -.arsize (dma0_arsize ), -.arburst (dma0_arburst ), -.arlock (dma0_arlock ), -.arcache (dma0_arcache ), -.arprot (dma0_arprot ), -.arvalid (dma0_arvalid ), -.arready (dma0_arready ), -.rid (dma0_rid ), -.rdata (dma0_rdata ), -.rresp (dma0_rresp ), -.rlast (dma0_rlast ), -.rvalid (dma0_rvalid ), -.rready (dma0_rready ), - -.dma_int (dma_int ), -.dma_req_in (dma_req ), -.dma_ack_out (dma_ack ), - -.dma_gnt (dma0_gnt ), -.apb_rw (apb_rw_dma0 ), -.apb_psel (apb_psel_dma0 ), -.apb_valid_req (apb_start_dma0 ), -.apb_penable (apb_penable_dma0 ), -.apb_addr (apb_addr_dma0 ), -.apb_wdata (apb_wdata_dma0 ), -.apb_rdata (apb_rdata_dma0 ), - -.order_addr_in (order_addr_in ), -.write_dma_end (write_dma_end ), -.finish_read_order (finish_read_order ) -); - -//AXI2APB -axi2apb_misc APB_DEV -( -.clk (aclk ), -.rst_n (aresetn ), - -.axi_s_awid (apb_s_awid ), -.axi_s_awaddr (apb_s_awaddr ), -.axi_s_awlen (apb_s_awlen ), -.axi_s_awsize (apb_s_awsize ), -.axi_s_awburst (apb_s_awburst ), -.axi_s_awlock (apb_s_awlock ), -.axi_s_awcache (apb_s_awcache ), -.axi_s_awprot (apb_s_awprot ), -.axi_s_awvalid (apb_s_awvalid ), -.axi_s_awready (apb_s_awready ), -.axi_s_wid (apb_s_wid ), -.axi_s_wdata (apb_s_wdata ), -.axi_s_wstrb (apb_s_wstrb ), -.axi_s_wlast (apb_s_wlast ), -.axi_s_wvalid (apb_s_wvalid ), -.axi_s_wready (apb_s_wready ), -.axi_s_bid (apb_s_bid ), -.axi_s_bresp (apb_s_bresp ), -.axi_s_bvalid (apb_s_bvalid ), -.axi_s_bready (apb_s_bready ), -.axi_s_arid (apb_s_arid ), -.axi_s_araddr (apb_s_araddr ), -.axi_s_arlen (apb_s_arlen ), -.axi_s_arsize (apb_s_arsize ), -.axi_s_arburst (apb_s_arburst ), -.axi_s_arlock (apb_s_arlock ), -.axi_s_arcache (apb_s_arcache ), -.axi_s_arprot (apb_s_arprot ), -.axi_s_arvalid (apb_s_arvalid ), -.axi_s_arready (apb_s_arready ), -.axi_s_rid (apb_s_rid ), -.axi_s_rdata (apb_s_rdata ), -.axi_s_rresp (apb_s_rresp ), -.axi_s_rlast (apb_s_rlast ), -.axi_s_rvalid (apb_s_rvalid ), -.axi_s_rready (apb_s_rready ), - -.apb_rw_dma (apb_rw_dma0 ), -.apb_psel_dma (apb_psel_dma0 ), -.apb_enab_dma (apb_penable_dma0 ), -.apb_addr_dma (apb_addr_dma0[19:0]), -.apb_valid_dma (apb_start_dma0 ), -.apb_wdata_dma (apb_wdata_dma0 ), -.apb_rdata_dma (apb_rdata_dma0 ), -.apb_ready_dma ( ), //output, no use -.dma_grant (dma0_gnt ), - -.dma_req_o (dma_req ), -.dma_ack_i (dma_ack ), - -//UART0 -.uart0_txd_i (uart0_txd_i ), -.uart0_txd_o (uart0_txd_o ), -.uart0_txd_oe (uart0_txd_oe ), -.uart0_rxd_i (uart0_rxd_i ), -.uart0_rxd_o (uart0_rxd_o ), -.uart0_rxd_oe (uart0_rxd_oe ), -.uart0_rts_o (uart0_rts_o ), -.uart0_dtr_o (uart0_dtr_o ), -.uart0_cts_i (uart0_cts_i ), -.uart0_dsr_i (uart0_dsr_i ), -.uart0_dcd_i (uart0_dcd_i ), -.uart0_ri_i (uart0_ri_i ), -.uart0_int (uart0_int ), - -.nand_type (2'h2 ), //1Gbit -.nand_cle (nand_cle ), -.nand_ale (nand_ale ), -.nand_rdy (nand_rdy ), -.nand_rd (nand_rd ), -.nand_ce (nand_ce ), -.nand_wr (nand_wr ), -.nand_dat_i (nand_dat_i ), -.nand_dat_o (nand_dat_o ), -.nand_dat_oe (nand_dat_oe ), - -.nand_int (nand_int ) -); -endmodule - diff --git a/resources/soc/rtl/cpu232/龙芯开源处理器gs232源码,目前缺少,请联系龙芯开源获得.txt b/resources/soc/rtl/cpu232/龙芯开源处理器gs232源码,目前缺少,请联系龙芯开源获得.txt deleted file mode 100644 index 1c57634..0000000 --- a/resources/soc/rtl/cpu232/龙芯开源处理器gs232源码,目前缺少,请联系龙芯开源获得.txt +++ /dev/null @@ -1,7 +0,0 @@ - -1.龙芯开源处理器GS232源码是可以免费获得的。 - -2.但是为了更好地对GS232源码进行版本维护和流通追溯,此处无法直接提供源码。 - -3.高校老师可在龙芯官网上通过开源申请获得GS232源码。 - diff --git a/resources/soc/simu/run/run_func/lib.list b/resources/soc/simu/run/run_func/lib.list deleted file mode 100644 index 8d1ff4d..0000000 --- a/resources/soc/simu/run/run_func/lib.list +++ /dev/null @@ -1,82 +0,0 @@ -../../lib/sram_simu.v -../../lib/func_emul/cell_emul.v -../../lib/glbl.v -../../lib/AND2B1L.v -../../lib/BUFG.v -../../lib/BUFGCE.v -../../lib/BUFGMUX.v -../../lib/BUFPLL_MCB.v -../../lib/DCM_SP.v -../../lib/FDRE.v -../../lib/FDSE.v -../../lib/IBUFG.v -../../lib/INV.v -../../lib/IOBUF.v -../../lib/IOBUFDS.v -../../lib/IODRP2.v -../../lib/IODRP2_MCB.v -../../lib/LUT4.v -../../lib/LUT6.v -../../lib/LUT6_2.v -../../lib/MCB.v -../../lib/MUXCY.v -../../lib/OBUFDS.v -../../lib/OBUFT.v -../../lib/OBUFTDS.v -../../lib/OR2L.v -../../lib/OSERDES2.v -../../lib/PLL_ADV.v -../../lib/PULLDOWN.v -../../lib/PULLUP.v -../../lib/SRLC32E.v -../../lib/XORCY.v -../../lib/BLK_MEM_GEN_V6_2.v -../../lib/BLK_MEM_GEN_V6_1.v -../../lib/mcb_001.vp -../../lib/mcb_002.vp -../../lib/mcb_003.vp -../../lib/mcb_004.vp -../../lib/mcb_005.vp -../../lib/mcb_006.vp -../../lib/mcb_007.vp -../../lib/mcb_008.vp -../../lib/mcb_009.vp -../../lib/mcb_010.vp -../../lib/mcb_011.vp -../../lib/mcb_012.vp -../../lib/mcb_013.vp -../../lib/mcb_014.vp -../../lib/mcb_015.vp -../../lib/mcb_016.vp -../../lib/mcb_017.vp -../../lib/mcb_018.vp -../../lib/mcb_019.vp -../../lib/mcb_020.vp -../../lib/mcb_021.vp -../../lib/mcb_022.vp -../../lib/mcb_023.vp -../../lib/mcb_024.vp -../../lib/mcb_025.vp -../../lib/mcb_026.vp -../../lib/mcb_027.vp -../../lib/mcb_028.vp -../../lib/mcb_029.vp -../../lib/mcb_030.vp -../../lib/mcb_031.vp -../../lib/mcb_032.vp -../../lib/mcb_033.vp -../../lib/mcb_034.vp -../../lib/mcb_035.vp -../../lib/mcb_036.vp -../../lib/mcb_037.vp -../../lib/mcb_038.vp -../../lib/mcb_039.vp -../../lib/mcb_040.vp -../../lib/mcb_041.vp -../../lib/mcb_042.vp -../../lib/mcb_043.vp -../../lib/mcb_044.vp -../../lib/mcb_045.vp -../../lib/mcb_046.vp -../../lib/mcb_047.vp - diff --git a/resources/soc/simu/run/run_func/ncompile b/resources/soc/simu/run/run_func/ncompile deleted file mode 100644 index b04118c..0000000 --- a/resources/soc/simu/run/run_func/ncompile +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -ncverilog -f run.f diff --git a/resources/soc/simu/run/run_func/rtl.list b/resources/soc/simu/run/run_func/rtl.list deleted file mode 100644 index 423a71f..0000000 --- a/resources/soc/simu/run/run_func/rtl.list +++ /dev/null @@ -1,117 +0,0 @@ -../../../rtl/TOP/archlab_sopc_top.v - -../../../rtl/CPU/axi_interface.v -../../../rtl/CPU/godson_addr_module.v -../../../rtl/CPU/godson_alu_module.v -../../../rtl/CPU/godson_bus_module.v -../../../rtl/CPU/godson_cpu_core.v -../../../rtl/CPU/godson_cpu_mid.v -../../../rtl/CPU/godson_dcache_module.v -../../../rtl/CPU/godson_dcr_module.v -../../../rtl/CPU/godson_decoder_module.v -../../../rtl/CPU/godson_dtlb_module.v -../../../rtl/CPU/godson_ejtag_tap_module.v -../../../rtl/CPU/godson_fetch_module.v -../../../rtl/CPU/godson_gr_module.v -../../../rtl/CPU/godson_hb_module.v -../../../rtl/CPU/godson_icache_module.v -../../../rtl/CPU/godson_itlb_module.v -../../../rtl/CPU/godson_memqueue_module.v -../../../rtl/CPU/godson_queue_module.v -../../../rtl/CPU/godson_ram_bist.v -../../../rtl/CPU/godson_rs_module.v -../../../rtl/CPU/godson_tap_buffer_module.v -../../../rtl/CPU/tools.v - -../../../rtl/CPU/sram/sram_128x22.v -../../../rtl/CPU/sram/sram_128x32.v -../../../rtl/CPU/sram/sram_128x64.v -../../../rtl/CPU/sram/sram_32x52bit.v - -../../../rtl/AMBA/axi_mux.v -../../../rtl/AMBA/axi2apb.v - -../../../rtl/MIG/memc_wrapper.v -../../../rtl/MIG/ddr3_3port.v -../../../rtl/MIG/infrastructure.v -../../../rtl/MIG/axi/a_upsizer.v -../../../rtl/MIG/axi/axi_mcb.v -../../../rtl/MIG/axi/axi_mcb_ar_channel.v -../../../rtl/MIG/axi/axi_mcb_aw_channel.v -../../../rtl/MIG/axi/axi_mcb_b_channel.v -../../../rtl/MIG/axi/axi_mcb_cmd_arbiter.v -../../../rtl/MIG/axi/axi_mcb_cmd_fsm.v -../../../rtl/MIG/axi/axi_mcb_cmd_translator.v -../../../rtl/MIG/axi/axi_mcb_incr_cmd.v -../../../rtl/MIG/axi/axi_mcb_r_channel.v -../../../rtl/MIG/axi/axi_mcb_simple_fifo.v -../../../rtl/MIG/axi/axi_mcb_w_channel.v -../../../rtl/MIG/axi/axi_mcb_wrap_cmd.v -../../../rtl/MIG/axi/axi_register_slice.v -../../../rtl/MIG/axi/axi_upsizer.v -../../../rtl/MIG/axi/axic_register_slice.v -../../../rtl/MIG/axi/carry.v -../../../rtl/MIG/axi/carry_and.v -../../../rtl/MIG/axi/carry_latch_and.v -../../../rtl/MIG/axi/carry_latch_or.v -../../../rtl/MIG/axi/carry_or.v -../../../rtl/MIG/axi/command_fifo.v -../../../rtl/MIG/axi/comparator.v -../../../rtl/MIG/axi/comparator_mask.v -../../../rtl/MIG/axi/comparator_mask_static.v -../../../rtl/MIG/axi/comparator_sel.v -../../../rtl/MIG/axi/comparator_sel_mask.v -../../../rtl/MIG/axi/comparator_sel_mask_static.v -../../../rtl/MIG/axi/comparator_sel_static.v -../../../rtl/MIG/axi/comparator_static.v -../../../rtl/MIG/axi/mcb_ui_top_synch.v -../../../rtl/MIG/axi/mux_enc.v -../../../rtl/MIG/axi/r_upsizer.v -../../../rtl/MIG/axi/w_upsizer.v -../../../rtl/MIG/mcb_controller/iodrp_controller.v -../../../rtl/MIG/mcb_controller/iodrp_mcb_controller.v -../../../rtl/MIG/mcb_controller/mcb_raw_wrapper.v -../../../rtl/MIG/mcb_controller/mcb_soft_calibration.v -../../../rtl/MIG/mcb_controller/mcb_soft_calibration_top.v -../../../rtl/MIG/mcb_controller/mcb_ui_top.v - -../../../rtl/APB_DEV/URT/raminfr.v -../../../rtl/APB_DEV/URT/uart_receiver.v -../../../rtl/APB_DEV/URT/uart_regs.v -../../../rtl/APB_DEV/URT/uart_rfifo.v -../../../rtl/APB_DEV/URT/uart_sync_flops.v -../../../rtl/APB_DEV/URT/uart_tfifo.v -../../../rtl/APB_DEV/URT/uart_top.v -../../../rtl/APB_DEV/URT/uart_transmitter.v - -../../../rtl/CONFREG/confreg.v -../../../rtl/SPI/godson_sbridge_spi.v - -../../../rtl/MAC/utility.v -../../../rtl/MAC/ethernet_top.v -../../../rtl/MAC/mac_top.v -../../../rtl/MAC/mac_axi.v -../../../rtl/MAC/mac.v -../../../rtl/MAC/csr.v -../../../rtl/MAC/rc.v -../../../rtl/MAC/rfifo.v -../../../rtl/MAC/rlsm.v -../../../rtl/MAC/tc.v -../../../rtl/MAC/bd.v -../../../rtl/MAC/dma.v -../../../rtl/MAC/rstc.v -../../../rtl/MAC/tfifo.v -../../../rtl/MAC/tlsm.v -../../../rtl/MAC/mac2axi.v -../../../rtl/MAC/maccsr2axi.v -../../../rtl/MAC/macdata2axi.v -../../../rtl/MAC/cam.v -../../../rtl/MAC/dpram_512x32.v - -../../../rtl/DMA/dma.v - -../../../rtl/APB_DEV/apb_dev_top.v -../../../rtl/APB_DEV/apb_mux2.v -../../../rtl/APB_DEV/nand_module.v - -../../../rtl/APB_DEV/NAND/nand.v diff --git a/resources/soc/simu/run/run_func/run.f b/resources/soc/simu/run/run_func/run.f deleted file mode 100644 index a0e96c5..0000000 --- a/resources/soc/simu/run/run_func/run.f +++ /dev/null @@ -1,28 +0,0 @@ -+incdir+../../../rtl/TOP -+incdir+../../../rtl/CPU -+incdir+../../../rtl/APB_DEV -+incdir+../../../rtl/APB_DEV/NAND -+incdir+../../../rtl/APB_DEV/URT -+incdir+../../../rtl/SPI -+incdir+../../../rtl/MIG -+incdir+../../../rtl/MAC -+incdir+../../../rtl/AMBA -+incdir+../../../rtl/CONFREG -+incdir+../../testbench -+incdir+../../testbench/vmac -+nclog_ncsim+ncsim.log -+access+rw --sv --64bit --nowarn MRSTAR -+pathpulse -+profile -+define+x1Gb -+define+sg15E -+define+x16 -+define+VIRTUAL_MAC -+define+_DUMPDUMP --f sys.list --f rtl.list --f lib.list - diff --git a/resources/soc/simu/run/run_func/sys.list b/resources/soc/simu/run/run_func/sys.list deleted file mode 100644 index 8462747..0000000 --- a/resources/soc/simu/run/run_func/sys.list +++ /dev/null @@ -1,11 +0,0 @@ -../../testbench/godson_system.v -../../testbench/MX25L6405D.v -../../testbench/uart_dev.v -../../testbench/ejtag_virtual_host.v -../../testbench/ddr3_model_c1.v -../../testbench/vmac/virtual_mac.v -../../testbench/vmac/mac_top.v -../../testbench/vmac/mac_ram.v -../../testbench/nand_sim.v - - diff --git a/resources/soc/simu/soft/func/Makefile b/resources/soc/simu/soft/func/Makefile deleted file mode 100644 index 477a6ae..0000000 --- a/resources/soc/simu/soft/func/Makefile +++ /dev/null @@ -1,48 +0,0 @@ -TOPDIR = $(shell pwd) - -CROSS_COMPILE = mipsel-linux- -DEBUG = -g -FLAGS = - -CC = $(CROSS_COMPILE)gcc -LD = $(CROSS_COMPILE)ld -OBJCOPY = $(CROSS_COMPILE)objcopy -OBJDUMP = $(CROSS_COMPILE)objdump -AR = $(CROSS_COMPILE)ar - -export TOPDIR AR CC DEBUG FLAGS - -all:test.bin convert - ./convert - $(OBJDUMP) -ald test >test.s - -libtinyc.a: - make -C lib $(TOPDIR)/$@ - -start.o:start.S include/ls1d.h include/asm/mipsregs.h include/asm/regdef.h include/asm/ns16550.h - $(CC) $(DEBUG) $(FLAGS) -mips32 -EL -c -o $@ $< - -nand.o:nand_test.S include/ls1d.h include/asm/mipsregs.h include/asm/regdef.h include/asm/ns16550.h - $(CC) $(DEBUG) $(FLAGS) -mips32 -EL -c -o $@ $< - -main.o:main.c include/*.h - $(CC) $(DEBUG) $(FLAGS) -EL -c -o $@ $< - -%.o:source/%.c include/%.h include/ls1d.h - $(CC) $(DEBUG) $(FLAGS) -EL -c -o $@ $< - -#test_cycle.o myprintf.o -OBJ1 = Interrupt.o lcd.o SystemInit.o Calendar.o key.o battery.o common.o temp_flow.o Infrare.o frame.o MonthData.o isp.o adc.o cmdline.o flash.o dg_rs232.o - -test:start.o nand.o main.o $(OBJ1) libtinyc.a - $(LD) -T test.lds -Ttext 0xBFC00000 -Map test.map start.o nand.o main.o $(OBJ1) -o $@ -L . -ltinyc - #rm -f *.o - -test.bin:test - $(OBJCOPY) --gap-fill=0xff -O binary $< $@ - -clean: - rm -f *.o *.a test test.bin test.map test.s convert flash.vlog - make -C lib clean -convert:convert.c - gcc -o convert convert.c diff --git a/resources/soc/simu/soft/func/config.h b/resources/soc/simu/soft/func/config.h deleted file mode 100644 index 31c1864..0000000 --- a/resources/soc/simu/soft/func/config.h +++ /dev/null @@ -1,179 +0,0 @@ -#include "include/ls1d.h" -#include "include/SystemInit.h" -#include "include/Calendar.h" -#include "include/lcd.h" -#include "include/key.h" -#include "include/common.h" -#include "include/temp_flow.h" -#include "include/MonthData.h" -#include "include/Infrare.h" -#include "include/frame.h" -#include "include/battery.h" -#include "include/Interrupt.h" -#include "include/xmodem.h" -#include "include/isp.h" -#include "include/cmdline.h" -//#include "myprintf.h" -//#include "test_cycle.h" - -//#include -//#include - -#define DisableWatchDog() PMU_Command &= 0xdfffffff ; -#define EnableWatchDog() PMU_Command |= 0x20000000 ; -#define FeedWatchDog() PMU_CommandW = 0x40000000 ; - -#define NUM 10 -extern _u32 wait[NUM]; -extern _u32 main_flag; -extern _u32 work_mode; -extern _u32 *PMU; -extern _u32 *Sonar; -extern _u32 *Thsens; - -/********************************Defined by user*******************************************************************************************************************/ -#define IR_PWR_ON PMU_GPIO_O |= (1 << 3) //Infrare receiver power on -#define IR_PWR_OFF PMU_GPIO_O &=~(1 << 3) //Infrare receiver power off -#define KEY_OFF 0x10 //when the key is off, the key_bit of gpio_in will be high - -#define STDC_CALIBRATE 200 //default value -#define COUNT_MASK 0xffffff //refer to count reg, PMU -#define COUNT_COMPARE 0X1000000 - -#define LCD_MULTIPLE 100000 //every varible printed in lcd will plus LCD_MULTIPLE, thus the real value should divide LCD_MULTIPLE -#define LCD_LENGTH 10 //the lcd buf will divide into LCD_LENGTH -#define LCD_NUM_LENGTH 8 //the numbers of number that the lcd can print - -#define CJT188_DI_SEQ 1 //it will change the sequence of DI0 and DI1 -#define CJT188_DEF_READ 0x0e -#define CJT188_DEF_WRITE 0x1e - -#define UART1_INT 0 //enable uart1_rx_int when a key comes, then disable it when received a right frame - - -/***********************************xmodem Option*****************************************************************************************************************/ -#define FLASH_BLOCK_SIZE 256 -#define FLASH_ERASE_START 0xbfc00000 -#define FLASH_ERASE_END 0xbfc0efff //60kB - -/********************************Info flash Option****************************************************************************************************************/ -#define INFO_FLASH_START 0xbfc0fe00 -#define AUTO_SAVE_ADDR 0xbfc0fd00 - -/********************************Pipe Option**********************************************************************************************************************/ -#define SOUND_PATH 0.072f //m -#define COS_RESULT 1 -#define K_COEFFICIENT 0.5f -#define DIAMETER 0.020f //m -#define PI 3.1415926f -#define CONST PI/4 - -/********************************Compile Option**********************************************************************************************************************/ -#define ISP 1 //ISP module -#define LS1D_FPGA 1 //Choose code for fpga_board or chip_flash. - -#define AD_MODULE 0 -#define ADC_MODULE 0 -#define LCD_MODULE 0 -#define TDC_TEMP_MODULE 0 -#define TDC_FLOW_MODULE 0 -#define MONTHDATA_MODULE 0 -#define KEY_MODULE 0 -#define MBUS_MODULE 0 -#define INFRARE_MODULE 0 -#define CALENDAR_MODULE 0 //need TIMER_MODULE and LCD_MODULE -#define FRAME_MODULE 0 -#define TIMER_MODULE 0 - - -/********************************Debug Option/Print*******************************************************************************************************************/ -#define PRINT 1 //only print necessory information -#if PRINT -#define AD_TEST 0 //need TIMER_MODULE for 2s delay -#define ADC_TEST 0 -#define LCD_TEST 0 //need TIMER_MODULE for 1s delay -#define TEMP_TEST 0 -#define FLOW_TEST 0 -#define MONTHDATA_TEST 0 //use lcd A3 -#define KEY_TEST 0 -#define MBUS_TEST 0 -#define INFRARE_TEST 0 -#define CALENDAR_TEST 0 -#define FRAME_TEST 0 -#define RES_TEST 0 -#define TIMER_TEST 0 -#endif - -#if PRINT -#define DEBUG 1 //print information in detail -#endif - -#if DEBUG -#define BUG 1 -#define debug(fmt,args...) printf(fmt ,##args); -#define debugX(level,fmt,args...) if(DEBUG>=level) printf(fmt,##args); -#else -#define BUG 0 -#define debug(fmt,args...) -#define debugX(level,fmt,args...) -#endif - -#if BUG -#define BUG() printf("BUG: failure at %s:%d in %s()!\n", __FILE__, __LINE__, __FUNCTION__); -#define BUG_ON(condition) if(condition) BUG(); -#endif /* BUG */ - - -/*************************************main_flag***********************************************************************************************************************/ -//unsigned char main_flag0; -#define test_bit 0x80 //͵ѹ -#define temp_bit 0x40 -#define flow_bit 0x20 -#define month_bit 0x10 -#define key_bit 0x8 -#define lcd_bit 0x4 -#define mbus_bit 0x2 -#define infrare_bit 0x1 -//unsigned char main_flag1; -#define state_bit 0x8000 //gp21״̬, '0'Ϊ'1'Ϊ쳣 -#define lowV1_bit 0x4000 //͵ѹ1,ÿ2 -#define lowV2_bit 0x2000 //͵ѹ2,ÿ7142128賿3'1' -#define time_bit 0x1000 //ʱ -#define long_key 0x800 // -#define month_flag 0x400 //½ʱǷΪĬʱ䣬ĬʱΪÿµף'1' -#define A3_delay 0x200 //A3˵3Զл -#define wait_halfsec 0x100 //ȴ0.5 -//unsigned char main_flag2; -#define wait_3sec 0x800000 //3 -#define wait_8sec 0x400000 //8 -#define wait_9sec 0x200000 //9 -#define wait_10sec 0x100000 //10 -#define wait_1min 0x80000 //1 -#define wait_2min 0x40000 //2 -#define wait_16min 0x20000 //16 -#define wait_2hour 0x10000 //2Сʱ -//unsigned char main_flag3; -#define rx_bit 0x80000000 //usartյһ֡ -#define infrare_flag 0x40000000 //״̬'0'ر'1' -#define lowV_flag 0x20000000 //͵ѹ״̬Ϊ'1' -#define wait_oneday 0x10000000 //͵ѹ⣬ȴһ -#define power_on 0x8000000 //ϵ -#define res_valid 0x4000000 //RES_VALID -#define per_timer 0x2000000 - -/********************************************************************************************************************************************************************/ - -/*************************************work_mode***********************************************************************************************************************/ -#define MODE_0 0 -#define MODE_1 1 -#define MODE_2 2 -#define MODE_3 3 -#define MODE_4 4 -#define MODE_5 5 -#define MODE_6 6 -#define MODE_7 7 -#define MODE_8 8 -#define MODE_9 9 - -/********************************************************************************************************************************************************************/ - diff --git a/resources/soc/simu/soft/func/convert.c b/resources/soc/simu/soft/func/convert.c deleted file mode 100644 index 0e66323..0000000 --- a/resources/soc/simu/soft/func/convert.c +++ /dev/null @@ -1,29 +0,0 @@ -#include -#include - -int main(void) -{ - FILE *in; - FILE *out; - FILE *out0, *out1, *out2, *out3; - FILE *out4, *out5, *out6, *out7; - - int i,j,k; - unsigned char mem[32]; - - in = fopen("test.bin", "rb"); - out = fopen("flash.vlog", "w"); - - fprintf(out, " @00\n"); - while(!feof(in)) { - if(fread(mem,1,4,in)!=4) { - fprintf(out, " %02x %02x %02x %02x\n", mem[0], mem[1], mem[2], mem[3]); - break; - } - fprintf(out, " %02x %02x %02x %02x\n", mem[0], mem[1], mem[2],mem[3]); - } - fclose(in); - fclose(out); - - return 0; -} diff --git a/resources/soc/simu/soft/func/include/Calendar.h b/resources/soc/simu/soft/func/include/Calendar.h deleted file mode 100644 index f51c62d..0000000 --- a/resources/soc/simu/soft/func/include/Calendar.h +++ /dev/null @@ -1,12 +0,0 @@ -struct Date_Time{ - _u32 Year; - _u32 Month; - _u32 Day; - _u32 Hour; - _u32 Minute; - _u32 Second; -}; - -void calendar(struct Date_Time *Date_and_Time); -//void calendar(struct Date_Time *Date_and_Time, _u32 lcdmode); -void DateInit(struct Date_Time *Date_and_Time); diff --git a/resources/soc/simu/soft/func/include/Infrare.h b/resources/soc/simu/soft/func/include/Infrare.h deleted file mode 100644 index 775975a..0000000 --- a/resources/soc/simu/soft/func/include/Infrare.h +++ /dev/null @@ -1 +0,0 @@ -void Infrare(void); diff --git a/resources/soc/simu/soft/func/include/Interrupt.h b/resources/soc/simu/soft/func/include/Interrupt.h deleted file mode 100644 index f605aea..0000000 --- a/resources/soc/simu/soft/func/include/Interrupt.h +++ /dev/null @@ -1,9 +0,0 @@ -void TIMER_INT(); -void KEY_INT(); -void BAT_FAIL(); -void RES_VALID(); -void INTC(); -void Ring(); -void Per_timer(struct Data *Lcd_data); - -void Interrupt_Init(); diff --git a/resources/soc/simu/soft/func/include/MonthData.h b/resources/soc/simu/soft/func/include/MonthData.h deleted file mode 100644 index a4ab8f4..0000000 --- a/resources/soc/simu/soft/func/include/MonthData.h +++ /dev/null @@ -1,23 +0,0 @@ -void MonthData(struct Date_Time *Date_and_Time, struct Data *Lcd_data); -void Flash_Read_Info(); -void Flash_Write_Test(); -extern _u32 Last_month_num; - -#define CHRWRITE 0 -#define BLKWRITE 1 -struct Record_0{ - _u32 Date; /*ϢDate = Year*1000 + Month*10, 2011.10,Date = 20110100 */ - _u32 TotalHeat; //xxxxxx.xx, plus 100 - _u32 TotalFlow; //xxxxxx.xx, plus 100 -}; - -struct Record_1{ - _u32 Date; /*ϢDate = Year*10000 + Month*100 + Day, 2011.10.12,Date = 20111012 */ - _u32 Time; /*ʱϢTime = Hour*100 + Minute, 930Time = 930 */ - _fp32 TotalHeat; - _fp32 TotalFlow; - _u32 WorkTime; - _u32 ErrTime; -}; -extern struct Record_1 Latest_Record; - diff --git a/resources/soc/simu/soft/func/include/SystemInit.h b/resources/soc/simu/soft/func/include/SystemInit.h deleted file mode 100644 index 7735907..0000000 --- a/resources/soc/simu/soft/func/include/SystemInit.h +++ /dev/null @@ -1,4 +0,0 @@ -void Uart0_Init(); -void SystemInit(); -void PowerDetec(); -//void ReLoad(); diff --git a/resources/soc/simu/soft/func/include/adc.h b/resources/soc/simu/soft/func/include/adc.h deleted file mode 100644 index 93823ec..0000000 --- a/resources/soc/simu/soft/func/include/adc.h +++ /dev/null @@ -1,2 +0,0 @@ - -float BatteryMeasure(void) diff --git a/resources/soc/simu/soft/func/include/asm/interrupt.h b/resources/soc/simu/soft/func/include/asm/interrupt.h deleted file mode 100644 index 28f034f..0000000 --- a/resources/soc/simu/soft/func/include/asm/interrupt.h +++ /dev/null @@ -1,287 +0,0 @@ -#if 1 /*It's not a good method. Don't use it!*/ -#define SAVE_REGS \ - li k1, SRAM_BASEADDR+0x1000; \ - sw $0, 0x0(k1); \ - sw $1, 0x4(k1); \ - sw $2, 0x8(k1); \ - sw $3, 0xc(k1); \ - sw $4, 0x10(k1); \ - sw $5, 0x14(k1); \ - sw $6, 0x18(k1); \ - sw $7, 0x1c(k1); \ - sw $8, 0x20(k1); \ - sw $9, 0x24(k1); \ - sw $10, 0x28(k1); \ - sw $11, 0x2c(k1); \ - sw $12, 0x30(k1); \ - sw $13, 0x34(k1); \ - sw $14, 0x38(k1); \ - sw $15, 0x3c(k1); \ - sw $16, 0x40(k1); \ - sw $17, 0x44(k1); \ - sw $18, 0x48(k1); \ - sw $19, 0x4c(k1); \ - sw $20, 0x50(k1); \ - sw $21, 0x54(k1); \ - sw $22, 0x58(k1); \ - sw $23, 0x5c(k1); \ - sw $24, 0x60(k1); \ - sw $25, 0x64(k1); \ - sw $26, 0x68(k1); \ - sw $27, 0x6c(k1); \ - sw $28, 0x70(k1); \ - sw $29, 0x74(k1); \ - sw $30, 0x78(k1); - //sw $31, 0x7c(k1) - -#define LOAD_REGS \ - li k1, SRAM_BASEADDR+0x1000; \ - lw $0, 0x0(k1); \ - lw $1, 0x4(k1); \ - lw $2, 0x8(k1); \ - lw $3, 0xc(k1); \ - lw $4, 0x10(k1); \ - lw $5, 0x14(k1); \ - lw $6, 0x18(k1); \ - lw $7, 0x1c(k1); \ - lw $8, 0x20(k1); \ - lw $9, 0x24(k1); \ - lw $10, 0x28(k1); \ - lw $11, 0x2c(k1); \ - lw $12, 0x30(k1); \ - lw $13, 0x34(k1); \ - lw $14, 0x38(k1); \ - lw $15, 0x3c(k1); \ - lw $16, 0x40(k1); \ - lw $17, 0x44(k1); \ - lw $18, 0x48(k1); \ - lw $19, 0x4c(k1); \ - lw $20, 0x50(k1); \ - lw $21, 0x54(k1); \ - lw $22, 0x58(k1); \ - lw $23, 0x5c(k1); \ - lw $24, 0x60(k1); \ - lw $25, 0x64(k1); \ - lw $26, 0x68(k1); \ - lw $27, 0x6c(k1); \ - lw $28, 0x70(k1); \ - lw $29, 0x74(k1); \ - lw $30, 0x78(k1); \ - //lw $26, 0x7c(k1); \ - //sw $26, 0x10($30); - //lw $31, 0x7c(k1) -#endif - -/***********************************method 1*************************************/ -#if 0 -#define SAVE_ALL \ - addi sp, -4; \ - sw $0, 0x0(sp); \ - addi sp, -4; \ - sw $1, 0x0(sp); \ - addi sp, -4; \ - sw $2, 0x0(sp); \ - addi sp, -4; \ - sw $3, 0x0(sp); \ - addi sp, -4; \ - sw $4, 0x0(sp); \ - addi sp, -4; \ - sw $5, 0x0(sp); \ - addi sp, -4; \ - sw $6, 0x0(sp); \ - addi sp, -4; \ - sw $7, 0x0(sp); \ - addi sp, -4; \ - sw $8, 0x0(sp); \ - addi sp, -4; \ - sw $9, 0x0(sp); \ - addi sp, -4; \ - sw $10, 0x0(sp); \ - addi sp, -4; \ - sw $11, 0x0(sp); \ - addi sp, -4; \ - sw $12, 0x0(sp); \ - addi sp, -4; \ - sw $13, 0x0(sp); \ - addi sp, -4; \ - sw $14, 0x0(sp); \ - addi sp, -4; \ - sw $15, 0x0(sp); \ - addi sp, -4; \ - sw $16, 0x0(sp); \ - addi sp, -4; \ - sw $17, 0x0(sp); \ - addi sp, -4; \ - sw $18, 0x0(sp); \ - addi sp, -4; \ - sw $19, 0x0(sp); \ - addi sp, -4; \ - sw $20, 0x0(sp); \ - addi sp, -4; \ - sw $21, 0x0(sp); \ - addi sp, -4; \ - sw $22, 0x0(sp); \ - addi sp, -4; \ - sw $23, 0x0(sp); \ - addi sp, -4; \ - sw $24, 0x0(sp); \ - addi sp, -4; \ - sw $25, 0x0(sp); \ - addi sp, -4; \ - sw $26, 0x0(sp); \ - addi sp, -4; \ - sw $27, 0x0(sp); \ - addi sp, -4; \ - sw $28, 0x0(sp); \ - addi sp, -4; \ - sw $29, 0x0(sp); \ - addi sp, -4; \ - sw $30, 0x0(sp); \ - addi sp, -4; \ - sw $31, 0x0(sp); \ - addi sp, -4 - - -#define LOAD_ALL \ - addi sp, 4; \ - lw $31, 0x0(sp); \ - addi sp, 4; \ - lw $30, 0x0(sp); \ - addi sp, 4; \ - lw $29, 0x0(sp); \ - addi sp, 4; \ - lw $28, 0x0(sp); \ - addi sp, 4; \ - lw $27, 0x0(sp); \ - addi sp, 4; \ - lw $26, 0x0(sp); \ - addi sp, 4; \ - lw $25, 0x0(sp); \ - addi sp, 4; \ - lw $24, 0x0(sp); \ - addi sp, 4; \ - lw $23, 0x0(sp); \ - addi sp, 4; \ - lw $22, 0x0(sp); \ - addi sp, 4; \ - lw $21, 0x0(sp); \ - addi sp, 4; \ - lw $20, 0x0(sp); \ - addi sp, 4; \ - lw $19, 0x0(sp); \ - addi sp, 4; \ - lw $18, 0x0(sp); \ - addi sp, 4; \ - lw $17, 0x0(sp); \ - addi sp, 4; \ - lw $16, 0x0(sp); \ - addi sp, 4; \ - lw $15, 0x0(sp); \ - addi sp, 4; \ - lw $14, 0x0(sp); \ - addi sp, 4; \ - lw $13, 0x0(sp); \ - addi sp, 4; \ - lw $12, 0x0(sp); \ - addi sp, 4; \ - lw $11, 0x0(sp); \ - addi sp, 4; \ - lw $10, 0x0(sp); \ - addi sp, 4; \ - lw $9, 0x0(sp); \ - addi sp, 4; \ - lw $8, 0x0(sp); \ - addi sp, 4; \ - lw $7, 0x0(sp); \ - addi sp, 4; \ - lw $6, 0x0(sp); \ - addi sp, 4; \ - lw $5, 0x0(sp); \ - addi sp, 4; \ - lw $4, 0x0(sp); \ - addi sp, 4; \ - lw $3, 0x0(sp); \ - addi sp, 4; \ - lw $2, 0x0(sp); \ - addi sp, 4; \ - lw $1, 0x0(sp); \ - addi sp, 4; \ - lw $0, 0x0(sp); \ - addi sp, 4 -#endif -/****************************************************************************/ - -/*************************************method 2***********************************/ -#if 1 -#define SAVE_ALL \ - addi sp, -132; \ - sw $0, 0x80(sp); \ - sw $1, 0x7c(sp); \ - sw $2, 0x78(sp); \ - sw $3, 0x74(sp); \ - sw $4, 0x70(sp); \ - sw $5, 0x6c(sp); \ - sw $6, 0x68(sp); \ - sw $7, 0x64(sp); \ - sw $8, 0x60(sp); \ - sw $9, 0x5c(sp); \ - sw $10, 0x58(sp); \ - sw $11, 0x54(sp); \ - sw $12, 0x50(sp); \ - sw $13, 0x4c(sp); \ - sw $14, 0x48(sp); \ - sw $15, 0x44(sp); \ - sw $16, 0x40(sp); \ - sw $17, 0x3c(sp); \ - sw $18, 0x38(sp); \ - sw $19, 0x34(sp); \ - sw $20, 0x30(sp); \ - sw $21, 0x2c(sp); \ - sw $22, 0x28(sp); \ - sw $23, 0x24(sp); \ - sw $24, 0x20(sp); \ - sw $25, 0x1c(sp); \ - sw $26, 0x18(sp); \ - sw $27, 0x14(sp); \ - sw $28, 0x10(sp); \ - sw $29, 0xc(sp); \ - sw $30, 0x8(sp); \ - sw $31, 0x4(sp) - - -#define LOAD_ALL \ - lw $0, 0x80(sp); \ - lw $1, 0x7c(sp); \ - lw $2, 0x78(sp); \ - lw $3, 0x74(sp); \ - lw $4, 0x70(sp); \ - lw $5, 0x6c(sp); \ - lw $6, 0x68(sp); \ - lw $7, 0x64(sp); \ - lw $8, 0x60(sp); \ - lw $9, 0x5c(sp); \ - lw $10, 0x58(sp); \ - lw $11, 0x54(sp); \ - lw $12, 0x50(sp); \ - lw $13, 0x4c(sp); \ - lw $14, 0x48(sp); \ - lw $15, 0x44(sp); \ - lw $16, 0x40(sp); \ - lw $17, 0x3c(sp); \ - lw $18, 0x38(sp); \ - lw $19, 0x34(sp); \ - lw $20, 0x30(sp); \ - lw $21, 0x2c(sp); \ - lw $22, 0x28(sp); \ - lw $23, 0x24(sp); \ - lw $24, 0x20(sp); \ - lw $25, 0x1c(sp); \ - lw $26, 0x18(sp); \ - lw $27, 0x14(sp); \ - lw $28, 0x10(sp); \ - lw $29, 0xc(sp); \ - lw $30, 0x8(sp); \ - lw $31, 0x4(sp); \ - addi sp, 132 -#endif -/****************************************************************************/ diff --git a/resources/soc/simu/soft/func/include/asm/mipsregs.h b/resources/soc/simu/soft/func/include/asm/mipsregs.h deleted file mode 100644 index 6c07b12..0000000 --- a/resources/soc/simu/soft/func/include/asm/mipsregs.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Coprocessor 0 register names - */ -#define CP0_INDEX $0 -#define CP0_RANDOM $1 -#define CP0_ENTRYLO0 $2 -#define CP0_ENTRYLO1 $3 -#define CP0_CONF $3 -#define CP0_CONTEXT $4 -#define CP0_PAGEMASK $5 -#define CP0_WIRED $6 -#define CP0_INFO $7 -#define CP0_BADVADDR $8 -#define CP0_COUNT $9 -#define CP0_ENTRYHI $10 -#define CP0_COMPARE $11 -#define CP0_STATUS $12 -#define CP0_CAUSE $13 -#define CP0_EPC $14 -#define CP0_PRID $15 -#define CP0_CONFIG $16 -#define CP0_LLADDR $17 -#define CP0_WATCHLO $18 -#define CP0_WATCHHI $19 -#define CP0_XCONTEXT $20 -#define CP0_FRAMEMASK $21 -#define CP0_DIAGNOSTIC $22 -#define CP0_DEBUG $23 -#define CP0_DEPC $24 -#define CP0_PERFORMANCE $25 -#define CP0_ECC $26 -#define CP0_CACHEERR $27 -#define CP0_TAGLO $28 -#define CP0_TAGHI $29 -#define CP0_ERROREPC $30 -#define CP0_DESAVE $31 - - diff --git a/resources/soc/simu/soft/func/include/asm/ns16550.h b/resources/soc/simu/soft/func/include/asm/ns16550.h deleted file mode 100644 index ce32524..0000000 --- a/resources/soc/simu/soft/func/include/asm/ns16550.h +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (c) 2009 yanhua - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2, or (at - * your option) any later version. - */ - -#ifdef CONFIG_CPU_UART -//#define COMMON_COM_BASE_ADDR 0xbff003f8 -#define COMMON_COM_BASE_ADDR 0xbfd00000 -#define NS16550HZ 3686400 -#else -#define COMMON_COM_BASE_ADDR 0xbfd003f8 -#define NS16550HZ 1843200 -#endif - -#define CONS_BAUD B115200 -/* - * NS16550 UART registers - */ - -#define NS16550_CHANA PHYS_TO_K1(UART0_BASE) -#define NS16550_CHANB PHYS_TO_K1(UART1_BASE) - -/* - * Standard speeds, make these available for start.S et al. - */ -#define B0 0 -#define B50 50 -#define B75 75 -#define B110 110 -#define B134 134 -#define B150 150 -#define B200 200 -#define B300 300 -#define B600 600 -#define B1200 1200 -#define B1800 1800 -#define B2400 2400 -#define B4800 4800 -#define B9600 9600 -#define B19200 19200 -#define B38400 38400 -#define B7200 7200 -#define B14400 14400 -#define B28800 28800 -#define B57600 57600 -#define B76800 76800 -#define B115200 115200 -#define B230400 230400 - -#ifndef NSREG -#define NSREG(x) x -#endif - -#define NS16550_DATA 0 -#define NS16550_IER 1 -#define NS16550_IIR 2 -#define NS16550_FIFO 2 -#define NS16550_CFCR 3 -#define NS16550_MCR 4 -#define NS16550_LSR 5 -#define NS16550_MSR 6 -#define NS16550_SCR 7 - - -/* interrupt enable register */ -#define IER_ERXRDY 0x1 /* int on rx ready */ -#define IER_ETXRDY 0x2 /* int on tx ready */ -#define IER_ERLS 0x4 /* int on line status change */ -#define IER_EMSC 0x8 /* int on modem status change */ - -/* interrupt identification register */ -#define IIR_IMASK 0xf /* mask */ -#define IIR_RXTOUT 0xc /* receive timeout */ -#define IIR_RLS 0x6 /* receive line status */ -#define IIR_RXRDY 0x4 /* receive ready */ -#define IIR_TXRDY 0x2 /* transmit ready */ -#define IIR_NOPEND 0x1 /* nothing */ -#define IIR_MLSC 0x0 /* modem status */ -#define IIR_FIFO_MASK 0xc0 /* set if FIFOs are enabled */ - -/* fifo control register */ -#define FIFO_ENABLE 0x01 /* enable fifo */ -#define FIFO_RCV_RST 0x02 /* reset receive fifo */ -#define FIFO_XMT_RST 0x04 /* reset transmit fifo */ -#define FIFO_DMA_MODE 0x08 /* enable dma mode */ -#define FIFO_TRIGGER_1 0x00 /* trigger at 1 char */ -#define FIFO_TRIGGER_4 0x40 /* trigger at 4 chars */ -#define FIFO_TRIGGER_8 0x80 /* trigger at 8 chars */ -#define FIFO_TRIGGER_14 0xc0 /* trigger at 14 chars */ - -/* character format control register */ -#define CFCR_DLAB 0x80 /* divisor latch */ -#define CFCR_SBREAK 0x40 /* send break */ -#define CFCR_PZERO 0x30 /* zero parity */ -#define CFCR_PONE 0x20 /* one parity */ -#define CFCR_PEVEN 0x10 /* even parity */ -#define CFCR_PODD 0x00 /* odd parity */ -#define CFCR_PENAB 0x08 /* parity enable */ -#define CFCR_STOPB 0x04 /* 2 stop bits */ -#define CFCR_8BITS 0x03 /* 8 data bits */ -#define CFCR_7BITS 0x02 /* 7 data bits */ -#define CFCR_6BITS 0x01 /* 6 data bits */ -#define CFCR_5BITS 0x00 /* 5 data bits */ - -/* modem control register */ -#define MCR_LOOPBACK 0x10 /* loopback */ -#define MCR_IENABLE 0x08 /* output 2 = int enable */ -#define MCR_DRS 0x04 /* output 1 = xxx */ -#define MCR_RTS 0x02 /* enable RTS */ -#define MCR_DTR 0x01 /* enable DTR */ - -/* line status register */ -#define LSR_RCV_FIFO 0x80 /* error in receive fifo */ -#define LSR_TSRE 0x40 /* transmitter empty */ -#define LSR_TXRDY 0x20 /* transmitter ready */ -#define LSR_BI 0x10 /* break detected */ -#define LSR_FE 0x08 /* framing error */ -#define LSR_PE 0x04 /* parity error */ -#define LSR_OE 0x02 /* overrun error */ -#define LSR_RXRDY 0x01 /* receiver ready */ -#define LSR_RCV_MASK 0x1f - -/* modem status register */ -#define MSR_DCD 0x80 /* DCD active */ -#define MSR_RI 0x40 /* RI active */ -#define MSR_DSR 0x20 /* DSR active */ -#define MSR_CTS 0x10 /* CTS active */ -#define MSR_DDCD 0x08 /* DCD changed */ -#define MSR_TERI 0x04 /* RI changed */ -#define MSR_DDSR 0x02 /* DSR changed */ -#define MSR_DCTS 0x01 /* CTS changed */ diff --git a/resources/soc/simu/soft/func/include/asm/regdef.h b/resources/soc/simu/soft/func/include/asm/regdef.h deleted file mode 100644 index 570511e..0000000 --- a/resources/soc/simu/soft/func/include/asm/regdef.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Symbolic register names for 32 bit ABI - */ -#define zero $0 /* wired zero */ -#define AT $1 /* assembler temp - uppercase because of ".set at" */ -#define v0 $2 /* return value */ -#define v1 $3 -#define a0 $4 /* argument registers */ -#define a1 $5 -#define a2 $6 -#define a3 $7 -#define t0 $8 /* caller saved */ -#define t1 $9 -#define t2 $10 -#define t3 $11 -#define t4 $12 -#define t5 $13 -#define t6 $14 -#define t7 $15 -#define s0 $16 /* callee saved */ -#define s1 $17 -#define s2 $18 -#define s3 $19 -#define s4 $20 -#define s5 $21 -#define s6 $22 -#define s7 $23 -#define t8 $24 /* caller saved */ -#define t9 $25 -#define jp $25 /* PIC jump register */ -#define k0 $26 /* kernel scratch */ -#define k1 $27 -#define gp $28 /* global pointer */ -#define sp $29 /* stack pointer */ -#define fp $30 /* frame pointer */ -#define s8 $30 /* same like fp! */ -#define ra $31 /* return address */ - - diff --git a/resources/soc/simu/soft/func/include/battery.h b/resources/soc/simu/soft/func/include/battery.h deleted file mode 100644 index 4e54880..0000000 --- a/resources/soc/simu/soft/func/include/battery.h +++ /dev/null @@ -1,4 +0,0 @@ - -void ADC_Init(void); -void BatteryTest1(); -void BatteryTest2(); diff --git a/resources/soc/simu/soft/func/include/cmdline.h b/resources/soc/simu/soft/func/include/cmdline.h deleted file mode 100644 index b8bfb0f..0000000 --- a/resources/soc/simu/soft/func/include/cmdline.h +++ /dev/null @@ -1,9 +0,0 @@ - -int help(int argc, char argv[][30]); -int m4(int argc, char argv[][30]); -int m1(int argc, char argv[][30]); -int d4(int argc, char argv[][30]); -int d1(int argc, char argv[][30]); -unsigned int str2num(char str[30]); - -int cmdline(void); diff --git a/resources/soc/simu/soft/func/include/common.h b/resources/soc/simu/soft/func/include/common.h deleted file mode 100644 index cb305d7..0000000 --- a/resources/soc/simu/soft/func/include/common.h +++ /dev/null @@ -1,5 +0,0 @@ - -_fp32 bubble_sort(_fp32 *delta, _s32 len); -void UintToBcd(_u32 dat, _u8 *bcd_buf); -void BcdToUint(_u8 *bcd_buf, _u32 dat); -_s32 printf_float(_fp32 data); diff --git a/resources/soc/simu/soft/func/include/dg_rs232.h b/resources/soc/simu/soft/func/include/dg_rs232.h deleted file mode 100644 index 3794f9e..0000000 --- a/resources/soc/simu/soft/func/include/dg_rs232.h +++ /dev/null @@ -1 +0,0 @@ -int dg_ctrl(int argc, char argv[][30]); diff --git a/resources/soc/simu/soft/func/include/flash.h b/resources/soc/simu/soft/func/include/flash.h deleted file mode 100644 index 0b0efb5..0000000 --- a/resources/soc/simu/soft/func/include/flash.h +++ /dev/null @@ -1,6 +0,0 @@ -// CONFIDENTIAL - -int verif(int argc, char argv[][30]); -int set_pe_time_mode(int argc, char argv[][30]); -int flash_tk(int argc, char argv[][30]); -int flash_accg(int argc, char argv[][30]); diff --git a/resources/soc/simu/soft/func/include/frame.h b/resources/soc/simu/soft/func/include/frame.h deleted file mode 100644 index 022a4e4..0000000 --- a/resources/soc/simu/soft/func/include/frame.h +++ /dev/null @@ -1,43 +0,0 @@ - -#define ERROR 1 -#define DATA_LENGTH 100 - -extern _u32 RX_IndexW; -void IrSend(_u8 *str); -void uart_tx(); -void uart_rx(); -void Frame_exe(struct Date_Time *Date_and_Time, struct Data *Lcd_data); - -union uint_uchar{ - _u32 i_value; - _u8 c_value[4]; -}; - -/*-----------------Эֶ-----------------*/ -struct FrameFormat{ - _u8 HeadCode; - _u8 TypeCode; - _u8 Address[7]; - _u8 CtrlCode; - _u8 DataLen; - _u8 DI0,DI1,SER; - _u8 Data[DATA_LENGTH]; - _u8 CheckSum; - _u8 TailCode; -}; - -/****************д*****************/ -struct ModifyData{ - _u8 seg; //κ - _u32 flowpoint; //㣬ʹʱҪ10xxxxx.x - _u8 danwei; //λ - _u32 flowdata; //׼ݣʹʱҪ1000xxx.xxx - _u32 rcode; //ȵ - _u32 temp; //궨¶ֵ - _u32 rdata; //ȵֵʹʱҪ100xxxx.xx - _u32 tempmodify; //¶ϵʹʱҪ100000x.xxxxx -}; - - - - diff --git a/resources/soc/simu/soft/func/include/isp.h b/resources/soc/simu/soft/func/include/isp.h deleted file mode 100644 index 8d3d26a..0000000 --- a/resources/soc/simu/soft/func/include/isp.h +++ /dev/null @@ -1,10 +0,0 @@ -void tgt_putchar(_u8 chr); -_u8 tgt_getchar(); -_u8 tgt_testchar(); -_u32 now(); - -void Flash_Erase(_u32 addr); -_u32 Flash_Write(_u32 addr, _u32 *data, _u32 num); -void spiflash_erase(_u32 addr_start, _u32 addr_end); -void spiflash_write(_u32 addr_w, _u32 addr_r, _u32 length); - diff --git a/resources/soc/simu/soft/func/include/key.h b/resources/soc/simu/soft/func/include/key.h deleted file mode 100644 index 19a20bd..0000000 --- a/resources/soc/simu/soft/func/include/key.h +++ /dev/null @@ -1 +0,0 @@ -void Key(struct Data *Lcd_data); diff --git a/resources/soc/simu/soft/func/include/lcd.h b/resources/soc/simu/soft/func/include/lcd.h deleted file mode 100644 index 515b77a..0000000 --- a/resources/soc/simu/soft/func/include/lcd.h +++ /dev/null @@ -1,132 +0,0 @@ -/************************************************************************** -*************************************************************************** - Notice: Some variable of Lcd_data = real_value * LCD_MULTIPLE -*************************************************************************** -**************************************************************************/ -struct Data{ - _fp32 total_heat; //ۼ, plus LCD_MULTIPLE - _fp32 heat; //ȹ, plus LCD_MULTIPLE - _fp32 temp1; //ˮ¶, plus LCD_MULTIPLE - _fp32 temp2; //ˮ¶, plus LCD_MULTIPLE - _fp32 temp0; //², plus LCD_MULTIPLE - _fp32 total_flow; //ۼ, plus LCD_MULTIPLE - _fp32 flow; //˲ʱ, plus LCD_MULTIPLE - _u32 total_time; //ʱ - _u32 alarm_time; //ʱ - _u32 date; // - _u32 time; //ʱ - _u32 usercode; - _fp32 version; - _u32 history; - _u32 lcdmode; //A1_1; - _u32 auto_caculate; -}; -void LcdDisplay(struct Date_Time *Date_and_Time, struct Data *Lcd_data); - -//---------------A1˵------------- -#define A1 1 -#define A1_0 10 //ʾA1 - -#define A1_1 11 -#define A1_1_0 (0x08+0x04) //'ۻ ' -#define A1_1_1 (0x10+0x20) //'KW*h' - -#define A1_2 12 //һλС -#define A1_2_0 (0x10) //' ' -#define A1_2_1 (0x00) // - -#define A1_3 13 //'T T' һλС -#define A1_3_0 (0x20) //'T' -#define A1_3_1 (0x04) //'`C' - -#define A1_4 14 //λС -#define A1_4_0 (0x02) //'² ' -#define A1_4_1 (0x04) //'`C' - -#define A1_5 15 //λС -#define A1_5_0 (0x08+0x01) //'ۻ' -#define A1_5_1 (0x02) //'m3' - -#define A1_6 16 //λС -#define A1_6_0 (0x01) //'˲ʱ ' -#define A1_6_1 (0x02+0x01+0x80) //'m3/h' - -#define A1_7 17 -#define A1_7_0 (0x08+0x80) //'ۻʱ' -#define A1_7_1 (0x80) //'h' - -#define A1_8 18 -#define A1_8_0 (0x40) //'ʱ' -#define A1_8_1 (0x80) //'h' - -//--------------A2˵------------- -#define A2 2 -#define A2_0 20 //ʾA2 - -#define A2_1 21 // -#define A2_1_0 (0x80) //'ʱ' -#define A2_1_1 (0x00) - -#define A2_2 22 //ʱ -#define A2_2_0 (0x80) //'ʱ' -#define A2_2_1 (0x00) - -#define A2_3 23 //û -#define A2_3_0 (0x00) // -#define A2_3_1 (0x00) - -#define A2_4 24 //汾 -#define A2_4_0 (0x00) // -#define A2_4_1 (0x00) - -#define A2_5 25 //͵ѹ'P6' -#define A2_5_0 (0x00) // -#define A2_5_1 (0x00) - -#define A2_6 26 //ȫ - -//--------------A3˵-------------- -#define A3 3 -#define A3_0 30 //ʾA3 - -#define A3_1 31 // -#define A3_1_0 (0x80) //'ʱ' -#define A3_1_1 (0x00) - -#define A3_2 32 -#define A3_2_0 (0x08+0x01) //'ۻ' -#define A3_2_1 (0x02) //'m3' - -#define A3_3 33 -#define A3_3_0 (0x08+0x04) //'ۼ ' -#define A3_3_1 (0x10+0x20) //'KW*h' - -//--------------A4˵-------------- -#define A4 4 -#define A4_0 40 //ʾA4 - -#define A4_1 41 //λС -#define A4_1_0 (0x01) //'˲ʱ ' -#define A4_1_1 (0x02+0x01+0x80+0x08) //'m3/h'+'춨' - -#define A4_2 42 //λС -#define A4_2_0 (0x08+0x01) //'ۻ' -#define A4_2_1 (0x02+0x08) //'m3'+'춨' - -#define A4_3 43 -#define A4_3_0 (0x10) //' ' -#define A4_3_1 (0x00+0x08) // +'춨' - -#define A4_4 44 //λС -#define A4_4_0 (0x08+0x04) //'ۻ ' -#define A4_4_1 (0x10+0x20+0x08) //'KW*h'+'춨' - -#define A4_5 45 //'T T' λС -#define A4_5_0 (0x20) //'T' -#define A4_5_1 (0x04+0x08) //'`C'+'춨' - -#define A4_6 46 -#define A4_6_0 (0x02) //'² ' -#define A4_6_1 (0x04+0x08) //'`C'+'춨' - - diff --git a/resources/soc/simu/soft/func/include/ls1d.h b/resources/soc/simu/soft/func/include/ls1d.h deleted file mode 100644 index 33b317a..0000000 --- a/resources/soc/simu/soft/func/include/ls1d.h +++ /dev/null @@ -1,158 +0,0 @@ - -/********************************Variable Option**********************************************************************************************************************/ -typedef char _s8; -typedef unsigned char _u8; - -typedef short _s16; -typedef unsigned short _u16; - -typedef int _s32; -typedef unsigned int _u32; - -typedef float _fp32; - -/********************************LS1D Chip Option**********************************************************************************************************************/ -/********************************LS1D Address Space********************************/ -#define UNCACHED_MEMORY_ADDR 0xa0000000 -#define UNCACHED_TO_PHYS(x) ((x) & 0x1fffffff) -#define PHYS_TO_UNCACHED(x) ((x) | UNCACHED_MEMORY_ADDR) - -#define SRAM_BASEADDR PHYS_TO_UNCACHED(0x0) //sram -#define SPI_FLASH_BASEADDR PHYS_TO_UNCACHED(0x1e000000) //spi flash -#define FLASH_BASEADDR PHYS_TO_UNCACHED(0x1f000000) //spi/nand/lpc -#define BOOT_ADDR PHYS_TO_UNCACHED(0x1fc00000) //spi/flash -#define FLASH_REG_BASEADDR PHYS_TO_UNCACHED(0x1fe60000) //flash regs -#define SPI_REG_BASEADDR PHYS_TO_UNCACHED(0x1fe80000) //spi regs -#define UART0_BASEADDR PHYS_TO_UNCACHED(0x1fe40000) // LS 20130123 -#define UART1_BASEADDR PHYS_TO_UNCACHED(0x1fe88000) -#define I2C_BASEADDR PHYS_TO_UNCACHED(0x1fe90000) -#define REGS_BASEADDR PHYS_TO_UNCACHED(0x1fea0000) //Interrupt_Regs_Baseaddr - -#define PMU_BASEADDR PHYS_TO_UNCACHED(0x1feb0000) -#define SONAR_BASEADDR PHYS_TO_UNCACHED(0x1feb4000) -#define THSENS_BASEADDR PHYS_TO_UNCACHED(0x1feb8000) - -#define SLCD_REG_BASEADDR PHYS_TO_UNCACHED(0x1febc000) -#define ADC_BASEADDR PHYS_TO_UNCACHED(0x1fea8000) - -/********************************PMU REGS********************************/ -#define PMU_Timing *(volatile _u32 *)(PMU_BASEADDR) -#define PMU_Command *(volatile _u32 *)(PMU_BASEADDR+0x04) -#define PMU_Compare *(volatile _u32 *)(PMU_BASEADDR+0x08) - -#define PMU_ChipCtrl *(volatile _u32 *)(PMU_BASEADDR+0x0C) -#define PMU_GPIO_OE *(volatile _u32 *)(PMU_BASEADDR+0x10) -#define PMU_GPIO_O *(volatile _u32 *)(PMU_BASEADDR+0x14) -#define PMU_GPIO_I *(volatile _u32 *)(PMU_BASEADDR+0x18) - -#define PMU_Count *(volatile _u32 *)(PMU_BASEADDR+0x1c) - -#define PMU_UserDat0 *(volatile _u32 *)(PMU_BASEADDR+0x20) -#define PMU_UserDat1 *(volatile _u32 *)(PMU_BASEADDR+0x24) -#define PMU_UserDat2 *(volatile _u32 *)(PMU_BASEADDR+0x28) -#define PMU_UserDat3 *(volatile _u32 *)(PMU_BASEADDR+0x2c) -#define PMU_UserDat4 *(volatile _u32 *)(PMU_BASEADDR+0x30) - -#define PMU_AutoSave *(volatile _u32 *)(PMU_BASEADDR+0x34) -#define PMU_Exint *(volatile _u32 *)(PMU_BASEADDR+0x38) //external interrupt -#define PMU_CommandW *(volatile _u32 *)(PMU_BASEADDR+0x3c) - -/******************************SONAR REGS********************************/ -#define SONAR_PulseDef *(volatile _u32 *)(SONAR_BASEADDR) -#define SONAR_SonarCtrl0 *(volatile _u32 *)(SONAR_BASEADDR+0x04) -#define SONAR_SonarCtrl1 *(volatile _u32 *)(SONAR_BASEADDR+0x08) -#define SONAR_GateDef1 *(volatile _u32 *)(SONAR_BASEADDR+0x0C) -#define SONAR_GateDef2 *(volatile _u32 *)(SONAR_BASEADDR+0x10) -#define SONAR_GateDef3 *(volatile _u32 *)(SONAR_BASEADDR+0x14) -#define SONAR_WaveW_Cur *(volatile _u32 *)(SONAR_BASEADDR+0x18) -#define SONAR_WaveW_Last *(volatile _u32 *)(SONAR_BASEADDR+0x1C) -#define SONAR_ResPtr *(volatile _u32 *)(SONAR_BASEADDR+0x20) - -#define SONAR_Result *(volatile _u32 *)(SONAR_BASEADDR+0x40) -//Result[15:0] SONAR_BASEADDR + [0x40 ~ 0x7c] - -/*****************************THSENS REGS********************************/ -#define ThsensCtrl *(volatile _u32 *)(THSENS_BASEADDR) - - -/*******************************LCD REGS*********************************/ -#define LCD_FB_0 *(volatile _u32 *)(SLCD_REG_BASEADDR) -#define LCD_FB_1 *(volatile _u32 *)(SLCD_REG_BASEADDR+0x04) -#define LCD_FB_2 *(volatile _u32 *)(SLCD_REG_BASEADDR+0x08) -#define LCD_RefeshRate *(volatile _u32 *)(SLCD_REG_BASEADDR+0x0C) - -/***************************INTERRUPT REGS******************************/ -#define INT_EN *(volatile _u8 *)(REGS_BASEADDR) -#define INT_EGDE *(volatile _u8 *)(REGS_BASEADDR+0x01) -#define INT_POL *(volatile _u8 *)(REGS_BASEADDR+0x02) -#define INT_CLR *(volatile _u8 *)(REGS_BASEADDR+0x03) -#define INT_SET *(volatile _u8 *)(REGS_BASEADDR+0x04) -#define INT_OUT *(volatile _u8 *)(REGS_BASEADDR+0x05) - -/*******************************ADC REGS********************************/ - -#define ADC_CR *(volatile _u8 *)(ADC_BASEADDR) -#define ADC_D0 *(volatile _u8 *)(ADC_BASEADDR+0x1) -#define ADC_D1 *(volatile _u8 *)(ADC_BASEADDR+0x2) - -/*******************************I2C REGS********************************/ -#define IIC_PRER_L *(volatile _u8 *)(I2C_BASEADDR+0x00) -#define IIC_PRER_H *(volatile _u8 *)(I2C_BASEADDR+0x01) -#define IIC_CTR *(volatile _u8 *)(I2C_BASEADDR+0x02) -#define IIC_TXR *(volatile _u8 *)(I2C_BASEADDR+0x03) //w -#define IIC_RXR *(volatile _u8 *)(I2C_BASEADDR+0x03) //r -#define IIC_CR *(volatile _u8 *)(I2C_BASEADDR+0x04) //w -#define IIC_SR *(volatile _u8 *)(I2C_BASEADDR+0x04) //r -#define IIC_ADDR *(volatile _u8 *)(I2C_BASEADDR+0x07) // 7位地址 MSB 无效 - -/*****************************UART0 REGS********************************/ -//NS16550 -#define Uart0_RxData *(volatile _u8 *)(UART0_BASEADDR) -#define Uart0_TxData *(volatile _u8 *)(UART0_BASEADDR) -#define Uart0_IER *(volatile _u8 *)(UART0_BASEADDR+0x01) -#define Uart0_IIR *(volatile _u8 *)(UART0_BASEADDR+0x02) //read only -#define Uart0_FCR *(volatile _u8 *)(UART0_BASEADDR+0x02) //write only -#define Uart0_LCR *(volatile _u8 *)(UART0_BASEADDR+0x03) -#define Uart0_MCR *(volatile _u8 *)(UART0_BASEADDR+0x04) -#define Uart0_LSR *(volatile _u8 *)(UART0_BASEADDR+0x05) -#define Uart0_MSR *(volatile _u8 *)(UART0_BASEADDR+0x06) - -#define Uart0_BaudL *(volatile _u8 *)(UART0_BASEADDR) -#define Uart0_BaudH *(volatile _u8 *)(UART0_BASEADDR+0x01) - -/*****************************UART1 REGS********************************/ -//NS16550 -#define Uart1_RxData *(volatile _u8 *)(UART1_BASEADDR) -#define Uart1_TxData *(volatile _u8 *)(UART1_BASEADDR) -#define Uart1_IER *(volatile _u8 *)(UART1_BASEADDR+0x01) -#define Uart1_IIR *(volatile _u8 *)(UART1_BASEADDR+0x02) //read only -#define Uart1_FCR *(volatile _u8 *)(UART1_BASEADDR+0x02) //write only -#define Uart1_LCR *(volatile _u8 *)(UART1_BASEADDR+0x03) -#define Uart1_MCR *(volatile _u8 *)(UART1_BASEADDR+0x04) -#define Uart1_LSR *(volatile _u8 *)(UART1_BASEADDR+0x05) -#define Uart1_MSR *(volatile _u8 *)(UART1_BASEADDR+0x06) - -#define Uart1_BaudL *(volatile _u8 *)(UART1_BASEADDR) -#define Uart1_BaudH *(volatile _u8 *)(UART1_BASEADDR+0x01) - -/*******************************SPI REGS********************************/ -#define SPI_SPCR *(volatile _u8 *)(SPI_REG_BASEADDR) -#define SPI_SPSR *(volatile _u8 *)(SPI_REG_BASEADDR+0x01) -#define SPI_TxFIFO *(volatile _u8 *)(SPI_REG_BASEADDR+0x02) -#define SPI_RxFIFO *(volatile _u8 *)(SPI_REG_BASEADDR+0x02) -#define SPI_SPER *(volatile _u8 *)(SPI_REG_BASEADDR+0x03) -#define SPI_SFC_PARAM *(volatile _u8 *)(SPI_REG_BASEADDR+0x04) -#define SPI_SFC_SOFTCS *(volatile _u8 *)(SPI_REG_BASEADDR+0x05) -#define SPI_SFC_TIMING *(volatile _u8 *)(SPI_REG_BASEADDR+0x06) - -/*****************************FLASH REGS********************************/ -#define FLASH_CMD_REG *(volatile _u32 *)(FLASH_REG_BASEADDR) -#define FLASH_ERASE_ALL 0x80000000 -#define FLASH_ERASE_CMD 0xa0000000 -#define FLASH_WRITE_CMD 0xe0000000 -#define FLASH_PAGE_LATCH_CLEAR 0X40000000 -#define FLASH_ADDR_MASK 0x7ffff80 - -#define FLASH_PAGE_LATCH_BASEADDR 0xbfe68000 //128bytes - -/**********************************************************************************************************************************************************************/ diff --git a/resources/soc/simu/soft/func/include/temp_flow.h b/resources/soc/simu/soft/func/include/temp_flow.h deleted file mode 100644 index 1eba1a8..0000000 --- a/resources/soc/simu/soft/func/include/temp_flow.h +++ /dev/null @@ -1,11 +0,0 @@ - -void InitTdc(void); -//_fp32 Time_Caculate(_u32 *result, struct Data *Lcd_data, _u16 start, _u32 stop_num); -//void Flow_Caculate(_fp32 delta_time, _fp32 duration, struct Data *Lcd_data); -//void Temp_Caculate(_u32 *result, struct Data *Lcd_data, _u32 num); -//void Heat_Caculate(_fp32 duration, struct Data *Lcd_data); -_u32 res_ready(struct Data *Lcd_data); - - -extern _fp32 Last_total_flow; //ϴμʱۻ - diff --git a/resources/soc/simu/soft/func/include/xmodem.h b/resources/soc/simu/soft/func/include/xmodem.h deleted file mode 100644 index 83061fa..0000000 --- a/resources/soc/simu/soft/func/include/xmodem.h +++ /dev/null @@ -1,16 +0,0 @@ -_u32 xmodem(void); - -//³£Êý¶¨Òå -#define BLOCKSIZE 128 //M16µÄÒ»¸öFlashҳΪ128×Ö½Ú(64×Ö) - - -//¶¨ÒåÈ«¾Ö±äÁ¿ -struct str_XMODEM -{ - unsigned char SOH; //Æðʼ×Ö½Ú - unsigned char BlockNo; //Êý¾Ý¿é±àºÅ - unsigned char nBlockNo; //Êý¾Ý¿é±àºÅ·´Âë - unsigned char Xdata[BLOCKSIZE]; //Êý¾Ý128×Ö½Ú - unsigned char CRC16hi; //CRC16УÑéÊý¾Ý¸ßλ - unsigned char CRC16lo; //CRC16УÑéÊý¾ÝµÍλ -}; diff --git a/resources/soc/simu/soft/func/lib/Makefile b/resources/soc/simu/soft/func/lib/Makefile deleted file mode 100644 index 9b741e6..0000000 --- a/resources/soc/simu/soft/func/lib/Makefile +++ /dev/null @@ -1,12 +0,0 @@ - -%.o:%.c - $(CC) $(DEBUG) $(FLAGS) -EL -c -o $@ $< - -objs= memset.o memcpy.o printf.o udelay.o putchar.o puts.o printhex.o printbase.o memcmp.o strcat.o strchr.o strcmp.o strtok.o strspn.o strcspn.o - -$(TOPDIR)/libtinyc.a: $(objs) - $(AR) -cr $@ $? - -clean: - rm -f *.o *.a *.s - diff --git a/resources/soc/simu/soft/func/lib/memcmp.c b/resources/soc/simu/soft/func/lib/memcmp.c deleted file mode 100644 index 5f3cbdd..0000000 --- a/resources/soc/simu/soft/func/lib/memcmp.c +++ /dev/null @@ -1,16 +0,0 @@ -/** - * memcmp - Compare two areas of memory - * @cs: One area of memory - * @ct: Another area of memory - * @count: The size of the area. - */ -int memcmp(const void * cs,const void * ct,int count) -{ - const unsigned char *su1, *su2; - signed char res = 0; - - for( su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--) - if ((res = *su1 - *su2) != 0) - break; - return res; -} diff --git a/resources/soc/simu/soft/func/lib/memcpy.c b/resources/soc/simu/soft/func/lib/memcpy.c deleted file mode 100644 index e4a56c2..0000000 --- a/resources/soc/simu/soft/func/lib/memcpy.c +++ /dev/null @@ -1,16 +0,0 @@ -typedef int size_t; -void *memcpy(void *s1, const void *s2, size_t n) -{ - const char *f = s2; - char *t = s1; - - if (f < t) { - f += n; - t += n; - while (n-- > 0) - *--t = *--f; - } else - while (n-- > 0) - *t++ = *f++; - return s1; -} diff --git a/resources/soc/simu/soft/func/lib/memset.c b/resources/soc/simu/soft/func/lib/memset.c deleted file mode 100644 index 5d4bae4..0000000 --- a/resources/soc/simu/soft/func/lib/memset.c +++ /dev/null @@ -1,10 +0,0 @@ -typedef int size_t; -void * memset(void * s,int c, size_t count) -{ - char *xs = (char *) s; - - while (count--) - *xs++ = c; - - return s; -} diff --git a/resources/soc/simu/soft/func/lib/printbase.c b/resources/soc/simu/soft/func/lib/printbase.c deleted file mode 100644 index 2d39a72..0000000 --- a/resources/soc/simu/soft/func/lib/printbase.c +++ /dev/null @@ -1,28 +0,0 @@ -int printbase(long v,int w,int base,int sign) -{ - int i,j; - int c; - char buf[64]; - unsigned long value; - if(sign && v<0) - { - value = -v; - putchar('-'); - } - else value=v; - - for(i=0;value;i++) - { - buf[i]=value%base; - value=value/base; - } - -#define max(a,b) (((a)>(b))?(a):(b)) - - for(j=max(w,i);j>0;j--) - { - c=j>i?0:buf[j-1]; - putchar((c<=9)?c+'0':c-0xa+'a'); - } - return 0; -} diff --git a/resources/soc/simu/soft/func/lib/printf.c b/resources/soc/simu/soft/func/lib/printf.c deleted file mode 100644 index c49827e..0000000 --- a/resources/soc/simu/soft/func/lib/printf.c +++ /dev/null @@ -1,79 +0,0 @@ -int printf(char *fmt,...) -{ -int i; -char c; -void **arg; -void *ap; -int w; -__builtin_va_start(ap,fmt); -arg=ap; -for(i=0;fmt[i];i++) -{ - c=fmt[i]; - if(c=='%') - { - w=1; -again: - switch(fmt[i+1]) - { - case 's': - puts(*arg); - arg++; - i++; - break; - case 'c': - putchar((long)*arg); - arg++; - i++; - break; - case 'u': - printbase((long)*arg,w,10,0); - arg++; - i++; - break; - case 'd': - printbase((long)*arg,w,10,0); - arg++; - i++; - break; - case 'o': - printbase((long)*arg,w,8,0); - arg++; - i++; - break; - case 'b': - printbase((long)*arg,w,2,0); - arg++; - i++; - break; - case 'p': - case 'x': - printbase((long)*arg,w,16,0); - arg++; - i++; - break; - case '%': - putchar('%'); - i++; - break; - case '0': - i++; - case '1' ... '9': - for(w=0;fmt[i+1]>'0' && fmt[i+1]<='9';i++) - w=w*10+(fmt[i+1]-'0'); - goto again; - break; - - default: - putchar('%'); - break; - } - - } - else{ - if(c=='\n') putchar('\r'); - putchar(c); - } -} - return 0; -} diff --git a/resources/soc/simu/soft/func/lib/printhex.c b/resources/soc/simu/soft/func/lib/printhex.c deleted file mode 100644 index 1cb12bb..0000000 --- a/resources/soc/simu/soft/func/lib/printhex.c +++ /dev/null @@ -1,11 +0,0 @@ -int printhex(long v,int w) -{ - int i; - int c; - for(i=4*(w-1);i>=0;i-=4) - { - c=(v>>i)&0xf; - putchar((c<=9)?c+'0':c-0xa+'a'); - } - return 0; -} diff --git a/resources/soc/simu/soft/func/lib/putchar.c b/resources/soc/simu/soft/func/lib/putchar.c deleted file mode 100644 index dc435d4..0000000 --- a/resources/soc/simu/soft/func/lib/putchar.c +++ /dev/null @@ -1,5 +0,0 @@ -int putchar(unsigned char c) -{ -tgt_putchar(c); -return 0; -} diff --git a/resources/soc/simu/soft/func/lib/puts.c b/resources/soc/simu/soft/func/lib/puts.c deleted file mode 100644 index e7d19dd..0000000 --- a/resources/soc/simu/soft/func/lib/puts.c +++ /dev/null @@ -1,13 +0,0 @@ -int puts(char *s) -{ -char c; -while((c=*s)) -{ - if(c == '\n') putchar('\r'); - putchar(c); - s++; -} -putchar('\r'); -putchar('\n'); -return 0; -} diff --git a/resources/soc/simu/soft/func/lib/strcat.c b/resources/soc/simu/soft/func/lib/strcat.c deleted file mode 100644 index 5825675..0000000 --- a/resources/soc/simu/soft/func/lib/strcat.c +++ /dev/null @@ -1,48 +0,0 @@ -/* $Id: strcat.c,v 1.1.1.1 2006/09/14 01:59:06 root Exp $ */ - -/* - * Copyright (c) 2000-2002 Opsycon AB (www.opsycon.se) - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Opsycon AB. - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -char * -strcat(char *dst, const char *src) -{ - char *d; - - if (!dst || !src) - return (dst); - - d = dst; - for (; *d; d++); - for (; *src; src++) - *d++ = *src; - *d = 0; - return (dst); -} diff --git a/resources/soc/simu/soft/func/lib/strchr.c b/resources/soc/simu/soft/func/lib/strchr.c deleted file mode 100644 index 30c86b8..0000000 --- a/resources/soc/simu/soft/func/lib/strchr.c +++ /dev/null @@ -1,44 +0,0 @@ -/* $Id: strchr.c,v 1.1.1.1 2006/09/14 01:59:06 root Exp $ */ - -/* - * Copyright (c) 2000-2002 Opsycon AB (www.opsycon.se) - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Opsycon AB. - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -char * -strchr(const char *p, int c) -{ - if (!p) - return (0); - - for (; *p; p++) - if (*p == c) - return ((char *)p); - return (0); -} diff --git a/resources/soc/simu/soft/func/lib/strcmp.c b/resources/soc/simu/soft/func/lib/strcmp.c deleted file mode 100644 index 406b0d0..0000000 --- a/resources/soc/simu/soft/func/lib/strcmp.c +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Compare strings. - */ -int -strcmp(const char *s1, const char *s2) -{ - while (*s1 == *s2++) - if (*s1++ == 0) - return (0); - return (*(const unsigned char *)s1 - *(const unsigned char *)--s2); -} diff --git a/resources/soc/simu/soft/func/lib/strcspn.c b/resources/soc/simu/soft/func/lib/strcspn.c deleted file mode 100644 index f9f8a69..0000000 --- a/resources/soc/simu/soft/func/lib/strcspn.c +++ /dev/null @@ -1,48 +0,0 @@ -/* $Id: strcspn.c,v 1.1.1.1 2006/09/14 01:59:06 root Exp $ */ - -/* - * Copyright (c) 2000-2002 Opsycon AB (www.opsycon.se) - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Opsycon AB. - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -int -strcspn (const char *p, const char *s) -{ - int i, j; - - for (i = 0; p[i]; i++) { - for (j = 0; s[j]; j++) { - if (s[j] == p[i]) - break; - } - if (s[j]) - break; - } - return (i); -} diff --git a/resources/soc/simu/soft/func/lib/strspn.c b/resources/soc/simu/soft/func/lib/strspn.c deleted file mode 100644 index 240b1ed..0000000 --- a/resources/soc/simu/soft/func/lib/strspn.c +++ /dev/null @@ -1,51 +0,0 @@ -/* $Id: strspn.c,v 1.1.1.1 2006/09/14 01:59:06 root Exp $ */ - -/* - * Copyright (c) 2000-2002 Opsycon AB (www.opsycon.se) - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Opsycon AB. - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -/* return length of initial segment of p that consists entirely of - * characters from s */ - -int -strspn(const char *p, const char *s) -{ - int i, j; - - for (i = 0; p[i]; i++) { - for (j = 0; s[j]; j++) { - if (s[j] == p[i]) - break; - } - if (!s[j]) - break; - } - return (i); -} diff --git a/resources/soc/simu/soft/func/lib/strtok.c b/resources/soc/simu/soft/func/lib/strtok.c deleted file mode 100644 index a8ca3b5..0000000 --- a/resources/soc/simu/soft/func/lib/strtok.c +++ /dev/null @@ -1,51 +0,0 @@ -/* $Id: strtok.c,v 1.1.1.1 2006/09/14 01:59:06 root Exp $ */ - -/* - * Copyright (c) 2000-2002 Opsycon AB (www.opsycon.se) - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Opsycon AB. - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -char * -strtok(char *p, const char *tok) -{ -static char *t; /* XXX */ - char *r; - int n; - - if (p) - t = p; - - r = t + strspn (t, tok); - if (!(n = strcspn (r, tok))) - return (0); - t = r + n; - if (*t) - *t++ = 0; - return (r); -} diff --git a/resources/soc/simu/soft/func/lib/udelay.c b/resources/soc/simu/soft/func/lib/udelay.c deleted file mode 100644 index 243f40a..0000000 --- a/resources/soc/simu/soft/func/lib/udelay.c +++ /dev/null @@ -1,13 +0,0 @@ -void udelay(int us) -{ -#if 0 -int count0,count1; -int debug=0; -us *=CPU_COUNT_PER_US; -asm volatile("mfc0 %0,$9":"=r"(count0)); -do{ -asm volatile("mfc0 %0,$9":"=r"(count1)); -}while(count1 -count0Day){ - case 7: - case 14: - case 21: - case 28: - if(Date_and_Time->Hour == 3) - { - main_flag |= test_bit; - main_flag |= lowV2_bit; - } - break; - default: - break; - } -} - -static void AddDay(struct Date_Time *Date_and_Time) -{ - Date_and_Time->Day +=1; - Date_and_Time->Hour =0; -} - -static void AddMonth(struct Date_Time *Date_and_Time) -{ - Date_and_Time->Month +=1; - Date_and_Time->Day =1; //ע,ÿµһ'1''0' - Date_and_Time->Hour =0; - if(main_flag & month_flag) main_flag |= month_bit; //Ĭ½ʱΪÿµ -} - -static void AddYear(struct Date_Time *Date_and_Time) -{ - Date_and_Time->Year +=1; - Date_and_Time->Month =1; //ע - Date_and_Time->Day =1; //ע - Date_and_Time->Hour =0; - if(main_flag & month_flag) main_flag |= month_bit; //Ĭ½ʱΪÿµ -} - -//void calendar(struct Date_Time *Date_and_Time, unsigned short lcdmode) -void calendar(struct Date_Time *Date_and_Time) -{ -#if CALENDAR_TEST - printf("calendar()...\n"); -#endif - //if(lcdmode == A2_1 || lcdmode == A2_2) //once per second - if(1) - { - Date_and_Time->Second +=1; - if(Date_and_Time->Second == 60){ - Date_and_Time->Minute += 1; - Date_and_Time->Second = 0; - } - if(Date_and_Time->Minute == 60){ - Date_and_Time->Hour += 1; - Date_and_Time->Minute =0; - } - } - else //cpu will sleep less than a day in most. - { - static _u32 last_count; - _u32 count, sleep_time; - count = *(volatile _u32 *)0xbfeb001c; - count &= COUNT_MASK; - sleep_time = (count - last_count)%COUNT_COMPARE; - _u32 i; - for(i=0;i<(sleep_time/57600);i++) //57600=3600*16, one hour - Date_and_Time->Hour += 1; - for(i=0;i<((sleep_time%57600)/960);i++) //960=60*16, one minute - Date_and_Time->Minute += 1; - for(i=0;i<((sleep_time%960)/16);i++) - Date_and_Time->Second += 1; - last_count = count - (count%16); //This is a good write! Read the last 6 lines to understand it. - if(Date_and_Time->Second >= 60) - { - Date_and_Time->Minute += 1; - Date_and_Time->Second %= 60; - } - if(Date_and_Time->Minute >= 60) - { - Date_and_Time->Hour += 1; - Date_and_Time->Minute %= 60; - } - } - - if(Date_and_Time->Hour >= 24) - { - /**/ - if((Date_and_Time->Year%400==0)||((Date_and_Time->Year%4 ==0)&&(Date_and_Time->Year%100 !=0))){ - switch(Date_and_Time->Day){ - case 29: - if(Date_and_Time->Month == 2) AddMonth(Date_and_Time); - else AddDay(Date_and_Time); - break; - case 30: - if((Date_and_Time->Month ==4)||(Date_and_Time->Month ==6)||(Date_and_Time->Month ==9)||(Date_and_Time->Month ==11)) - AddMonth(Date_and_Time); - else AddDay(Date_and_Time); - break; - case 31: - if(Date_and_Time->Month == 12) AddYear(Date_and_Time); - else AddMonth(Date_and_Time); - break; - default: - AddDay(Date_and_Time); - break; - } - } - else{ - switch(Date_and_Time->Day){ - case 28: - if(Date_and_Time->Month == 2) AddMonth(Date_and_Time); - else AddDay(Date_and_Time); - break; - case 30: - if((Date_and_Time->Month ==4)||(Date_and_Time->Month ==6)||(Date_and_Time->Month ==9)||(Date_and_Time->Month ==11)) - AddMonth(Date_and_Time); - else AddDay(Date_and_Time); - break; - case 31: - if(Date_and_Time->Month == 12) AddYear(Date_and_Time); - else AddMonth(Date_and_Time); - break; - default: - AddDay(Date_and_Time); - break; - } - } - Date_and_Time->Hour %= 24; - } - - DateLowV(Date_and_Time); -} - -void DateInit(struct Date_Time *Date_and_Time) -{ - Date_and_Time->Year = 2012; - Date_and_Time->Month = 1; - Date_and_Time->Day = 31; - Date_and_Time->Hour = 23; - Date_and_Time->Minute = 40; //59; - Date_and_Time->Second = 15; //45; - main_flag |= month_flag; -} -#endif diff --git a/resources/soc/simu/soft/func/source/Infrare.c b/resources/soc/simu/soft/func/source/Infrare.c deleted file mode 100644 index 45a80f8..0000000 --- a/resources/soc/simu/soft/func/source/Infrare.c +++ /dev/null @@ -1,33 +0,0 @@ -/********************************************************************************************************************************************************************** - This file enables the Infrare receiver to receive signals. -**********************************************************************************************************************************************************************/ - -#include "../config.h" - -#if INFRARE_MODULE -void Infrare() -{ - if((main_flag & wait_8sec)==0){ - if(main_flag & infrare_flag) //⴦ڴ״̬ - { - PMU_GPIO_O &= 0xfffffff7; //IR_PWR OFF - //rUart1_MCR &= ~0xa0; //MCR bit7: ; bit6:Rx bit5:Tx - main_flag &= ~infrare_flag; - } - else //⴦ڹر״̬ - { - main_flag |= infrare_flag; - PMU_GPIO_OE |= 1 << 3; //IO - PMU_GPIO_O |= 1 << 3; //IR - RX_IndexW = 0; -#if UART1_INT - Uart1_IER |= 0x1; //enable uart1 rx int -#endif - - wait[1] = 0; - main_flag |= wait_8sec; - } - } -} - -#endif diff --git a/resources/soc/simu/soft/func/source/Interrupt.c b/resources/soc/simu/soft/func/source/Interrupt.c deleted file mode 100644 index 9d49a58..0000000 --- a/resources/soc/simu/soft/func/source/Interrupt.c +++ /dev/null @@ -1,6 +0,0 @@ -/********************************************************************************************************************************************************************** - This file processes all kinds of interrupt, some parts are placed in start.S. -**********************************************************************************************************************************************************************/ - -#include "../config.h" - diff --git a/resources/soc/simu/soft/func/source/MonthData.c b/resources/soc/simu/soft/func/source/MonthData.c deleted file mode 100644 index 49bf59e..0000000 --- a/resources/soc/simu/soft/func/source/MonthData.c +++ /dev/null @@ -1,62 +0,0 @@ -/********************************************************************************************************************************************************************** - This file writes the info flash when MonthDate comes. - It should need four step to write flash: - 1) clear page_latch - 2) write data into page_latch - 3) clear the flash page - 4) write the flash page - *page_latch just like a buffer. -**********************************************************************************************************************************************************************/ - -#include "../config.h" - -_u32 Last_month_num; //0~17 -#if MONTHDATA_MODULE -struct Record_1 Latest_Record; - -void Flash_Read_Info() -{ - -} - -void MonthData(struct Date_Time *Date_and_Time, struct Data *Lcd_data) //flashݱʽΪBCD -{ -#if MONTHDATA_TEST - printf("%s()...\n", __FUNCTION__); -#endif - struct Record_0 Month_Record; - if(Date_and_Time->Month == 1) - { - Month_Record.Date = (Date_and_Time->Year-1)*1000 + 12*10; //store in _u32 format - } - else - { - Month_Record.Date = Date_and_Time->Year*1000 + (Date_and_Time->Month-1)*10; //store in _u32 format - } //eg: 20110120 - - Month_Record.TotalHeat = (_u32)(Lcd_data->total_heat)*100/LCD_MULTIPLE; - Month_Record.TotalFlow = (_u32)(Lcd_data->total_flow)*100/LCD_MULTIPLE; - - //write flash - Last_month_num++; - Last_month_num %= 18; - - _u32 addr, err=1; - addr = INFO_FLASH_START + Last_month_num*12 ; - err = Flash_Write( addr, &Month_Record, 3) ; - - BUG_ON(err) - -} - -void Flash_Write_Test() -{ - _u32 data[4]; - _u32 i,addr; - for(i=0;i<4;i++) - data[i] = i; - addr = 0xbfc0f004; - Flash_Write(addr, data, 4) ; - -} -#endif diff --git a/resources/soc/simu/soft/func/source/SystemInit.c b/resources/soc/simu/soft/func/source/SystemInit.c deleted file mode 100644 index c7e5c22..0000000 --- a/resources/soc/simu/soft/func/source/SystemInit.c +++ /dev/null @@ -1,118 +0,0 @@ -/********************************************************************************************************************************************************************** - This file inits some module in LS1D chip. -**********************************************************************************************************************************************************************/ - -#include "../config.h" -#include "../include/asm/ns16550.h" - -void Uart0_Init() -{ - /* - 8bit 1stop 38400Baut - */ -#if 1 - Uart0_FCR = FIFO_ENABLE|FIFO_RCV_RST|FIFO_XMT_RST|FIFO_TRIGGER_4; - Uart0_LCR = CFCR_DLAB; - Uart0_FCR = 0xCF; - Uart0_BaudL = 0x23; //set 57600Baut - Uart0_LCR = CFCR_8BITS; //8bit, 1stop - Uart0_MCR = MCR_DTR|MCR_RTS; - Uart0_IER = 0; -#endif - /*the uart0 rx default state is high, it can work when egde_low or no_egde_low.*/ -#if 0 - INT_EGDE |= 0x08; //egde change available - INT_POL |= 0x08; //low available - //INT_POL &= ~0x08; //high available - Uart0_IER |= 0x01; //enable uart0 rx int - INT_EN |= 0x08; //enable uart0 int -#endif - -#if PRINT - printf("Uart0 init...\n"); -#endif -} - -static void Uart1_Init(void) -{ - /* - 8bit 1stop 2400Baut odd parity - */ -#if 0 - __asm__ volatile( - "lui $2,0xbfe8;\n" \ - "ori $2,$2,0x8000;\n" \ - "li $3,7;\n" \ - "sb $3,2($2);\n" \ - "li $3,-128;\n" \ - "sb $3,3($2);\n" \ - "li $3,-48;\n" \ - "sb $3,0($2);\n" \ - "li $3,11;\n" \ - "sb $3,3($2);\n" \ - "li $3,3;\n" \ - "sb $3,4($2);\n" \ - "li $3,0;\n" \ - "sb $3,1($2);\n" \ - :::"$2","$3" - ); -#else - Uart1_FCR = FIFO_ENABLE|FIFO_RCV_RST|FIFO_XMT_RST|FIFO_TRIGGER_1; - Uart1_LCR = CFCR_DLAB; - Uart1_BaudL = 208; //set 2400Baut - Uart1_LCR = CFCR_8BITS|CFCR_PENAB|CFCR_PODD; //8bit, 1stop, odd parity - Uart1_MCR = MCR_DTR|MCR_RTS; - Uart1_IER = 0; -#endif - - /*the uart1 rx default state is low, when IR_PWR is off; only can it work when no_egde_low.*/ - //INT_EGDE |= 0x04; //egde change available - //INT_CLR = 0x3f; //clear all int bit - //INT_POL &= ~0x04; //high available - INT_POL |= 0x04; //low available - INT_EN |= 0x04; //enable uart1 int - -#if PRINT - printf("Uart1 init...\n"); -#endif - -#if !(UART1_INT) - _u8 data; - data = Uart1_RxData; //clear the receive fifo - Uart1_IER |= 0x01; //enable uart1 rx int -#endif -} - -static void ReLoad() //ϵָӵ籣λöȡݣ¸ֵ -{ -#if 0 - DateInit(); -#endif - - //Monthdata.h - //temp_flow.h - //Last_total_flow = -} - -void SystemInit() -{ - //DisableWatchDog(); - /* - enable BT\UART\KEY\BAT_FAIL Interrupt - */ -// Interrupt_Init(); - - //Uart0_Init(); -#if (INFRARE_MODULE|FRAME_MODULE) - Uart1_Init(); -#endif - ReLoad(); -#if (TDC_TEMP_MODULE|TDC_FLOW_MODULE) - InitTdc(); -#endif -#if AD_MODULE - ADC_Init(); -#endif - -} - diff --git a/resources/soc/simu/soft/func/source/adc.c b/resources/soc/simu/soft/func/source/adc.c deleted file mode 100644 index 7e77c0d..0000000 --- a/resources/soc/simu/soft/func/source/adc.c +++ /dev/null @@ -1,49 +0,0 @@ -#include "../config.h" - -/**************************** -*ADC* base addr : 0xbfea8000 - cr offset : 0x0 - datalow offset : 0x1 (result[3:0] in D0[7:4]) - datahigh offset : 0x2 (result[11:4] in D1[7:0]) -*cr* [8] : start - [7] : standby (RO) - [2:0] : select - select=0: adci_a (battery voltage 3~3.7V ) - select=1: ldo output (core voltage 1.8V ) - -Liu Su -liusu-cpu@ict.ac.cn -****************************/ - -#if ADC_MODULE - -#define adc_start 0x80 -#define adc_standby 0x40 - -static _u32 ADC_measure(_u8 adc_sel) -{ - ADC_CR = adc_start | adc_sel; - while (ADC_CR & adc_standby != adc_standby) {} - return (ADC_D1 << 8 + ADC_D0) >> 4; -} - -float BatteryMeasure(void) -{ - float BatteryVoltage; - _u32 result_battery, result_core; - - result_core = ADC_measure(0); - result_battery = ADC_measure(1); - - BatteryVoltage = 1.8 * result_battery / result_core; - //printf("Battery Voltage : %f V\n", BatteryVoltage); - return BatteryVoltage; -} - -#endif // ADC_MODULE -int ADC_test(int argc, char argv[][30]) -{ - printf("\nin ADC_test"); - return 0; -} - diff --git a/resources/soc/simu/soft/func/source/battery.c b/resources/soc/simu/soft/func/source/battery.c deleted file mode 100644 index e85eb6f..0000000 --- a/resources/soc/simu/soft/func/source/battery.c +++ /dev/null @@ -1,148 +0,0 @@ -/********************************************************************************************************************************************************************** - This file uses ADC module to detect and measure the voltage of battery. -**********************************************************************************************************************************************************************/ - -#include "../config.h" - -#if AD_MODULE -void ADC_Init(void) -{ - IIC_PRER_L = 0x64; //Baud rate= 8M/4/PRER - IIC_PRER_H = 0x0; - IIC_CTR = 0xa0; //CTR[7]:core_en [6]:int_en [5]:master:1 slave:0 [4]:txr_ok [3]:rxr_ok bit[4,3] use in slave mode - - IIC_TXR = 0x6c; //slave addr + w - IIC_CR = 0x90; //start and write - while( (IIC_SR & 0x83) != 0x01 ); - IIC_CR = 0x01; - - IIC_TXR = 0x63; // max11645 config byte converte channel AN1 ,single ended - IIC_CR = 0x50; //send congig byte and stop - while( (IIC_SR & 0x83) != 0x01 ); - IIC_CR = 0x01; - -#if AD_TEST - printf("AD module initted...\n"); -#endif -} - - -static _u32 ADC() //power_detect -{ - _u32 sum = 0; - _u32 tmp = 0; - _u32 i; - for( i = 0; i < 8; i++) - { - IIC_TXR = 0x6c; //slave addr + w - IIC_CR = 0x90; //start and write - while( (IIC_SR & 0x83) != 0x01 ); - IIC_CR = 0x01; - - //IIC_TXR = 0xd2; //max11645 setup byte Vref = 2.048 (internal Vref), if use external Vref :a2 - IIC_TXR = 0xa2; //max11645 setup byte Vref = 2.048 (internal Vref), if use external Vref :a2 - IIC_CR = 0x50; //tx and stop - while( (IIC_SR & 0x83) != 0x01 ); - IIC_CR = 0x01; - - /************ read *********************/ - IIC_TXR = 0x6d; //slave addr + r - IIC_CR = 0x90; - while( (IIC_SR & 0x83) != 0x01 ); - IIC_CR = 0x01; - - IIC_CR = 0x20; //read - while( (IIC_SR & 0x83) != 0x01 ); - IIC_CR = 0x01; - tmp = IIC_RXR & 0x0f; - - IIC_CR = 0x60; //read & stop - while( (IIC_SR & 0x83) != 0x01 ); - IIC_CR = 0x01; - - tmp = tmp << 8; - tmp |= IIC_RXR & 0xff; - sum += tmp; - } - return (sum >> 3); -} - -void BatteryTest1() -{ - _u32 i; - _fp32 V_BAT; - - i = ADC(); - V_BAT = 4096*1.8f/i ; -#if AD_TEST - printf("---------------------------------------------------Battery: 0x%x------------", i); - printf_float(V_BAT); -#endif - -#if 0 - if(main_flag & wait_10sec){ //ŵѹ - if((main_flag & lowV_flag) == 0) //ǰΪ״̬ - { - if(i<0x0900) //Ϊ͵ѹ - { - if(main_flag & wait_oneday) //ڶηŵ - { - main_flag |= lowV_flag; - main_flag |= lcd_bit; - } - else //һηŵ - { - wait[6] = 0; - main_flag |= wait_oneday; - } - } - else //Ϊ - { - } - } - else //ǰѾΪ͵ѹ״̬ //ӳһ ڶηŵ - { - if(i>0x0b00){ - main_flag &= ~lowV_flag; - main_flag |= lcd_bit; - } - } - } - else //ŵѹ - { - static unsigned short m; - if((main_flag & lowV_flag) == 0) //ǰΪ״̬ - { - if(i<0x0aaa){ - main_flag |= lowV_flag; - main_flag |= lcd_bit; - } - } - else //ǰѾΪ͵ѹ״̬ - { - if(i>0x0b00){ - if(m==0) - { - wait[4] = 0; - main_flag |= wait_16min; - } - m = 1; - } - else m = 0; - } - } -#endif - //P3DIR &= ~0x10; -} - -void BatteryTest2() //ŵ -{ - //طŵ -#if 0 - P3DIR |=0x20; - P3OUT |=0x20; -#endif - wait[5] = 0; - main_flag |= wait_10sec; -} -#endif diff --git a/resources/soc/simu/soft/func/source/cmdline.c b/resources/soc/simu/soft/func/source/cmdline.c deleted file mode 100644 index 4978482..0000000 --- a/resources/soc/simu/soft/func/source/cmdline.c +++ /dev/null @@ -1,326 +0,0 @@ -#include "../config.h" -#include -#include -#include -#include -#define write_u32(addr,value) (*(volatile _u32*)(addr) = (value)) -#define read_u32(addr) (*(volatile _u32*)(addr)) - -#define LS1D -int help(int argc, char argv[][30]); -int m4(int argc, char argv[][30]); -int m1(int argc, char argv[][30]); -int d4(int argc, char argv[][30]); -int d1(int argc, char argv[][30]); -int float_test(int argc, char argv[][30]); - - -unsigned int str2num(char str[30]); - char cmdpara[10][30]; - char **pp; -static _u8 mygetchar(); -static void myputchar(_u8 chr); -struct cmd_struc { - const char *cmdname; - int (*func) __P((int, char *[])); -} cmd[] = {{"exit", NULL}, - {"help", help}, - {"m4", m4}, - {"m1", m1}, - {"d4", d4}, - {"d1", d1}, - {"", NULL} -}; - -int float_test(int argc, char argv[][30]) -{ - unsigned int a,b; - float i,j,k,l,m; - a = 3000; - b = 4096; - k = (float)a/(float)b; - i = 2.0; - j = 3.3; - l = 0.99; - m = 1.01; - i = i/j; - l = l/m; - k = i/l; - if(k>0.99 && k<1.01) a++; - else a--; - return 0; -} - - -static void myputchar(_u8 chr) -{ - while(!(Uart0_LSR & 0x20)) ; - Uart0_TxData = chr; -} - -static _u8 mygetchar() -{ - _u8 chr; -// int i=0,j; -// while(1) {if(Uart0_LSR & 0x1) break;else -// for(i=0;i<100;i++) {j=*(volatile _u32*)(0xbe000000);}} - while(!(Uart0_LSR & 0x1)) ; - chr = Uart0_RxData ; -// printf("f"); -// printf("%d",chr); - return chr; -} - -int help(int argc, char argv[][30]) -{ - int i; - printf("\ncommands:\n"); - for(i=1;i<100;i++) - { - if(strcmp(cmd[i].cmdname,"")==0) break; - else printf(" %s",cmd[i].cmdname); - } -// printf("\n"); - - return 0; -} - -unsigned int str2num(char str[30]) -{ - int value = 0; - int sign = 1; - int radix; - - if(*str == '-') - { - sign = -1; - str++; - } - if(*str == '0' && (*(str+1) == 'x' || *(str+1) == 'X')) - { - radix = 16; - str += 2; - } - else if(*str == '0') // 八进制首字符为0 - { - radix = 8; - str++; - } - else - radix = 10; - while(*str) - { - if(radix == 16) - { - if(*str >= '0' && *str <= '9') - value = value * radix + *str - '0'; - else - value = value * radix + (*str | 0x20) - 'a' + 10; - // value = value * radix + *str - 'a' + 10; // 也没问题啊 - } - else - value = value * radix + *str - '0'; - str++; - } - return (unsigned int *)(sign*value); -} - -int m4(int argc, char argv[][30]) -{ - unsigned int addr,value; -// printf("%s\n",argv[1]); - if(argc != 3) - { - printf("\nusage: m4 "); - return 1; - } - addr=str2num(argv[1]); - value=str2num(argv[2]); -#ifdef LS1D - *(volatile unsigned int*)(addr) = value; -#else - printf("addr: %x ,value: %x\n",addr,value); -#endif - return 0; -} - -int m1(int argc, char argv[][30]) -{ - unsigned int addr,value; -// printf("%s\n",argv[1]); - if(argc != 3) - { - printf("\nusage: m1 "); - return 1; - } - addr=str2num(argv[1]); - value=str2num(argv[2]); -#ifdef LS1D - *(volatile unsigned char*)(addr) = value; -#else - printf("addr: %x ,value: %x\n",addr,value); -#endif - return 0; -} - -int d4(int argc, char argv[][30]) -{ - unsigned int addr; - if(argc != 2) - { - printf("\nusage: d4 "); - return 1; - } - addr=str2num(argv[1]); -#ifdef LS1D - printf("\n0x%08x: %08x",addr,*(volatile unsigned int*)(addr)); -#else - printf("0x%08x:\n",addr); -#endif - return 0; -} - -int d1(int argc, char argv[][30]) -{ - unsigned int addr; - if(argc != 2) - { - printf("\nusage: d1 "); - return 1; - } - addr=str2num(argv[1]); -#ifdef LS1D - printf("\n0x%08x: %02x",addr,*(volatile unsigned char*)(addr)); -#else - printf("0x%08x:\n",addr); -#endif - return 0; -} - -int cmdline(void) -{ - char c; - char cmdbuffer[40]; - char *cbuffer; - short ccc,cpc,cbc,i,j; - int count=0; -// int (*func) (int , char **); - int (*op)(int argc,char **argv); - i=0; - j=0; - ccc=0; - cpc=0; - printf("This is the 1st test!\n"); - printf("This is the 2nd test!\n"); -// printf("This is the 3rd test!\n"); -// printf("This is the 4th test!\n"); -// printf("This is the 5th test!\n"); -// test mult - int opa = 1; - int opb = 2; - int result1 = opa * opb; - int result10 = 1 * 2; - int result2 = (opa+1) * (opb+4); - int result20 = 2 * 6; - int result3 = (opa+299) * (opb+298); - int result30 = 300 * 300; - printf("result: %d %d\n", result1, result10); - printf("result: %d %d\n", result2, result20); - printf("result: %d %d\n", result3, result30); - while(1){} -while(1) -{ - for(i=0;i<10;i++) - for(j=0;j<30;j++) - cmdpara[i][j] = '\0'; - for(i=0;i<40;i++) cmdbuffer[i]= '\0'; -// printf("\n$ "); - cbuffer = cmdpara[0]; -// printf("@ "); - ccc=0; -// printf("@ "); - cpc=0; -// printf("@ "); - cbc=0; -// printf("@ "); - count++; -// for(i=0;i<1000;i++) i++; - printf("\nS "); -// for(i=0;i<500;i++) j=Uart0_LSR; -// printf("%4d ",count); -// i=1; -// while(i++) {printf("\n%4d",i);j++;} - // internal loop - while(1) - { -// printf("|\n"); - c=mygetchar(); -// printf("%d\n",c); -// printf("/"); -// c=13; -// c=53; - if(c==8) - { - cbc=cbc-1; - cmdbuffer[cbc] = '\0'; - myputchar(8);myputchar(32);myputchar(8); - } - else - { - cmdbuffer[cbc++] = c; - myputchar(c); - } -// printf("\r%s",cmdbuffer); - if(c==10 || c==13) break; - } - for(i=0;i 0; i--) - { - for(j = 0; j < (i - 1); j++) - { - if(delta[j] > delta[j+1]) - { - tmp = delta[j]; - delta[j] = delta[j+1]; - delta[j+1] = tmp; - } - } - } -#if 0 //PRINT - for(i = 0; i < len; i++) - { - //printf("%f ", delta[i]); - if(delta[i] < 0) - { - tmp_print = 0 - delta[i]; - printf("-%d ", (unsigned int)(tmp_print*1000)); - } - else - { - tmp_print = delta[i]; - printf("%d ", (unsigned int)(tmp_print*1000)); - } - if(i == len-1) printf("\r\n"); - } -#endif - - for(i = 1; i < len - 1; i++) - { - sum += delta[i]; - } - average = sum/(len -2); - return average; -} - -void UintToBcd(_u32 dat, _u8 *bcd_buf) -{ - //_u32 tmp = dat; - - //if(dat>=100000000) dat=dat%100000000 ; - dat = dat%100000000 ; - bcd_buf[3] = dat/10000000 ; - bcd_buf[3] <<= 4 ; - dat = dat%10000000 ; - bcd_buf[3] |= (dat/1000000) ; - - dat = dat%1000000 ; - bcd_buf[2] = dat/100000 ; - bcd_buf[2] <<= 4 ; - dat = dat%100000 ; - bcd_buf[2] |= (dat/10000) ; - - dat = dat%10000 ; - bcd_buf[1] = dat/1000 ; - bcd_buf[1] <<= 4 ; - dat = dat%1000 ; - bcd_buf[1] |= (dat/100) ; - - dat = dat%100 ; - bcd_buf[0] = dat/10 ; - bcd_buf[0] <<= 4 ; - dat = dat%10 ; - bcd_buf[0] |= dat ; - -//printf("***: %d\t***BCD:%x %x %x %x\n", tmp, bcd_buf[3], bcd_buf[2], bcd_buf[1], bcd_buf[0]); -} - -void BcdToUint(_u8 *bcd_buf, _u32 dat) -{ - dat = ( ( (_u32)bcd_buf[3]>>4 ) *10000000 ) - + ( ( (_u32)bcd_buf[3]&0xf )*1000000 ) - + ( ( (_u32)bcd_buf[2]>>4 ) *100000 ) - + ( ( (_u32)bcd_buf[2]&0xf )*10000 ) - + ( ( (_u32)bcd_buf[1]>>4 ) *1000 ) - + ( ( (_u32)bcd_buf[1]&0xf )*100 ) - + ( ( (_u32)bcd_buf[0]>>4 ) *10 ) - + ( ( (_u32)bcd_buf[0]&0xf ) ); - -//printf("***BCD:%x %x %x %x\t***: %d\n", bcd_buf[3], bcd_buf[2], bcd_buf[1], bcd_buf[0], dat); -} - -//print float number -#if PRINT -int printf_float(float data) -{ - unsigned int i=0,j=0; - i = (unsigned int)(data); - j = (unsigned int)((data-i)*1000000); - printf("%d.%06d\n", i, j); - - return 0; -} -#endif - diff --git a/resources/soc/simu/soft/func/source/dg_rs232.c b/resources/soc/simu/soft/func/source/dg_rs232.c deleted file mode 100644 index 36fe314..0000000 --- a/resources/soc/simu/soft/func/source/dg_rs232.c +++ /dev/null @@ -1,193 +0,0 @@ -#include -#include "../config.h" -#include "../include/asm/ns16550.h" - -#define COM_BASE 0xbfe88000 //com1 for 1D -#define NS16550_LSR 5 -#define NS16550_DATA 0 - -#define LSR_TXRDY 0x20 -#define LSR_RXRDY 0x01 - -#define writeb(val, addr) (*(volatile unsigned char*)(addr) = (val)) -#define readb(addr) (*(volatile unsigned char*)(addr)) -int dg_write(char *str); -int dg_read(char *buffer, unsigned num); -static void uart_putchar(char a0); -static char uart_getchar(void); -static void uart1_init(void) -{ - Uart1_FCR = FIFO_ENABLE|FIFO_RCV_RST|FIFO_XMT_RST|FIFO_TRIGGER_4; - Uart1_LCR = CFCR_DLAB; - Uart1_BaudL = 52; //set 9600Baut - Uart1_LCR = CFCR_8BITS; //8bit, 1stop - Uart1_MCR = MCR_DTR|MCR_RTS; - Uart1_IER = 0; -} - -int dg_ctrl(int argc, char argv[][30]) // main -{ - char buffer[1024]; - uart1_init(); - printf("\n"); - /* Make sure ip address is supplied on the command line */ -// if ( argc < 2 ) { -// printf("Usage: dg_ctrl IP_ADDRESS\n"); -// exit(1); -// } - /* Initialize the sockets library */ -// init_tcpip(); - /* Connect to the dg645 */ -// if ( dg_connect( inet_addr(argv[1]) ) ) { -// printf("Connection Succeeded\n"); - /* Get identification string */ - dg_write("*idn?\n"); -// printf("\n*idn?\n"); - if ( dg_read(buffer,sizeof(buffer)) ) - printf("%s\n",buffer); - else - printf("Timeout\n"); - /* Load default settings */ - dg_write("*rst\n"); // load default settings - dg_write("tsrc 1\n"); // set trigger source to 1(external posedge) - dg_write("burc 1\n"); // set burst count to 1 - dg_write("burd 4e-6\n"); // set burst delay to 4us - dg_write("burm 1\n"); // set burst mode to ON - dg_write("burp 1e-6\n"); // set burst period to 1us - dg_write("dlay 2,0,5e-8\n"); // set A to 0 delay to 50ns - dg_write("dlay 3,2,5e-7\n"); // set B to A delay to 500ns - dg_write("tlvl 0.9\n"); // set trigger level to 0.9V - dg_write("lamp 0,1.66\n"); // set T0 amplitude to 1.66V - dg_write("lamp 1,1.66\n"); // set AB amplitude to 1.66V - dg_write("*sav 4\n"); // save config to 4 -// dg_write("*wai\n"); // wait execute - /* Make sure all commands have executed before closing connection */ -// dg_write("*opc?\n"); -// if ( !dg_read(buffer,sizeof(buffer)) ) -// printf("Timeout\n"); - /* Close the connection */ -// if (dg_close()) -// printf("Closed connection\n"); -// else -// printf("Unable to close connection"); -// } -// else -// printf("Connection Failed\n"); - return 0; -} - -int dg_cmd(int argc, char argv[][30]) -{ - printf("\n"); - dg_write(argv[1]); - dg_write("\n"); -return 0; -} - -int dg_write(char *str) -{ -// printf("\n"); - while(*str != '\0'){ - uart_putchar(*str); - printf("%c",*str); - str++; - } - if(*(str-1) == '\n') printf("\r"); - return 0; -} - -int dg_read(char *buffer, unsigned num) -{ - char t; - int count=0; - unsigned flag=0; - while(1){ - t=uart_getchar(); - if(t==-1) { - *buffer = '\0'; return count; - } - //if(t==10 || t==13 || t=='\0') flag=1; // - if(flag){ - *buffer = '\0'; return count; - } - else{ - *buffer = t; buffer++; count++; - } - } -} - -static void uart_putchar(char a0) -{ - while((readb(COM_BASE + NS16550_LSR) & LSR_TXRDY)==0){} - writeb(a0, COM_BASE + NS16550_DATA); -} - -static char uart_getchar() -{ -//printf("fly to here\n"); - int cnt=0; - while(cnt<1000000 && (readb(COM_BASE + NS16550_LSR) & LSR_RXRDY)==0){cnt++;} - if (cnt>=1000000) return -1; - return readb(COM_BASE + NS16550_DATA); -} - -/* - -TSRC(?){i} Trigger Source -Set (query) the trigger source {to i}. The parameter i determines the trigger -source according to the following table: -i Trigger Source -0 Internal -1 External rising edges -2 External falling edges -3 Single shot external rising edges -4 Single shot external falling edges -5 Single shot -6 Line -Example -TSRC 5 Set up the DG645 for single shot triggering. - -///------------------------- - -DLAY(?)c{,d,t} Delay -Set (query) the delay for channel c {to t relative to channel d}. -Example -DLAY 2,0,10e-6 Set channel A delay to equal channel T0 plus 10 μs. -DLAY 3,2,1e-3 Set channel B delay to equal channel A delay plus 1 ms. -DLAY?3 Query channel B. Should return ‘2,+0.001000000000’ to -indicate that B = A + 1 ms. - -///-------------------------BURST - -BURC(?){i} Burst Count -Set (query) the burst count {to i}. When burst mode is enabled, the DG645 -outputs burst count delay cycles per trigger. -Example -BURC 10 Set the burst count to 10 so that the DG645 will output -10 delay cycles per triggered burst. - -BURD(?){t} Burst Delay -Set (query) the burst delay {to t}. When burst mode is enabled the DG645 delays -the first burst pulse relative to the trigger by the burst delay. -Example -BURD 5e-6 Set the burst delay to 5 μs so that the DG645 will delay the -first cycle of the burst by 5 μs relative to the trigger. - -BURM(?){i} Burst Mode -Set (query) the burst mode {to i}. If i is 0, burst mode is disabled. If i is 1, burst -mode is enabled. - -BURP(?){t} Burst Period -Set (query) the burst period {to t}. The burst period sets the time between delay -cycles during a burst. The burst period may range from 100 ns to 2000 – 10 ns in -10 ns steps. -Example -BURP 1e-3 Set burst period to 1 ms. When a burst is triggered, the -DG645 will generate burst count delay cycles at a 1 kHz rate. - -BURT(?){i} Burst T0 Configuration -Set (query) the burst T0 configuration {to i}. If i is 0, the T0 output is enabled for -all delay cycles of the burst. If i is 1, the T0 output is enabled for first delay cycle -of the burst only. - -*/ diff --git a/resources/soc/simu/soft/func/source/flash.c b/resources/soc/simu/soft/func/source/flash.c deleted file mode 100644 index c54c5f2..0000000 --- a/resources/soc/simu/soft/func/source/flash.c +++ /dev/null @@ -1,255 +0,0 @@ -#include "../config.h" - -extern unsigned int str2num (char str[30]); -void mywait(void); -/****************************** -*Flash Test* CONFIDENTIAL - ->CAUTION< -DO NOT add this program to ANY release version! - -Liu Su -liusu-cpu@ict.ac.cn -******************************/ - -//#if FLASH_TEST - -static void flash_clearHVPL(void) -{ - *(volatile _u32*)(0xbfe60000) = 0x40000000; -} - -static void flash_erase(_u32 offset) -{ - *(volatile _u32*)(0xbfe60000) = 0xa0000000|offset; -} - -static void flash_page(_u32 offset) -{ - *(volatile _u32*)(0xbfe60000) = 0xe0000000|offset; -} - -static void flash_setca(_u32 cah, _u32 cal) -{ - *(volatile _u32*)(0xbfe60008) = cal; - *(volatile _u32*)(0xbfe60004) = cah; - *(volatile _u32*)(0xbfe60000) = 0xf0000000; -} - -int set_ca(int argc, char argv[][30]) -{ - _u32 cah,cal; - if(argc !=3 ) {printf("\nUsage: setca ");return 1;} - cah = str2num(argv[1]); - cal = str2num(argv[2]); - *(volatile _u32*)(0xbfe60008) = cal; - *(volatile _u32*)(0xbfe60004) = cah; - *(volatile _u32*)(0xbfe60000) = 0xf0000000; -// mywait(); - return 0; -} - -static void flash_writepl() -{ - int i; - for(i=0; i<128; i+=4) - *(volatile _u32*)(0xbf00e000 + i) = i; -} - -int verif(int argc, char argv[][30]) -{ - printf("\nverif"); - _u32 page_offset; - _u32 page_latch[33]; - int i; - page_offset = 0xe000; - printf("\noffset"); -// crypt - flash_setca(0x1f00e100,0x1f00e000); - printf("\nsetca\n"); -// normal page - flash_clearHVPL(); - printf("clearHVPL\n"); - flash_writepl(); - printf("writepl\n"); - flash_erase(page_offset); -// mywait(); - printf("erase\n"); - flash_page(page_offset); -// mywait(); - printf("page\n"); -// verif - *(volatile _u32*)(0xbfe60010) = 0x14; - *(volatile _u32*)(0xbfe60000) = 0x1000e014; - while(*(volatile _u32*)(0xbfe60014) & 0x2 != 0x2){} - if(*(volatile _u32*)(0xbfe60014) & 0x1) - printf("verif correct\n"); - else - printf("verif error"); -// flash_setca(0x1f000001,0x1f000001); -return 0; -} - -int set_pe_time_mode(int argc, char argv[][30]) -{ - unsigned int mode; - mode = str2num(argv[1]); - *(volatile _u32*)(0xbfe60024) = mode; -/**************************** -mode: 0: 1.5ms - 1: 2.0ms - 2: 2.5ms - 3: 3.0ms - 4: 3.5ms -****************************/ -return 0; -} - -static void set_pe_time(int mode) -{ - *(volatile _u32*)(0xbfe60024) = mode; -} - -int flash_tk(int argc, char argv[][30]) -{ - unsigned int i,num; - num = str2num(argv[1]); - for(i=0; i 0){ - UART_OutpLen--; - Uart1_TxData = frame_tx[TX_IndexW]; - TX_IndexW +=1; - } - else{ - //IFG1 &= ~UTXIFG0; - } -} - -void uart_rx(void) -{ - static _u32 rx_head_flag; //'0'δյ֡ʼ - frame_rx[RX_IndexW] = Uart1_RxData; //ıȽϸߣʱᶪʧһַ֡??? -#if PRINT -printf("%x ", frame_rx[RX_IndexW]); -#endif - RX_IndexW +=1; - - static _u32 len; - if((rx_head_flag == 0) && (frame_rx[RX_IndexW-1] == HEAD)){ - len = RX_IndexW + 9; - rx_head_flag = 1; //յ֡ʼ - } - if(rx_head_flag == 1){ - if((frame_rx[RX_IndexW-1] == TAIL) && (RX_IndexW > (len+(_u32)frame_rx[len]+2))){ - //if(RX_BUFF[len+(_u32)RX_BUFF[len])+2] == TAIL){ - rx_head_flag = 0; - //UART_InpLen = RX_IndexW; - RX_IndexW =0; - main_flag |= rx_bit; //usartյһ֡ -#if PRINT -printf("\n"); -#endif - } - } - -} - -/*-----------------------Ӧ֡----------------------*/ -void Answer() -{ - _u32 i=0; - _u32 j; - _u32 head = 3; - Frame.CheckSum = 0x0; - frame_tx[i++] = 0xfe; - frame_tx[i++] = 0xfe; - frame_tx[i++] = 0xfe; - frame_tx[i++] = Frame.HeadCode; - frame_tx[i++] = Frame.TypeCode; - for(j=0;j<7;j++) - frame_tx[i++] = Frame.Address[j]; - frame_tx[i++] = Frame.CtrlCode; //Ҫ쳣жϺλ - frame_tx[i++] = Frame.DataLen; -#if CJT188_DI_SEQ - frame_tx[i++] = Frame.DI0; - frame_tx[i++] = Frame.DI1; -#else - frame_tx[i++] = Frame.DI1; - frame_tx[i++] = Frame.DI0; -#endif - frame_tx[i++] = Frame.SER; - for(j=0;j<((_u32)Frame.DataLen-3);j++) - frame_tx[i++] = Frame.Data[j]; - while(head < i){ - Frame.CheckSum += frame_tx[head]; - Frame.CheckSum %= 256; - head++; - } - frame_tx[i++] = Frame.CheckSum; - frame_tx[i++] = Frame.TailCode; - UART_OutpLen =i; -} - -_u32 read1(struct Date_Time *Date_and_Time, struct Data *Lcd_data) -{ - _u32 i=0; - _u32 j; - _u32 dat; - union uint_uchar uint2uchar; - Frame.DataLen = 0x2e; - - dat = *(_u32 *)(INFO_FLASH_START + Last_month_num*12 + 4);//total heat of last month - UintToBcd(dat, &uint2uchar); - for(j=0; j<4; j++) - Frame.Data[i++] = uint2uchar.c_value[j]; - Frame.Data[i++] = danwei_KWh; - - dat = (_u32)Lcd_data->total_heat*100/LCD_MULTIPLE; //ǰ - UintToBcd(dat, &uint2uchar); - for(j=0; j<4; j++) - Frame.Data[i++] = uint2uchar.c_value[j]; - Frame.Data[i++] = danwei_KWh; - - dat = (_u32)Lcd_data->heat*100/LCD_MULTIPLE; //ȹ - UintToBcd(dat, &uint2uchar); - for(j=0; j<4; j++) - Frame.Data[i++] = uint2uchar.c_value[j]; - Frame.Data[i++] = danwei_KW; - - dat = (_u32)Lcd_data->flow*10000; //˲ʱ - UintToBcd(dat, &uint2uchar); - for(j=0; j<4; j++) - Frame.Data[i++] = uint2uchar.c_value[j]; - Frame.Data[i++] = danwei_m3; - - dat = (_u32)Lcd_data->total_flow*100/LCD_MULTIPLE; //ۼ - UintToBcd(dat, &uint2uchar); - for(j=0; j<4; j++) - Frame.Data[i++] = uint2uchar.c_value[j]; - Frame.Data[i++] = danwei_m3; - - dat = (_u32)Lcd_data->temp1*100/LCD_MULTIPLE; //ˮ¶ - UintToBcd(dat, &uint2uchar); - for(j=1; j<4; j++) - Frame.Data[i++] = uint2uchar.c_value[j]; - - dat = (_u32)Lcd_data->temp2*100/LCD_MULTIPLE; //ˮ¶ - UintToBcd(dat, &uint2uchar); - for(j=1; j<4; j++) - Frame.Data[i++] = uint2uchar.c_value[j]; - - dat = (_u32)Lcd_data->total_time; //ۼƹʱ - UintToBcd(dat, &uint2uchar); - for(j=1; j<4; j++) - Frame.Data[i++] = uint2uchar.c_value[j]; - - //ʵʱʱ - dat = (_u32)Date_and_Time->Day*1000000 + (_u32)Date_and_Time->Hour*10000 + (_u32)Date_and_Time->Minute*100 + (_u32)Date_and_Time->Second; - UintToBcd(dat, &uint2uchar); - for(j=0; j<4; j++) - Frame.Data[i++] = uint2uchar.c_value[j]; - dat = (_u32)Date_and_Time->Year*100 + (_u32)Date_and_Time->Month; - UintToBcd(dat, &uint2uchar); - for(j=0; j<3; j++) - Frame.Data[i++] = uint2uchar.c_value[j]; - - dat = (_u32)ST; //״̬ST - UintToBcd(dat, &uint2uchar); - Frame.Data[i++] = uint2uchar.c_value[0]; - Frame.Data[i++] = uint2uchar.c_value[1]; - - return 0; -} - -_u32 read2() //ϼ½ -{ - _u32 j; - j = (_u32)Frame.DI1; - Frame.DataLen = 0x08; -#if 0 - Flash_Read_Info(); - _u32 i; - for(i=0; i<256; i++) - { - TXBUF0 = Array[i]; - while((U0TCTL & TXEPT) == 0) ; - } -#endif - - _u32 offset; - _u32 dat; - union uint_uchar uint2uchar; - offset = ((Last_month_num-(j-32))%18)*12+4; //0~216 - dat = *(_u32 *)(INFO_FLASH_START + offset);//total heat - UintToBcd(dat, &uint2uchar); - for(j=0; j<4; j++) - Frame.Data[j] = uint2uchar.c_value[j]; - Frame.Data[4] = danwei_KWh; - - return 0; -} - -_u32 read3() -{ - switch(Frame.DI1){ - case 0x02: //۸ - Frame.DataLen = 0x12; - break; - case 0x03: // - Frame.DataLen = 0x04; - break; - case 0x04: // - Frame.DataLen = 0x04; - break; - case 0x05: // - Frame.DataLen = 0x12; - break; - default: - return ERROR; - break; - } - - return 0; -} - -_u32 read4() -{ - Frame.DataLen = 0x04; - - return 0; -} - -_u32 read5() -{ - Frame.DataLen = 0x03; - - return 0; -} - -_u32 write1() -{ - switch(Frame.DI1){ - case 0x10: - Frame.DataLen = 0x05; - break; - case 0x11: - Frame.DataLen = 0x03; - break; - case 0x12: - Frame.DataLen = 0x03; - break; - case 0x13: - Frame.DataLen = 0x08; - break; - case 0x14: - Frame.DataLen = 0x04; - break; - case 0x15: - Frame.DataLen = 0x03; - break; - case 0x17: - Frame.DataLen = 0x05; - break; - case 0x19: - Frame.DataLen = 0x03; - break; - default: - return ERROR; - break; - } - - return 0; -} - -_u32 write2() -{ - Frame.DataLen = 0x03; - - return 0; -} - -_u32 write3() -{ - Frame.DataLen = 0x05; - - return 0; -} - -_u32 write4() -{ - switch(Frame.DI1){ - case 0x12: - Frame.DataLen = 0x05; - break; - case 0x14: - Frame.DataLen = 0x05; - break; - case 0x16: - Frame.DataLen = 0x05; - break; - default: - return ERROR; - break; - } - - return 0; -} - -void do_err() -{ - _u32 dat; - union uint_uchar uint2uchar; - - Frame.CtrlCode |= 0x40; - Frame.DataLen = 0x03; - Frame.DI0 = Frame.SER; - UintToBcd(ST, &uint2uchar); - Frame.DI1 = uint2uchar.c_value[0]; - Frame.SER = uint2uchar.c_value[1]; -} - -//_u32 do_frame() //λӦģʽЭн -_u32 do_frame(struct Date_Time *Date_and_Time, struct Data *Lcd_data) -{ - _u32 err; - _u32 i,j,head,tail; - /*----------------ʼ֡ʽ----------------*/ - - Frame.CheckSum = 0x0; - for(i=0;frame_rx[i] == 0xfe;i++); - head = i; - j = head; - - Frame.HeadCode = frame_rx[head++]; - Frame.TypeCode = frame_rx[head++]; - for(i=0;i<7;i++) - Frame.Address[i] = frame_rx[head++]; - Frame.CtrlCode = frame_rx[head++]; - Frame.DataLen = frame_rx[head++]; -#if CJT188_DI_SEQ - Frame.DI0 = frame_rx[head++]; - Frame.DI1 = frame_rx[head++]; -#else - Frame.DI1 = frame_rx[head++]; - Frame.DI0 = frame_rx[head++]; -#endif - Frame.SER = frame_rx[head++]; - for(i=0;i<((_u32)Frame.DataLen-3);i++) - Frame.Data[i] = frame_rx[head++]; - while(j < head){ - Frame.CheckSum += frame_rx[j]; - Frame.CheckSum %= 256; - j++; - } - if(Frame.CheckSum != frame_rx[j]) { - return 1; - } - tail = j+1; - Frame.TailCode = frame_rx[tail]; - /*----------------֡ʽ----------------*/ - - /*------------------------ݿͽ--------------------------*/ - switch(Frame.CtrlCode){ - case 0x01: //read data - if((Frame.DI0==0x90)&&(Frame.DI1==0x1f)) err = read1(Date_and_Time, Lcd_data); - else if(Frame.DI0==0xd1) err = read2(); - else if(Frame.DI0==0x81) err = read3(); - break; - case 0x09: //Կ汾 - if((Frame.DI0==0x81)&&(Frame.DI1==0x06)) err = read4(); - break; - case 0x03: //ַ - if((Frame.DI0==0x81)&&(Frame.DI1==0x0a)) err = read5(); - break; - case 0x04: //д - if(Frame.DI0==0xa0) err = write1(); - break; - case 0x15: //дַ - if((Frame.DI0==0xa0)&&(Frame.DI1==0x18)) err = write2(); - break; - case 0x16: //дͬ - if((Frame.DI0==0xa0)&&(Frame.DI1==0x16)) err = write3(); - break; - case CJT188_DEF_READ: // - - break; - case CJT188_DEF_WRITE: //д - if(Frame.DI0==0xb0) err = write4(); - break; - default: - err = 2; - break; - } - /*------------------------ͽ--------------------------*/ - Frame.CtrlCode |= 0x80; - if(err) do_err(); - Answer(); - - return 0; -} - -void Frame_exe(struct Date_Time *Date_and_Time, struct Data *Lcd_data) -{ - _u32 err; - err = do_frame(&Date_and_Time, &Lcd_data); - if(err==0) - { - TX_IndexW = 0; - Uart1_TxData = 0xfe; - //IFG1 |= UTXIFG0; - } - else if(err==1) - { - //TXBUF0 = 0xdd; - //while((U0TCTL & TXEPT) == 0) ; - } - else if(err==2) - { - //TXBUF0 = 0xee; - //while((U0TCTL & TXEPT) == 0) ; - } -} -#endif diff --git a/resources/soc/simu/soft/func/source/isp.c b/resources/soc/simu/soft/func/source/isp.c deleted file mode 100644 index 41d856c..0000000 --- a/resources/soc/simu/soft/func/source/isp.c +++ /dev/null @@ -1,279 +0,0 @@ - -#include "../config.h" - -#if PRINT -void tgt_putchar(_u8 chr) -{ - while(!(Uart0_LSR & 0x20)) ; - Uart0_TxData = chr; -} - -_u8 tgt_getchar() -{ - _u8 chr; - while(!(Uart0_LSR & 0x1)) ; - chr = Uart0_RxData ; - - return chr; -} - -_u8 tgt_testchar() -{ - _u8 chr; - chr = (Uart0_LSR & 0x1); - - return chr; -} -#endif - -_u32 now() -{ - _u32 count; - count = PMU_Count; - count &= COUNT_MASK; - - return count; -} - -#if (ISP || MONTHDATA_MODULE) -#if (LS1D_FPGA) -void spiflash_erase(_u32 addr_start, _u32 addr_end) -{ - __asm__ volatile( - "move $15,$31;\n" -/**spi_flash init**/ - "li $8,0xbfe70000;\n" - "li $9,0xc0;\n" - "sb $9,1($8);\n" - "li $9,0x10;\n" - "sb $9,4($8);\n" - "li $9,0x5;\n" - "sb $9,3($8);\n" - "li $9,0x1;\n" - "sb $9,6($8);\n" - "li $9,0x50;\n" - "sb $9,0($8);\n" -/**spi_flash code_program**/ - "li $14, 0x1000;\n" - "1:li $9,0x11;\n" - "sb $9,5($8);\n" /*high cs*/ - "bal 102f;\n" /*wait sr */ - "nop;\n" - "li $9,6;\n" /* write enable */ - "bal 101f;\n" - "nop;\n" - "li $9,0x11;\n" /*high cs*/ - "sb $9,5($8);\n" - "li $9,1;\n" /* write status*/ - "bal 101f;\n" - "nop;\n" - "li $9,0;\n" /* write 0*/ - "bal 103f;\n" - "nop;\n" - "li $9,0x11;\n" /*high cs*/ - "sb $9,5($8);\n" - "bal 102f;\n" /*wait sr */ - "nop;\n" - "li $9,6;\n" /* write enable */ - "bal 101f;\n" - "nop;\n" - "li $9,0x11;\n" /*high cs*/ - "sb $9,5($8);\n" - "li $9,0x20;\n" /*bulk erase, 4kB*/ - "bal 101f;\n" - "nop;\n" - "srl $9,$4,16;\n" /*addr*/ - "bal 103f;\n" - "nop;\n" - "srl $9,$4,8;\n" - "bal 103f;\n" - "nop;\n" - "move $9,$4;\n" - "bal 103f;\n" - "nop;\n" - "li $9,0x11;\n" /*high cs*/ - "sb $9,5($8);\n" - "bal 102f;\n" /*wait sr*/ - "nop;" - "addu $4,$14;\n" - "slt $9,$5,$4;\n" - "beqz $9,1b;\n" - "nop;\n" - "3:\n" - "li $9,0x11;\n" - "sb $9,5($8);\n" /*high cs*/ - - "li $9,0x11;\n" - "sb $9,4($8);\n" - "b 999f;\n" - "nop;\n" - - "101:li $11,1;\n" - "sb $11,5($8);\n" /*enable and low cs*/ - "103:sb $9,2($8);\n" - "1:lb $9,1($8);\n" - "andi $9,1;\n" - "bnez $9,1b;\n" - "nop;\n" - "lb $9,2($8);\n" - "jr $31;\n" - "nop\n;" - "102:move $10,$31;\n" - "1:li $9,5;\n" /*wait read sr*/ - "bal 101b;\n" - "nop;\n" - "andi $9,1;\n" - "bnez $9,1b;\n" /*can continue read sr,write to gen clock*/ - "nop;\n" - "li $9,0x11;\n" /*high cs*/ - "sb $9,5($8);\n" - "jr $10;\n" - "nop;\n" - - "999:move $31,$15;\n" - :::"$8","$9","$10","$11","$4","$5","$14","$15" - ); -} -void spiflash_write(_u32 addr_w, _u32 addr_r, _u32 length) -{ - __asm__ volatile( - "move $15,$31;\n" -/**spi_flash init**/ - "li $8,0xbfe70000;\n" - "li $9,0xc0;\n" - "sb $9,1($8);\n" - "li $9,0x10;\n" - "sb $9,4($8);\n" - "li $9,0x5;\n" - "sb $9,3($8);\n" - "li $9,0x1;\n" - "sb $9,6($8);\n" - "li $9,0x50;\n" - "sb $9,0($8);\n" -/**spi_flash code_program**/ - "li $9,0x11;\n" - "sb $9,5($8);\n" /*high cs*/ - "bal 102f;\n" /*wait sr */ - "nop;\n" - "li $9,6;\n" /* write enable */ - "bal 101f;\n" - "nop;\n" - "li $9,0x11;\n" /*high cs*/ - "sb $9,5($8);\n" - "li $9,1;\n" /* write status*/ - "bal 101f;\n" - "nop;\n" - "li $9,0;\n" /* write 0*/ - "bal 103f;\n" - "nop;\n" - "1:li $9,0x11;\n" /*high cs*/ - "sb $9,5($8);\n" - "bal 102f;\n" /*wait sr */ - "nop;\n" - "li $9,6;\n" /* write enable */ - "bal 101f;\n" - "nop;\n" - "li $9,0x11;\n" /*high cs*/ - "sb $9,5($8);\n" - "bal 102f;\n" /*wait sr*/ - "nop;" - "li $9,2;\n" /*write sector*/ - "bal 101f;\n" - "nop;\n" - "srl $9,$4,16;\n" /*addr*/ - "bal 103f;\n" - "nop;\n" - "srl $9,$4,8;\n" - "bal 103f;\n" - "nop;\n" - "move $9,$4;\n" - "bal 103f;\n" - "nop;\n" - "2:lb $9,0($5);\n" /*write 1 data*/ - "bal 103f;\n" - "nop;\n" - "addiu $4,1;\n" - "addiu $5,1;\n" - "addiu $6,-1;\n" - "beqz $6,3f;\n" - "nop;\n" - "b 1b;\n" - "nop;\n" - "3:\n" - "li $9,0x11;\n" - "sb $9,5($8);\n" /*high cs*/ - - "li $9,0x11;\n" - "sb $9,4($8);\n" - "b 999f;\n" - "nop;\n" - - "101:li $11,1;\n" - "sb $11,5($8);\n" /*enable and low cs*/ - "103:sb $9,2($8);\n" - "1:lb $9,1($8);\n" - "andi $9,1;\n" - "bnez $9,1b;\n" - "nop;\n" - "lb $9,2($8);\n" - "jr $31;\n" - "nop\n;" - "102:move $10,$31;\n" - "1:li $9,5;\n" /*wait read sr*/ - "bal 101b;\n" - "nop;\n" - "andi $9,1;\n" - "bnez $9,1b;\n" /*can continue read sr,write to gen clock*/ - "nop;\n" - "li $9,0x11;\n" /*high cs*/ - "sb $9,5($8);\n" - "jr $10;\n" - "nop;\n" - - "999:move $31,$15;\n" - :::"$8","$9","$10","$11","$4","$5","$6","$15" - ); -} -#else -//²Á³ýaddrËùÔڵĶΠ-void Flash_Erase(_u32 addr) -{ - FLASH_CMD_REG = FLASH_ERASE_CMD | (addr & FLASH_ADDR_MASK) ; - -} - -_u32 Flash_Write(_u32 addr, _u32 *data, _u32 num) -{ - FLASH_CMD_REG = FLASH_PAGE_LATCH_CLEAR; - /*wait interrupt ? Should I disable other int??????*/ - //debug("Page_latch is clean now...\n") - - _u32 flash_block_mask = FLASH_BLOCK_SIZE - 1; - _u32 *page_data = (_u32 *)(addr & ~flash_block_mask) ; - _u32 *old_data = (_u32 *)(addr & ~flash_block_mask) ; - _u32 i, j, offset; - - j = 0; - offset = ((addr & flash_block_mask)>>2); - for(i=0; i<(FLASH_BLOCK_SIZE/4); i++) - { - if( (offset <= i) && (j < num) ) - page_data[i] = data[j++]; - else - page_data[i] = old_data[i]; - } - - Flash_Erase(addr); - /*wait interrupt ? */ - //debug("Flash page is clean now...\n") - - FLASH_CMD_REG = FLASH_WRITE_CMD | (addr & FLASH_ADDR_MASK) ; - /*wait interrupt ? */ - //debug("Flash page write is finish...\n") - - return 0; -} -#endif -#endif - - diff --git a/resources/soc/simu/soft/func/source/key.c b/resources/soc/simu/soft/func/source/key.c deleted file mode 100644 index 4b6c0e9..0000000 --- a/resources/soc/simu/soft/func/source/key.c +++ /dev/null @@ -1,77 +0,0 @@ -/********************************************************************************************************************************************************************** - This file uses key to jump between diffrence cases. -**********************************************************************************************************************************************************************/ - -#include "../config.h" - -#if KEY_MODULE -static void Auto_jump(struct Data *Lcd_data) -{ - wait[1] = 0; - main_flag &= ~A3_delay; - if(Lcd_data->lcdmode/10 == A4) { - main_flag |= wait_2hour; - } - else { - if(Lcd_data->lcdmode/10 == A3){ - wait[2] = 0; - main_flag |= A3_delay; - } - main_flag |= wait_1min; - } - main_flag |= lcd_bit; -} - -static void Key_short(struct Data *Lcd_data) -{ - if(Lcd_data->lcdmode/10 == A4) Lcd_data->lcdmode = (Lcd_data->lcdmode%10 + 1)%7 + (Lcd_data->lcdmode/10)*10; - if(Lcd_data->lcdmode/10 == A1) Lcd_data->lcdmode = (Lcd_data->lcdmode%10 + 1)%9 + (Lcd_data->lcdmode/10)*10; - if(Lcd_data->lcdmode/10 == A2) Lcd_data->lcdmode = (Lcd_data->lcdmode%10 + 1)%7 + (Lcd_data->lcdmode/10)*10; - if(Lcd_data->lcdmode/10 == A3){ - if(Lcd_data->lcdmode == A3_0){ - Lcd_data->lcdmode = A3_1; - Lcd_data->history = Last_month_num; - } - else { - Lcd_data->lcdmode = A3_1; - Lcd_data->history += 1; - Lcd_data->history %= 18; - } - } - Auto_jump(Lcd_data); -} - -static void Key_long(struct Data *Lcd_data) -{ - /**/ - if(Lcd_data->lcdmode == A1_6) { - Lcd_data->lcdmode = A4_0; - PMU[0] = 0x4; //cruise delay 0.25s,2s - main_flag &= ~wait_1min; - } - else { - if(Lcd_data->lcdmode/10 == A4) { - Lcd_data->lcdmode = A1_0; - PMU[0] = 0x7004; //cruise delay 2s,8s - main_flag &= ~wait_2hour; - } - else if(Lcd_data->lcdmode/10 == A1) Lcd_data->lcdmode = A2_0; - else if(Lcd_data->lcdmode/10 == A2) Lcd_data->lcdmode = A3_0; - else if(Lcd_data->lcdmode/10 == A3) Lcd_data->lcdmode = A1_0; - } - Auto_jump(Lcd_data); -} - -void Key(struct Data *Lcd_data) -{ - if(main_flag & long_key) - { - main_flag &= ~long_key; - Key_long(Lcd_data); - } - else - { - Key_short(Lcd_data); - } -} -#endif diff --git a/resources/soc/simu/soft/func/source/lcd.c b/resources/soc/simu/soft/func/source/lcd.c deleted file mode 100644 index 3db28d7..0000000 --- a/resources/soc/simu/soft/func/source/lcd.c +++ /dev/null @@ -1,414 +0,0 @@ -#include "../config.h" - -/****************************************************************************** -lcd module - 1.LcdClear - 2.LcdPrintAll - 3.LcdLowV - 4.LcdDisplay - - Notice: Some variable of Lcd_data = real_value * LCD_MULTIPLE -******************************************************************************/ - -#if LCD_MODULE -//clear lcd_buf -static void LcdClear(_u8 *LCD_BUF) -{ - _u32 i ; - - for(i=0;i>4)]; - if(!(minus++)) LCD_BUF[0] = word[5]; //'F', overflow -step1: - if(!(minus++)) LCD_BUF[0] = MINUS; - LCD_BUF[1] = number[(bcd_buf[3])&0xf]; -step2: - if(!(minus++)) LCD_BUF[1] = MINUS; - LCD_BUF[2] = number[(bcd_buf[2]>>4)]; -step3: - if(!(minus++)) LCD_BUF[2] = MINUS; - LCD_BUF[3] = number[(bcd_buf[2])&0xf]; -step4: - if(!(minus++)) LCD_BUF[3] = MINUS; - LCD_BUF[4] = number[(bcd_buf[1]>>4)]; -step5: - if(!(minus++)) LCD_BUF[4] = MINUS; - LCD_BUF[5] = number[(bcd_buf[1])&0xf]; -step6: - if(!(minus++)) LCD_BUF[5] = MINUS; - LCD_BUF[6] = number[(bcd_buf[0]>>4)]; -step7: - if(!(minus++)) LCD_BUF[6] = MINUS; - LCD_BUF[7] = number[(bcd_buf[0])&0xf]; - - if(decimal_length==5) LCD_BUF[2] |= 0x80; //print p1 - if(decimal_length==4) LCD_BUF[3] |= 0x80; //print p2 - if(decimal_length==3) LCD_BUF[4] |= 0x80; //print p3 - if(decimal_length==2) LCD_BUF[5] |= 0x80; //print p4 - if(decimal_length==1) LCD_BUF[6] |= 0x80; //print p5 -} - -void LcdDisplay(struct Date_Time *Date_and_Time, struct Data *Lcd_data) -{ - _u8 LCD_BUF[LCD_LENGTH]; - LcdClear(&LCD_BUF) ; - -#if LCD_TEST - //LcdTest1(); - LcdTest2(&LCD_BUF); -#else - //printf("lcdmode = %d\n", Lcd_data->lcdmode); - - _u8 bcd_buf[4]; - _u32 i; - _u32 minus = 1; - volatile _u32 display; - - i = Lcd_data->lcdmode/10; - if(i == A1){ //-------------------------A1----- - switch(Lcd_data->lcdmode){ - case A1_0: - LCD_BUF[0] = word[0]; //'A' - LCD_BUF[1] = number[1]; //'1' - break; - case A1_1: - if(Lcd_data->total_heat < 0) minus = 0; - display = minus?(_u32)(Lcd_data->total_heat):(_u32)(0 - Lcd_data->total_heat); - UintToBcd((display/100000), &bcd_buf); - LcdBufWrite(&LCD_BUF, &bcd_buf, 0, minus); - LCD_BUF[8] = A1_1_0; - LCD_BUF[9] = A1_1_1; //KW*h - break; - case A1_2: - if(Lcd_data->heat < 0) minus = 0; - display = minus?(_u32)(Lcd_data->heat):(_u32)(0 - Lcd_data->heat); - UintToBcd((display/10000), &bcd_buf); - LcdBufWrite(&LCD_BUF, &bcd_buf, 1, minus); - LCD_BUF[8] = A1_2_0; - LCD_BUF[9] = A1_2_1; - break; - case A1_3: - if(Lcd_data->temp1 < 0) minus = 0; - display = minus?(_u32)(Lcd_data->temp1):(_u32)(0 - Lcd_data->temp1); - UintToBcd((display), &bcd_buf); - LcdBufWrite(&LCD_BUF, &bcd_buf, 5, minus); - LCD_BUF[4] = 0x0; - - if(Lcd_data->temp2 < 0) minus = 0; - display = minus?(_u32)(Lcd_data->temp2):(_u32)(0 - Lcd_data->temp2); - UintToBcd((display/10000), &bcd_buf); - LcdBufWrite(&LCD_BUF, &bcd_buf, 1, minus); - - LCD_BUF[8] = A1_3_0; - LCD_BUF[9] = A1_3_1; - break; - case A1_4: - if(Lcd_data->temp0 < 0) minus = 0; - display = minus?(_u32)(Lcd_data->temp0):(_u32)(0 - Lcd_data->temp0); - UintToBcd((display/1000), &bcd_buf); - LcdBufWrite(&LCD_BUF, &bcd_buf, 2, minus); - LCD_BUF[8] = A1_4_0; - LCD_BUF[9] = A1_4_1; - break; - case A1_5: - if(Lcd_data->total_flow < 0) minus = 0; - display = minus?(_u32)(Lcd_data->total_flow):(_u32)(0 - Lcd_data->total_flow); - UintToBcd((display/1000), &bcd_buf); - LcdBufWrite(&LCD_BUF, &bcd_buf, 2, minus); - LCD_BUF[8] = A1_5_0; - LCD_BUF[9] = A1_5_1; - break; - case A1_6: - if(Lcd_data->flow < 0) minus = 0; - display = minus?(_u32)(Lcd_data->flow):(_u32)(0 - Lcd_data->flow); - UintToBcd((display/100), &bcd_buf); - LcdBufWrite(&LCD_BUF, &bcd_buf, 3, minus); - LCD_BUF[8] = A1_6_0; - LCD_BUF[9] = A1_6_1; - break; - case A1_7: - display = Lcd_data->total_time; - UintToBcd(display, &bcd_buf); - LcdBufWrite(&LCD_BUF, &bcd_buf, 0, minus); - LCD_BUF[8] = A1_7_0; - LCD_BUF[9] = A1_7_1; - break; - case A1_8: - display = Lcd_data->alarm_time; - UintToBcd(display, &bcd_buf); - LcdBufWrite(&LCD_BUF, &bcd_buf, 0, minus); - LCD_BUF[8] = A1_8_0; - LCD_BUF[9] = A1_8_1; - break; - } - } - else if(i == A2){ //--------------------A2----- - switch(Lcd_data->lcdmode){ - case A2_0: - LCD_BUF[0] = word[0]; //'A' - LCD_BUF[1] = number[2]; //'2' - break; - case A2_1: - Lcd_data->date = Date_and_Time->Year*10000 + Date_and_Time->Month*100 + Date_and_Time->Day; //ע⣬Ҫתֹ - display = Lcd_data->date; - UintToBcd(display, &bcd_buf); - LcdBufWrite(&LCD_BUF, &bcd_buf, 0, minus); - LCD_BUF[3] |= 0x80; - LCD_BUF[5] |= 0x80; - LCD_BUF[8] = A2_1_0; //ʱ - LCD_BUF[9] = A2_1_1; // - break; - case A2_2: - Lcd_data->time = Date_and_Time->Hour*1000000 + Date_and_Time->Minute*1000 + Date_and_Time->Second; //ע⣬Ҫתֹ - display = Lcd_data->time; - UintToBcd(display, &bcd_buf); - LcdBufWrite(&LCD_BUF, &bcd_buf, 0, minus); - LCD_BUF[2] = 0x02; - LCD_BUF[5] = 0x02; - LCD_BUF[8] = A2_2_0; //ʱ ʱ - LCD_BUF[9] = A2_2_1; // - break; - case A2_3: //û - display = Lcd_data->usercode; - UintToBcd(display, &bcd_buf); - LcdBufWrite(&LCD_BUF, &bcd_buf, 0, minus); - break; - case A2_4: //汾 - display = (_u32)(Lcd_data->version*10); - UintToBcd(display, &bcd_buf); - LcdBufWrite(&LCD_BUF, &bcd_buf, 1, minus); - break; - case A2_5: //͵ѹ - LcdLowV(&LCD_BUF); - break; - case A2_6: /*ȫ*/ - LcdPrintAll(&LCD_BUF); - break; - } - } - else if(i == A3){ //--------------------A3----- - switch(Lcd_data->lcdmode){ - case A3_0: - LCD_BUF[0] = word[0]; //'A' - LCD_BUF[1] = number[3]; //'3' - break; - case A3_1: - display = *(_u32 *)(INFO_FLASH_START + Lcd_data->history*12); - UintToBcd(display, &bcd_buf); - LcdBufWrite(&LCD_BUF, &bcd_buf, 0, minus); - LCD_BUF[4] = 0x02; - LCD_BUF[7] = 0x0; - LCD_BUF[8] = A3_1_0; //ʱ - LCD_BUF[9] = A3_1_1; // - break; - case A3_2: - display = *(_u32 *)(INFO_FLASH_START + Lcd_data->history*12+8); - UintToBcd((display), &bcd_buf); - LcdBufWrite(&LCD_BUF, &bcd_buf, 2, minus); - LCD_BUF[8] = A3_2_0; //ۻ - LCD_BUF[9] = A3_2_1; //m3 - break; - case A3_3: - display = *(_u32 *)(INFO_FLASH_START + Lcd_data->history*12+4); - UintToBcd((display), &bcd_buf); - LcdBufWrite(&LCD_BUF, &bcd_buf, 2, minus); - LCD_BUF[8] = A3_3_0; //ۼ - LCD_BUF[9] = A3_3_1; //KW*h - break; - } - } - else if(i == A4){ //--------------------A4----- - switch(Lcd_data->lcdmode){ - case A4_0: - LCD_BUF[0] = word[0]; //'A' - LCD_BUF[1] = number[4]; //'4' - break; - case A4_1: - if(Lcd_data->flow < 0) minus = 0; - display = minus?(_u32)(Lcd_data->flow):(_u32)(0 - Lcd_data->flow); - UintToBcd((display/100), &bcd_buf); - LcdBufWrite(&LCD_BUF, &bcd_buf, 3, minus); - LCD_BUF[8] = A4_1_0; - LCD_BUF[9] = A4_1_1; - break; - case A4_2: - if(Lcd_data->total_flow < 0) minus = 0; - display = minus?(_u32)(Lcd_data->total_flow):(_u32)(0 - Lcd_data->total_flow); - UintToBcd((display), &bcd_buf); - LcdBufWrite(&LCD_BUF, &bcd_buf, 5, minus); - LCD_BUF[8] = A4_2_0; - LCD_BUF[9] = A4_2_1; - break; - case A4_3: - if(Lcd_data->heat < 0) minus = 0; - display = minus?(_u32)(Lcd_data->heat):(_u32)(0 - Lcd_data->heat); - UintToBcd((display/10), &bcd_buf); - LcdBufWrite(&LCD_BUF, &bcd_buf, 4, minus); - LCD_BUF[8] = A4_3_0; - LCD_BUF[9] = A4_3_1; - break; - case A4_4: - if(Lcd_data->total_heat < 0) minus = 0; - display = minus?(_u32)(Lcd_data->total_heat):(_u32)(0 - Lcd_data->total_heat); - UintToBcd((display/10), &bcd_buf); - LcdBufWrite(&LCD_BUF, &bcd_buf, 4, minus); - LCD_BUF[8] = A4_4_0; - LCD_BUF[9] = A4_4_1; //KW*h - break; - case A4_5: - if(Lcd_data->temp1 < 0) minus = 0; - display = minus?(_u32)(Lcd_data->temp1):(_u32)(0 - Lcd_data->temp1); - UintToBcd((display*10), &bcd_buf); - LcdBufWrite(&LCD_BUF, &bcd_buf, 0, minus); - - if(Lcd_data->temp2 < 0) minus = 0; - display = minus?(_u32)(Lcd_data->temp2):(_u32)(0 - Lcd_data->temp2); - UintToBcd((display/1000), &bcd_buf); - LcdBufWrite(&LCD_BUF, &bcd_buf, 0, minus); - - LCD_BUF[8] = A4_5_0; - LCD_BUF[9] = A4_5_1; - break; - case A4_6: - if(Lcd_data->temp0 < 0) minus = 0; - display = minus?(_u32)(Lcd_data->temp0):(_u32)(0 - Lcd_data->temp0); - UintToBcd((display/1000), &bcd_buf); - LcdBufWrite(&LCD_BUF, &bcd_buf, 2, minus); - LCD_BUF[8] = A4_6_0; - LCD_BUF[9] = A4_6_1; - break; - } - } - - if(main_flag & lowV_flag) LcdLowV(&LCD_BUF); - - WriteLcdRegs(&LCD_BUF); -#endif -} - -#endif diff --git a/resources/soc/simu/soft/func/source/temp_flow.c b/resources/soc/simu/soft/func/source/temp_flow.c deleted file mode 100644 index 88bee1f..0000000 --- a/resources/soc/simu/soft/func/source/temp_flow.c +++ /dev/null @@ -1,416 +0,0 @@ -/********************************************************************************************************************************************************************** - This file uses TDC module to caculate temperature and waterflow. -**********************************************************************************************************************************************************************/ - -#include "../config.h" - -#if (TDC_TEMP_MODULE|TDC_FLOW_MODULE) -//#undef PRINT - -void InitTdc(void) -{ -#if (TEMP_TEST|FLOW_TEST) - //if PMU[0]&0x10000, the cruise delay will divide 4. - PMU[0] = 0x4; //cruise delay 0.25s,2s -#else - PMU[0] = 0x7004; //cruise delay 2s,8s -#endif - Sonar[0] = 0xa210; //4M div 4, 96mA, Fireup, stop2 - Sonar[1] = 0xf8840081; //use Stdc, measure 2 - Sonar[2] = 0xc0300000; //detect first wave - Sonar[3] = 0x8004000; //set delay, detect first wave - Sonar[4] = 0x4000500; //set delay, from first wave to the first stop - Thsens[0] = 0xf7; -#if TDC_TEMP_MODULE - PMU[1] |= 0x80; //cruise mode, temp -#endif -#if TDC_FLOW_MODULE - PMU[1] |= 0x40; //cruise mode, flow -#endif - -#if (TEMP_TEST|FLOW_TEST) - printf("Tdc initted...\n"); -#endif -} - -static _fp32 Time_Caculate(_u32 *result, struct Data *Lcd_data, _u32 start, _u32 stop_num) -{ - _u32 i; -#if FLOW_TEST - //printf("Time_Caculate...\n"); -#endif - - _fp32 average_time; - short a[stop_num],b[stop_num]; - short sum_a, sum_b; - for(i=0;i0xd5) -{ - printf("result_low[%d] = 0x%x\n", i, b[i]); //0xc7==199 - printf("-------------------------------------------------------------------------------------------------------------------------------------------\n"); -} -#endif - } - - sum_a = 0; - sum_b = 0; - for(i=1;iauto_caculate; //ns, 10-9(s) - - return average_time; -} - -static _fp32 GetUltrasonicVelocity(_fp32 temp) -{ - _fp32 V; - V = 1402336 + - 5033.58f*temp - - 5795.06f*temp*temp/100 + - 3316.36f*temp*temp*temp/10000 - - 1452.62f*temp*temp*temp*temp/1000000 + - 3044.9f*temp*temp*temp*temp*temp/1000000000; - -//printf("UltrasonicVelocity: %d\t", (unsigned int)(V)); - return V/1000; //m/s -} - -void Flow_Caculate(_fp32 delta_time, _fp32 duration, struct Data *Lcd_data) -{ - /*delta_time***********ns*/ -#if (FLOW_TEST&TEMP_TEST) - _fp32 UltrasonicVelocity; - UltrasonicVelocity = GetUltrasonicVelocity(Lcd_data->temp1/LCD_MULTIPLE); - - _fp32 flow_Velocity; - //flow_Velocity = (delta_time/1000000000)*UltrasonicVelocity*UltrasonicVelocity/(2*SOUND_PATH*COS_RESULT); - flow_Velocity = delta_time*UltrasonicVelocity*UltrasonicVelocity/(2*SOUND_PATH*COS_RESULT*10000); //m/s, flow_Velocity*LCD_MULTIPLE - - Lcd_data->flow = CONST*K_COEFFICIENT*DIAMETER*DIAMETER*flow_Velocity*3600; //m3/h, Lcd_data->flow*LCD_MULTIPLE - Lcd_data->total_flow += Lcd_data->flow*duration/3600; //m3, Lcd_data->total_flow*LCD_MULTIPLE -#endif -} - -void Temp_Caculate(unsigned int *result, struct Data *Lcd_data, unsigned int num) -{ - int i; -#if TEMP_TEST - //printf("Temp_Caculate...\n"); -#endif - - short a[num],b[num]; - for(i=0;iauto_caculate-(b[5]-b[4]))*2/(_fp32)((a[3]-a[2]+a[1]-a[0])*Lcd_data->auto_caculate-(b[3]-b[2]+b[1]-b[0])) ; - r_output = (_fp32)((a[7]-a[6])*Lcd_data->auto_caculate-(b[7]-b[6]))*2/(_fp32)((a[3]-a[2]+a[1]-a[0])*Lcd_data->auto_caculate-(b[3]-b[2]+b[1]-b[0])) ; - - r_input += (_fp32)((a[11]-a[10])*Lcd_data->auto_caculate-(b[11]-b[10]))*2/(_fp32)((a[15]-a[14]+a[13]-a[12])*Lcd_data->auto_caculate-(b[15]-b[14]+a[13]-a[12])) ; - r_input /= 2; - r_output += (_fp32)((a[9]-a[8])*Lcd_data->auto_caculate-(b[9]-b[8]))*2/(_fp32)((a[15]-a[14]+a[13]-a[12])*Lcd_data->auto_caculate-(b[15]-b[14]+a[13]-a[12])) ; - r_output /=2; - } - else - { - r_input = (_fp32)((a[3]-a[2])*Lcd_data->auto_caculate-(b[3]-b[2]))*2/(_fp32)((a[7]-a[6]+a[5]-a[4])*Lcd_data->auto_caculate-(b[7]-b[6]+b[5]-b[4])) ; - r_output = (_fp32)((a[1]-a[0])*Lcd_data->auto_caculate-(b[1]-b[0]))*2/(_fp32)((a[7]-a[6]+a[5]-a[4])*Lcd_data->auto_caculate-(b[7]-b[6]+b[5]-b[4])) ; - - r_input += (_fp32)((a[13]-a[12])*Lcd_data->auto_caculate-(b[13]-b[12]))*2/(_fp32)((a[11]-a[10]+a[9]-a[8])*Lcd_data->auto_caculate-(b[11]-b[10]+a[9]-a[8])) ; - r_input /= 2; - r_output += (_fp32)((a[15]-a[14])*Lcd_data->auto_caculate-(b[15]-b[14]))*2/(_fp32)((a[11]-a[10]+a[9]-a[8])*Lcd_data->auto_caculate-(b[11]-b[10]+a[9]-a[8])) ; - r_output /=2; - } - - _fp32 temp_in, temp_out; - _fp32 tmp; - //ͨ¹ý¹«Ê½¼ÆË㣬Õâʱr_inputºÍr_outputÊÇζÈÖµ - //¹«Ê½À´Ô´ÓÚhttp://wenku.baidu.com/view/f9bab86a561252d380eb6e56.html ͨ¹ý²¬µç×è×èÖµÇóµÃζȵķ½·¨ - /******************************************************************************************************************************/ - /* IN */ - //tmp = r_input*1000; - //temp_in = 101.373e-5*tmp*tmp + 23.5515*tmp - 245649725e-4;//ÊäÈëR(µ¥Î»:0.01R) Êä³öT(µ¥Î»:0.01¶È) - //temp_in /= 100; - temp_in = 10.1373f*r_input*r_input + 235.515f*r_input - 245.649725f;//ÊäÈëR(µ¥Î»:0.01R) Êä³öT(µ¥Î»:0.01¶È) - - /* OUT */ - //tmp = r_output*1000; - //temp_out = 101.373e-5*tmp*tmp + 23.5515*tmp - 245649725e-4;//ÊäÈëR(µ¥Î»:0.01R) Êä³öT(µ¥Î»:0.01¶È) - //temp_out /= 100; - temp_out = 10.1373f*r_output*r_output + 235.515f*r_output - 245.649725f;//ÊäÈëR(µ¥Î»:0.01R) Êä³öT(µ¥Î»:0.01¶È) - /******************************************************************************************************************************/ - -#if TEMP_TEST - if((temp_in<0)||(temp_in>100)||(temp_out<0)||(temp_out>100)) - { - printf("---------------------------------------------------------------ERROR-----------------------------------------------------------------------\n"); - for(i=0;itemp1 = temp_in*LCD_MULTIPLE; - Lcd_data->temp2 = temp_out*LCD_MULTIPLE; - Lcd_data->temp0 = (temp_in - temp_out)*LCD_MULTIPLE; -} - -_fp32 get_density(_fp32 temp) -{ - _fp32 density; - density = 1000.2f - temp*0.42f; //kg/m3 - return density; -} - -_fp32 get_enthalpy(_fp32 temp) -{ - _fp32 enthalpy; - enthalpy = temp*4.18f + 0.85f; //kJ/kg - return enthalpy; -} - -void Heat_Caculate(_fp32 duration, struct Data *Lcd_data) -{ - _fp32 density; //ÃÜ¶È - _fp32 enthalpy_in, enthalpy_out; //<9f>áìÊÖµ - _fp32 heat_duration; - - density = get_density(Lcd_data->temp1/LCD_MULTIPLE); //µ±ÈÈÁ¿±í°²×°ÔÚ½øË®¹ÜÉÏ - enthalpy_in = get_enthalpy(Lcd_data->temp1/LCD_MULTIPLE); - enthalpy_out = get_enthalpy(Lcd_data->temp2/LCD_MULTIPLE); - - static _fp32 Last_total_flow; //ÉϴμÆËãʱµÄÀÛ»ýÁ÷Á¿ - heat_duration = (Lcd_data->total_flow - Last_total_flow)*density*(enthalpy_in - enthalpy_out); - Lcd_data->heat = heat_duration/(duration/3600); - Lcd_data->total_heat += heat_duration; - - Last_total_flow = Lcd_data->total_flow; - -} - -/********************************************************************************************************************************************************************** - When a res_valid interrupt comes, it will do - Firstly clear the interrupt bit; - Secondly read the result from the related regs; - Finally clear the result pointer. -***********************************************************************************************************************************************************************/ -_u32 res_ready(struct Data *Lcd_data) -{ -#if RES_TEST - printf("res_ready...\n"); -#endif - - _u32 ptr; - ptr = Sonar[8]; //0xbfeb4020 -#if RES_TEST - printf("ptr:0x%x\n", ptr); -#endif - _u32 current_ptr0,current_ptr1,last_ptr0,last_ptr1; - current_ptr0 = ptr&0xf; -#if RES_TEST - printf("current_ptr0:0x%x\n", current_ptr0); -#endif - current_ptr1 = (ptr>>4)&0xf; -#if RES_TEST - printf("current_ptr1:0x%x\n", current_ptr1); -#endif - last_ptr0 = (ptr>>8)&0xf; -#if RES_TEST - printf("last_ptr0:0x%x\n", last_ptr0); -#endif - last_ptr1 = (ptr>>12)&0xf; -#if RES_TEST - printf("last_ptr1:0x%x\n", last_ptr1); -#endif - - _u32 state, direction; - static _fp32 delta_time,time_up,time_down; - state = PMU[1]; - direction = Sonar[0]; - - _u32 result[16]; - _u32 i; - for(i=0; i<16; i++) - { - result[i] = Sonar[16+i]; //0xbfeb4040 Result[0] -#if RES_TEST - printf("result[%d] = 0x%x\n", i, result[i]); -#endif - } - PMU[15] = 0x80000000; //0xbfeb003c, clear regs, then you can start next measure - - /******************************************************************************************************************************/ - if((state&0xe00)==0x400) - { - _u32 sonar; - _u32 stop_num; - sonar = Sonar[1]; - stop_num = ((sonar>>21)&0x7); -#if FLOW_TEST - //printf("stop_num = %d\n", stop_num); -#endif - - if((sonar&0x100000)==0x0) - { - Lcd_data->auto_caculate = result[last_ptr0-1] - result[last_ptr0-2]; - } - - if((current_ptr0-last_ptr0) 1000.0) //if delta_time>1us - { - delta_time = 0; - printf("---------------------------------------------------------------ERROR-----------------------------------------------------------------------\n"); - for(i=0;i<12;i++) - { - printf("result[%d] = 0x%x\n", i,result[i]); - } - printf("-------------------------------------------------------------------------------------------------------------------------------------------\n"); - } -#endif - _fp32 tmp; -#if 0 //FLOW_TEST - if(delta_time<0) - { - tmp = 0 - delta_time; - printf("delta_time: -%d\n", (unsigned int)(tmp*1000)); - } - else - { - tmp = delta_time; - printf("delta_time: %d\n", (unsigned int)(tmp*1000)); - } -#endif - -#if 1 - static _u32 last_count=0; - static _u32 j=0; - static _fp32 delta[8]; - delta[j++] = delta_time; - if(j==8) - { - _fp32 average_delta_time; - average_delta_time = bubble_sort(&delta, j); - j=0; -#if FLOW_TEST - if(average_delta_time<0) - { - tmp = 0 - average_delta_time; - printf("------------------average_delta_time: -%d\n", (_u32)(tmp*1000)); - } - else - { - tmp = average_delta_time; - printf("------------------average_delta_time: %d\n", (_u32)(tmp*1000)); - } -#endif - _u32 count; - _fp32 duration; - count = *(volatile _u32 *)0xbfeb001c; - count &= COUNT_MASK; -#if PRINT -//printf("count: %d\n", count); -#endif - duration = (_fp32)( (count - last_count)%COUNT_COMPARE )/16; - last_count = count; - if(duration>16) return 2; //if duration > 16seconds, it should be an error. - - Flow_Caculate(average_delta_time, duration, Lcd_data); - Heat_Caculate(duration, Lcd_data); - } -#endif - - } - else if((state&0xe00)==0x600) - { - Temp_Caculate(&result, Lcd_data, 16); - } - - return 0; -} -#endif diff --git a/resources/soc/simu/soft/func/source/xmodem.c b/resources/soc/simu/soft/func/source/xmodem.c deleted file mode 100644 index 6370152..0000000 --- a/resources/soc/simu/soft/func/source/xmodem.c +++ /dev/null @@ -1,233 +0,0 @@ -/********************************************************************************************************************************************************************** - This file uses xmodem to download code, then writes it into flash. -**********************************************************************************************************************************************************************/ - -#include "../config.h" - -static _u16 _crc_xmodem_update (_u16 crc, _u8 data) -{ - int i; - crc = crc ^ ((_u16)data << 8); - for (i=0; i<8; i++) - { - if (crc & 0x8000) - crc = (crc << 1) ^ 0x1021; - else - crc <<= 1; - } - return crc; -} - -//Xmodenַ -#define XMODEM_NUL 0x00 -#define XMODEM_SOH 0x01 -#define XMODEM_STX 0x02 -#define XMODEM_EOT 0x04 -#define XMODEM_ACK 0x06 -#define XMODEM_NAK 0x15 -#define XMODEM_CAN 0x18 -#define XMODEM_EOF 0x1A -#define XMODEM_WAIT_CHAR 'C' - - -#define ST_WAIT_START 0x00 //ȴ -#define ST_BLOCK_OK 0x01 //һݿɹ -#define ST_BLOCK_FAIL 0x02 //һݿʧ -#define ST_OK 0x03 // - -#if LS1D_FPGA -static int testchar(unsigned int timeout) -{ - int total, start; - start = now(); - - while(1) - { - if(tgt_testchar()) return 100; - if( (now()-start) > timeout ) break; - } - - return 0; -} -#else -static int testchar(unsigned int timeout) -{ - int total, start; - //start = now(); - - _u32 i,j; - for(i=1000;i>0;i--) - for(j=500;j>0;j--) - //while(1) - { - if(tgt_testchar()) return 100; - //if( ((now()-start)%COUNT_COMPARE) > timeout ) break; - } - - return 0; -} -#endif -static int get_data(unsigned char *ptr,unsigned int len,unsigned int timeout) -{ - int i=0; - while(i0) - ptr[i++] = tgt_getchar(); - else break; //It doesn't receive data in 1 second. - } - - return i; -} -//CRC16 -static unsigned int calcrc(unsigned char *ptr, unsigned int count, _u8 crc_mode) -{ - _u16 crc = 0; - while (count--) - { - if(crc_mode) - crc = _crc_xmodem_update(crc,*ptr++); - else - { - crc += *ptr++ ; - crc &= 0xff; - } - } - - return crc; -} - -static int xmodem_transfer(_u32 base) -{ - unsigned int i; - _u16 crc; - unsigned int filesize=0; - unsigned char BlockCount=1; //ݿۼ(8λ뿼) - _u8 crc_mode = 1; - _u8 chr; -#if LS1D_FPGA - _u32 addr_w = base; - _u32 length = 128; -#endif - unsigned char STATUS; //״̬ - STATUS = ST_WAIT_START; //='d''D',XMODEM - while(1) - { - chr = crc_mode?XMODEM_WAIT_CHAR:XMODEM_NAK ; - tgt_putchar(chr); - if(testchar(80)>0)break; //5 seconds timeout - crc_mode += 1; - crc_mode %= 2; - } //send 'c' first, if there is no respond, then send NAK. - - struct str_XMODEM strXMODEM; //XMODEMĽݽṹ - while(STATUS!=ST_OK) //ѭգֱȫ - { -/**********************************************************************************************************************************************************************************************************************************************************************************************************************************************/ - i = get_data(&strXMODEM.SOH, BLOCKSIZE+5, 1); // 1/16 second timeout, it'll affect the total time of download. - -/**********************************************************************************************************************************************************************************************************************************************************************************************************************************************/ - if(i) - { - //ݰĵһ SOH/EOT/CAN - switch(strXMODEM.SOH) - { - case XMODEM_SOH: //յʼSOH - if (i>=(crc_mode?(BLOCKSIZE+5):(BLOCKSIZE+4))) - { - STATUS=ST_BLOCK_OK; - } - else - { - STATUS=ST_BLOCK_FAIL; //ݲ㣬Ҫطǰݿ - tgt_putchar(XMODEM_NAK); - } - break; - case XMODEM_EOT: //յEOT - tgt_putchar(XMODEM_ACK); //֪ͨPCȫյ - STATUS=ST_OK; - break; - case XMODEM_CAN: //յȡCAN - tgt_putchar(XMODEM_ACK); //ӦPC - STATUS=ST_OK; - break; - default: //ʼֽڴ - tgt_putchar(XMODEM_NAK); //Ҫطǰݿ - STATUS=ST_BLOCK_FAIL; - break; - } - } - else - { - break; - //tgt_putchar(XMODEM_NAK); //ݿŴҪطǰݿ - //continue; - } - - if (STATUS==ST_BLOCK_OK) //133ֽOKʼֽȷ - { - if (BlockCount != strXMODEM.BlockNo)//˶ݿȷ - { - tgt_putchar(XMODEM_NAK); //ݿŴҪطǰݿ - continue; - } - if (BlockCount !=(unsigned char)(~strXMODEM.nBlockNo)) - { - tgt_putchar(XMODEM_NAK); //ݿŷҪطǰݿ - continue; - } - - if(crc_mode) - { - crc = strXMODEM.CRC16hi<<8; - crc += strXMODEM.CRC16lo; - } - else - { - crc = strXMODEM.CRC16hi; - } - - if(calcrc(&strXMODEM.Xdata[0], BLOCKSIZE, crc_mode)!=crc) - { - tgt_putchar(XMODEM_NAK); //CRCҪطǰݿ - continue; - } - -#if LS1D_FPGA - _u32 addr_r = (_u32)&strXMODEM.Xdata[0]; - spiflash_write(addr_w, addr_r, length); - addr_w += length; -#else - //Flash_Write(base+filesize, &buf[0],32) ; -#endif - - filesize += 128; - tgt_putchar(XMODEM_ACK); //Ӧȷյһݿ - BlockCount++; //ݿۼƼ1 - } - } - - //printf("xmodem finished\n"); - - return filesize; -} - - -_u32 xmodem() -{ - _u32 base = FLASH_ERASE_START; - int file_size; - - //printf("Waiting for serial transmitting datas...\n"); -#if LS1D_FPGA - _u32 addr_start = FLASH_ERASE_START; - _u32 addr_end = FLASH_ERASE_END; - spiflash_erase(addr_start, addr_end); -#endif - file_size = xmodem_transfer(base); - //printf("Load successfully! Start at 0x%x, size 0x%x\n", base, file_size); - - return 0; -} - - diff --git a/resources/soc/simu/soft/func/start.S b/resources/soc/simu/soft/func/start.S deleted file mode 100644 index fe6f115..0000000 --- a/resources/soc/simu/soft/func/start.S +++ /dev/null @@ -1,657 +0,0 @@ - -/************************************************************************************************************************************************************************************************/ - -#include "include/asm/regdef.h" -#include "include/asm/mipsregs.h" -#include "include/asm/ns16550.h" -#include "include/asm/interrupt.h" - -#define NAND_TEST -#define SRAM_BASEADDR 0xa0000000 -#define UART0_BASEADDR 0xbfe40000 -#define NAND_BASEADDR 0xbfe48000 -#define CONFIG_BASE 0xaff00000 -#define MAC_BASEADDR 0xbff00000 -#define CONFREG_BASE 0xbfd00000 - -#define DELAY 0x4 -#define print_hex 1 -#define print_reg 0 -#define PRINTSTR(x) \ - .rdata;98: .asciz x; .text; la a0, 98b; bal stringserial; nop -#define PRINT(x) \ - .rdata; .text; la a0, x; bal stringserial; nop -#define RVECENT(f,n) \ - b f; \ - nop -#define XVECENT(f,bev) \ - b f; \ - nop - - .set noreorder - - .globl _start - .text -_start: - RVECENT(reset,0) /* hard-reset entry point */ - RVECENT(reset,1) /* software reboot */ - RVECENT(romReserved,2) - RVECENT(romReserved,3) - RVECENT(romReserved,4) - RVECENT(romReserved,5) - RVECENT(romReserved,6) - RVECENT(romReserved,7) - RVECENT(romReserved,8) - RVECENT(romReserved,9) - RVECENT(romReserved,10) - RVECENT(romReserved,11) - RVECENT(romReserved,12) - RVECENT(romReserved,13) - RVECENT(romReserved,14) - RVECENT(romReserved,15) - RVECENT(romReserved,16) - RVECENT(romReserved,17) - RVECENT(romReserved,18) - RVECENT(romReserved,19) - RVECENT(romReserved,20) - RVECENT(romReserved,21) - RVECENT(romReserved,22) - RVECENT(romReserved,23) - RVECENT(romReserved,24) - RVECENT(romReserved,25) - RVECENT(romReserved,26) - RVECENT(romReserved,27) - RVECENT(romReserved,28) - RVECENT(romReserved,29) - RVECENT(romReserved,30) - RVECENT(romReserved,31) - RVECENT(romReserved,32) - RVECENT(romReserved,33) - RVECENT(romReserved,34) - RVECENT(romReserved,35) - RVECENT(romReserved,36) - RVECENT(romReserved,37) - RVECENT(romReserved,38) - RVECENT(romReserved,39) - RVECENT(romReserved,40) - RVECENT(romReserved,41) - RVECENT(romReserved,42) - RVECENT(romReserved,43) - RVECENT(romReserved,44) - RVECENT(romReserved,45) - RVECENT(romReserved,46) - RVECENT(romReserved,47) - RVECENT(romReserved,48) - RVECENT(romReserved,49) - RVECENT(romReserved,50) - RVECENT(romReserved,51) - RVECENT(romReserved,52) - RVECENT(romReserved,53) - RVECENT(romReserved,54) - RVECENT(romReserved,55) - RVECENT(romReserved,56) - RVECENT(romReserved,57) - RVECENT(romReserved,58) - RVECENT(romReserved,59) - RVECENT(romReserved,60) - RVECENT(romReserved,61) - RVECENT(romReserved,62) - RVECENT(romReserved,63) - XVECENT(romExcHandle,0x200) /* bfc00200: R4000 tlbmiss vector */ - RVECENT(romReserved,65) - RVECENT(romReserved,66) - RVECENT(romReserved,67) - RVECENT(romReserved,68) - RVECENT(romReserved,69) - RVECENT(romReserved,70) - RVECENT(romReserved,71) - RVECENT(romReserved,72) - RVECENT(romReserved,73) - RVECENT(romReserved,74) - RVECENT(romReserved,75) - RVECENT(romReserved,76) - RVECENT(romReserved,77) - RVECENT(romReserved,78) - RVECENT(romReserved,79) - XVECENT(romExcHandle,0x280) /* bfc00280: R4000 xtlbmiss vector */ - RVECENT(romReserved,81) - RVECENT(romReserved,82) - RVECENT(romReserved,83) - RVECENT(romReserved,84) - RVECENT(romReserved,85) - RVECENT(romReserved,86) - RVECENT(romReserved,87) - RVECENT(romReserved,88) - RVECENT(romReserved,89) - RVECENT(romReserved,90) - RVECENT(romReserved,91) - RVECENT(romReserved,92) - RVECENT(romReserved,93) - RVECENT(romReserved,94) - RVECENT(romReserved,95) - XVECENT(romExcHandle,0x300) /* bfc00300: R4000 cache vector */ - RVECENT(romReserved,97) - RVECENT(romReserved,98) - RVECENT(romReserved,99) - RVECENT(romReserved,100) - RVECENT(romReserved,101) - RVECENT(romReserved,102) - RVECENT(romReserved,103) - RVECENT(romReserved,104) - RVECENT(romReserved,105) - RVECENT(romReserved,106) - RVECENT(romReserved,107) - RVECENT(romReserved,108) - RVECENT(romReserved,109) - RVECENT(romReserved,110) - RVECENT(romReserved,111) -#if 0 - XVECENT(IntHandle,0x380) /* bfc00380: R4000 general vector */ -#else -IntHandle: - SAVE_ALL -# PRINTSTR("Interrupt 0 is coming...\r\n") -#if 1 // print_reg -# bal PRINT_CP0 -# nop -#endif - -7: - mfc0 t0, CP0_CAUSE - and t1, t0, 0x400 - bne zero, t1, 1f - nop - and t1, t0, 0x800 - bne zero, t1, 2f - nop - and t1, t0, 0x1000 - bne zero, t1, 3f - nop - and t1, t0, 0x2000 - bne zero, t1, 4f - nop - and t1, t0, 0x4000 - bne zero, t1, 5f - nop - and t1, t0, 0x8000 - bne zero, t1, 6f - nop - #PRINTSTR("No interrupt left...\r\n\r\n") - b 8f - nop - -1: /*timer*/ -# PRINTSTR("Timer interrupt is coming...\r\n") - -2: /*key*/ -# PRINTSTR("Key interrupt is coming...\r\n") - -3: /*batfail*/ -# PRINTSTR("BatFail interrupt is coming...\r\n") - -4: /*res_valid*/ -# PRINTSTR("ResVaild interrupt is coming...\r\n") - -5: /*INTC*/ -# PRINTSTR("IP6 is coming...\r\n") - -6: /*Ring*/ -# PRINTSTR("IP7 is coming...\r\n") - -8: - LOAD_ALL - .set mips32 - eret - .set mips1 - nop -#endif - - RVECENT(romReserved,113) - RVECENT(romReserved,114) - RVECENT(romReserved,115) - RVECENT(romReserved,116) - RVECENT(romReserved,116) - RVECENT(romReserved,118) - RVECENT(romReserved,119) - RVECENT(romReserved,120) - RVECENT(romReserved,121) - RVECENT(romReserved,122) - RVECENT(romReserved,123) - RVECENT(romReserved,124) - RVECENT(romReserved,125) - RVECENT(romReserved,126) - RVECENT(romReserved,127) - - /* We hope there are no more reserved vectors! - * 128 * 8 == 1024 == 0x400 - * so this is address R_VEC+0x400 == 0xbfc00400 - */ - .align 4 -#if print_hex - .rdata -hexchar: - .ascii "0123456789abcdef" - .text //Don't forget it! -#endif - -reset: - mtc0 zero, CP0_CAUSE # - li t0, 0x30400000 - mtc0 t0, CP0_STATUS # - li t0, 0x00000000 #set fp reg - /* Initialize $gp. - */ - bal 1f - nop - .word _gp -1: - lw gp, 0(ra) - - bal initserial0 - nop - - PRINTSTR("\r\nInitializing...\r\n"); - PRINTSTR("\r\nHello, Loongson...\r\n"); - - li t0, 0xbfd00010 - lw t1,0(t0) - ori t1, t1, 0x0 - sw t1,0(t0) -################################################### -#####nand test -##### -#ifdef NAND_TEST - bal nand_test - nop -## PRINTSTR("\r\nGouSheng!!!\r\n"); -#endif -##### -#####nand test -################################################### - - - PRINTSTR("\r\nMac_test start...\r\n"); - bal mac_test - nop - PRINTSTR("\r\nMac_test end...\r\n"); - // bal ddr2_config //old ddr config - // nop - - la v0, SRAM_BASEADDR - li t0, 0x0a424242 - sw t0, 0x0(v0) - la a0, 0x0(v0) - bal stringserial - nop - - la a0, loongson - bal stringserial - nop - - la v0, SRAM_BASEADDR - li t0, 0x0a454545 - sw t0, 0x0(v0) - la a0, 0x0(v0) - bal stringserial - nop - - -###ddr3 test -# if 1 -#####write data to sram - .align 5 - la v0, SRAM_BASEADDR - la s0, SRAM_BASEADDR+0x00000100 - li t0, 0x11111111 - li t1, 0x21212121 - li t2, 0x31313131 - li t3, 0x41414141 - li t4, 0x51515151 - li t5, 0x61616161 - li t6, 0x71717171 - li t7, 0x81818181 -1: - sw t0, 0x0(v0) - sw t1, 0x4(v0) - sw t2, 0x8(v0) - sw t3, 0xc(v0) - sw t4, 0x10(v0) - sw t5, 0x14(v0) - sw t6, 0x18(v0) - sw t7, 0x1c(v0) - addiu v0, v0, 0x20 - bne v0, s0, 1b - nop - -#####read data from sram - la v0, SRAM_BASEADDR -2: - lw t8, 0x0(v0) - beq t0, t8, 1f - nop - jal checkerr - nop -1: - lw t8, 0x4(v0) - beq t1, t8, 1f - nop - jal checkerr - nop -1: - lw t8, 0x8(v0) - beq t2, t8, 1f - nop - jal checkerr - nop -1: - lw t8, 0xc(v0) - beq t3, t8, 1f - nop - jal checkerr - nop -1: - lw t8, 0x10(v0) - beq t4, t8, 1f - nop - jal checkerr - nop -1: - lw t8, 0x14(v0) - beq t5, t8, 1f - nop - jal checkerr - nop -1: - lw t8, 0x18(v0) - beq t6, t8, 1f - nop - jal checkerr - nop -1: - lw t8, 0x1c(v0) - beq t7, t8, 1f - nop - jal checkerr - nop -1: - addiu v0, v0, 0x20 - bne v0, s0, 2b - nop - -#endif - -# la a0, 0x0(v0) -# bal stringserial -# nop -# la a0, 0x4(v0) -# PRINTSTR("\r\nHello, Loongson again...\r\n"); -# la a0, loongsonagain -# bal stringserial -# nop - - - -100: -#if 0 - /********enable interrupt**********/ - mfc0 t0, CP0_STATUS - li t1, 0xffff00fe - and t2, t0, t1 - li t1, 0xfc01 - or t0, t2, t1 - mtc0 t0, CP0_STATUS -#endif - li t0, SRAM_BASEADDR+0xffc - la sp, 0(t0) # - - la t9, main - jr t9 - nop - -1: - b 1b - nop - -/*********************************************************************************/ -##### mac func start - .align 5 - .ent mac_test -mac_test: -# addi sp, sp, 0xfffc -# sw ra, 0(sp) - move a3, ra -#read descriptor - li a2, 0xa0701100 - li a1, 0x80000000 - sw a1, 0x00(a2) - li a1, 0x00000100 - sw a1, 0x04(a2) - li a1, 0x007027f0 - sw a1, 0x08(a2) - -#start read process - li a2, MAC_BASEADDR - li a1, 0x0 - sw a1, 0x0(a2) - li a1, 0x00701000 - sw a1, 0x20(a2) - li a1, 0x00701100 - sw a1, 0x18(a2) - li a1, 0x40000002 - sw a1, 0x30(a2) - -#write gpio to enable virtual mac sw - li a0, 0x10 - li a1, CONFREG_BASE - sb a0, 0(a1) - sb a0, 0x10(a1) - -#detect read frame -read_interrupt: - lw a1, 0x28(a2) - li a0, 0xa0700010 - and a0, a1, 0x40 - beqz a0, read_interrupt - nop - -#write descriptor - - li a2, 0xa0701000 - li a1, 0x80000000 - sw a1, 0x00(a2) - li a1, 0x62000100 - sw a1, 0x04(a2) - li a1, 0x007027f0 - sw a1, 0x08(a2) - -#start write process - li a2, MAC_BASEADDR - li a1, 0x00701000 - sw a1, 0x20(a2) - li a1, 0x00701100 - sw a1, 0x18(a2) - li a1, 0x40002002 - sw a1, 0x30(a2) - - j a3 - nop - .end mac_test -##### mac func end - -initserial0: - la v0, UART0_BASEADDR -1: - li v1, FIFO_ENABLE|FIFO_RCV_RST|FIFO_XMT_RST|FIFO_TRIGGER_4 - sb v1, NSREG(NS16550_FIFO)(v0) - li v1, CFCR_DLAB #DLAB - sb v1, NSREG(NS16550_CFCR)(v0) - li v1, 0xCF - sb v1, NSREG(NS16550_FIFO)(v0) - li v1, 0x23 #set BRDL 57600Baut - sb v1, NSREG(NS16550_DATA)(v0) - srl v1, 8 #no necessary - sb v1, NSREG(NS16550_IER)(v0) #set BRDH #no necessary - li v1, CFCR_8BITS #8bit, 1stop - sb v1, NSREG(NS16550_CFCR)(v0) - li v1, MCR_DTR|MCR_RTS - sb v1, NSREG(NS16550_MCR)(v0) - li v1, 0x0 - sb v1, NSREG(NS16550_IER)(v0) - - move v1, v0 - la v0, UART0_BASEADDR - bne v0, v1, 1b - nop - - j ra - nop - - - - -tgt_putchar: - la v0, UART0_BASEADDR -1: - lbu v1, NSREG(NS16550_LSR)(v0) - and v1, LSR_TXRDY - beqz v1, 1b - nop - - sb a0, NSREG(NS16550_DATA)(v0) - move v1,v0 - la v0, UART0_BASEADDR - bne v0,v1,1b - nop - j ra - nop - -#if print_hex -hexserial: - nop - move a2, ra - move a1, a0 - li a3, 8 -1: - rol a0, a1, 4 - move a1, a0 - and a0, 0xf - la v0, hexchar - addu v0, a0 - lbu a0, 0(v0) - bal tgt_putchar - nop - - addi a3, -1 - bnez a3, 1b - nop - - j a2 - nop -#endif - -PRINT_CP0: -#if print_hex - move t0, ra - PRINTSTR("STATUS=0x") - mfc0 a0, CP0_STATUS - bal hexserial - nop - PRINTSTR("\r\n") - - PRINTSTR("CAUSE=0x") - mfc0 a0, CP0_CAUSE - bal hexserial - nop - PRINTSTR("\r\n") - - j t0 - nop -#endif - - -/*******************************************************************/ - - /* Exception handlers. - */ -romReserved: - PRINTSTR("Interrupt 1 is coming...\r\n") - b romReserved - nop - -romExcHandle: - PRINTSTR("Interrupt 2 is coming...\r\n") - b romExcHandle - nop - -ddr2_config: - li t0, 0xbfd00000 - li t1, 0x1 - sw t1, 0x0(t0) - - ##########start######## - li t2, CONFIG_BASE - li a1, 0x1 - sb a1, 0x18(t2) - ####################### - -1: - lb a1, 0x163(t2) - beqz a1, 1b - nop - - li t0, 0xbfd00000 - li t1, 0x0 - sw t1, 0x0(t0) - - jr ra - nop - - .global stringserial - .ent stringserial -stringserial: - move a2, ra - move a1, a0 - lbu a0, 0(a1) -1: - beqz a0, 2f - nop - addiu a1, 1 - bal tgt_putchar - nop - lbu a0, 0(a1) - b 1b - nop -2: - j a2 - nop - .end stringserial - - .ent checkerr -checkerr: - la a0, errstr - bal stringserial - nop - jr ra - nop - .end checkerr - - .rdata - .align 5 -msg_nand_test_reset_begin: - .asciiz "rst\n" -msg_nand_test_reset_end: - .asciiz "nand rst pass\n" -msg_nand_test_write_begin: - .asciiz "nand wr go\n" -msg_nand_test_write_end: - .asciiz "nand write pass \n" -msg_nand_test_read_begin: - .asciiz "nand rd go\n" -msg_nand_test_read_end: - .asciiz "nand rd pass\n" -errstr: - .asciz "error" -loongson: - .asciz "Loongson Test\n" -loongsonagain: - .asciz "Loongson Test Twice" diff --git a/resources/soc/simu/soft/func/test.lds b/resources/soc/simu/soft/func/test.lds deleted file mode 100644 index b487f0d..0000000 --- a/resources/soc/simu/soft/func/test.lds +++ /dev/null @@ -1,72 +0,0 @@ -/* - * (C) Masami Komiya 2004 - * - * (C) Copyright 2003 - * Wolfgang Denk Engineering, - * - * See file CREDITS for list of people who contributed to this - * project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA - */ - -OUTPUT_FORMAT("elf32-tradlittlemips", "elf32-tradlittlemips", "elf32-tradlittlemips") - -OUTPUT_ARCH(mips) -ENTRY(_start) -SECTIONS -{ - - . = ALIGN(4); - .text : - { - *(.text) - } - - . = ALIGN(4); - .rel.text : { *(.rel.text) } - - . = ALIGN(4); - .rodata : { *(.rodata) } - - . = ALIGN(4); - .data : { *(.data) } - - . = ALIGN(4); - .reginfo : { *(.reginfo) } - - . = ALIGN(4); - .ptr : { *(.ptr) } - - . = ALIGN(4); - .shstrtab : { *(.shstrtab) } - - . = ALIGN(4); - .strtab : { *(.strtab) } - - . = .; - _gp = ALIGN(16) + 0x7ff0; - .got : { - __got_start = .; - *(.got) - __got_end = .; - } - - . = 0xa0000000; - . = ALIGN(4); - .sbss : { *(.sbss) } - .bss : { *(.bss) . = ALIGN(4); } -} diff --git a/resources/soc/simu/testbench/MX25L6405D.v b/resources/soc/simu/testbench/MX25L6405D.v deleted file mode 100644 index 33ea9d0..0000000 --- a/resources/soc/simu/testbench/MX25L6405D.v +++ /dev/null @@ -1,2154 +0,0 @@ -// *============================================================================================== -// * -// * MX25L6405D.v - 64M-BIT CMOS Serial Flash Memory -// * -// * COPYRIGHT 2008 Macronix International Co., Ltd. -// *---------------------------------------------------------------------------------------------- -// * Environment : Cadence NC-Verilog -// * Reference Doc: MX25L1605D-3205D-6405D REV.1.1,MAY.12, 2008 -// * Creation Date: @(#)$Date: 2008/06/13 05:24:15 $ -// * Version : @(#)$Revision: 1.4 $ -// * Description : There is only one module in this file -// * module MX25L6405D->behavior model for the 64M-Bit flash -// *---------------------------------------------------------------------------------------------- -// * Note 1:model can load initial flash data from file when model define parameter Init_File = "xxx"; -// * xxx: initial flash data file name;default value xxx = "none", initial flash data is "FF". -// * Note 2:power setup time is tVSL = 200_000 ns, so after power up, chip can be enable. -// * Note 3:time delay to write instruction is tPUW = 10_000_000 ns. -// * Note 4:If define KGD product, Model support good ID read (Addr 0x3f Data 55h). -// * Note 5:If you have any question and suggestion, please send your mail to follow email address : -// * flash_model@mxic.com.tw -// *---------------------------------------------------------------------------------------------- -// * History -// * Date | Version Description -// * $Log: MX25L6405D.v,v $ -// * Revision 1.4 2008/06/13 05:24:15 simmodel -// * update fTSCLK=50MHz. -// * -// * Revision 1.3 2008/06/12 02:06:42 simmodel -// * disable KGD product define -// * -// * Revision 1.2 2008/03/04 16:32:05 simmodel -// * update DISWRSR -// * -// *============================================================================================== -// *============================================================================================== -// * timescale define -// *============================================================================================== -`timescale 1ns / 100ps - -// *============================================================================================== -// * product parameter define -// *============================================================================================== - /*----------------------------------------------------------------------*/ - /* Define controller STATE */ - /*----------------------------------------------------------------------*/ - `define STANDBY_STATE 0 - `define ACTION_STATE 1 - `define CMD_STATE 2 - `define BAD_CMD_STATE 3 - - `define MX25L6405D - // `define MX25L6405D - // `define MX25L6415D - `ifdef MX25L6405D - `define PADOP1 1'b0 - `endif - - `ifdef MX25L6415D - `define PADOP1 1'b1 - `endif - - `define KGD_PRODUCT 1'b0 - -module MX25L6405D( SCLK, - CS, - SI, - SO, - WP, - HOLD ); - -// *============================================================================================== -// * Declaration of ports (input, output, inout) -// *============================================================================================== - input SCLK; // Signal of Clock Input - input CS; // Chip select (Low active) - inout SI; // Serial Input/Output SIO0 - inout SO; // Serial Input/Output SIO1 - input WP; // Hardware write protection - input HOLD; // Pause the chip without diselecting the chip - -// *============================================================================================== -// * Declaration of parameter (parameter) -// *============================================================================================== - /*----------------------------------------------------------------------*/ - /* Density STATE parameter */ - /*----------------------------------------------------------------------*/ - parameter A_MSB = 22, - TOP_Add = 23'h7fffff, - Secur_TOP_Add = 7'h7f, - Sector_MSB = 10, - Block_MSB = 6, - Block_NUM = 128, - PRO_128K_Beg = 23'h7d0000, - PRO_128K_End = 23'h7effff; - - /*----------------------------------------------------------------------*/ - /* Define ID Parameter */ - /*----------------------------------------------------------------------*/ - parameter ID_MXIC = 8'hc2, - ID_Device = `PADOP1? 8'h1e : 8'h16, - Memory_Type = `PADOP1? 8'h22 : 8'h20, - Memory_Density = 8'h17; - - /*----------------------------------------------------------------------*/ - /* Define Initial Memory File Name */ - /*----------------------------------------------------------------------*/ - parameter Init_File = "none"; // initial flash data - - /*----------------------------------------------------------------------*/ - /* AC Charicters Parameter */ - /*----------------------------------------------------------------------*/ - parameter tSHQZ = 8, // CS High to SO Float Time [ns] - tCLQV = 8, // Clock Low to Output Valid - tHHQX = 8, // HOLD to Output Low-z - tHLQZ = 8, // HOLD to Output High-z - tDP = 10_000, - tRES1 = 8_800, - tRES2 = 8_800; - parameter tREP0 = 100, // 100ns Reset# recovery time (during read algorithm) - // to read or write - tREP1 = 50_000; // 50us Reset# recovery time (during program/erase algorithm) - // to read or write - //tOHZ = 10, // 10ns PR# goes high and SCLK falling to data out - //tRD = 10; // 10ns PR# goes high and SCLK falling to data out - parameter tAA = 50; // 50ns Parallel mode read time - parameter tBP = 9_000; // Byte program time - parameter tSE = 90_000_000, // Sector erase time - tBE = 700_000_000, // Block erase time - tCE = 50_000, // unit is ms instead of ns - tPP = 1_400_000, // Program time - tW = 40_000_000, // Write Status time - tPUW = 10_000_000, // Time delay to write instruction - tVSL = 20; // Time delay to chip select allowed - //smh tVSL = 200_000; // Time delay to chip select allowed - - specify - specparam tSCLK = 12, // Clock Cycle Time [ns] - fSCLK = 86, // Clock Frequence except READ instruction[ns] 15pF - tRSCLK = 30, // Clock Cycle Time for READ instruction[ns] 15pF - fRSCLK = 33, // Clock Frequence for READ instruction[ns] 15pF - tCH = 5.5, // Clock High Time (min) [ns] - tCL = 5.5, // Clock Low Time (min) [ns] - tSLCH = 5, // CS# Active Setup Time (relative to SCLK) (min) [ns] - tCHSL = 5, // CS# Not Active Hold Time (relative to SCLK)(min) [ns] - tSHSL = 100, // CS High Time (min) [ns] - tDVCH = 2, // SI Setup Time (min) [ns] - tCHDX = 5, // SI Hold Time (min) [ns] - tCHSH = 5, // CS# Active Hold Time (relative to SCLK) (min) [ns] - tSHCH = 5, // CS# Not Active Setup Time (relative to SCLK) (min) [ns] - tHLCH = 5, // HOLD# Setup Time (relative to SCLK) (min) [ns] - tCHHH = 5, // HOLD# Hold Time (relative to SCLK) (min) [ns] - tHHCH = 5, // HOLD Setup Time (relative to SCLK) (min) [ns] - tCHHL = 5, // HOLD Hold Time (relative to SCLK) (min) [ns] - tWHSL = 20, // Write Protection Setup Time - tSHWL = 100, // Write Protection Hold Time - tCLHS = 3, // Clock Low to HOLD# setup time - tCLHH = 3; // Clock Low to HOLD# hold time - specparam tTSCLK = 20, // Clock Cycle Time for 2XI/O READ instruction[ns] 15pF - fTSCLK = 50; // Clock Frequence for 2XI/O READ instruction[ns] 15pF - - endspecify - - /*----------------------------------------------------------------------*/ - /* Define Command Parameter */ - /*----------------------------------------------------------------------*/ - parameter WREN = 8'h06, // WriteEnable - WRDI = 8'h04, // WriteDisable - RDID = 8'h9F, // ReadID - RDSR = 8'h05, // ReadStatus - WRSR = 8'h01, // WriteStatus - READ1X = 8'h03, // ReadData - FASTREAD1X = 8'h0b, // FastReadData - SE = 8'h20, // SectorErase - CE1 = 8'h60, // ChipErase - CE2 = 8'hc7, // ChipErase - PP = 8'h02, // PageProgram - DP = 8'hb9, // DeepPowerDown - RDP = 8'hab, // ReleaseFromDeepPowerDwon - RES = 8'hab, // ReadElectricID - REMS = 8'h90; // ReadElectricManufacturerDeviceID - parameter RDPR = 8'ha1, // Read parameter register - WRPR = 8'hf1; // Write parameter register - parameter BE = 8'hd8, // BlockErase - READ2X = 8'hbb, // 2X Read - CP = 8'had, // Continuously program mode; - REMS2 = 8'hef, // ReadElectricManufacturerDeviceID - ENSO = 8'hb1, // Enter secured OTP; - EXSO = 8'hc1, // Exit secured OTP; - RDSCUR = 8'h2b, // Read security register; - WDSCUR = 8'h2f, // Write security register; - WRLB = 8'h21, // Write read-lock register; - ESRY = 8'h70, // Enable SO to output RY/BY; - DSRY = 8'h80; // Disable SO to output RY/BY; - - /*----------------------------------------------------------------------*/ - /* Declaration of internal-register (reg) */ - /*----------------------------------------------------------------------*/ - reg [7:0] ARRAY[0:TOP_Add]; // memory array - reg [7:0] Status_Reg; // Status Register - reg [7:0] CMD_BUS; - reg [6:0] PO_Reg; - reg [6:0] Latch_PO; - reg Latch_SO; - reg [23:0] SI_Reg; // temp reg to store serial in - reg [7:0] Dummy_A[0:255]; // page size - reg [A_MSB:0] Address; - reg [Sector_MSB:0] Sector; - reg [Block_MSB:0] Block; - reg [2:0] STATE; - - reg EN_S0; //EN_S0 fSCLK Serial AC Characteristics; - reg EN_P0; //EN_P0 fSCLK parallel AC Characteristics; - reg EN_S1; //EN_S1 fRSCLK Serial AC Characteristics; - reg EN_P1; //EN_P1 fRSCLK parallel AC Characteristics; - reg SIO1_Reg; - reg Write_EN; - reg Read_EN; - reg P_Mode; // parallel mode - reg DP_Mode; // deep power down mode - reg Read_Mode; - reg Read_1XIO_Mode; - reg Read_1XIO_Chk; - reg FastRD_1XIO_Mode; - reg PP_1XIO_Mode; - reg SE_4K_Mode; - reg BE_Mode; - reg CE_Mode; - reg WRSR_Mode; - reg RES_Mode; - reg REMS_Mode; - reg SCLK_EN; - reg HOLD_OUT_B; - reg SO_OUT_EN; // for SO - reg SI_IN_EN; // for SI - wire HOLD_B_INT; - wire WP_B_INT; - wire ISCLK; - wire WIP; - wire WEL; - wire SRWD; - wire Dis_CE, Dis_WRSR; - event WRSR_Event; - event BE_Event; - event SE_4K_Event; - event CE_Event; - event PP_Event; - event RDP_Event; - event DP_Event; - integer i; - integer j; - integer Bit; - integer Bit_Tmp; - integer Start_Add; - integer End_Add; - integer Page_Size; - time tRES; - - reg [7:0] Param_Reg; // Parameter register - wire RESET_B; - - reg [7:0] Secur_ARRAY[0:Secur_TOP_Add]; // Secured OTP - reg [7:0] Secur_Reg; // security register - reg [15:0] CP_Data; - - reg Secur_Mode; // enter secured mode - reg CP_ESRY_Mode; - reg EN_CP_Mode; - reg CP_Mode; - reg Read_2XIO_Mode; - reg Read_2XIO_Chk; - reg SE_1K_Mode; - reg Byte_PGM_Mode; //Program one byte is 7us - reg SI_OUT_EN; // for SI - reg SO_IN_EN; // for SO - reg SIO0_Reg; - wire CP_Busy; - event CP_Event; - event WRSCUR_Event; - event SE_1K_Event; - - - - /*----------------------------------------------------------------------*/ - /* initial variable value */ - /*----------------------------------------------------------------------*/ - initial begin - reset_sm; - Secur_Reg = 8'b0000_0000; - end - - task reset_sm; - begin - Status_Reg = 8'b0000_0000; - SO_OUT_EN = 1'b0; // SO output enable - SI_IN_EN = 1'b0; // SI input enable - CMD_BUS = 8'b0000_0000; - Address = 0; - i = 0; - j = 0; - Bit = 0; - Bit_Tmp = 0; - Start_Add = 0; - End_Add = 0; - Page_Size = 256; - DP_Mode = 1'b0; - P_Mode = 1'b0; - Write_EN = 1'b0; - Read_EN = 1'b0; - SCLK_EN = 1'b1; - Read_Mode = 1'b0; - Read_1XIO_Mode = 1'b0; - Read_1XIO_Chk = 1'b0; - PP_1XIO_Mode = 1'b0; - SE_4K_Mode = 1'b0; - BE_Mode = 1'b0; - CE_Mode = 1'b0; - WRSR_Mode = 1'b0; - RES_Mode = 1'b0; - REMS_Mode = 1'b0; - FastRD_1XIO_Mode = 1'b0; - HOLD_OUT_B = 1'b1; - {EN_S0, EN_P0, EN_S1, EN_P1} = {1'b1, 1'b0, 1'b0, 1'b0}; - Param_Reg = 8'b0000_0000; - SI_OUT_EN = 1'b0; // SI output enable - SO_IN_EN = 1'b0; // SO input enable - CP_Data = 8'b0000_0000; - Secur_Mode = 1'b0; - CP_ESRY_Mode = 1'b0; - EN_CP_Mode = 1'b0; - CP_Mode = 1'b0; - Read_2XIO_Mode = 1'b0; - Read_2XIO_Chk = 1'b0; - SE_1K_Mode = 1'b0; - Byte_PGM_Mode = 1'b0; - Secur_Reg[3:2] = 2'b00; - - - end - endtask // reset_sm - - /*----------------------------------------------------------------------*/ - /* initial flash data */ - /*----------------------------------------------------------------------*/ -//MX25L6405D #(.Init_File(`APP_FLASH)) - initial - begin : memory_initialize - for ( i = 0; i <= TOP_Add; i = i + 1 ) - ARRAY[i] = 8'hff; - if ( Init_File != "none" ) begin - $readmemh(Init_File,ARRAY) ; - $display("load Init_File %s, array[0..3]=%h %h %h %h", Init_File, - ARRAY[0],ARRAY[1],ARRAY[2],ARRAY[3]); - end - for( i = 0; i <= Secur_TOP_Add; i = i + 1 ) begin - Secur_ARRAY[i]=8'hff; - end - if ( `KGD_PRODUCT == 1'b1 ) begin - Secur_ARRAY[8'h3f]=8'h55; - end - end - -// *============================================================================================== -// * Input/Output bus opearation -// *============================================================================================== - assign ISCLK = (SCLK_EN == 1'b1) ? SCLK:1'b0; - assign HOLD_B_INT = (CS == 1'b0 && `PADOP1 == 1'b0 ) ? HOLD : 1'b1; - assign RESET_B = `PADOP1 == 1'b1 ? HOLD : 1'b1; - assign WP_B_INT = (CS == 1'b0 ) ? WP : 1'b1; - assign SO = (SO_OUT_EN && HOLD_OUT_B) ? SIO1_Reg : 1'bz ; - assign SI = (SI_OUT_EN && HOLD_OUT_B) ? SIO0_Reg : 1'bz ; - - - /*----------------------------------------------------------------------*/ - /* When CP_mode, Enable SO to output RY/BY; */ - /*----------------------------------------------------------------------*/ - assign CP_Busy = !(EN_CP_Mode && Status_Reg[0]); - always @ ( negedge CS or CP_Busy or ISCLK ) begin - if ( (EN_CP_Mode == 1) && (CS == 0) && (CP_ESRY_Mode == 1'b1) ) begin - SIO1_Reg <= #tCLQV CP_Busy; - SO_OUT_EN = 1'b1; - end - end - - /*----------------------------------------------------------------------*/ - /* When Hold Condtion Operation; */ - /*----------------------------------------------------------------------*/ - always @ ( HOLD_B_INT or negedge SCLK) begin - if ( HOLD_B_INT == 1'b0 && SCLK == 1'b0) begin - SCLK_EN =1'b0; - HOLD_OUT_B<= #tHLQZ 1'b0; - end - else if ( HOLD_B_INT == 1'b1 && SCLK == 1'b0) begin - SCLK_EN =1'b1; - HOLD_OUT_B<= #tHHQX 1'b1; - end - end - - /*----------------------------------------------------------------------*/ - /* When Reset Condtion Operation; */ - /*----------------------------------------------------------------------*/ - always @ ( RESET_B ) begin - if ( RESET_B == 1'b0 ) begin - disable write_status; - disable block_erase; - disable sector_erase_4k; - disable sector_erase_1k; - disable chip_erase; - disable page_program_mode; - disable cp_program; - disable write_secur_register; - disable deep_power_down; - disable release_from_deep_power_down; - disable read_1xio; - disable read_2xio; - disable fastread_1xio; - disable read_electronic_id; - disable read_electronic_manufacturer_device_id; - disable read_function; - disable dummy_cycle; - SO_OUT_EN <=#tSHQZ 1'b0; - SI_OUT_EN <=#tSHQZ 1'b0; - end - else begin - if ( Status_Reg[0] == 1'b1 ) - STATE <= #tREP1 `STANDBY_STATE; - else - STATE <= #tREP0 `STANDBY_STATE; - reset_sm; - end - end - /*----------------------------------------------------------------------*/ - /* When Secur_Mode, Page_Size 256-->64 */ - /*----------------------------------------------------------------------*/ - always @ ( Secur_Mode ) begin - Page_Size = (Secur_Mode == 1) ? 64 : 256; - end - - -// *============================================================================================== -// * Finite State machine to control Flash operation -// *============================================================================================== - /*----------------------------------------------------------------------*/ - /* power on */ - /*----------------------------------------------------------------------*/ - initial begin - Write_EN <= #tPUW 1'b1;// Time delay to write instruction - Read_EN <= #tVSL 1'b1;// Time delay to chip select allowed - end - - /*----------------------------------------------------------------------*/ - /* Command Decode */ - /*----------------------------------------------------------------------*/ - assign WIP = Status_Reg[0] ; - assign WEL = Status_Reg[1] ; - assign SRWD = Status_Reg[7] ; - assign Dis_CE = Status_Reg[5] == 1'b1 || Status_Reg[4] == 1'b1 || - Status_Reg[3] == 1'b1 || Status_Reg[2] == 1'b1 ; - assign Dis_WRSR = (WP_B_INT == 1'b0 && Status_Reg[7] == 1'b1) || (Secur_Reg[3] == 1'b1) || Secur_Mode; - - - always @ ( negedge CS ) begin - SI_IN_EN = 1'b1; - end - - - always @ ( posedge ISCLK or posedge CS ) begin - #0; - if ( CS == 1'b0 ) begin - Bit_Tmp = Bit_Tmp + 1; - Bit = Bit_Tmp - 1; - - if ( SI_IN_EN == 1'b1 && SO_IN_EN == 1'b1 ) begin - SI_Reg[23:0] = {SI_Reg[21:0], SO, SI}; - end - else begin - SI_Reg[23:0] = {SI_Reg[22:0], SI}; - end - end - if ( Bit == 7 && CS == 1'b0 ) begin - STATE = `CMD_STATE; - CMD_BUS = SI_Reg[7:0]; - //$display( $time,"SI_Reg[7:0]= %h ", SI_Reg[7:0] ); - end - - case ( STATE ) - `STANDBY_STATE: - begin - end - - `CMD_STATE: - begin - case ( CMD_BUS ) - WREN: - begin - if ( !DP_Mode && !EN_CP_Mode && !WIP && Write_EN ) begin - if ( CS == 1'b1 && Bit == 7 ) begin - // $display( $time, " Enter Write Enable Function ..." ); - write_enable; - end - else if ( Bit > 7 ) - STATE <= `BAD_CMD_STATE; - end - else if ( Bit == 7 ) - STATE <= `BAD_CMD_STATE; - end - - WRDI: - begin - if ( !DP_Mode && !WIP && Read_EN ) begin - if ( CS == 1'b1 && Bit == 7 ) begin - // $display( $time, " Enter Write Disable Function ..." ); - write_disable; - end - else if ( Bit > 7 ) - STATE <= `BAD_CMD_STATE; - end - else if ( Bit == 7 ) - STATE <= `BAD_CMD_STATE; - end - - RDID: - begin - if ( !DP_Mode && !EN_CP_Mode && !WIP && Read_EN) begin - //$display( $time, " Enter Read ID Function ..." ); - read_id; - end - else if ( Bit == 7 ) - STATE <= `BAD_CMD_STATE; - end - - RDSR: - begin - if ( !DP_Mode && (EN_CP_Mode && CP_ESRY_Mode) == 1'b0 && Read_EN) begin - //$display( $time, " Enter Read Status Function ..." ); - read_status ; - end - else if ( Bit == 7 ) - STATE <= `BAD_CMD_STATE; - end - - WRSR: - begin - if ( !DP_Mode && !EN_CP_Mode && !WIP && WEL && Write_EN ) begin - if ( CS == 1'b1 && Bit == 15 && !Dis_WRSR ) begin - //$display( $time, " Enter Write Status Function ..." ); - ->WRSR_Event; - WRSR_Mode = 1'b1; - end - else if ( CS == 1'b1 && Bit < 15 || Bit > 15 ) - STATE <= `BAD_CMD_STATE; - end - else if ( Bit == 7 ) - STATE <= `BAD_CMD_STATE; - end - - READ1X: - begin - if ( !DP_Mode && !EN_CP_Mode && !WIP && Read_EN ) begin - //$display( $time, " Enter Read Data Function ..." ); - if ( Bit == 31 ) begin - Address = (Secur_Mode == 1) ? SI_Reg[5:0] : SI_Reg[A_MSB:0]; - end - Read_1XIO_Mode = 1'b1; - end - else if ( Bit == 7 ) - STATE <= `BAD_CMD_STATE; - end - - - FASTREAD1X: - begin - if ( !DP_Mode && !EN_CP_Mode && !WIP && Read_EN ) begin - //$display( $time, " Enter Fast Read Data Function ..." ); - if ( Bit == 31 ) begin - Address = (Secur_Mode == 1) ? SI_Reg[5:0] : SI_Reg[A_MSB:0]; - end - FastRD_1XIO_Mode = 1'b1; - end - else if ( Bit == 7 ) - STATE <= `BAD_CMD_STATE; - end - SE: - begin - if ( !DP_Mode && !EN_CP_Mode && !WIP && WEL && !Secur_Mode && Write_EN ) begin - if ( Bit == 31 ) begin - Address = SI_Reg[A_MSB:0]; - end - if ( CS == 1'b1 && Bit == 31 && write_protect(Address) == 1'b0 ) begin - //$display( $time, " Enter Sector Erase Function ..." ); - if ( (Param_Reg[0] == 1) && (Address[A_MSB:12] == 0) ) begin - ->SE_1K_Event; - SE_1K_Mode = 1'b1; - end - else begin - ->SE_4K_Event; - SE_4K_Mode = 1'b1; - end - end - else if ( CS == 1'b1 && Bit < 31 || Bit > 31 ) - STATE <= `BAD_CMD_STATE; - end - else if ( Bit == 7 ) - STATE <= `BAD_CMD_STATE; - end - - BE: - begin - if ( !DP_Mode && !EN_CP_Mode && !WIP && WEL && !Secur_Mode && Write_EN ) begin - if ( Bit == 31 ) begin - Address = SI_Reg[A_MSB:0] ; - end - if ( CS == 1'b1 && Bit == 31 && write_protect(Address) == 1'b0 ) begin - //$display( $time, " Enter Block Erase Function ..." ); - ->BE_Event; - BE_Mode = 1'b1; - end - else if ( CS == 1'b1 && Bit < 31 || Bit > 31 ) - STATE <= `BAD_CMD_STATE; - end - else if ( Bit == 7 ) - STATE <= `BAD_CMD_STATE; - end - - CE1, CE2: - begin - if ( !DP_Mode && !EN_CP_Mode && !WIP && WEL && !Secur_Mode && Write_EN ) begin - - if ( CS == 1'b1 && Bit == 7 && Dis_CE == 0 ) begin - //$display( $time, " Enter Chip Erase Function ..." ); - ->CE_Event; - CE_Mode = 1'b1 ; - end - else if ( Bit > 7 ) - STATE <= `BAD_CMD_STATE; - end - else if ( Bit == 7 ) - STATE <= `BAD_CMD_STATE; - end - - PP: - begin - if ( !DP_Mode && !EN_CP_Mode && !WIP && WEL && Write_EN ) begin - if ( Bit == 31 ) begin - Address = (Secur_Mode == 1) ? SI_Reg[5:0] : SI_Reg[A_MSB:0]; - end - - if ( Bit == 31 && (((write_protect(Address) == 1'b0) && (!Secur_Mode)) || - (Secur_Mode && (!(Secur_Reg[1] || Secur_Reg[0])))) ) begin - //$display( $time, " Enter Page Program Function ..." ); - ->PP_Event; - PP_1XIO_Mode = 1'b1; - end - else if ( CS == 1 && (Bit < 31 || ((Bit + 1) % 8 !== 0))) - STATE <= `BAD_CMD_STATE; - end - else if ( Bit == 7 ) - STATE <= `BAD_CMD_STATE; - end - - DP: - begin - if ( !WIP && !EN_CP_Mode && Read_EN ) begin - if ( CS == 1'b1 && Bit == 7 ) begin - //$display( $time, " Enter Deep Power Dwon Function ..." ); - ->DP_Event; - end - else if ( Bit > 7 ) - STATE <= `BAD_CMD_STATE; - end - else if ( Bit == 7 ) - STATE <= `BAD_CMD_STATE; - end - - - RDP, RES: - begin - if ( !WIP && !EN_CP_Mode && Read_EN ) begin - // $display( $time, " Enter Release from Deep Power Dwon Function ..." ); - RES_Mode = 1'b1; - if ( CS == 1'b1 ) begin - if ( Bit >= 38 ) begin - tRES = tRES2; - end - else begin - tRES = tRES1; - end - ->RDP_Event; - end - end - else if ( Bit == 7 ) - STATE <= `BAD_CMD_STATE; - end - - REMS, REMS2: - begin - if ( !DP_Mode && !EN_CP_Mode && !WIP && Read_EN ) begin - if ( Bit == 31 ) begin - Address = SI_Reg[A_MSB:0] ; - end - //$display( $time, " Enter Read Electronic Manufacturer & ID Function ..." ); - REMS_Mode = 1'b1; - end - else if ( Bit == 7 ) - STATE <= `BAD_CMD_STATE; - end - - WRPR: - begin - if ( !DP_Mode && !EN_CP_Mode && !WIP && WEL && Write_EN ) begin - if ( CS == 1'b1 && Bit == 15 ) begin - //$display( $time, " Enter Write Parameter Register Function ..." ); - write_parameter; - end - else if ( CS == 1'b1 && Bit < 15 || Bit > 15 ) - STATE <= `BAD_CMD_STATE; - end - else if ( Bit == 7 ) - STATE <= `BAD_CMD_STATE; - end - - RDPR: - begin - if ( !DP_Mode && (EN_CP_Mode && CP_ESRY_Mode) == 1'b0 && Read_EN) begin - //$display( $time, " Enter READ Parameter Register Function ..." ); - read_parameter; - end - else if ( Bit == 7 ) - STATE <= `BAD_CMD_STATE; - end - - READ2X: - begin - if ( !DP_Mode && !EN_CP_Mode && !WIP && Read_EN ) begin - //$display( $time, " Enter READX2 Function ..." ); - if ( Bit == 19 ) begin - Address = (Secur_Mode == 1) ? SI_Reg[5:0] : SI_Reg[A_MSB:0]; - end - Read_2XIO_Mode = 1'b1; - end - else if ( Bit == 7 ) - STATE <= `BAD_CMD_STATE; - end - - - CP: - begin - if ( !DP_Mode && !WIP && WEL && Write_EN ) begin - if ( EN_CP_Mode == 1'b0 && Bit == 31 ) begin - Address = (Secur_Mode == 1) ? SI_Reg[5:0] : SI_Reg[A_MSB:0]; - Address = {Address [A_MSB:1], 1'b0} ; - end - if ( ((EN_CP_Mode == 1'b0 && Bit == 47) || (EN_CP_Mode == 1'b1 && Bit == 23)) && - (( (write_protect(Address) == 1'b0 && (!Secur_Mode)) || - (Secur_Mode && (!(Secur_Reg[1] || Secur_Reg[0]))))) ) begin - //$display( $time, " Enter CP Mode Function ..." ); - ->CP_Event; - end - else if ( CS == 1'b1 && ((EN_CP_Mode == 1'b0 && Bit < 47) || - (EN_CP_Mode == 1'b1 && Bit < 23) || ((Bit + 1) % 8 !== 0))) - STATE <= `BAD_CMD_STATE; - end - else if ( Bit == 7 ) - STATE <= `BAD_CMD_STATE; - end - - WRLB: - begin - if ( !DP_Mode && !EN_CP_Mode && !WIP && WEL && `PADOP1 && Read_EN ) begin - if ( CS == 1'b1 && Bit == 15 ) begin - //$display( $time, " Enter WRLB Function ..." ); - write_lkbit; - end - else if ( CS == 1'b1 && Bit < 15 || Bit >15) - STATE <= `BAD_CMD_STATE; - end - else if ( Bit == 7 ) - STATE <= `BAD_CMD_STATE; - end - - ENSO: - begin - if ( !DP_Mode && !EN_CP_Mode && !WIP && Read_EN ) begin - - if ( CS == 1'b1 && Bit == 7 ) begin - //$display( $time, " Enter ENSO Function ..." ); - enter_secured_otp; - end - else if ( Bit > 7 ) - STATE <= `BAD_CMD_STATE; - end - else if ( Bit == 7 ) - STATE <= `BAD_CMD_STATE; - end - - EXSO: - begin - if ( !DP_Mode && !EN_CP_Mode && !WIP && Read_EN ) begin - if ( CS == 1'b1 && Bit == 7 ) begin - //$display( $time, " Enter EXSO Function ..." ); - exit_secured_otp; - end - else if ( Bit > 7 ) - STATE <= `BAD_CMD_STATE; - end - else if ( Bit == 7 ) - STATE <= `BAD_CMD_STATE; - end - - RDSCUR: - begin - if ( !DP_Mode && (EN_CP_Mode && CP_ESRY_Mode) == 1'b0 && Read_EN) begin - // $display( $time, " Enter Read Secur_Register Function ..." ); - read_Secur_Register; - end - else if ( Bit == 7 ) - STATE <= `BAD_CMD_STATE; - end - - - WDSCUR: - begin - if ( !DP_Mode && !EN_CP_Mode && !WIP && !Secur_Mode && Write_EN ) begin - if ( CS == 1'b1 && Bit == 7 ) begin - //$display( $time, " Enter WDSCUR Secur_Register Function ..." ); - ->WRSCUR_Event; - end - else if ( Bit > 7 ) - STATE <= `BAD_CMD_STATE; - end - else if ( Bit == 7 ) - STATE <= `BAD_CMD_STATE; - end - - ESRY: - begin - if ( !DP_Mode && !EN_CP_Mode && !WIP && Read_EN ) begin - if ( CS == 1'b1 && Bit == 7 ) begin - //$display( $time, " Enter ESRY Function ..." ); - read_ryby; - end - else if ( Bit > 7 ) - STATE <= `BAD_CMD_STATE; - end - else if ( Bit == 7 ) - STATE <= `BAD_CMD_STATE; - end - - DSRY: - begin - if ( !DP_Mode && !EN_CP_Mode && !WIP && Read_EN ) begin - if ( CS == 1'b1 && Bit == 7 ) begin - //$display( $time, " Enter DSRY Function ..." ); - disread_ryby; - end - else if ( Bit > 7 ) - STATE <= `BAD_CMD_STATE; - end - else if ( Bit == 7 ) - STATE <= `BAD_CMD_STATE; - end - default: - begin - STATE <= `BAD_CMD_STATE; - end - endcase - end - - `BAD_CMD_STATE: - begin - end - - default: - begin - STATE = `STANDBY_STATE; - end - endcase - - - if ( CS == 1'b1 ) begin - Bit = 1'b0; - Bit_Tmp = 1'b0; - SO_IN_EN = 1'b0; - SI_IN_EN = 1'b0; - - SO_OUT_EN <= #tSHQZ 1'b0; - SI_OUT_EN <= #tSHQZ 1'b0; - - Read_Mode = 1'b0; - RES_Mode = 1'b0; - REMS_Mode = 1'b0; - Read_1XIO_Mode = 1'b0; - Read_2XIO_Mode = 1'b0; - Read_1XIO_Chk = 1'b0; - Read_2XIO_Chk = 1'b0; - - FastRD_1XIO_Mode = 1'b0; - STATE <= #1 `STANDBY_STATE; - SIO0_Reg <= #tSHQZ 1'bx; - SIO1_Reg <= #tSHQZ 1'bx; - PO_Reg[6:0] <= #tSHQZ 7'bx; - #1; - disable read_1xio; - disable read_2xio; - disable fastread_1xio; - disable read_electronic_id; - disable read_electronic_manufacturer_device_id; - disable read_function; - disable dummy_cycle; - end - - end - - - - - - /*----------------------------------------------------------------------*/ - /* ALL function trig action */ - /*----------------------------------------------------------------------*/ - always @ ( posedge Read_1XIO_Mode - or posedge FastRD_1XIO_Mode - or posedge REMS_Mode - or posedge RES_Mode - or posedge Read_2XIO_Mode - ) begin:read_function - wait ( ISCLK == 1'b0 ); - - if ( Read_1XIO_Mode == 1'b1 ) begin - Read_1XIO_Chk = 1'b1; - read_1xio; - end - else if ( FastRD_1XIO_Mode == 1'b1 ) begin - fastread_1xio; - end - else if ( REMS_Mode == 1'b1 ) begin - read_electronic_manufacturer_device_id; - end - else if ( RES_Mode == 1'b1 ) begin - read_electronic_id; - end - - else if ( Read_2XIO_Mode == 1'b1 ) begin - Read_2XIO_Chk = 1'b1; - read_2xio; - end - end - - always @ ( WRSR_Event ) begin - write_status; - end - - always @ ( RDP_Event ) begin - disable deep_power_down; - release_from_deep_power_down; - end - - always @ ( DP_Event ) begin - deep_power_down; - end - - always @ ( BE_Event ) begin - block_erase; - end - - always @ ( CE_Event ) begin - chip_erase; - end - - always @ ( PP_Event ) begin:page_program_mode - page_program( Address ); - end - - always @ ( SE_4K_Event ) begin - sector_erase_4k; - end - - always @ ( CP_Event ) begin - cp_program; - end - - always @ ( WRSCUR_Event ) begin - write_secur_register; - end - always @ ( SE_1K_Event ) begin - sector_erase_1k; - end - - - -// *========================================================================================== -// * Module Task Declaration -// *========================================================================================== - /*----------------------------------------------------------------------*/ - /* Description: define a wait dummy cycle task */ - /* INPUT */ - /* Cnum: cycle number */ - /*----------------------------------------------------------------------*/ - task dummy_cycle; - input [31:0] Cnum; - begin - repeat( Cnum ) begin - @ ( posedge ISCLK ); - end - end - endtask // dummy_cycle - - /*----------------------------------------------------------------------*/ - /* Description: define a write enable task */ - /*----------------------------------------------------------------------*/ - task write_enable; - begin - //$display( $time, " Old Status Register = %b", Status_Reg ); - Status_Reg[1] = 1'b1; - // $display( $time, " New Status Register = %b", Status_Reg ); - end - endtask // write_enable - - /*----------------------------------------------------------------------*/ - /* Description: define a write disable task (WRDI) */ - /*----------------------------------------------------------------------*/ - task write_disable; - begin - //$display( $time, " Old Status Register = %b", Status_Reg ); - Status_Reg[1] = 1'b0; - EN_CP_Mode = 1'b0; - Status_Reg[6] = 1'b0; - //$display( $time, " New Status Register = %b", Status_Reg ); - end - endtask // write_disable - - /*----------------------------------------------------------------------*/ - /* Description: define a read id task (RDID) */ - /*----------------------------------------------------------------------*/ - task read_id; - reg [23:0] Dummy_ID; - integer Dummy_Count; - begin - Dummy_ID = {ID_MXIC, Memory_Type, Memory_Density}; - Dummy_Count = 0; - forever begin - @ ( negedge ISCLK or posedge CS ); - if ( CS == 1'b1 ) begin - disable read_id; - end - else begin - SO_OUT_EN = 1'b1; - if ( P_Mode == 1'b0 ) begin // check parallel mode (2) - {SIO1_Reg, Dummy_ID} <= #tCLQV {Dummy_ID, Dummy_ID[23]}; - end - else begin - if ( Dummy_Count == 0 ) begin - {SIO1_Reg,PO_Reg} <= #tAA ID_MXIC; - Dummy_Count = 1; - end - else if ( Dummy_Count == 1 ) begin - {SIO1_Reg,PO_Reg} <= #tAA Memory_Type; - Dummy_Count = 2; - end - else if ( Dummy_Count == 2 ) begin - {SIO1_Reg,PO_Reg} <= #tAA Memory_Density; - Dummy_Count = 0; - end - end - end - end // end forever - end - endtask // read_id - - /*----------------------------------------------------------------------*/ - /* Description: define a read status task (RDSR) */ - /*----------------------------------------------------------------------*/ - task read_status; - integer Dummy_Count; - begin - Dummy_Count = 8; - forever begin - @ ( negedge ISCLK or posedge CS ); - if ( CS == 1'b1 ) begin - disable read_status; - end - else begin - SO_OUT_EN = 1'b1; - if ( P_Mode == 1'b0 ) begin - if ( Dummy_Count ) begin - Dummy_Count = Dummy_Count - 1; - SIO1_Reg <= #tCLQV Status_Reg[Dummy_Count]; - end - else begin - Dummy_Count = 7; - SIO1_Reg <= #tCLQV Status_Reg[Dummy_Count]; - end - end - else begin - {SIO1_Reg,PO_Reg} <= #tAA Status_Reg; - end - end - end // end forever - end - endtask // read_status - - - /*----------------------------------------------------------------------*/ - /* Description: define a write status task */ - /*----------------------------------------------------------------------*/ - task write_status; - integer tWRSR; - reg [7:0] Status_Reg_Up; - begin - //$display( $time, " Old Status Register = %b", Status_Reg ); - Status_Reg_Up = SI_Reg[7:0] ; - if ( (Status_Reg[7] == Status_Reg_Up[7] ) - && (Status_Reg[5:2] == Status_Reg_Up[5:2] ) ) begin - Status_Reg[1] = 1'b0; - WRSR_Mode = 1'b0; - end - else begin - if ( (Status_Reg[7] == 1'b1 && Status_Reg_Up[7] == 1'b0 ) || - (Status_Reg[5] == 1'b1 && Status_Reg_Up[5] == 1'b0 ) || - (Status_Reg[4] == 1'b1 && Status_Reg_Up[4] == 1'b0 ) || - (Status_Reg[3] == 1'b1 && Status_Reg_Up[3] == 1'b0 ) || - (Status_Reg[2] == 1'b1 && Status_Reg_Up[2] == 1'b0 )) - tWRSR = tW; - else - tWRSR = tBP; - //SRWD:Status Register Write Protect - Status_Reg[0] = 1'b1; - #tWRSR; - Status_Reg[7] = Status_Reg_Up[7]; - Status_Reg[6:2] = Status_Reg_Up[6:2]; - //WIP:Write Enable Latch - Status_Reg[0] = 1'b0; - //WEL:Write Enable Latch - Status_Reg[1] = 1'b0; - WRSR_Mode = 1'b0; - end - - if ( Status_Reg[4] == 0 || Status_Reg[3] == 0 || Status_Reg [2] == 0 ) begin//BP2~0 not all 1 - Param_Reg = 8'h00; - end - end - endtask // write_status - - /*----------------------------------------------------------------------*/ - /* Description: define a read data task */ - /*----------------------------------------------------------------------*/ - task read_1xio; - integer Dummy_Count, Tmp_Int; - reg [7:0] OUT_Buf; - begin - Dummy_Count = 8; - dummy_cycle(24); - #1; - OUT_Buf = (Secur_Mode == 1) ? Secur_ARRAY[Address] : - ((read_protect(Address) == 1'b1) ? 8'b0 : ARRAY[Address] ); - forever begin - @ ( negedge ISCLK or posedge CS ); - if ( CS == 1'b1 ) begin - if ( P_Mode == 0 ) begin - {EN_S0, EN_P0, EN_S1, EN_P1} = {1'b1, 1'b0, 1'b0, 1'b0}; - end - else begin - {EN_S0, EN_P0, EN_S1, EN_P1} = {1'b0, 1'b1, 1'b0, 1'b0}; - end - disable read_1xio; - end - else begin //do work on non deep power down mode - Read_Mode = 1'b1; - SO_OUT_EN = 1'b1; - if ( P_Mode == 1'b0 ) begin - {EN_S0, EN_P0, EN_S1, EN_P1} = {1'b0, 1'b0, 1'b1, 1'b0}; - if ( Dummy_Count ) begin - {SIO1_Reg, OUT_Buf} <= #tCLQV {OUT_Buf, OUT_Buf[7]}; - Dummy_Count = Dummy_Count - 1; - end - else begin - Address = Address + 1; - Address = (Secur_Mode == 1) ? Address[5:0] : Address; - OUT_Buf = (Secur_Mode == 1) ? Secur_ARRAY[Address] - :((read_protect(Address) == 1'b1) ? 8'b0 : ARRAY[Address] ); - {SIO1_Reg, OUT_Buf} <= #tCLQV {OUT_Buf, OUT_Buf[7]}; - Dummy_Count = 7 ; - end - end - else begin - {EN_S0, EN_P0, EN_S1, EN_P1} = {1'b0, 1'b0, 1'b0, 1'b1}; - OUT_Buf = (Secur_Mode == 1) ? Secur_ARRAY[Address] - :((read_protect(Address) == 1'b1) ? 8'b0 : ARRAY[Address] ); - {SIO1_Reg,PO_Reg} <= #tCLQV {OUT_Buf}; - Address = Address + 1; - Address = (Secur_Mode == 1) ? Address[5:0] : Address; - end - end - end // end forever - end - endtask // read_1xio - - /*----------------------------------------------------------------------*/ - /* Description: define a fast read data task */ - /* 0B AD1 AD2 AD3 X */ - /*----------------------------------------------------------------------*/ - task fastread_1xio; - integer Dummy_Count, Tmp_Int; - reg [7:0] OUT_Buf; - begin - Dummy_Count = 8; - dummy_cycle(24); - dummy_cycle(8); - OUT_Buf = (Secur_Mode == 1) ? Secur_ARRAY[Address]: - ((read_protect(Address) == 1'b1) ? 8'b0 : ARRAY[Address] ); - - forever begin - @ ( negedge ISCLK or posedge CS ); - if ( CS == 1'b1 ) begin - disable fastread_1xio; - end - else begin //do work on non deep power down mode - Read_Mode = 1'b1; - SO_OUT_EN = 1'b1; - if ( Dummy_Count ) begin - {SIO1_Reg, OUT_Buf} <= #tCLQV {OUT_Buf, OUT_Buf[7]}; - Dummy_Count = Dummy_Count - 1; - end - else begin - Address = Address + 1; - Address = (Secur_Mode == 1) ? Address[5:0] : Address; - OUT_Buf = (Secur_Mode == 1) ? Secur_ARRAY[Address] - :((read_protect(Address) == 1'b1) ? 8'b0 : ARRAY[Address] ); - {SIO1_Reg, OUT_Buf} <= #tCLQV {OUT_Buf, OUT_Buf[7]}; - Dummy_Count = 7 ; - end - end - end // end forever - end - endtask // fastread_1xio - /*----------------------------------------------------------------------*/ - /* Description: define a block erase task */ - /* D8 AD1 AD2 AD3 */ - /*----------------------------------------------------------------------*/ - task block_erase; - reg [Block_MSB:0] Block; - integer i; - begin - Block = Address[A_MSB:16]; - Start_Add = (Address[A_MSB:16]<<16) + 16'h0; - End_Add = (Address[A_MSB:16]<<16) + 16'hffff; - //WIP : write in process Bit - Status_Reg[0] = 1'b1; - #tBE ; - for( i = Start_Add; i <= End_Add; i = i + 1 ) - begin - ARRAY[i] = 8'hff; - end - //WIP : write in process Bit - Status_Reg[0] = 1'b0;//WIP - //WEL : write enable latch - Status_Reg[1] = 1'b0;//WEL - BE_Mode = 1'b0; - end - endtask // block_erase - - /*----------------------------------------------------------------------*/ - /* Description: define a sector 4k erase task */ - /* 20(D8) AD1 AD2 AD3 */ - /*----------------------------------------------------------------------*/ - task sector_erase_4k; - integer i; - begin - Sector = Address[A_MSB:12]; - Start_Add = (Address[A_MSB:12]<<12) + 12'h000; - End_Add = (Address[A_MSB:12]<<12) + 12'hfff; - //WIP : write in process Bit - - Status_Reg[0] = 1'b1; - #tSE; - for( i = Start_Add; i <= End_Add; i = i + 1 ) - begin - ARRAY[i] = 8'hff; - end - //WIP : write in process Bit - Status_Reg[0] = 1'b0;//WIP - //WEL : write enable latch - Status_Reg[1] = 1'b0;//WEL - SE_4K_Mode = 1'b0; - - end - endtask // sector_erase_4k - - /*----------------------------------------------------------------------*/ - /* Description: define a sector 1k erase task */ - /* 20(D8) AD1 AD2 AD3 */ - /*----------------------------------------------------------------------*/ - task sector_erase_1k; - reg [1:0] SEC_1K; - integer i; - begin - SEC_1K = Address[11:10]; - Start_Add = (Address[A_MSB:10]<<10) + 12'h000; - End_Add = (Address[A_MSB:10]<<10) + 12'h3ff; - //WIP : write in process Bit - Status_Reg[0] = 1'b1; - #tSE - for( i = Start_Add; i <= End_Add; i = i + 1 ) - begin - ARRAY[i] = 8'hff; - end - //WIP : write in process Bit - Status_Reg[0] = 1'b0;//WIP - //WEL : write enable latch - Status_Reg[1] = 1'b0;//WEL - SE_1K_Mode = 1'b0; - end - endtask // sector_erase_1k - - /*----------------------------------------------------------------------*/ - /* Description: define a chip erase task */ - /* 60(C7) */ - /*----------------------------------------------------------------------*/ - - task chip_erase; - begin - Status_Reg[0] = 1'b1; - for ( i = 0;i 8 ) - Byte_PGM_Mode = 1'b0; - else - Byte_PGM_Mode = 1'b1; - update_array ( Address ); - end - disable page_program; - end - else begin // count how many Bits been shifted - if ( P_Mode == 1'b0 ) begin - Tmp_Int = Tmp_Int + 1; - if ( Tmp_Int % 8 == 0) begin - #1; - Dummy_A[Offset] = SI_Reg [7:0]; - Offset = Offset + 1; - Offset = (Secur_Mode == 1) ? Offset[5:0] : Offset[7:0]; - end - end - else begin - Tmp_Int = Tmp_Int + 8; - if ( Tmp_Int % 8 == 0) begin - #1; - Dummy_A[Offset] = {Latch_SO, Latch_PO}; - Offset = Offset + 1; - Offset = (Secur_Mode == 1) ? Offset[5:0] : Offset[7:0]; - end - end - end - end // end forever - end - endtask // page_program - /*----------------------------------------------------------------------*/ - /* Description: define a deep power down (DP) */ - /*----------------------------------------------------------------------*/ - task deep_power_down; - begin - //$display( $time, " Old DP Mode Register = %b", DP_Mode ); - if ( DP_Mode == 1'b0) - DP_Mode = #tDP 1'b1; - //$display( $time, " New DP Mode Register = %b", DP_Mode ); - end - endtask // deep_power_down - - /*----------------------------------------------------------------------*/ - /* Description: define a release from deep power dwon task (RDP) */ - /*----------------------------------------------------------------------*/ - task release_from_deep_power_down; - begin - //$display( $time, " Old DP Mode Register = %b", DP_Mode ); - if ( DP_Mode == 1'b1) - DP_Mode = #tRES 1'b0; - //$display( $time, " New DP Mode Register = %b", DP_Mode ); - end - endtask // release_from_deep_power_down - - /*----------------------------------------------------------------------*/ - /* Description: define a read electronic ID (RES) */ - /* AB X X X */ - /*----------------------------------------------------------------------*/ - task read_electronic_id; - reg [7:0] Dummy_ID; - begin - //$display( $time, " Old DP Mode Register = %b", DP_Mode ); - dummy_cycle(23); - Dummy_ID = ID_Device; - dummy_cycle(1); - - forever begin - @ ( negedge ISCLK or posedge CS ); - if ( CS == 1'b1 ) begin - disable read_electronic_id; - end - else begin - SO_OUT_EN = 1'b1; - if ( P_Mode == 1'b0 ) begin - {SIO1_Reg, Dummy_ID} <= #tCLQV {Dummy_ID, Dummy_ID[7]}; - end - else begin - {SIO1_Reg,PO_Reg} <= #tAA ID_Device; - end - end - end // end forever - end - endtask // read_electronic_id - - /*----------------------------------------------------------------------*/ - /* Description: define a read electronic manufacturer & device ID */ - /*----------------------------------------------------------------------*/ - task read_electronic_manufacturer_device_id; - reg [15:0] Dummy_ID; - integer Dummy_Count; - begin - dummy_cycle(24); - #1; - if ( Address[0] == 1'b0 ) begin - Dummy_ID = {ID_MXIC,ID_Device}; - end - else begin - Dummy_ID = {ID_Device,ID_MXIC}; - end - Dummy_Count = 0; - forever begin - @ ( negedge ISCLK or posedge CS ); - if ( CS == 1'b1 ) begin - disable read_electronic_manufacturer_device_id; - end - else begin - SO_OUT_EN = 1'b1; - if ( P_Mode == 1'b0 ) begin // check parallel mode (2) - {SIO1_Reg, Dummy_ID} <= #tCLQV {Dummy_ID, Dummy_ID[15]}; - end - else if ( P_Mode == 1'b1 ) begin - if ( Dummy_Count == 0 ) begin - {SIO1_Reg,PO_Reg} <= #tAA Dummy_ID[15:8]; - Dummy_Count = 1; - end - else begin - {SIO1_Reg,PO_Reg} <= #tAA Dummy_ID[7:0]; - Dummy_Count = 0; - end - end - end - end // end forever - end - endtask // read_electronic_manufacturer_device_id - - /*----------------------------------------------------------------------*/ - /* Description: define a program chip task */ - /* INPUT program_time */ - /* segment: segment address */ - /* offset : offset address */ - /*----------------------------------------------------------------------*/ - task update_array; - input [A_MSB:0] Address; - integer Dummy_Count; - integer program_time; - begin - Dummy_Count = Page_Size; - Address = { Address [A_MSB:8], 8'h0 }; - program_time = (Byte_PGM_Mode) ? tBP : tPP; - Status_Reg[0]= 1'b1; - #program_time ; - for ( i = 0; i < Dummy_Count; i = i + 1 ) begin - if ( Secur_Mode == 1'b1) - Secur_ARRAY[Address + i] = Secur_ARRAY[Address + i] & Dummy_A[i]; - else - ARRAY[Address+ i] = ARRAY[Address + i] & Dummy_A[i]; - end - - - Status_Reg[0] = 1'b0; - Status_Reg[1] = 1'b0; - PP_1XIO_Mode = 1'b0; - Byte_PGM_Mode = 1'b0; - end - endtask // update_array - - /*----------------------------------------------------------------------*/ - /* Description: define a write read-lock register task */ - /*----------------------------------------------------------------------*/ - task write_lkbit; - begin - if ( SI_Reg[2] == 1 ) begin - Secur_Reg[2] <= SI_Reg[2]; - end - if ( SI_Reg[3] == 1 ) begin - Secur_Reg[3] <= SI_Reg[3]; - end - Status_Reg[1]<=1'b0; - end - endtask // write_lkbit - - /*----------------------------------------------------------------------*/ - /* Description: define a enter secured OTP task */ - /*----------------------------------------------------------------------*/ - task enter_secured_otp; - begin - //$display( $time, " Enter secured OTP mode = %b", enter_Secur_Mode ); - Secur_Mode= 1; - //$display( $time, " New Enter secured OTP mode = %b", enter_Secur_Mode ); - end - endtask // enter_secured_otp - - /*----------------------------------------------------------------------*/ - /* Description: define a exit 512 secured OTP task */ - /*----------------------------------------------------------------------*/ - task exit_secured_otp; - begin - //$display( $time, " Enter 512 secured OTP mode = %b", enter_Secur_Mode ); - Secur_Mode = 0; - //$display( $time, " New Enter 512 secured OTP mode = %b", enter_Secur_Mode ); - end - endtask - - /*----------------------------------------------------------------------*/ - /* Description: Execute Reading Security Register */ - /*----------------------------------------------------------------------*/ - task read_Secur_Register; - integer Dummy_Count; - begin - Dummy_Count = 8; - forever @ ( negedge ISCLK or posedge CS ) begin // output security register info - if ( CS == 1 ) begin - disable read_Secur_Register; - end - else begin //do work on non deep power down mode and not in CP_Mode with hardware detection - SO_OUT_EN = 1'b1; - if ( P_Mode == 1'b0 ) begin - if ( Dummy_Count ) begin - Dummy_Count = Dummy_Count - 1; - SIO1_Reg <= #tCLQV Secur_Reg[Dummy_Count]; - end - else begin - Dummy_Count = 7; - SIO1_Reg <= #tCLQV Secur_Reg[Dummy_Count]; - end - end - else begin - {SIO1_Reg,PO_Reg} <= #tAA Secur_Reg; - end - end - end - end - endtask // read_Secur_Register - - /*----------------------------------------------------------------------*/ - /* Description: Execute Write Security Register */ - /*----------------------------------------------------------------------*/ - task write_secur_register; - begin - Status_Reg[0] = 1'b1; - #tBP; - Secur_Reg [1] = 1'b1; - Status_Reg[0] = 1'b0; - end - endtask // write_secur_register - - /*----------------------------------------------------------------------*/ - /* Description: define a continuously program task */ - /* 02 AD1 AD2 AD3 */ - /*----------------------------------------------------------------------*/ - task cp_program; - integer Tmp_Int; - begin - CP_Data = SI_Reg[15:0] ; - Tmp_Int = 0; - forever begin - @ ( posedge ISCLK or posedge CS ); - if ( CS == 1'b1 ) begin - if ( P_Mode == 1'b0 && Tmp_Int % 8 !== 0 ) begin - disable cp_program; - end - else begin - EN_CP_Mode = 1'b1; - CP_Mode = 1'b1; - Status_Reg[6] = EN_CP_Mode; - Status_Reg[0] = 1'b1; - #tBP; - Status_Reg[0]= 1'b0; - CP_Mode = 1'b0; - if ( Secur_Mode == 1) - begin - Secur_ARRAY[Address + 1] = Secur_ARRAY[Address + 1] & CP_Data [7:0]; - Secur_ARRAY[Address] = Secur_ARRAY[Address] & CP_Data [15:8]; - end - else - begin - ARRAY[Address + 1] = ARRAY[Address + 1] & CP_Data [7:0]; - ARRAY[Address] = ARRAY[Address] & CP_Data [15:8]; - end - - if ( Address == (Secur_Mode ? (Secur_TOP_Add - 1) : (TOP_Add - 1))) - begin - Status_Reg[6] = 1'b0; - Status_Reg[1] = 1'b0; - EN_CP_Mode = 1'b0; - end - else - begin - Address = Address + 2; - end - if ( write_protect(Address) == 1'b1 && (!Secur_Mode) ) - begin - Status_Reg[6] = 1'b0; - Status_Reg[1] = 1'b0; - EN_CP_Mode = 1'b0; - end - end - disable cp_program; - end - else begin // count how many Bits been shifted - if ( P_Mode == 1'b0 ) begin - Tmp_Int = Tmp_Int + 1; - end - else begin - Tmp_Int = Tmp_Int + 8; - end - end - end // end forever - end - endtask // cp_program - - /*----------------------------------------------------------------------*/ - /* Description: define a ESRY task */ - /*----------------------------------------------------------------------*/ - task read_ryby; - begin - //$display( $time, " Enter CP ESRY mode = %b", CP_ESRY_Mode ); - CP_ESRY_Mode= 1; - //$display( $time, " New Enter CP ESRY mode = %b", CP_ESRY_Mode ); - end - endtask // read_ryby - - /*----------------------------------------------------------------------*/ - /* Description: define a DSRY task */ - /*----------------------------------------------------------------------*/ - task disread_ryby; - begin - //$display( $time, " Enter CP ESRY mode = %b", CP_ESRY_Mode ); - CP_ESRY_Mode = 0; - //$display( $time, " New Enter CP ESRY mode = %b", CP_ESRY_Mode ); - end - endtask // disread_ryby - - /*----------------------------------------------------------------------*/ - /* Description: Execute 2X IO Read Mode */ - /*----------------------------------------------------------------------*/ - task read_2xio; - reg [7:0] OUT_Buf; - integer Dummy_Count; - begin - Dummy_Count=4; - SI_IN_EN = 1'b1; - SO_IN_EN = 1'b1; - SI_OUT_EN = 1'b0; - SO_OUT_EN = 1'b0; - dummy_cycle(12); - dummy_cycle(4); - OUT_Buf = (Secur_Mode == 1) ? Secur_ARRAY[Address] : - ((read_protect(Address) == 1'b1) ? 8'b0 : ARRAY[Address] ); - - forever @ ( negedge ISCLK or posedge CS ) begin - if ( CS == 1'b1 ) begin - disable read_2xio; - end - else begin - Read_Mode = 1'b1; - SO_OUT_EN = 1'b1; - SI_OUT_EN = 1'b1; - SI_IN_EN = 1'b0; - SO_IN_EN = 1'b0; - if ( Dummy_Count ) begin - {SIO1_Reg, SIO0_Reg, OUT_Buf} <= #tCLQV {OUT_Buf, OUT_Buf[1:0]}; - Dummy_Count = Dummy_Count - 1; - end - else begin - Address = Address + 1; - Address = (Secur_Mode == 1) ? Address[5:0] : Address; - OUT_Buf = (Secur_Mode == 1) ? Secur_ARRAY[Address] : - ((read_protect(Address) == 1'b1) ? 8'b0 : ARRAY[Address] ); - {SIO1_Reg, SIO0_Reg, OUT_Buf} <= #tCLQV {OUT_Buf, OUT_Buf[1:0]}; - Dummy_Count = 3 ; - end - end - end//forever - end - endtask // read_2xio - - /*----------------------------------------------------------------------*/ - /* Description: define Reading Parameter */ - /*----------------------------------------------------------------------*/ - task read_parameter; - integer Dummy_Count; - begin - Dummy_Count = 8; - forever begin - @ ( negedge ISCLK or posedge CS ); - if ( CS == 1'b1 ) begin - disable read_parameter; - end - else begin - SO_OUT_EN = 1'b1; - if ( Dummy_Count ) begin - Dummy_Count = Dummy_Count - 1; - SIO1_Reg <= #tCLQV Param_Reg[Dummy_Count]; - end - else begin - Dummy_Count = 7; - SIO1_Reg <= #tCLQV Param_Reg[Dummy_Count]; - end - - end - end // end forever - end - endtask // read_parameter - - /*----------------------------------------------------------------------*/ - /* Description: Execute Writing Parameter */ - /*----------------------------------------------------------------------*/ - task write_parameter; - begin - //$display( $time, " Old Parameter Register = %b", Param_Reg ); - if ( Status_Reg[4] == 0 || Status_Reg[3] == 0 || Status_Reg[2] == 0 ) begin//BP2~0 not all 1 - Param_Reg = 8'h00; - end - else begin //allow to change parameter register - Param_Reg = {3'b000,SI_Reg[4:0]}; - end - end - endtask // write_parameter - - /*----------------------------------------------------------------------*/ - /* Description: define a write_protect area function */ - /* INPUT */ - /* sector : sector address */ - /*----------------------------------------------------------------------*/ - function write_protect; - input [A_MSB:0] Address; - begin - //protect_define - Block = Address [A_MSB:16]; - if((Param_Reg[0] == 1) &&(Address[A_MSB:12] == 0)) begin - write_protect = Param_Reg[1]&&(Address[11:10] == 2'b00) || - Param_Reg[2]&&(Address[11:10] == 2'b01) || - Param_Reg[3]&&(Address[11:10] == 2'b10) || - Param_Reg[4]&&(Address[11:10] == 2'b11) ; - end - else if (Status_Reg[5:2] == 4'b0000) begin - write_protect = 1'b0; - end - else if (Status_Reg[5:2] == 4'b0001) begin - if (Block[Block_MSB:0] >= 126 && Block[Block_MSB:0] <= 127) begin - write_protect = 1'b1; - end - else begin - write_protect = 1'b0; - end - end - else if (Status_Reg[5:2] == 4'b0010) begin - if (Block[Block_MSB:0] >= 124 && Block[Block_MSB:0] <= 127) begin - write_protect = 1'b1; - end - else begin - write_protect = 1'b0; - end - end - else if (Status_Reg[5:2] == 4'b0011) begin - if (Block[Block_MSB:0] >= 120 && Block[Block_MSB:0] <= 127) begin - write_protect = 1'b1; - end - else begin - write_protect = 1'b0; - end - end - else if (Status_Reg[5:2] == 4'b0100) begin - if (Block[Block_MSB:0] >= 112 && Block[Block_MSB:0] <= 127) begin - write_protect = 1'b1; - end - else begin - write_protect = 1'b0; - end - end - else if (Status_Reg[5:2] == 4'b0101) begin - if (Block[Block_MSB:0] >= 96 && Block[Block_MSB:0] <= 127) begin - write_protect = 1'b1; - end - else begin - write_protect = 1'b0; - end - end - else if (Status_Reg[5:2] == 4'b0110) begin - if (Block[Block_MSB:0] >= 64 && Block[Block_MSB:0] <= 127) begin - write_protect = 1'b1; - end - else begin - write_protect = 1'b0; - end - end - else if (Status_Reg[5:2] == 4'b0111) begin - write_protect = 1'b1; - end - else if (Status_Reg[5:2] == 4'b1000) begin - write_protect = 1'b1; - end - else if (Status_Reg[5:2] == 4'b1001) begin - if (Block[Block_MSB:0] >= 0 && Block[Block_MSB:0] <= 63) begin - write_protect = 1'b1; - end - else begin - write_protect = 1'b0; - end - end - else if (Status_Reg[5:2] == 4'b1010) begin - if (Block[Block_MSB:0] >= 0 && Block[Block_MSB:0] <= 95) begin - write_protect = 1'b1; - end - else begin - write_protect = 1'b0; - end - end - else if (Status_Reg[5:2] == 4'b1011) begin - if (Block[Block_MSB:0] >= 0 && Block[Block_MSB:0] <= 111) begin - write_protect = 1'b1; - end - else begin - write_protect = 1'b0; - end - end - else if (Status_Reg[5:2] == 4'b1100) begin - if (Block[Block_MSB:0] >= 0 && Block[Block_MSB:0] <= 119) begin - write_protect = 1'b1; - end - else begin - write_protect = 1'b0; - end - end - else if (Status_Reg[5:2] == 4'b1101) begin - if (Block[Block_MSB:0] >= 0 && Block[Block_MSB:0] <= 123) begin - write_protect = 1'b1; - end - else begin - write_protect = 1'b0; - end - end - else if (Status_Reg[5:2] == 4'b1110) begin - if (Block[Block_MSB:0] >= 0 && Block[Block_MSB:0] <= 125) begin - write_protect = 1'b1; - end - else begin - write_protect = 1'b0; - end - end - else if (Status_Reg[5:2] == 4'b1111) begin - write_protect = 1'b1; - end - else begin - write_protect = 1'b1; - end - end - endfunction // write_protect - - - /*----------------------------------------------------------------------*/ - /* When WRLB Condtion Operation; */ - /*----------------------------------------------------------------------*/ - function read_protect; - input [A_MSB : 0] Address ; - begin - if ( (Secur_Reg[2] == 1'b1) && (Address >= PRO_128K_Beg) && (Address <= PRO_128K_End) ) begin - read_protect = 1'b1; - end - else begin - read_protect = 1'b0; - end - end - endfunction // read_protect -// *============================================================================================== -// * AC Timing Check Section -// *============================================================================================== - - wire Read_1XIO_Chk_w = Read_1XIO_Chk; - wire Read_2XIO_Chk_w = Read_2XIO_Chk; - wire SI_IN_EN_w = SI_IN_EN; - wire SO_IN_EN_w = SO_IN_EN; - - specify - /*----------------------------------------------------------------------*/ - /* Timing Check */ - /*----------------------------------------------------------------------*/ - $period( posedge ISCLK &&& ~CS, tSCLK ); // SCLK _/~ ->_/~ - $period( negedge ISCLK &&& ~CS, tSCLK ); // SCLK ~\_ ->~\_ - $period( posedge ISCLK &&& Read_1XIO_Chk_w , tRSCLK ); // SCLK ~\_ ->~\_ - $period( posedge ISCLK &&& Read_2XIO_Chk_w , tTSCLK ); // SCLK ~\_ ->~\_ - - - $width ( posedge ISCLK &&& ~CS, tCH ); // SCLK _/~~\_ - $width ( negedge ISCLK &&& ~CS, tCL ); // SCLK ~\__/~ - $width ( posedge CS , tSHSL ); // CS _/~\_ - $setup ( SI &&& ~CS, posedge ISCLK &&& SI_IN_EN_w, tDVCH ); - $hold ( posedge ISCLK &&& SI_IN_EN_w, SI &&& ~CS, tCHDX ); - - $setup ( SO &&& ~CS, posedge ISCLK &&& SO_IN_EN_w, tDVCH ); - $hold ( posedge ISCLK &&& SO_IN_EN_w, SO &&& ~CS, tCHDX ); - - $setup ( negedge CS, posedge ISCLK &&& ~CS, tSLCH ); - $hold ( posedge ISCLK &&& ~CS, posedge CS, tCHSH ); - - $setup ( posedge CS, posedge ISCLK &&& CS, tSHCH ); - $hold ( posedge ISCLK &&& CS, negedge CS, tCHSL ); - - - $setup ( negedge HOLD , posedge SCLK &&& ~CS, tHLCH ); - $hold ( posedge SCLK &&& ~CS, posedge HOLD , tCHHH ); - - $setup ( posedge HOLD , posedge SCLK &&& ~CS, tHHCH ); - $hold ( posedge SCLK &&& ~CS, negedge HOLD , tCHHL ); - - $setup ( posedge WP &&& SRWD, negedge CS, tWHSL ); - $hold ( posedge CS, negedge WP &&& SRWD, tSHWL ); - - $setup ( negedge SCLK &&& ~CS, negedge HOLD , tCLHS ); - $hold ( negedge SCLK &&& ~CS, posedge HOLD , tCLHH ); - endspecify - - - integer AC_Check_File; - // timing check module - initial - begin - AC_Check_File= $fopen ("ac_check.err" ); - end - - time T_CS_P , T_CS_N; - time T_WP_P , T_WP_N; - time T_SCLK_P , T_SCLK_N; - time T_ISCLK_P , T_ISCLK_N; - time T_HOLD_P , T_HOLD_N; - time T_SI; - time T_SO; - time T_WP; - time T_HOLD; - - initial - begin - T_CS_P = 0; - T_CS_N = 0; - T_WP_P = 0; - T_WP_N = 0; - T_SCLK_P = 0; - T_SCLK_N = 0; - T_ISCLK_P = 0; - T_ISCLK_N = 0; - T_HOLD_P = 0; - T_HOLD_N = 0; - T_SI = 0; - T_SO = 0; - T_WP = 0; - T_HOLD = 0; - end - - always @ ( posedge ISCLK ) begin - //tSCLK - if ( $time - T_ISCLK_P < tSCLK && $time > 0 && ~CS ) - $fwrite (AC_Check_File, "Clock Frequence for except READ struction fSCLK =%d Mhz, fSCLK timing violation at %d \n", fSCLK, $time ); - //fRSCLK - if ( $time - T_ISCLK_P < tRSCLK && Read_1XIO_Chk && $time > 0 && ~CS ) - $fwrite (AC_Check_File, "Clock Frequence for READ instruction fRSCLK =%d Mhz, fRSCLK timing violation at %d \n", fRSCLK, $time ); - //fTSCLK - if ( $time - T_ISCLK_P < tTSCLK && Read_2XIO_Chk && $time > 0 && ~CS ) - $fwrite (AC_Check_File, "Clock Frequence for 2/4XI/O instruction fTSCLK =%d Mhz, fRSCLK timing violation at %d \n", fTSCLK, $time ); - T_ISCLK_P = $time; - #0; - //tDVCH - if ( T_ISCLK_P - T_SI < tDVCH && SI_IN_EN && T_ISCLK_P > 0 ) - $fwrite (AC_Check_File, "minimun Data SI setup time tDVCH=%d ns, tDVCH timing violation at %d \n", tDVCH, $time ); - if ( T_ISCLK_P - T_SO < tDVCH && SO_IN_EN && T_ISCLK_P > 0 ) - $fwrite (AC_Check_File, "minimun Data SO setup time tDVCH=%d ns, tDVCH timing violation at %d \n", tDVCH, $time ); - //tCL - if ( T_ISCLK_P - T_ISCLK_N < tCL && ~CS && T_ISCLK_P > 0 ) - $fwrite (AC_Check_File, "minimun SCLK Low time tCL=%f ns, tCL timing violation at %d \n", tCL, $time ); - end - - always @ ( negedge ISCLK ) begin - T_ISCLK_N = $time; - #0; - //tCH - if ( T_ISCLK_N - T_ISCLK_P < tCH && ~CS && T_ISCLK_N > 0 ) - $fwrite (AC_Check_File, "minimun SCLK High time tCH=%f ns, tCH timing violation at %d \n", tCH, $time ); - end - - - always @ ( SI ) begin - T_SI = $time; - #0; - //tCHDX - if ( T_SI - T_ISCLK_P < tCHDX && SI_IN_EN && T_SI > 0 ) - $fwrite (AC_Check_File, "minimun Data SI hold time tCHDX=%d ns, tCHDX timing violation at %d \n", tCHDX, $time ); - end - - always @ ( SO ) begin - T_SO = $time; - #0; - //tCHDX - if ( T_SO - T_ISCLK_P < tCHDX && SO_IN_EN && T_SO > 0 ) - $fwrite (AC_Check_File, "minimun Data SO hold time tCHDX=%d ns, tCHDX timing violation at %d \n", tCHDX, $time ); - end - - - always @ ( posedge SCLK ) begin - T_SCLK_P = $time; - #0; - // tSLCH - if ( T_SCLK_P - T_CS_N < tSLCH && T_SCLK_P > 0 ) - $fwrite (AC_Check_File, "minimun CS# active setup time tSLCH=%d ns, tSLCH timing violation at %d \n", tSLCH, $time ); - - // tSHCH - if ( T_SCLK_P - T_CS_P < tSHCH && T_SCLK_P > 0 ) - $fwrite (AC_Check_File, "minimun CS# not active setup time tSHCH=%d ns, tSHCH timing violation at %d \n", tSHCH, $time ); - - - //tHLCH - if ( T_SCLK_P - T_HOLD_N < tHLCH && ~CS && T_SCLK_P > 0 ) - $fwrite (AC_Check_File, "minimun HOLD# setup time tHLCH=%d ns, tHLCH timing violation at %d \n", tHLCH, $time ); - - //tHHCH - if ( T_SCLK_P - T_HOLD_P < tHHCH && ~CS && T_SCLK_P > 0 ) - $fwrite (AC_Check_File, "minimun HOLD setup time tHHCH=%d ns, tHHCH timing violation at %d \n", tHHCH, $time ); - - end - - always @ ( negedge SCLK ) begin - T_SCLK_N = $time; - end - - always @ ( posedge CS ) begin - T_CS_P = $time; - #0; - // tCHSH - if ( T_CS_P - T_SCLK_P < tCHSH && T_CS_P > 0 ) - $fwrite (AC_Check_File, "minimun CS# active hold time tCHSH=%d ns, tCHSH timing violation at %d \n", tCHSH, $time ); - end - - - always @ ( negedge CS ) begin - T_CS_N = $time; - #0; - //tCHSL - if ( T_CS_N - T_SCLK_P < tCHSL && T_CS_N > 0 ) - $fwrite (AC_Check_File, "minimun CS# not active hold time tCHSL=%d ns, tCHSL timing violation at %d \n", tCHSL, $time ); - //tSHSL - if ( T_CS_N - T_CS_P < tSHSL && T_CS_N > 0 ) - $fwrite (AC_Check_File, "minimun CS# deslect time tSHSL=%d ns, tSHSL timing violation at %d \n", tSHSL, $time ); - //tWHSL - if ( T_CS_N - T_WP_P < tWHSL && SRWD && T_CS_N > 0 ) - $fwrite (AC_Check_File, "minimun WP setup time tWHSL=%d ns, tWHSL timing violation at %d \n", tWHSL, $time ); - - end - - - always @ ( posedge WP ) begin - T_WP_P = $time; - #0; - end - - always @ ( negedge WP ) begin - T_WP_N = $time; - #0; - //tSHWL - if ( ((T_WP_N - T_CS_P < tSHWL) || ~CS) && SRWD && T_WP_N > 0 ) - $fwrite (AC_Check_File, "minimun WP hold time tSHWL=%d ns, tSHWL timing violation at %d \n", tSHWL, $time ); - end - - always @ ( posedge HOLD ) begin - T_HOLD_P = $time; - #0; - - //tCHHH - if ( T_HOLD_P - T_SCLK_P < tCHHH && ~CS && T_HOLD_P > 0 ) - $fwrite (AC_Check_File, "minimun HOLD# hold time tCHHH=%d ns, tCHHH timing violation at %d \n", tCHHH, $time ); - - //tCLHH - if ( T_HOLD_P - T_SCLK_N < tCLHH && ~CS && T_HOLD_P > 0 ) - $fwrite (AC_Check_File, "Clock Low to HOLD# hold time tCLHH=%d ns, tCLHH timing violation at %d \n", tCLHH, $time ); - - end - - - always @ ( negedge HOLD ) begin - T_HOLD_N = $time; - #0; - //tCHHL - if ( T_HOLD_N - T_SCLK_P < tCHHL && ~CS && T_HOLD_N > 0 ) - $fwrite (AC_Check_File, "minimun HOLD hold time tCHHL=%d ns, tCHHL timing violation at %d \n", tCHHL, $time ); - - //tCLHS - if ( T_HOLD_N - T_SCLK_N < tCLHS && ~CS && T_HOLD_N > 0 ) - $fwrite (AC_Check_File, "Clock Low to HOLD# setup time tCLHS=%d ns, tCLHS timing violation at %d \n", tCLHS, $time ); - end - -endmodule - - - - diff --git a/resources/soc/simu/testbench/ddr3_model.sv b/resources/soc/simu/testbench/ddr3_model.sv deleted file mode 100644 index d600001..0000000 --- a/resources/soc/simu/testbench/ddr3_model.sv +++ /dev/null @@ -1,2937 +0,0 @@ -//`define MAX_MEM - -/**************************************************************************************** -* -* File Name: ddr3.v -* Version: 1.72 -* Model: BUS Functional -* -* Dependencies: ddr3_model_parameters.vh -* -* Description: Micron SDRAM DDR3 (Double Data Rate 3) -* -* Limitation: - doesn't check for average refresh timings -* - positive ck and ck_n edges are used to form internal clock -* - positive dqs and dqs_n edges are used to latch data -* - test mode is not modeled -* - Duty Cycle Corrector is not modeled -* - Temperature Compensated Self Refresh is not modeled -* - DLL off mode is not modeled. -* -* Note: - Set simulator resolution to "ps" accuracy -* - Set DEBUG = 0 to disable $display messages -* -* Disclaimer This software code and all associated documentation, comments or other -* of Warranty: information (collectively "Software") is provided "AS IS" without -* warranty of any kind. MICRON TECHNOLOGY, INC. ("MTI") EXPRESSLY -* DISCLAIMS ALL WARRANTIES EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -* TO, NONINFRINGEMENT OF THIRD PARTY RIGHTS, AND ANY IMPLIED WARRANTIES -* OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. MTI DOES NOT -* WARRANT THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS, OR THAT THE -* OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE. -* FURTHERMORE, MTI DOES NOT MAKE ANY REPRESENTATIONS REGARDING THE USE OR -* THE RESULTS OF THE USE OF THE SOFTWARE IN TERMS OF ITS CORRECTNESS, -* ACCURACY, RELIABILITY, OR OTHERWISE. THE ENTIRE RISK ARISING OUT OF USE -* OR PERFORMANCE OF THE SOFTWARE REMAINS WITH YOU. IN NO EVENT SHALL MTI, -* ITS AFFILIATED COMPANIES OR THEIR SUPPLIERS BE LIABLE FOR ANY DIRECT, -* INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR SPECIAL DAMAGES (INCLUDING, -* WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, BUSINESS INTERRUPTION, -* OR LOSS OF INFORMATION) ARISING OUT OF YOUR USE OF OR INABILITY TO USE -* THE SOFTWARE, EVEN IF MTI HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -* DAMAGES. Because some jurisdictions prohibit the exclusion or -* limitation of liability for consequential or incidental damages, the -* above limitation may not apply to you. -* -* Copyright 2003 Micron Technology, Inc. All rights reserved. -* -* Rev Author Date Changes -* --------------------------------------------------------------------------------------- -* 0.41 JMK 05/12/06 Removed auto-precharge to power down error check. -* 0.42 JMK 08/25/06 Created internal clock using ck and ck_n. -* TDQS can only be enabled in EMR for x8 configurations. -* CAS latency is checked vs frequency when DLL locks. -* Improved checking of DQS during writes. -* Added true BL4 operation. -* 0.43 JMK 08/14/06 Added checking for setting reserved bits in Mode Registers. -* Added ODTS Readout. -* Replaced tZQCL with tZQinit and tZQoper -* Fixed tWRPDEN and tWRAPDEN during BC4MRS and BL4MRS. -* Added tRFC checking for Refresh to Power-Down Re-Entry. -* Added tXPDLL checking for Power-Down Exit to Refresh to Power-Down Entry -* Added Clock Frequency Change during Precharge Power-Down. -* Added -125x speed grades. -* Fixed tRCD checking during Write. -* 1.00 JMK 05/11/07 Initial release -* 1.10 JMK 06/26/07 Fixed ODTH8 check during BLOTF -* Removed temp sensor readout from MPR -* Updated initialization sequence -* Updated timing parameters -* 1.20 JMK 09/05/07 Updated clock frequency change -* Added ddr3_dimm module -* 1.30 JMK 01/23/08 Updated timing parameters -* 1.40 JMK 12/02/08 Added support for DDR3-1866 and DDR3-2133 -* renamed ddr3_dimm.v to ddr3_module.v and added SODIMM support. -* Added multi-chip package model support in ddr3_mcp.v -* 1.50 JMK 05/04/08 Added 1866 and 2133 speed grades. -* 1.60 MYY 07/10/09 Merging of 1.50 version and pre-1.0 version changes -* 1.61 SPH 12/10/09 Only check tIH for cmd_addr if CS# LOW -* 1.62 SPH 10/26/10 Added 4Gb DDR3 SDRAM support -* 1.63 MYY 11/09/10 Added Dll Disable mode -* 1.64 MYY 07/28/11 Check dqs_in for dqs timing check -* 1.65 MYY 09/19/11 Widen internal bus width -* 1.66 MYY 01/20/12 Support ODT tied high feature -* 1.67 MYY 02/03/12 Added TJIT_PER margin for timing checks -* 1.68 SPH 04/02/12 Added memory preload -* 1.69 SPH 03/19/13 Update tZQCS, tZQinit, tZQoper timing parameters -* 1.70 SPH 04/08/14 Update tRFC to PRECHARGE check -* 1.71 SPH 04/21/14 Added 8Gb mono die parameters -* Remove strict CL check -* 1.72 DLH 06/18/15 calculate TZQCS from current tCK -*****************************************************************************************/ - -// DO NOT CHANGE THE TIMESCALE -// MAKE SURE YOUR SIMULATOR USES "PS" RESOLUTION -`timescale 1ps / 1ps - -// model flags -// `define MODEL_PASR -//Memory Details -`define x1Gb -`define sg125 -`define x16 -module ddr3_model ( - rst_n, - ck, - ck_n, - cke, - cs_n, - ras_n, - cas_n, - we_n, - dm_tdqs, - ba, - addr, - dq, - dqs, - dqs_n, - tdqs_n, - odt -); - - `include "ddr3_model_parameters.vh" - - parameter check_strict_mrbits = 1; - parameter check_strict_timing = 1; - parameter feature_pasr = 1; - parameter feature_truebl4 = 0; - parameter feature_odt_hi = 0; - parameter PERTCKAVG=TDLLK; - - // text macros - `define DQ_PER_DQS DQ_BITS/DQS_BITS - `define BANKS (1<= 2. \nBL_MAX = %d", BL_MAX); - if ((1< BL_MAX) - $display("%m ERROR: 2^BO_BITS cannot be greater than BL_MAX parameter."); - - $timeformat (-12, 1, " ps", 1); - seed = RANDOM_SEED; - - ck_cntr = 0; - end - - function integer get_rtt_wr; - input [1:0] rtt; - begin - get_rtt_wr = RZQ/{rtt[0], rtt[1], 1'b0}; - end - endfunction - - function integer get_rtt_nom; - input [2:0] rtt; - begin - case (rtt) - 1: get_rtt_nom = RZQ/4; - 2: get_rtt_nom = RZQ/2; - 3: get_rtt_nom = RZQ/6; - 4: get_rtt_nom = RZQ/12; - 5: get_rtt_nom = RZQ/8; - default : get_rtt_nom = 0; - endcase - end - endfunction - - // calculate the absolute value of a real number - function real abs_value; - input arg; - real arg; - begin - if (arg < 0.0) - abs_value = -1.0 * arg; - else - abs_value = arg; - end - endfunction - - function integer ceil; - input number; - real number; - - // LMR 4.1.7 - // When either operand of a relational expression is a real operand then the other operand shall be converted - // to an equivalent real value, and the expression shall be interpreted as a comparison between two real values. - if (number > $rtoi(number)) - ceil = $rtoi(number) + 1; - else - ceil = number; - endfunction - - function integer floor; - input number; - real number; - - // LMR 4.1.7 - // When either operand of a relational expression is a real operand then the other operand shall be converted - // to an equivalent real value, and the expression shall be interpreted as a comparison between two real values. - if (number < $rtoi(number)) - floor = $rtoi(number) - 1; - else - floor = number; - endfunction - - function int max( input int a, b ); - max = (a < b) ? b : a; - endfunction - - function int min( input int a, b ); - min = (a > b) ? b : a; - endfunction - -`ifdef MAX_MEM - - function integer open_bank_file( input integer bank ); - integer fd; - reg [2048:1] filename; - begin - $sformat( filename, "%0s/%m.%0d", tmp_model_dir, bank ); - - fd = $fopen(filename, "wb+"); - if (fd == 0) - begin - $display("%m: at time %0t ERROR: failed to open %0s.", $time, filename); - $finish; - end - else - begin - if (DEBUG) $display("%m: at time %0t INFO: opening %0s.", $time, filename); - open_bank_file = fd; - end - - end - endfunction - - function [RFF_BITS:1] read_from_file( - input integer fd, - input integer index - ); - integer code; - integer offset; - reg [1024:1] msg; - reg [RFF_BITS:1] read_value; - - begin - offset = index * RFF_CHUNK; - code = $fseek( fd, offset, 0 ); - // $fseek returns 0 on success, -1 on failure - if (code != 0) - begin - $display("%m: at time %t ERROR: fseek to %d failed", $time, offset); - $finish; - end - - code = $fscanf(fd, "%z", read_value); - // $fscanf returns number of items read - if (code != 1) - begin - if ($ferror(fd,msg) != 0) - begin - $display("%m: at time %t ERROR: fscanf failed at %d", $time, index); - $display(msg); - $finish; - end - else - read_value = 'hx; - end - - /* when reading from unwritten portions of the file, 0 will be returned. - * Use 0 in bit 1 as indicator that invalid data has been read. - * A true 0 is encoded as Z. - */ - if (read_value[1] === 1'bz) - // true 0 encoded as Z, data is valid - read_value[1] = 1'b0; - else if (read_value[1] === 1'b0) - // read from file section that has not been written - read_value = 'hx; - - read_from_file = read_value; - end - endfunction - - task write_to_file( - input integer fd, - input integer index, - input [RFF_BITS:1] data - ); - integer code; - integer offset; - - begin - offset = index * RFF_CHUNK; - code = $fseek( fd, offset, 0 ); - if (code != 0) - begin - $display("%m: at time %t ERROR: fseek to %d failed", $time, offset); - $finish; - end - - // encode a valid data - if (data[1] === 1'bz) - data[1] = 1'bx; - else if (data[1] === 1'b0) - data[1] = 1'bz; - - $fwrite( fd, "%z", data ); - end - endtask -`else - function get_index; - input [`MAX_BITS-1:0] addr; - begin : index - get_index = 0; - for (memory_index=0; memory_index>(ROW_BITS+COL_BITS-BL_BITS)); - if (!banks[ba]) begin //bank is selected to keep - address[i] = address[memory_index]; - memory[i] = memory[memory_index]; - i = i + 1; - end - end - // clean up the unused banks - for (memory_index=i; memory_index TRAS_MAX) $display ("%m: at time %t ERROR: tRAS maximum violation during %s to bank %d", $time, cmd_string[cmd], bank); - if ($time - tm_bank_activate[bank] < TRAS_MIN-TJIT_PER) $display ("%m: at time %t ERROR: tRAS minimum violation during %s to bank %d", $time, cmd_string[cmd], bank);end - {1'bx, SAME_BANK , ACTIVATE , ACTIVATE } : begin if ($time - tm_bank_activate[bank] < TRC-TJIT_PER) $display ("%m: at time %t ERROR: tRC violation during %s to bank %d", $time, cmd_string[cmd], bank); end - {1'bx, SAME_BANK , ACTIVATE , WRITE } , - {1'bx, SAME_BANK , ACTIVATE , READ } : ; // tRCD is checked outside this task - {1'b0, DIFF_BANK , ACTIVATE , ACTIVATE } : begin if (($time - tm_activate < TRRD) || (ck_cntr - ck_activate < TRRD_TCK)) $display ("%m: at time %t ERROR: tRRD violation during %s to bank %d", $time, cmd_string[cmd], bank); end - {1'b1, DIFF_BANK , ACTIVATE , ACTIVATE } : begin if (($time - tm_group_activate[bank[1]] < TRRD) || (ck_cntr - ck_group_activate[bank[1]] < TRRD_TCK)) $display ("%m: at time %t ERROR: tRRD violation during %s to bank %d", $time, cmd_string[cmd], bank); end - {1'b1, DIFF_GROUP, ACTIVATE , ACTIVATE } : begin if (($time - tm_activate < TRRD_DG) || (ck_cntr - ck_activate < TRRD_DG_TCK)) $display ("%m: at time %t ERROR: tRRD_DG violation during %s to bank %d", $time, cmd_string[cmd], bank); end - {1'bx, DIFF_BANK , ACTIVATE , REFRESH } : begin if ($time - tm_activate < TRC-TJIT_PER) $display ("%m: at time %t ERROR: tRC violation during %s", $time, cmd_string[cmd]); end - {1'bx, DIFF_BANK , ACTIVATE , PWR_DOWN } : begin if (ck_cntr - ck_activate < TACTPDEN) $display ("%m: at time %t ERROR: tACTPDEN violation during %s", $time, cmd_string[cmd]); end - - // write - {1'bx, SAME_BANK , WRITE , PRECHARGE} : begin if (($time - tm_bank_write_end[bank] < TWR-TJIT_PER) || (ck_cntr - ck_bank_write[bank] <= write_latency + burst_length/2)) $display ("%m: at time %t ERROR: tWR violation during %s to bank %d", $time, cmd_string[cmd], bank); end - {1'b0, DIFF_BANK , WRITE , WRITE } : begin if (ck_cntr - ck_write < TCCD) $display ("%m: at time %t ERROR: tCCD violation during %s to bank %d", $time, cmd_string[cmd], bank); end - {1'b1, DIFF_BANK , WRITE , WRITE } : begin if (ck_cntr - ck_group_write[bank[1]] < TCCD) $display ("%m: at time %t ERROR: tCCD violation during %s to bank %d", $time, cmd_string[cmd], bank); end - {1'b0, DIFF_BANK , WRITE , READ } : begin if (ck_cntr - ck_write < write_latency + burst_length/2 + TWTR_TCK - additive_latency) $display ("%m: at time %t ERROR: tWTR violation during %s to bank %d", $time, cmd_string[cmd], bank); end - {1'b1, DIFF_BANK , WRITE , READ } : begin if (ck_cntr - ck_group_write[bank[1]] < write_latency + burst_length/2 + TWTR_TCK - additive_latency) $display ("%m: at time %t ERROR: tWTR violation during %s to bank %d", $time, cmd_string[cmd], bank); end - {1'b1, DIFF_GROUP, WRITE , WRITE } : begin if (ck_cntr - ck_write < TCCD_DG) $display ("%m: at time %t ERROR: tCCD_DG violation during %s to bank %d", $time, cmd_string[cmd], bank); end - {1'b1, DIFF_GROUP, WRITE , READ } : begin if (ck_cntr - ck_write < write_latency + burst_length/2 + TWTR_DG_TCK - additive_latency) $display ("%m: at time %t ERROR: tWTR_DG violation during %s to bank %d", $time, cmd_string[cmd], bank); end - {1'bx, DIFF_BANK , WRITE , PWR_DOWN } : begin if (($time - tm_write_end < TWR-TJIT_PER) || (ck_cntr - ck_write < write_latency + burst_length/2)) $display ("%m: at time %t ERROR: tWRPDEN violation during %s", $time, cmd_string[cmd]); end - - // read - {1'bx, SAME_BANK , READ , PRECHARGE} : begin if (($time - tm_bank_read_end[bank] < TRTP-TJIT_PER) || (ck_cntr - ck_bank_read[bank] < additive_latency + TRTP_TCK)) $display ("%m: at time %t ERROR: tRTP violation during %s to bank %d", $time, cmd_string[cmd], bank); end - {1'b0, DIFF_BANK , READ , WRITE } : ; // tRTW is checked outside this task - {1'b1, DIFF_BANK , READ , WRITE } : ; // tRTW is checked outside this task - {1'b0, DIFF_BANK , READ , READ } : begin if (ck_cntr - ck_read < TCCD) $display ("%m: at time %t ERROR: tCCD violation during %s to bank %d", $time, cmd_string[cmd], bank); end - {1'b1, DIFF_BANK , READ , READ } : begin if (ck_cntr - ck_group_read[bank[1]] < TCCD) $display ("%m: at time %t ERROR: tCCD violation during %s to bank %d", $time, cmd_string[cmd], bank); end - {1'b1, DIFF_GROUP, READ , WRITE } : ; // tRTW is checked outside this task - {1'b1, DIFF_GROUP, READ , READ } : begin if (ck_cntr - ck_read < TCCD_DG) $display ("%m: at time %t ERROR: tCCD_DG violation during %s to bank %d", $time, cmd_string[cmd], bank); end - {1'bx, DIFF_BANK , READ , PWR_DOWN } : begin if (ck_cntr - ck_read < read_latency + 5) $display ("%m: at time %t ERROR: tRDPDEN violation during %s", $time, cmd_string[cmd]); end - - // zq - {1'bx, DIFF_BANK , ZQ , LOAD_MODE} : ; // 1 tCK - {1'bx, DIFF_BANK , ZQ , REFRESH } , - {1'bx, DIFF_BANK , ZQ , PRECHARGE} , - {1'bx, DIFF_BANK , ZQ , ACTIVATE } , - {1'bx, DIFF_BANK , ZQ , ZQ } , - {1'bx, DIFF_BANK , ZQ , PWR_DOWN } , - {1'bx, DIFF_BANK , ZQ , SELF_REF } : begin if (ck_cntr - ck_zqinit < TZQINIT) $display ("%m: at time %t ERROR: tZQinit violation during %s", $time, cmd_string[cmd]); - if (ck_cntr - ck_zqoper < TZQOPER) $display ("%m: at time %t ERROR: tZQoper violation during %s", $time, cmd_string[cmd]); - if (ck_cntr - ck_zqcs < TZQCS) $display ("%m: at time %t ERROR: tZQCS violation during %s", $time, cmd_string[cmd]); end - - // power down - {1'bx, DIFF_BANK , PWR_DOWN , LOAD_MODE} , - {1'bx, DIFF_BANK , PWR_DOWN , REFRESH } , - {1'bx, DIFF_BANK , PWR_DOWN , PRECHARGE} , - {1'bx, DIFF_BANK , PWR_DOWN , ACTIVATE } , - {1'bx, DIFF_BANK , PWR_DOWN , WRITE } , - {1'bx, DIFF_BANK , PWR_DOWN , ZQ } : begin if (($time - tm_power_down < TXP) || (ck_cntr - ck_power_down < TXP_TCK)) $display ("%m: at time %t ERROR: tXP violation during %s", $time, cmd_string[cmd]); end - {1'bx, DIFF_BANK , PWR_DOWN , READ } : begin if (($time - tm_power_down < TXP) || (ck_cntr - ck_power_down < TXP_TCK)) $display ("%m: at time %t ERROR: tXP violation during %s", $time, cmd_string[cmd]); - else if (($time - tm_slow_exit_pd < TXPDLL) || (ck_cntr - ck_slow_exit_pd < TXPDLL_TCK)) $display ("%m: at time %t ERROR: tXPDLL violation during %s", $time, cmd_string[cmd]); end - {1'bx, DIFF_BANK , PWR_DOWN , PWR_DOWN } , - {1'bx, DIFF_BANK , PWR_DOWN , SELF_REF } : begin if (($time - tm_power_down < TXP) || (ck_cntr - ck_power_down < TXP_TCK)) $display ("%m: at time %t ERROR: tXP violation during %s", $time, cmd_string[cmd]); - if ((tm_power_down > tm_refresh) && ($time - tm_refresh < TRFC_MIN)) $display ("%m: at time %t ERROR: tRFC violation during %s", $time, cmd_string[cmd]); - if ((tm_refresh > tm_power_down) && (($time - tm_power_down < TXPDLL) || (ck_cntr - ck_power_down < TXPDLL_TCK))) $display ("%m: at time %t ERROR: tXPDLL violation during %s", $time, cmd_string[cmd]); - if (($time - tm_cke_cmd < TCKE) || (ck_cntr - ck_cke_cmd < TCKE_TCK)) $display ("%m: at time %t ERROR: tCKE violation on CKE", $time); end - - // self refresh - {1'bx, DIFF_BANK , SELF_REF , LOAD_MODE} , - {1'bx, DIFF_BANK , SELF_REF , REFRESH } , - {1'bx, DIFF_BANK , SELF_REF , PRECHARGE} , - {1'bx, DIFF_BANK , SELF_REF , ACTIVATE } , - {1'bx, DIFF_BANK , SELF_REF , WRITE } , - {1'bx, DIFF_BANK , SELF_REF , ZQ } : begin if (($time - tm_self_refresh < TXS) || (ck_cntr - ck_self_refresh < TXS_TCK)) $display ("%m: at time %t ERROR: tXS violation during %s", $time, cmd_string[cmd]); end - {1'bx, DIFF_BANK , SELF_REF , READ } : begin if (ck_cntr - ck_self_refresh < TXSDLL) $display ("%m: at time %t ERROR: tXSDLL violation during %s", $time, cmd_string[cmd]); end - {1'bx, DIFF_BANK , SELF_REF , PWR_DOWN } , - {1'bx, DIFF_BANK , SELF_REF , SELF_REF } : begin if (($time - tm_self_refresh < TXS) || (ck_cntr - ck_self_refresh < TXS_TCK)) $display ("%m: at time %t ERROR: tXS violation during %s", $time, cmd_string[cmd]); - if (($time - tm_cke_cmd < TCKE) || (ck_cntr - ck_cke_cmd < TCKE_TCK)) $display ("%m: at time %t ERROR: tCKE violation on CKE", $time); end - endcase - end - endtask - - task cmd_task; - inout prev_cke; - input cke; - input [2:0] cmd; - input [BA_BITS-1:0] bank; - input [ADDR_BITS-1:0] addr; - reg [`BANKS:0] i; - integer j; - reg [`BANKS:0] tfaw_cntr; - reg [COL_BITS-1:0] col; - reg group; - begin - // tRFC max check - if (!er_trfc_max && !in_self_refresh) begin - if ($time - tm_refresh > TRFC_MAX && check_strict_timing) begin - $display ("%m: at time %t ERROR: tRFC maximum violation during %s", $time, cmd_string[cmd]); - er_trfc_max = 1; - end - end - if (cke) begin - if ((cmd < NOP) && (cmd != PRECHARGE)) begin - if (($time - tm_txpr < TXPR) || (ck_cntr - ck_txpr < TXPR_TCK)) - $display ("%m: at time %t ERROR: tXPR violation during %s", $time, cmd_string[cmd]); - for (j=0; j<=SELF_REF; j=j+1) begin - chk_err(SAME_BANK , bank, j, cmd); - chk_err(DIFF_BANK , bank, j, cmd); - chk_err(DIFF_GROUP, bank, j, cmd); - end - end - case (cmd) - LOAD_MODE : begin - if (|odt_pipeline) - $display ("%m: at time %t ERROR: ODTL violation during %s", $time, cmd_string[cmd]); - if (odt_state && !feature_odt_hi) - $display ("%m: at time %t ERROR: ODT must be off prior to %s", $time, cmd_string[cmd]); - - if (|active_bank) begin - $display ("%m: at time %t ERROR: %s Failure. All banks must be Precharged.", $time, cmd_string[cmd]); - if (STOP_ON_ERROR) $stop(0); - end else begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d", $time, cmd_string[cmd], bank); - if (bank>>2) begin - $display ("%m: at time %t ERROR: %s %d Illegal value. Reserved bank bits must be programmed to zero", $time, cmd_string[cmd], bank); - end - case (bank) - 0 : begin - // Burst Length - if (addr[1:0] == 2'b00) begin - burst_length = 8; - blotf = 0; - truebl4 = 0; - if (DEBUG) $display ("%m: at time %t INFO: %s %d Burst Length = %d", $time, cmd_string[cmd], bank, burst_length); - end else if (addr[1:0] == 2'b01) begin - burst_length = 8; - blotf = 1; - if (DEBUG) $display ("%m: at time %t INFO: %s %d Burst Length = Select via A12", $time, cmd_string[cmd], bank); - end else if (addr[1:0] == 2'b10) begin - burst_length = 4; - blotf = 0; - if (DEBUG) $display ("%m: at time %t INFO: %s %d Burst Length = Fixed %d (chop)", $time, cmd_string[cmd], bank, burst_length); - end else begin - $display ("%m: at time %t ERROR: %s %d Illegal Burst Length = %d", $time, cmd_string[cmd], bank, addr[1:0]); - end - // Burst Order - burst_order = addr[3]; - if (!burst_order) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d Burst Order = Sequential", $time, cmd_string[cmd], bank); - end else if (burst_order) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d Burst Order = Interleaved", $time, cmd_string[cmd], bank); - end else begin - $display ("%m: at time %t ERROR: %s %d Illegal Burst Order = %d", $time, cmd_string[cmd], bank, burst_order); - end - // CAS Latency - cas_latency = {addr[2],addr[6:4]} + 4; - set_latency; - if ((cas_latency >= CL_MIN) && (cas_latency <= CL_MAX)) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d CAS Latency = %d", $time, cmd_string[cmd], bank, cas_latency); - end else begin - $display ("%m: at time %t ERROR: %s %d Illegal CAS Latency = %d", $time, cmd_string[cmd], bank, cas_latency); - end - // Reserved - if (addr[7] !== 0 && check_strict_mrbits) begin - $display ("%m: at time %t ERROR: %s %d Illegal value. Reserved address bits must be programmed to zero", $time, cmd_string[cmd], bank); - end - // DLL Reset - dll_reset = addr[8]; - if (!dll_reset) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d DLL Reset = Normal", $time, cmd_string[cmd], bank); - end else if (dll_reset) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d DLL Reset = Reset DLL", $time, cmd_string[cmd], bank); - dll_locked = 0; - init_dll_reset = 1; - ck_dll_reset <= ck_cntr; - end else begin - $display ("%m: at time %t ERROR: %s %d Illegal DLL Reset = %d", $time, cmd_string[cmd], bank, dll_reset); - end - - // Write Recovery - if (addr[11:9] == 0) begin - write_recovery = 16; - end else if (addr[11:9] < 4) begin - write_recovery = addr[11:9] + 4; - end else begin - write_recovery = 2*addr[11:9]; - end - - if ((write_recovery >= WR_MIN) && (write_recovery <= WR_MAX)) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d Write Recovery = %d", $time, cmd_string[cmd], bank, write_recovery); - end else begin - $display ("%m: at time %t ERROR: %s %d Illegal Write Recovery = %d", $time, cmd_string[cmd], bank, write_recovery); - end - // Power Down Mode - low_power = !addr[12]; - if (!low_power) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d Power Down Mode = DLL on", $time, cmd_string[cmd], bank); - end else if (low_power) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d Power Down Mode = DLL off", $time, cmd_string[cmd], bank); - end else begin - $display ("%m: at time %t ERROR: %s %d Illegal Power Down Mode = %d", $time, cmd_string[cmd], bank, low_power); - end - // Reserved - if (ADDR_BITS>13 && addr[13] !== 0 && check_strict_mrbits) begin - $display ("%m: at time %t ERROR: %s %d Illegal value. Reserved address bits must be programmed to zero", $time, cmd_string[cmd], bank); - end - end - 1 : begin - // DLL Enable - dll_en = !addr[0]; - if (!dll_en) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d DLL Enable = Disabled", $time, cmd_string[cmd], bank); - if (check_strict_mrbits) $display ("%m: at time %t WARNING: %s %d DLL off mode is not fully modeled", $time, cmd_string[cmd], bank); - end else if (dll_en) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d DLL Enable = Enabled", $time, cmd_string[cmd], bank); - end else begin - $display ("%m: at time %t ERROR: %s %d Illegal DLL Enable = %d", $time, cmd_string[cmd], bank, dll_en); - end - // Output Drive Strength - if ({addr[5], addr[1]} == 2'b00) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d Output Drive Strength = %d Ohm", $time, cmd_string[cmd], bank, RZQ/6); - end else if ({addr[5], addr[1]} == 2'b01) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d Output Drive Strength = %d Ohm", $time, cmd_string[cmd], bank, RZQ/7); - end else if ({addr[5], addr[1]} == 2'b11) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d Output Drive Strength = %d Ohm", $time, cmd_string[cmd], bank, RZQ/5); - end else begin - $display ("%m: at time %t ERROR: %s %d Illegal Output Drive Strength = %d", $time, cmd_string[cmd], bank, {addr[5], addr[1]}); - end - // ODT Rtt (Rtt_NOM) - odt_rtt_nom = {addr[9], addr[6], addr[2]}; - if (odt_rtt_nom == 3'b000) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d ODT Rtt = Disabled", $time, cmd_string[cmd], bank); - odt_en = 0; - end else if ((odt_rtt_nom < 4) || ((!addr[7] || (addr[7] && addr[12])) && (odt_rtt_nom < 6))) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d ODT Rtt = %d Ohm", $time, cmd_string[cmd], bank, get_rtt_nom(odt_rtt_nom)); - odt_en = 1; - end else begin - $display ("%m: at time %t ERROR: %s %d Illegal ODT Rtt = %d", $time, cmd_string[cmd], bank, odt_rtt_nom); - odt_en = 0; - end - // Report the additive latency value - al = addr[4:3]; - set_latency; - if (al == 0) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d Additive Latency = %d", $time, cmd_string[cmd], bank, al); - end else if ((al >= AL_MIN) && (al <= AL_MAX)) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d Additive Latency = CL - %d", $time, cmd_string[cmd], bank, al); - end else begin - $display ("%m: at time %t ERROR: %s %d Illegal Additive Latency = %d", $time, cmd_string[cmd], bank, al); - end - // Write Levelization - write_levelization = addr[7]; - if (!write_levelization) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d Write Levelization = Disabled", $time, cmd_string[cmd], bank); - end else if (write_levelization) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d Write Levelization = Enabled", $time, cmd_string[cmd], bank); - end else begin - $display ("%m: at time %t ERROR: %s %d Illegal Write Levelization = %d", $time, cmd_string[cmd], bank, write_levelization); - end - // Reserved - if (addr[8] !== 0 && check_strict_mrbits) begin - $display ("%m: at time %t ERROR: %s %d Illegal value. Reserved address bits must be programmed to zero", $time, cmd_string[cmd], bank); - end - // Reserved - if (addr[10] !== 0 && check_strict_mrbits) begin - $display ("%m: at time %t ERROR: %s %d Illegal value. Reserved address bits must be programmed to zero", $time, cmd_string[cmd], bank); - end - // TDQS Enable - tdqs_en = addr[11]; - if (!tdqs_en) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d TDQS Enable = Disabled", $time, cmd_string[cmd], bank); - end else if (tdqs_en) begin - if (8 == DQ_BITS) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d TDQS Enable = Enabled", $time, cmd_string[cmd], bank); - end - else begin - $display ("%m: at time %t WARNING: %s %d Illegal TDQS Enable. TDQS only exists on a x8 part", $time, cmd_string[cmd], bank); - tdqs_en = 0; - end - end else begin - $display ("%m: at time %t ERROR: %s %d Illegal TDQS Enable = %d", $time, cmd_string[cmd], bank, tdqs_en); - end - // Output Enable - out_en = !addr[12]; - if (!out_en) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d Qoff = Disabled", $time, cmd_string[cmd], bank); - end else if (out_en) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d Qoff = Enabled", $time, cmd_string[cmd], bank); - end else begin - $display ("%m: at time %t ERROR: %s %d Illegal Qoff = %d", $time, cmd_string[cmd], bank, out_en); - end - // Reserved - if (ADDR_BITS>13 && addr[13] !== 0 && check_strict_mrbits) begin - $display ("%m: at time %t ERROR: %s %d Illegal value. Reserved address bits must be programmed to zero", $time, cmd_string[cmd], bank); - end - end - 2 : begin - if (feature_pasr) begin - // Partial Array Self Refresh - pasr = addr[2:0]; - case (pasr) - 3'b000 : if (DEBUG) $display ("%m: at time %t INFO: %s %d Partial Array Self Refresh = Bank 0-7", $time, cmd_string[cmd], bank); - 3'b001 : if (DEBUG) $display ("%m: at time %t INFO: %s %d Partial Array Self Refresh = Bank 0-3", $time, cmd_string[cmd], bank); - 3'b010 : if (DEBUG) $display ("%m: at time %t INFO: %s %d Partial Array Self Refresh = Bank 0-1", $time, cmd_string[cmd], bank); - 3'b011 : if (DEBUG) $display ("%m: at time %t INFO: %s %d Partial Array Self Refresh = Bank 0", $time, cmd_string[cmd], bank); - 3'b100 : if (DEBUG) $display ("%m: at time %t INFO: %s %d Partial Array Self Refresh = Bank 2-7", $time, cmd_string[cmd], bank); - 3'b101 : if (DEBUG) $display ("%m: at time %t INFO: %s %d Partial Array Self Refresh = Bank 4-7", $time, cmd_string[cmd], bank); - 3'b110 : if (DEBUG) $display ("%m: at time %t INFO: %s %d Partial Array Self Refresh = Bank 6-7", $time, cmd_string[cmd], bank); - 3'b111 : if (DEBUG) $display ("%m: at time %t INFO: %s %d Partial Array Self Refresh = Bank 7", $time, cmd_string[cmd], bank); - default : $display ("%m: at time %t ERROR: %s %d Illegal Partial Array Self Refresh = %d", $time, cmd_string[cmd], bank, pasr); - endcase - end - else - if (addr[2:0] !== 0 && check_strict_mrbits) begin - $display ("%m: at time %t ERROR: %s %d Illegal value. Reserved address bits must be programmed to zero", $time, cmd_string[cmd], bank); - end - // CAS Write Latency - cas_write_latency = addr[5:3]+5; - set_latency; - if ((cas_write_latency >= CWL_MIN) && (cas_write_latency <= CWL_MAX)) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d CAS Write Latency = %d", $time, cmd_string[cmd], bank, cas_write_latency); - end else begin - $display ("%m: at time %t ERROR: %s %d Illegal CAS Write Latency = %d", $time, cmd_string[cmd], bank, cas_write_latency); - end - // Auto Self Refresh Method - asr = addr[6]; - if (!asr) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d Auto Self Refresh = Disabled", $time, cmd_string[cmd], bank); - end else if (asr) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d Auto Self Refresh = Enabled", $time, cmd_string[cmd], bank); - if (check_strict_mrbits) $display ("%m: at time %t WARNING: %s %d Auto Self Refresh is not modeled", $time, cmd_string[cmd], bank); - end else begin - $display ("%m: at time %t ERROR: %s %d Illegal Auto Self Refresh = %d", $time, cmd_string[cmd], bank, asr); - end - // Self Refresh Temperature - srt = addr[7]; - if (!srt) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d Self Refresh Temperature = Normal", $time, cmd_string[cmd], bank); - end else if (srt) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d Self Refresh Temperature = Extended", $time, cmd_string[cmd], bank); - if (check_strict_mrbits) $display ("%m: at time %t WARNING: %s %d Self Refresh Temperature is not modeled", $time, cmd_string[cmd], bank); - end else begin - $display ("%m: at time %t ERROR: %s %d Illegal Self Refresh Temperature = %d", $time, cmd_string[cmd], bank, srt); - end - if (asr && srt) - $display ("%m: at time %t ERROR: %s %d SRT must be set to 0 when ASR is enabled.", $time, cmd_string[cmd], bank); - // Reserved - if (addr[8] !== 0 && check_strict_mrbits) begin - $display ("%m: at time %t ERROR: %s %d Illegal value. Reserved address bits must be programmed to zero", $time, cmd_string[cmd], bank); - end - // Dynamic ODT (Rtt_WR) - odt_rtt_wr = addr[10:9]; - if (odt_rtt_wr == 2'b00) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d Dynamic ODT = Disabled", $time, cmd_string[cmd], bank); - dyn_odt_en = 0; - end else if ((odt_rtt_wr > 0) && (odt_rtt_wr < 3)) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d Dynamic ODT Rtt = %d Ohm", $time, cmd_string[cmd], bank, get_rtt_wr(odt_rtt_wr)); - dyn_odt_en = 1; - end else begin - $display ("%m: at time %t ERROR: %s %d Illegal Dynamic ODT = %d", $time, cmd_string[cmd], bank, odt_rtt_wr); - dyn_odt_en = 0; - end - // Reserved - if (ADDR_BITS>13 && addr[13:11] !== 0 && check_strict_mrbits) begin - $display ("%m: at time %t ERROR: %s %d Illegal value. Reserved address bits must be programmed to zero", $time, cmd_string[cmd], bank); - end - end - 3 : begin - mpr_select = addr[1:0]; - // MultiPurpose Register Select - if (mpr_select == 2'b00) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d MultiPurpose Register Select = Pre-defined pattern", $time, cmd_string[cmd], bank); - end else begin - if (check_strict_mrbits) $display ("%m: at time %t ERROR: %s %d Illegal MultiPurpose Register Select = %d", $time, cmd_string[cmd], bank, mpr_select); - end - // MultiPurpose Register Enable - mpr_en = addr[2]; - if (!mpr_en) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d MultiPurpose Register Enable = Disabled", $time, cmd_string[cmd], bank); - end else if (mpr_en) begin - if (DEBUG) $display ("%m: at time %t INFO: %s %d MultiPurpose Register Enable = Enabled", $time, cmd_string[cmd], bank); - end else begin - $display ("%m: at time %t ERROR: %s %d Illegal MultiPurpose Register Enable = %d", $time, cmd_string[cmd], bank, mpr_en); - end - - if (feature_truebl4 && (addr[11] == 1'b1)) begin - if (addr[11] == 1'b1) begin - truebl4 = 1; - $display(" EMRS3 Set True Bl4 mode only "); - end - end - - // Reserved - if (ADDR_BITS>13 && addr[13:3] !== 0 && check_strict_mrbits) begin - $display ("%m: at time %t ERROR: %s %d Illegal value. Reserved address bits must be programmed to zero", $time, cmd_string[cmd], bank); - end - end - endcase - if (dyn_odt_en && write_levelization) - $display ("%m: at time %t ERROR: Dynamic ODT is not available during Write Leveling mode.", $time); - init_mode_reg[bank] = 1; - mode_reg[bank] = addr; - // dll_reset bit self clear - if(bank==0 && addr[8]==1'b1) - mode_reg[0][8] <= #($rtoi(tck_avg)) 1'b0; - tm_load_mode <= $time; - ck_load_mode <= ck_cntr; - end - end - REFRESH : begin - if (mpr_en) begin - $display ("%m: at time %t ERROR: %s Failure. Multipurpose Register must be disabled.", $time, cmd_string[cmd]); - if (STOP_ON_ERROR) $stop(0); - end else if (|active_bank) begin - $display ("%m: at time %t ERROR: %s Failure. All banks must be Precharged.", $time, cmd_string[cmd]); - if (STOP_ON_ERROR) $stop(0); - end else begin - if (DEBUG) $display ("%m: at time %t INFO: %s", $time, cmd_string[cmd]); - er_trfc_max = 0; - ref_cntr = ref_cntr + 1; - tm_refresh <= $time; - ck_refresh <= ck_cntr; - end - end - PRECHARGE : begin - if (addr[AP]) begin - if (DEBUG) $display ("%m: at time %t INFO: %s All", $time, cmd_string[cmd]); - end - // PRECHARGE command will be treated as a NOP if there is no open row in that bank (idle state), - // or if the previously open row is already in the process of precharging - if (|active_bank) begin - if (($time - tm_txpr < TXPR) || (ck_cntr - ck_txpr < TXPR_TCK)) - $display ("%m: at time %t ERROR: tXPR violation during %s", $time, cmd_string[cmd]); - if (mpr_en) begin - $display ("%m: at time %t ERROR: %s Failure. Multipurpose Register must be disabled.", $time, cmd_string[cmd]); - if (STOP_ON_ERROR) $stop(0); - end else begin - for (i=0; i<`BANKS; i=i+1) begin - if (active_bank[i]) begin - if (addr[AP] || (i == bank)) begin - - for (j=0; j<=SELF_REF; j=j+1) begin - chk_err(SAME_BANK, i, j, cmd); - chk_err(DIFF_BANK, i, j, cmd); - end - - if (auto_precharge_bank[i]) begin - $display ("%m: at time %t ERROR: %s Failure. Auto Precharge is scheduled to bank %d.", $time, cmd_string[cmd], i); - if (STOP_ON_ERROR) $stop(0); - end else begin - if (DEBUG) $display ("%m: at time %t INFO: %s bank %d", $time, cmd_string[cmd], i); - active_bank[i] = 1'b0; - tm_bank_precharge[i] <= $time; - tm_precharge <= $time; - ck_precharge <= ck_cntr; - end - end - end - end - end - end // if (|active_bank) - else begin - chk_err(DIFF_BANK, 0, REFRESH, PRECHARGE); - end - end - ACTIVATE : begin - tfaw_cntr = 0; - for (i=0; i<`BANKS; i=i+1) begin - if ($time - tm_bank_activate[i] < TFAW) begin - tfaw_cntr = tfaw_cntr + 1; - end - end - if (tfaw_cntr > 3) begin - $display ("%m: at time %t ERROR: tFAW violation during %s to bank %d", $time, cmd_string[cmd], bank); - end - - if (mpr_en) begin - $display ("%m: at time %t ERROR: %s Failure. Multipurpose Register must be disabled.", $time, cmd_string[cmd]); - if (STOP_ON_ERROR) $stop(0); - end else if (!init_done) begin - $display ("%m: at time %t ERROR: %s Failure. Initialization sequence is not complete.", $time, cmd_string[cmd]); - if (STOP_ON_ERROR) $stop(0); - end else if (active_bank[bank]) begin - $display ("%m: at time %t ERROR: %s Failure. Bank %d must be Precharged.", $time, cmd_string[cmd], bank); - if (STOP_ON_ERROR) $stop(0); - end else begin - if (addr >= 1< AP -`else - col = {addr[BC-1:AP+1], addr[AP-1:0]}; // assume BC > AP -`endif - if (col >= 1< AP -`else - col = {addr[BC-1:AP+1], addr[AP-1:0]}; // assume BC > AP -`endif - if (col >= 1< TPD_MAX) - $display ("%m: at time %t ERROR: tPD maximum violation during Power Down Exit", $time); - if (DEBUG) $display ("%m: at time %t INFO: Power Down Exit", $time); - in_power_down = 0; - if ((active_bank == 0) && low_power) begin // precharge power down with dll off - if (ck_cntr - ck_odt < write_latency - 1) - $display ("%m: at time %t WARNING: tANPD violation during Power Down Exit. Synchronous or asynchronous change in termination resistance is possible.", $time); - tm_slow_exit_pd <= $time; - ck_slow_exit_pd <= ck_cntr; - end - tm_power_down <= $time; - ck_power_down <= ck_cntr; - end - if (in_self_refresh) begin - if (($time - tm_freq_change < TCKSRX) || (ck_cntr - ck_freq_change < TCKSRX_TCK)) - $display ("%m: at time %t ERROR: tCKSRX violation during Self Refresh Exit", $time); - if (ck_cntr - ck_cke_cmd < TCKESR_TCK) - $display ("%m: at time %t ERROR: tCKESR violation during Self Refresh Exit", $time); - if ($time - tm_cke < TISXR) - $display ("%m: at time %t ERROR: tISXR violation during Self Refresh Exit", $time); - if (DEBUG) $display ("%m: at time %t INFO: Self Refresh Exit", $time); - in_self_refresh = 0; - ck_dll_reset <= ck_cntr; - ck_self_refresh <= ck_cntr; - tm_self_refresh <= $time; - tm_refresh <= $time; - end - end - endcase - if ((prev_cke !== 1) && (cmd !== NOP)) begin - $display ("%m: at time %t ERROR: NOP or Deselect is required when CKE goes active.", $time); - end - - if (!init_done) begin - case (init_step) - 0 : begin - if ($time - tm_rst_n < 500000000 && check_strict_timing) - $display ("%m at time %t WARNING: 500 us is required after RST_N goes inactive before CKE goes active.", $time); - tm_txpr <= $time; - ck_txpr <= ck_cntr; - init_step = init_step + 1; - end - 1 : begin - if (dll_en) init_step = init_step + 1; - end - 2 : begin - if (&init_mode_reg && init_dll_reset && zq_set) begin - if (DEBUG) $display ("%m: at time %t INFO: Initialization Sequence is complete", $time); - init_done = 1; - end - end - endcase - end - end else if (prev_cke) begin - if ((!init_done) && (init_step > 1)) begin - $display ("%m: at time %t ERROR: CKE must remain active until the initialization sequence is complete.", $time); - if (STOP_ON_ERROR) $stop(0); - end - case (cmd) - REFRESH : begin - if ($time - tm_txpr < TXPR) - $display ("%m: at time %t ERROR: tXPR violation during %s", $time, cmd_string[SELF_REF]); - for (j=0; j<=SELF_REF; j=j+1) begin - chk_err(DIFF_BANK, bank, j, SELF_REF); - end - - if (mpr_en) begin - $display ("%m: at time %t ERROR: Self Refresh Failure. Multipurpose Register must be disabled.", $time); - if (STOP_ON_ERROR) $stop(0); - end else if (|active_bank) begin - $display ("%m: at time %t ERROR: Self Refresh Failure. All banks must be Precharged.", $time); - if (STOP_ON_ERROR) $stop(0); - end else if (odt_state) begin - $display ("%m: at time %t ERROR: Self Refresh Failure. ODT must be off prior to entering Self Refresh", $time); - if (STOP_ON_ERROR) $stop(0); - end else if (!init_done) begin - $display ("%m: at time %t ERROR: Self Refresh Failure. Initialization sequence is not complete.", $time); - if (STOP_ON_ERROR) $stop(0); - end else begin - if (DEBUG) $display ("%m: at time %t INFO: Self Refresh Enter", $time); - if (feature_pasr) - // Partial Array Self Refresh - case (pasr) - 3'b000 : ;//keep Bank 0-7 - 3'b001 : begin if (DEBUG) $display("%m: at time %t INFO: Banks 4-7 will be lost due to Partial Array Self Refresh", $time); erase_banks(8'hF0); end - 3'b010 : begin if (DEBUG) $display("%m: at time %t INFO: Banks 2-7 will be lost due to Partial Array Self Refresh", $time); erase_banks(8'hFC); end - 3'b011 : begin if (DEBUG) $display("%m: at time %t INFO: Banks 1-7 will be lost due to Partial Array Self Refresh", $time); erase_banks(8'hFE); end - 3'b100 : begin if (DEBUG) $display("%m: at time %t INFO: Banks 0-1 will be lost due to Partial Array Self Refresh", $time); erase_banks(8'h03); end - 3'b101 : begin if (DEBUG) $display("%m: at time %t INFO: Banks 0-3 will be lost due to Partial Array Self Refresh", $time); erase_banks(8'h0F); end - 3'b110 : begin if (DEBUG) $display("%m: at time %t INFO: Banks 0-5 will be lost due to Partial Array Self Refresh", $time); erase_banks(8'h3F); end - 3'b111 : begin if (DEBUG) $display("%m: at time %t INFO: Banks 0-6 will be lost due to Partial Array Self Refresh", $time); erase_banks(8'h7F); end - endcase - in_self_refresh = 1; - dll_locked = 0; - end - end - NOP : begin - // entering precharge power down with dll off and tANPD has not been satisfied - if (low_power && (active_bank == 0) && |odt_pipeline) - $display ("%m: at time %t WARNING: tANPD violation during %s. Synchronous or asynchronous change in termination resistance is possible.", $time, cmd_string[PWR_DOWN]); - if ($time - tm_txpr < TXPR) - $display ("%m: at time %t ERROR: tXPR violation during %s", $time, cmd_string[PWR_DOWN]); - for (j=0; j<=SELF_REF; j=j+1) begin - chk_err(DIFF_BANK, bank, j, PWR_DOWN); - end - - if (mpr_en) begin - $display ("%m: at time %t ERROR: Power Down Failure. Multipurpose Register must be disabled.", $time); - if (STOP_ON_ERROR) $stop(0); - end else if (!init_done) begin - $display ("%m: at time %t ERROR: Power Down Failure. Initialization sequence is not complete.", $time); - if (STOP_ON_ERROR) $stop(0); - end else begin - if (DEBUG) begin - if (|active_bank) begin - $display ("%m: at time %t INFO: Active Power Down Enter", $time); - end else begin - $display ("%m: at time %t INFO: Precharge Power Down Enter", $time); - end - end - in_power_down = 1; - end - end - default : begin - $display ("%m: at time %t ERROR: NOP, Deselect, or Refresh is required when CKE goes inactive.", $time); - end - endcase - end else if (in_self_refresh || in_power_down) begin - if ((ck_cntr - ck_cke_cmd <= TCPDED) && (cmd !== NOP)) - $display ("%m: at time %t ERROR: tCPDED violation during Power Down or Self Refresh Entry. NOP or Deselect is required.", $time); - end - prev_cke = cke; - - end - endtask - - task data_task; - reg [BA_BITS-1:0] bank; - reg [ROW_BITS-1:0] row; - reg [COL_BITS-1:0] col; - integer i; - integer j; - begin - - if (diff_ck) begin - for (i=0; i<64; i=i+1) begin - if (dq_in_valid && dll_locked && ($time - tm_dqs_neg[i] < $rtoi(TDSS*tck_avg))) - $display ("%m: at time %t ERROR: tDSS violation on %s bit %d", $time, dqs_string[i/32], i%32); - if (check_write_dqs_high[i]) - $display ("%m: at time %t ERROR: %s bit %d latching edge required during the preceding clock period.", $time, dqs_string[i/32], i%32); - end - check_write_dqs_high <= 0; - end else begin - for (i=0; i<64; i=i+1) begin - if (dll_locked && dq_in_valid) begin - tm_tdqss = abs_value(1.0*tm_ck_pos - tm_dqss_pos[i]); - if ((tm_tdqss < tck_avg/2.0) && (tm_tdqss > TDQSS*tck_avg)) - $display ("%m: at time %t ERROR: tDQSS violation on %s bit %d", $time, dqs_string[i/32], i%32); - end - if (check_write_dqs_low[i]) - $display ("%m: at time %t ERROR: %s bit %d latching edge required during the preceding clock period", $time, dqs_string[i/32], i%32); - end - check_write_preamble <= 0; - check_write_postamble <= 0; - check_write_dqs_low <= 0; - end - - if (wr_pipeline[0] || rd_pipeline[0]) begin - bank = ba_pipeline[0]; - row = row_pipeline[0]; - col = col_pipeline[0]; - burst_cntr = 0; - memory_read(bank, row, col, memory_data); - end - - // burst counter - if (burst_cntr < burst_length) begin - burst_position = col ^ burst_cntr; - if (!burst_order) begin - burst_position[BO_BITS-1:0] = col + burst_cntr; - end - burst_cntr = burst_cntr + 1; - end - - // write dqs counter - if (wr_pipeline[WDQS_PRE + 1]) begin - wdqs_cntr = WDQS_PRE + bl_pipeline[WDQS_PRE + 1] + WDQS_PST - 1; - end - // write dqs - if ((wr_pipeline[2]) && (wdq_cntr == 0)) begin //write preamble - check_write_preamble <= ({DQS_BITS{1'b1}}<<32) | {DQS_BITS{1'b1}}; - end - if (wdqs_cntr > 1) begin // write data - if ((wdqs_cntr - WDQS_PST)%2) begin - check_write_dqs_high <= ({DQS_BITS{1'b1}}<<32) | {DQS_BITS{1'b1}}; - end else begin - check_write_dqs_low <= ({DQS_BITS{1'b1}}<<32) | {DQS_BITS{1'b1}}; - end - end - if (wdqs_cntr == WDQS_PST) begin // write postamble - check_write_postamble <= ({DQS_BITS{1'b1}}<<32) | {DQS_BITS{1'b1}}; - end - if (wdqs_cntr > 0) begin - wdqs_cntr = wdqs_cntr - 1; - end - - // write dq - if (dq_in_valid) begin // write data - bit_mask = 0; - if (diff_ck) begin - for (i=0; i>(burst_position*DQ_BITS); - if (DEBUG) $display ("%m: at time %t INFO: WRITE @ DQS= bank = %h row = %h col = %h data = %h",$time, bank, row, (-1*BL_MAX & col) + burst_position, dq_temp); - if (burst_cntr%BL_MIN == 0) begin - memory_write(bank, row, col, memory_data); - end - end - if (wr_pipeline[1]) begin - wdq_cntr = bl_pipeline[1]; - end - if (wdq_cntr > 0) begin - wdq_cntr = wdq_cntr - 1; - dq_in_valid = 1'b1; - end else begin - dq_in_valid = 1'b0; - dqs_in_valid <= 1'b0; - for (i=0; i<63; i=i+1) begin - wdqs_pos_cntr[i] <= 0; - end - end - if (wr_pipeline[0]) begin - b2b_write <= 1'b0; - end - if (wr_pipeline[2]) begin - if (dqs_in_valid) begin - b2b_write <= 1'b1; - end - dqs_in_valid <= 1'b1; - wr_burst_length = bl_pipeline[2]; - end - - // read dqs enable counter - if (rd_pipeline[RDQSEN_PRE]) begin - rdqsen_cntr = RDQSEN_PRE + bl_pipeline[RDQSEN_PRE] + RDQSEN_PST - 1; - end - if (rdqsen_cntr > 0) begin - rdqsen_cntr = rdqsen_cntr - 1; - dqs_out_en = 1'b1; - end else begin - dqs_out_en = 1'b0; - end - - // read dqs counter - if (rd_pipeline[RDQS_PRE]) begin - rdqs_cntr = RDQS_PRE + bl_pipeline[RDQS_PRE] + RDQS_PST - 1; - end - // read dqs - if (((rd_pipeline>>1 & {RDQS_PRE{1'b1}}) > 0) && (rdq_cntr == 0)) begin //read preamble - dqs_out = 1'b0; - end else if (rdqs_cntr > RDQS_PST) begin // read data - dqs_out = rdqs_cntr - RDQS_PST; - end else if (rdqs_cntr > 0) begin // read postamble - dqs_out = 1'b0; - end else begin - dqs_out = 1'b1; - end - if (rdqs_cntr > 0) begin - rdqs_cntr = rdqs_cntr - 1; - end - - // read dq enable counter - if (rd_pipeline[RDQEN_PRE]) begin - rdqen_cntr = RDQEN_PRE + bl_pipeline[RDQEN_PRE] + RDQEN_PST; - end - if (rdqen_cntr > 0) begin - rdqen_cntr = rdqen_cntr - 1; - dq_out_en = 1'b1; - end else begin - dq_out_en = 1'b0; - end - // read dq - if (rd_pipeline[0]) begin - rdq_cntr = bl_pipeline[0]; - end - if (rdq_cntr > 0) begin // read data - if (mpr_en) begin -`ifdef MPR_DQ0 // DQ0 output MPR data, other DQ low - if (mpr_select == 2'b00) begin // Calibration Pattern - dq_temp = {DQS_BITS{{`DQ_PER_DQS-1{1'b0}}, calibration_pattern[burst_position]}}; - end else if (odts_readout && (mpr_select == 2'b11)) begin // Temp Sensor (ODTS) - dq_temp = {DQS_BITS{{`DQ_PER_DQS-1{1'b0}}, temp_sensor[burst_position]}}; - end else begin // Reserved - dq_temp = {DQS_BITS{{`DQ_PER_DQS-1{1'b0}}, 1'bx}}; - end -`else // all DQ output MPR data - if (mpr_select == 2'b00) begin // Calibration Pattern - dq_temp = {DQS_BITS{{`DQ_PER_DQS{calibration_pattern[burst_position]}}}}; - end else if (odts_readout && (mpr_select == 2'b11)) begin // Temp Sensor (ODTS) - dq_temp = {DQS_BITS{{`DQ_PER_DQS{temp_sensor[burst_position]}}}}; - end else begin // Reserved - dq_temp = {DQS_BITS{{`DQ_PER_DQS{1'bx}}}}; - end -`endif - if (DEBUG) $display ("%m: at time %t READ @ DQS MultiPurpose Register %d, col = %d, data = %b", $time, mpr_select, burst_position, dq_temp[0]); - end else begin - dq_temp = memory_data>>(burst_position*DQ_BITS); - if (DEBUG) $display ("%m: at time %t INFO: READ @ DQS= bank = %h row = %h col = %h data = %h",$time, bank, row, (-1*BL_MAX & col) + burst_position, dq_temp); - end - dq_out = dq_temp; - rdq_cntr = rdq_cntr - 1; - end else begin - dq_out = {DQ_BITS{1'b1}}; - end - - // delay signals prior to output - if (RANDOM_OUT_DELAY && (dqs_out_en || (|dqs_out_en_dly) || dq_out_en || (|dq_out_en_dly))) begin - for (i=0; i dqsck[i] + TQH*tck_avg + TDQSQ) begin - dqsck_max = dqsck[i] + TQH*tck_avg + TDQSQ; - end - dqsck_min = -1*TDQSCK; - if (dqsck_min < dqsck[i] - TQH*tck_avg - TDQSQ) begin - dqsck_min = dqsck[i] - TQH*tck_avg - TDQSQ; - end - - // DQSQ requirements - // 1.) less than tDQSQ - // 2.) greater than 0 - // 3.) greater than tQH from the previous DQS edge - dqsq_min = 0; - if (dqsq_min < dqsck[i] - TQH*tck_avg) begin - dqsq_min = dqsck[i] - TQH*tck_avg; - end - if (dqsck_min == dqsck_max) begin - dqsck[i] = dqsck_min; - end else begin - dqsck[i] = $dist_uniform(seed, dqsck_min, dqsck_max); - end - dqsq_max = TDQSQ + dqsck[i]; - - dqs_out_en_dly[i] <= #(tck_avg/2) dqs_out_en; - dqs_out_dly[i] <= #(tck_avg/2 + dqsck[i]) dqs_out; - if (!write_levelization) begin - for (j=0; j<`DQ_PER_DQS; j=j+1) begin - dq_out_en_dly[i*`DQ_PER_DQS + j] <= #(tck_avg/2) dq_out_en; - if (dqsq_min == dqsq_max) begin - dq_out_dly [i*`DQ_PER_DQS + j] <= #(tck_avg/2 + dqsq_min) dq_out[i*`DQ_PER_DQS + j]; - end else begin - dq_out_dly [i*`DQ_PER_DQS + j] <= #(tck_avg/2 + $dist_uniform(seed, dqsq_min, dqsq_max)) dq_out[i*`DQ_PER_DQS + j]; - end - end - end - end - end else begin - if (dll_en) - if(diff_ck) - out_delay = ($rtoi(tch_avg) > 50000) ? 0 : $rtoi(tch_avg); - else - out_delay = ($rtoi(tcl_avg) > 50000) ? 0 : $rtoi(tcl_avg); - else - if(diff_ck) - out_delay = ($rtoi(tch_avg) > 50000) ? 0 : $rtoi(tch_avg) + TDQSCK_DLLDIS; - else - out_delay = ($rtoi(tcl_avg) > 50000) ? 0 : $rtoi(tcl_avg) + TDQSCK_DLLDIS; - dqs_out_en_dly <= #(out_delay) {DQS_BITS{dqs_out_en}}; - dqs_out_dly <= #(out_delay) {DQS_BITS{dqs_out }}; - if (write_levelization !== 1'b1) begin - dq_out_en_dly <= #(out_delay) {DQ_BITS {dq_out_en }}; - dq_out_dly <= #(out_delay) {DQ_BITS {dq_out }}; - end - end - end - endtask - - always @ (posedge rst_n_in) begin : reset - integer i; - if (rst_n_in) begin - if ($time < 200000000 && check_strict_timing) - $display ("%m at time %t WARNING: 200 us is required before RST_N goes inactive.", $time); - if (cke_in !== 1'b0) - $display ("%m: at time %t ERROR: CKE must be inactive when RST_N goes inactive.", $time); - if ($time - tm_cke < 10000) - $display ("%m: at time %t ERROR: CKE must be maintained inactive for 10 ns before RST_N goes inactive.", $time); - - // clear memory -`ifdef MAX_MEM - // verification group does not erase memory - // for (banki = 0; banki < `BANKS; banki = banki + 1) begin - // $fclose(memfd[banki]); - // memfd[banki] = open_bank_file(banki); - // end -`else - memory_used <= 0; //erase memory -`endif - - end - end - - always @(negedge rst_n_in or posedge diff_ck or negedge diff_ck) begin : main - integer i; - if (!rst_n_in) begin - reset_task; - end else begin - if (!in_self_refresh && (diff_ck !== 1'b0) && (diff_ck !== 1'b1)) - $display ("%m: at time %t ERROR: CK and CK_N are not allowed to go to an unknown state.", $time); - data_task; - - // Clock Frequency Change is legal: - // 1.) During Self Refresh - // 2.) During Precharge Power Down (DLL on or off) - if (in_self_refresh || (in_power_down && (active_bank == 0))) begin - if (diff_ck) begin - tjit_per_rtime = $time - tm_ck_pos - tck_avg; - end else begin - tjit_per_rtime = $time - tm_ck_neg - tck_avg; - end - if (dll_locked && (abs_value(tjit_per_rtime) > TJIT_PER)) begin - if ((tm_ck_pos - tm_cke_cmd < TCKSRE) || (ck_cntr - ck_cke_cmd < TCKSRE_TCK)) - $display ("%m: at time %t ERROR: tCKSRE violation during Self Refresh or Precharge Power Down Entry", $time); - if (odt_state) begin - $display ("%m: at time %t ERROR: Clock Frequency Change Failure. ODT must be off prior to Clock Frequency Change.", $time); - if (STOP_ON_ERROR) $stop(0); - end else begin - if (DEBUG) $display ("%m: at time %t INFO: Clock Frequency Change detected. DLL Reset is Required.", $time); - tm_freq_change <= $time; - ck_freq_change <= ck_cntr; - dll_locked = 0; - end - end - end - - if (diff_ck) begin - // check setup of command signals - if ($time > TIS) begin - if ($time - tm_cke < TIS) - $display ("%m: at time %t ERROR: tIS violation on CKE by %t", $time, tm_cke + TIS - $time); - if (cke_in) begin - for (i=0; i<23; i=i+1) begin - if ($time - tm_cmd_addr[i] < TIS) - $display ("%m: at time %t ERROR: tIS violation on %s by %t", $time, cmd_addr_string[i], tm_cmd_addr[i] + TIS - $time); - end - end - end - - // update current state - if (dll_locked) begin - if (mr_chk == 0) begin - mr_chk = 1; - end else if (init_mode_reg[0] && (mr_chk == 1)) begin - // check CL value against the clock frequency - // check WR value against the clock frequency - if (ceil(write_recovery*tck_avg) < TWR) - $display ("%m: at time %t ERROR: Write Recovery = %d is illegal @tCK(avg) = %f", $time, write_recovery, tck_avg); - // check the CWL value against the clock frequency - if (check_strict_timing) begin - case (cas_write_latency) - 5 : if (tck_avg < 2500.0) $display ("%m: at time %t ERROR: CWL = %d is illegal @tCK(avg) = %f", $time, cas_write_latency, tck_avg); - 6 : if ((tck_avg < 1875.0) || (tck_avg >= 2500.0)) $display ("%m: at time %t ERROR: CWL = %d is illegal @tCK(avg) = %f", $time, cas_write_latency, tck_avg); - 7 : if ((tck_avg < 1500.0) || (tck_avg >= 1875.0)) $display ("%m: at time %t ERROR: CWL = %d is illegal @tCK(avg) = %f", $time, cas_write_latency, tck_avg); - 8 : if ((tck_avg < 1250.0) || (tck_avg >= 1500.0)) $display ("%m: at time %t ERROR: CWL = %d is illegal @tCK(avg) = %f", $time, cas_write_latency, tck_avg); - 9 : if ((tck_avg < 15e3/14) || (tck_avg >= 1250.0)) $display ("%m: at time %t ERROR: CWL = %d is illegal @tCK(avg) = %f", $time, cas_write_latency, tck_avg); - 10: if ((tck_avg < 937.5) || (tck_avg >= 15e3/14)) $display ("%m: at time %t ERROR: CWL = %d is illegal @tCK(avg) = %f", $time, cas_write_latency, tck_avg); - default : $display ("%m: at time %t ERROR: CWL = %d is illegal @tCK(avg) = %f", $time, cas_write_latency, tck_avg); - endcase - // check the CL value against the clock frequency - if (!valid_cl(cas_latency, cas_write_latency)) - $display ("%m: at time %t ERROR: CAS Latency = %d is not valid when CAS Write Latency = %d", $time, cas_latency, cas_write_latency); - end - mr_chk = 2; - end - end else if (!in_self_refresh) begin - mr_chk = 0; - if (ck_cntr - ck_dll_reset == TDLLK) begin - dll_locked = 1; - end - end - - if (|auto_precharge_bank) begin - for (i=0; i<`BANKS; i=i+1) begin - // Write with Auto Precharge Calculation - // 1. Meet minimum tRAS requirement - // 2. Write Latency PLUS BL/2 cycles PLUS WR after Write command - if (write_precharge_bank[i]) begin - if ($time - tm_bank_activate[i] >= TRAS_MIN) begin - if (ck_cntr - ck_bank_write[i] >= write_latency + burst_length/2 + write_recovery) begin - if (DEBUG) $display ("%m: at time %t INFO: Auto Precharge bank %d", $time, i); - write_precharge_bank[i] = 0; - active_bank[i] = 0; - auto_precharge_bank[i] = 0; - tm_bank_precharge[i] = $time; - tm_precharge = $time; - ck_precharge = ck_cntr; - end - end - end - // Read with Auto Precharge Calculation - // 1. Meet minimum tRAS requirement - // 2. Additive Latency plus 4 cycles after Read command - // 3. tRTP after the last 8-bit prefetch - if (read_precharge_bank[i]) begin - if (($time - tm_bank_activate[i] >= TRAS_MIN) && (ck_cntr - ck_bank_read[i] >= additive_latency + TRTP_TCK)) begin - read_precharge_bank[i] = 0; - // In case the internal precharge is pushed out by tRTP, tRP starts at the point where - // the internal precharge happens (not at the next rising clock edge after this event). - if ($time - tm_bank_read_end[i] < TRTP) begin - if (DEBUG) $display ("%m: at time %t INFO: Auto Precharge bank %d", tm_bank_read_end[i] + TRTP, i); - active_bank[i] <= #(tm_bank_read_end[i] + TRTP - $time) 0; - auto_precharge_bank[i] <= #(tm_bank_read_end[i] + TRTP - $time) 0; - tm_bank_precharge[i] <= #(tm_bank_read_end[i] + TRTP - $time) tm_bank_read_end[i] + TRTP; - tm_precharge <= #(tm_bank_read_end[i] + TRTP - $time) tm_bank_read_end[i] + TRTP; - ck_precharge = ck_cntr; - end else begin - if (DEBUG) $display ("%m: at time %t INFO: Auto Precharge bank %d", $time, i); - active_bank[i] = 0; - auto_precharge_bank[i] = 0; - tm_bank_precharge[i] = $time; - tm_precharge = $time; - ck_precharge = ck_cntr; - end - end - end - end - end - - - // respond to incoming command - if (cke_in ^ prev_cke) begin - tm_cke_cmd <= $time; - ck_cke_cmd <= ck_cntr; - end - - - cmd_task(prev_cke, cke_in, cmd_n_in, ba_in, addr_in); - if ((cmd_n_in == WRITE) || (cmd_n_in == READ)) begin - al_pipeline[2*additive_latency] = 1'b1; - end - if (al_pipeline[0]) begin - // check tRCD after additive latency - if ((rd_pipeline[2*cas_latency - 1]) && ($time - tm_bank_activate[ba_pipeline[2*cas_latency - 1]] < TRCD)) - $display ("%m: at time %t ERROR: tRCD violation during %s", $time, cmd_string[READ]); - if ((wr_pipeline[2*cas_write_latency + 1]) && ($time - tm_bank_activate[ba_pipeline[2*cas_write_latency + 1]] < TRCD)) - $display ("%m: at time %t ERROR: tRCD violation during %s", $time, cmd_string[WRITE]); - // check tWTR after additive latency - if (rd_pipeline[2*cas_latency - 1]) begin //{ - if (truebl4) begin //{ - i = ba_pipeline[2*cas_latency - 1]; - if ($time - tm_group_write_end[i[1]] < TWTR) - $display ("%m: at time %t ERROR: tWTR violation during %s", $time, cmd_string[READ]); - if ($time - tm_write_end < TWTR_DG) - $display ("%m: at time %t ERROR: tWTR_DG violation during %s", $time, cmd_string[READ]); - end else begin - if ($time - tm_write_end < TWTR) - $display ("%m: at time %t ERROR: tWTR violation during %s", $time, cmd_string[READ]); - end - end - end - if (rd_pipeline) begin - if (rd_pipeline[2*cas_latency - 1]) begin - tm_bank_read_end[ba_pipeline[2*cas_latency - 1]] <= $time; - end - end - for (i=0; i<`BANKS; i=i+1) begin - if ((ck_cntr - ck_bank_write[i] > write_latency) && (ck_cntr - ck_bank_write[i] <= write_latency + burst_length/2)) begin - tm_bank_write_end[i] <= $time; - tm_group_write_end[i[1]] <= $time; - tm_write_end <= $time; - end - end - - // clk pin is disabled during self refresh - if (!in_self_refresh && tm_ck_pos ) begin - tjit_cc_time = $time - tm_ck_pos - tck_i; - tck_i = $time - tm_ck_pos; - tck_avg = tck_avg - tck_sample[ck_cntr%PERTCKAVG]/$itor(PERTCKAVG); - tck_avg = tck_avg + tck_i/$itor(PERTCKAVG); - tck_sample[ck_cntr%PERTCKAVG] = tck_i; - tjit_per_rtime = tck_i - tck_avg; - - if (dll_locked && check_strict_timing) begin - // check accumulated error - terr_nper_rtime = 0; - for (i=0; i<12; i=i+1) begin - terr_nper_rtime = terr_nper_rtime + tck_sample[i] - tck_avg; - terr_nper_rtime = abs_value(terr_nper_rtime); - case (i) - 0 :; - 1 : if (terr_nper_rtime - TERR_2PER >= 1.0) $display ("%m: at time %t ERROR: tERR(2per) violation by %f ps.", $time, terr_nper_rtime - TERR_2PER); - 2 : if (terr_nper_rtime - TERR_3PER >= 1.0) $display ("%m: at time %t ERROR: tERR(3per) violation by %f ps.", $time, terr_nper_rtime - TERR_3PER); - 3 : if (terr_nper_rtime - TERR_4PER >= 1.0) $display ("%m: at time %t ERROR: tERR(4per) violation by %f ps.", $time, terr_nper_rtime - TERR_4PER); - 4 : if (terr_nper_rtime - TERR_5PER >= 1.0) $display ("%m: at time %t ERROR: tERR(5per) violation by %f ps.", $time, terr_nper_rtime - TERR_5PER); - 5 : if (terr_nper_rtime - TERR_6PER >= 1.0) $display ("%m: at time %t ERROR: tERR(6per) violation by %f ps.", $time, terr_nper_rtime - TERR_6PER); - 6 : if (terr_nper_rtime - TERR_7PER >= 1.0) $display ("%m: at time %t ERROR: tERR(7per) violation by %f ps.", $time, terr_nper_rtime - TERR_7PER); - 7 : if (terr_nper_rtime - TERR_8PER >= 1.0) $display ("%m: at time %t ERROR: tERR(8per) violation by %f ps.", $time, terr_nper_rtime - TERR_8PER); - 8 : if (terr_nper_rtime - TERR_9PER >= 1.0) $display ("%m: at time %t ERROR: tERR(9per) violation by %f ps.", $time, terr_nper_rtime - TERR_9PER); - 9 : if (terr_nper_rtime - TERR_10PER >= 1.0) $display ("%m: at time %t ERROR: tERR(10per) violation by %f ps.", $time, terr_nper_rtime - TERR_10PER); - 10 : if (terr_nper_rtime - TERR_11PER >= 1.0) $display ("%m: at time %t ERROR: tERR(11per) violation by %f ps.", $time, terr_nper_rtime - TERR_11PER); - 11 : if (terr_nper_rtime - TERR_12PER >= 1.0) $display ("%m: at time %t ERROR: tERR(12per) violation by %f ps.", $time, terr_nper_rtime - TERR_12PER); - endcase - end - - // check tCK min/max/jitter - if (abs_value(tjit_per_rtime) - TJIT_PER >= 1.0) - $display ("%m: at time %t ERROR: tJIT(per) violation by %f ps.", $time, abs_value(tjit_per_rtime) - TJIT_PER); - if (abs_value(tjit_cc_time) - TJIT_CC >= 1.0) - $display ("%m: at time %t ERROR: tJIT(cc) violation by %f ps.", $time, abs_value(tjit_cc_time) - TJIT_CC); - if (TCK_MIN - tck_avg >= 1.0) - $display ("%m: at time %t ERROR: tCK(avg) minimum violation by %f ps.", $time, TCK_MIN - tck_avg); - if (tck_avg - TCK_MAX >= 1.0) - $display ("%m: at time %t ERROR: tCK(avg) maximum violation by %f ps.", $time, tck_avg - TCK_MAX); - - // check tCL - if (tm_ck_neg - $time < TCL_ABS_MIN*tck_avg) - $display ("%m: at time %t ERROR: tCL(abs) minimum violation on CLK by %t", $time, TCL_ABS_MIN*tck_avg - tm_ck_neg + $time); - if (tcl_avg < TCL_AVG_MIN*tck_avg) - $display ("%m: at time %t ERROR: tCL(avg) minimum violation on CLK by %t", $time, TCL_AVG_MIN*tck_avg - tcl_avg); - if (tcl_avg > TCL_AVG_MAX*tck_avg) - $display ("%m: at time %t ERROR: tCL(avg) maximum violation on CLK by %t", $time, tcl_avg - TCL_AVG_MAX*tck_avg); - end - - // calculate the tch avg jitter - tch_avg = tch_avg - tch_sample[ck_cntr%PERTCKAVG]/$itor(PERTCKAVG); - tch_avg = tch_avg + tch_i/$itor(PERTCKAVG); - tch_sample[ck_cntr%PERTCKAVG] = tch_i; - tjit_ch_rtime = tch_i - tch_avg; - duty_cycle = $rtoi(tch_avg*100/tck_avg); - - // update timers/counters - tcl_i <= $time - tm_ck_neg; - end - - prev_odt <= odt_in; - // update timers/counters - ck_cntr <= ck_cntr + 1; - tm_ck_pos = $time; - end else begin - // clk pin is disabled during self refresh - if (!in_self_refresh) begin - if (dll_locked && check_strict_timing) begin - if ($time - tm_ck_pos < TCH_ABS_MIN*tck_avg) - $display ("%m: at time %t ERROR: tCH(abs) minimum violation on CLK by %t", $time, TCH_ABS_MIN*tck_avg - $time + tm_ck_pos); - if (tch_avg < TCH_AVG_MIN*tck_avg) - $display ("%m: at time %t ERROR: tCH(avg) minimum violation on CLK by %t", $time, TCH_AVG_MIN*tck_avg - tch_avg); - if (tch_avg > TCH_AVG_MAX*tck_avg) - $display ("%m: at time %t ERROR: tCH(avg) maximum violation on CLK by %t", $time, tch_avg - TCH_AVG_MAX*tck_avg); - end - - // calculate the tcl avg jitter - tcl_avg = tcl_avg - tcl_sample[ck_cntr%PERTCKAVG]/$itor(PERTCKAVG); - tcl_avg = tcl_avg + tcl_i/$itor(PERTCKAVG); - tcl_sample[ck_cntr%PERTCKAVG] = tcl_i; - - // update timers/counters - tch_i <= $time - tm_ck_pos; - end - tm_ck_neg = $time; - end - - // on die termination - if (odt_en || dyn_odt_en) begin - // odt pin is disabled during self refresh - if (!in_self_refresh && diff_ck) begin - if ($time - tm_odt < TIS) - $display ("%m: at time %t ERROR: tIS violation on ODT by %t", $time, tm_odt + TIS - $time); - if (prev_odt ^ odt_in) begin - if (!dll_locked) - $display ("%m: at time %t WARNING: tDLLK violation during ODT transition.", $time); - if (($time - tm_load_mode < TMOD) || (ck_cntr - ck_load_mode < TMOD_TCK)) - $display ("%m: at time %t ERROR: tMOD violation during ODT transition", $time); - if (ck_cntr - ck_zqinit < TZQINIT) - $display ("%m: at time %t ERROR: TZQinit violation during ODT transition", $time); - if (ck_cntr - ck_zqoper < TZQOPER) - $display ("%m: at time %t ERROR: TZQoper violation during ODT transition", $time); - if (ck_cntr - ck_zqcs < TZQCS) - $display ("%m: at time %t ERROR: tZQcs violation during ODT transition", $time); - // if (($time - tm_slow_exit_pd < TXPDLL) || (ck_cntr - ck_slow_exit_pd < TXPDLL_TCK)) - // $display ("%m: at time %t ERROR: tXPDLL violation during ODT transition", $time); - if (ck_cntr - ck_self_refresh < TXSDLL) - $display ("%m: at time %t ERROR: tXSDLL violation during ODT transition", $time); - if (in_self_refresh) - $display ("%m: at time %t ERROR: Illegal ODT transition during Self Refresh.", $time); - if (!odt_in && (ck_cntr - ck_odt < ODTH4)) - $display ("%m: at time %t ERROR: ODTH4 violation during ODT transition", $time); - if (!odt_in && (ck_cntr - ck_odth8 < ODTH8)) - $display ("%m: at time %t ERROR: ODTH8 violation during ODT transition", $time); - if (($time - tm_slow_exit_pd < TXPDLL) || (ck_cntr - ck_slow_exit_pd < TXPDLL_TCK)) - $display ("%m: at time %t WARNING: tXPDLL during ODT transition. Synchronous or asynchronous change in termination resistance is possible.", $time); - - // async ODT mode applies: - // 1.) during precharge power down with DLL off - // 2.) if tANPD has not been satisfied - // 3.) until tXPDLL has been satisfied - if ((in_power_down && low_power && (active_bank == 0)) || ($time - tm_slow_exit_pd < TXPDLL) || (ck_cntr - ck_slow_exit_pd < TXPDLL_TCK)) begin - odt_state = odt_in; - if (DEBUG && odt_en) $display ("%m: at time %t INFO: Async On Die Termination Rtt_NOM = %d Ohm", $time, {32{odt_state}} & get_rtt_nom(odt_rtt_nom)); - if (odt_state) begin - odt_state_dly <= #(TAONPD) odt_state; - end else begin - odt_state_dly <= #(TAOFPD) odt_state; - end - // sync ODT mode applies: - // 1.) during normal operation - // 2.) during active power down - // 3.) during precharge power down with DLL on - end else begin - odt_pipeline[2*(write_latency - 2)] = 1'b1; // ODTLon, ODTLoff - end - ck_odt <= ck_cntr; - end - end - if (odt_pipeline[0]) begin - odt_state = ~odt_state; - if (DEBUG && odt_en) $display ("%m: at time %t INFO: Sync On Die Termination Rtt_NOM = %d Ohm", $time, {32{odt_state}} & get_rtt_nom(odt_rtt_nom)); - if (odt_state) begin - odt_state_dly <= #(TAON) odt_state; - end else begin - odt_state_dly <= #(TAOF*tck_avg) odt_state; - end - end - if (rd_pipeline[RDQSEN_PRE]) begin - odt_cntr = 1 + RDQSEN_PRE + bl_pipeline[RDQSEN_PRE] + RDQSEN_PST - 1; - end - if (odt_cntr > 0) begin - if ((get_rtt_nom(odt_rtt_nom) > 0) && odt_state) begin - $display ("%m: at time %t ERROR: On Die Termination must be OFF during Read data transfer.", $time); - end - odt_cntr = odt_cntr - 1; - end - if (dyn_odt_en && ( odt_state || feature_odt_hi) ) begin - if (DEBUG && (dyn_odt_state ^ dyn_odt_pipeline[0])) - $display ("%m: at time %t INFO: Sync On Die Termination Rtt_WR = %d Ohm", $time, {32{dyn_odt_pipeline[0]}} & get_rtt_wr(odt_rtt_wr)); - dyn_odt_state = dyn_odt_pipeline[0]; - end - dyn_odt_state_dly <= #(TADC*tck_avg) dyn_odt_state; - end - - if (cke_in && write_levelization) begin - for (i=0; i>1; - wr_pipeline = wr_pipeline>>1; - rd_pipeline = rd_pipeline>>1; - for (i=0; i<`MAX_PIPE; i=i+1) begin - bl_pipeline[i] = bl_pipeline[i+1]; - ba_pipeline[i] = ba_pipeline[i+1]; - row_pipeline[i] = row_pipeline[i+1]; - col_pipeline[i] = col_pipeline[i+1]; - end - end - if (|odt_pipeline || |dyn_odt_pipeline) begin - odt_pipeline = odt_pipeline>>1; - dyn_odt_pipeline = dyn_odt_pipeline>>1; - end - end - end - - // receiver(s) - task dqs_even_receiver; - input [4:0] i; - reg [127:0] bit_mask; - begin - bit_mask = {`DQ_PER_DQS{1'b1}}<<(i*`DQ_PER_DQS); - if (dqs_even[i]) begin - if (tdqs_en) begin // tdqs disables dm - dm_in_pos[i] = 1'b0; - end else begin - dm_in_pos[i] = dm_in[i]; - end - dq_in_pos = (dq_in & bit_mask) | (dq_in_pos & ~bit_mask); - end - end - endtask - - always @(posedge dqs_even[ 0]) dqs_even_receiver( 0); - always @(posedge dqs_even[ 1]) dqs_even_receiver( 1); - always @(posedge dqs_even[ 2]) dqs_even_receiver( 2); - always @(posedge dqs_even[ 3]) dqs_even_receiver( 3); - always @(posedge dqs_even[ 4]) dqs_even_receiver( 4); - always @(posedge dqs_even[ 5]) dqs_even_receiver( 5); - always @(posedge dqs_even[ 6]) dqs_even_receiver( 6); - always @(posedge dqs_even[ 7]) dqs_even_receiver( 7); - always @(posedge dqs_even[ 8]) dqs_even_receiver( 8); - always @(posedge dqs_even[ 9]) dqs_even_receiver( 9); - always @(posedge dqs_even[10]) dqs_even_receiver(10); - always @(posedge dqs_even[11]) dqs_even_receiver(11); - always @(posedge dqs_even[12]) dqs_even_receiver(12); - always @(posedge dqs_even[13]) dqs_even_receiver(13); - always @(posedge dqs_even[14]) dqs_even_receiver(14); - always @(posedge dqs_even[15]) dqs_even_receiver(15); - - task dqs_odd_receiver; - input [4:0] i; - reg [127:0] bit_mask; - begin - bit_mask = {`DQ_PER_DQS{1'b1}}<<(i*`DQ_PER_DQS); - if (dqs_odd[i]) begin - if (tdqs_en) begin // tdqs disables dm - dm_in_neg[i] = 1'b0; - end else begin - dm_in_neg[i] = dm_in[i]; - end - dq_in_neg = (dq_in & bit_mask) | (dq_in_neg & ~bit_mask); - end - end - endtask - - always @(posedge dqs_odd[ 0]) dqs_odd_receiver( 0); - always @(posedge dqs_odd[ 1]) dqs_odd_receiver( 1); - always @(posedge dqs_odd[ 2]) dqs_odd_receiver( 2); - always @(posedge dqs_odd[ 3]) dqs_odd_receiver( 3); - always @(posedge dqs_odd[ 4]) dqs_odd_receiver( 4); - always @(posedge dqs_odd[ 5]) dqs_odd_receiver( 5); - always @(posedge dqs_odd[ 6]) dqs_odd_receiver( 6); - always @(posedge dqs_odd[ 7]) dqs_odd_receiver( 7); - always @(posedge dqs_odd[ 8]) dqs_odd_receiver( 8); - always @(posedge dqs_odd[ 9]) dqs_odd_receiver( 9); - always @(posedge dqs_odd[10]) dqs_odd_receiver(10); - always @(posedge dqs_odd[11]) dqs_odd_receiver(11); - always @(posedge dqs_odd[12]) dqs_odd_receiver(12); - always @(posedge dqs_odd[13]) dqs_odd_receiver(13); - always @(posedge dqs_odd[14]) dqs_odd_receiver(14); - always @(posedge dqs_odd[15]) dqs_odd_receiver(15); - - // Processes to check hold and pulse width of control signals - always @(posedge rst_n_in) begin - if ($time > 100000) begin - if (tm_rst_n + 100000 > $time) - $display ("%m: at time %t ERROR: RST_N pulse width violation by %t", $time, tm_rst_n + 100000 - $time); - end - tm_rst_n = $time; - end - always @(cke_in) begin - if (rst_n_in) begin - if ($time > TIH) begin - if ($time - tm_ck_pos < TIH) - $display ("%m: at time %t ERROR: tIH violation on CKE by %t", $time, tm_ck_pos + TIH - $time); - end - if ($time - tm_cke < TIPW) - $display ("%m: at time %t ERROR: tIPW violation on CKE by %t", $time, tm_cke + TIPW - $time); - end - tm_cke = $time; - end - always @(odt_in) begin - if (rst_n_in && odt_en && !in_self_refresh) begin - if ($time - tm_ck_pos < TIH) - $display ("%m: at time %t ERROR: tIH violation on ODT by %t", $time, tm_ck_pos + TIH - $time); - if ($time - tm_odt < TIPW) - $display ("%m: at time %t ERROR: tIPW violation on ODT by %t", $time, tm_odt + TIPW - $time); - end - tm_odt = $time; - end - - task cmd_addr_timing_check; - input i; - reg [4:0] i; - begin - if (rst_n_in && prev_cke) begin - if ((i == 0) && ($time - tm_ck_pos < TIH)) // always check tIH for CS# - $display ("%m: at time %t ERROR: tIH violation on %s by %t", $time, cmd_addr_string[i], tm_ck_pos + TIH - $time); - if ((i > 0) && (cs_n_in == 0) &&($time - tm_ck_pos < TIH)) // Only check tIH for cmd_addr if CS# is low - $display ("%m: at time %t ERROR: tIH violation on %s by %t", $time, cmd_addr_string[i], tm_ck_pos + TIH - $time); - if ((i == 0) && ($time - tm_cmd_addr[i] < TIPW)) // always check tIPW for CS# - $display ("%m: at time %t ERROR: tIPW violation on %s by %t", $time, cmd_addr_string[i], tm_cmd_addr[i] + TIPW - $time); - if ((i > 0) && (cs_n_in == 0) && ($time - tm_cmd_addr[i] < TIPW)) - $display ("%m: at time %t ERROR: tIPW violation on %s by %t", $time, cmd_addr_string[i], tm_cmd_addr[i] + TIPW - $time); - end - tm_cmd_addr[i] = $time; - end - endtask - - always @(cs_n_in ) cmd_addr_timing_check( 0); - always @(ras_n_in ) cmd_addr_timing_check( 1); - always @(cas_n_in ) cmd_addr_timing_check( 2); - always @(we_n_in ) cmd_addr_timing_check( 3); - always @(ba_in [ 0]) cmd_addr_timing_check( 4); - always @(ba_in [ 1]) cmd_addr_timing_check( 5); - always @(ba_in [ 2]) cmd_addr_timing_check( 6); - always @(addr_in[ 0]) cmd_addr_timing_check( 7); - always @(addr_in[ 1]) cmd_addr_timing_check( 8); - always @(addr_in[ 2]) cmd_addr_timing_check( 9); - always @(addr_in[ 3]) cmd_addr_timing_check(10); - always @(addr_in[ 4]) cmd_addr_timing_check(11); - always @(addr_in[ 5]) cmd_addr_timing_check(12); - always @(addr_in[ 6]) cmd_addr_timing_check(13); - always @(addr_in[ 7]) cmd_addr_timing_check(14); - always @(addr_in[ 8]) cmd_addr_timing_check(15); - always @(addr_in[ 9]) cmd_addr_timing_check(16); - always @(addr_in[10]) cmd_addr_timing_check(17); - always @(addr_in[11]) cmd_addr_timing_check(18); - always @(addr_in[12]) cmd_addr_timing_check(19); - always @(addr_in[13]) cmd_addr_timing_check(20); - always @(addr_in[14]) cmd_addr_timing_check(21); - always @(addr_in[15]) cmd_addr_timing_check(22); - always @(addr_in[16]) cmd_addr_timing_check(23); - - // Processes to check setup and hold of data signals - task dm_timing_check; - input i; - reg [4:0] i; - begin - if (dqs_in_valid) begin - if ($time - tm_dqs[i] < TDH) - $display ("%m: at time %t ERROR: tDH violation on DM bit %d by %t", $time, i, tm_dqs[i] + TDH - $time); - if (check_dm_tdipw[i]) begin - if ($time - tm_dm[i] < TDIPW) - $display ("%m: at time %t ERROR: tDIPW violation on DM bit %d by %t", $time, i, tm_dm[i] + TDIPW - $time); - end - end - check_dm_tdipw[i] <= 1'b0; - tm_dm[i] = $time; - end - endtask - - always @(dm_in[ 0]) dm_timing_check( 0); - always @(dm_in[ 1]) dm_timing_check( 1); - always @(dm_in[ 2]) dm_timing_check( 2); - always @(dm_in[ 3]) dm_timing_check( 3); - always @(dm_in[ 4]) dm_timing_check( 4); - always @(dm_in[ 5]) dm_timing_check( 5); - always @(dm_in[ 6]) dm_timing_check( 6); - always @(dm_in[ 7]) dm_timing_check( 7); - always @(dm_in[ 8]) dm_timing_check( 8); - always @(dm_in[ 9]) dm_timing_check( 9); - always @(dm_in[10]) dm_timing_check(10); - always @(dm_in[11]) dm_timing_check(11); - always @(dm_in[12]) dm_timing_check(12); - always @(dm_in[13]) dm_timing_check(13); - always @(dm_in[14]) dm_timing_check(14); - always @(dm_in[15]) dm_timing_check(15); - - always @(dm_in[16]) dm_timing_check(16); - always @(dm_in[17]) dm_timing_check(17); - always @(dm_in[18]) dm_timing_check(18); - always @(dm_in[19]) dm_timing_check(19); - always @(dm_in[20]) dm_timing_check(20); - always @(dm_in[21]) dm_timing_check(21); - always @(dm_in[22]) dm_timing_check(22); - always @(dm_in[23]) dm_timing_check(23); - always @(dm_in[24]) dm_timing_check(24); - always @(dm_in[25]) dm_timing_check(25); - always @(dm_in[26]) dm_timing_check(26); - always @(dm_in[27]) dm_timing_check(27); - always @(dm_in[28]) dm_timing_check(28); - always @(dm_in[29]) dm_timing_check(29); - always @(dm_in[30]) dm_timing_check(30); - always @(dm_in[31]) dm_timing_check(31); - - task dq_timing_check; - input i; - reg [6:0] i; - begin - if (dqs_in_valid) begin - if ($time - tm_dqs[i/(`DQ_PER_DQS)] < TDH) - $display ("%m: at time %t ERROR: tDH violation on DQ bit %d by %t", $time, i, tm_dqs[i/`DQ_PER_DQS] + TDH - $time); - if (check_dq_tdipw[i]) begin - if ($time - tm_dq[i] < TDIPW) - $display ("%m: at time %t ERROR: tDIPW violation on DQ bit %d by %t", $time, i, tm_dq[i] + TDIPW - $time); - end - end - check_dq_tdipw[i] <= 1'b0; - tm_dq[i] = $time; - end - endtask - - always @(dq_in[ 0]) dq_timing_check( 0); - always @(dq_in[ 1]) dq_timing_check( 1); - always @(dq_in[ 2]) dq_timing_check( 2); - always @(dq_in[ 3]) dq_timing_check( 3); - always @(dq_in[ 4]) dq_timing_check( 4); - always @(dq_in[ 5]) dq_timing_check( 5); - always @(dq_in[ 6]) dq_timing_check( 6); - always @(dq_in[ 7]) dq_timing_check( 7); - always @(dq_in[ 8]) dq_timing_check( 8); - always @(dq_in[ 9]) dq_timing_check( 9); - always @(dq_in[10]) dq_timing_check(10); - always @(dq_in[11]) dq_timing_check(11); - always @(dq_in[12]) dq_timing_check(12); - always @(dq_in[13]) dq_timing_check(13); - always @(dq_in[14]) dq_timing_check(14); - always @(dq_in[15]) dq_timing_check(15); - always @(dq_in[16]) dq_timing_check(16); - always @(dq_in[17]) dq_timing_check(17); - always @(dq_in[18]) dq_timing_check(18); - always @(dq_in[19]) dq_timing_check(19); - always @(dq_in[20]) dq_timing_check(20); - always @(dq_in[21]) dq_timing_check(21); - always @(dq_in[22]) dq_timing_check(22); - always @(dq_in[23]) dq_timing_check(23); - always @(dq_in[24]) dq_timing_check(24); - always @(dq_in[25]) dq_timing_check(25); - always @(dq_in[26]) dq_timing_check(26); - always @(dq_in[27]) dq_timing_check(27); - always @(dq_in[28]) dq_timing_check(28); - always @(dq_in[29]) dq_timing_check(29); - always @(dq_in[30]) dq_timing_check(30); - always @(dq_in[31]) dq_timing_check(31); - always @(dq_in[32]) dq_timing_check(32); - always @(dq_in[33]) dq_timing_check(33); - always @(dq_in[34]) dq_timing_check(34); - always @(dq_in[35]) dq_timing_check(35); - always @(dq_in[36]) dq_timing_check(36); - always @(dq_in[37]) dq_timing_check(37); - always @(dq_in[38]) dq_timing_check(38); - always @(dq_in[39]) dq_timing_check(39); - always @(dq_in[40]) dq_timing_check(40); - always @(dq_in[41]) dq_timing_check(41); - always @(dq_in[42]) dq_timing_check(42); - always @(dq_in[43]) dq_timing_check(43); - always @(dq_in[44]) dq_timing_check(44); - always @(dq_in[45]) dq_timing_check(45); - always @(dq_in[46]) dq_timing_check(46); - always @(dq_in[47]) dq_timing_check(47); - always @(dq_in[48]) dq_timing_check(48); - always @(dq_in[49]) dq_timing_check(49); - always @(dq_in[50]) dq_timing_check(50); - always @(dq_in[51]) dq_timing_check(51); - always @(dq_in[52]) dq_timing_check(52); - always @(dq_in[53]) dq_timing_check(53); - always @(dq_in[54]) dq_timing_check(54); - always @(dq_in[55]) dq_timing_check(55); - always @(dq_in[56]) dq_timing_check(56); - always @(dq_in[57]) dq_timing_check(57); - always @(dq_in[58]) dq_timing_check(58); - always @(dq_in[59]) dq_timing_check(59); - always @(dq_in[60]) dq_timing_check(60); - always @(dq_in[61]) dq_timing_check(61); - always @(dq_in[62]) dq_timing_check(62); - always @(dq_in[63]) dq_timing_check(63); - - always @(dq_in[64]) dq_timing_check(64); - always @(dq_in[65]) dq_timing_check(65); - always @(dq_in[66]) dq_timing_check(66); - always @(dq_in[67]) dq_timing_check(67); - always @(dq_in[68]) dq_timing_check(68); - always @(dq_in[69]) dq_timing_check(69); - always @(dq_in[70]) dq_timing_check(70); - always @(dq_in[71]) dq_timing_check(71); - always @(dq_in[72]) dq_timing_check(72); - always @(dq_in[73]) dq_timing_check(73); - always @(dq_in[74]) dq_timing_check(74); - always @(dq_in[75]) dq_timing_check(75); - always @(dq_in[76]) dq_timing_check(76); - always @(dq_in[77]) dq_timing_check(77); - always @(dq_in[78]) dq_timing_check(78); - always @(dq_in[79]) dq_timing_check(79); - always @(dq_in[80]) dq_timing_check(80); - always @(dq_in[81]) dq_timing_check(81); - always @(dq_in[82]) dq_timing_check(82); - always @(dq_in[83]) dq_timing_check(83); - always @(dq_in[84]) dq_timing_check(84); - always @(dq_in[85]) dq_timing_check(85); - always @(dq_in[86]) dq_timing_check(86); - always @(dq_in[87]) dq_timing_check(87); - always @(dq_in[88]) dq_timing_check(88); - always @(dq_in[89]) dq_timing_check(89); - always @(dq_in[90]) dq_timing_check(90); - always @(dq_in[91]) dq_timing_check(91); - always @(dq_in[92]) dq_timing_check(92); - always @(dq_in[93]) dq_timing_check(93); - always @(dq_in[94]) dq_timing_check(94); - always @(dq_in[95]) dq_timing_check(95); - always @(dq_in[96]) dq_timing_check(96); - always @(dq_in[97]) dq_timing_check(97); - always @(dq_in[98]) dq_timing_check(98); - always @(dq_in[99]) dq_timing_check(99); - always @(dq_in[100]) dq_timing_check(100); - always @(dq_in[101]) dq_timing_check(101); - always @(dq_in[102]) dq_timing_check(102); - always @(dq_in[103]) dq_timing_check(103); - always @(dq_in[104]) dq_timing_check(104); - always @(dq_in[105]) dq_timing_check(105); - always @(dq_in[106]) dq_timing_check(106); - always @(dq_in[107]) dq_timing_check(107); - always @(dq_in[108]) dq_timing_check(108); - always @(dq_in[109]) dq_timing_check(109); - always @(dq_in[110]) dq_timing_check(110); - always @(dq_in[111]) dq_timing_check(111); - always @(dq_in[112]) dq_timing_check(112); - always @(dq_in[113]) dq_timing_check(113); - always @(dq_in[114]) dq_timing_check(114); - always @(dq_in[115]) dq_timing_check(115); - always @(dq_in[116]) dq_timing_check(116); - always @(dq_in[117]) dq_timing_check(117); - always @(dq_in[118]) dq_timing_check(118); - always @(dq_in[119]) dq_timing_check(119); - always @(dq_in[120]) dq_timing_check(120); - always @(dq_in[121]) dq_timing_check(121); - always @(dq_in[122]) dq_timing_check(122); - always @(dq_in[123]) dq_timing_check(123); - always @(dq_in[124]) dq_timing_check(124); - always @(dq_in[125]) dq_timing_check(125); - always @(dq_in[126]) dq_timing_check(126); - always @(dq_in[127]) dq_timing_check(127); - - task dqs_pos_timing_check; - input i; - reg [5:0] i; - reg [4:0] j; - begin - if (write_levelization && i<32) begin - if (ck_cntr - ck_load_mode < TWLMRD) - $display ("%m: at time %t ERROR: tWLMRD violation on DQS bit %d positive edge.", $time, i); - if (($time - tm_ck_pos < TWLS) || ($time - tm_ck_neg < TWLS)) - $display ("%m: at time %t WARNING: tWLS violation on DQS bit %d positive edge. Indeterminate CK capture is possible.", $time, i); - if (DEBUG) - $display ("%m: at time %t Write Leveling @ DQS ck = %b", $time, diff_ck); - dq_out_en_dly[i*`DQ_PER_DQS] <= #(TWLO) 1'b1; - dq_out_dly[i*`DQ_PER_DQS] <= #(TWLO) diff_ck; -`ifdef WL_ALLDQ - for (j=1; j<`DQ_PER_DQS; j=j+1) begin - dq_out_en_dly[i*`DQ_PER_DQS+j] <= #(TWLO) 1'b1; - dq_out_dly[i*`DQ_PER_DQS+j] <= #(TWLO) diff_ck; - end -`else - for (j=1; j<`DQ_PER_DQS; j=j+1) begin - dq_out_en_dly[i*`DQ_PER_DQS+j] <= #(TWLO + TWLOE) 1'b1; - dq_out_dly[i*`DQ_PER_DQS+j] <= #(TWLO + TWLOE) 1'b0; - end -`endif - end - if (dqs_in_valid && ((wdqs_pos_cntr[i] < wr_burst_length/2) || b2b_write)) begin - if (dqs_in[i] ^ prev_dqs_in[i]) begin - if (dll_locked) begin - if (check_write_preamble[i]) begin - if ($time - tm_dqs_pos[i] < $rtoi(TWPRE*tck_avg)) - $display ("%m: at time %t ERROR: tWPRE violation on %s bit %d", $time, dqs_string[i/32], i%32); - end else if (check_write_postamble[i]) begin - if ($time - tm_dqs_neg[i] < $rtoi(TWPST*tck_avg)) - $display ("%m: at time %t ERROR: tWPST violation on %s bit %d", $time, dqs_string[i/32], i%32); - end else begin - if ($time - tm_dqs_neg[i] < $rtoi(TDQSL*tck_avg)) - $display ("%m: at time %t ERROR: tDQSL violation on %s bit %d", $time, dqs_string[i/32], i%32); - end - end - if ($time - tm_dm[i%32] < TDS) - $display ("%m: at time %t ERROR: tDS violation on DM bit %d by %t", $time, i, tm_dm[i%32] + TDS - $time); - if (!dq_out_en) begin - for (j=0; j<`DQ_PER_DQS; j=j+1) begin - if ($time - tm_dq[(i%32)*`DQ_PER_DQS+j] < TDS) - $display ("%m: at time %t ERROR: tDS violation on DQ bit %d by %t", $time, i*`DQ_PER_DQS+j, tm_dq[(i%32)*`DQ_PER_DQS+j] + TDS - $time); - check_dq_tdipw[(i%32)*`DQ_PER_DQS+j] <= 1'b1; - end - end - if ((wdqs_pos_cntr[i] < wr_burst_length/2) && !b2b_write) begin - wdqs_pos_cntr[i] <= wdqs_pos_cntr[i] + 1; - end else begin - wdqs_pos_cntr[i] <= 1; - end - check_dm_tdipw[i%32] <= 1'b1; - check_write_preamble[i] <= 1'b0; - check_write_postamble[i] <= 1'b0; - check_write_dqs_low[i] <= 1'b0; - tm_dqs[i%32] <= $time; - end else begin - $display ("%m: at time %t ERROR: Invalid latching edge on %s bit %d", $time, dqs_string[i/32], i%32); - end - end - tm_dqss_pos[i] <= $time; - tm_dqs_pos[i] = $time; - prev_dqs_in[i] <= dqs_in[i]; - end - endtask - - always @(posedge dqs_in[ 0]) if ( dqs_in[ 0]) dqs_pos_timing_check( 0); - always @(posedge dqs_in[ 1]) if ( dqs_in[ 1]) dqs_pos_timing_check( 1); - always @(posedge dqs_in[ 2]) if ( dqs_in[ 2]) dqs_pos_timing_check( 2); - always @(posedge dqs_in[ 3]) if ( dqs_in[ 3]) dqs_pos_timing_check( 3); - always @(posedge dqs_in[ 4]) if ( dqs_in[ 4]) dqs_pos_timing_check( 4); - always @(posedge dqs_in[ 5]) if ( dqs_in[ 5]) dqs_pos_timing_check( 5); - always @(posedge dqs_in[ 6]) if ( dqs_in[ 6]) dqs_pos_timing_check( 6); - always @(posedge dqs_in[ 7]) if ( dqs_in[ 7]) dqs_pos_timing_check( 7); - always @(posedge dqs_in[ 8]) if ( dqs_in[ 8]) dqs_pos_timing_check( 8); - always @(posedge dqs_in[ 9]) if ( dqs_in[ 9]) dqs_pos_timing_check( 9); - always @(posedge dqs_in[10]) if ( dqs_in[10]) dqs_pos_timing_check(10); - always @(posedge dqs_in[11]) if ( dqs_in[11]) dqs_pos_timing_check(11); - always @(posedge dqs_in[12]) if ( dqs_in[12]) dqs_pos_timing_check(12); - always @(posedge dqs_in[13]) if ( dqs_in[13]) dqs_pos_timing_check(13); - always @(posedge dqs_in[14]) if ( dqs_in[14]) dqs_pos_timing_check(14); - always @(posedge dqs_in[15]) if ( dqs_in[15]) dqs_pos_timing_check(15); - always @(posedge dqs_in[16]) if ( dqs_in[16]) dqs_pos_timing_check(16); - always @(posedge dqs_in[17]) if ( dqs_in[17]) dqs_pos_timing_check(17); - always @(posedge dqs_in[18]) if ( dqs_in[18]) dqs_pos_timing_check(18); - always @(posedge dqs_in[19]) if ( dqs_in[19]) dqs_pos_timing_check(19); - always @(posedge dqs_in[20]) if ( dqs_in[20]) dqs_pos_timing_check(20); - always @(posedge dqs_in[21]) if ( dqs_in[21]) dqs_pos_timing_check(21); - always @(posedge dqs_in[22]) if ( dqs_in[22]) dqs_pos_timing_check(22); - always @(posedge dqs_in[23]) if ( dqs_in[23]) dqs_pos_timing_check(23); - always @(posedge dqs_in[24]) if ( dqs_in[24]) dqs_pos_timing_check(24); - always @(posedge dqs_in[25]) if ( dqs_in[25]) dqs_pos_timing_check(25); - always @(posedge dqs_in[26]) if ( dqs_in[26]) dqs_pos_timing_check(26); - always @(posedge dqs_in[27]) if ( dqs_in[27]) dqs_pos_timing_check(27); - always @(posedge dqs_in[28]) if ( dqs_in[28]) dqs_pos_timing_check(28); - always @(posedge dqs_in[29]) if ( dqs_in[29]) dqs_pos_timing_check(29); - always @(posedge dqs_in[30]) if ( dqs_in[30]) dqs_pos_timing_check(30); - always @(posedge dqs_in[31]) if ( dqs_in[31]) dqs_pos_timing_check(31); - - always @(negedge dqs_in[32]) if (!dqs_in[32]) dqs_pos_timing_check(32); - always @(negedge dqs_in[33]) if (!dqs_in[33]) dqs_pos_timing_check(33); - always @(negedge dqs_in[34]) if (!dqs_in[34]) dqs_pos_timing_check(34); - always @(negedge dqs_in[35]) if (!dqs_in[35]) dqs_pos_timing_check(35); - always @(negedge dqs_in[36]) if (!dqs_in[36]) dqs_pos_timing_check(36); - always @(negedge dqs_in[37]) if (!dqs_in[37]) dqs_pos_timing_check(37); - always @(negedge dqs_in[38]) if (!dqs_in[38]) dqs_pos_timing_check(38); - always @(negedge dqs_in[39]) if (!dqs_in[39]) dqs_pos_timing_check(39); - always @(negedge dqs_in[40]) if (!dqs_in[40]) dqs_pos_timing_check(40); - always @(negedge dqs_in[41]) if (!dqs_in[41]) dqs_pos_timing_check(41); - always @(negedge dqs_in[42]) if (!dqs_in[42]) dqs_pos_timing_check(42); - always @(negedge dqs_in[43]) if (!dqs_in[43]) dqs_pos_timing_check(43); - always @(negedge dqs_in[44]) if (!dqs_in[44]) dqs_pos_timing_check(44); - always @(negedge dqs_in[45]) if (!dqs_in[45]) dqs_pos_timing_check(45); - always @(negedge dqs_in[46]) if (!dqs_in[46]) dqs_pos_timing_check(46); - always @(negedge dqs_in[47]) if (!dqs_in[47]) dqs_pos_timing_check(47); - always @(negedge dqs_in[48]) if (!dqs_in[48]) dqs_pos_timing_check(48); - always @(negedge dqs_in[49]) if (!dqs_in[49]) dqs_pos_timing_check(49); - always @(negedge dqs_in[50]) if (!dqs_in[50]) dqs_pos_timing_check(50); - always @(negedge dqs_in[51]) if (!dqs_in[51]) dqs_pos_timing_check(51); - always @(negedge dqs_in[52]) if (!dqs_in[52]) dqs_pos_timing_check(52); - always @(negedge dqs_in[53]) if (!dqs_in[53]) dqs_pos_timing_check(53); - always @(negedge dqs_in[54]) if (!dqs_in[54]) dqs_pos_timing_check(54); - always @(negedge dqs_in[55]) if (!dqs_in[55]) dqs_pos_timing_check(55); - always @(negedge dqs_in[56]) if (!dqs_in[56]) dqs_pos_timing_check(56); - always @(negedge dqs_in[57]) if (!dqs_in[57]) dqs_pos_timing_check(57); - always @(negedge dqs_in[58]) if (!dqs_in[58]) dqs_pos_timing_check(58); - always @(negedge dqs_in[59]) if (!dqs_in[59]) dqs_pos_timing_check(59); - always @(negedge dqs_in[60]) if (!dqs_in[60]) dqs_pos_timing_check(60); - always @(negedge dqs_in[61]) if (!dqs_in[61]) dqs_pos_timing_check(61); - always @(negedge dqs_in[62]) if (!dqs_in[62]) dqs_pos_timing_check(62); - always @(negedge dqs_in[63]) if (!dqs_in[63]) dqs_pos_timing_check(63); - - task dqs_neg_timing_check; - input i; - reg [5:0] i; - reg [4:0] j; - begin - if (write_levelization && i<32) begin - if (ck_cntr - ck_load_mode < TWLDQSEN) - $display ("%m: at time %t ERROR: tWLDQSEN violation on DQS bit %d.", $time, i); - if ($time - tm_dqs_pos[i] < $rtoi(TDQSH*tck_avg)) - $display ("%m: at time %t ERROR: tDQSH violation on DQS bit %d by %t", $time, i, tm_dqs_pos[i] + TDQSH*tck_avg - $time); - end - if (dqs_in_valid && (wdqs_pos_cntr[i] > 0) && check_write_dqs_high[i]) begin - if (dqs_in[i] ^ prev_dqs_in[i]) begin - if (dll_locked) begin - if ($time - tm_dqs_pos[i] < $rtoi(TDQSH*tck_avg)) - $display ("%m: at time %t ERROR: tDQSH violation on %s bit %d", $time, dqs_string[i/32], i%32); - if ($time - tm_ck_pos < $rtoi(TDSH*tck_avg)) - $display ("%m: at time %t ERROR: tDSH violation on %s bit %d", $time, dqs_string[i/32], i%32); - end - if ($time - tm_dm[i%32] < TDS) - $display ("%m: at time %t ERROR: tDS violation on DM bit %d by %t", $time, i, tm_dm[i%32] + TDS - $time); - if (!dq_out_en) begin - for (j=0; j<`DQ_PER_DQS; j=j+1) begin - if ($time - tm_dq[(i%32)*`DQ_PER_DQS+j] < TDS) - $display ("%m: at time %t ERROR: tDS violation on DQ bit %d by %t", $time, i*`DQ_PER_DQS+j, tm_dq[(i%32)*`DQ_PER_DQS+j] + TDS - $time); - check_dq_tdipw[(i%32)*`DQ_PER_DQS+j] <= 1'b1; - end - end - check_dm_tdipw[i%32] <= 1'b1; - tm_dqs[i%32] <= $time; - end else begin - $display ("%m: at time %t ERROR: Invalid latching edge on %s bit %d", $time, dqs_string[i/32], i%32); - end - end - check_write_dqs_high[i] <= 1'b0; - tm_dqs_neg[i] = $time; - prev_dqs_in[i] <= dqs_in[i]; - end - endtask - - always @(negedge dqs_in[ 0]) if (!dqs_in[ 0]) dqs_neg_timing_check( 0); - always @(negedge dqs_in[ 1]) if (!dqs_in[ 1]) dqs_neg_timing_check( 1); - always @(negedge dqs_in[ 2]) if (!dqs_in[ 2]) dqs_neg_timing_check( 2); - always @(negedge dqs_in[ 3]) if (!dqs_in[ 3]) dqs_neg_timing_check( 3); - always @(negedge dqs_in[ 4]) if (!dqs_in[ 4]) dqs_neg_timing_check( 4); - always @(negedge dqs_in[ 5]) if (!dqs_in[ 5]) dqs_neg_timing_check( 5); - always @(negedge dqs_in[ 6]) if (!dqs_in[ 6]) dqs_neg_timing_check( 6); - always @(negedge dqs_in[ 7]) if (!dqs_in[ 7]) dqs_neg_timing_check( 7); - always @(negedge dqs_in[ 8]) if (!dqs_in[ 8]) dqs_neg_timing_check( 8); - always @(negedge dqs_in[ 9]) if (!dqs_in[ 9]) dqs_neg_timing_check( 9); - always @(negedge dqs_in[10]) if (!dqs_in[10]) dqs_neg_timing_check(10); - always @(negedge dqs_in[11]) if (!dqs_in[11]) dqs_neg_timing_check(11); - always @(negedge dqs_in[12]) if (!dqs_in[12]) dqs_neg_timing_check(12); - always @(negedge dqs_in[13]) if (!dqs_in[13]) dqs_neg_timing_check(13); - always @(negedge dqs_in[14]) if (!dqs_in[14]) dqs_neg_timing_check(14); - always @(negedge dqs_in[15]) if (!dqs_in[15]) dqs_neg_timing_check(15); - always @(negedge dqs_in[16]) if (!dqs_in[16]) dqs_neg_timing_check(16); - always @(negedge dqs_in[17]) if (!dqs_in[17]) dqs_neg_timing_check(17); - always @(negedge dqs_in[18]) if (!dqs_in[18]) dqs_neg_timing_check(18); - always @(negedge dqs_in[19]) if (!dqs_in[19]) dqs_neg_timing_check(19); - always @(negedge dqs_in[20]) if (!dqs_in[20]) dqs_neg_timing_check(20); - always @(negedge dqs_in[21]) if (!dqs_in[21]) dqs_neg_timing_check(21); - always @(negedge dqs_in[22]) if (!dqs_in[22]) dqs_neg_timing_check(22); - always @(negedge dqs_in[23]) if (!dqs_in[23]) dqs_neg_timing_check(23); - always @(negedge dqs_in[24]) if (!dqs_in[24]) dqs_neg_timing_check(24); - always @(negedge dqs_in[25]) if (!dqs_in[25]) dqs_neg_timing_check(25); - always @(negedge dqs_in[26]) if (!dqs_in[26]) dqs_neg_timing_check(26); - always @(negedge dqs_in[27]) if (!dqs_in[27]) dqs_neg_timing_check(27); - always @(negedge dqs_in[28]) if (!dqs_in[28]) dqs_neg_timing_check(28); - always @(negedge dqs_in[29]) if (!dqs_in[29]) dqs_neg_timing_check(29); - always @(negedge dqs_in[30]) if (!dqs_in[30]) dqs_neg_timing_check(30); - always @(negedge dqs_in[31]) if (!dqs_in[31]) dqs_neg_timing_check(31); - - always @(posedge dqs_in[32]) if ( dqs_in[32]) dqs_neg_timing_check(32); - always @(posedge dqs_in[33]) if ( dqs_in[33]) dqs_neg_timing_check(33); - always @(posedge dqs_in[34]) if ( dqs_in[34]) dqs_neg_timing_check(34); - always @(posedge dqs_in[35]) if ( dqs_in[35]) dqs_neg_timing_check(35); - always @(posedge dqs_in[36]) if ( dqs_in[36]) dqs_neg_timing_check(36); - always @(posedge dqs_in[37]) if ( dqs_in[37]) dqs_neg_timing_check(37); - always @(posedge dqs_in[38]) if ( dqs_in[38]) dqs_neg_timing_check(38); - always @(posedge dqs_in[39]) if ( dqs_in[39]) dqs_neg_timing_check(39); - always @(posedge dqs_in[40]) if ( dqs_in[40]) dqs_neg_timing_check(40); - always @(posedge dqs_in[41]) if ( dqs_in[41]) dqs_neg_timing_check(41); - always @(posedge dqs_in[42]) if ( dqs_in[42]) dqs_neg_timing_check(42); - always @(posedge dqs_in[43]) if ( dqs_in[43]) dqs_neg_timing_check(43); - always @(posedge dqs_in[44]) if ( dqs_in[44]) dqs_neg_timing_check(44); - always @(posedge dqs_in[45]) if ( dqs_in[45]) dqs_neg_timing_check(45); - always @(posedge dqs_in[46]) if ( dqs_in[46]) dqs_neg_timing_check(46); - always @(posedge dqs_in[47]) if ( dqs_in[47]) dqs_neg_timing_check(47); - always @(posedge dqs_in[48]) if ( dqs_in[48]) dqs_neg_timing_check(48); - always @(posedge dqs_in[49]) if ( dqs_in[49]) dqs_neg_timing_check(49); - always @(posedge dqs_in[50]) if ( dqs_in[50]) dqs_neg_timing_check(50); - always @(posedge dqs_in[51]) if ( dqs_in[51]) dqs_neg_timing_check(51); - always @(posedge dqs_in[52]) if ( dqs_in[52]) dqs_neg_timing_check(52); - always @(posedge dqs_in[53]) if ( dqs_in[53]) dqs_neg_timing_check(53); - always @(posedge dqs_in[54]) if ( dqs_in[54]) dqs_neg_timing_check(54); - always @(posedge dqs_in[55]) if ( dqs_in[55]) dqs_neg_timing_check(55); - always @(posedge dqs_in[56]) if ( dqs_in[56]) dqs_neg_timing_check(56); - always @(posedge dqs_in[57]) if ( dqs_in[57]) dqs_neg_timing_check(57); - always @(posedge dqs_in[58]) if ( dqs_in[58]) dqs_neg_timing_check(58); - always @(posedge dqs_in[59]) if ( dqs_in[59]) dqs_neg_timing_check(59); - always @(posedge dqs_in[60]) if ( dqs_in[60]) dqs_neg_timing_check(60); - always @(posedge dqs_in[61]) if ( dqs_in[61]) dqs_neg_timing_check(61); - always @(posedge dqs_in[62]) if ( dqs_in[62]) dqs_neg_timing_check(62); - always @(posedge dqs_in[63]) if ( dqs_in[63]) dqs_neg_timing_check(63); - -endmodule diff --git a/resources/soc/simu/testbench/ddr3_model_parameters.vh b/resources/soc/simu/testbench/ddr3_model_parameters.vh deleted file mode 100644 index 4c14495..0000000 --- a/resources/soc/simu/testbench/ddr3_model_parameters.vh +++ /dev/null @@ -1,3412 +0,0 @@ -/**************************************************************************************** -* -* Disclaimer This software code and all associated documentation, comments or other -* of Warranty: information (collectively "Software") is provided "AS IS" without -* warranty of any kind. MICRON TECHNOLOGY, INC. ("MTI") EXPRESSLY -* DISCLAIMS ALL WARRANTIES EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -* TO, NONINFRINGEMENT OF THIRD PARTY RIGHTS, AND ANY IMPLIED WARRANTIES -* OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. MTI DOES NOT -* WARRANT THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS, OR THAT THE -* OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE. -* FURTHERMORE, MTI DOES NOT MAKE ANY REPRESENTATIONS REGARDING THE USE OR -* THE RESULTS OF THE USE OF THE SOFTWARE IN TERMS OF ITS CORRECTNESS, -* ACCURACY, RELIABILITY, OR OTHERWISE. THE ENTIRE RISK ARISING OUT OF USE -* OR PERFORMANCE OF THE SOFTWARE REMAINS WITH YOU. IN NO EVENT SHALL MTI, -* ITS AFFILIATED COMPANIES OR THEIR SUPPLIERS BE LIABLE FOR ANY DIRECT, -* INDIRECT, CONSEQUENTIAL, INCIDENTAL, OR SPECIAL DAMAGES (INCLUDING, -* WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, BUSINESS INTERRUPTION, -* OR LOSS OF INFORMATION) ARISING OUT OF YOUR USE OF OR INABILITY TO USE -* THE SOFTWARE, EVEN IF MTI HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -* DAMAGES. Because some jurisdictions prohibit the exclusion or -* limitation of liability for consequential or incidental damages, the -* above limitation may not apply to you. -* -* Copyright 2003 Micron Technology, Inc. All rights reserved. -* -****************************************************************************************/ - - // Parameters current with 1Gb, 2Gb, 4Gb and 8Gb datasheet - - // Timing parameters based on Speed Grade - -`ifdef x8Gb // 8Gb parameters - // SYMBOL UNITS DESCRIPTION - // ------ ----- ----------- - `ifdef sg093 // sg093 is equivalent to the JEDEC DDR3-2133 (14-14-14) speed bin - parameter TCK_MIN = 938; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 50; // tJIT(per) ps Period JItter - parameter TJIT_CC = 100; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 74; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 87; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 97; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 105; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 111; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 116; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 121; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 125; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 128; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 132; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 134; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 5; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 70; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 180; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 280; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 470; // tIPW ps Control and Address input Pulse Width - parameter TIS = 35; // tIS ps Input Setup Time - parameter TIH = 75; // tIH ps Input Hold Time - parameter TRAS_MIN = 33000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 46090; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 13090; // tRCD ps Active to Read/Write command time - parameter TRP = 13090; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 180; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 122; // tWLS ps Setup time for tDQS flop - parameter TWLH = 122; // tWLH ps Hold time of tDQS flop - parameter TWLO = 7500; // tWLO ps Write levelization output delay - parameter TAA_MIN = 13090; // TAA ps Internal READ command to first data - parameter CL_TIME = 13090; // CL ps Minimum CAS Latency - `elsif sg107 // sg107 is equivalent to the JEDEC DDR3-1866 (13-13-13) speed bin - parameter TCK_MIN = 1071; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 60; // tJIT(per) ps Period JItter - parameter TJIT_CC = 120; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 88; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 105; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 117; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 126; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 133; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 139; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 145; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 150; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 154; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 158; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 161; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 80; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 200; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 320; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 535; // tIPW ps Control and Address input Pulse Width - parameter TIS = 50; // tIS ps Input Setup Time - parameter TIH = 100; // tIH ps Input Hold Time - parameter TRAS_MIN = 34000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 47910; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 13910; // tRCD ps Active to Read/Write command time - parameter TRP = 13910; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 200; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 140; // tWLS ps Setup time for tDQS flop - parameter TWLH = 140; // tWLH ps Hold time of tDQS flop - parameter TWLO = 7500; // tWLO ps Write levelization output delay - parameter TAA_MIN = 13910; // TAA ps Internal READ command to first data - parameter CL_TIME = 13910; // CL ps Minimum CAS Latency - `elsif sg125 // sg125 is equivalent to the JEDEC DDR3-1600 (11-11-11) speed bin - parameter TCK_MIN = 1250; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 70; // tJIT(per) ps Period JItter - parameter TJIT_CC = 140; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 103; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 122; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 136; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 147; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 155; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 163; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 169; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 175; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 180; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 184; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 188; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 45; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 100; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 225; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 360; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 560; // tIPW ps Control and Address input Pulse Width - parameter TIS = 170; // tIS ps Input Setup Time - parameter TIH = 120; // tIH ps Input Hold Time - parameter TRAS_MIN = 35000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 48750; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 13750; // tRCD ps Active to Read/Write command time - parameter TRP = 13750; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 250; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 165; // tWLS ps Setup time for tDQS flop - parameter TWLH = 165; // tWLH ps Hold time of tDQS flop - parameter TWLO = 7500; // tWLO ps Write levelization output delay - parameter TAA_MIN = 13750; // TAA ps Internal READ command to first data - parameter CL_TIME = 13750; // CL ps Minimum CAS Latency - `elsif sg15E // sg15E is equivalent to the JEDEC DDR3-1333 (9-9-9) speed bin - parameter TCK_MIN = 1500; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 80; // tJIT(per) ps Period JItter - parameter TJIT_CC = 160; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 118; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 140; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 155; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 168; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 177; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 186; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 193; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 200; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 205; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 210; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 215; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 30; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 65; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 125; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 255; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 400; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 620; // tIPW ps Control and Address input Pulse Width - parameter TIS = 190; // tIS ps Input Setup Time - parameter TIH = 140; // tIH ps Input Hold Time - parameter TRAS_MIN = 36000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 49500; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 13500; // tRCD ps Active to Read/Write command time - parameter TRP = 13500; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5625; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 250; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 195; // tWLS ps Setup time for tDQS flop - parameter TWLH = 195; // tWLH ps Hold time of tDQS flop - parameter TWLO = 9000; // tWLO ps Write levelization output delay - parameter TAA_MIN = 13500; // TAA ps Internal READ command to first data - parameter CL_TIME = 13500; // CL ps Minimum CAS Latency - `else - `define sg187E // sg187E is equivalent to the JEDEC DDR3-1066 (7-7-7) speed bin - parameter TCK_MIN = 1875; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 90; // tJIT(per) ps Period JItter - parameter TJIT_CC = 180; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 132; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 157; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 175; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 188; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 200; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 209; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 217; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 224; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 231; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 237; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 242; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 75; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 100; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 150; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 300; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.38; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.38; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 490; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 780; // tIPW ps Control and Address input Pulse Width - parameter TIS = 275; // tIS ps Input Setup Time - parameter TIH = 200; // tIH ps Input Hold Time - parameter TRAS_MIN = 37500; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 50625; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 13125; // tRCD ps Active to Read/Write command time - parameter TRP = 13125; // tRP ps Precharge command period - parameter TXP = 7500; // tXP ps Exit power down to a valid command - parameter TCKE = 5625; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 300; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 245; // tWLS ps Setup time for tDQS flop - parameter TWLH = 245; // tWLH ps Hold time of tDQS flop - parameter TWLO = 9000; // tWLO ps Write levelization output delay - parameter TAA_MIN = 13125; // TAA ps Internal READ command to first data - parameter CL_TIME = 13125; // CL ps Minimum CAS Latency - `endif - - parameter TDQSCK_DLLDIS = TDQSCK; // tDQSCK ps for DLLDIS mode, timing not guaranteed - - `ifdef x16 - `ifdef sg093 - parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg107 - parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg125 - parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 40000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg15E - parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 45000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg15 - parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 45000; // tFAW ps (2KB page size) Four Bank Activate window - `else // sg187E, sg187, sg25, sg25E - parameter TRRD = 10000; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 50000; // tFAW ps (2KB page size) Four Bank Activate window - `endif - `else // x4, x8 - `ifdef sg093 - parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg107 - parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg125 - parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg15E - parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg15 - parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg187E - parameter TRRD = 7500; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 37500; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg187 - parameter TRRD = 7500; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 37500; // tFAW ps (1KB page size) Four Bank Activate window - `else // sg25, sg25E - parameter TRRD = 10000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 40000; // tFAW ps (1KB page size) Four Bank Activate window - `endif - `endif - - // Timing Parameters - - // Mode Register - parameter CL_MIN = 5; // CL tCK Minimum CAS Latency - parameter CL_MAX = 14; // CL tCK Maximum CAS Latency - parameter AL_MIN = 0; // AL tCK Minimum Additive Latency - parameter AL_MAX = 2; // AL tCK Maximum Additive Latency - parameter WR_MIN = 5; // WR tCK Minimum Write Recovery - parameter WR_MAX = 16; // WR tCK Maximum Write Recovery - parameter BL_MIN = 4; // BL tCK Minimum Burst Length - parameter BL_MAX = 8; // BL tCK Minimum Burst Length - parameter CWL_MIN = 5; // CWL tCK Minimum CAS Write Latency - parameter CWL_MAX = 10; // CWL tCK Maximum CAS Write Latency - - // Clock - parameter TCK_MAX = 3300; // tCK ps Maximum Clock Cycle Time - parameter TCH_AVG_MIN = 0.47; // tCH tCK Minimum Clock High-Level Pulse Width - parameter TCL_AVG_MIN = 0.47; // tCL tCK Minimum Clock Low-Level Pulse Width - parameter TCH_AVG_MAX = 0.53; // tCH tCK Maximum Clock High-Level Pulse Width - parameter TCL_AVG_MAX = 0.53; // tCL tCK Maximum Clock Low-Level Pulse Width - parameter TCH_ABS_MIN = 0.43; // tCH tCK Minimum Clock High-Level Pulse Width - parameter TCL_ABS_MIN = 0.43; // tCL tCK Maximum Clock Low-Level Pulse Width - parameter TCKE_TCK = 3; // tCKE tCK CKE minimum high or low pulse width - parameter TAA_MAX = 20000; // TAA ps Internal READ command to first data - - // Data OUT - parameter TQH = 0.38; // tQH ps DQ output hold time from DQS, DQS# - // Data Strobe OUT - parameter TRPRE = 0.90; // tRPRE tCK DQS Read Preamble - parameter TRPST = 0.30; // tRPST tCK DQS Read Postamble - // Data Strobe IN - parameter TDQSH = 0.45; // tDQSH tCK DQS input High Pulse Width - parameter TDQSL = 0.45; // tDQSL tCK DQS input Low Pulse Width - parameter TWPRE = 0.90; // tWPRE tCK DQS Write Preamble - parameter TWPST = 0.30; // tWPST tCK DQS Write Postamble - // Command and Address - integer TZQCS; // tZQCS tCK ZQ Cal (Short) time - integer TZQINIT = max(512, ceil(640000/TCK_MIN)); // tZQinit tCK ZQ Cal (Long) time - integer TZQOPER = max(256, ceil(320000/TCK_MIN)); // tZQoper tCK ZQ Cal (Long) time - parameter TCCD = 4; // tCCD tCK Cas to Cas command delay - parameter TCCD_DG = 2; // tCCD_DG tCK Cas to Cas command delay to different group - parameter TRAS_MAX = 60e9; // tRAS ps Maximum Active to Precharge command time - parameter TWR = 15000; // tWR ps Write recovery time - parameter TMRD = 4; // tMRD tCK Load Mode Register command cycle time - parameter TMOD = 15000; // tMOD ps LOAD MODE to non-LOAD MODE command cycle time - parameter TMOD_TCK = 12; // tMOD tCK LOAD MODE to non-LOAD MODE command cycle time - parameter TRRD_TCK = 4; // tRRD tCK Active bank a to Active bank b command time - parameter TRRD_DG = 3000; // tRRD_DG ps Active bank a to Active bank b command time to different group - parameter TRRD_DG_TCK = 2; // tRRD_DG tCK Active bank a to Active bank b command time to different group - parameter TRTP = 7500; // tRTP ps Read to Precharge command delay - parameter TRTP_TCK = 4; // tRTP tCK Read to Precharge command delay - parameter TWTR = 7500; // tWTR ps Write to Read command delay - parameter TWTR_DG = 3750; // tWTR_DG ps Write to Read command delay to different group - parameter TWTR_TCK = 4; // tWTR tCK Write to Read command delay - parameter TWTR_DG_TCK = 2; // tWTR_DG tCK Write to Read command delay to different group - parameter TDLLK = 512; // tDLLK tCK DLL locking time - // Refresh - 4Gb - parameter TRFC_MIN = 260000; // tRFC ps Refresh to Refresh Command interval minimum value - parameter TRFC_MAX =70200000; // tRFC ps Refresh to Refresh Command Interval maximum value - // Power Down - parameter TXP_TCK = 3; // tXP tCK Exit power down to a valid command - parameter TXPDLL = 24000; // tXPDLL ps Exit precharge power down to READ or WRITE command (DLL-off mode) - parameter TXPDLL_TCK = 10; // tXPDLL tCK Exit precharge power down to READ or WRITE command (DLL-off mode) - parameter TACTPDEN = 1; // tACTPDEN tCK Timing of last ACT command to power down entry - parameter TPRPDEN = 1; // tPREPDEN tCK Timing of last PRE command to power down entry - parameter TREFPDEN = 1; // tARPDEN tCK Timing of last REFRESH command to power down entry - parameter TCPDED = 1; // tCPDED tCK Command pass disable/enable delay - parameter TPD_MAX =TRFC_MAX; // tPD ps Power-down entry-to-exit timing - parameter TXPR = 270000; // tXPR ps Exit Reset from CKE assertion to a valid command - parameter TXPR_TCK = 5; // tXPR tCK Exit Reset from CKE assertion to a valid command - // Self Refresh - parameter TXS = 270000; // tXS ps Exit self refesh to a non-read or write command - parameter TXS_TCK = 5; // tXS tCK Exit self refesh to a non-read or write command - parameter TXSDLL = TDLLK; // tXSRD tCK Exit self refresh to a read or write command - parameter TISXR = TIS; // tISXR ps CKE setup time during self refresh exit. - parameter TCKSRE = 10000; // tCKSRE ps Valid Clock requirement after self refresh entry (SRE) - parameter TCKSRE_TCK = 5; // tCKSRE tCK Valid Clock requirement after self refresh entry (SRE) - parameter TCKSRX = 10000; // tCKSRX ps Valid Clock requirement prior to self refresh exit (SRX) - parameter TCKSRX_TCK = 5; // tCKSRX tCK Valid Clock requirement prior to self refresh exit (SRX) - parameter TCKESR_TCK = 4; // tCKESR tCK Minimum CKE low width for Self Refresh entry to exit timing - // ODT - parameter TAOF = 0.7; // tAOF tCK RTT turn-off from ODTLoff reference - parameter TAONPD = 8500; // tAONPD ps Asynchronous RTT turn-on delay (Power-Down with DLL frozen) - parameter TAOFPD = 8500; // tAONPD ps Asynchronous RTT turn-off delay (Power-Down with DLL frozen) - parameter ODTH4 = 4; // ODTH4 tCK ODT minimum HIGH time after ODT assertion or write (BL4) - parameter ODTH8 = 6; // ODTH8 tCK ODT minimum HIGH time after write (BL8) - parameter TADC = 0.7; // tADC tCK RTT dynamic change skew - // Write Levelization - parameter TWLMRD = 40; // tWLMRD tCK First DQS pulse rising edge after tDQSS margining mode is programmed - parameter TWLDQSEN = 25; // tWLDQSEN tCK DQS/DQS delay after tDQSS margining mode is programmed - parameter TWLOE = 2000; // tWLOE ps Write levelization output error - - // Size Parameters based on Part Width - - `ifdef x4 - parameter DM_BITS = 1; // Set this parameter to control how many Data Mask bits are used - parameter ADDR_BITS = 16; // MAX Address Bits - parameter ROW_BITS = 16; // Set this parameter to control how many Address bits are used - parameter COL_BITS = 14; // Set this parameter to control how many Column bits are used - parameter DQ_BITS = 4; // Set this parameter to control how many Data bits are used **Same as part bit width** - parameter DQS_BITS = 1; // Set this parameter to control how many Dqs bits are used - `define CA14PLUS - `elsif x8 - parameter DM_BITS = 1; // Set this parameter to control how many Data Mask bits are used - parameter ADDR_BITS = 16; // MAX Address Bits - parameter ROW_BITS = 16; // Set this parameter to control how many Address bits are used - parameter COL_BITS = 11; // Set this parameter to control how many Column bits are used - parameter DQ_BITS = 8; // Set this parameter to control how many Data bits are used **Same as part bit width** - parameter DQS_BITS = 1; // Set this parameter to control how many Dqs bits are used - `else - `define x16 - parameter DM_BITS = 2; // Set this parameter to control how many Data Mask bits are used - parameter ADDR_BITS = 16; // MAX Address Bits - parameter ROW_BITS = 16; // Set this parameter to control how many Address bits are used - parameter COL_BITS = 10; // Set this parameter to control how many Column bits are used - parameter DQ_BITS = 16; // Set this parameter to control how many Data bits are used **Same as part bit width** - parameter DQS_BITS = 2; // Set this parameter to control how many Dqs bits are used - `endif - - // Size Parameters - parameter BA_BITS = 3; // Set this parmaeter to control how many Bank Address bits are used - parameter MEM_BITS = 15; // Set this parameter to control how many write data bursts can be stored in memory. The default is 2^10=1024. - parameter AP = 10; // the address bit that controls auto-precharge and precharge-all - parameter BC = 12; // the address bit that controls burst chop - parameter BL_BITS = 3; // the number of bits required to count to BL_MAX - parameter BO_BITS = 2; // the number of Burst Order Bits - - `ifdef QUAD_RANK - parameter CS_BITS = 4; // Number of Chip Select Bits - parameter RANKS = 4; // Number of Chip Selects - `elsif DUAL_RANK - parameter CS_BITS = 2; // Number of Chip Select Bits - parameter RANKS = 2; // Number of Chip Selects - `else - parameter CS_BITS = 1; // Number of Chip Select Bits - parameter RANKS = 1; // Number of Chip Selects - `endif - - // Simulation parameters - parameter RZQ = 240; // termination resistance - parameter PRE_DEF_PAT = 8'hAA; // value returned during mpr pre-defined pattern readout - parameter STOP_ON_ERROR = 1; // If set to 1, the model will halt on command sequence/major errors - parameter DEBUG = 1; // Turn on Debug messages - parameter BUS_DELAY = 0; // delay in nanoseconds - parameter RANDOM_OUT_DELAY = 0; // If set to 1, the model will put a random amount of delay on DQ/DQS during reads - parameter RANDOM_SEED = 31913; //seed value for random generator. - - parameter RDQSEN_PRE = 2; // DQS driving time prior to first read strobe - parameter RDQSEN_PST = 1; // DQS driving time after last read strobe - parameter RDQS_PRE = 2; // DQS low time prior to first read strobe - parameter RDQS_PST = 1; // DQS low time after last read strobe - parameter RDQEN_PRE = 0; // DQ/DM driving time prior to first read data - parameter RDQEN_PST = 0; // DQ/DM driving time after last read data - parameter WDQS_PRE = 2; // DQS half clock periods prior to first write strobe - parameter WDQS_PST = 1; // DQS half clock periods after last write strobe - - // check for legal cas latency based on the cas write latency - function valid_cl; - input [3:0] cl; - input [3:0] cwl; - - case ({cwl, cl}) - `ifdef sg093 - {4'd5 , 4'd5 }, - {4'd5 , 4'd6 }, - {4'd6 , 4'd7 }, - {4'd6 , 4'd8 }, - {4'd7 , 4'd9 }, - {4'd7 , 4'd10}, - {4'd8 , 4'd11}, - {4'd9 , 4'd13}, - {4'd10, 4'd14}: valid_cl = 1; - `elsif sg107 - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}, - {4'd8, 4'd11}, - {4'd9, 4'd13}: valid_cl = 1; - `elsif sg125 - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}, - {4'd8, 4'd11}: valid_cl = 1; - `elsif sg15E - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}: valid_cl = 1; - `elsif sg15 - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd8 }, - {4'd7, 4'd10}: valid_cl = 1; - `elsif sg187E - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }: valid_cl = 1; - `elsif sg187 - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd8 }: valid_cl = 1; - `endif - default : valid_cl = 0; - endcase - endfunction - - // find the minimum valid cas write latency - function [3:0] min_cwl; - input period; - real period; - min_cwl = (period >= 2500.0) ? 5: - (period >= 1875.0) ? 6: - (period >= 1500.0) ? 7: - (period >= 1250.0) ? 8: - (period >= 1071.0) ? 9: - 10; // (period >= 938) - endfunction - - // find the minimum valid cas latency - function [3:0] min_cl; - input period; - real period; - reg [3:0] cwl; - reg [3:0] cl; - begin - cwl = min_cwl(period); - for (cl=CL_MAX; cl>=CL_MIN; cl=cl-1) begin - if (valid_cl(cl, cwl)) begin - min_cl = cl; - end - end - end - endfunction - -`elsif x4Gb // 4Gb parameters - // SYMBOL UNITS DESCRIPTION - // ------ ----- ----------- - `ifdef sg093 // sg093 is equivalent to the JEDEC DDR3-2133 (14-14-14) speed bin - parameter TCK_MIN = 938; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 50; // tJIT(per) ps Period JItter - parameter TJIT_CC = 100; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 74; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 87; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 97; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 105; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 111; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 116; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 121; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 125; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 128; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 132; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 134; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 5; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 70; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 180; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 280; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 470; // tIPW ps Control and Address input Pulse Width - parameter TIS = 35; // tIS ps Input Setup Time - parameter TIH = 75; // tIH ps Input Hold Time - parameter TRAS_MIN = 33000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 46130; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 13090; // tRCD ps Active to Read/Write command time - parameter TRP = 13090; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 180; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 122; // tWLS ps Setup time for tDQS flop - parameter TWLH = 122; // tWLH ps Hold time of tDQS flop - parameter TWLO = 7500; // tWLO ps Write levelization output delay - parameter TAA_MIN = 13090; // TAA ps Internal READ command to first data - parameter CL_TIME = 13090; // CL ps Minimum CAS Latency - `elsif sg093E // sg093E is equivalent to the JEDEC DDR3-2133 (13-13-13) speed bin - parameter TCK_MIN = 935; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 50; // tJIT(per) ps Period JItter - parameter TJIT_CC = 100; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 74; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 87; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 97; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 105; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 111; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 116; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 121; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 125; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 128; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 132; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 134; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 5; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 70; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 175; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 280; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 470; // tIPW ps Control and Address input Pulse Width - parameter TIS = 35; // tIS ps Input Setup Time - parameter TIH = 75; // tIH ps Input Hold Time - parameter TRAS_MIN = 33000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 47155; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 12155; // tRCD ps Active to Read/Write command time - parameter TRP = 12155; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 180; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 122; // tWLS ps Setup time for tDQS flop - parameter TWLH = 122; // tWLH ps Hold time of tDQS flop - parameter TWLO = 7500; // tWLO ps Write levelization output delay - parameter TAA_MIN = 12155; // TAA ps Internal READ command to first data - parameter CL_TIME = 12155; // CL ps Minimum CAS Latency - `elsif sg093F // sg093F is equivalent to the JEDEC DDR3-2133 (12-12-12) speed bin - parameter TCK_MIN = 935; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 50; // tJIT(per) ps Period JItter - parameter TJIT_CC = 100; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 74; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 87; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 97; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 105; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 111; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 116; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 121; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 125; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 128; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 132; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 134; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 5; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 70; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 175; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 280; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 470; // tIPW ps Control and Address input Pulse Width - parameter TIS = 35; // tIS ps Input Setup Time - parameter TIH = 75; // tIH ps Input Hold Time - parameter TRAS_MIN = 33000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 46220; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 11220; // tRCD ps Active to Read/Write command time - parameter TRP = 11220; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 180; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 122; // tWLS ps Setup time for tDQS flop - parameter TWLH = 122; // tWLH ps Hold time of tDQS flop - parameter TWLO = 7500; // tWLO ps Write levelization output delay - parameter TAA_MIN = 11220; // TAA ps Internal READ command to first data - parameter CL_TIME = 11220; // CL ps Minimum CAS Latency - `elsif sg107 // sg107 is equivalent to the JEDEC DDR3-1866 (13-13-13) speed bin - parameter TCK_MIN = 1071; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 60; // tJIT(per) ps Period JItter - parameter TJIT_CC = 120; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 88; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 105; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 117; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 126; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 133; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 139; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 145; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 150; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 154; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 158; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 161; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 80; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 200; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 320; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 535; // tIPW ps Control and Address input Pulse Width - parameter TIS = 50; // tIS ps Input Setup Time - parameter TIH = 100; // tIH ps Input Hold Time - parameter TRAS_MIN = 34000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 47910; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 13910; // tRCD ps Active to Read/Write command time - parameter TRP = 13910; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 200; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 140; // tWLS ps Setup time for tDQS flop - parameter TWLH = 140; // tWLH ps Hold time of tDQS flop - parameter TWLO = 7500; // tWLO ps Write levelization output delay - parameter TAA_MIN = 13910; // TAA ps Internal READ command to first data - parameter CL_TIME = 13910; // CL ps Minimum CAS Latency - `elsif sg107E // sg107E is equivalent to the JEDEC DDR3-1866 (12-12-12) speed bin - parameter TCK_MIN = 1070; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 60; // tJIT(per) ps Period JItter - parameter TJIT_CC = 120; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 88; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 105; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 117; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 126; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 133; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 139; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 145; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 150; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 154; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 158; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 161; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 80; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 200; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 320; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 535; // tIPW ps Control and Address input Pulse Width - parameter TIS = 50; // tIS ps Input Setup Time - parameter TIH = 100; // tIH ps Input Hold Time - parameter TRAS_MIN = 34000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 47840; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 12840; // tRCD ps Active to Read/Write command time - parameter TRP = 12840; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 200; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 140; // tWLS ps Setup time for tDQS flop - parameter TWLH = 140; // tWLH ps Hold time of tDQS flop - parameter TWLO = 7500; // tWLO ps Write levelization output delay - parameter TAA_MIN = 12840; // TAA ps Internal READ command to first data - parameter CL_TIME = 12840; // CL ps Minimum CAS Latency - `elsif sg107F // sg107F is equivalent to the JEDEC DDR3-1866 (11-11-11) speed bin - parameter TCK_MIN = 1070; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 60; // tJIT(per) ps Period JItter - parameter TJIT_CC = 120; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 88; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 105; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 117; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 126; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 133; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 139; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 145; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 150; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 154; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 158; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 161; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 80; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 200; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 320; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 535; // tIPW ps Control and Address input Pulse Width - parameter TIS = 50; // tIS ps Input Setup Time - parameter TIH = 100; // tIH ps Input Hold Time - parameter TRAS_MIN = 34000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 46770; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 11770; // tRCD ps Active to Read/Write command time - parameter TRP = 11770; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 200; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 140; // tWLS ps Setup time for tDQS flop - parameter TWLH = 140; // tWLH ps Hold time of tDQS flop - parameter TWLO = 7500; // tWLO ps Write levelization output delay - parameter TAA_MIN = 11770; // TAA ps Internal READ command to first data - parameter CL_TIME = 11770; // CL ps Minimum CAS Latency - `elsif sg125E // sg125E is equivalent to the JEDEC DDR3-1600 (10-10-10) speed bin - parameter TCK_MIN = 1250; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 70; // tJIT(per) ps Period JItter - parameter TJIT_CC = 140; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 103; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 122; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 136; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 147; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 155; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 163; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 169; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 175; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 180; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 184; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 188; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 45; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 100; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 225; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 360; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 560; // tIPW ps Control and Address input Pulse Width - parameter TIS = 170; // tIS ps Input Setup Time - parameter TIH = 120; // tIH ps Input Hold Time - parameter TRAS_MIN = 35000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 47500; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 12500; // tRCD ps Active to Read/Write command time - parameter TRP = 12500; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 250; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 165; // tWLS ps Setup time for tDQS flop - parameter TWLH = 165; // tWLH ps Hold time of tDQS flop - parameter TWLO = 7500; // tWLO ps Write levelization output delay - parameter TAA_MIN = 12500; // TAA ps Internal READ command to first data - parameter CL_TIME = 12500; // CL ps Minimum CAS Latency - `elsif sg125 // sg125 is equivalent to the JEDEC DDR3-1600 (11-11-11) speed bin - parameter TCK_MIN = 1250; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 70; // tJIT(per) ps Period JItter - parameter TJIT_CC = 140; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 103; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 122; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 136; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 147; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 155; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 163; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 169; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 175; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 180; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 184; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 188; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 45; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 100; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 225; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 360; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 560; // tIPW ps Control and Address input Pulse Width - parameter TIS = 170; // tIS ps Input Setup Time - parameter TIH = 120; // tIH ps Input Hold Time - parameter TRAS_MIN = 35000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 48750; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 13750; // tRCD ps Active to Read/Write command time - parameter TRP = 13750; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 250; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 165; // tWLS ps Setup time for tDQS flop - parameter TWLH = 165; // tWLH ps Hold time of tDQS flop - parameter TWLO = 7500; // tWLO ps Write levelization output delay - parameter TAA_MIN = 13750; // TAA ps Internal READ command to first data - parameter CL_TIME = 13750; // CL ps Minimum CAS Latency - `elsif sg15E // sg15E is equivalent to the JEDEC DDR3-1333H (9-9-9) speed bin - parameter TCK_MIN = 1500; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 80; // tJIT(per) ps Period JItter - parameter TJIT_CC = 160; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 118; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 140; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 155; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 168; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 177; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 186; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 193; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 200; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 205; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 210; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 215; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 30; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 65; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 125; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 255; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 400; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 620; // tIPW ps Control and Address input Pulse Width - parameter TIS = 190; // tIS ps Input Setup Time - parameter TIH = 140; // tIH ps Input Hold Time - parameter TRAS_MIN = 36000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 49500; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 13500; // tRCD ps Active to Read/Write command time - parameter TRP = 13500; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5625; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 250; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 195; // tWLS ps Setup time for tDQS flop - parameter TWLH = 195; // tWLH ps Hold time of tDQS flop - parameter TWLO = 9000; // tWLO ps Write levelization output delay - parameter TAA_MIN = 13500; // TAA ps Internal READ command to first data - parameter CL_TIME = 13500; // CL ps Minimum CAS Latency - `elsif sg15 // sg15 is equivalent to the JEDEC DDR3-1333J (10-10-10) speed bin - parameter TCK_MIN = 1500; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 80; // tJIT(per) ps Period JItter - parameter TJIT_CC = 160; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 118; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 140; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 155; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 168; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 177; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 186; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 193; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 200; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 205; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 210; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 215; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 30; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 65; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 125; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 255; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 400; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 620; // tIPW ps Control and Address input Pulse Width - parameter TIS = 190; // tIS ps Input Setup Time - parameter TIH = 140; // tIH ps Input Hold Time - parameter TRAS_MIN = 36000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 51000; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 15000; // tRCD ps Active to Read/Write command time - parameter TRP = 15000; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5625; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 250; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 195; // tWLS ps Setup time for tDQS flop - parameter TWLH = 195; // tWLH ps Hold time of tDQS flop - parameter TWLO = 9000; // tWLO ps Write levelization output delay - parameter TAA_MIN = 15000; // TAA ps Internal READ command to first data - parameter CL_TIME = 15000; // CL ps Minimum CAS Latency - `elsif sg187E // sg187E is equivalent to the JEDEC DDR3-1066F (7-7-7) speed bin - parameter TCK_MIN = 1875; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 90; // tJIT(per) ps Period JItter - parameter TJIT_CC = 180; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 132; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 157; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 175; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 188; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 200; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 209; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 217; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 224; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 231; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 237; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 242; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 75; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 100; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 150; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 300; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.38; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.38; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 490; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 780; // tIPW ps Control and Address input Pulse Width - parameter TIS = 275; // tIS ps Input Setup Time - parameter TIH = 200; // tIH ps Input Hold Time - parameter TRAS_MIN = 37500; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 50625; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 13125; // tRCD ps Active to Read/Write command time - parameter TRP = 13125; // tRP ps Precharge command period - parameter TXP = 7500; // tXP ps Exit power down to a valid command - parameter TCKE = 5625; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 300; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 245; // tWLS ps Setup time for tDQS flop - parameter TWLH = 245; // tWLH ps Hold time of tDQS flop - parameter TWLO = 9000; // tWLO ps Write levelization output delay - parameter TAA_MIN = 13125; // TAA ps Internal READ command to first data - parameter CL_TIME = 13125; // CL ps Minimum CAS Latency - `elsif sg187 // sg187 is equivalent to the JEDEC DDR3-1066G (8-8-8) speed bin - parameter TCK_MIN = 1875; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 90; // tJIT(per) ps Period JItter - parameter TJIT_CC = 180; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 132; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 157; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 175; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 188; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 200; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 209; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 217; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 224; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 231; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 237; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 242; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 75; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 100; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 150; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 300; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.38; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.38; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 490; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 780; // tIPW ps Control and Address input Pulse Width - parameter TIS = 275; // tIS ps Input Setup Time - parameter TIH = 200; // tIH ps Input Hold Time - parameter TRAS_MIN = 37500; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 52500; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 15000; // tRCD ps Active to Read/Write command time - parameter TRP = 15000; // tRP ps Precharge command period - parameter TXP = 7500; // tXP ps Exit power down to a valid command - parameter TCKE = 5625; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 300; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 245; // tWLS ps Setup time for tDQS flop - parameter TWLH = 245; // tWLH ps Hold time of tDQS flop - parameter TWLO = 9000; // tWLO ps Write levelization output delay - parameter TAA_MIN = 15000; // TAA ps Internal READ command to first data - parameter CL_TIME = 15000; // CL ps Minimum CAS Latency - `elsif sg25E // sg25E is equivalent to the JEDEC DDR3-800D (5-5-5) speed bin - parameter TCK_MIN = 2500; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 100; // tJIT(per) ps Period JItter - parameter TJIT_CC = 200; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 147; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 175; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 194; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 209; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 222; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 232; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 241; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 249; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 257; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 263; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 269; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 125; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 150; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 200; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 400; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.38; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.38; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 600; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 900; // tIPW ps Control and Address input Pulse Width - parameter TIS = 350; // tIS ps Input Setup Time - parameter TIH = 275; // tIH ps Input Hold Time - parameter TRAS_MIN = 37500; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 50000; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 12500; // tRCD ps Active to Read/Write command time - parameter TRP = 12500; // tRP ps Precharge command period - parameter TXP = 7500; // tXP ps Exit power down to a valid command - parameter TCKE = 7500; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 400; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 325; // tWLS ps Setup time for tDQS flop - parameter TWLH = 325; // tWLH ps Hold time of tDQS flop - parameter TWLO = 9000; // tWLO ps Write levelization output delay - parameter TAA_MIN = 12500; // TAA ps Internal READ command to first data - parameter CL_TIME = 12500; // CL ps Minimum CAS Latency - `else //`define sg25 // sg25 is equivalent to the JEDEC DDR3-800E (6-6-6) speed bin - parameter TCK_MIN = 2500; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 100; // tJIT(per) ps Period JItter - parameter TJIT_CC = 200; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 147; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 175; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 194; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 209; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 222; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 232; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 241; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 249; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 257; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 263; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 269; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 125; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 150; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 200; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 400; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.38; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.38; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 600; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 900; // tIPW ps Control and Address input Pulse Width - parameter TIS = 350; // tIS ps Input Setup Time - parameter TIH = 275; // tIH ps Input Hold Time - parameter TRAS_MIN = 37500; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 52500; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 15000; // tRCD ps Active to Read/Write command time - parameter TRP = 15000; // tRP ps Precharge command period - parameter TXP = 7500; // tXP ps Exit power down to a valid command - parameter TCKE = 7500; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 400; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 325; // tWLS ps Setup time for tDQS flop - parameter TWLH = 325; // tWLH ps Hold time of tDQS flop - parameter TWLO = 9000; // tWLO ps Write levelization output delay - parameter TAA_MIN = 15000; // TAA ps Internal READ command to first data - parameter CL_TIME = 15000; // CL ps Minimum CAS Latency - `endif - - parameter TDQSCK_DLLDIS = TDQSCK; // tDQSCK ps for DLLDIS mode, timing not guaranteed - - `ifdef x16 - `ifdef sg093 - parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg093E - parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg093F - parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg107 - parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg107E - parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg107F - parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg125E - parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 40000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg125 - parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 40000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg15E - parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 45000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg15 - parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 45000; // tFAW ps (2KB page size) Four Bank Activate window - `else // sg187E, sg187, sg25, sg25E - parameter TRRD = 10000; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 50000; // tFAW ps (2KB page size) Four Bank Activate window - `endif - `else // x4, x8 - `ifdef sg093 - parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg093E - parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg093F - parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg107 - parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg107E - parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg107F - parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg125E - parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg125 - parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg15E - parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg15 - parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg187E - parameter TRRD = 7500; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 37500; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg187 - parameter TRRD = 7500; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 37500; // tFAW ps (1KB page size) Four Bank Activate window - `else // sg25, sg25E - parameter TRRD = 10000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 40000; // tFAW ps (1KB page size) Four Bank Activate window - `endif - `endif - - // Timing Parameters - - // Mode Register - parameter CL_MIN = 5; // CL tCK Minimum CAS Latency - parameter CL_MAX = 14; // CL tCK Maximum CAS Latency - parameter AL_MIN = 0; // AL tCK Minimum Additive Latency - parameter AL_MAX = 2; // AL tCK Maximum Additive Latency - parameter WR_MIN = 5; // WR tCK Minimum Write Recovery - parameter WR_MAX = 16; // WR tCK Maximum Write Recovery - parameter BL_MIN = 4; // BL tCK Minimum Burst Length - parameter BL_MAX = 8; // BL tCK Minimum Burst Length - parameter CWL_MIN = 5; // CWL tCK Minimum CAS Write Latency - parameter CWL_MAX = 10; // CWL tCK Maximum CAS Write Latency - - // Clock - parameter TCK_MAX = 3300; // tCK ps Maximum Clock Cycle Time - parameter TCH_AVG_MIN = 0.47; // tCH tCK Minimum Clock High-Level Pulse Width - parameter TCL_AVG_MIN = 0.47; // tCL tCK Minimum Clock Low-Level Pulse Width - parameter TCH_AVG_MAX = 0.53; // tCH tCK Maximum Clock High-Level Pulse Width - parameter TCL_AVG_MAX = 0.53; // tCL tCK Maximum Clock Low-Level Pulse Width - parameter TCH_ABS_MIN = 0.43; // tCH tCK Minimum Clock High-Level Pulse Width - parameter TCL_ABS_MIN = 0.43; // tCL tCK Maximum Clock Low-Level Pulse Width - parameter TCKE_TCK = 3; // tCKE tCK CKE minimum high or low pulse width - parameter TAA_MAX = 20000; // TAA ps Internal READ command to first data - - // Data OUT - parameter TQH = 0.38; // tQH ps DQ output hold time from DQS, DQS# - // Data Strobe OUT - parameter TRPRE = 0.90; // tRPRE tCK DQS Read Preamble - parameter TRPST = 0.30; // tRPST tCK DQS Read Postamble - // Data Strobe IN - parameter TDQSH = 0.45; // tDQSH tCK DQS input High Pulse Width - parameter TDQSL = 0.45; // tDQSL tCK DQS input Low Pulse Width - parameter TWPRE = 0.90; // tWPRE tCK DQS Write Preamble - parameter TWPST = 0.30; // tWPST tCK DQS Write Postamble - // Command and Address - integer TZQCS; // tZQCS tCK ZQ Cal (Short) time - integer TZQINIT = max(512, ceil(640000/TCK_MIN)); // tZQinit tCK ZQ Cal (Long) time - integer TZQOPER = max(256, ceil(320000/TCK_MIN)); // tZQoper tCK ZQ Cal (Long) time - parameter TCCD = 4; // tCCD tCK Cas to Cas command delay - parameter TCCD_DG = 2; // tCCD_DG tCK Cas to Cas command delay to different group - parameter TRAS_MAX = 60e9; // tRAS ps Maximum Active to Precharge command time - parameter TWR = 15000; // tWR ps Write recovery time - parameter TMRD = 4; // tMRD tCK Load Mode Register command cycle time - parameter TMOD = 15000; // tMOD ps LOAD MODE to non-LOAD MODE command cycle time - parameter TMOD_TCK = 12; // tMOD tCK LOAD MODE to non-LOAD MODE command cycle time - parameter TRRD_TCK = 4; // tRRD tCK Active bank a to Active bank b command time - parameter TRRD_DG = 3000; // tRRD_DG ps Active bank a to Active bank b command time to different group - parameter TRRD_DG_TCK = 2; // tRRD_DG tCK Active bank a to Active bank b command time to different group - parameter TRTP = 7500; // tRTP ps Read to Precharge command delay - parameter TRTP_TCK = 4; // tRTP tCK Read to Precharge command delay - parameter TWTR = 7500; // tWTR ps Write to Read command delay - parameter TWTR_DG = 3750; // tWTR_DG ps Write to Read command delay to different group - parameter TWTR_TCK = 4; // tWTR tCK Write to Read command delay - parameter TWTR_DG_TCK = 2; // tWTR_DG tCK Write to Read command delay to different group - parameter TDLLK = 512; // tDLLK tCK DLL locking time - // Refresh - 4Gb - parameter TRFC_MIN = 260000; // tRFC ps Refresh to Refresh Command interval minimum value - parameter TRFC_MAX =70200000; // tRFC ps Refresh to Refresh Command Interval maximum value - // Power Down - parameter TXP_TCK = 3; // tXP tCK Exit power down to a valid command - parameter TXPDLL = 24000; // tXPDLL ps Exit precharge power down to READ or WRITE command (DLL-off mode) - parameter TXPDLL_TCK = 10; // tXPDLL tCK Exit precharge power down to READ or WRITE command (DLL-off mode) - parameter TACTPDEN = 1; // tACTPDEN tCK Timing of last ACT command to power down entry - parameter TPRPDEN = 1; // tPREPDEN tCK Timing of last PRE command to power down entry - parameter TREFPDEN = 1; // tARPDEN tCK Timing of last REFRESH command to power down entry - parameter TCPDED = 1; // tCPDED tCK Command pass disable/enable delay - parameter TPD_MAX =TRFC_MAX; // tPD ps Power-down entry-to-exit timing - parameter TXPR = 270000; // tXPR ps Exit Reset from CKE assertion to a valid command - parameter TXPR_TCK = 5; // tXPR tCK Exit Reset from CKE assertion to a valid command - // Self Refresh - parameter TXS = 270000; // tXS ps Exit self refesh to a non-read or write command - parameter TXS_TCK = 5; // tXS tCK Exit self refesh to a non-read or write command - parameter TXSDLL = TDLLK; // tXSRD tCK Exit self refresh to a read or write command - parameter TISXR = TIS; // tISXR ps CKE setup time during self refresh exit. - parameter TCKSRE = 10000; // tCKSRE ps Valid Clock requirement after self refresh entry (SRE) - parameter TCKSRE_TCK = 5; // tCKSRE tCK Valid Clock requirement after self refresh entry (SRE) - parameter TCKSRX = 10000; // tCKSRX ps Valid Clock requirement prior to self refresh exit (SRX) - parameter TCKSRX_TCK = 5; // tCKSRX tCK Valid Clock requirement prior to self refresh exit (SRX) - parameter TCKESR_TCK = 4; // tCKESR tCK Minimum CKE low width for Self Refresh entry to exit timing - // ODT - parameter TAOF = 0.7; // tAOF tCK RTT turn-off from ODTLoff reference - parameter TAONPD = 8500; // tAONPD ps Asynchronous RTT turn-on delay (Power-Down with DLL frozen) - parameter TAOFPD = 8500; // tAONPD ps Asynchronous RTT turn-off delay (Power-Down with DLL frozen) - parameter ODTH4 = 4; // ODTH4 tCK ODT minimum HIGH time after ODT assertion or write (BL4) - parameter ODTH8 = 6; // ODTH8 tCK ODT minimum HIGH time after write (BL8) - parameter TADC = 0.7; // tADC tCK RTT dynamic change skew - // Write Levelization - parameter TWLMRD = 40; // tWLMRD tCK First DQS pulse rising edge after tDQSS margining mode is programmed - parameter TWLDQSEN = 25; // tWLDQSEN tCK DQS/DQS delay after tDQSS margining mode is programmed - parameter TWLOE = 2000; // tWLOE ps Write levelization output error - - // Size Parameters based on Part Width - - `ifdef x4 - parameter DM_BITS = 1; // Set this parameter to control how many Data Mask bits are used - parameter ADDR_BITS = 16; // MAX Address Bits - parameter ROW_BITS = 16; // Set this parameter to control how many Address bits are used - parameter COL_BITS = 11; // Set this parameter to control how many Column bits are used - parameter DQ_BITS = 4; // Set this parameter to control how many Data bits are used **Same as part bit width** - parameter DQS_BITS = 1; // Set this parameter to control how many Dqs bits are used - `elsif x8 - parameter DM_BITS = 1; // Set this parameter to control how many Data Mask bits are used - parameter ADDR_BITS = 16; // MAX Address Bits - parameter ROW_BITS = 16; // Set this parameter to control how many Address bits are used - parameter COL_BITS = 10; // Set this parameter to control how many Column bits are used - parameter DQ_BITS = 8; // Set this parameter to control how many Data bits are used **Same as part bit width** - parameter DQS_BITS = 1; // Set this parameter to control how many Dqs bits are used - `else //`define x16 - parameter DM_BITS = 2; // Set this parameter to control how many Data Mask bits are used - parameter ADDR_BITS = 15; // MAX Address Bits - parameter ROW_BITS = 15; // Set this parameter to control how many Address bits are used - parameter COL_BITS = 10; // Set this parameter to control how many Column bits are used - parameter DQ_BITS = 16; // Set this parameter to control how many Data bits are used **Same as part bit width** - parameter DQS_BITS = 2; // Set this parameter to control how many Dqs bits are used - `endif - - // Size Parameters - parameter BA_BITS = 3; // Set this parmaeter to control how many Bank Address bits are used - parameter MEM_BITS = 15; // Set this parameter to control how many write data bursts can be stored in memory. The default is 2^10=1024. - parameter AP = 10; // the address bit that controls auto-precharge and precharge-all - parameter BC = 12; // the address bit that controls burst chop - parameter BL_BITS = 3; // the number of bits required to count to BL_MAX - parameter BO_BITS = 2; // the number of Burst Order Bits - - `ifdef QUAD_RANK - parameter CS_BITS = 4; // Number of Chip Select Bits - parameter RANKS = 4; // Number of Chip Selects - `elsif DUAL_RANK - parameter CS_BITS = 2; // Number of Chip Select Bits - parameter RANKS = 2; // Number of Chip Selects - `else - parameter CS_BITS = 1; // Number of Chip Select Bits - parameter RANKS = 1; // Number of Chip Selects - `endif - - // Simulation parameters - parameter RZQ = 240; // termination resistance - parameter PRE_DEF_PAT = 8'hAA; // value returned during mpr pre-defined pattern readout - parameter STOP_ON_ERROR = 1; // If set to 1, the model will halt on command sequence/major errors - parameter DEBUG = 1; // Turn on Debug messages - parameter BUS_DELAY = 0; // delay in nanoseconds - parameter RANDOM_OUT_DELAY = 0; // If set to 1, the model will put a random amount of delay on DQ/DQS during reads - parameter RANDOM_SEED = 31913; //seed value for random generator. - - parameter RDQSEN_PRE = 2; // DQS driving time prior to first read strobe - parameter RDQSEN_PST = 1; // DQS driving time after last read strobe - parameter RDQS_PRE = 2; // DQS low time prior to first read strobe - parameter RDQS_PST = 1; // DQS low time after last read strobe - parameter RDQEN_PRE = 0; // DQ/DM driving time prior to first read data - parameter RDQEN_PST = 0; // DQ/DM driving time after last read data - parameter WDQS_PRE = 2; // DQS half clock periods prior to first write strobe - parameter WDQS_PST = 1; // DQS half clock periods after last write strobe - - // check for legal cas latency based on the cas write latency - function valid_cl; - input [3:0] cl; - input [3:0] cwl; - - case ({cwl, cl}) - `ifdef sg093 - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}, - {4'd8, 4'd11}, - {4'd9, 4'd13}, - {4'd10, 4'd14}: valid_cl = 1; - `elsif sg093E - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}, - {4'd8, 4'd10}, - {4'd8, 4'd11}, - {4'd9, 4'd12}, - {4'd9, 4'd13}, - {4'd10, 4'd13}, - {4'd10, 4'd14}: valid_cl = 1; - `elsif sg093F - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}, - {4'd8, 4'd9 }, - {4'd8, 4'd10}, - {4'd8, 4'd11}, - {4'd9, 4'd11}, - {4'd9, 4'd12}, - {4'd9, 4'd13}, - {4'd10, 4'd12}, - {4'd10, 4'd13}, - {4'd10, 4'd14}: valid_cl = 1; - `elsif sg107 - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}, - {4'd8, 4'd11}, - {4'd9, 4'd13}: valid_cl = 1; - `elsif sg107E - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}, - {4'd8, 4'd11}, - {4'd9, 4'd12}, - {4'd9, 4'd13}: valid_cl = 1; - `elsif sg107F - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}, - {4'd8, 4'd10}, - {4'd8, 4'd11}, - {4'd9, 4'd11}, - {4'd9, 4'd12}, - {4'd9, 4'd13}: valid_cl = 1; - `elsif sg125E - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}, - {4'd8, 4'd10}, - {4'd8, 4'd11}: valid_cl = 1; - `elsif sg125 - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}, - {4'd8, 4'd11}: valid_cl = 1; - `elsif sg15E - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}: valid_cl = 1; - `elsif sg15 - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd8 }, - {4'd7, 4'd10}: valid_cl = 1; - `elsif sg187E - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }: valid_cl = 1; - `elsif sg187 - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd8 }: valid_cl = 1; - `elsif sg25E - {4'd5, 4'd5 }, - {4'd5, 4'd6 }: valid_cl = 1; - `elsif sg25 - {4'd5, 4'd5 }, - {4'd5, 4'd6 }: valid_cl = 1; - `endif - default : valid_cl = 0; - endcase - endfunction - - // find the minimum valid cas write latency - function [3:0] min_cwl; - input period; - real period; - min_cwl = (period >= 2500.0) ? 5: - (period >= 1875.0) ? 6: - (period >= 1500.0) ? 7: - (period >= 1250.0) ? 8: - (period >= 1071.0) ? 9: - 10; // (period >= 938) - endfunction - - // find the minimum valid cas latency - function [3:0] min_cl; - input period; - real period; - reg [3:0] cwl; - reg [3:0] cl; - begin - cwl = min_cwl(period); - for (cl=CL_MAX; cl>=CL_MIN; cl=cl-1) begin - if (valid_cl(cl, cwl)) begin - min_cl = cl; - end - end - end - endfunction - -`elsif x2Gb // 2Gb parameters - - // SYMBOL UNITS DESCRIPTION - // ------ ----- ----------- - `ifdef sg093 // sg093 is equivalent to the JEDEC DDR3-2133 (14-14-14) speed bin - parameter TCK_MIN = 938; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 50; // tJIT(per) ps Period JItter - parameter TJIT_CC = 100; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 74; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 87; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 97; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 105; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 111; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 116; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 121; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 125; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 128; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 132; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 134; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 5; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 70; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 180; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 280; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 470; // tIPW ps Control and Address input Pulse Width - parameter TIS = 35; // tIS ps Input Setup Time - parameter TIH = 75; // tIH ps Input Hold Time - parameter TRAS_MIN = 33000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 46130; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 13090; // tRCD ps Active to Read/Write command time - parameter TRP = 13090; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 180; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 122; // tWLS ps Setup time for tDQS flop - parameter TWLH = 122; // tWLH ps Hold time of tDQS flop - parameter TWLO = 7500; // tWLO ps Write levelization output delay - parameter TAA_MIN = 13090; // TAA ps Internal READ command to first data - parameter CL_TIME = 13090; // CL ps Minimum CAS Latency - `elsif sg093E // sg093E is equivalent to the JEDEC DDR3-2133 (13-13-13) speed bin - parameter TCK_MIN = 935; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 50; // tJIT(per) ps Period JItter - parameter TJIT_CC = 100; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 74; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 87; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 97; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 105; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 111; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 116; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 121; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 125; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 128; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 132; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 134; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 5; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 70; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 175; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 280; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 470; // tIPW ps Control and Address input Pulse Width - parameter TIS = 35; // tIS ps Input Setup Time - parameter TIH = 75; // tIH ps Input Hold Time - parameter TRAS_MIN = 33000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 47155; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 12155; // tRCD ps Active to Read/Write command time - parameter TRP = 12155; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 180; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 122; // tWLS ps Setup time for tDQS flop - parameter TWLH = 122; // tWLH ps Hold time of tDQS flop - parameter TWLO = 7500; // tWLO ps Write levelization output delay - parameter TAA_MIN = 12155; // TAA ps Internal READ command to first data - parameter CL_TIME = 12155; // CL ps Minimum CAS Latency - `elsif sg093F // sg093F is equivalent to the JEDEC DDR3-2133 (12-12-12) speed bin - parameter TCK_MIN = 935; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 50; // tJIT(per) ps Period JItter - parameter TJIT_CC = 100; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 74; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 87; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 97; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 105; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 111; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 116; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 121; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 125; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 128; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 132; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 134; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 5; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 70; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 175; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 280; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 470; // tIPW ps Control and Address input Pulse Width - parameter TIS = 35; // tIS ps Input Setup Time - parameter TIH = 75; // tIH ps Input Hold Time - parameter TRAS_MIN = 33000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 46220; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 11220; // tRCD ps Active to Read/Write command time - parameter TRP = 11220; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 180; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 122; // tWLS ps Setup time for tDQS flop - parameter TWLH = 122; // tWLH ps Hold time of tDQS flop - parameter TWLO = 7500; // tWLO ps Write levelization output delay - parameter TAA_MIN = 11220; // TAA ps Internal READ command to first data - parameter CL_TIME = 11220; // CL ps Minimum CAS Latency - `elsif sg107 // sg107 is equivalent to the JEDEC DDR3-1866 (13-13-13) speed bin - parameter TCK_MIN = 1071; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 60; // tJIT(per) ps Period JItter - parameter TJIT_CC = 120; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 88; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 105; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 117; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 126; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 133; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 139; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 145; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 150; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 154; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 158; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 161; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 80; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 200; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 320; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 535; // tIPW ps Control and Address input Pulse Width - parameter TIS = 50; // tIS ps Input Setup Time - parameter TIH = 100; // tIH ps Input Hold Time - parameter TRAS_MIN = 34000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 48910; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 13910; // tRCD ps Active to Read/Write command time - parameter TRP = 13910; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 200; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 140; // tWLS ps Setup time for tDQS flop - parameter TWLH = 140; // tWLH ps Hold time of tDQS flop - parameter TWLO = 7500; // tWLO ps Write levelization output delay - parameter TAA_MIN = 13910; // TAA ps Internal READ command to first data - parameter CL_TIME = 13910; // CL ps Minimum CAS Latency - `elsif sg107E // sg107E is equivalent to the JEDEC DDR3-1866 (12-12-12) speed bin - parameter TCK_MIN = 1070; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 60; // tJIT(per) ps Period JItter - parameter TJIT_CC = 120; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 88; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 105; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 117; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 126; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 133; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 139; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 145; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 150; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 154; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 158; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 161; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 80; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 200; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 320; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 535; // tIPW ps Control and Address input Pulse Width - parameter TIS = 50; // tIS ps Input Setup Time - parameter TIH = 100; // tIH ps Input Hold Time - parameter TRAS_MIN = 34000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 47840; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 12840; // tRCD ps Active to Read/Write command time - parameter TRP = 12840; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 200; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 140; // tWLS ps Setup time for tDQS flop - parameter TWLH = 140; // tWLH ps Hold time of tDQS flop - parameter TWLO = 7500; // tWLO ps Write levelization output delay - parameter TAA_MIN = 12840; // TAA ps Internal READ command to first data - parameter CL_TIME = 12840; // CL ps Minimum CAS Latency - `elsif sg107F // sg107F is equivalent to the JEDEC DDR3-1866 (11-11-11) speed bin - parameter TCK_MIN = 1070; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 60; // tJIT(per) ps Period JItter - parameter TJIT_CC = 120; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 88; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 105; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 117; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 126; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 133; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 139; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 145; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 150; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 154; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 158; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 161; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 80; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 200; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 320; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 535; // tIPW ps Control and Address input Pulse Width - parameter TIS = 50; // tIS ps Input Setup Time - parameter TIH = 100; // tIH ps Input Hold Time - parameter TRAS_MIN = 34000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 46770; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 11770; // tRCD ps Active to Read/Write command time - parameter TRP = 11770; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 200; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 140; // tWLS ps Setup time for tDQS flop - parameter TWLH = 140; // tWLH ps Hold time of tDQS flop - parameter TWLO = 7500; // tWLO ps Write levelization output delay - parameter TAA_MIN = 11770; // TAA ps Internal READ command to first data - parameter CL_TIME = 11770; // CL ps Minimum CAS Latency - `elsif sg125E // sg125E is equivalent to the JEDEC DDR3-1600 (10-10-10) speed bin - parameter TCK_MIN = 1250; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 70; // tJIT(per) ps Period JItter - parameter TJIT_CC = 140; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 103; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 122; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 136; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 147; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 155; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 163; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 169; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 175; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 180; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 184; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 188; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 45; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 100; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 225; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 360; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 560; // tIPW ps Control and Address input Pulse Width - parameter TIS = 170; // tIS ps Input Setup Time - parameter TIH = 120; // tIH ps Input Hold Time - parameter TRAS_MIN = 35000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 47500; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 12500; // tRCD ps Active to Read/Write command time - parameter TRP = 12500; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 250; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 165; // tWLS ps Setup time for tDQS flop - parameter TWLH = 165; // tWLH ps Hold time of tDQS flop - parameter TWLO = 7500; // tWLO ps Write levelization output delay - parameter TAA_MIN = 12500; // TAA ps Internal READ command to first data - parameter CL_TIME = 12500; // CL ps Minimum CAS Latency - `elsif sg125 // sg125 is equivalent to the JEDEC DDR3-1600 (11-11-11) speed bin - parameter TCK_MIN = 1250; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 70; // tJIT(per) ps Period JItter - parameter TJIT_CC = 140; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 103; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 122; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 136; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 147; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 155; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 163; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 169; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 175; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 180; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 184; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 188; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 45; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 100; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 225; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 360; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 560; // tIPW ps Control and Address input Pulse Width - parameter TIS = 170; // tIS ps Input Setup Time - parameter TIH = 120; // tIH ps Input Hold Time - parameter TRAS_MIN = 35000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 48750; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 13750; // tRCD ps Active to Read/Write command time - parameter TRP = 13750; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 250; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 165; // tWLS ps Setup time for tDQS flop - parameter TWLH = 165; // tWLH ps Hold time of tDQS flop - parameter TWLO = 7500; // tWLO ps Write levelization output delay - parameter TAA_MIN = 13750; // TAA ps Internal READ command to first data - parameter CL_TIME = 13750; // CL ps Minimum CAS Latency - `elsif sg15E // sg15E is equivalent to the JEDEC DDR3-1333H (9-9-9) speed bin - parameter TCK_MIN = 1500; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 80; // tJIT(per) ps Period JItter - parameter TJIT_CC = 160; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 118; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 140; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 155; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 168; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 177; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 186; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 193; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 200; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 205; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 210; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 215; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 30; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 65; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 125; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 255; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 400; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 620; // tIPW ps Control and Address input Pulse Width - parameter TIS = 190; // tIS ps Input Setup Time - parameter TIH = 140; // tIH ps Input Hold Time - parameter TRAS_MIN = 36000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 49500; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 13500; // tRCD ps Active to Read/Write command time - parameter TRP = 13500; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5625; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 250; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 195; // tWLS ps Setup time for tDQS flop - parameter TWLH = 195; // tWLH ps Hold time of tDQS flop - parameter TWLO = 9000; // tWLO ps Write levelization output delay - parameter TAA_MIN = 13500; // TAA ps Internal READ command to first data - parameter CL_TIME = 13500; // CL ps Minimum CAS Latency - `elsif sg15 // sg15 is equivalent to the JEDEC DDR3-1333J (10-10-10) speed bin - parameter TCK_MIN = 1500; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 80; // tJIT(per) ps Period JItter - parameter TJIT_CC = 160; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 118; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 140; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 155; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 168; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 177; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 186; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 193; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 200; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 205; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 210; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 215; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 30; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 65; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 125; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 255; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 400; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 620; // tIPW ps Control and Address input Pulse Width - parameter TIS = 190; // tIS ps Input Setup Time - parameter TIH = 140; // tIH ps Input Hold Time - parameter TRAS_MIN = 36000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 51000; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 15000; // tRCD ps Active to Read/Write command time - parameter TRP = 15000; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5625; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 250; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 195; // tWLS ps Setup time for tDQS flop - parameter TWLH = 195; // tWLH ps Hold time of tDQS flop - parameter TWLO = 9000; // tWLO ps Write levelization output delay - parameter TAA_MIN = 15000; // TAA ps Internal READ command to first data - parameter CL_TIME = 15000; // CL ps Minimum CAS Latency - `elsif sg187E // sg187E is equivalent to the JEDEC DDR3-1066F (7-7-7) speed bin - parameter TCK_MIN = 1875; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 90; // tJIT(per) ps Period JItter - parameter TJIT_CC = 180; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 132; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 157; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 175; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 188; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 200; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 209; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 217; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 224; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 231; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 237; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 242; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 75; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 100; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 150; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 300; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.38; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.38; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 490; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 780; // tIPW ps Control and Address input Pulse Width - parameter TIS = 275; // tIS ps Input Setup Time - parameter TIH = 200; // tIH ps Input Hold Time - parameter TRAS_MIN = 37500; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 50625; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 13125; // tRCD ps Active to Read/Write command time - parameter TRP = 13125; // tRP ps Precharge command period - parameter TXP = 7500; // tXP ps Exit power down to a valid command - parameter TCKE = 5625; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 300; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 245; // tWLS ps Setup time for tDQS flop - parameter TWLH = 245; // tWLH ps Hold time of tDQS flop - parameter TWLO = 9000; // tWLO ps Write levelization output delay - parameter TAA_MIN = 13125; // TAA ps Internal READ command to first data - parameter CL_TIME = 13125; // CL ps Minimum CAS Latency - `elsif sg187 // sg187 is equivalent to the JEDEC DDR3-1066G (8-8-8) speed bin - parameter TCK_MIN = 1875; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 90; // tJIT(per) ps Period JItter - parameter TJIT_CC = 180; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 132; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 157; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 175; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 188; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 200; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 209; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 217; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 224; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 231; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 237; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 242; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 75; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 100; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 150; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 300; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.38; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.38; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 490; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 780; // tIPW ps Control and Address input Pulse Width - parameter TIS = 275; // tIS ps Input Setup Time - parameter TIH = 200; // tIH ps Input Hold Time - parameter TRAS_MIN = 37500; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 52500; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 15000; // tRCD ps Active to Read/Write command time - parameter TRP = 15000; // tRP ps Precharge command period - parameter TXP = 7500; // tXP ps Exit power down to a valid command - parameter TCKE = 5625; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 300; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 245; // tWLS ps Setup time for tDQS flop - parameter TWLH = 245; // tWLH ps Hold time of tDQS flop - parameter TWLO = 9000; // tWLO ps Write levelization output delay - parameter TAA_MIN = 15000; // TAA ps Internal READ command to first data - parameter CL_TIME = 15000; // CL ps Minimum CAS Latency - `elsif sg25E // sg25E is equivalent to the JEDEC DDR3-800D (5-5-5) speed bin - parameter TCK_MIN = 2500; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 100; // tJIT(per) ps Period JItter - parameter TJIT_CC = 200; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 147; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 175; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 194; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 209; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 222; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 232; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 241; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 249; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 257; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 263; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 269; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 125; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 150; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 200; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 400; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.38; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.38; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 600; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 900; // tIPW ps Control and Address input Pulse Width - parameter TIS = 350; // tIS ps Input Setup Time - parameter TIH = 275; // tIH ps Input Hold Time - parameter TRAS_MIN = 37500; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 50000; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 12500; // tRCD ps Active to Read/Write command time - parameter TRP = 12500; // tRP ps Precharge command period - parameter TXP = 7500; // tXP ps Exit power down to a valid command - parameter TCKE = 7500; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 400; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 325; // tWLS ps Setup time for tDQS flop - parameter TWLH = 325; // tWLH ps Hold time of tDQS flop - parameter TWLO = 9000; // tWLO ps Write levelization output delay - parameter TAA_MIN = 12500; // TAA ps Internal READ command to first data - parameter CL_TIME = 12500; // CL ps Minimum CAS Latency - `else //`define sg25 // sg25 is equivalent to the JEDEC DDR3-800E (6-6-6) speed bin - parameter TCK_MIN = 2500; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 100; // tJIT(per) ps Period JItter - parameter TJIT_CC = 200; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 147; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 175; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 194; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 209; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 222; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 232; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 241; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 249; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 257; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 263; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 269; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 125; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 150; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 200; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 400; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.38; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.38; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 600; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 900; // tIPW ps Control and Address input Pulse Width - parameter TIS = 350; // tIS ps Input Setup Time - parameter TIH = 275; // tIH ps Input Hold Time - parameter TRAS_MIN = 37500; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 52500; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 15000; // tRCD ps Active to Read/Write command time - parameter TRP = 15000; // tRP ps Precharge command period - parameter TXP = 7500; // tXP ps Exit power down to a valid command - parameter TCKE = 7500; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 400; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 325; // tWLS ps Setup time for tDQS flop - parameter TWLH = 325; // tWLH ps Hold time of tDQS flop - parameter TWLO = 9000; // tWLO ps Write levelization output delay - parameter TAA_MIN = 15000; // TAA ps Internal READ command to first data - parameter CL_TIME = 15000; // CL ps Minimum CAS Latency - `endif - - parameter TDQSCK_DLLDIS = TDQSCK; // tDQSCK ps for DLLDIS mode, timing not guaranteed - - `ifdef x16 - `ifdef sg093 - parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg093E - parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg093F - parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg107 - parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg107E - parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg107F - parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg125E - parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 40000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg125 - parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 40000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg15E - parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 45000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg15 - parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 45000; // tFAW ps (2KB page size) Four Bank Activate window - `else // sg187E, sg187, sg25, sg25E - parameter TRRD = 10000; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 50000; // tFAW ps (2KB page size) Four Bank Activate window - `endif - `else // x4, x8 - `ifdef sg093 - parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg093E - parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg093F - parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg107 - parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg107E - parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg107F - parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg125E - parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg125 - parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg15E - parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg15 - parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg187E - parameter TRRD = 7500; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 37500; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg187 - parameter TRRD = 7500; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 37500; // tFAW ps (1KB page size) Four Bank Activate window - `else // sg25, sg25E - parameter TRRD = 10000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 40000; // tFAW ps (1KB page size) Four Bank Activate window - `endif - `endif - - // Timing Parameters - - // Mode Register - parameter CL_MIN = 5; // CL tCK Minimum CAS Latency - parameter CL_MAX = 14; // CL tCK Maximum CAS Latency - parameter AL_MIN = 0; // AL tCK Minimum Additive Latency - parameter AL_MAX = 2; // AL tCK Maximum Additive Latency - parameter WR_MIN = 5; // WR tCK Minimum Write Recovery - parameter WR_MAX = 16; // WR tCK Maximum Write Recovery - parameter BL_MIN = 4; // BL tCK Minimum Burst Length - parameter BL_MAX = 8; // BL tCK Minimum Burst Length - parameter CWL_MIN = 5; // CWL tCK Minimum CAS Write Latency - parameter CWL_MAX = 10; // CWL tCK Maximum CAS Write Latency - - // Clock - parameter TCK_MAX = 3300; // tCK ps Maximum Clock Cycle Time - parameter TCH_AVG_MIN = 0.47; // tCH tCK Minimum Clock High-Level Pulse Width - parameter TCL_AVG_MIN = 0.47; // tCL tCK Minimum Clock Low-Level Pulse Width - parameter TCH_AVG_MAX = 0.53; // tCH tCK Maximum Clock High-Level Pulse Width - parameter TCL_AVG_MAX = 0.53; // tCL tCK Maximum Clock Low-Level Pulse Width - parameter TCH_ABS_MIN = 0.43; // tCH tCK Minimum Clock High-Level Pulse Width - parameter TCL_ABS_MIN = 0.43; // tCL tCK Maximum Clock Low-Level Pulse Width - parameter TCKE_TCK = 3; // tCKE tCK CKE minimum high or low pulse width - parameter TAA_MAX = 20000; // TAA ps Internal READ command to first data - - // Data OUT - parameter TQH = 0.38; // tQH ps DQ output hold time from DQS, DQS# - // Data Strobe OUT - parameter TRPRE = 0.90; // tRPRE tCK DQS Read Preamble - parameter TRPST = 0.30; // tRPST tCK DQS Read Postamble - // Data Strobe IN - parameter TDQSH = 0.45; // tDQSH tCK DQS input High Pulse Width - parameter TDQSL = 0.45; // tDQSL tCK DQS input Low Pulse Width - parameter TWPRE = 0.90; // tWPRE tCK DQS Write Preamble - parameter TWPST = 0.30; // tWPST tCK DQS Write Postamble - // Command and Address - integer TZQCS; // tZQCS tCK ZQ Cal (Short) time - integer TZQINIT = max(512, ceil(640000/TCK_MIN)); // tZQinit tCK ZQ Cal (Long) time - integer TZQOPER = max(256, ceil(320000/TCK_MIN)); // tZQoper tCK ZQ Cal (Long) time - parameter TCCD = 4; // tCCD tCK Cas to Cas command delay - parameter TCCD_DG = 2; // tCCD_DG tCK Cas to Cas command delay to different group - parameter TRAS_MAX = 60e9; // tRAS ps Maximum Active to Precharge command time - parameter TWR = 15000; // tWR ps Write recovery time - parameter TMRD = 4; // tMRD tCK Load Mode Register command cycle time - parameter TMOD = 15000; // tMOD ps LOAD MODE to non-LOAD MODE command cycle time - parameter TMOD_TCK = 12; // tMOD tCK LOAD MODE to non-LOAD MODE command cycle time - parameter TRRD_TCK = 4; // tRRD tCK Active bank a to Active bank b command time - parameter TRRD_DG = 3000; // tRRD_DG ps Active bank a to Active bank b command time to different group - parameter TRRD_DG_TCK = 2; // tRRD_DG tCK Active bank a to Active bank b command time to different group - parameter TRTP = 7500; // tRTP ps Read to Precharge command delay - parameter TRTP_TCK = 4; // tRTP tCK Read to Precharge command delay - parameter TWTR = 7500; // tWTR ps Write to Read command delay - parameter TWTR_DG = 3750; // tWTR_DG ps Write to Read command delay to different group - parameter TWTR_TCK = 4; // tWTR tCK Write to Read command delay - parameter TWTR_DG_TCK = 2; // tWTR_DG tCK Write to Read command delay to different group - parameter TDLLK = 512; // tDLLK tCK DLL locking time - // Refresh - 2Gb - parameter TRFC_MIN = 160000; // tRFC ps Refresh to Refresh Command interval minimum value - parameter TRFC_MAX =70200000; // tRFC ps Refresh to Refresh Command Interval maximum value - // Power Down - parameter TXP_TCK = 3; // tXP tCK Exit power down to a valid command - parameter TXPDLL = 24000; // tXPDLL ps Exit precharge power down to READ or WRITE command (DLL-off mode) - parameter TXPDLL_TCK = 10; // tXPDLL tCK Exit precharge power down to READ or WRITE command (DLL-off mode) - parameter TACTPDEN = 1; // tACTPDEN tCK Timing of last ACT command to power down entry - parameter TPRPDEN = 1; // tPREPDEN tCK Timing of last PRE command to power down entry - parameter TREFPDEN = 1; // tARPDEN tCK Timing of last REFRESH command to power down entry - parameter TCPDED = 1; // tCPDED tCK Command pass disable/enable delay - parameter TPD_MAX =TRFC_MAX; // tPD ps Power-down entry-to-exit timing - parameter TXPR = 170000; // tXPR ps Exit Reset from CKE assertion to a valid command - parameter TXPR_TCK = 5; // tXPR tCK Exit Reset from CKE assertion to a valid command - // Self Refresh - parameter TXS = 170000; // tXS ps Exit self refesh to a non-read or write command - parameter TXS_TCK = 5; // tXS tCK Exit self refesh to a non-read or write command - parameter TXSDLL = TDLLK; // tXSRD tCK Exit self refresh to a read or write command - parameter TISXR = TIS; // tISXR ps CKE setup time during self refresh exit. - parameter TCKSRE = 10000; // tCKSRE ps Valid Clock requirement after self refresh entry (SRE) - parameter TCKSRE_TCK = 5; // tCKSRE tCK Valid Clock requirement after self refresh entry (SRE) - parameter TCKSRX = 10000; // tCKSRX ps Valid Clock requirement prior to self refresh exit (SRX) - parameter TCKSRX_TCK = 5; // tCKSRX tCK Valid Clock requirement prior to self refresh exit (SRX) - parameter TCKESR_TCK = 4; // tCKESR tCK Minimum CKE low width for Self Refresh entry to exit timing - // ODT - parameter TAOF = 0.7; // tAOF tCK RTT turn-off from ODTLoff reference - parameter TAONPD = 8500; // tAONPD ps Asynchronous RTT turn-on delay (Power-Down with DLL frozen) - parameter TAOFPD = 8500; // tAONPD ps Asynchronous RTT turn-off delay (Power-Down with DLL frozen) - parameter ODTH4 = 4; // ODTH4 tCK ODT minimum HIGH time after ODT assertion or write (BL4) - parameter ODTH8 = 6; // ODTH8 tCK ODT minimum HIGH time after write (BL8) - parameter TADC = 0.7; // tADC tCK RTT dynamic change skew - // Write Levelization - parameter TWLMRD = 40; // tWLMRD tCK First DQS pulse rising edge after tDQSS margining mode is programmed - parameter TWLDQSEN = 25; // tWLDQSEN tCK DQS/DQS delay after tDQSS margining mode is programmed - parameter TWLOE = 2000; // tWLOE ps Write levelization output error - - // Size Parameters based on Part Width - - `ifdef x4 - parameter DM_BITS = 1; // Set this parameter to control how many Data Mask bits are used - parameter ADDR_BITS = 15; // MAX Address Bits - parameter ROW_BITS = 15; // Set this parameter to control how many Address bits are used - parameter COL_BITS = 11; // Set this parameter to control how many Column bits are used - parameter DQ_BITS = 4; // Set this parameter to control how many Data bits are used **Same as part bit width** - parameter DQS_BITS = 1; // Set this parameter to control how many Dqs bits are used - `elsif x8 - parameter DM_BITS = 1; // Set this parameter to control how many Data Mask bits are used - parameter ADDR_BITS = 15; // MAX Address Bits - parameter ROW_BITS = 15; // Set this parameter to control how many Address bits are used - parameter COL_BITS = 10; // Set this parameter to control how many Column bits are used - parameter DQ_BITS = 8; // Set this parameter to control how many Data bits are used **Same as part bit width** - parameter DQS_BITS = 1; // Set this parameter to control how many Dqs bits are used - `else //`define x16 - parameter DM_BITS = 2; // Set this parameter to control how many Data Mask bits are used - parameter ADDR_BITS = 14; // MAX Address Bits - parameter ROW_BITS = 14; // Set this parameter to control how many Address bits are used - parameter COL_BITS = 10; // Set this parameter to control how many Column bits are used - parameter DQ_BITS = 16; // Set this parameter to control how many Data bits are used **Same as part bit width** - parameter DQS_BITS = 2; // Set this parameter to control how many Dqs bits are used - `endif - - // Size Parameters - parameter BA_BITS = 3; // Set this parmaeter to control how many Bank Address bits are used - parameter MEM_BITS = 15; // Set this parameter to control how many write data bursts can be stored in memory. The default is 2^10=1024. - parameter AP = 10; // the address bit that controls auto-precharge and precharge-all - parameter BC = 12; // the address bit that controls burst chop - parameter BL_BITS = 3; // the number of bits required to count to BL_MAX - parameter BO_BITS = 2; // the number of Burst Order Bits - - `ifdef QUAD_RANK - `define DUAL_RANK // also define DUAL_RANK - parameter CS_BITS = 4; // Number of Chip Select Bits - parameter RANKS = 4; // Number of Chip Selects - `elsif DUAL_RANK - parameter CS_BITS = 2; // Number of Chip Select Bits - parameter RANKS = 2; // Number of Chip Selects - `else - parameter CS_BITS = 1; // Number of Chip Select Bits - parameter RANKS = 1; // Number of Chip Selects - `endif - - // Simulation parameters - parameter RZQ = 240; // termination resistance - parameter PRE_DEF_PAT = 8'hAA; // value returned during mpr pre-defined pattern readout - parameter STOP_ON_ERROR = 1; // If set to 1, the model will halt on command sequence/major errors - parameter DEBUG = 1; // Turn on Debug messages - parameter BUS_DELAY = 0; // delay in nanoseconds - parameter RANDOM_OUT_DELAY = 0; // If set to 1, the model will put a random amount of delay on DQ/DQS during reads - parameter RANDOM_SEED = 31913; //seed value for random generator. - - parameter RDQSEN_PRE = 2; // DQS driving time prior to first read strobe - parameter RDQSEN_PST = 1; // DQS driving time after last read strobe - parameter RDQS_PRE = 2; // DQS low time prior to first read strobe - parameter RDQS_PST = 1; // DQS low time after last read strobe - parameter RDQEN_PRE = 0; // DQ/DM driving time prior to first read data - parameter RDQEN_PST = 0; // DQ/DM driving time after last read data - parameter WDQS_PRE = 2; // DQS half clock periods prior to first write strobe - parameter WDQS_PST = 1; // DQS half clock periods after last write strobe - - // check for legal cas latency based on the cas write latency - function valid_cl; - input [3:0] cl; - input [3:0] cwl; - - case ({cwl, cl}) - `ifdef sg093 - {4'd5 , 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}, - {4'd8, 4'd11}, - {4'd9, 4'd13}, - {4'd10, 4'd14}: valid_cl = 1; - `elsif sg093E - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}, - {4'd8, 4'd10}, - {4'd8, 4'd11}, - {4'd9, 4'd12}, - {4'd9, 4'd13}, - {4'd10, 4'd13}, - {4'd10, 4'd14}: valid_cl = 1; - `elsif sg093F - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}, - {4'd8, 4'd9 }, - {4'd8, 4'd10}, - {4'd8, 4'd11}, - {4'd9, 4'd11}, - {4'd9, 4'd12}, - {4'd9, 4'd13}, - {4'd10, 4'd12}, - {4'd10, 4'd13}, - {4'd10, 4'd14}: valid_cl = 1; - `elsif sg107 - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}, - {4'd8, 4'd11}, - {4'd9, 4'd13}: valid_cl = 1; - `elsif sg107E - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}, - {4'd8, 4'd11}, - {4'd9, 4'd12}, - {4'd9, 4'd13}: valid_cl = 1; - `elsif sg107F - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}, - {4'd8, 4'd10}, - {4'd8, 4'd11}, - {4'd9, 4'd11}, - {4'd9, 4'd12}, - {4'd9, 4'd13}: valid_cl = 1; - `elsif sg125E - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}, - {4'd8, 4'd10}, - {4'd8, 4'd11}: valid_cl = 1; - `elsif sg125 - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}, - {4'd8, 4'd11}: valid_cl = 1; - `elsif sg15E - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}: valid_cl = 1; - `elsif sg15 - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd8 }, - {4'd7, 4'd10}: valid_cl = 1; - `elsif sg187E - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }: valid_cl = 1; - `elsif sg187 - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd8 }: valid_cl = 1; - `elsif sg25E - {4'd5, 4'd5 }, - {4'd5, 4'd6 }: valid_cl = 1; - `elsif sg25 - {4'd5, 4'd5 }, - {4'd5, 4'd6 }: valid_cl = 1; - `endif - default : valid_cl = 0; - endcase - endfunction - - // find the minimum valid cas write latency - function [3:0] min_cwl; - input period; - real period; - min_cwl = (period >= 2500.0) ? 5: - (period >= 1875.0) ? 6: - (period >= 1500.0) ? 7: - (period >= 1250.0) ? 8: - (period >= 1071.0) ? 9: - 10; // (period >= 938) - endfunction - - // find the minimum valid cas latency - function [3:0] min_cl; - input period; - real period; - reg [3:0] cwl; - reg [3:0] cl; - begin - cwl = min_cwl(period); - for (cl=CL_MAX; cl>=CL_MIN; cl=cl-1) begin - if (valid_cl(cl, cwl)) begin - min_cl = cl; - end - end - end - endfunction - - -`else //`define x1Gb // 1Gb parts - - // SYMBOL UNITS DESCRIPTION - // ------ ----- ----------- - `ifdef sg093 // sg093 is equivalent to the JEDEC DDR3-2133 (14-14-14) speed bin - parameter TCK_MIN = 938; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 50; // tJIT(per) ps Period JItter - parameter TJIT_CC = 100; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 74; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 87; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 97; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 105; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 111; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 116; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 121; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 125; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 128; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 132; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 134; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 5; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 70; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 180; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 280; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 470; // tIPW ps Control and Address input Pulse Width - parameter TIS = 35; // tIS ps Input Setup Time - parameter TIH = 75; // tIH ps Input Hold Time - parameter TRAS_MIN = 33000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 46130; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 13090; // tRCD ps Active to Read/Write command time - parameter TRP = 13090; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 180; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 122; // tWLS ps Setup time for tDQS flop - parameter TWLH = 122; // tWLH ps Hold time of tDQS flop - parameter TWLO = 7500; // tWLO ps Write levelization output delay - parameter TAA_MIN = 13090; // TAA ps Internal READ command to first data - parameter CL_TIME = 13090; // CL ps Minimum CAS Latency - `elsif sg093E // sg093E is equivalent to the JEDEC DDR3-2133 (13-13-13) speed bin - parameter TCK_MIN = 935; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 50; // tJIT(per) ps Period JItter - parameter TJIT_CC = 100; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 74; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 87; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 97; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 105; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 111; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 116; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 121; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 125; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 128; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 132; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 134; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 5; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 70; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 175; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 280; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 470; // tIPW ps Control and Address input Pulse Width - parameter TIS = 35; // tIS ps Input Setup Time - parameter TIH = 75; // tIH ps Input Hold Time - parameter TRAS_MIN = 33000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 47155; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 12155; // tRCD ps Active to Read/Write command time - parameter TRP = 12155; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 180; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 122; // tWLS ps Setup time for tDQS flop - parameter TWLH = 122; // tWLH ps Hold time of tDQS flop - parameter TWLO = 7500; // tWLO ps Write levelization output delay - parameter TAA_MIN = 12155; // TAA ps Internal READ command to first data - parameter CL_TIME = 12155; // CL ps Minimum CAS Latency - `elsif sg093F // sg093F is equivalent to the JEDEC DDR3-2133 (12-12-12) speed bin - parameter TCK_MIN = 935; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 50; // tJIT(per) ps Period JItter - parameter TJIT_CC = 100; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 74; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 87; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 97; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 105; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 111; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 116; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 121; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 125; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 128; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 132; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 134; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 5; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 70; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 175; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 280; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 470; // tIPW ps Control and Address input Pulse Width - parameter TIS = 35; // tIS ps Input Setup Time - parameter TIH = 75; // tIH ps Input Hold Time - parameter TRAS_MIN = 33000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 46220; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 11220; // tRCD ps Active to Read/Write command time - parameter TRP = 11220; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 180; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 122; // tWLS ps Setup time for tDQS flop - parameter TWLH = 122; // tWLH ps Hold time of tDQS flop - parameter TWLO = 7500; // tWLO ps Write levelization output delay - parameter TAA_MIN = 11220; // TAA ps Internal READ command to first data - parameter CL_TIME = 11220; // CL ps Minimum CAS Latency - `elsif sg107 // sg107 is equivalent to the JEDEC DDR3-1866 (13-13-13) speed bin - parameter TCK_MIN = 1071; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 60; // tJIT(per) ps Period JItter - parameter TJIT_CC = 120; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 88; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 105; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 117; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 126; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 133; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 139; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 145; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 150; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 154; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 158; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 161; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 80; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 200; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 320; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 535; // tIPW ps Control and Address input Pulse Width - parameter TIS = 50; // tIS ps Input Setup Time - parameter TIH = 100; // tIH ps Input Hold Time - parameter TRAS_MIN = 34000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 48910; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 13910; // tRCD ps Active to Read/Write command time - parameter TRP = 13910; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 200; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 140; // tWLS ps Setup time for tDQS flop - parameter TWLH = 140; // tWLH ps Hold time of tDQS flop - parameter TWLO = 7500; // tWLO ps Write levelization output delay - parameter TAA_MIN = 13910; // TAA ps Internal READ command to first data - parameter CL_TIME = 13910; // CL ps Minimum CAS Latency - `elsif sg107E // sg107E is equivalent to the JEDEC DDR3-1866 (12-12-12) speed bin - parameter TCK_MIN = 1070; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 60; // tJIT(per) ps Period JItter - parameter TJIT_CC = 120; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 88; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 105; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 117; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 126; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 133; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 139; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 145; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 150; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 154; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 158; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 161; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 80; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 200; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 320; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 535; // tIPW ps Control and Address input Pulse Width - parameter TIS = 50; // tIS ps Input Setup Time - parameter TIH = 100; // tIH ps Input Hold Time - parameter TRAS_MIN = 34000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 47840; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 12840; // tRCD ps Active to Read/Write command time - parameter TRP = 12840; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 200; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 140; // tWLS ps Setup time for tDQS flop - parameter TWLH = 140; // tWLH ps Hold time of tDQS flop - parameter TWLO = 7500; // tWLO ps Write levelization output delay - parameter TAA_MIN = 12840; // TAA ps Internal READ command to first data - parameter CL_TIME = 12840; // CL ps Minimum CAS Latency - `elsif sg107F // sg107F is equivalent to the JEDEC DDR3-1866 (11-11-11) speed bin - parameter TCK_MIN = 1070; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 60; // tJIT(per) ps Period JItter - parameter TJIT_CC = 120; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 88; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 105; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 117; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 126; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 133; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 139; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 145; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 150; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 154; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 158; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 161; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 20; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 80; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 200; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 320; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 535; // tIPW ps Control and Address input Pulse Width - parameter TIS = 50; // tIS ps Input Setup Time - parameter TIH = 100; // tIH ps Input Hold Time - parameter TRAS_MIN = 34000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 46770; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 11770; // tRCD ps Active to Read/Write command time - parameter TRP = 11770; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 200; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 140; // tWLS ps Setup time for tDQS flop - parameter TWLH = 140; // tWLH ps Hold time of tDQS flop - parameter TWLO = 7500; // tWLO ps Write levelization output delay - parameter TAA_MIN = 11770; // TAA ps Internal READ command to first data - parameter CL_TIME = 11770; // CL ps Minimum CAS Latency - `elsif sg125E // sg125E is equivalent to the JEDEC DDR3-1600 (10-10-10) speed bin - parameter TCK_MIN = 1250; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 70; // tJIT(per) ps Period JItter - parameter TJIT_CC = 140; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 103; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 122; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 136; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 147; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 155; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 163; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 169; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 175; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 180; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 184; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 188; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 45; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 100; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 225; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 360; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 560; // tIPW ps Control and Address input Pulse Width - parameter TIS = 170; // tIS ps Input Setup Time - parameter TIH = 120; // tIH ps Input Hold Time - parameter TRAS_MIN = 35000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 47500; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 12500; // tRCD ps Active to Read/Write command time - parameter TRP = 12500; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 250; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 165; // tWLS ps Setup time for tDQS flop - parameter TWLH = 165; // tWLH ps Hold time of tDQS flop - parameter TWLO = 7500; // tWLO ps Write levelization output delay - parameter TAA_MIN = 12500; // TAA ps Internal READ command to first data - parameter CL_TIME = 12500; // CL ps Minimum CAS Latency - `elsif sg125 // sg125 is equivalent to the JEDEC DDR3-1600 (11-11-11) speed bin - parameter TCK_MIN = 1250; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 70; // tJIT(per) ps Period JItter - parameter TJIT_CC = 140; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 103; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 122; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 136; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 147; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 155; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 163; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 169; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 175; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 180; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 184; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 188; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 10; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 45; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 100; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.27; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.18; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.18; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 225; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 360; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 560; // tIPW ps Control and Address input Pulse Width - parameter TIS = 170; // tIS ps Input Setup Time - parameter TIH = 120; // tIH ps Input Hold Time - parameter TRAS_MIN = 35000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 48750; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 13750; // tRCD ps Active to Read/Write command time - parameter TRP = 13750; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5000; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 250; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 165; // tWLS ps Setup time for tDQS flop - parameter TWLH = 165; // tWLH ps Hold time of tDQS flop - parameter TWLO = 7500; // tWLO ps Write levelization output delay - parameter TAA_MIN = 13750; // TAA ps Internal READ command to first data - parameter CL_TIME = 13750; // CL ps Minimum CAS Latency - `elsif sg15E // sg15E is equivalent to the JEDEC DDR3-1333H (9-9-9) speed bin - parameter TCK_MIN = 1500; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 80; // tJIT(per) ps Period JItter - parameter TJIT_CC = 160; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 118; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 140; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 155; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 168; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 177; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 186; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 193; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 200; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 205; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 210; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 215; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 30; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 65; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 125; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 255; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 400; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 620; // tIPW ps Control and Address input Pulse Width - parameter TIS = 190; // tIS ps Input Setup Time - parameter TIH = 140; // tIH ps Input Hold Time - parameter TRAS_MIN = 36000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 49500; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 13500; // tRCD ps Active to Read/Write command time - parameter TRP = 13500; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5625; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 250; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 195; // tWLS ps Setup time for tDQS flop - parameter TWLH = 195; // tWLH ps Hold time of tDQS flop - parameter TWLO = 9000; // tWLO ps Write levelization output delay - parameter TAA_MIN = 13500; // TAA ps Internal READ command to first data - parameter CL_TIME = 13500; // CL ps Minimum CAS Latency - `elsif sg15 // sg15 is equivalent to the JEDEC DDR3-1333J (10-10-10) speed bin - parameter TCK_MIN = 1500; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 80; // tJIT(per) ps Period JItter - parameter TJIT_CC = 160; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 118; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 140; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 155; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 168; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 177; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 186; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 193; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 200; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 205; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 210; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 215; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 30; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 65; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 125; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 255; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.40; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.40; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 400; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 620; // tIPW ps Control and Address input Pulse Width - parameter TIS = 190; // tIS ps Input Setup Time - parameter TIH = 140; // tIH ps Input Hold Time - parameter TRAS_MIN = 36000; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 51000; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 15000; // tRCD ps Active to Read/Write command time - parameter TRP = 15000; // tRP ps Precharge command period - parameter TXP = 6000; // tXP ps Exit power down to a valid command - parameter TCKE = 5625; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 250; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 195; // tWLS ps Setup time for tDQS flop - parameter TWLH = 195; // tWLH ps Hold time of tDQS flop - parameter TWLO = 9000; // tWLO ps Write levelization output delay - parameter TAA_MIN = 15000; // TAA ps Internal READ command to first data - parameter CL_TIME = 15000; // CL ps Minimum CAS Latency - `elsif sg187E // sg187E is equivalent to the JEDEC DDR3-1066F (7-7-7) speed bin - parameter TCK_MIN = 1875; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 90; // tJIT(per) ps Period JItter - parameter TJIT_CC = 180; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 132; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 157; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 175; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 188; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 200; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 209; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 217; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 224; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 231; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 237; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 242; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 75; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 100; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 150; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 300; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.38; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.38; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 490; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 780; // tIPW ps Control and Address input Pulse Width - parameter TIS = 275; // tIS ps Input Setup Time - parameter TIH = 200; // tIH ps Input Hold Time - parameter TRAS_MIN = 37500; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 50625; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 13125; // tRCD ps Active to Read/Write command time - parameter TRP = 13125; // tRP ps Precharge command period - parameter TXP = 7500; // tXP ps Exit power down to a valid command - parameter TCKE = 5625; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 300; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 245; // tWLS ps Setup time for tDQS flop - parameter TWLH = 245; // tWLH ps Hold time of tDQS flop - parameter TWLO = 9000; // tWLO ps Write levelization output delay - parameter TAA_MIN = 13125; // TAA ps Internal READ command to first data - parameter CL_TIME = 13125; // CL ps Minimum CAS Latency - `elsif sg187 // sg187 is equivalent to the JEDEC DDR3-1066G (8-8-8) speed bin - parameter TCK_MIN = 1875; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 90; // tJIT(per) ps Period JItter - parameter TJIT_CC = 180; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 132; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 157; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 175; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 188; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 200; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 209; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 217; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 224; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 231; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 237; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 242; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 75; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 100; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 150; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 300; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.38; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.38; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 490; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 780; // tIPW ps Control and Address input Pulse Width - parameter TIS = 275; // tIS ps Input Setup Time - parameter TIH = 200; // tIH ps Input Hold Time - parameter TRAS_MIN = 37500; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 52500; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 15000; // tRCD ps Active to Read/Write command time - parameter TRP = 15000; // tRP ps Precharge command period - parameter TXP = 7500; // tXP ps Exit power down to a valid command - parameter TCKE = 5625; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 300; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 245; // tWLS ps Setup time for tDQS flop - parameter TWLH = 245; // tWLH ps Hold time of tDQS flop - parameter TWLO = 9000; // tWLO ps Write levelization output delay - parameter TAA_MIN = 15000; // TAA ps Internal READ command to first data - parameter CL_TIME = 15000; // CL ps Minimum CAS Latency - `elsif sg25E // sg25E is equivalent to the JEDEC DDR3-800E (5-5-5) speed bin - parameter TCK_MIN = 2500; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 100; // tJIT(per) ps Period JItter - parameter TJIT_CC = 200; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 147; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 175; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 194; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 209; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 222; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 232; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 241; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 249; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 257; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 263; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 269; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 125; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 150; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 200; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 400; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.38; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.38; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 600; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 900; // tIPW ps Control and Address input Pulse Width - parameter TIS = 350; // tIS ps Input Setup Time - parameter TIH = 275; // tIH ps Input Hold Time - parameter TRAS_MIN = 37500; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 50000; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 12500; // tRCD ps Active to Read/Write command time - parameter TRP = 12500; // tRP ps Precharge command period - parameter TXP = 7500; // tXP ps Exit power down to a valid command - parameter TCKE = 7500; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 400; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 325; // tWLS ps Setup time for tDQS flop - parameter TWLH = 325; // tWLH ps Hold time of tDQS flop - parameter TWLO = 9000; // tWLO ps Write levelization output delay - parameter TAA_MIN = 12500; // TAA ps Internal READ command to first data - parameter CL_TIME = 12500; // CL ps Minimum CAS Latency - `else //`define sg25 // sg25 is equivalent to the JEDEC DDR3-800 (6-6-6) speed bin - parameter TCK_MIN = 2500; // tCK ps Minimum Clock Cycle Time - parameter TJIT_PER = 100; // tJIT(per) ps Period JItter - parameter TJIT_CC = 200; // tJIT(cc) ps Cycle to Cycle jitter - parameter TERR_2PER = 147; // tERR(2per) ps Accumulated Error (2-cycle) - parameter TERR_3PER = 175; // tERR(3per) ps Accumulated Error (3-cycle) - parameter TERR_4PER = 194; // tERR(4per) ps Accumulated Error (4-cycle) - parameter TERR_5PER = 209; // tERR(5per) ps Accumulated Error (5-cycle) - parameter TERR_6PER = 222; // tERR(6per) ps Accumulated Error (6-cycle) - parameter TERR_7PER = 232; // tERR(7per) ps Accumulated Error (7-cycle) - parameter TERR_8PER = 241; // tERR(8per) ps Accumulated Error (8-cycle) - parameter TERR_9PER = 249; // tERR(9per) ps Accumulated Error (9-cycle) - parameter TERR_10PER = 257; // tERR(10per)ps Accumulated Error (10-cycle) - parameter TERR_11PER = 263; // tERR(11per)ps Accumulated Error (11-cycle) - parameter TERR_12PER = 269; // tERR(12per)ps Accumulated Error (12-cycle) - parameter TDS = 125; // tDS ps DQ and DM input setup time relative to DQS - parameter TDH = 150; // tDH ps DQ and DM input hold time relative to DQS - parameter TDQSQ = 200; // tDQSQ ps DQS-DQ skew, DQS to last DQ valid, per group, per access - parameter TDQSS = 0.25; // tDQSS tCK Rising clock edge to DQS/DQS# latching transition - parameter TDSS = 0.20; // tDSS tCK DQS falling edge to CLK rising (setup time) - parameter TDSH = 0.20; // tDSH tCK DQS falling edge from CLK rising (hold time) - parameter TDQSCK = 400; // tDQSCK ps DQS output access time from CK/CK# - parameter TQSH = 0.38; // tQSH tCK DQS Output High Pulse Width - parameter TQSL = 0.38; // tQSL tCK DQS Output Low Pulse Width - parameter TDIPW = 600; // tDIPW ps DQ and DM input Pulse Width - parameter TIPW = 900; // tIPW ps Control and Address input Pulse Width - parameter TIS = 350; // tIS ps Input Setup Time - parameter TIH = 275; // tIH ps Input Hold Time - parameter TRAS_MIN = 37500; // tRAS ps Minimum Active to Precharge command time - parameter TRC = 52500; // tRC ps Active to Active/Auto Refresh command time - parameter TRCD = 15000; // tRCD ps Active to Read/Write command time - parameter TRP = 15000; // tRP ps Precharge command period - parameter TXP = 7500; // tXP ps Exit power down to a valid command - parameter TCKE = 7500; // tCKE ps CKE minimum high or low pulse width - parameter TAON = 400; // tAON ps RTT turn-on from ODTLon reference - parameter TWLS = 325; // tWLS ps Setup time for tDQS flop - parameter TWLH = 325; // tWLH ps Hold time of tDQS flop - parameter TWLO = 9000; // tWLO ps Write levelization output delay - parameter TAA_MIN = 15000; // TAA ps Internal READ command to first data - parameter CL_TIME = 15000; // CL ps Minimum CAS Latency - `endif - - parameter TDQSCK_DLLDIS = TDQSCK; // tDQSCK ps for DLLDIS mode, timing not guaranteed - - `ifdef x16 - `ifdef sg093 - parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg093E - parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg093F - parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg107 - parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg107E - parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg107F - parameter TRRD = 6000; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 35000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg125E - parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 40000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg125 - parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 40000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg15E - parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 45000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg15 - parameter TRRD = 7500; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 45000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg187E - parameter TRRD = 10000; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 50000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg187 - parameter TRRD = 10000; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 50000; // tFAW ps (2KB page size) Four Bank Activate window - `elsif sg25E - parameter TRRD = 10000; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 50000; // tFAW ps (2KB page size) Four Bank Activate window - `else // sg25 - parameter TRRD = 10000; // tRRD ps (2KB page size) Active bank a to Active bank b command time - parameter TFAW = 50000; // tFAW ps (2KB page size) Four Bank Activate window - `endif - `else // x4, x8 - `ifdef sg093 - parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg093E - parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg093F - parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg107 - parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg107E - parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg107F - parameter TRRD = 5000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 25000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg125E - parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg125 - parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg15E - parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg15 - parameter TRRD = 6000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 30000; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg187E - parameter TRRD = 7500; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 37500; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg187 - parameter TRRD = 7500; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 37500; // tFAW ps (1KB page size) Four Bank Activate window - `elsif sg25E - parameter TRRD = 10000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 40000; // tFAW ps (1KB page size) Four Bank Activate window - `else // sg25 - parameter TRRD = 10000; // tRRD ps (1KB page size) Active bank a to Active bank b command time - parameter TFAW = 40000; // tFAW ps (1KB page size) Four Bank Activate window - `endif - `endif - - // Timing Parameters - - // Mode Register - parameter CL_MIN = 5; // CL tCK Minimum CAS Latency - parameter CL_MAX = 14; // CL tCK Maximum CAS Latency - parameter AL_MIN = 0; // AL tCK Minimum Additive Latency - parameter AL_MAX = 2; // AL tCK Maximum Additive Latency - parameter WR_MIN = 5; // WR tCK Minimum Write Recovery - parameter WR_MAX = 16; // WR tCK Maximum Write Recovery - parameter BL_MIN = 4; // BL tCK Minimum Burst Length - parameter BL_MAX = 8; // BL tCK Minimum Burst Length - parameter CWL_MIN = 5; // CWL tCK Minimum CAS Write Latency - parameter CWL_MAX = 10; // CWL tCK Maximum CAS Write Latency - - // Clock - parameter TCK_MAX = 3300; // tCK ps Maximum Clock Cycle Time - parameter TCH_AVG_MIN = 0.47; // tCH tCK Minimum Clock High-Level Pulse Width - parameter TCL_AVG_MIN = 0.47; // tCL tCK Minimum Clock Low-Level Pulse Width - parameter TCH_AVG_MAX = 0.53; // tCH tCK Maximum Clock High-Level Pulse Width - parameter TCL_AVG_MAX = 0.53; // tCL tCK Maximum Clock Low-Level Pulse Width - parameter TCH_ABS_MIN = 0.43; // tCH tCK Minimum Clock High-Level Pulse Width - parameter TCL_ABS_MIN = 0.43; // tCL tCK Maximum Clock Low-Level Pulse Width - parameter TCKE_TCK = 3; // tCKE tCK CKE minimum high or low pulse width - parameter TAA_MAX = 20000; // TAA ps Internal READ command to first data - - // Data OUT - parameter TQH = 0.38; // tQH ps DQ output hold time from DQS, DQS# - // Data Strobe OUT - parameter TRPRE = 0.90; // tRPRE tCK DQS Read Preamble - parameter TRPST = 0.30; // tRPST tCK DQS Read Postamble - // Data Strobe IN - parameter TDQSH = 0.45; // tDQSH tCK DQS input High Pulse Width - parameter TDQSL = 0.45; // tDQSL tCK DQS input Low Pulse Width - parameter TWPRE = 0.90; // tWPRE tCK DQS Write Preamble - parameter TWPST = 0.30; // tWPST tCK DQS Write Postamble - // Command and Address - integer TZQCS; // tZQCS tCK ZQ Cal (Short) time - integer TZQINIT = max(512, ceil(640000/TCK_MIN)); // tZQinit tCK ZQ Cal (Long) time - integer TZQOPER = max(256, ceil(320000/TCK_MIN)); // tZQoper tCK ZQ Cal (Long) time - parameter TCCD = 4; // tCCD tCK Cas to Cas command delay - parameter TCCD_DG = 2; // tCCD_DG tCK Cas to Cas command delay to different group - parameter TRAS_MAX = 60e9; // tRAS ps Maximum Active to Precharge command time - parameter TWR = 15000; // tWR ps Write recovery time - parameter TMRD = 4; // tMRD tCK Load Mode Register command cycle time - parameter TMOD = 15000; // tMOD ps LOAD MODE to non-LOAD MODE command cycle time - parameter TMOD_TCK = 12; // tMOD tCK LOAD MODE to non-LOAD MODE command cycle time - parameter TRRD_TCK = 4; // tRRD tCK Active bank a to Active bank b command time - parameter TRRD_DG = 3000; // tRRD_DG ps Active bank a to Active bank b command time to different group - parameter TRRD_DG_TCK = 2; // tRRD_DG tCK Active bank a to Active bank b command time to different group - parameter TRTP = 7500; // tRTP ps Read to Precharge command delay - parameter TRTP_TCK = 4; // tRTP tCK Read to Precharge command delay - parameter TWTR = 7500; // tWTR ps Write to Read command delay - parameter TWTR_DG = 3750; // tWTR_DG ps Write to Read command delay to different group - parameter TWTR_TCK = 4; // tWTR tCK Write to Read command delay - parameter TWTR_DG_TCK = 2; // tWTR_DG tCK Write to Read command delay to different group - parameter TDLLK = 512; // tDLLK tCK DLL locking time - // Refresh - 1Gb - parameter TRFC_MIN = 110000; // tRFC ps Refresh to Refresh Command interval minimum value - parameter TRFC_MAX =70200000; // tRFC ps Refresh to Refresh Command Interval maximum value - // Power Down - parameter TXP_TCK = 3; // tXP tCK Exit power down to a valid command - parameter TXPDLL = 24000; // tXPDLL ps Exit precharge power down to READ or WRITE command (DLL-off mode) - parameter TXPDLL_TCK = 10; // tXPDLL tCK Exit precharge power down to READ or WRITE command (DLL-off mode) - parameter TACTPDEN = 1; // tACTPDEN tCK Timing of last ACT command to power down entry - parameter TPRPDEN = 1; // tPREPDEN tCK Timing of last PRE command to power down entry - parameter TREFPDEN = 1; // tARPDEN tCK Timing of last REFRESH command to power down entry - parameter TCPDED = 1; // tCPDED tCK Command pass disable/enable delay - parameter TPD_MAX =TRFC_MAX; // tPD ps Power-down entry-to-exit timing - parameter TXPR = 120000; // tXPR ps Exit Reset from CKE assertion to a valid command - parameter TXPR_TCK = 5; // tXPR tCK Exit Reset from CKE assertion to a valid command - // Self Refresh - parameter TXS = 120000; // tXS ps Exit self refesh to a non-read or write command - parameter TXS_TCK = 5; // tXS tCK Exit self refesh to a non-read or write command - parameter TXSDLL = TDLLK; // tXSRD tCK Exit self refresh to a read or write command - parameter TISXR = TIS; // tISXR ps CKE setup time during self refresh exit. - parameter TCKSRE = 10000; // tCKSRE ps Valid Clock requirement after self refresh entry (SRE) - parameter TCKSRE_TCK = 5; // tCKSRE tCK Valid Clock requirement after self refresh entry (SRE) - parameter TCKSRX = 10000; // tCKSRX ps Valid Clock requirement prior to self refresh exit (SRX) - parameter TCKSRX_TCK = 5; // tCKSRX tCK Valid Clock requirement prior to self refresh exit (SRX) - parameter TCKESR_TCK = 4; // tCKESR tCK Minimum CKE low width for Self Refresh entry to exit timing - // ODT - parameter TAOF = 0.7; // tAOF tCK RTT turn-off from ODTLoff reference - parameter TAONPD = 8500; // tAONPD ps Asynchronous RTT turn-on delay (Power-Down with DLL frozen) - parameter TAOFPD = 8500; // tAONPD ps Asynchronous RTT turn-off delay (Power-Down with DLL frozen) - parameter ODTH4 = 4; // ODTH4 tCK ODT minimum HIGH time after ODT assertion or write (BL4) - parameter ODTH8 = 6; // ODTH8 tCK ODT minimum HIGH time after write (BL8) - parameter TADC = 0.7; // tADC tCK RTT dynamic change skew - // Write Levelization - parameter TWLMRD = 40; // tWLMRD tCK First DQS pulse rising edge after tDQSS margining mode is programmed - parameter TWLDQSEN = 25; // tWLDQSEN tCK DQS/DQS delay after tDQSS margining mode is programmed - parameter TWLOE = 2000; // tWLOE ps Write levelization output error - - // Size Parameters based on Part Width - - `ifdef x4 - parameter DM_BITS = 1; // Set this parameter to control how many Data Mask bits are used - parameter ADDR_BITS = 14; // MAX Address Bits - parameter ROW_BITS = 14; // Set this parameter to control how many Address bits are used - parameter COL_BITS = 11; // Set this parameter to control how many Column bits are used - parameter DQ_BITS = 4; // Set this parameter to control how many Data bits are used **Same as part bit width** - parameter DQS_BITS = 1; // Set this parameter to control how many Dqs bits are used - `elsif x8 - parameter DM_BITS = 1; // Set this parameter to control how many Data Mask bits are used - parameter ADDR_BITS = 14; // MAX Address Bits - parameter ROW_BITS = 14; // Set this parameter to control how many Address bits are used - parameter COL_BITS = 10; // Set this parameter to control how many Column bits are used - parameter DQ_BITS = 8; // Set this parameter to control how many Data bits are used **Same as part bit width** - parameter DQS_BITS = 1; // Set this parameter to control how many Dqs bits are used - `else //`define x16 - parameter DM_BITS = 2; // Set this parameter to control how many Data Mask bits are used - parameter ADDR_BITS = 13; // MAX Address Bits - parameter ROW_BITS = 13; // Set this parameter to control how many Address bits are used - parameter COL_BITS = 10; // Set this parameter to control how many Column bits are used - parameter DQ_BITS = 16; // Set this parameter to control how many Data bits are used **Same as part bit width** - parameter DQS_BITS = 2; // Set this parameter to control how many Dqs bits are used - `endif - - // Size Parameters - parameter BA_BITS = 3; // Set this parmaeter to control how many Bank Address bits are used - parameter MEM_BITS = 15; // Set this parameter to control how many write data bursts can be stored in memory. The default is 2^10=1024. - parameter AP = 10; // the address bit that controls auto-precharge and precharge-all - parameter BC = 12; // the address bit that controls burst chop - parameter BL_BITS = 3; // the number of bits required to count to BL_MAX - parameter BO_BITS = 2; // the number of Burst Order Bits - - `ifdef QUAD_RANK - `define DUAL_RANK // also define DUAL_RANK - parameter CS_BITS = 4; // Number of Chip Select Bits - parameter RANKS = 4; // Number of Chip Selects - `elsif DUAL_RANK - parameter CS_BITS = 2; // Number of Chip Select Bits - parameter RANKS = 2; // Number of Chip Selects - `else - parameter CS_BITS = 1; // Number of Chip Select Bits - parameter RANKS = 1; // Number of Chip Selects - `endif - - // Simulation parameters - parameter RZQ = 240; // termination resistance - parameter PRE_DEF_PAT = 8'hAA; // value returned during mpr pre-defined pattern readout - parameter STOP_ON_ERROR = 1; // If set to 1, the model will halt on command sequence/major errors - parameter DEBUG = 1; // Turn on Debug messages - parameter BUS_DELAY = 0; // delay in nanoseconds - parameter RANDOM_OUT_DELAY = 0; // If set to 1, the model will put a random amount of delay on DQ/DQS during reads - parameter RANDOM_SEED = 31913; //seed value for random generator. - - parameter RDQSEN_PRE = 2; // DQS driving time prior to first read strobe - parameter RDQSEN_PST = 1; // DQS driving time after last read strobe - parameter RDQS_PRE = 2; // DQS low time prior to first read strobe - parameter RDQS_PST = 1; // DQS low time after last read strobe - parameter RDQEN_PRE = 0; // DQ/DM driving time prior to first read data - parameter RDQEN_PST = 0; // DQ/DM driving time after last read data - parameter WDQS_PRE = 2; // DQS half clock periods prior to first write strobe - parameter WDQS_PST = 1; // DQS half clock periods after last write strobe - - // check for legal cas latency based on the cas write latency - function valid_cl; - input [3:0] cl; - input [3:0] cwl; - - case ({cwl, cl}) - `ifdef sg093 - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}, - {4'd8, 4'd11}, - {4'd9, 4'd13}, - {4'd10, 4'd14}: valid_cl = 1; - `elsif sg093E - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}, - {4'd8, 4'd10}, - {4'd8, 4'd11}, - {4'd9, 4'd12}, - {4'd9, 4'd13}, - {4'd10, 4'd13}, - {4'd10, 4'd14}: valid_cl = 1; - `elsif sg093F - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}, - {4'd8, 4'd9 }, - {4'd8, 4'd10}, - {4'd8, 4'd11}, - {4'd9, 4'd11}, - {4'd9, 4'd12}, - {4'd9, 4'd13}, - {4'd10, 4'd12}, - {4'd10, 4'd13}, - {4'd10, 4'd14}: valid_cl = 1; - `elsif sg107 - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}, - {4'd8, 4'd11}, - {4'd9, 4'd13}: valid_cl = 1; - `elsif sg107E - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}, - {4'd8, 4'd11}, - {4'd9, 4'd12}, - {4'd9, 4'd13}: valid_cl = 1; - `elsif sg107F - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}, - {4'd8, 4'd10}, - {4'd8, 4'd11}, - {4'd9, 4'd11}, - {4'd9, 4'd12}, - {4'd9, 4'd13}: valid_cl = 1; - `elsif sg125E - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}, - {4'd8, 4'd10}, - {4'd8, 4'd11}: valid_cl = 1; - `elsif sg125 - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}, - {4'd8, 4'd11}: valid_cl = 1; - `elsif sg15E - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }, - {4'd7, 4'd9 }, - {4'd7, 4'd10}: valid_cl = 1; - `elsif sg15 - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd8 }, - {4'd7, 4'd10}: valid_cl = 1; - `elsif sg187E - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd7 }, - {4'd6, 4'd8 }: valid_cl = 1; - `elsif sg187 - {4'd5, 4'd5 }, - {4'd5, 4'd6 }, - {4'd6, 4'd8 }: valid_cl = 1; - `elsif sg25E - {4'd5, 4'd5 }, - {4'd5, 4'd6 }: valid_cl = 1; - `elsif sg25 - {4'd5, 4'd5 }, - {4'd5, 4'd6 }: valid_cl = 1; - `endif - default : valid_cl = 0; - endcase - endfunction - - // find the minimum valid cas write latency - function [3:0] min_cwl; - input period; - real period; - min_cwl = (period >= 2500.0) ? 5: - (period >= 1875.0) ? 6: - (period >= 1500.0) ? 7: - (period >= 1250.0) ? 8: - (period >= 1071.0) ? 9: - 10; // (period >= 938) - endfunction - - // find the minimum valid cas latency - function [3:0] min_cl; - input period; - real period; - reg [3:0] cwl; - reg [3:0] cl; - begin - cwl = min_cwl(period); - for (cl=CL_MAX; cl>=CL_MIN; cl=cl-1) begin - if (valid_cl(cl, cwl)) begin - min_cl = cl; - end - end - end - endfunction - -`endif diff --git a/resources/soc/simu/testbench/ejtag_virtual_host.v b/resources/soc/simu/testbench/ejtag_virtual_host.v deleted file mode 100644 index 9210479..0000000 --- a/resources/soc/simu/testbench/ejtag_virtual_host.v +++ /dev/null @@ -1,235 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -module ejtag_virtual_host ( - TCK, - TMS, - TDO, - TDI, - TRST -); - -input TDO; -output TCK, TDI, TMS, TRST; -reg [31:0] control; -reg [31:0] impcode; -reg [31:0] idcode; -reg [31:0] data; -reg [31:0] addr; -reg [31:0] pc; -reg TDI, TCK, TMS, TRST; - -reg pracc; -reg prnw; -reg [1:0] psz; -reg rocc; -reg proben; -reg probtrap; - -reg dmseg_service; //serve dmseg access, or do other test -reg service_busy; //is the host in service - -reg [31:0] memory [{19{1'b1}}:0]; -integer j; - -always #25 TCK = ~TCK; - -initial -begin - TMS = 0; - for(j=0; j<128; j=j+1) - memory[j]=32'h0; - - - dmseg_service = 1'b0; - service_busy = 1'b0; - #50 TRST = 1'b0; - TRST = 1'b0; - TCK = 1'b0; - pracc = 1'b0; - rocc = 1'b0; - #20000 TRST = 1'b1; -//rocc = 1'b1; - $display("ejtag reboot done!"); - #1000 - query_reg32(5'ha, control); - start_dmseg_service; - -// stop_dmseg_service; -// test_ejtagbrk; -// #1000 -// start_dmseg_service; -end - -initial -begin - #10000 - begin - #20000 - if(dmseg_service) - begin - service_busy = 1'b1; - query_reg32(5'h01, idcode ); - $display("Idcode:%x Version:%x PartNumber:%x ManufID:%x\n", - idcode,idcode[31:28],idcode[27:12],idcode[11:1]); - - query_reg32(5'h03, impcode); - $display("Impcode:%x EJTAGver:%x DINTsup:%x NoDMA:%x MIPS32/64:%x\n", - impcode,impcode[31:29],impcode[24],impcode[14],impcode[0]); - service_busy = 1'b0; - end - if((!service_busy)&&dmseg_service) - end_dmseg_service; - end -end - - -task start_dmseg_service; -begin - dmseg_service = 1'b1; - $display("dmseg service start!"); -end -endtask - -task end_dmseg_service; -begin - dmseg_service = 1'b0; - query_reg32(5'ha, control); - control[31] = 1'b0; - control[15] = 1'b0; - control[14] = 1'b0; - control[12] = 1'b0; - write_reg32(5'ha, control); - $display("dmseg service end!"); -end -endtask - -task query_reg32; -input [4:0] reg_inst; -output [31:0] reg_data; -reg [31:0] reg_rd_data; -integer i; -begin - TMS = 0; - repeat(2) @(negedge TCK); - TMS = 1; - repeat(2) @(negedge TCK); - TMS = 0; - repeat(2) @(negedge TCK); - // Shift the IR command to select CONTROL - TDI = reg_inst[0]; - repeat(1) @(negedge TCK); - TDI = reg_inst[1]; - repeat(1) @(negedge TCK); - TDI = reg_inst[2]; - repeat(1) @(negedge TCK); - TDI = reg_inst[3]; - repeat(1) @(negedge TCK); - TDI = reg_inst[4]; - TMS = 1; - repeat(3) @(negedge TCK); - TMS = 0; - repeat(2) @(negedge TCK); - - for(i = 0; i < 32; i = i+1) - begin - repeat(1) @(negedge TCK); - reg_data[i] = TDO; - end - - if (reg_data[18]==1'b0) - reg_rd_data[31:0] = {reg_data[31:19], 1'b1, reg_data[17:0]}; - else - reg_rd_data[31:0] = reg_data[31:0]; - - for(i = 0; i < 32; i = i+1) - begin - TDI = reg_rd_data[i]; - repeat(1) @(posedge TCK); - if(i == 30) - begin - TMS = 1; - end - end - - repeat(1) @(posedge TCK); - TMS = 0; - repeat(3) @(negedge TCK); -end -endtask - - -task write_reg32; -input [4:0] reg_inst; -input [31:0] reg_data; -integer i; -begin - TMS = 0; - repeat(2) @(negedge TCK); - TMS = 1; - repeat(2) @(negedge TCK); - TMS = 0; - repeat(2) @(negedge TCK); - // Shift the IR command to select CONTROL - TDI = reg_inst[0]; - repeat(1) @(negedge TCK); - TDI = reg_inst[1]; - repeat(1) @(negedge TCK); - TDI = reg_inst[2]; - repeat(1) @(negedge TCK); - TDI = reg_inst[3]; - repeat(1) @(negedge TCK); - TDI = reg_inst[4]; - TMS = 1; - repeat(3) @(negedge TCK); - TMS = 0; - repeat(2) @(negedge TCK); - - repeat(1) @(posedge TCK); - for(i = 0; i < 32; i = i+1) - begin - TDI = reg_data[i]; - repeat(1) @(posedge TCK); - if(i==30) - begin - TMS = 1; - end - end - - repeat(1) @(posedge TCK); - TMS = 0; - repeat(3) @(negedge TCK); -end -endtask - -endmodule diff --git a/resources/soc/simu/testbench/godson_system.v b/resources/soc/simu/testbench/godson_system.v deleted file mode 100644 index fbb249d..0000000 --- a/resources/soc/simu/testbench/godson_system.v +++ /dev/null @@ -1,310 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -`timescale 1ns/1ps - -`define APP_FLASH "../../../../../../simu/soft/func/flash.vlog" - -`define UART_CLK soc_up_top.APB_DEV.uart0.regs.enable - -module godson_system; -// ========================================================================== // -// Signal Declarations // -// ========================================================================== // -// Clocks -reg clk,resetn; -reg mac_clk; -initial begin - clk = 1'b0; - mac_clk = 1'b0; - resetn = 1'b0; - #1000; - resetn = 1'b1; -end - -always #15.15 clk = ~clk; -always #20 mac_clk = ~mac_clk; - -//------DDR3 interface------ -wire [15:0] ddr3_dq; -wire [12:0] ddr3_addr; -wire [2 :0] ddr3_ba; -wire ddr3_ras_n; -wire ddr3_cas_n; -wire ddr3_we_n; -wire ddr3_odt; -wire ddr3_reset_n; -wire ddr3_cke; -wire [1:0] ddr3_dm; -wire [1:0] ddr3_dqs_p; -wire [1:0] ddr3_dqs_n; -wire ddr3_ck_p; -wire ddr3_ck_n; - -//----mac controller------ -//I/O pad interface signals -// Tx -wire mtxclk_0; // Transmit clock (from PHY) -wire [3:0] mtxd_0; // Transmit nibble (to PHY) -wire mtxen_0; // Transmit enable (to PHY) -wire mtxerr_0; // Transmit error (to PHY) -assign mtxclk_0 = mac_clk; -// Rx -wire mrxclk_0; // Receive clock (from PHY) -wire [3:0] mrxd_0; // Receive nibble (from PHY) -wire mrxdv_0; // Receive data valid (from PHY) -wire mrxerr_0; // Receive data error (from PHY) -assign mrxclk_0 = mac_clk; -// MII Management interface -wire mdc_0; // MII Management data clock (to PHY) -wire mdio_0; // MII data inout -wire phy_rstn; - -wire [7:0] LED; -wire UART_RX, UART_TX; -wire UART_CTS, UART_RTS; -wire UART_DTR, UART_DSR; -wire UART_RI, UART_DCD; - -//nand -wire NAND_CLE ; -wire NAND_ALE ; -wire NAND_RDY ; -wire [7:0] NAND_DATA; -wire NAND_RD ; -wire NAND_CE ; //low active -wire NAND_WR ; - -wire SPI_CLK, SPI_CS, SPI_MISO, SPI_MOSI; - -wire TDI; -wire TDO; -wire TCK; -wire TRST; -wire TMS; - -soc_up_top soc_up_top ( - .clk (clk ), - .resetn (resetn ), - - .ddr3_dq (ddr3_dq ), - .ddr3_addr (ddr3_addr ), - .ddr3_ba (ddr3_ba ), - .ddr3_ras_n (ddr3_ras_n ), - .ddr3_cas_n (ddr3_cas_n ), - .ddr3_we_n (ddr3_we_n ), - .ddr3_odt (ddr3_odt ), - .ddr3_reset_n (ddr3_reset_n), - .ddr3_cke (ddr3_cke ), - .ddr3_dm (ddr3_dm ), - .ddr3_dqs_p (ddr3_dqs_p ), - .ddr3_dqs_n (ddr3_dqs_n ), - .ddr3_ck_p (ddr3_ck_p ), - .ddr3_ck_n (ddr3_ck_n ), - - //------gpio---------------- - .led (), - .led_rg0 (), - .led_rg1 (), - .num_csn (), - .num_a_g (), - .switch (8'd0), - .btn_key_col (), - .btn_key_row (4'd0), - .btn_step (2'd0), - - //------mac controller------- - // I/O pad interface signals - //TX - .mtxclk_0 (mtxclk_0 ), - .mtxen_0 (mtxen_0 ), - .mtxd_0 (mtxd_0 ), - .mtxerr_0 (mtxerr_0 ), - //RX - .mrxclk_0 (mrxclk_0 ), - .mrxdv_0 (mrxdv_0 ), - .mrxd_0 (mrxd_0 ), - .mrxerr_0 (mrxerr_0 ), - .mcoll_0 (1'b0 ), - .mcrs_0 (1'b0 ), - // MIIM - .mdc_0 (mdc_0 ), - .mdio_0 (mdio_0 ), - - .phy_rstn (phy_rstn ), - - .UART_RX(UART_RX), - .UART_TX(UART_TX), - - //NAND - .NAND_CLE (NAND_CLE ), - .NAND_ALE (NAND_ALE ), - .NAND_RDY (NAND_RDY ), - .NAND_DATA(NAND_DATA), - .NAND_RD (NAND_RD ), - .NAND_CE (NAND_CE ), //low active - .NAND_WR (NAND_WR ), - - .EJTAG_TRST(TRST), - .EJTAG_TCK(TCK), - .EJTAG_TMS(TMS), - .EJTAG_TDI(TDI), - .EJTAG_TDO(TDO), - - .SPI_CLK(SPI_CLK), - .SPI_CS(SPI_CS), - .SPI_MISO(SPI_MISO), - .SPI_MOSI(SPI_MOSI) - ); - -pullup (NAND_RDY); -//nand module -s30ml08gp00 nand_model0 -( - .IO7 (NAND_DATA[7]) , - .IO6 (NAND_DATA[6]) , - .IO5 (NAND_DATA[5]), - .IO4 (NAND_DATA[4]), - .IO3 (NAND_DATA[3]), - .IO2 (NAND_DATA[2]), - .IO1 (NAND_DATA[1]), - .IO0 (NAND_DATA[0]), - .CLE (NAND_CLE ), - .ALE (NAND_ALE ), - .CE1Neg(NAND_CE ), - .RENeg (NAND_RD ), - .WENeg (NAND_WR ), - .RY1 (NAND_RDY ), - .CE2Neg(1'b1 ), - .WPNeg (1'b1 ), - .RY2 ( ), - .FP (1'b1 ) -); - -ejtag_virtual_host ejtag - ( - .TCK (TCK ), - .TMS (TMS ), - .TDO (TDO ), - .TDI (TDI ), - .TRST(TRST) - ); - - -MX25L6405D # - ( - .Init_File(`APP_FLASH) - ) - spi_flash - ( - .SCLK (SPI_CLK ), - .CS (SPI_CS ), - .SI (SPI_MOSI), - .SO (SPI_MISO), - .WP (1'b1 ), - .HOLD (1'b1 ) - ); - -uart_dev # - ( - .uart_number (0), - .STRLEN (80) - ) - uart_dev0 - ( - .clk (`UART_CLK), - .rst_n (resetn), - .rx (UART_TX), - .tx (UART_RX) - ); - -ddr3_model u_comp_ddr3 - ( - .rst_n (ddr3_reset_n), - .ck (ddr3_ck_p), - .ck_n (ddr3_ck_n), - .cke (ddr3_cke ), - .cs_n (1'b0 ), - .ras_n (ddr3_ras_n), - .cas_n (ddr3_cas_n), - .we_n (ddr3_we_n), - .dm_tdqs (ddr3_dm), - .ba (ddr3_ba), - .addr (ddr3_addr), - .dq (ddr3_dq), - .dqs (ddr3_dqs_p), - .dqs_n (ddr3_dqs_n), - .tdqs_n (), - .odt (ddr3_odt) - ); - -virtual_mac VIRTUAL_MAC( - .hclk (clk), - .hrst_n (resetn), - .mtxclk (mrxclk_0 ), - .mtxen (mrxdv_0 ), - .mtxd (mrxd_0 ), - .mtxerr (mrxerr_0 ), - - .mrxclk (mtxclk_0 ), - .mrxdv (mtxen_0 ), - .mrxd (mtxd_0 ), - .mrxerr (mtxerr_0 ), - .mcoll (1'b0 ), - .mcrs (1'b0 ), - .mdc (), - .md_io (), - .gpio (LED[4]) -); - -`ifdef DUMPDUMP -initial -begin - $fsdbDumpfile("wave.fsdb"); - $fsdbDumpvars(0, godson_system); - #57888881 - $fsdbDumpon; - #100000000 - $fsdbDumpoff; -end -`endif - -initial begin - forever begin - #500000; - $display("\t\t@%0t: CPU commit PC is %x", $time, godson_system.soc_up_top.cpu_mid.cpu_core.commitbus0[41:10]); - end -end - - -endmodule diff --git a/resources/soc/simu/testbench/nand_sim.v b/resources/soc/simu/testbench/nand_sim.v deleted file mode 100644 index 89c9b0f..0000000 --- a/resources/soc/simu/testbench/nand_sim.v +++ /dev/null @@ -1,3680 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// File name : s30ml08gp00.v -////////////////////////////////////////////////////////////////////////////// -// Copyright (C) 2005-2006 Free Model Foundry; http://www.FreeModelFoundry.com -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License version 2 as -// published by the Free Software Foundation. -// -// MODIFICATION HISTORY: -// -// version: | author: | mod date: | changes made: -// V1.0 D.Lukovic 05 Nov 02 Initial Version -// V1.1 D.Lukovic 06 Jan 24 SPEEDSIM support implemented -// Preload performance improvment -// RY pin is open drain, now. -// -////////////////////////////////////////////////////////////////////////////// -// PART DESCRIPTION: -// -// Library: FLASH -// Technology: FLASH MEMORY -// Part: s30ml08gp00 -// -// Description: NAND interface family based on Xtreme MirrorBit technology -// Flash Memory -// -////////////////////////////////////////////////////////////////////////////// -// Known Bugs: -// -////////////////////////////////////////////////////////////////////////////// - -////////////////////////////////////////////////////////////////////////////// -// TOP MODULE DECLARATION // -////////////////////////////////////////////////////////////////////////////// - - -`timescale 1 ns/1 ns -module s30ml08gp00 - ( - IO7 , - IO6 , - IO5 , - IO4 , - IO3 , - IO2 , - IO1 , - IO0 , - - CLE , - ALE , - CE1Neg , - CE2Neg , - RENeg , - WENeg , - WPNeg , - RY1 , - RY2 , - //PRE , - FP - ); - -//////////////////////////////////////////////////////////////////////// -// Port / Part Pin Declarations -//////////////////////////////////////////////////////////////////////// - - inout IO7 ; - inout IO6 ; - inout IO5 ; - inout IO4 ; - inout IO3 ; - inout IO2 ; - inout IO1 ; - inout IO0 ; - - input CLE ; - input ALE ; - input CE1Neg ; - input CE2Neg ; - input RENeg ; - input WENeg ; - input WPNeg ; - output RY1 ; - output RY2 ; - //input PRE ; - input FP ; - -s30ml04gp00 U_FLASH1 -( - .IO7(IO7) , - .IO6(IO6) , - .IO5(IO5) , - .IO4(IO4) , - .IO3(IO3) , - .IO2(IO2) , - .IO1(IO1) , - .IO0(IO0) , - .CLE(CLE) , - .ALE(ALE) , - .CENeg(CE1Neg), - .RENeg(RENeg), - .WENeg(WENeg), - .WPNeg(WPNeg), - .RY(RY1) , - .PRE(1'b1) , - .FP(FP) - ); - -endmodule - -module s30ml04gp00 - ( - IO7 , - IO6 , - IO5 , - IO4 , - IO3 , - IO2 , - IO1 , - IO0 , - - CLE , - ALE , - CENeg , - RENeg , - WENeg , - WPNeg , - RY , - FP , - PRE - ); - -//////////////////////////////////////////////////////////////////////// -// Port / Part Pin Declarations -//////////////////////////////////////////////////////////////////////// - - inout IO7 ; - inout IO6 ; - inout IO5 ; - inout IO4 ; - inout IO3 ; - inout IO2 ; - inout IO1 ; - inout IO0 ; - - input CLE ; - input ALE ; - input CENeg ; - input RENeg ; - input WENeg ; - input WPNeg ; - input PRE ; - input FP ; - output RY ; - - parameter mem_file_name = "none"; - parameter UserPreload = 1'b0; - parameter TimingModel = "DefaultTimingModel"; - -// interconnect path delay signals - - wire IO7_ipd ; - wire IO6_ipd ; - wire IO5_ipd ; - wire IO4_ipd ; - wire IO3_ipd ; - wire IO2_ipd ; - wire IO1_ipd ; - wire IO0_ipd ; - - wire [7 : 0] A; - assign A = {IO7_ipd, - IO6_ipd, - IO5_ipd, - IO4_ipd, - IO3_ipd, - IO2_ipd, - IO1_ipd, - IO0_ipd }; - - wire [7 : 0 ] DIn; - assign DIn = { - IO7_ipd, - IO6_ipd, - IO5_ipd, - IO4_ipd, - IO3_ipd, - IO2_ipd, - IO1_ipd, - IO0_ipd }; - - wire [7 : 0 ] DOut; - assign DOut = { - IO7, - IO6, - IO5, - IO4, - IO3, - IO2, - IO1, - IO0 }; - - wire CLE_ipd ; - wire ALE_ipd ; - wire CENeg_ipd ; - wire RENeg_ipd ; - wire WENeg_ipd ; - wire WPNeg_ipd ; - wire PRE_ipd ; - wire FP_ipd ; - -// internal delays - - reg PROG_in ; - reg PROG_out ; - reg XPROG_in ; - reg XPROG_out ; - reg PRE_PROG_in ; - reg PRE_PROG_out ; - reg BERS_in ; - reg BERS_out ; - reg XBERS_in ; - reg XBERS_out ; - reg DBSY_in ; - reg DBSY_out ; - reg TR_in ; - reg TR_out ; - reg FPSTART_in ; - reg FPSTART_out ; - reg BSTATINQ_in ; - reg BSTATINQ_out ; - - reg PROG1_in ; - reg PROG1_out ; - reg PROG2_in ; - reg PROG2_out ; - reg XPROG1_in ; - reg XPROG1_out ; - reg XPROG2_in ; - reg XPROG2_out ; - reg DBSY1_in ; - reg DBSY1_out ; - - reg [7 : 0] DOut_zd; - - wire IO7_zd ; - wire IO6_zd ; - wire IO5_zd ; - wire IO4_zd ; - wire IO3_zd ; - wire IO2_zd ; - wire IO1_zd ; - wire IO0_zd ; - - assign {IO7_zd , - IO6_zd , - IO5_zd , - IO4_zd , - IO3_zd , - IO2_zd , - IO1_zd , - IO0_zd } = DOut_zd; - - reg [7 : 0] DOut_pass; - - wire IO7_pass ; - wire IO6_pass ; - wire IO5_pass ; - wire IO4_pass ; - wire IO3_pass ; - wire IO2_pass ; - wire IO1_pass ; - wire IO0_pass ; - - - assign {IO7_pass , - IO6_pass , - IO5_pass , - IO4_pass , - IO3_pass , - IO2_pass , - IO1_pass , - IO0_pass } = DOut_pass; - - reg R_zd = 1'b0; - - parameter PartID = "s30ml04gp00"; - parameter MaxData = 8'hFF; - parameter BlockNum = 1023; - parameter BlockSize = 64; // 64 page - parameter PageSize = 2111;// by mhb - parameter SegmentNum = 7; // 8 segment within page - - // If Long_Timming is set to 0 uncomment line below - - `define SPEEDSIM; - - `ifdef SM_NAND_PGNUM - parameter PageNum = `SM_NAND_PGNUM; - `else // not SM_NAND_PGNUM - parameter PageNum = 16'hFFFF; - `endif // SM_NAND_PGNUM - - // control signals - reg STAT_ACT =1'b0; - reg STAT_M_ACT =1'b0; - reg ERS_ACT =1'b0; - reg PRG_ACT =1'b0; - reg RD_ACT =1'b0; - reg FP_ACT =1'b0; - reg XTREM_ACT =1'b0; - reg XTR_MPRG =1'b0; - reg RSTSTART =1'b0; - reg RSTDONE =1'b0; - reg back_to_xtrem =1'b0; - reg PMOVE =1'b0; - // Control signals for read operation - reg PGR_ACT =1'b0; // Page read in progress - reg PGD_ACT =1'b0; // Page Duplicate - - reg statread =1'b0; - reg nostatread =1'b1; - - // powerup - reg PoweredUp =1'b0; - reg reseted =1'b0; - - reg write =1'b0; - reg read =1'b0; - - integer WER_01; - - // 8 bit Address - integer AddrCom ; - // Address within page - integer Address ; // 0 - Pagesize - // Page Number - integer PageAddr = -1; //-1 - PageNum - // Partial page number - integer PartAddr = 0; - // Block Number - integer BlockAddr = -1; //-1 - BlockNum - integer BlckDup = 0; - - //Data - integer Data ; //-1 - MaxData - - //ID control signals - integer IDAddr ; // 0 - 4 - - integer BlockPage ; // RANGE 0 TO BlockSize; - integer Pom_Address ; // RANGE 0 TO PageSize; - reg firstFlag ; - // program control signals - integer CashBuffData [0:PageSize]; //Page chache register - integer CashBuffData1 [0:PageSize]; //Page chache register - integer CWrAddr ; // Cash -1 - Pagesize +1 - integer CWrPage ; // Cash 0 - PageNum - reg [0:SegmentNum] CSegForProg; //array [0:SegmentNum] of 0/1 - reg [0:SegmentNum] CSegForProg1; //array [0:SegmentNum] of 0/1 - - integer WrBuffData[0:PageSize]; - integer WrBuffData1[0:PageSize]; - integer WrAddr ; // -1 - Pagesize +1 - integer WrPage ; // 0 - PageNum - reg [0:SegmentNum] SegForProg; //array [0:SegmentNum] of 0/1 - reg [0:SegmentNum] SegForProg1; //array [0:SegmentNum] of 0/1 - - integer PDBuffer [0:PageSize]; - integer PDBuffer1 [0:PageSize]; - - integer Page_pom; - integer cnt_addr; - - integer pom_seg ; // RANGE -1 TO SegmentNum; - integer pom_seg1 ; // RANGE -1 TO SegmentNum; - integer segment ; // RANGE -1 TO SegmentNum; - integer segment1 ; // RANGE -1 TO SegmentNum; - reg [0:(PageNum+1)*(SegmentNum+1)-1] ProgramedFlag = 0; - reg [0:BlockNum] InvBlock = 0; - reg [0:BlockNum] InvBlockPgms = 0; - reg [0:BlockNum] PreProgFlag = 0; - reg [0:BlockNum] ProgBlock = 0; - reg [0:BlockNum] BlockMod = 0; // 0 for NORMAL, 1 for XTREME - integer ssa[0:SegmentNum]; // has to be initialized - integer sea[0:SegmentNum]; // has to be initialized - - // Mem(Page)(Address) - integer Mem[0:(PageSize+1)*(PageNum+1)-1]; - - // ID Array - integer IDArray[0:4]; - - // timing check violation - reg Viol = 1'b0; - - // initial - integer i,j; - - //Bus Cycle Decode - reg[7:0] A_tmp ; - reg[7:0] D_tmp ; - - //RstTime - time duration; - - //Functional - reg[7:0] Status = 8'hC0; - reg oe = 1'b0; - integer Page ; // 0 - PageNum - integer Blck ; // 0 - BlockNum - - event oe_event; - - integer prog_time; - integer erase_time; - - reg [14*8-1:0] tmp_timing;//stores copy of TimingModel - reg [14*8-1:0] tmp1_timing;//stores copy of TimingModel - reg [7:0] tmp_char;//stores "0" or "2" character - integer found = 1'b0; - - // states - reg [5:0] current_state; - reg [5:0] next_state; - - // FSM states - parameter IDLE =6'h00; // - parameter XTREM_PREL =6'h01; // - parameter XTREM_IDLE =6'h02; // - parameter UNKNOWN =6'h03; // wrong command sequneces - parameter PREL_RD =6'h04; // - parameter RESET =6'h05; // - parameter A0_RD =6'h06; // - parameter A1_RD =6'h07; // - parameter A2_RD =6'h08; // - parameter A3_RD =6'h09; // - parameter RD_WCMD =6'h0A; // waiting for the confirm read command - parameter BUFF_TR =6'h0B; // - parameter RD =6'h0C; // - parameter CAC_PREL =6'h0D; // Coloumn address change - parameter A0_CAC =6'h0E; // - parameter A1_CAC =6'h0F; // Wait for confirm EO command - parameter ID_PREL =6'h10; // - parameter ID =6'h11; // - parameter PREL_PRG =6'h12; // - parameter PGD_PREL =6'h13; // - parameter A0_PRG =6'h14; // - parameter A1_PRG =6'h15; // - parameter A2_PRG =6'h16; // - parameter A3_PRG =6'h17; // - parameter DATA_PRG =6'h18; // - parameter PRE_PRG =6'h19; - parameter WFPD =6'h1A; // wait for program done - parameter WFPPD =6'h1B; // - parameter PGMS_CAC =6'h1C; - parameter A0_PRG_CAC =6'h1D; - parameter PGMS =6'h1E; - parameter CBSY =6'h1F; - parameter RDY_PRG =6'h20; - parameter PREL_ERS =6'h21; - parameter A1_ERS =6'h22; - parameter A2_ERS =6'h23; - parameter A3_ERS =6'h24; - parameter BERS_EXEC =6'h25; - parameter A0_PGD =6'h26; - parameter A1_PGD =6'h27; - parameter A2_PGD =6'h28; - parameter A3_PGD =6'h29; - parameter CONF_PGD =6'h30; - parameter BSTAT_INQ =6'h31; - -/////////////////////////////////////////////////////////////////////////////// -//Interconnect Path Delay Section -/////////////////////////////////////////////////////////////////////////////// - - buf (IO7_ipd , IO7 ); - buf (IO6_ipd , IO6 ); - buf (IO5_ipd , IO5 ); - buf (IO4_ipd , IO4 ); - buf (IO3_ipd , IO3 ); - buf (IO2_ipd , IO2 ); - buf (IO1_ipd , IO1 ); - buf (IO0_ipd , IO0 ); - - buf (CLE_ipd , CLE ); - buf (ALE_ipd , ALE ); - buf (CENeg_ipd , CENeg ); - buf (RENeg_ipd , RENeg ); - buf (WENeg_ipd , WENeg ); - buf (WPNeg_ipd , WPNeg ); - buf (PRE_ipd , PRE ); - buf (FP_ipd , FP ); - -/////////////////////////////////////////////////////////////////////////////// -// Propagation delay Section -/////////////////////////////////////////////////////////////////////////////// - - - nmos (IO7 , IO7_pass , 1'b1); - nmos (IO6 , IO6_pass , 1'b1); - nmos (IO5 , IO5_pass , 1'b1); - nmos (IO4 , IO4_pass , 1'b1); - nmos (IO3 , IO3_pass , 1'b1); - nmos (IO2 , IO2_pass , 1'b1); - nmos (IO1 , IO1_pass , 1'b1); - nmos (IO0 , IO0_pass , 1'b1); - - nmos (RY , 1'b0, ~R_zd); - - wire deg; - - // Needed for TimingChecks - // VHDL CheckEnable Equivalent - - wire Check_IO0_WENeg; - assign Check_IO0_WENeg = ~CENeg; - - wire Check_WENeg; - assign Check_WENeg = PoweredUp; - reg tdp_AL, tdp_CL, tdp_CE, tdp_RE; - - wire statread_cond; - wire nostatread_cond; - - assign statread_cond = statread && tdp_CE; - assign nostatread_cond = nostatread_cond && tdp_CE; - -specify - - // tipd delays: interconnect path delays , mapped to input port delays. - // In Verilog is not necessary to declare any tipd_ delay variables, - // they can be taken from SDF file - // With all the other delays real delays would be taken from SDF file - - specparam tpd_CENeg_IO0 = 1;//tcea, tchz - specparam tpd_RENeg_IO0 = 1;//trea, trhZ - specparam tpd_WENeg_RY = 1;//twb - - //tsetup values - specparam tsetup_IO0_WENeg = 1;//tds edge / - specparam tsetup_CLE_WENeg = 1;//tcls edge \ - specparam tsetup_CENeg_WENeg = 1;//tcs edge \ - specparam tsetup_ALE_WENeg = 1;//tals edge \ - specparam tsetup_WENeg_RENeg = 1;//twhr edge \ - specparam tsetup_RENeg_WENeg = 1;//twhw edge \ - specparam tsetup_WENeg_CENeg = 1;//twhc edge \ - specparam tsetup_WPNeg_WENeg = 1;//tww edge / - specparam tsetup_RY_WENeg = 1;//twr edge \ - specparam tsetup_RY_RENeg = 1;//trr edge \ - specparam tsetup_CLE_RENeg = 1; - specparam tsetup_ALE_RENeg = 1; - specparam tsetup_CENeg_RENeg = 1; - specparam tsetup_RENeg_CENeg = 1; - - //thold values - specparam thold_CLE_WENeg = 1;//tclh edge / - specparam thold_CENeg_WENeg = 1;//tch edge / - specparam thold_ALE_WENeg = 1;//talh edge / - specparam thold_IO0_WENeg = 1;//tdh edge / - - //tpw values - specparam tpw_WENeg_negedge = 1;//twp - specparam tpw_WENeg_posedge = 1;//twh - specparam tpw_RENeg_negedge = 1;//trp - specparam tpw_RENeg_posedge = 1;//treh - specparam tperiod_WENeg = 1;//twc - specparam tperiod_RENeg = 1;//trc - - //tdevice values: values for internal delays - `ifdef SPEEDSIM - // Program Operation - specparam tdevice_PROG = 698; - // Fast programming operation - specparam tdevice_FPROG = 314; - // Program Operation - specparam tdevice_XPROG = 200; - // Program Operation - specparam tdevice_PRE_PROG = 9000; - //Block Erase Operation - specparam tdevice_BERS = 17400; - //Fast block erase operation - specparam tdevice_FBERS = 10200; - //Block Erase Operation - specparam tdevice_XBERS = 17400; - //Dummy busy time - specparam tdevice_DBSY = 400; - //Block status inquiry time - specparam tdevice_BSTATINQ = 100; - //Page transfer time - specparam tdevice_TR = 300; - //Fast programming start time - specparam tdevice_FPSTART = 100; - - `else // not SPEEDSIM - // Program Operation - specparam tdevice_PROG = 698000; - // Fast programming operation - specparam tdevice_FPROG = 314000; - // Program Operation - specparam tdevice_XPROG = 120000; - // Program Operation - specparam tdevice_PRE_PROG = 90000000; - //Block Erase Operation - specparam tdevice_BERS = 174000000; - //Fast block erase operation - specparam tdevice_FBERS = 102000000; - //Block Erase Operation - specparam tdevice_XBERS = 174000000; - //Dummy busy time - specparam tdevice_DBSY = 400; - //Block status inquiry time - specparam tdevice_BSTATINQ = 1000; - //Page transfer time - specparam tdevice_TR = 15000; - //Fast programming start time - specparam tdevice_FPSTART = 100; - `endif // SPEEDSIM - -/////////////////////////////////////////////////////////////////////////////// -// Input Port Delays don't require Verilog description -/////////////////////////////////////////////////////////////////////////////// -// Path delays // -/////////////////////////////////////////////////////////////////////////////// - -// specify transport delay for Data output paths - -// Data ouptut paths - - if(statread_cond) - ( CENeg *> IO7 ) = tpd_CENeg_IO0; - if(statread_cond) - ( CENeg *> IO6 ) = tpd_CENeg_IO0; - if(statread_cond) - ( CENeg *> IO5 ) = tpd_CENeg_IO0; - if(statread_cond) - ( CENeg *> IO4 ) = tpd_CENeg_IO0; - if(statread_cond) - ( CENeg *> IO3 ) = tpd_CENeg_IO0; - if(statread_cond) - ( CENeg *> IO2 ) = tpd_CENeg_IO0; - if(statread_cond) - ( CENeg *> IO1 ) = tpd_CENeg_IO0; - if(statread_cond) - ( CENeg *> IO0 ) = tpd_CENeg_IO0; - - if(nostatread_cond) - ( CENeg *> IO7 ) = tpd_CENeg_IO0; - if(nostatread_cond) - ( CENeg *> IO6 ) = tpd_CENeg_IO0; - if(nostatread_cond) - ( CENeg *> IO5 ) = tpd_CENeg_IO0; - if(nostatread_cond) - ( CENeg *> IO4 ) = tpd_CENeg_IO0; - if(nostatread_cond) - ( CENeg *> IO3 ) = tpd_CENeg_IO0; - if(nostatread_cond) - ( CENeg *> IO2 ) = tpd_CENeg_IO0; - if(nostatread_cond) - ( CENeg *> IO1 ) = tpd_CENeg_IO0; - if(nostatread_cond) - ( CENeg *> IO0 ) = tpd_CENeg_IO0; - - if(tdp_RE) - ( RENeg => IO7 ) = tpd_RENeg_IO0; - if(tdp_RE) - ( RENeg => IO6 ) = tpd_RENeg_IO0; - if(tdp_RE) - ( RENeg => IO5 ) = tpd_RENeg_IO0; - if(tdp_RE) - ( RENeg => IO4 ) = tpd_RENeg_IO0; - if(tdp_RE) - ( RENeg => IO3 ) = tpd_RENeg_IO0; - if(tdp_RE) - ( RENeg => IO2 ) = tpd_RENeg_IO0; - if(tdp_RE) - ( RENeg => IO1 ) = tpd_RENeg_IO0; - if(tdp_RE) - ( RENeg => IO0 ) = tpd_RENeg_IO0; - -// R output path - (WENeg => RY) = tpd_WENeg_RY; - -/////////////////////////////////////////////////////////////////////////////// -// Timing Violation / -/////////////////////////////////////////////////////////////////////////////// - - $setup ( IO7 ,posedge WENeg &&& Check_IO0_WENeg ,tsetup_IO0_WENeg,Viol); - $setup ( IO6 ,posedge WENeg &&& Check_IO0_WENeg ,tsetup_IO0_WENeg,Viol); - $setup ( IO5 ,posedge WENeg &&& Check_IO0_WENeg ,tsetup_IO0_WENeg,Viol); - $setup ( IO4 ,posedge WENeg &&& Check_IO0_WENeg ,tsetup_IO0_WENeg,Viol); - $setup ( IO3 ,posedge WENeg &&& Check_IO0_WENeg ,tsetup_IO0_WENeg,Viol); - $setup ( IO2 ,posedge WENeg &&& Check_IO0_WENeg ,tsetup_IO0_WENeg,Viol); - $setup ( IO1 ,posedge WENeg &&& Check_IO0_WENeg ,tsetup_IO0_WENeg,Viol); - $setup ( IO0 ,posedge WENeg &&& Check_IO0_WENeg ,tsetup_IO0_WENeg,Viol); - - $hold ( posedge WENeg &&& Check_IO0_WENeg , IO7 ,thold_IO0_WENeg, Viol); - $hold ( posedge WENeg &&& Check_IO0_WENeg , IO6 ,thold_IO0_WENeg, Viol); - $hold ( posedge WENeg &&& Check_IO0_WENeg , IO5 ,thold_IO0_WENeg, Viol); - $hold ( posedge WENeg &&& Check_IO0_WENeg , IO4 ,thold_IO0_WENeg, Viol); - $hold ( posedge WENeg &&& Check_IO0_WENeg , IO3 ,thold_IO0_WENeg, Viol); - $hold ( posedge WENeg &&& Check_IO0_WENeg , IO2 ,thold_IO0_WENeg, Viol); - $hold ( posedge WENeg &&& Check_IO0_WENeg , IO1 ,thold_IO0_WENeg, Viol); - $hold ( posedge WENeg &&& Check_IO0_WENeg , IO0 ,thold_IO0_WENeg, Viol); - - $setup ( CLE ,negedge WENeg ,tsetup_CLE_WENeg , Viol); - $setup ( ALE ,negedge WENeg ,tsetup_ALE_WENeg , Viol); - $setup ( CENeg ,negedge WENeg ,tsetup_CENeg_WENeg , Viol); - $setup ( WENeg ,negedge CENeg &&& WENeg ,tsetup_WENeg_CENeg , Viol); - $setup ( WENeg ,negedge RENeg ,tsetup_WENeg_RENeg , Viol); - $setup ( RY ,negedge WENeg &&& RY ,tsetup_RY_WENeg , Viol); - $setup ( RY ,negedge RENeg &&& RY ,tsetup_RY_RENeg , Viol); - $setup ( RENeg ,negedge WENeg ,tsetup_RENeg_WENeg , Viol); - $setup ( WPNeg ,negedge WENeg ,tsetup_WENeg_RENeg , Viol); - $setup ( CLE ,negedge RENeg ,tsetup_CLE_RENeg , Viol); - $setup ( ALE ,negedge RENeg ,tsetup_ALE_RENeg , Viol); - $setup ( CENeg ,negedge RENeg ,tsetup_CENeg_RENeg , Viol); - $setup ( RENeg ,negedge CENeg ,tsetup_RENeg_CENeg , Viol); - - $hold ( posedge WENeg &&& Check_WENeg,CLE,thold_CLE_WENeg, Viol); - $hold ( posedge WENeg &&& Check_WENeg,ALE,thold_ALE_WENeg, Viol); - $hold ( posedge WENeg &&& Check_WENeg,CENeg,thold_CENeg_WENeg,Viol); - - $width (posedge WENeg , tpw_WENeg_posedge); - $width (negedge WENeg , tpw_WENeg_negedge); - $period(negedge WENeg , tperiod_WENeg); - $period(posedge WENeg , tperiod_WENeg); - $width (posedge RENeg , tpw_RENeg_posedge); - $width (negedge RENeg , tpw_RENeg_negedge); - $period(negedge RENeg , tperiod_RENeg); - $period(posedge RENeg , tperiod_RENeg); - - endspecify - - //Used as wait periods - `ifdef SPEEDSIM - time poweredupT = 1000; // 10 us - time RstErsT = 500;// 5 us - time RstProgT = 1000; // 10 us - time RstReadT = 500; // 5 us - `else // not SPEEDSIM - time poweredupT = 10000; // 10 us - time RstErsT = 500000;// 500 us - time RstProgT = 10000; // 10 us - time RstReadT = 5000; // 5 us - `endif // SPEEDSIM - -/////////////////////////////////////////////////////////////////////////////// -// Main Behavior Block / -/////////////////////////////////////////////////////////////////////////////// - - reg deq; - ////////////////////////////////////////////////////////// - // Output Data Gen - ////////////////////////////////////////////////////////// - - always @(DIn, DOut) - begin - if (DIn==DOut) - deq=1'b1; - else - deq=1'b0; - end - // check when data is generated from model to avoid setuphold check in - // those occasion - assign deg=deq; - - initial - begin - ////////////////////////////////////////////////////////////////// - //ID array data / S30ML01GP00 DEVICE SPECIFIC - ////////////////////////////////////////////////////////////////// - IDArray[4'd0] = 8'h01; - IDArray[4'd1] = 8'hDC; - - tmp_timing = TimingModel;//copy of TimingModel - i = 14; - while ((i >= 0) && (found != 1'b1))//search for first non null character - begin //i keeps position of first non null character - j = 7; - while ((j >= 0) && (found != 1'b1)) - begin - if (tmp_timing[i*8+j] != 1'd0) - found = 1'b1; - else - j = j-1; - end - i = i - 1; - end - i = i +1; - if (found)//if non null character is found - begin - for (j=0;j<=7;j=j+1) - begin - tmp_char[j] = TimingModel[(i-13)*8+j]; - end - end - - if ((tmp_char == "0") || (tmp_char == "1")) - IDArray[4'd2] = 8'h00; - else - IDArray[4'd2] = 8'h01; - - IDArray[4'd3] = 8'h01; - IDArray[4'd4] = 8'h22; - end - - // initialize memory and load preoload files if any - initial - begin: InitMemory - integer i,j,k; - //for (i=0;i<= PageNum;i=i+1) - //begin - // for (j=0;j<= PageSize;j=j+1) - // begin - // Mem[i*(PageSize+1)+j]=MaxData; - // end - //end - - //page segment start address offset - ssa[0] =12'h000; - ssa[1] =12'h200; - ssa[2] =12'h400; - ssa[3] =12'h600; - ssa[4] =12'h800; - ssa[5] =12'h810; - ssa[6] =12'h820; - ssa[7] =12'h830; - //page segment end address offset - sea[0] =12'h1FF; - sea[1] =12'h3FF; - sea[2] =12'h5FF; - sea[3] =12'h7FF; - sea[4] =12'h80F; - sea[5] =12'h81F; - sea[6] =12'h82F; - sea[7] =12'h83F; - - if (UserPreload && !(mem_file_name == "none")) - begin - //----------------------------------------------------------------- - // Memory preload file format for s30ml04gp00 - //----------------------------------------------------------------- - // / - comment - // @aaaaaaaa - stands for page address and address within - // first 2112 bytes of the page - // dd -
is byte to be written at Mem(Page)(offset++) - // page is div 2112 - // offset is mod 2112 - // offset is incremented on every write - //----------------------------------------------------------------- - $readmemh(mem_file_name, Mem); - //mark page segments that have been programed - for (i=0;i<(PageNum+1)*(SegmentNum+1);i=i+1) - ProgramedFlag[i] = 1'b0; - for (i=0;i<= PageNum;i=i+1) - begin - j = 0; - while (j<= PageSize) - begin - if (Mem[i*(PageSize+1)+j]!==-1) - begin - k = i*(PageSize+1)+j; - getSegment(k,segment); - ProgramedFlag[i*(SegmentNum+1)+segment] = 1'b1; - j = sea [segment]; - j = j + 1; - end - else - j = j + 1; - end - end - end - end - - initial - begin - STAT_ACT =1'b0; - STAT_M_ACT =1'b0; - ERS_ACT =1'b0; - PRG_ACT =1'b0; - FP_ACT =1'b0; - RD_ACT =1'b0; - XTREM_ACT =1'b0; - XTR_MPRG =1'b0; - RSTSTART =1'b0; - RSTDONE =1'b0; - - write =1'b0; - read =1'b0; - for(j=0;j<=PageSize;j=j+1) - begin - WrBuffData[j] = -1; - WrBuffData1[j] = -1; - end - for(j=0;j<=SegmentNum;j=j+1) - begin - SegForProg[i]=1'b0; - CSegForProg[i]=1'b0; - SegForProg1[i]=1'b0; - CSegForProg1[i]=1'b0; - end - WrAddr = -1; - WrPage = -1; - CWrAddr = -1; - CWrPage = -1; - - current_state = IDLE; - next_state = IDLE; - - Status = 8'b01100100; - - PROG_in = 1'b0; - PROG_out = 1'b0; - XPROG_in = 1'b0; - XPROG_out = 1'b0; - PRE_PROG_in = 1'b0; - PRE_PROG_out = 1'b0; - BERS_in = 1'b0; - BERS_out = 1'b0; - XBERS_in = 1'b0; - XBERS_out = 1'b0; - DBSY_in = 1'b0; - DBSY_out = 1'b0; - TR_in = 1'b0; - TR_out = 1'b0; - FPSTART_in = 1'b0; - FPSTART_out= 1'b0; - BSTATINQ_in= 1'b0; - BSTATINQ_out=1'b0; - - PROG1_in = 1'b0; - PROG1_out = 1'b0; - PROG2_in = 1'b0; - PROG2_out = 1'b0; - XPROG1_in = 1'b0; - XPROG1_out = 1'b0; - XPROG2_in = 1'b0; - XPROG2_out = 1'b0; - DBSY1_in = 1'b0; - DBSY1_out = 1'b0; - R_zd = 1'b1; - - firstFlag = 1'b0; - prog_time = tdevice_PROG; - erase_time = tdevice_BERS; - statread = 1'b0; - nostatread = 1'b1; - end - - //Power Up time 10 us; - initial - begin - PoweredUp = 1'b0; - #poweredupT PoweredUp = 1'b1; - end - - always @(negedge FP) - begin - if (PRG_ACT) - begin - $display("Embeded programm in progress, simulation may be "); - $display("inacurate due to timinig violation on FP"); - end - if (ERS_ACT) - begin - $display("Embeded erase in progress, simulation may be "); - $display("inacurate due to timinig violation on FP"); - end - FP_ACT = 1'b1; - FPSTART_in = 1'b1; - prog_time = tdevice_FPROG; - erase_time= tdevice_FBERS; - end - - always @(posedge FP) - begin - if (PRG_ACT) - begin - $display("Embeded programm in progress, simulation may be "); - $display("inacurate due to timinig violation on FP"); - end - if (ERS_ACT) - begin - $display("Embeded erase in progress, simulation may be "); - $display("inacurate due to timinig violation on FP"); - end - FP_ACT = 1'b0; - FPSTART_in = 1'b0; - prog_time = tdevice_PROG; - erase_time = tdevice_BERS; - end - - always @(posedge FPSTART_in) - begin : FP_Time - #(tdevice_FPSTART) FPSTART_out = 1'b1; - end - - always @(negedge FPSTART_in) - begin - disable FP_Time; - #1 FPSTART_out = 1'b0; - end - - //Program Operation - always @(posedge PROG_in) - begin:ProgTime - #(prog_time + WER_01) PROG_out = 1'b1; - if (FP_ACT & (~FPSTART_out)) - begin - $display("Simulation results may been inacurate"); - $display("since timing violation occures on FP"); - end - end - - always @(negedge PROG_in) - begin - disable ProgTime; - #1 PROG_out = 1'b0; - end - //PreProgram Operation - always @(posedge PRE_PROG_in) - begin:PreProgTime - #(tdevice_PRE_PROG + WER_01) PRE_PROG_out = 1'b1; - end - always @(negedge PRE_PROG_in) - begin - disable PreProgTime; - #1 PRE_PROG_out = 1'b0; - end - //XProgram Operation - always @(posedge XPROG_in) - begin:XProgTime - #(tdevice_XPROG + WER_01) XPROG_out = 1'b1; - end - always @(negedge XPROG_in) - begin - disable XProgTime; - #1 XPROG_out = 1'b0; - end - //Program Operation 1 - always @(posedge PROG1_in) - begin:ProgTime1 - #(tdevice_PROG) PROG1_out = 1'b1; - end - always @(negedge PROG1_in) - begin - disable ProgTime1; - #1 PROG1_out = 1'b0; - end - //XProgram Operation 1 - always @(posedge XPROG1_in) - begin:XProgTime1 - #(tdevice_XPROG) XPROG1_out = 1'b1; - end - always @(negedge XPROG1_in) - begin - disable XProgTime1; - #1 XPROG1_out = 1'b0; - end - //Program Operation 2 - always @(posedge PROG2_in) - begin:ProgTime2 - #(tdevice_PROG) PROG2_out = 1'b1; - end - always @(negedge PROG2_in) - begin - disable ProgTime2; - #1 PROG2_out = 1'b0; - end - //XProgram Operation 2 - always @(posedge XPROG2_in) - begin:XProgTime2 - #(tdevice_XPROG) XPROG2_out = 1'b1; - end - always @(negedge XPROG2_in) - begin - disable XProgTime2; - #1 XPROG2_out = 1'b0; - end - // Dummy busy time1 - always @(posedge DBSY1_in) - begin : DummyBusyTime1 - #(tdevice_DBSY + WER_01) DBSY1_out = 1'b1; - end - always @(negedge DBSY1_in) - begin - disable DummyBusyTime1; - #1 DBSY1_out = 1'b0; - end - //Block Erase Operation - always @(posedge BERS_in) - begin : ErsTime - #(erase_time + WER_01) BERS_out = 1'b1; - if (FP_ACT & (~FPSTART_out)) - begin - $display("Simulation results may been inacurate"); - $display("since timing violation occures on FP"); - end - end - - always @(negedge BERS_in) - begin - disable ErsTime; - #1 BERS_out = 1'b0; - end - //Block Erase Operation - always @(posedge XBERS_in) - begin : XErsTime - #(tdevice_XBERS + WER_01) XBERS_out = 1'b1; - end - always @(negedge XBERS_in) - begin - disable XErsTime; - #1 XBERS_out = 1'b0; - end - // Dummy busy time - always @(posedge DBSY_in) - begin : DummyBusyTime - #(tdevice_DBSY+ WER_01) DBSY_out = 1'b1; - end - always @(negedge DBSY_in) - begin - disable DummyBusyTime; - #1 DBSY_out = 1'b0; - end - //Page transfer time - always @(posedge TR_in) - begin : PageTransferTime - #(tdevice_TR) TR_out = 1'b1; - end - always @(negedge TR_in) - begin - disable PageTransferTime; - #1 TR_out = 1'b0; - end - - always @(posedge BSTATINQ_in) - begin : BSTATINQ_Time - #(tdevice_BSTATINQ + WER_01) BSTATINQ_out = 1'b1; - end - - always @(negedge BSTATINQ_in) - begin - disable BSTATINQ_Time; - #1 BSTATINQ_out = 1'b0; - end - - /////////////////////////////////////////////////////////////////////////// - // process for reset control and FSM state transition - /////////////////////////////////////////////////////////////////////////// - always @(PoweredUp) - begin - if (PoweredUp) - begin - reseted = 1'b1; - if (PRE) - current_state = RD; - else //currently undefined functionality for PRE=0 - current_state = IDLE; - end - else - begin - current_state = IDLE; - reseted = 1'b0; - end - end - always @(next_state) - begin - if (PoweredUp) - current_state = next_state; - else - begin - current_state = IDLE; - reseted = 1'b0; - end - end - - ////////////////////////////////////////////////////////////////////////// - //process for generating the write and read signals - ////////////////////////////////////////////////////////////////////////// - always @ (WENeg, CENeg, RENeg) - begin - if (~WENeg && ~CENeg && RENeg && WPNeg) - write = 1'b1; - else if (WENeg && ~CENeg && RENeg && WPNeg) - write = 1'b0; - else - write = 1'b0; - if (WENeg && ~CENeg && ~RENeg ) - read = 1'b1; - else if (WENeg && ~CENeg && RENeg ) - read = 1'b0; - else - read = 1'b0; - end - - ////////////////////////////////////////////////////////////////////////// - //Latches 8 bit address on rising edge of WE# - //Latches data on rising edge of WE# - ////////////////////////////////////////////////////////////////////////// - always @ (posedge WENeg) - begin - // latch 8 bit read address - if (WENeg && ALE && ~CENeg && ~CLE && WPNeg) - AddrCom = A[7:0]; - // latch data - if (WENeg && ~ALE && RENeg && WPNeg) - Data = DIn[7:0]; - end - - /////////////////////////////////////////////////////////////////////////// - // Timing control for the Reset Operation - /////////////////////////////////////////////////////////////////////////// - event rstdone_event; - always @ (posedge reseted) - begin - disable rstdone_process; - RSTDONE = 1'b1; // reset done - end - - always @ (posedge RSTSTART) - begin - if (reseted && RSTDONE) - begin - if (ERS_ACT) - duration = RstErsT; - else if (PRG_ACT) - duration = RstProgT; - else - duration = RstReadT; - RSTDONE = 1'b0; - ->rstdone_event; - end - end - - always @(rstdone_event) - begin:rstdone_process - #duration RSTDONE = 1'b1; - end - - /////////////////////////////////////////////////////////////////////////// - // Main Behavior Process - // combinational process for next state generation - /////////////////////////////////////////////////////////////////////////// - - //WRITE CYCLE TRANSITIONS - always @(negedge write or negedge reseted) - begin - if (reseted != 1'b1 ) - next_state = current_state; - else - case (current_state) - IDLE : - begin - if (CLE && ~ALE && Data==8'h00 && ~FP_ACT) - next_state = PREL_RD; - else if ( CLE && ~ALE && Data==8'h90 && ~FP_ACT) - next_state = ID_PREL; - else if ( CLE && ~ALE && Data==8'h80) - next_state = PREL_PRG; - else if ( CLE && ~ALE && Data==8'h60) - next_state = PREL_ERS; - else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT) - next_state = RESET; // reset - else if ( CLE && ~ALE && Data==8'h70 ) - next_state = IDLE; // reset - else if (CLE && ~ALE && Data==8'h85 && PGD_ACT) - next_state = PGD_PREL; - else if ( CLE && ~ALE && Data==8'hA0 && ~FP_ACT ) - next_state = XTREM_PREL; - else if ( CLE) - next_state = UNKNOWN; - end - - XTREM_PREL : - begin - if (CLE && ~ALE && Data==8'hA0 && ~FP_ACT) - next_state = XTREM_IDLE; - else if (CLE && ~ALE && Data==8'hFF && ~FP_ACT) - next_state = RESET; - else if (CLE) - next_state = UNKNOWN; - end - - XTREM_IDLE : - begin - if (CLE && ~ALE && Data==8'h00 && ~FP_ACT ) - next_state = PREL_RD; - else if ( CLE && ~ALE && Data==8'h90 && ~FP_ACT) - next_state = ID_PREL; - else if ( CLE && ~ALE && Data==8'h80 && ~FP_ACT) - next_state = PREL_PRG; - else if ( CLE && ~ALE && Data==8'h60 && ~FP_ACT) - next_state = PREL_ERS; - else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) - next_state = RESET; // reset - else if ( CLE && ~ALE && Data==8'h70 && ~FP_ACT ) - next_state = XTREM_IDLE; // reset - else if (CLE && ~ALE && Data==8'h85 && PMOVE && ~FP_ACT) - next_state = PGD_PREL; - else if ( CLE && ~ALE && Data==8'hA0 && ~FP_ACT ) - next_state = XTREM_IDLE; - else if ( CLE) - next_state = UNKNOWN; - end - - PRE_PRG : - begin - if (CLE && ~ALE && Data==8'hFF && ~FP_ACT) - next_state = RESET; // reset - end - - UNKNOWN: - begin - if (CLE && ~ALE && Data==8'hFF && ~FP_ACT ) - next_state = RESET; - end - - PREL_RD: - begin - if (ALE && ~FP_ACT) - next_state = A0_RD; - else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) - next_state = RESET; // reset - end - - A0_RD : - begin - if ( ALE && ~FP_ACT) - next_state = A1_RD; - else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) - next_state = RESET; // reset - else if ( CLE) - next_state = UNKNOWN; - end - - A1_RD : - begin - if ( ALE && ~FP_ACT) - next_state = A2_RD; - else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) - next_state = RESET; // reset - else if ( CLE) - next_state = UNKNOWN; - end - - A2_RD : - begin - if ( ALE && ~FP_ACT) - next_state = A3_RD; - else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) - next_state = RESET; // reset - else if ( CLE) - next_state = UNKNOWN; - end - - A3_RD : - begin - if ( ALE && ~FP_ACT) - next_state = RD_WCMD; - else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) - next_state = RESET; // reset - else if ( CLE) - next_state = UNKNOWN; - end - - RD_WCMD: - begin - if ((ALE && cnt_addr >= 5) || (CLE && ~ALE && cnt_addr > 5)) - next_state = UNKNOWN; - else if (CLE && ~ALE && ~FP_ACT &&(Data==8'h30|| Data==8'h35)) - next_state = BUFF_TR; - else if (CLE && ~ALE && Data==8'hFF && ~FP_ACT) - next_state = RESET; - else if (CLE) - next_state = UNKNOWN; - end - - BUFF_TR : - begin - if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT) - next_state = RESET; // reset - end - - RD : - begin - if ( CLE && ~ALE && Data==8'h00 && PGR_ACT && STAT_ACT - && ~FP_ACT) - next_state= RD; - else if (CLE && ~FP_ACT && ~ALE && Data==8'h00 && - (PGR_ACT || STAT_M_ACT)) - next_state= PREL_RD; - else if (CLE && ~ALE && Data==8'h80 && ~PGD_ACT) - next_state = PREL_PRG; - else if (CLE && ~ALE && Data==8'h90 && ~PGD_ACT && ~FP_ACT) - next_state = ID_PREL; - else if (CLE && ~ALE && Data==8'h70 && ~XTREM_ACT) - next_state = IDLE; - else if (CLE && ~ALE && Data==8'h70 && XTREM_ACT && ~FP_ACT) - next_state = XTREM_IDLE; - else if (CLE && ~ALE && Data==8'hFF && ~FP_ACT ) - next_state = RESET; // reset - else if (CLE && ~ALE && Data==8'h60 && ~PGD_ACT) - next_state = PREL_ERS; - else if (CLE && ~ALE && Data==8'h85 && PGD_ACT) - next_state = PGD_PREL; // Read next colomn address - else if (CLE && ~ALE && Data==8'h05 && ~PGD_ACT && ~FP_ACT) - next_state = CAC_PREL; - else if (CLE && ~ALE && Data==8'hA0 && ~PGD_ACT && ~XTREM_ACT - && ~FP_ACT) - next_state = XTREM_PREL; - else if (CLE) - next_state = UNKNOWN; - else - next_state = RD; - end - - CAC_PREL: - begin - if (ALE && ~FP_ACT) - next_state = A0_CAC; - else if (CLE && ~ALE && Data==8'hFF && ~FP_ACT) - next_state = RESET; - else if (CLE) - next_state = UNKNOWN; - end - - A0_CAC: - begin - if (ALE && ~FP_ACT) - next_state = A1_CAC; - else if (CLE && ~ALE && Data==8'hFF && ~FP_ACT) - next_state = RESET; - else if (CLE) - next_state = UNKNOWN; - end - - A1_CAC: - begin - if (CLE && ~ALE && Data==8'hE0 && ~FP_ACT) - next_state = RD; - else if (CLE && ~ALE && Data==8'hFF && ~FP_ACT) - next_state = RESET; - else if (CLE || ALE) - next_state = UNKNOWN; - end - - ID_PREL : - begin - if ( ALE && AddrCom==8'h00 && ~FP_ACT ) - next_state = ID; - else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT) - next_state = RESET; // reset - else if (CLE || ALE) - next_state = UNKNOWN; - end - - ID : - begin - if ( CLE && ~ALE && Data==8'h00 && ~FP_ACT ) - next_state = PREL_RD; - else if ( CLE && ~ALE && Data==8'h90 && ~FP_ACT ) - next_state = ID_PREL; - else if ( CLE && ~ALE && Data==8'h80 ) - next_state = PREL_PRG; - else if ( CLE && ~ALE && Data==8'h60 ) - next_state = PREL_ERS; - else if ( CLE && ~ALE && Data==8'h70 && ~XTREM_ACT ) - next_state = IDLE; - else if ( CLE && ~ALE && Data==8'h70 && XTREM_ACT && ~FP_ACT ) - next_state = XTREM_IDLE; - else if ( CLE && ~ALE && Data==8'hA0 && ~XTREM_ACT && ~FP_ACT) - next_state = XTREM_PREL; - else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) - next_state = RESET; // reset - else if (CLE || ALE) - next_state = UNKNOWN; - end - - PREL_PRG : - begin - if ( ALE ) - next_state = A0_PRG; - else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT) - next_state = RESET; // reset - else if (CLE) - next_state = UNKNOWN; - end - - A0_PRG : - begin - if ( ALE ) - next_state = A1_PRG; - else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT) - next_state = RESET; // reset - else if (CLE) - next_state = UNKNOWN; - end - - A1_PRG : - begin - if ( ALE ) - next_state = A2_PRG; - else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT) - next_state = RESET; // reset - else if (CLE) - next_state = UNKNOWN; - end - - A2_PRG : - begin - if ( ALE ) - next_state = A3_PRG; - else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT) - next_state = RESET; // reset - else if (CLE) - next_state = UNKNOWN; - end - - A3_PRG : - begin - if ( ALE ) - next_state = DATA_PRG; - else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT) - next_state = RESET; // reset - else if (CLE) - next_state = UNKNOWN; - end - - DATA_PRG : - begin - if ((ALE && (cnt_addr <2 || cnt_addr >= 5)) || - (CLE && ~ALE && cnt_addr > 5)) - next_state = UNKNOWN; - else if (CLE && ~ALE && Data==8'h10) - if (PRG_ACT) - next_state = WFPPD; // Waiting for programing done - else - next_state = PGMS; - else if (CLE && ~ALE && ~PGD_ACT && Data==8'h15) - if (PRG_ACT) - next_state = WFPD; // Waiting for programing done - else - next_state = CBSY; - else if (CLE && ~ALE && Data==8'h85) - next_state = PGMS_CAC; - else if (CLE && ~ALE && Data == 8'h12 && PGD_ACT && XTREM_ACT - && ~FP_ACT) - next_state = PGMS; - else if (CLE && ~ALE && Data==8'hFF) - next_state = RESET; // reset - else if (CLE) - next_state = UNKNOWN; - else if (~ALE && ~CLE && CWrAddr < PageSize+1) - next_state = DATA_PRG; // write next word to buffer - end - - WFPD: - begin - if (CLE && ~ALE && Data==8'hFF && ~FP_ACT) - next_state = RESET; // reset - end - - WFPPD: - begin - if (CLE && ~ALE && Data==8'hFF && ~FP_ACT) - next_state = RESET; // reset - end - - PGMS_CAC: - begin - if (CLE && ~ALE && Data==8'hFF && ~FP_ACT) - next_state = RESET; - else if (ALE) - next_state = A0_PRG_CAC; - else if (CLE) - next_state = UNKNOWN; - end - - PGMS : - begin - if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT) - next_state = RESET; // reset - end - - CBSY: - begin - if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) - next_state = RESET; // reset - end - - RDY_PRG : - begin - if ( CLE && ~ALE && Data==8'h80 ) - next_state = PREL_PRG; - else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT) - next_state = RESET; // reset - else if ( CLE && ~ALE && Data==8'h70 ) - next_state = RDY_PRG; // - else if ( CLE ) - next_state = UNKNOWN; // reset - end - - A0_PRG_CAC: - begin - if (ALE ) - next_state = DATA_PRG; - else if (CLE && ~ALE && Data==8'hFF && ~FP_ACT) - next_state = RESET; - else if ( CLE ) - next_state = UNKNOWN; // reset - end - - PREL_ERS : - begin - if ( ALE ) - next_state = A1_ERS; - else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) - next_state = RESET; // reset - else if ( CLE ) - next_state = UNKNOWN; // reset - end - - A1_ERS : - begin - if ( ALE ) - next_state = A2_ERS; - else if ( CLE && ~ALE && Data==8'hFF ) - next_state = RESET; // reset - else if ( CLE ) - next_state = UNKNOWN; // reset - end - - A2_ERS : - begin - if ( ALE ) - next_state = A3_ERS; - else if ( CLE && ~ALE && Data==8'hFF ) - next_state = RESET; // reset - else if ( CLE ) - next_state = UNKNOWN; // reset - end - - A3_ERS : - begin - if ( CLE && ~ALE && Data==8'hD0 ) - next_state = BERS_EXEC; - else if (CLE && ~ALE && XTREM_ACT && Data == 8'h11 - && ~FP_ACT) - next_state = PRE_PRG; - else if (CLE && ~ALE && Data == 8'h71 && ~FP_ACT) - next_state = BSTAT_INQ; //BUFF_TR; - else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) - next_state = RESET; // reset - else if ( CLE || ALE) - next_state = UNKNOWN; // reset - end - - BERS_EXEC : - begin - if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) - next_state = RESET; // reset - end - - PGD_PREL : - begin - if ( ALE ) - next_state = A0_PGD; - else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) - next_state = RESET; // reset - else if ( CLE ) - next_state = UNKNOWN; // reset - end - - A0_PGD : - begin - if ( ALE ) - next_state = A1_PGD; - else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) - next_state = RESET; // reset - else if ( CLE ) - next_state = UNKNOWN; // reset - end - - A1_PGD : - begin - if ( ALE ) - next_state = A2_PGD; - else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) - next_state = RESET; // reset - else if ( CLE ) - next_state = UNKNOWN; // reset - end - - A2_PGD : - begin - if ( ALE ) - next_state = A3_PGD; - else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) - next_state = RESET; // reset - else if ( CLE ) - next_state = UNKNOWN; // reset - end - - A3_PGD : - begin - if ( ALE ) - next_state = CONF_PGD; - else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT ) - next_state = RESET; // reset - else if ( CLE ) - next_state = UNKNOWN; // reset - end - - CONF_PGD : - begin - if ((ALE && cnt_addr >= 5) || (CLE && ~ALE && cnt_addr > 5)) - next_state = UNKNOWN; - else if ( CLE && ~ALE && Data==8'h10) - next_state = PGMS; - else if ( CLE && ~ALE && XTREM_ACT && Data==8'h12 && ~FP_ACT) - next_state = PGMS; - else if ( CLE && ~ALE && Data==8'h85) - next_state = PGMS_CAC; - else if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT) - next_state = RESET; // reset - else if ( CLE ) - next_state = UNKNOWN; // reset - end - BSTAT_INQ : - if ( CLE && ~ALE && Data==8'hFF && ~FP_ACT) - next_state = RESET; // reset - - endcase - end - - // RESET state, RSTDONE - always @(current_state, RSTDONE) - begin: StateGen1 - if (current_state == RESET && RSTDONE) - if (PRE) - next_state = RD; - else if (~XTREM_ACT) - next_state = IDLE; - else - next_state = XTREM_IDLE; - end - - always @(posedge reseted) - begin: StateGen1_1 - if (PRE) - next_state = RD; - else - next_state = IDLE; - end - - // BUFF_TR, TR_out - always @(current_state,read,BERS_out,XBERS_out,PROG_out,XPROG_out,TR_out, - DBSY_out, DBSY1_out, PROG1_out, XPROG1_out, - PROG2_out, XPROG2_out, BSTATINQ_out) - begin: StateGen2 - if (current_state == BUFF_TR) - if( TR_out) - next_state = RD; - if (current_state == BSTAT_INQ) - if( BSTATINQ_out) - next_state = RD; - end - - // CBSY - DBSY_out - always @(current_state,read,BERS_out,XBERS_out,PROG_out,XPROG_out,TR_out, - DBSY_out,DBSY1_out, PROG1_out, XPROG1_out, - PROG2_out, XPROG2_out) - begin: StateGen3 - if (current_state == CBSY && (DBSY_out || DBSY1_out)) - next_state = RDY_PRG; - end - - // WFPD,WFPPD,RDY_PRG - PROG_out - always @(current_state, BERS_out,XBERS_out,PROG_out,XPROG_out,TR_out, - DBSY_out, DBSY1_out, PROG1_out, XPROG1_out, - PROG2_out, XPROG2_out) - begin: StateGen5 - if (current_state == WFPD && (PROG1_out || XPROG1_out)) - next_state = CBSY; // programming done - else if (current_state == WFPPD && (PROG1_out || XPROG1_out)) - next_state = PGMS; // next start programing - else if (current_state == RDY_PRG && PROG1_out) - next_state = IDLE; - else if (current_state == RDY_PRG && XPROG1_out) - next_state = XTREM_IDLE; - end - - // PGMS - PROG_out - always @(posedge PROG_out ) - begin: StateGen5_1 - if (current_state == PGMS) - next_state = IDLE; // programming done - end - - // PRE_PRG - PRE_PROG_out - always @(posedge PRE_PROG_out ) - begin: StateGen5_2 - if (current_state == PRE_PRG) - next_state = XTREM_IDLE; // programming done - end - - // PGMS - XPROG_out - always @(posedge XPROG_out ) - begin: StateGen5_3 - if (current_state == PGMS) - next_state = XTREM_IDLE; // programming done - end - - // PGMS - PROG1_out - always @(posedge PROG2_out ) - begin: StateGen5_4 - if (current_state == PGMS) - next_state = IDLE; // programming done - end - - // PGMS - XPROG1_out - always @(posedge XPROG2_out ) - begin: StateGen5_5 - if (current_state == PGMS) - next_state = XTREM_IDLE; // programming done - end - - // BERS_EXEC, BERS_out - always @(current_state, BERS_out, - PROG_out, TR_out, DBSY_out) - begin: StateGen6_1 - if (current_state == BERS_EXEC && BERS_out) - next_state = IDLE; - end - - // BERS_EXEC, XBERS_out - always @(current_state, XBERS_out, - PROG_out, XPROG_out, TR_out, DBSY_out) - begin: StateGen6_2 - if (current_state == BERS_EXEC && XBERS_out) - next_state = XTREM_IDLE; - end - - always @(posedge STAT_ACT) - begin - statread = 1'b1; - nostatread = 1'b0; - end - - always @(negedge STAT_ACT) - begin - statread = 1'b0; - nostatread = 1'b1; - end - - /////////////////////////////////////////////////////////////////////////// - //FSM Output generation and general funcionality - /////////////////////////////////////////////////////////////////////////// - always @(posedge read) - begin - ->oe_event; - end - - always @(oe_event) - begin - oe = 1'b1; - #1 oe = 1'b0; - end - - always @( posedge oe) - begin: Output - case (current_state) - - RD : - begin - if (~PGD_ACT && ~STAT_ACT && ~STAT_M_ACT) - Read_Data(Address,PageAddr,BlockAddr); - else if (~PGD_ACT && ~STAT_ACT && STAT_M_ACT) - Read_StatMode(Blck); - else if (STAT_ACT) - Read_Status(Blck); - end - - ID : - begin - if ( IDAddr < 5 ) - begin - DOut_zd = IDArray[IDAddr]; - IDAddr = IDAddr+1; - end - else - DOut_zd = 'bz; - end - - IDLE , - XTREM_IDLE , - WFPD , - WFPPD , - PGMS , - CBSY , - PRE_PRG , - BUFF_TR , - RDY_PRG , - BERS_EXEC : - begin - if (STAT_ACT) - Read_Status(Blck); - end - endcase - end - - always @(WPNeg_ipd) - begin - Status[7] = WPNeg_ipd; - end - - always @(negedge write) - begin: Func0 - if (~reseted) - R_zd = 1'b1; - else if (reseted) - case (current_state) - IDLE, XTREM_IDLE : - begin - if ( CLE && ~ALE && (Data==8'h00 || Data==8'h60)) - begin - STAT_ACT = 1'b0; - Status[6:3] = 4'b1100; - Status[1:0] = 2'b00; - end - else if ( CLE && ~ALE && Data==8'h70 ) - begin - STAT_ACT = 1'b1; - end - else if (CLE && ~ALE && (Data==8'h80 || Data==8'h90)) - begin - STAT_ACT = 1'b0; - end - else if (CLE && ~ALE && Data==8'h85 && PGD_ACT) - begin - STAT_ACT = 1'b0; - Status[6:3] = 4'b1100; - Status[1:0] = 2'b00; - end - else if ( CLE && ~ALE && Data==8'hFF ) - set_reset; - end - - XTREM_PREL : - begin - if ( CLE && ~ALE && Data == 8'hA0) - XTREM_ACT = 1'b1; - else if ( CLE && ~ALE && Data==8'hFF ) - set_reset; - end - - UNKNOWN: - begin - if (CLE && ~ALE && Data==8'hFF) - begin - ERS_ACT = 1'b0; - PGD_ACT = 1'b0; - RD_ACT = 1'b0; - PGR_ACT = 1'b0; - Status[6:3] = 4'b1100; - Status[1:0] = 2'b00; - set_reset; - end - end - - PREL_RD: - begin - if (ALE) - begin - Pom_Address = AddrCom; - cnt_addr = 0; - end - else if (CLE && ~ALE && Data==8'hFF) - set_reset; - end - - A0_RD : - begin - if ( ALE ) - begin - Pom_Address = (AddrCom* 12'h100) + Pom_Address; - cnt_addr = cnt_addr + 1; - end - else if ( CLE && ~ALE && Data==8'hFF ) - set_reset; - end - - A1_RD : - begin - if ( ALE ) - begin - if ( XTREM_ACT ) - Page = AddrCom * 2; - else - Page = AddrCom; - cnt_addr = cnt_addr + 1; - end - else if ( CLE && ~ALE && Data==8'hFF ) - set_reset; - end - - A2_RD : - begin - if ( ALE ) - begin - Blck = AddrCom; - cnt_addr = cnt_addr + 1; - end - else if ( CLE && ~ALE && Data==8'hFF ) - set_reset; - end - - A3_RD : - begin - if ( ALE ) - begin - Blck = Blck + (AddrCom*12'h100); - cnt_addr = cnt_addr + 1; - end - else if ( CLE && ~ALE && Data==8'hFF ) - set_reset; - end - - RD_WCMD: - begin - if (CLE && ~ALE && Data==8'h30) - begin - PGR_ACT = 1'b1; - Address = Pom_Address; - PageAddr = Blck*(BlockSize + 1) + Page; - BlockAddr = Blck; - TR_in = 1'b1; - R_zd = 1'b0; - Status[6:5] = 2'b00; - end - else if( CLE && ~ALE && Data==8'h35) - begin - PGD_ACT = 1'b1; - PMOVE = 1'b1; - TR_in = 1'b1; - R_zd = 1'b0; - Status[6:5] = 2'b00; - Address = Pom_Address; - PageAddr = Blck*(BlockSize + 1) + Page; - for (i=0; i<=PageSize; i=i+1) - begin - PDBuffer[i] = -1; - PDBuffer1[i] = -1; - end - end - else if(CLE && ~ALE && Data==8'hFF) - set_reset; - else if (ALE) - cnt_addr = cnt_addr + 1; - end - - BUFF_TR : - begin - if ( CLE && ~ALE && Data==8'hFF ) - begin - TR_in = 1'b0; - DBSY_in = 1'b0; - if (XTREM_ACT) - back_to_xtrem = 1'b1; - else - back_to_xtrem = 1'b0; - set_reset; - end - else if ( CLE && ~ALE && Data==8'h70 ) - STAT_ACT = 1'b1; - end - - RD : - begin - if ( CLE && ~ALE && Data==8'h00 && ~PGD_ACT) - begin - Status[6:3] = 4'b1100; - Status[1:0] = 2'b00; - PGR_ACT = 1'b0; - STAT_ACT = 1'b0; - STAT_M_ACT = 1'b0; - end - else if ( CLE && ~ALE && Data==8'h70) - begin - STAT_ACT = 1'b1; - STAT_M_ACT = 1'b0; - PGR_ACT = 1'b0; - end - else if ( CLE && ~ALE && Data==8'h90 && ~PGD_ACT) - begin - STAT_ACT = 1'b0; - STAT_M_ACT = 1'b0; - PGR_ACT = 1'b0; - end - else if ( CLE && ~ALE && Data==8'h80 && ~PGD_ACT) - begin - STAT_ACT = 1'b0; - STAT_M_ACT = 1'b0; - PGR_ACT = 1'b0; - Status[6:3] = 4'b1100; - Status[1:0] = 2'b00; - end - else if ( CLE && ~ALE && Data==8'hA0 && ~PGD_ACT) - begin - STAT_ACT = 1'b0; - STAT_M_ACT = 1'b0; - Status[6:3] = 4'b1100; - Status[1:0] = 2'b00; - end - else if ( CLE && ~ALE && Data==8'h60 && ~PGD_ACT) - begin - STAT_ACT = 1'b0; - STAT_M_ACT = 1'b0; - PGR_ACT = 1'b0; - Status[6:3] = 4'b1100; - Status[1:0] = 2'b00; - end - else if ( CLE && ~ALE && Data==8'hFF ) - begin - set_reset; - STAT_M_ACT = 1'b0; - end - else if ( CLE && ~ALE && Data==8'h85 && PGD_ACT) - begin - STAT_ACT = 1'b0; - STAT_M_ACT = 1'b0; - Status[6:3] = 4'b1100; - Status[1:0] = 2'b00; - end - else if ( CLE && ~ALE && Data==8'h05 && ~PGD_ACT) - begin - STAT_ACT = 1'b0; - STAT_M_ACT = 1'b0; - Status[6:3] = 4'b1100; - Status[1:0] = 2'b00; - end - end - - CAC_PREL: - begin - if( ALE ) - begin - Pom_Address = AddrCom; - cnt_addr = 0; - end - else if( CLE && ~ALE && Data==8'hFF) - set_reset; - end - - A0_CAC: - begin - if (ALE) - begin - Pom_Address = Pom_Address + AddrCom * 12'h100; - cnt_addr = cnt_addr + 1; - end - else if (CLE && ~ALE && Data==8'hFF) - set_reset; - end - - A1_CAC: - begin - if (CLE && ~ALE && Data==8'hE0) - Address = Pom_Address; - else if (CLE && ~ALE && Data==8'hFF) - set_reset; - else if (ALE) - cnt_addr = cnt_addr + 1; - end - - ID_PREL : - begin - if ( ALE && AddrCom==8'h00 ) - IDAddr = 0; - else if ( CLE && ~ALE && Data==8'hFF ) - set_reset; - end - - ID : - begin - if ( CLE && ~ALE && Data==8'hFF ) - set_reset; - else if ( CLE && ~ALE && Data==8'h70 ) - STAT_ACT = 1'b1; - else if ( CLE && ~ALE && Data==8'h00 ) - STAT_ACT = 1'b0; - end - - PREL_PRG : - begin - if ( ALE ) - begin - CWrAddr = AddrCom; - cnt_addr = 0; - end - else if ( CLE && ~ALE && Data==8'hFF ) - set_reset; - end - - A0_PRG : - begin - if ( ALE ) - begin - CWrAddr = (AddrCom * 12'h100)+CWrAddr; - cnt_addr = cnt_addr + 1; - for(i=0; i<=PageSize; i=i+1) - CashBuffData[i]=-1; - end - else if ( CLE && ~ALE && Data==8'hFF ) - set_reset; - end - - A1_PRG : - begin - if ( ALE ) - begin - if ( XTREM_ACT ) - Page = AddrCom * 2; - else - Page = AddrCom; - - cnt_addr = cnt_addr + 1; - end - else if ( CLE && ~ALE && Data==8'hFF ) - set_reset; - end - - A2_PRG : - begin - if ( ALE ) - begin - Blck = AddrCom; - cnt_addr = cnt_addr + 1; - end - else if ( CLE && ~ALE && Data==8'hFF ) - set_reset; - end - - A3_PRG : - begin - if ( ALE ) - begin - Blck = (AddrCom*12'h100) + Blck; - Page_pom = Page + Blck*(BlockSize+1); - CWrPage = Page + Blck*(BlockSize+1); - getSegment(CWrAddr,segment); - cnt_addr = cnt_addr + 1; - for(i=0; i<= SegmentNum; i=i+1) - begin - CSegForProg[i] = ProgramedFlag[ - (SegmentNum+1)*Page_pom + i]; - CSegForProg1[i] = ProgramedFlag[ - (SegmentNum+1)*(Page_pom+1) + i]; - end - end - else if ( CLE && ~ALE && Data==8'hFF ) - set_reset; - end - - DATA_PRG : - begin - if (CLE && ~ALE && Data==8'hFF) - set_reset; - else if (~ALE && ~CLE && CWrAddr < PageSize+1) - begin - if (~XTREM_ACT) - begin - getSegment(CWrAddr,segment); - if (~ProgramedFlag[(SegmentNum+1)*CWrPage + segment]) - CashBuffData[CWrAddr] = Data; - CSegForProg[segment] = 1'b1; - end - else - begin - Page_pom = Page + Blck*(BlockSize+1); - XgetSegment(CWrAddr,segment,segment1); - if (~ProgramedFlag[(SegmentNum+1)*(Page_pom)+segment] - && ~ProgramedFlag[(SegmentNum+1)*(Page_pom)+segment1] - && ~PGD_ACT) - CashBuffData[CWrAddr] = Data; - else if (~ProgramedFlag[(SegmentNum+1)* - (Page_pom)+segment] && PGD_ACT && - ~ProgramedFlag[(SegmentNum+1)*(Page_pom)+segment1]) - XTR_Buffdata(CWrAddr,Data); - if (Page_pom > CWrPage) - begin - CSegForProg1[segment] = 1; - CSegForProg1[segment1] = 1; - end - else if (Page_pom == CWrPage) - begin - CSegForProg[segment] = 1; - CSegForProg[segment1] = 1; - end - end - Page_pom = Page + Blck*(BlockSize+1); - CWrAddr = CWrAddr+1; - end - else if (CLE && ~ALE && Data==8'h10) - begin - R_zd = 1'b0; - Status[5] = 1'b0; - //part of the FlagGeneration process - if (~PRG_ACT) - begin - CWrPage = Page + Blck*(BlockSize+1); - PRG_ACT = 1'b1; - if (~XTREM_ACT) - PROG_in = 1'b1; - else - XPROG_in = 1'b1; - end - firstFlag = 1'b1; - ProgBlock[Blck] = 1; - end - else if (CLE && ~ALE && Data==8'h12) - begin - if (PGD_ACT) - CWrPage = Page/2 + Blck*(BlockSize+1); - if (~PRG_ACT) - begin - PRG_ACT = 1'b1; - if (XTREM_ACT) - XPROG_in = 1'b1; - end - R_zd = 1'b0; - Status[5] = 1'b0; - XTR_MPRG = 1'b1; - firstFlag = 1'b1; - ProgBlock[Blck] = 1; - end - else if( CLE && ~ALE && ~PGD_ACT && Data==8'h15) - begin - if (~PRG_ACT) - begin - DBSY_in = 1'b1; - CWrPage = Page + Blck*(BlockSize+1); - end - R_zd = 1'b0; - Status[6] = 1'b0; - firstFlag = 1'b1; - ProgBlock[Blck] = 1; - end - else if (ALE) - cnt_addr = cnt_addr + 1; - end - - PGMS_CAC: - begin - if (ALE) - begin - CWrAddr = AddrCom; - cnt_addr = 0; - end - else if (CLE && ~ALE && Data==8'hFF) - set_reset; - end - - A0_PRG_CAC: - begin - if (ALE) - begin - CWrAddr = (AddrCom * 12'h100)+CWrAddr; - cnt_addr = cnt_addr + 1; - end - else if (CLE && ~ALE && Data==8'hFF) - set_reset; - end - - WFPD: - begin - if (CLE && ~ALE && Data==8'hFF) - begin - set_reset; - if (XTREM_ACT) - back_to_xtrem = 1'b1; - else - back_to_xtrem = 1'b0; - if (XTREM_ACT && ~PGD_ACT) - XTR_Pgms_init(WrPage); - end - else if (CLE && ~ALE && Data==8'h70) - STAT_ACT = 1'b1; - end - - WFPPD: - begin - if (CLE && ~ALE && Data==8'hFF) - begin - set_reset; - if (XTREM_ACT) - back_to_xtrem = 1'b1; - else - back_to_xtrem = 1'b0; - if (XTREM_ACT && ~PGD_ACT) - XTR_Pgms_init(WrPage); - // part of the FlagGeneration process - if(~PROG1_out) - begin - PROG1_in = 1'b0; - end - if(~XPROG1_out) - begin - XPROG1_in = 1'b0; - end - end - else if (CLE && ~ALE && Data==8'h70) - STAT_ACT = 1'b1; - end - - PRE_PRG : - begin - if (CLE && ~ALE && Data==8'hFF) - begin - if (~(WPNeg==1'b0)) - begin - for(i = Blck *(BlockSize+1) *(PageSize+1); - i < (Blck+1)*(BlockSize+1) *(PageSize+1); - i=i+1) - Mem[i] = -1; - InvBlock[Blck] = 1; - end - PRE_PROG_in = 1'b0; - set_reset; - end - else if (CLE && ~ALE && Data==8'h70) - STAT_ACT = 1; // read status - end - - PGMS : - begin - if ( CLE && ~ALE && Data==8'hFF ) - begin - set_reset; - InvBlockPgms[Blck] = 1; - if (XTREM_ACT) - back_to_xtrem = 1'b1; - else - back_to_xtrem = 1'b0; - if (XTREM_ACT && ~PGD_ACT) - XTR_Pgms_init(WrPage); - end - else if ( CLE && ~ALE && Data==8'h70 ) - STAT_ACT = 1'b1; - end - - CBSY : - begin - if ( CLE && ~ALE && Data==8'h70 ) - STAT_ACT = 1'b1; - else if ( CLE && ~ALE && Data==8'hFF ) - begin - set_reset; - if (XTREM_ACT) - back_to_xtrem = 1'b1; - else - back_to_xtrem = 1'b0; - DBSY_in = 1'b0; - DBSY1_in = 1'b0; - end - end - - RDY_PRG : - begin - if ( CLE && ~ALE && Data==8'h70 ) - STAT_ACT = 1'b1; - else if (CLE && ~ALE && Data==8'hFF) - begin - set_reset; - if (XTREM_ACT) - back_to_xtrem = 1'b1; - else - back_to_xtrem = 1'b0; - if (XTREM_ACT && ~PGD_ACT) - XTR_Pgms_init(WrPage); - end - end - - PREL_ERS : - begin - if ( ALE ) - begin - Page = AddrCom; - cnt_addr = 0; - end - else if ( CLE && ~ALE && Data==8'hFF ) - set_reset; - end - - A1_ERS : - begin - if ( ALE ) - begin - Blck = AddrCom; - cnt_addr = cnt_addr + 1; - end - else if ( CLE && ~ALE && Data==8'hFF ) - set_reset; - end - - A2_ERS : - begin - if ( ALE ) - begin - Blck = Blck + (AddrCom*12'h100); - WrPage = Page + Blck*(BlockSize+1); - cnt_addr = cnt_addr + 1; - end - else if ( CLE && ~ALE && Data==8'hFF ) - set_reset; - end - - A3_ERS : - begin - if ( CLE && ~ALE && Data==8'hFF ) - set_reset; - else if ( CLE && ~ALE && Data==8'hD0 ) - begin - if (~(WPNeg==1'b0)) - begin - for(i = Blck *(BlockSize+1) *(PageSize+1); - i < (Blck+1)*(BlockSize+1) *(PageSize+1); - i=i+1) - Mem[i] = -1; - end - if (~XTREM_ACT) - BERS_in = 1'b1; - else - XBERS_in = 1'b1; - ERS_ACT = 1'b1; - R_zd = 1'b0; - Status[6:5] = 2'b00; - end - else if ( CLE && ~ALE && XTREM_ACT && Data==8'h11 ) - begin - PRE_PROG_in = 1'b1; - PRG_ACT = 1'b1; - R_zd = 1'b0; - Status[6:5] = 2'b00; - end - else if ( CLE && ~ALE && Data==8'h71 ) - begin - STAT_M_ACT = 1'b1; - BSTATINQ_in = 1'b1; - R_zd = 1'b0; - Status[6:5] = 2'b00; - end - else if (ALE) - cnt_addr = cnt_addr + 1; - end - - BERS_EXEC : - begin - if ( CLE && ~ALE && Data==8'hFF ) - begin - BERS_in = 1'b0; - XBERS_in = 1'b0; - set_reset; - if (XTREM_ACT) - back_to_xtrem = 1'b1; - else - back_to_xtrem = 1'b0; - InvBlock[Blck] = 1; - end - else if ( CLE && ~ALE && Data==8'h70 ) - STAT_ACT = 1'b1; - end - - PGD_PREL : - begin - if (ALE) - begin - Pom_Address = AddrCom; - cnt_addr = 0; - PGD_ACT = 1'b1; - PMOVE = 1'b0; - end - else if( CLE && ~ALE && Data==8'hFF) - set_reset; - end - - A0_PGD: - begin - if (ALE) - begin - Pom_Address = (AddrCom* 12'h100) + Pom_Address; - CWrAddr = Pom_Address; - cnt_addr = cnt_addr + 1; - end - else if (CLE && ~ALE && Data==8'hFF) - set_reset; - end - - A1_PGD : - begin - if ( ALE ) - begin - Page = AddrCom; - cnt_addr = cnt_addr + 1; - end - else if (CLE && ~ALE && Data==8'hFF ) - set_reset; - end - - A2_PGD : - begin - if ( ALE ) - begin - Blck = AddrCom; - cnt_addr = cnt_addr + 1; - end - else if (CLE && ~ALE && Data==8'hFF ) - set_reset; - end - - A3_PGD : - begin - if ( ALE ) - begin - Blck = Blck + (AddrCom*12'h100); - cnt_addr = cnt_addr + 1; - BlckDup = Blck; - end - else if (CLE && ~ALE && Data==8'hFF ) - set_reset; - end - - CONF_PGD : - begin - if (CLE && ~ALE && (Data==8'h10 || Data==8'h12 || Data==8'h85)) - begin - if (~XTREM_ACT) - for (i=0; i<=PageSize; i=i+1) - CashBuffData[i] = PDBuffer[i]; - else - begin - for (i=0; i<=PageSize; i=i+1) - begin - CashBuffData[i] = PDBuffer[i]; - CashBuffData1[i] = PDBuffer1[i]; - end - end - for(i=0; i<= SegmentNum; i=i+1) - CSegForProg[i]=1'b1; - if (Data == 8'h12 && XTREM_ACT) - begin - XTR_MPRG = 1'b1; - Page =Page/2; - end - else - XTR_MPRG = 1'b0; - CWrPage = Page + Blck*(BlockSize+1); - end - if (CLE && ~ALE && (Data==8'h10 || Data==8'h12) && ~PRG_ACT) - begin - PRG_ACT = 1'b1; - if (~XTREM_ACT) - PROG_in = 1'b1; - else - begin - if (BlockMod[BlckDup]==0) - PROG_in = 1'b1; - else - XPROG_in = 1'b1; - end - ProgBlock[Blck] = 1; - firstFlag = 1'b1; - R_zd = 1'b0; - Status[5] = 1'b0; - end - else if ( CLE && ~ALE && Data==8'hFF) - set_reset; - else if (ALE) - cnt_addr = cnt_addr + 1; - end - - endcase - end - - always @(TR_out, DBSY_out,PROG_out,XPROG_out ) - begin : Func0_2 - if ((TR_out || DBSY_out || PROG_out || XPROG_out) && read && STAT_ACT) - Read_Status(Blck); - end - - //after reset, state is don't care - always @(posedge reseted) - begin: Func0_1 - if (reseted) - if (PRE) - begin - Address = 1'b0; - PageAddr= 1'b0; - PGR_ACT = 1'b1; - end - else - PGR_ACT = 1'b0; - end - - //RESET state, RSTDONE - always @(current_state, read, write, BERS_out, XBERS_out, - PROG_out, XPROG_out,TR_out,DBSY_out,RSTDONE,PROG1_out,XPROG1_out, - PROG2_out,XPROG2_out,DBSY1_out) - begin: Func1 - if (current_state == RESET) - begin - if (~back_to_xtrem) - XTREM_ACT = 1'b0; - else - XTREM_ACT = 1'b1; - if (RSTDONE) - begin - STAT_ACT = 1'b0; - ERS_ACT = 1'b0; - RD_ACT = 1'b0; - PGD_ACT = 1'b0; - PGR_ACT = 1'b1; - PRG_ACT = 1'b0; - STAT_M_ACT = 1'b0; - PMOVE = 1'b0; - XTR_MPRG = 1'b0; - R_zd = 1'b1; - Status[6:3] = 4'b1100; - Status[1:0] = 2'b00; - if (PRE) - begin - Address = 1'b0; - PageAddr= 1'b0; - PGR_ACT = 1'b1; - end - else - PGR_ACT = 1'b0; - end - end - end - - always @(current_state, read, write, BERS_out, XBERS_out, - PROG_out, XPROG_out,TR_out,DBSY_out,RSTDONE,PROG1_out,XPROG1_out, - PROG2_out,XPROG2_out,DBSY1_out) - begin: Func2_1 - if (current_state == XTREM_IDLE && ~XPROG_in) - begin - PGD_ACT = 1'b0; - XTR_MPRG = 1'b0; - end - end - - //BUFF_TR state, TR_out - always @(read, Data, AddrCom, current_state,PROG1_out,XPROG1_out,PROG2_out, - XPROG2_out, RENeg, CENeg, ALE, CLE, BERS_out,XBERS_out, PROG_out, - XPROG_out, TR_out, DBSY_out, WPNeg, PGD_ACT,DBSY1_out) - begin: Func2_2 - if (current_state == BUFF_TR && TR_out) - begin - if (PGD_ACT && ~XTREM_ACT) - for (i=0; i<=PageSize; i=i+1) - PDBuffer[i] = Mem[PageAddr*(PageSize+1)+i]; - else if (PGD_ACT && XTREM_ACT) - for (i=0; i<=PageSize; i=i+1) - begin - PDBuffer[i] = Mem[PageAddr*(PageSize+1)+i]; - PDBuffer1[i] = Mem[(PageAddr+1)*(PageSize+1)+i]; - end - R_zd = 1'b1; - Status[6:5]= 2'b11; - TR_in = 1'b0; - end - end - - always @(read, Data, AddrCom, reseted, current_state, - RENeg, CENeg, ALE, CLE, BERS_out,XBERS_out, PROG_out,XPROG_out, - DBSY_out, WPNeg, PGD_ACT,PROG1_out,XPROG1_out) - begin : Func3_1 - if(current_state==WFPD && PROG1_out) - begin - DBSY1_in = 1'b1; - CWrPage = Page + Blck*(BlockSize+1); - Status[5] = 1'b1; - end - else if(current_state==WFPPD && PROG1_out) - begin - PROG2_in = 1'b1; - PROG1_in = 1'b0; - if (WPNeg) - begin - for (j=0;j<=PageSize; j=j+1) - begin - getSegment(j,pom_seg); - if (WrBuffData[j] != -1 && - ~ProgramedFlag[WrPage*(SegmentNum+1)+pom_seg]) - begin - Mem[WrPage*(PageSize+1)+j] = WrBuffData[j]; - WrBuffData[j]=-1; - end - end - for (j=0;j<=SegmentNum; j=j+1) - ProgramedFlag[WrPage*(SegmentNum+1)+j]= SegForProg[j]; - CWrPage = Page + Blck*(BlockSize+1); - Status[5] = 1'b0; - end - end - end - - always @(read, Data, AddrCom, reseted, current_state, - RENeg, CENeg, ALE, CLE, BERS_out,XBERS_out, PROG_out,XPROG_out, - DBSY_out, WPNeg, PGD_ACT,PROG1_out,XPROG1_out) - begin : Func3_2 - if(current_state==WFPD && XPROG1_out) - begin - DBSY1_in = 1'b1; - CWrPage = Page + Blck*(BlockSize+1); - Status[5] = 1'b1; - end - else if(current_state==WFPPD && XPROG1_out) - begin - XPROG2_in = 1'b1; - XPROG1_in = 1'b0; - if (WPNeg) - begin - for (j=0;j<=PageSize; j=j+1) - begin - Page_pom = WrPage; - XgetSegment(j,pom_seg,pom_seg1); - if (WrBuffData[j] != -1 && - ~ProgramedFlag[Page_pom*(SegmentNum+1)+pom_seg] && - ~ProgramedFlag[Page_pom*(SegmentNum+1)+pom_seg1]) - begin - XTR_Pgms_data(j,WrPage); - end - end - for (j=0; j<=SegmentNum; j=j+1) - begin - ProgramedFlag[WrPage*(SegmentNum+1)+j]= SegForProg[j]; - ProgramedFlag[(WrPage+1)*(SegmentNum+1)+j]= SegForProg1[j]; - end - CWrPage = Page + Blck*(BlockSize+1); - Status[5] = 1'b0; - end - end - end - - //PGMS state,WPNeg - always @(current_state) - begin: Func4 - integer i,j,k; - if (current_state==PGMS ) - begin - if ( WPNeg && firstFlag) - begin - firstFlag = 1'b0; - for (i=0; i<=PageSize; i=i+1) - begin - WrBuffData[i] = CashBuffData[i]; - WrBuffData1[i] = CashBuffData1[i]; - end - WrPage = CWrPage; - WrAddr = CWrAddr; - for(i=0;i<=SegmentNum;i=i+1) - begin - SegForProg[i]=CSegForProg[i]; - SegForProg1[i]=CSegForProg1[i]; - end - if (~XTREM_ACT) - begin - for(i=0;i<=PageSize;i=i+1) - begin - getSegment(i,segment); - if ( CashBuffData[i] != -1 && - ProgramedFlag[CWrPage*(SegmentNum+1) + segment]== 0) - Mem[CWrPage*(PageSize+1)+i]= -1; - end - end - else if (XTR_MPRG) - begin - for (i=0;i<=PageSize;i=i+1) - begin - getSegment(i,segment); - if ( CashBuffData[i] != -1 && - ProgramedFlag[CWrPage*(SegmentNum+1) + segment]== 0) - Mem[CWrPage*(PageSize+1)+i]= -1; - end - end - else if (PGD_ACT) - begin - for (i=0;i<=PageSize;i=i+1) - begin - Page_pom = CWrPage; - XgetSegment(i,pom_seg,pom_seg1); - if (ProgramedFlag[CWrPage*(SegmentNum+1)+pom_seg] ==0 - && ProgramedFlag[CWrPage*(SegmentNum+1)+pom_seg1] ==0 - && CashBuffData[i] != -1) - Mem[CWrPage*(PageSize+1)+i]= -1; - if (ProgramedFlag[(CWrPage+1)*(SegmentNum+1)+ - pom_seg]==0 && CashBuffData1[i] != -1 && - ProgramedFlag[(CWrPage+1)*(SegmentNum+1)+ - pom_seg1]==0) - Mem[(CWrPage+1)*(PageSize+1)+i]= -1; - end - end - end - end - end - - always @(BSTATINQ_out) - begin - if (current_state == BSTAT_INQ) - begin - if (BSTATINQ_out) - begin - R_zd = 1'b1; - Status [6:5] = "11"; - BSTATINQ_in = 1'b0; - end - end - end - - //PGMS state,PROG_out - always @(posedge PROG_out) - begin: Func5_1 - if (current_state==PGMS ) - begin - PGD_ACT <= #1 1'b0; - R_zd = 1'b1; - end - end - - //PGMS state,XPROG_out - always @(posedge XPROG_out) - begin: Func5_2 - if (current_state==PGMS ) - begin - R_zd = 1'b1; - end - end - - //PGMS state,PROG2_out - always @(posedge PROG2_out) - begin: Func5_3 - if (current_state==PGMS ) - R_zd = 1'b1; - end - - //PGMS state,XPROG2_out - always @(posedge XPROG2_out) - begin: Func5_4 - if (current_state==PGMS ) - R_zd = 1'b1; - end - - //RDY_PRG state,PROG1_out - always @(posedge PROG1_out) - begin: Func5_5 - if (current_state==RDY_PRG ) - R_zd = 1'b1; - end - - //RDY_PRG state,XPROG1_out - always @(posedge XPROG1_out) - begin: Func5_6 - if (current_state==RDY_PRG ) - R_zd = 1'b1; - end - - //CBSY state, firstFlag - always @(current_state,PROG1_out,XPROG1_out,PROG2_out,XPROG2_out, - PROG_out, XPROG_out, DBSY_out, firstFlag,DBSY1_out) - begin: Func6 - if (current_state == CBSY ) - if (firstFlag) - begin - firstFlag=1'b0; - Status[6] = 1'b0; - end - end - //CBSY state, WPNeg - always @(current_state,PROG1_out,XPROG1_out,PROG2_out,XPROG2_out, - PROG_out, XPROG_out,DBSY_out, WPNeg,firstFlag,DBSY1_out) - begin: Func6_0 - if (current_state == CBSY ) - if (WPNeg && (DBSY1_out||DBSY_out)) - for( i=0; i<= PageSize; i=i+1) - if( CashBuffData[i] != -1) - Mem[CWrPage*(PageSize+1)+i]= -1; - end - - //CBSY state, DBSY_out - always @(posedge DBSY_out) - begin: Func6_1 - if (current_state == CBSY ) - begin - Status[6] = 1'b1; - R_zd = 1'b1; - DBSY_in = 1'b0; - for( i=0; i<= PageSize; i=i+1) - WrBuffData[i] = CashBuffData[i]; - WrPage = CWrPage; - WrAddr = CWrAddr; - for(i=0;i<=SegmentNum;i=i+1) - SegForProg[i]=CSegForProg[i]; - end - end - - //CBSY state, DBSY1_out - always @(posedge DBSY1_out) - begin: Func6_2 - if (current_state == CBSY ) - begin - Status[6] = 1'b1; - R_zd = 1'b1; - DBSY1_in = 1'b0; - for( i=0; i<= PageSize; i=i+1) - WrBuffData[i] = CashBuffData[i]; - WrPage = CWrPage; - WrAddr = CWrAddr; - for(i=0;i<=SegmentNum;i=i+1) - SegForProg[i]=CSegForProg[i]; - end - end - - //BERS_EXEC state BERS_out - always @(Data, AddrCom, current_state, - RENeg, CENeg, ALE, CLE, BERS_out, PROG_out, - TR_out, DBSY_out, WPNeg) - begin: Func7_0 - integer i,j,k; - if (current_state==BERS_EXEC && BERS_out) - begin - for(i = Blck *(BlockSize+1) *(PageSize+1); - i < (Blck+1)*(BlockSize+1) *(PageSize+1); - i=i+1) - Mem[i] = MaxData; - for(i = Blck *(BlockSize+1) *(SegmentNum+1); - i < (Blck+1)*(BlockSize+1) *(SegmentNum+1); - i=i+1) - ProgramedFlag[i] = 1'b0; - InvBlock[Blck] = 0; - BlockMod[Blck] = 0; - PreProgFlag[Blck] = 0; - ProgBlock[Blck] = 0; - InvBlockPgms[Blck] = 0; - BERS_in = 1'b0; - ERS_ACT = 1'b0; - R_zd = 1'b1; - Status[6:5] = 2'b11; - end - end - - //BERS_EXEC state XBERS_out - always @(Data, AddrCom, current_state, - RENeg, CENeg, ALE, CLE, XBERS_out, XPROG_out, - TR_out, DBSY_out, WPNeg) - begin: Func7_1 - integer i,j,k; - if (current_state==BERS_EXEC && XBERS_out) - begin - for(i = Blck *(BlockSize+1) *(PageSize+1); - i < (Blck+1)*(BlockSize+1) *(PageSize+1); - i=i+1) - Mem[i] = MaxData; - for(i = Blck *(BlockSize+1) *(SegmentNum+1); - i < (Blck+1)*(BlockSize+1) *(SegmentNum+1); - i=i+1) - ProgramedFlag[i] = 1'b0; - InvBlock[Blck] = 0; - BlockMod[Blck] = 1; - ProgBlock[Blck] = 0; - InvBlockPgms[Blck] = 0; - XBERS_in = 1'b0; - ERS_ACT = 1'b0; - R_zd = 1'b1; - Status[6:5] = 2'b11; - end - end - - always @(current_state) - begin: Func8_1 - if (current_state == IDLE | current_state == XTREM_IDLE | - current_state == RD) - begin - back_to_xtrem = 1'b0; - end - else if (current_state == PRE_PRG ) - begin - back_to_xtrem = 1'b1; - end - end - - /////////////////////////////////////////////////////////////////////////// - //FlagGeneration - /////////////////////////////////////////////////////////////////////////// - always @(posedge DBSY_out) - begin - PRG_ACT = 1'b1; - PROG1_in = ~XTREM_ACT; - XPROG1_in = XTREM_ACT; - Status[6:5] = 2'b10; - end - always @(posedge DBSY1_out) - begin - PRG_ACT = 1'b1; - PROG1_in = ~XTREM_ACT; - XPROG1_in = XTREM_ACT; - Status[6:5] = 2'b10; - end - - always @(posedge PROG_out or posedge XPROG_out or posedge PROG1_out or - posedge XPROG1_out or posedge PROG2_out or posedge XPROG2_out) - begin - if( current_state==PGMS || current_state==PREL_PRG - || current_state==A0_PRG || current_state==A1_PRG - || current_state==A2_PRG || current_state==DATA_PRG - || current_state==PGMS_CAC || current_state==A0_PRG_CAC - || current_state==WFPD || current_state==RDY_PRG - || current_state==CBSY || current_state==UNKNOWN) - begin - PRG_ACT = 1'b0; - Status[5] = 1'b1; - PROG_in = 1'b0; - XPROG_in = 1'b0; - PROG1_in = 1'b0; - XPROG1_in = 1'b0; - PROG2_in = 1'b0; - XPROG2_in = 1'b0; - if( WPNeg && ~XTREM_ACT && InvBlock[WrPage/(BlockSize+1)] == 0) - begin - for( j=0; j<=PageSize; j=j+1) - begin - getSegment(j,pom_seg); - if( WrBuffData[j] != -1 && - ProgramedFlag[WrPage*(SegmentNum+1) + pom_seg]== 0 ) - begin - Mem[WrPage*(PageSize+1)+j]= WrBuffData[j]; - WrBuffData[j]=-1; - end - end - for( j=0; j<=SegmentNum; j=j+1) - ProgramedFlag[WrPage*(SegmentNum+1) + j] = SegForProg[j]; - end - else if (WPNeg && XTREM_ACT && InvBlock[WrPage/(BlockSize+1)] == 0) - begin - for (j=0; j<=PageSize; j=j+1) - begin - Page_pom = WrPage; - XgetSegment(j,pom_seg,pom_seg1); - if (~PGD_ACT) - begin - if (ProgramedFlag[Page_pom*(SegmentNum+1)+pom_seg] ==0 && - ProgramedFlag[Page_pom*(SegmentNum+1)+pom_seg1] ==0 && - WrBuffData[j] != -1) - XTR_Pgms_data(j,WrPage); - end - else if (~XTR_MPRG) - begin - Page_pom = WrPage; - if (ProgramedFlag[Page_pom*(SegmentNum+1)+pom_seg] ==0 && - ProgramedFlag[Page_pom*(SegmentNum+1)+pom_seg1] ==0 && - WrBuffData[j] != -1) - Mem[WrPage*(PageSize+1)+j]= WrBuffData[j]; - if (ProgramedFlag[(Page_pom+1)*(SegmentNum+1)+pom_seg]==0 - &&ProgramedFlag[(Page_pom+1)*(SegmentNum+1)+pom_seg1]==0 - && WrBuffData[j] != -1) - Mem[(WrPage+1)*(PageSize+1)+j]= WrBuffData1[j]; - end - else - begin - if (ProgramedFlag[Page_pom*(SegmentNum+1)+pom_seg] == 0) - XTR_MPrg_proc; - end - end - for( j=0; j<=SegmentNum; j=j+1) - ProgramedFlag[WrPage*(SegmentNum+1) + j] = SegForProg[j]; - if (~XTR_MPRG) - for( j=0; j<=SegmentNum; j=j+1) - ProgramedFlag[(WrPage+1)*(SegmentNum+1) + j] = - SegForProg1[j]; - end - end - end - - always @(posedge PRE_PROG_out) - begin - if (WPNeg && XTREM_ACT) - begin - if (InvBlock[WrPage/(BlockSize+1)] == 0 && - InvBlockPgms[WrPage/(BlockSize+1)] == 0) - begin - XTR_PrePrg_proc(WrPage/(BlockSize+1)); - PreProgFlag[WrPage/(BlockSize+1)] = 1; - end - end - Status[5] = 1'b1; - R_zd = 1'b1; - Status[6:5] = 2'b11; - BlockMod[Blck] = 1'b1; - PRE_PROG_in = 1'b0; - PRG_ACT = 1'b0; - end - - always @(negedge write) - begin - if( current_state==PGMS || current_state==PREL_PRG - || current_state==A0_PRG || current_state==A1_PRG - || current_state==A2_PRG || current_state==DATA_PRG - || current_state==PGMS_CAC || current_state==A0_PRG_CAC - || current_state==WFPD || current_state==CBSY - || current_state==RDY_PRG || current_state==PRE_PRG - || current_state==UNKNOWN) - begin - if(CLE && ~ALE && PRG_ACT && Data==8'hFF) - begin - PROG_in = 1'b0; - XPROG_in = 1'b0; - PROG1_in = 1'b0; - XPROG1_in = 1'b0; - PROG2_in = 1'b0; - XPROG2_in = 1'b0; - end - else if (CLE && ~ALE && Data==8'hFF) - PRE_PROG_in = 1'b0; - end - end - - //Output Disable Control - always @(read, write, Data, AddrCom, reseted, current_state, - RENeg, CENeg, ALE, CLE, BERS_out, PROG_out, TR_out, - DBSY_out, RSTDONE, WPNeg ) - begin - if (RENeg || CENeg) - DOut_zd = 8'bZ; - end - - task Read_Data; - inout [31:0] Addr; - inout [31:0] Page; - inout [31:0] Blck; - reg [7:0] data_tmp; - reg [7:0] data_tmp1; - integer i; - integer j; - begin - if (~XTREM_ACT) - begin - if (Mem[Page*(PageSize+1)+Addr] != -1) - DOut_zd = Mem[Page*(PageSize+1)+Addr]; - else - DOut_zd = 8'bx; - if (Addr != PageSize) - Addr = Addr+1; - end - else - begin - if (Addr*2 < PageSize) - begin - if (Mem[Page*(PageSize+1)+(Addr*2)] != -1 && - Mem[Page*(PageSize+1)+(Addr*2+1)] != -1) - begin - data_tmp = Mem[Page*(PageSize+1)+(Addr*2+1)]; - data_tmp1= Mem[Page*(PageSize+1)+(Addr*2)]; - i = 0; - j = 0; - while (i <= 7) - begin - if ((i % 2) !=0) - begin - DOut_zd[j] = data_tmp1[i]; - DOut_zd[j+4] = data_tmp[i]; - j = j + 1; - end - i = i + 1; - end - end - else - DOut_zd = 8'bx; - end - else - begin - if (Mem[(Page+1)*(PageSize+1)+(Addr*2- PageSize)] != -1 && - Mem[(Page+1)*(PageSize+1)+(Addr*2-(PageSize+1))] != -1) - begin - data_tmp = Mem[(Page+1)*(PageSize+1)+(Addr*2- PageSize)]; - data_tmp1= Mem[(Page+1)*(PageSize+1)+(Addr*2-(PageSize+1))]; - i = 0; - j = 0; - while (i <= 7) - begin - if ((i % 2) !=0) - begin - DOut_zd[j] = data_tmp1[i]; - DOut_zd[j+4] =data_tmp[i]; - j = j + 1; - end - i = i + 1; - end - end - else - DOut_zd = 8'bx; - end - if (Addr != PageSize) - Addr = Addr+1; - end - end - endtask - - task Read_Status; - input [31:0] Blck; - begin - if ((PreProgFlag[Blck] == 1 && ProgBlock[Blck] == 0) || - BlockMod[Blck] == 1) - Status[2] = 1'b1; - else - Status[2] = 1'b0; - DOut_zd = Status; - end - endtask - - task Read_StatMode; - input [31:0] Blck; - begin - DOut_zd[7:1] = 0; - if ((PreProgFlag[Blck] == 1 && ProgBlock[Blck] == 0) || - BlockMod[Blck] == 1) - begin - DOut_zd[7:1] = 0; - DOut_zd[0] = 1'b1; - end - else - DOut_zd[0] = 1'b0; - end - endtask - - task getSegment; - input [31:0] paddress; - output [31:0] seg; - integer i; - begin - paddress = paddress % (PageSize + 1); - for (i=0; i<=SegmentNum; i=i+1) - if(paddress >= ssa[i] && paddress <= sea[i]) - seg = i; - end - endtask - - task XgetSegment; - input [31:0] paddress; - output [31:0] j; - output [31:0] k; - integer addr; - integer i; - begin - if (~PGD_ACT) - if (paddress*2 < PageSize) - addr = paddress*2; - else - begin - addr = paddress*2 - PageSize; - Page_pom = Page_pom + 1; - end - else - addr = paddress; - for (i=0; i<= SegmentNum; i=i+1) - if (addr >= ssa[i] && addr <= sea[i]) - j = i; - if ((j % 2) ==0) - k = j + 1; - else - k = j - 1; - end - endtask - - task XTR_Pgms_init; - input [31:0] Page; - integer i; - begin - if (WPNeg) - for(i=0; i<=PageSize; i=i+1) - begin - if (CashBuffData[i] != -1 && (i*2 < PageSize)) - begin - Mem[(Page)*(PageSize+1)+(i*2)] = - 1; - Mem[(Page)*(PageSize+1)+(i*2+1)] = - 1; - end - else if (CashBuffData[i] != -1 && (i*2 > PageSize)) - begin - Mem[(Page+1)*(PageSize+1)+(i*2- PageSize)] = - 1; - Mem[(Page+1)*(PageSize+1)+(i*2-(PageSize+1))] = - 1; - end - end - end - endtask - - task XTR_Pgms_data; - input [31:0] i; - input [31:0] Page; - reg [7:0] data_tmp; - reg [7:0] data_tmp1; - reg [7:0] data_reg; - integer k; - integer j; - begin - k = 0; - if (WrBuffData[i] != -1 && (i*2 < PageSize)) - begin - data_tmp = Mem[(Page)*(PageSize+1)+(i*2)]; - data_tmp1 = Mem[(Page)*(PageSize+1)+(i*2+1)]; - data_reg = WrBuffData[i]; - for (j=0; j<=7; j=j+1) - begin - if ((j % 2) !=0) - begin - data_tmp[j] = data_reg[k]; - data_tmp1[j] = data_reg[k+4]; - k = k + 1; - end - else - begin - data_tmp[j] = data_tmp[j]; - data_tmp1[j] = data_tmp1[j]; - end - end - Mem[(Page)*(PageSize+1)+(i*2)] = data_tmp; - Mem[(Page)*(PageSize+1)+(i*2+1)] = data_tmp1; - end - else if (WrBuffData[i] != -1 && (i*2 > PageSize)) - begin - data_tmp = Mem[(Page+1)*(PageSize+1)+(i*2- (PageSize+1))]; - data_tmp1 = Mem[(Page+1)*(PageSize+1)+(i*2 - PageSize)]; - data_reg = WrBuffData[i]; - for (j=0; j<=7; j=j+1) - begin - if ((j % 2) !=0) - begin - data_tmp[j] = data_reg[k]; - data_tmp1[j] = data_reg[k+4]; - k = k + 1; - end - else - begin - data_tmp[j] = data_tmp[j]; - data_tmp1[j] = data_tmp1[j]; - end - end - Mem[(Page+1)*(PageSize+1)+(i*2- PageSize)] = data_tmp1; - Mem[(Page+1)*(PageSize+1)+(i*2-(PageSize+1))] = data_tmp; - end - end - endtask - - task XTR_Buffdata; - input [31:0] address; - input [31:0] Data; - reg [7:0] data_tmp; - reg [7:0] data_tmp1; - reg [7:0] data_input; - integer k; - integer j; - integer inv; - begin - inv = 0; - if (address*2 < PageSize && CashBuffData[address*2] != -1 && - CashBuffData[address*2+1] != -1) - begin - data_tmp = CashBuffData[address*2]; - data_tmp1 = CashBuffData[address*2+1]; - inv = 1; - end - else if (address*2 > PageSize && - CashBuffData1[address*2- (PageSize+1)] != -1 && - CashBuffData1[address*2- PageSize] != -1) - begin - data_tmp = CashBuffData1[address*2- (PageSize+1)]; - data_tmp1 = CashBuffData1[address*2- PageSize]; - inv = 1; - end - - if (inv == 1) - begin - k = 0; - j = 0; - data_input = Data; - while (j <= 7) - begin - if ((j % 2) !=0) - begin - data_tmp[j]= data_input[k]; - data_tmp1[j]= data_input[k+4]; - k = k + 1; - end - j = j + 1; - end - if (address*2 < PageSize) - begin - CashBuffData[address*2] = data_tmp; - CashBuffData[address*2+1] = data_tmp1; - end - else - begin - CashBuffData1[address*2- PageSize] = data_tmp1; - CashBuffData1[address*2- (PageSize+1)] = data_tmp; - end - end - end - endtask - - task XTR_PrePrg_proc; - input [31:0] Blck; - reg [7:0] data_prog; - integer i; - integer k; - begin - for (i=Blck * (BlockSize+1)*(PageSize+1); - i<=(Blck+1)*(BlockSize+1)*(PageSize+1); - i=i+1) - begin - data_prog = Mem[i]; - for (k=0; k<=7; k=k+1) - if ((k % 2) == 0) - data_prog[k] = 1'b1; - Mem[i] = data_prog; - end - end - endtask - - task XTR_MPrg_proc; - reg [7:0] data_tmp; - reg [7:0] data_tmp1; - reg [7:0] data_tmp2; - integer k; - integer i; - integer inv; - begin - inv = 0; - k = 0; - i = 0; - if (j*2 < PageSize && WrBuffData[j*2+1] != -1 && - WrBuffData[j*2] != -1) - begin - data_tmp = WrBuffData[j*2+1]; - data_tmp1 = WrBuffData[j*2]; - inv = 1; - end - else if (j*2 > PageSize && WrBuffData1[j*2 - PageSize] != -1 && - WrBuffData1[j*2 - (PageSize+1)] != -1) - begin - data_tmp = WrBuffData1[j*2 - PageSize]; - data_tmp1 = WrBuffData1[j*2- (PageSize+1)]; - inv = 1; - end - if (inv == 1) - begin - while (i <= 7) - begin - if ((i % 2) !=0) - begin - data_tmp2[k] = data_tmp1[i]; - data_tmp2[k+4] = data_tmp[i]; - k = k + 1; - end - i = i + 1; - end - Mem[WrPage*(PageSize+1)+j] = data_tmp2; - end - end - endtask - - task set_reset; - begin - STAT_ACT = 1'b0; - RSTSTART = 1'b1; - RSTSTART <= #1 1'b0; - R_zd = 1'b0; - end - endtask - - reg BuffInR; - wire BuffOutR; - - BUFFER BUFR (BuffOutR , BuffInR); - - initial - begin - BuffInR = 1'b1; - end - - always @(posedge BuffOutR) - begin - WER_01 = $time; - end - reg BuffInRE, BuffInCE, BuffInALE, BuffInCLE; - wire BuffOutRE, BuffOutCE, BuffOutALE, BuffOutCLE; - - BUFFER BUFRENeg (BuffOutRE, BuffInRE); - BUFFER BUFCENeg (BuffOutCE, BuffInCE); - BUFFER BUFALE (BuffOutALE, BuffInALE); - BUFFER BUFCLE (BuffOutCLE, BuffInCLE); - - initial - begin - BuffInRE = 1'b1; - BuffInCE = 1'b1; - BuffInALE = 1'b1; - BuffInCLE = 1'b1; - end - - time CEDQ_t, REDQ_t, ALEDQ_t, CLEDQ_t; - time REDQ_01, CEDQ_01, ALEDQ_01, CLEDQ_01; - time CENeg_event, RENeg_event, ALE_event, CLE_event; - always @(posedge BuffOutRE) - begin - REDQ_01 = $time; - end - always @(posedge BuffOutCE) - begin - CEDQ_01 = $time; - end - always @(BuffOutALE) - begin - ALEDQ_01 = $time; - end - always @(BuffOutCLE) - begin - CLEDQ_01 = $time; - end - - always @(negedge CENeg) - begin - CENeg_event = $time; - end - - always @(negedge RENeg) - begin - RENeg_event = $time; - end - - always @(negedge ALE) - begin - ALE_event = $time; - end - always @(negedge CLE) - begin - CLE_event = $time; - end - - always @(DOut_zd) - begin : OutputGen - time time_t; - if (DOut_zd[0] !== 1'bz) - begin - CEDQ_t = CENeg_event + CEDQ_01; - REDQ_t = RENeg_event + REDQ_01; - tdp_CE = ((CEDQ_t >= REDQ_t) && ( CEDQ_t > $time)); - tdp_RE = ((REDQ_t > CEDQ_t) && ( REDQ_t > $time)); - DOut_pass = #5 DOut_zd; - end - end - - always @(DOut_zd) - begin - if (DOut_zd[0] === 1'bz) - begin - disable OutputGen; - tdp_CE = 1'b1; - tdp_RE= 1'b1; - DOut_pass = #5 DOut_zd; - end - end - -endmodule - -module BUFFER (OUT,IN); - input IN; - output OUT; - buf ( OUT, IN); -endmodule diff --git a/resources/soc/simu/testbench/uart_dev.v b/resources/soc/simu/testbench/uart_dev.v deleted file mode 100644 index 883b47b..0000000 --- a/resources/soc/simu/testbench/uart_dev.v +++ /dev/null @@ -1,527 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -`timescale 1ns/10ps - -`define V_UART_FIFO_COUNTER_W 5 -`define V_UART_FIFO_WIDTH 8 -`define V_UART_LC_PE 3 -`define V_UART_LC_EP 4 -`define V_UART_LC_SP 5 -`define V_UART_LC_SB 2 -`define V_UART_LC_BITS 1:0 -`define V_UART_LC_BC 6 -`define V_UART_FIFO_DEPTH 16 -`define V_UART_FIFO_POINTER_W 4 - -module uart_dev -( - input wire clk, - input wire rst_n, - input wire rx, - output wire tx -); -parameter uart_number=0; -parameter STRLEN = 80; - - wire [7:0] data; - wire hwrite; - wire hready; - wire [1:0] htrans; - wire [31:0] haddr; - wire hclk; - wire apb_clk; - wire gpio; - - assign data = 8'h0; - assign hwrite = 1'b0; - assign hready = 1'b0; - assign htrans = 2'b0; - assign haddr = 32'h0; - assign hclk = clk; - assign apb_clk = clk; - assign gpio = 1'b1; - - wire uart_beh_reset; - - reg [7:0] buffer[STRLEN:0]; - wire [8*STRLEN-1:0] outbuf; - - reg [7:0] byte_in; - reg [7:0] ptr; - integer i; - wire tx_mid; - assign #1 tx= tx_mid; - assign uart_beh_reset = !rst_n; - initial - begin - while(rx !== 1'b1) @(rx); - forever begin - byte_in = 8'h20; - while(rx != 1'b0) @(rx); - repeat(8) @(posedge clk); - for ( i=0; i<8; i=i+1 ) begin - repeat(16) @(posedge clk); - byte_in[i] = rx; - end - repeat(16) @(posedge clk); - push(byte_in); - end - end - - reg [31:0] haddr_d1; - reg hwrite_d1; - always @(posedge hclk) begin - haddr_d1 <= haddr; - hwrite_d1<= hwrite && hready && htrans[1]; - if (haddr_d1 == 32'h1f00_03f8 && hwrite_d1) begin - push(data); - end - end - - initial #100 - begin:init_buffer - for (ptr = 8'h00; ptr < STRLEN; ptr = ptr + 1) - begin - buffer[ptr] = 8'h20; - end - ptr = 8'h00; - end - - assign outbuf[639:0] = { buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7], - buffer[8], buffer[9], buffer[10],buffer[11],buffer[12],buffer[13],buffer[14],buffer[15], - buffer[16],buffer[17],buffer[18],buffer[19],buffer[20],buffer[21],buffer[22],buffer[23], - buffer[24],buffer[25],buffer[26],buffer[27],buffer[28],buffer[29],buffer[30],buffer[31], - buffer[32],buffer[33],buffer[34],buffer[35],buffer[36],buffer[37],buffer[38],buffer[39], - buffer[40],buffer[41],buffer[42],buffer[43],buffer[44],buffer[45],buffer[46],buffer[47], - buffer[48],buffer[49],buffer[50],buffer[51],buffer[52],buffer[53],buffer[54],buffer[55], - buffer[56],buffer[57],buffer[58],buffer[59],buffer[60],buffer[61],buffer[62],buffer[63], - buffer[64],buffer[65],buffer[66],buffer[67],buffer[68],buffer[69],buffer[70],buffer[71], - buffer[72],buffer[73],buffer[74],buffer[75],buffer[76],buffer[77],buffer[78],buffer[79]}; - - - task push; - input [7:0] data; - begin - buffer[ptr] = (data[7:0]==8'h0D)? 8'h0A : data[7:0]; - ptr = ptr + 1; - if (data[7:0] == 8'h0A || data[7:0] == 8'h0D) - begin - print; - ptr = 8'h00; - end - else if (ptr == STRLEN) - begin - print; - ptr = 8'h00; - end - end - endtask - - task print; - begin - $display("[%t]:[uart%1x]: %s", $time, uart_number,outbuf); - if (outbuf[639:576] == "GouSheng") $finish; - for (ptr = 8'h00; ptr < STRLEN; ptr = ptr + 1) - begin - buffer[ptr] = 8'h20; - end - end - endtask - - reg uart_push; - reg [7:0] uart_tx_data; - wire [2:0] uart_tx_state; - - initial - begin - begin - #1000000; - // #250000; - wait(gpio); - if (uart_number == 1) #200000; - //$display("[%t]:[uart%1x_output]: SEND STRING \"d4a000000010 \"", $time,uart_number); - uart_send_multiple("d4a000000010 ", 32'd13); - // uart_send_multiple("gb", 32'd2); - end - end - - uart_transmitter_v ut( .clk (apb_clk ), - .wb_rst_i (uart_beh_reset), - .lcr (8'h3 ), - .tf_push (uart_push ), - .wb_dat_i (uart_tx_data ), - .enable (1'b1 ), - .stx_pad_o (tx_mid ), - .tstate (uart_tx_state ), - .tf_count ( ), - .tx_reset (uart_beh_reset), - .lsr_mask (1'b0 ) - ); - - task uart_send_multiple; - input [8*80-1: 0] uart_string; - input [31:0] len; - integer send_multi_i; - begin - for (send_multi_i=len-1; send_multi_i >=0; send_multi_i = send_multi_i-1) begin - uart_send({uart_string[send_multi_i*8 + 7], - uart_string[send_multi_i*8 + 6], - uart_string[send_multi_i*8 + 5], - uart_string[send_multi_i*8 + 4], - uart_string[send_multi_i*8 + 3], - uart_string[send_multi_i*8 + 2], - uart_string[send_multi_i*8 + 1], - uart_string[send_multi_i*8 + 0]}); - end - end - endtask - task uart_send; - input [7:0] data; - begin - uart_tx_data = data; - @(posedge clk); - uart_push = 1'b1; - @(posedge clk); - uart_push = 1'b0; - repeat (3) @(posedge clk); - while(uart_tx_state != 3'b001) - @uart_tx_state; - end - endtask - - -endmodule - -module uart_transmitter_v (clk, wb_rst_i, lcr, tf_push, wb_dat_i, enable, stx_pad_o, tstate, tf_count, tx_reset, lsr_mask); - -input clk; -input wb_rst_i; -input [7:0] lcr; -input tf_push; -input [7:0] wb_dat_i; -input enable; -input tx_reset; -input lsr_mask; -output stx_pad_o; -output [2:0] tstate; -output [`V_UART_FIFO_COUNTER_W-1:0] tf_count; - -reg [2:0] tstate; -reg [4:0] counter; -reg [2:0] bit_counter; -reg [6:0] shift_out; -reg stx_o_tmp; -reg parity_xor; -reg tf_pop; -reg bit_out; - -wire [`V_UART_FIFO_WIDTH-1:0] tf_data_in; -wire [`V_UART_FIFO_WIDTH-1:0] tf_data_out; -wire tf_push; -wire tf_overrun; -wire [`V_UART_FIFO_COUNTER_W-1:0]tf_count; - -assign tf_data_in = wb_dat_i; - -uart_tfifo_v fifo_tx( - .clk (clk ), - .wb_rst_i (wb_rst_i ), - .data_in (tf_data_in ), - .data_out (tf_data_out), - .push (tf_push ), - .pop (tf_pop ), - .overrun (tf_overrun ), - .count (tf_count ), - .fifo_reset (tx_reset ), - .reset_status(lsr_mask ) -); - -parameter s_idle = 3'd0; -parameter s_send_start = 3'd1; -parameter s_send_byte = 3'd2; -parameter s_send_parity = 3'd3; -parameter s_send_stop = 3'd4; -parameter s_pop_byte = 3'd5; - -always @(posedge clk ) -begin - if (wb_rst_i) - begin - tstate <= s_idle; - stx_o_tmp <= 1'b1; - counter <= 5'b0; - shift_out <= 7'b0; - bit_out <= 1'b0; - parity_xor <= 1'b0; - tf_pop <= 1'b0; - bit_counter <= 3'b0; - end - else - if (enable) - begin - case (tstate) - s_idle :if (~|tf_count) - begin - tstate <= s_idle; - stx_o_tmp <= 1'b1; - end - else begin - tf_pop <= 1'b0; - stx_o_tmp <= 1'b1; - tstate <= s_pop_byte; - end - s_pop_byte : begin - tf_pop <= 1'b1; - case (lcr[1:0]) - 2'b00 : begin - bit_counter <= 3'b100; - parity_xor <= ^tf_data_out[4:0]; - end - 2'b01 : begin - bit_counter <= 3'b101; - parity_xor <= ^tf_data_out[5:0]; - end - 2'b10 : begin - bit_counter <= 3'b110; - parity_xor <= ^tf_data_out[6:0]; - end - 2'b11 : begin - bit_counter <= 3'b111; - parity_xor <= ^tf_data_out[7:0]; - end - endcase - {shift_out[6:0], bit_out} <= tf_data_out; - tstate <= s_send_start; - end - s_send_start : begin - tf_pop <= 1'b0; - if (~|counter) - counter <= 5'b01111; - else if (counter == 5'b00001) - begin - counter <= 0; - tstate <= s_send_byte; - end - else - counter <= counter - 1'b1; - stx_o_tmp <= 1'b0; - end - s_send_byte : begin - if (~|counter) - counter <= 5'b01111; - else if (counter == 5'b00001) - begin - if (bit_counter > 3'b0) begin - bit_counter <= bit_counter - 1'b1; - {shift_out[5:0],bit_out } <= {shift_out[6:1], shift_out[0]}; - tstate <= s_send_byte; - end - else - if (~lcr[`V_UART_LC_PE]) begin - tstate <= s_send_stop; - end - else begin - case ({lcr[`V_UART_LC_EP],lcr[`V_UART_LC_SP]}) - 2'b00: bit_out <= ~parity_xor; - 2'b01: bit_out <= 1'b1; - 2'b10: bit_out <= parity_xor; - 2'b11: bit_out <= 1'b0; - endcase - tstate <= s_send_parity; - end - counter <= 0; - end - else counter <= counter - 1'b1; - stx_o_tmp <= bit_out; - end - s_send_parity : begin - if (~|counter) counter <= 5'b01111; - else if (counter == 5'b00001) begin - counter <= 4'b0; - tstate <= s_send_stop; - end - else counter <= counter - 1'b1; - stx_o_tmp <= bit_out; - end - s_send_stop : begin - if (~|counter) begin - casex ({lcr[`V_UART_LC_SB],lcr[`V_UART_LC_BITS]}) - 3'b0xx: counter <= 5'b01101; - 3'b100: counter <= 5'b10101; - default: counter <= 5'b11101; - endcase - end - else if (counter == 5'b00001) begin - counter <= 0; - tstate <= s_idle; - end - else counter <= counter - 1'b1; - stx_o_tmp <= 1'b1; - end - default : - tstate <= s_idle; - endcase - end - else tf_pop <= 1'b0; -end - -assign stx_pad_o = lcr[`V_UART_LC_BC] ? 1'b0 : stx_o_tmp; - -endmodule - -module uart_tfifo_v (clk, - wb_rst_i, data_in, data_out, - push, - pop, - - overrun, - count, - fifo_reset, - reset_status -); - - -parameter fifo_width = `V_UART_FIFO_WIDTH; -parameter fifo_depth = `V_UART_FIFO_DEPTH; -parameter fifo_pointer_w = `V_UART_FIFO_POINTER_W; -parameter fifo_counter_w = `V_UART_FIFO_COUNTER_W; - -input clk; -input wb_rst_i; -input push; -input pop; -input [fifo_width-1:0] data_in; -input fifo_reset; -input reset_status; - -output [fifo_width-1:0] data_out; -output overrun; -output [fifo_counter_w-1:0] count; - -wire [fifo_width-1:0] data_out; - -reg [fifo_pointer_w-1:0] top; -reg [fifo_pointer_w-1:0] bottom; - -reg [fifo_counter_w-1:0] count; -reg overrun; -wire [fifo_pointer_w-1:0] top_plus_1 = top + 1'b1; - -raminfr_v #(fifo_pointer_w,fifo_width,fifo_depth) tfifo (.clk(clk), - .we(push), - .a(top), - .dpra(bottom), - .di(data_in), - .dpo(data_out) -); - - -always @(posedge clk) -begin - if (wb_rst_i) - begin - top <= 0; - bottom <= 1'b0; - count <= 0; - end - else - if (fifo_reset) begin - top <= 0; - bottom <= 1'b0; - count <= 0; - end - else - begin - case ({push, pop}) - 2'b10 : if (count0) - begin - bottom <= bottom + 1'b1; - count <= count - 1'b1; - end - 2'b11 : begin - bottom <= bottom + 1'b1; - top <= top_plus_1; - end - default: ; - endcase - end -end - -always @(posedge clk) -begin - if (wb_rst_i) - overrun <= 1'b0; - else - if(fifo_reset | reset_status) - overrun <= 1'b0; - else - if(push & (count==fifo_depth)) - overrun <= 1'b1; -end - -endmodule - -module raminfr_v(clk, we, a, dpra, di, dpo); - -parameter addr_width = 4; -parameter data_width = 8; -parameter depth = 16; - -input clk; -input we; -input [addr_width-1:0] a; -input [addr_width-1:0] dpra; -input [data_width-1:0] di; -output [data_width-1:0] dpo; -reg [data_width-1:0] ram [depth-1:0]; - -wire [data_width-1:0] di; -wire [addr_width-1:0] a; -wire [addr_width-1:0] dpra; - -always @(posedge clk) begin - if (we) - ram[a] <= di; -end -reg [data_width-1:0] dpo; - -always @(posedge clk) - dpo <= ram[dpra]; - -endmodule diff --git a/resources/soc/simu/testbench/vmac/mac2ahb_package.v b/resources/soc/simu/testbench/vmac/mac2ahb_package.v deleted file mode 100644 index e108e52..0000000 --- a/resources/soc/simu/testbench/vmac/mac2ahb_package.v +++ /dev/null @@ -1,98 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - - // HTRANS states - parameter [1:0] IDLE = 0; - parameter [1:0] NONSEQ = 1; - parameter [1:0] SEQ = 2; - parameter [1:0] HTRANS_IDLE = 2'b00; - parameter [1:0] HTRANS_BUSY = 2'b01; - parameter [1:0] HTRANS_NONSEQ = 2'b10; - parameter [1:0] HTRANS_SEQ = 2'b11; - - // HBURST states - parameter SINGLE = 1'b0; - parameter INCR = 1'b1; - parameter [2:0] HBURST_SINGLE = 3'b000; - parameter [2:0] HBURST_INCR = 3'b001; - - // HSIZE states - parameter [2:0] HSIZE8BIT = 0; - parameter [2:0] HSIZE16BIT = 1; - parameter [2:0] HSIZE32BIT = 2; - parameter [2:0] HSIZE64BIT = 3; - parameter [2:0] HSIZE256BIT = 4; - parameter [2:0] HSIZE512BIT = 5; - parameter [2:0] HSIZE1024BIT = 6; - parameter [2:0] UNSUPPORTED = 7; - - parameter [2:0] HSIZE_8BIT = 3'b000; - parameter [2:0] HSIZE_16BIT = 3'b001; - parameter [2:0] HSIZE_32BIT = 3'b010; - parameter [2:0] HSIZE_64BIT = 3'b011; - parameter [2:0] HSIZE_128BIT = 3'b100; - parameter [2:0] HSIZE_256BIT = 3'b101; - parameter [2:0] HSIZE_512BIT = 3'b110; - parameter [2:0] HSIZE_1024BIT = 3'b111; - - // HRESP states - parameter [1:0] OKAY = 0; - parameter [1:0] ERROR = 1; - parameter [1:0] RETRY = 2; - parameter [1:0] SPLIT = 3; - parameter [1:0] HRESP_OKAY = 2'b00; - parameter [1:0] HRESP_ERROR = 2'b01; - parameter [1:0] HRESP_RETRY = 2'b10; - parameter [1:0] HRESP_SPLIT = 2'b11; - - // HPROT subvalue - parameter HPROT_0_OPCODEFETCH = 1'b0; - parameter HPROT_0_DATAACCESS = 1'b1; - parameter HPROT_1_USERACCESS = 1'b0; - parameter HPROT_1_PRIVILAGEDACCESS = 1'b1; - parameter HPROT_2_NOTBUFFERABLE = 1'b0; - parameter HPROT_2_BUFFERABLE = 1'b1; - parameter HPROT_3_NOTCACHEABLE = 1'b0; - parameter HPROT_3_CACHEABLE = 1'b1; - - // HPROT default value - parameter [3:0] HPROT_MACPROTECTIONCONTROL = {HPROT_3_NOTCACHEABLE, - HPROT_2_NOTBUFFERABLE, - HPROT_1_USERACCESS, - HPROT_0_DATAACCESS}; - - // MACDATA2AHB FSM states - parameter [1:0] AHBM_ADDR = 0; - parameter [1:0] AHBM_ADDRDATA = 1; - parameter [1:0] AHBM_IDLE = 2; - parameter [1:0] AHBM_DATA = 3; diff --git a/resources/soc/simu/testbench/vmac/mac_ram.v b/resources/soc/simu/testbench/vmac/mac_ram.v deleted file mode 100644 index c388776..0000000 --- a/resources/soc/simu/testbench/vmac/mac_ram.v +++ /dev/null @@ -1,989 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -module RF2_64x16 ( - QA, - AA, - CLKA, - CENA, - AB, - DB, - CLKB, - CENB -); - parameter BITS = 16; - parameter word_depth = 64; - parameter addr_width = 6; - output [15:0] QA; - input [5:0] AA; - input CLKA; - input CENA; - input [5:0] AB; - input [15:0] DB; - input CLKB; - input CENB; - reg [15:0] QA; - - reg [BITS-1:0] mem [word_depth-1:0]; - - not (NOT_CENA, CENA); - always @ ( posedge CLKA ) if ( NOT_CENA ) QA<=mem[AA]; - - not (NOT_CENB, CENB); - always @ ( posedge CLKB ) if ( NOT_CENB ) mem[AB]<=DB; - -endmodule - -module RF2_512x32 ( - QA, - AA, - CLKA, - CENA, - AB, - DB, - CLKB, - CENB -); - parameter BITS = 32; - parameter word_depth = 512; - parameter addr_width = 9; - parameter wordx = {BITS{1'bx}}; - parameter addrx = {addr_width{1'bx}}; - - output [31:0] QA; - input [8:0] AA; - input CLKA; - input CENA; - input [8:0] AB; - input [31:0] DB; - input CLKB; - input CENB; - - reg [BITS-1:0] mem [word_depth-1:0]; - reg NOT_CONTA; - reg NOT_CONTB; - - reg NOT_CENA; - reg NOT_CENB; - - reg NOT_AA0; - reg NOT_AA1; - reg NOT_AA2; - reg NOT_AA3; - reg NOT_AA4; - reg NOT_AA5; - reg NOT_AA6; - reg NOT_AA7; - reg NOT_AA8; - reg [addr_width-1:0] NOT_AA; - reg NOT_AB0; - reg NOT_AB1; - reg NOT_AB2; - reg NOT_AB3; - reg NOT_AB4; - reg NOT_AB5; - reg NOT_AB6; - reg NOT_AB7; - reg NOT_AB8; - reg [addr_width-1:0] NOT_AB; - reg NOT_DB0; - reg NOT_DB1; - reg NOT_DB2; - reg NOT_DB3; - reg NOT_DB4; - reg NOT_DB5; - reg NOT_DB6; - reg NOT_DB7; - reg NOT_DB8; - reg NOT_DB9; - reg NOT_DB10; - reg NOT_DB11; - reg NOT_DB12; - reg NOT_DB13; - reg NOT_DB14; - reg NOT_DB15; - reg NOT_DB16; - reg NOT_DB17; - reg NOT_DB18; - reg NOT_DB19; - reg NOT_DB20; - reg NOT_DB21; - reg NOT_DB22; - reg NOT_DB23; - reg NOT_DB24; - reg NOT_DB25; - reg NOT_DB26; - reg NOT_DB27; - reg NOT_DB28; - reg NOT_DB29; - reg NOT_DB30; - reg NOT_DB31; - reg [BITS-1:0] NOT_DB; - reg NOT_CLKA_PER; - reg NOT_CLKA_MINH; - reg NOT_CLKA_MINL; - reg NOT_CLKB_PER; - reg NOT_CLKB_MINH; - reg NOT_CLKB_MINL; - - reg LAST_NOT_CENA; - reg LAST_NOT_CENB; - - - reg LAST_NOT_AA0; - reg LAST_NOT_AA1; - reg LAST_NOT_AA2; - reg LAST_NOT_AA3; - reg LAST_NOT_AA4; - reg LAST_NOT_AA5; - reg LAST_NOT_AA6; - reg LAST_NOT_AA7; - reg LAST_NOT_AA8; - reg [addr_width-1:0] LAST_NOT_AA; - reg LAST_NOT_AB0; - reg LAST_NOT_AB1; - reg LAST_NOT_AB2; - reg LAST_NOT_AB3; - reg LAST_NOT_AB4; - reg LAST_NOT_AB5; - reg LAST_NOT_AB6; - reg LAST_NOT_AB7; - reg LAST_NOT_AB8; - reg [addr_width-1:0] LAST_NOT_AB; - reg LAST_NOT_DB0; - reg LAST_NOT_DB1; - reg LAST_NOT_DB2; - reg LAST_NOT_DB3; - reg LAST_NOT_DB4; - reg LAST_NOT_DB5; - reg LAST_NOT_DB6; - reg LAST_NOT_DB7; - reg LAST_NOT_DB8; - reg LAST_NOT_DB9; - reg LAST_NOT_DB10; - reg LAST_NOT_DB11; - reg LAST_NOT_DB12; - reg LAST_NOT_DB13; - reg LAST_NOT_DB14; - reg LAST_NOT_DB15; - reg LAST_NOT_DB16; - reg LAST_NOT_DB17; - reg LAST_NOT_DB18; - reg LAST_NOT_DB19; - reg LAST_NOT_DB20; - reg LAST_NOT_DB21; - reg LAST_NOT_DB22; - reg LAST_NOT_DB23; - reg LAST_NOT_DB24; - reg LAST_NOT_DB25; - reg LAST_NOT_DB26; - reg LAST_NOT_DB27; - reg LAST_NOT_DB28; - reg LAST_NOT_DB29; - reg LAST_NOT_DB30; - reg LAST_NOT_DB31; - reg [BITS-1:0] LAST_NOT_DB; - reg LAST_NOT_CLKA_PER; - reg LAST_NOT_CLKA_MINH; - reg LAST_NOT_CLKA_MINL; - reg LAST_NOT_CLKB_PER; - reg LAST_NOT_CLKB_MINH; - reg LAST_NOT_CLKB_MINL; - - reg LAST_NOT_CONTA; - reg LAST_NOT_CONTB; - wire contA_flag; - wire contB_flag; - wire cont_flag; - - wire [BITS-1:0] _QA; - wire [addr_width-1:0] _AA; - wire [addr_width-1:0] _AB; - wire _CLKA; - wire _CLKB; - wire _CENA; - - - wire _CENB; - wire [BITS-1:0] _DB; - wire re_flagA; - - - wire re_flagB; - - reg LATCHED_CENA; - - - reg LATCHED_CENB; - reg [addr_width-1:0] LATCHED_AA; - reg [addr_width-1:0] LATCHED_AB; - reg [BITS-1:0] LATCHED_DB; - - reg CENAi; - reg CENBi; - - - reg [addr_width-1:0] AAi; - reg [addr_width-1:0] ABi; - reg [BITS-1:0] DBi; - reg [BITS-1:0] QAi; - reg [BITS-1:0] LAST_QAi; - - - - reg LAST_CLKA; - reg LAST_CLKB; - - reg valid_cycleA; - reg valid_cycleB; - - - task update_Anotifier_buses; - begin - NOT_AA = { - NOT_AA8, - NOT_AA7, - NOT_AA6, - NOT_AA5, - NOT_AA4, - NOT_AA3, - NOT_AA2, - NOT_AA1, - NOT_AA0}; - end - endtask - - task update_Bnotifier_buses; - begin - NOT_AB = { - NOT_AB8, - NOT_AB7, - NOT_AB6, - NOT_AB5, - NOT_AB4, - NOT_AB3, - NOT_AB2, - NOT_AB1, - NOT_AB0}; - NOT_DB = { - NOT_DB31, - NOT_DB30, - NOT_DB29, - NOT_DB28, - NOT_DB27, - NOT_DB26, - NOT_DB25, - NOT_DB24, - NOT_DB23, - NOT_DB22, - NOT_DB21, - NOT_DB20, - NOT_DB19, - NOT_DB18, - NOT_DB17, - NOT_DB16, - NOT_DB15, - NOT_DB14, - NOT_DB13, - NOT_DB12, - NOT_DB11, - NOT_DB10, - NOT_DB9, - NOT_DB8, - NOT_DB7, - NOT_DB6, - NOT_DB5, - NOT_DB4, - NOT_DB3, - NOT_DB2, - NOT_DB1, - NOT_DB0}; - - - end - endtask - - task mem_cycleA; - begin - valid_cycleA = 1'bx; - casez({CENAi}) - 1'b0: begin - valid_cycleA = 1; - read_memA(1,0); - end - 1'b1: ; - 1'bx: begin - valid_cycleA = 1; - read_memA(0,1); - end - endcase - end - endtask - - task mem_cycleB; - begin - valid_cycleB = 1'bx; - casez(CENBi) - 1'b0: begin - valid_cycleB = 0; - write_mem(ABi,DBi); - end - 1'b1: ; - 1'bx: begin - valid_cycleB = 0; - write_mem_x(ABi); - end - endcase - end - endtask - - task contentionA; - begin - casez(valid_cycleB) - 1'bx: ; - 1'b0:begin - read_memA(0,1); - end - 1'b1: ; - endcase - end - endtask - - task contentionB; - begin - casez(valid_cycleA) - 1'bx: ; - 1'b1:begin - read_memA(0,1); - end - 1'b0: ; - endcase - end - endtask - - task update_Alast_notifiers; - begin - LAST_NOT_AA = NOT_AA; - LAST_NOT_CENA = NOT_CENA; - LAST_NOT_CLKA_PER = NOT_CLKA_PER; - LAST_NOT_CLKA_MINH = NOT_CLKA_MINH; - LAST_NOT_CLKA_MINL = NOT_CLKA_MINL; - LAST_NOT_CONTA = NOT_CONTA; - end - endtask - - task update_Blast_notifiers; - begin - LAST_NOT_AB = NOT_AB; - LAST_NOT_DB = NOT_DB; - LAST_NOT_CENB = NOT_CENB; - LAST_NOT_CLKB_PER = NOT_CLKB_PER; - LAST_NOT_CLKB_MINH = NOT_CLKB_MINH; - LAST_NOT_CLKB_MINL = NOT_CLKB_MINL; - LAST_NOT_CONTB = NOT_CONTB; - end - endtask - - task latch_Ainputs; - begin - LATCHED_AA = _AA ; - LATCHED_CENA = _CENA ; - LAST_QAi = QAi; - end - endtask - - task latch_Binputs; - begin - LATCHED_AB = _AB ; - LATCHED_DB = _DB ; - LATCHED_CENB = _CENB ; - end - endtask - - task update_Alogic; - integer n; - begin - CENAi = LATCHED_CENA; - AAi = LATCHED_AA; - end - endtask - - task update_Blogic; - integer n; - begin - CENBi = LATCHED_CENB; - ABi = LATCHED_AB; - DBi = LATCHED_DB; - end - endtask - - - - - task x_Ainputs; - integer n; - begin - for (n=0; n QA[0]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[1]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[2]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[3]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[4]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[5]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[6]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[7]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[8]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[9]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[10]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[11]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[12]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[13]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[14]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[15]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[16]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[17]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[18]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[19]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[20]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[21]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[22]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[23]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[24]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[25]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[26]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[27]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[28]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[29]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[30]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - (CLKA => QA[31]) = (1.000, 1.000, 0.500, 1.000, 0.500, 1.000); - -endspecify - -endmodule diff --git a/resources/soc/simu/testbench/vmac/mac_top.v b/resources/soc/simu/testbench/vmac/mac_top.v deleted file mode 100644 index 2b624f4..0000000 --- a/resources/soc/simu/testbench/vmac/mac_top.v +++ /dev/null @@ -1,13548 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -module vMAC_TOP -( - hclk, hrst_, SYS_RST_, - - hmst, hmstlock, - htrans, hburst, haddr, - hwrite, hsize, - hrdata, hwdata, hrdy, hresp, - eth_hreq, eth_hlock, eth_hgnt, - eth_htrans, eth_hburst, eth_haddr, - eth_hwrite, eth_hsize, eth_hprot, - eth_hwdata, - eth_hsel, eth_hrdy, eth_hresp, eth_hsplit, - eth_hrdata, - - interrupt, - - mtxclk, mtxen, mtxd, mtxerr, - mrxclk, mrxdv, mrxd, mrxerr, - mcoll, mcrs, - mdc, md_i, md_o, md_oe, - - bist_mode - - ); - -input hclk; -input hrst_; -input [3:0] hmst; -input hmstlock; -input [1:0] htrans; -input [2:0] hburst; -input [31:0] haddr; -input hwrite; -input [2:0] hsize; -input [31:0] hrdata; -input [31:0] hwdata; -input hrdy; -input [1:0] hresp; - -output eth_hreq; -output eth_hlock; -input eth_hgnt; -output [1:0] eth_htrans; -output [2:0] eth_hburst; -output [31:0] eth_haddr; -output eth_hwrite; -output [2:0] eth_hsize; -output [3:0] eth_hprot; -output [31:0] eth_hwdata; - -input eth_hsel; -output eth_hrdy; -output [1:0] eth_hresp; -output [15:0] eth_hsplit; -output [31:0] eth_hrdata; - -input mtxclk; -output [3:0] mtxd; -output mtxen; -output mtxerr; - -input mrxclk; -input [3:0] mrxd; -input mrxdv; -input mrxerr; - -input mcoll; -input mcrs; - -input md_i; -output mdc; -output md_o; -output md_oe; - -output interrupt; - -input bist_mode; -input SYS_RST_; - -wire tps,rps,rsttco,rstrco,sclk,scs,sdo; - `define MAHBDATAWIDTH 32 - `define TFIFODEPTH 9 - `define RFIFODEPTH 9 - `define ADDRDEPTH 6 - wire [`MAHBDATAWIDTH - 1:0] trdata; - wire twe; - wire [`TFIFODEPTH - 1:0] twaddr; - wire [`TFIFODEPTH - 1:0] traddr; - wire [`MAHBDATAWIDTH - 1:0] twdata; - wire [`MAHBDATAWIDTH - 1:0] rrdata; - wire rwe; - wire [`RFIFODEPTH - 1:0] rwaddr; - wire [`RFIFODEPTH - 1:0] rraddr; - wire [`MAHBDATAWIDTH - 1:0] rwdata; - wire [15:0] frdata; - wire fwe; - wire [`ADDRDEPTH - 1:0] fwaddr; - wire [`ADDRDEPTH - 1:0] fraddr; - wire [15:0] fwdata; - wire match; - wire matchval; - wire matchen; - wire [47:0] matchdata; - - -RF2_512x32 TX_RAM(.CLKA(mtxclk),.CENA(1'b0),.AA(traddr),.QA(trdata), - .CLKB(hclk ),.CENB(!twe),.AB(twaddr),.DB(twdata)); - - -RF2_512x32 RX_RAM(.CLKA(hclk ),.CENA(1'b0),.AA(rraddr),.QA(rrdata), - .CLKB(mrxclk),.CENB(!rwe),.AB(rwaddr),.DB(rwdata)); - -RF2_64x16 ADDR_RAM(.CLKA(mrxclk),.CENA(1'b0),.AA(fraddr),.QA(frdata), - .CLKB(hclk ),.CENB(!fwe),.AB(fwaddr),.DB(fwdata)); - - -CAM_V FIL_CAM(.clk(mrxclk), .matchen(matchen), .matchdata(matchdata), .match(match), .matchval(matchval)); -MAC_AHB_V MAC_TEST( - .clkt(mtxclk), - .clkr(mrxclk), - .rsttco(rsttco), - .rstrco(rstrco), - .interrupt(interrupt), - .tps(tps), - .rps(rps), - .mhclk(hclk), - .mhresetn(hrst_), - .mhrdata(hrdata), - .mhready(hrdy), - .mhresp(hresp), - .mhaddr(eth_haddr), - .mhtrans(eth_htrans), - .mhwrite(eth_hwrite), - .mhsize(eth_hsize), - .mhburst(eth_hburst), - .mhprot(eth_hprot), - .mhwdata(eth_hwdata), - .mhgrantmac(eth_hgnt), - .mhbusreqmac(eth_hreq), - .mhlockmac(eth_hlock), - .shclk(hclk), - .shresetn(hrst_), - .shselmac(eth_hsel), - .shaddr(haddr[7:0]), - .shwrite(hwrite), - .shreadyi(hrdy), - .shtrans(htrans), - .shsize(hsize), - .shburst(hburst), - .shwdata(hwdata), - .shreadyo(eth_hrdy), - .shresp(eth_hresp), - .shrdata(eth_hrdata), - .trdata(trdata), - .twe(twe), - .twaddr(twaddr), - .traddr(traddr), - .twdata(twdata), - .rrdata(rrdata), - .rwe(rwe), - .rwaddr(rwaddr), - .rraddr(rraddr), - .rwdata(rwdata), - .frdata(frdata), - .fwe(fwe), - .fwaddr(fwaddr), - .fraddr(fraddr), - .fwdata(fwdata), - .match(match), - .matchval(matchval), - .matchen(matchen), - .matchdata(matchdata), - .sdi(1'b0), - .sclk(sclk), - .scs(scs), - .sdo(sdo), - .rxer(mrxerr), - .rxdv(mrxdv), - .col(mcoll), - .crs(mcrs), - .rxd(mrxd), - .txen(mtxen), - .txer(mtxerr), - .txd(mtxd), - .mdc(mdc), - .mdi(md_i), - .mdo(md_o), - .mden(md_oe) - ); - -endmodule - -module BD_V ( - clk, - rst, - col, - crs, - fdp, - tprog, - preamble, - tpend, - winp, - tiack, - coll, - carrier, - bkoff, - lc, - lo, - nc, - ec, - cc - ); - - `include "utility.v" - - input clk; - input rst; - - input col; - input crs; - - input fdp; - - input tprog; - input preamble; - input tpend; - output winp; - wire winp; - input tiack; - output coll; - wire coll; - output carrier; - wire carrier; - output bkoff; - wire bkoff; - output lc; - wire lc; - output lo; - reg lo; - output nc; - wire nc; - output ec; - reg ec; - output [3:0] cc; - wire [3:0] cc; - - - reg crs_r; - reg inc; - - reg ibkoff; - reg ibkoff_r; - reg icoll; - reg ilc; - reg [3:0] ccnt; - reg [9:0] bkcnt; - reg [8:0] slcnt; - reg [9:0] bkrel_c; - wire [9:0] p_rand; - reg [31:0] lfsr; - reg [31:0] lfsr_c; - reg iwinp; - - always @(posedge clk) - begin : crs_reg_proc - if (rst) - begin - crs_r <= 1'b0 ; - lo <= 1'b0 ; - inc <= 1'b0 ; - end - else - begin - if (fdp) - begin - crs_r <= 1'b0 ; - end - else - begin - crs_r <= crs ; - end - - if (tprog & !inc & !crs_r) - begin - lo <= 1'b1 ; - end - else if(!tpend & !tprog) - begin - lo <= 1'b0 ; - end - - if (tprog & crs_r) - begin - inc <= 1'b0 ; - end - else if (!tpend & !tprog) - begin - inc <= 1'b1 ; - end - end - end - - assign nc = inc ; - - always @(ccnt or p_rand) - begin : bkrel_proc - case (ccnt) - 4'b0000 : - begin - bkrel_c <= {9'b000000000, p_rand[0]} ; - end - 4'b0001 : - begin - bkrel_c <= {8'b00000000, p_rand[1:0]} ; - end - 4'b0010 : - begin - bkrel_c <= {7'b0000000, p_rand[2:0]} ; - end - 4'b0011 : - begin - bkrel_c <= {6'b000000, p_rand[3:0]} ; - end - 4'b0100 : - begin - bkrel_c <= {5'b00000, p_rand[4:0]} ; - end - 4'b0101 : - begin - bkrel_c <= {4'b0000, p_rand[5:0]} ; - end - 4'b0110 : - begin - bkrel_c <= {3'b000, p_rand[6:0]} ; - end - 4'b0111 : - begin - bkrel_c <= {2'b00, p_rand[7:0]} ; - end - 4'b1000 : - begin - bkrel_c <= {1'b0, p_rand[8:0]} ; - end - default : - begin - bkrel_c <= p_rand[9:0] ; - end - endcase - end - - always @(posedge clk) - begin : slcnt_reg_proc - if (rst) - begin - slcnt <= {9{1'b1}} ; - end - else - begin - if (tprog & !preamble & !icoll) - begin - if (slcnt != 9'b000000000) - begin - slcnt <= slcnt - 1 ; - end - end - else if (ibkoff) - begin - if (slcnt == 9'b000000000 | icoll) - begin - slcnt <= SLOT_TIME ; - end - else - begin - slcnt <= slcnt - 1 ; - end - end - else - begin - slcnt <= SLOT_TIME ; - end - end - end - - always @(posedge clk) - begin : bkcnt_reg_proc - if (rst) - begin - bkcnt <= {10{1'b1}} ; - end - else - begin - if (icoll & !ibkoff) - begin - bkcnt <= bkrel_c ; - end - else if (slcnt == 9'b000000000) - begin - bkcnt <= bkcnt - 1 ; - end - end - end - - always @(posedge clk) - begin : rand_reg_proc - if (rst) - begin - lfsr <= {31{1'b1}}; - end - else - begin - lfsr <= lfsr_c; - end - end - - always @(lfsr) - begin : lfsr_drv - - reg [31:0] lfsr_n; - - integer i; - for(i=0; i<=30; i=i+1) - begin - lfsr_n[i] = lfsr[i+1]; - end - - lfsr_n[31] = 1'b0; - if(lfsr[0]==1'b1) - begin - lfsr_n = lfsr_n ^ 32'b10000000000000000000111010100110; - end - - lfsr_c <= lfsr_n; - - end - - assign p_rand = lfsr[9:0] ; - - - always @(posedge clk) - begin : ibkoff_reg_proc - if (rst) - begin - ibkoff <= 1'b0 ; - ibkoff_r <= 1'b0 ; - end - else - begin - ibkoff_r <= ibkoff ; - if(icoll & ccnt!=4'b1111 & !iwinp & !ilc) - begin - ibkoff <= 1'b1 ; - end - else if (bkcnt == 10'b0000000000) - begin - ibkoff <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : coll_reg_proc - if (rst) - begin - icoll <= 1'b0 ; - ilc <= 1'b0 ; - ec <= 1'b0 ; - iwinp <= 1'b1 ; - ccnt <= 4'b0000 ; - end - else - begin - if ((preamble | tprog) & col & !fdp) - begin - icoll <= 1'b1 ; - end - else if (!tprog & !preamble) - begin - icoll <= 1'b0 ; - end - - if (tiack) - begin - ilc <= 1'b0 ; - end - else if (tprog & icoll & iwinp) - begin - ilc <= 1'b1 ; - end - - if (tiack) - begin - ec <= 1'b0 ; - end - else if (icoll & ccnt == 4'b1111 & tprog) - begin - ec <= 1'b1 ; - end - - if (slcnt == 9'b000000000 | !tprog) - begin - iwinp <= 1'b1 ; - end - else - begin - iwinp <= 1'b0 ; - end - - if (!tpend & !tprog) - begin - ccnt <= 4'b0000 ; - end - else if (ibkoff & !ibkoff_r) - begin - ccnt <= ccnt + 4'b0001 ; - end - end - end - - assign winp = iwinp ; - - assign lc = ilc; - - assign carrier = crs_r ; - - assign coll = icoll ; - - assign bkoff = ibkoff ; - - assign cc = ccnt ; - -endmodule - - - -module CAM_V (clk, matchen, matchdata, match, matchval); - - input clk; - input matchen; - input [47:0] matchdata; - output match; - wire match; - output matchval; - wire matchval; - - parameter [47:0] adr0 = {8'b10111010, 8'b10011000, 8'b01110110, - 8'b01010100, 8'b00110010, 8'b00010001}; - parameter [47:0] adr1 = {8'b00000000, 8'b00000000, 8'b00000000, - 8'b00000000, 8'b00000000, 8'b00000000}; - parameter [47:0] adr2 = {8'b00000000, 8'b00000000, 8'b00000000, - 8'b00000000, 8'b00000000, 8'b00000000}; - parameter [47:0] adr3 = {8'b00000000, 8'b00000000, 8'b00000000, - 8'b00000000, 8'b00000000, 8'b00000000}; - reg imatchval; - - always @(posedge clk) - begin : imatchval_proc - imatchval <= matchen ; - end - - assign match = (imatchval & (adr0 == matchdata | - adr1 == matchdata | - adr2 == matchdata | - adr3 == matchdata)) ? 1'b1 : 1'b0 ; - - assign matchval = imatchval ; - -endmodule - - - -module CSR_V ( - clk, - rst, - interrupt, - csrreq, - csrrw, - csrbe, - csraddr, - csrdatai, - csrack, - csrdatao, - rstsofto, - tprog, - tireq, - unf, - tcsreq, - tiack, - tcsack, - fd, - ic, - etireq, - etiack, - tm, - sf, - tset, - tdes, - tbuf, - tstat, - tu, - tpollack, - ft, - tpoll, - tdbadc, - tdbad, - rcsreq, - rprog, - rcsack, - ren, - ra, - pm, - pr, - pb, - rif, - ho, - hp, - foclack, - mfclack, - oco, - mfo, - focg, - mfcg, - focl, - mfcl, - rireq, - erireq, - ru, - rpollack, - rdes, - rbuf, - rstat, - riack, - eriack, - rpoll, - rdbadc, - rdbad, - ble, - dbo, - dma_priority, - pbl, - dsl, - stoptc, - stoptlsm, - stoptfifo, - stopt, - tps, - stoprc, - stoprlsm, - stopr, - rps, - sdi, - sclk, - scs, - sdo, - mdi, - mdc, - mdo, - mden - ); - - parameter CSRWIDTH = 32; - parameter DATAWIDTH = 32; - parameter DATADEPTH = 32; - parameter RFIFODEPTH = 9; - parameter RCDEPTH = 2; - - `include "utility.v" - - input clk; - input rst; - output interrupt; - wire interrupt; - - input csrreq; - input csrrw; - input [CSRWIDTH / 8 - 1:0] csrbe; - input [CSRDEPTH - 1:0] csraddr; - input [CSRWIDTH - 1:0] csrdatai; - output csrack; - wire csrack; - output [CSRWIDTH - 1:0] csrdatao; - reg [CSRWIDTH - 1:0] csrdatao; - - output rstsofto; - reg rstsofto; - - input tprog; - input tireq; - input unf; - input tcsreq; - output tiack; - wire tiack; - output tcsack; - wire tcsack; - output fd; - wire fd; - - input ic; - input etireq; - output etiack; - wire etiack; - output [2:0] tm; - wire [2:0] tm; - output sf; - wire sf; - - input tset; - input tdes; - input tbuf; - input tstat; - input tu; - input tpollack; - input [1:0] ft; - output tpoll; - wire tpoll; - output tdbadc; - reg tdbadc; - output [DATADEPTH - 1:0] tdbad; - wire [DATADEPTH - 1:0] tdbad; - - input rcsreq; - input rprog; - output rcsack; - wire rcsack; - output ren; - wire ren; - output ra; - wire ra; - output pm; - wire pm; - output pr; - wire pr; - output pb; - wire pb; - output rif; - wire rif; - output ho; - wire ho; - output hp; - wire hp; - - input foclack; - input mfclack; - input oco; - input mfo; - input [10:0] focg; - input [15:0] mfcg; - output focl; - reg focl; - output mfcl; - reg mfcl; - - input rireq; - input erireq; - input ru; - input rpollack; - input rdes; - input rbuf; - input rstat; - output riack; - wire riack; - output eriack; - wire eriack; - output rpoll; - reg rpoll; - output rdbadc; - reg rdbadc; - output [DATADEPTH - 1:0] rdbad; - wire [DATADEPTH - 1:0] rdbad; - - output ble; - wire ble; - output dbo; - wire dbo; - output [1:0] dma_priority; - wire [1:0] dma_priority; - output [5:0] pbl; - wire [5:0] pbl; - output [4:0] dsl; - wire [4:0] dsl; - - input stoptc; - input stoptlsm; - input stoptfifo; - output stopt; - wire stopt; - output tps; - reg tps; - - input stoprc; - input stoprlsm; - output stopr; - wire stopr; - output rps; - reg rps; - - input sdi; - output sclk; - wire sclk; - output scs; - wire scs; - output sdo; - wire sdo; - - input mdi; - output mdc; - wire mdc; - output mdo; - wire mdo; - output mden; - wire mden; - - - reg [31:0] csrdata_c; - reg [3:0] csrdbe_c; - wire [1:0] csraddr10; - wire [5:0] csraddr72; - wire [1:0] csrbe10; - wire [31:0] csr0; - wire [31:0] csr5; - wire [31:0] csr6; - wire [31:0] csr7; - wire [31:0] csr8; - wire [31:0] csr9; - wire [31:0] csr11; - - reg csr0_dbo; - reg [2:0] csr0_tap; - reg [5:0] csr0_pbl; - reg csr0_ble; - reg [4:0] csr0_dsl; - reg csr0_bar; - reg csr0_swr; - - reg [31:0] csr3; - - reg [31:0] csr4; - - reg [2:0] csr5_ts; - reg [2:0] csr5_rs; - reg csr5_nis; - reg csr5_ais; - reg csr5_eri; - reg csr5_gte; - reg csr5_eti; - reg csr5_rps; - reg csr5_ru; - reg csr5_ri; - reg csr5_unf; - reg csr5_tu; - reg csr5_tps; - reg csr5_ti; - - reg csr6_ra; - reg csr6_ttm; - reg csr6_sf; - reg [1:0] csr6_tr; - reg csr6_st; - reg csr6_fd; - reg csr6_pm; - reg csr6_pr; - reg csr6_if; - reg csr6_pb; - reg csr6_ho; - reg csr6_sr; - reg csr6_hp; - - reg csr7_nie; - reg csr7_aie; - reg csr7_ere; - reg csr7_gte; - reg csr7_ete; - reg csr7_rse; - reg csr7_rue; - reg csr7_rie; - reg csr7_une; - reg csr7_tue; - reg csr7_tse; - reg csr7_tie; - - reg [10:0] csr8_foc; - reg csr8_oco; - reg [15:0] csr8_mfc; - reg csr8_mfo; - reg csr8read; - - reg csr9_mdi; - reg csr9_mii; - reg csr9_mdo; - reg csr9_mdc; - reg csr9_sdi; - reg csr9_sclk; - reg csr9_scs; - reg csr9_sdo; - - reg csr11_cs; - reg [3:0] csr11_tt; - reg [2:0] csr11_ntp; - reg [3:0] csr11_rt; - reg [2:0] csr11_nrp; - reg csr11_con; - reg [15:0] csr11_tim; - reg csr11wr; - - reg tapwr; - reg tpollcmd; - reg itpoll; - reg [2:0] tapcnt; - - reg [1:0] tpsm_c; - reg [1:0] tpsm; - reg tstopcmd; - reg tstartcmd; - reg stoptc_r; - reg stoptlsm_r; - reg stoptfifo_r; - wire [2:0] ts_c; - - reg [1:0] rpsm_c; - reg [1:0] rpsm; - reg rstopcmd; - reg rstartcmd; - reg stoprc_r; - reg stoprlsm_r; - wire [2:0] rs_c; - - reg rpollcmd; - - wire csr5wr_c; - reg csr5wr; - reg gte; - reg iint; - reg rireq_r; - reg rireq_r2; - reg eri; - reg erireq_r; - reg erireq_r2; - reg tireq_r; - reg tireq_r2; - reg eti; - reg etireq_r; - reg etireq_r2; - reg unfi; - reg unf_r; - reg unf_r2; - reg tui; - reg tu_r; - reg tu_r2; - reg rui; - reg ru_r; - reg ru_r2; - reg iic; - - reg rcsreq_r; - reg rcsreq_r1; - reg rimprog; - reg [3:0] rcscnt; - reg rcs2048; - reg rcs128; - reg [3:0] rtcnt; - reg [2:0] rcnt; - reg rimex; - - reg timprog; - reg [7:0] ttcnt; - reg [2:0] tcnt; - reg timex; - reg tcsreq_r1; - reg tcsreq_r2; - reg [3:0] tcscnt; - reg tcs2048; - reg tcs128; - - reg [10:0] foc_c; - reg [15:0] mfc_c; - reg [10:0] focg_r; - reg [15:0] mfcg_r; - - reg gstart; - reg gstart_r; - reg [15:0] gcnt; - wire [CSRWIDTH_MAX + 1:0] csrdatai_max; - wire [CSRWIDTH_MAX + 1:0] czero_max; - wire [CSRWIDTH_MAX/8 + 1:0] csrbe_max; - - assign csraddr10 = csraddr[1:0] ; - - assign csraddr72 = csraddr[7:2] ; - - assign csrbe10 = (CSRWIDTH == 16) ? csrbe_max[1:0] : {2{1'b1}} ; - - always @(csrdatai_max or csrbe_max or csraddr or csraddr10 or csrbe10) - begin : csrdata_proc - csrdata_c <= {32{1'b1}} ; - csrdbe_c <= {4{1'b1}} ; - case (CSRWIDTH) - 8 : - begin - if (csrbe_max[0]) - begin - case (csraddr10) - 2'b00 : - begin - csrdata_c[7:0] <= csrdatai_max[CSRWIDTH-1:0] ; - csrdbe_c <= 4'b0001 ; - end - 2'b01 : - begin - csrdata_c[15:8] <= csrdatai_max[CSRWIDTH-1:0] ; - csrdbe_c <= 4'b0010 ; - end - 2'b10 : - begin - csrdata_c[23:16] <= csrdatai_max[CSRWIDTH-1:0] ; - csrdbe_c <= 4'b0100 ; - end - default : - begin - csrdata_c[31:24] <= csrdatai_max[CSRWIDTH-1:0] ; - csrdbe_c <= 4'b1000 ; - end - endcase - end - else - begin - csrdbe_c <= 4'b0000 ; - end - end - 16 : - begin - case (csrbe10) - 2'b11 : - begin - if (csraddr[1]) - begin - csrdata_c[31:16] <= csrdatai_max[CSRWIDTH-1:0] ; - csrdbe_c <= 4'b1100 ; - end - else - begin - csrdata_c[15:0] <= csrdatai_max[CSRWIDTH-1:0] ; - csrdbe_c <= 4'b0011 ; - end - end - 2'b10 : - begin - if (csraddr[1]) - begin - csrdata_c[31:24] <= - csrdatai_max[CSRWIDTH - 1:CSRWIDTH / 2] ; - csrdbe_c <= 4'b1000 ; - end - else - begin - csrdata_c[15: 8] <= - csrdatai_max[CSRWIDTH - 1:CSRWIDTH / 2] ; - csrdbe_c <= 4'b0010 ; - end - end - 2'b01 : - begin - if (csraddr[1]) - begin - csrdata_c[23:16] <= csrdatai_max[7:0] ; - csrdbe_c <= 4'b0100 ; - end - else - begin - csrdata_c[7:0] <= csrdatai_max[7:0] ; - csrdbe_c <= 4'b0001 ; - end - end - default : - begin - csrdbe_c <= 4'b0000 ; - end - endcase - end - default : - begin - csrdata_c <= csrdatai_max[31:0] ; - csrdbe_c <= csrbe_max[3:0] ; - end - endcase - end - - always @(posedge clk) - begin : csr0_reg_proc - if (rst) - begin - csr0_dbo <= CSR0_RV[20] ; - csr0_tap <= CSR0_RV[19:17] ; - csr0_pbl <= CSR0_RV[13:8] ; - csr0_ble <= CSR0_RV[7] ; - csr0_dsl <= CSR0_RV[6:2] ; - csr0_bar <= CSR0_RV[1] ; - csr0_swr <= CSR0_RV[0] ; - tapwr <= 1'b0 ; - end - else - begin - if (!csrrw & csrreq & csraddr72 == CSR0_ID) - begin - if (csrdbe_c[2]) - begin - csr0_dbo <= csrdata_c[20] ; - csr0_tap <= csrdata_c[19:17] ; - tapwr <= 1'b1 ; - end - else - begin - tapwr <= 1'b0 ; - end - if (csrdbe_c[1]) - begin - csr0_pbl <= csrdata_c[13:8] ; - end - if (csrdbe_c[0]) - begin - csr0_ble <= csrdata_c[7] ; - csr0_dsl <= csrdata_c[6:2] ; - csr0_bar <= csrdata_c[1] ; - csr0_swr <= csrdata_c[0] ; - end - end - else - begin - tapwr <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : tpoolcmd_reg_proc - if (rst) - begin - tpollcmd <= 1'b0 ; - end - else - begin - if (!csrrw & csrreq & csraddr72 == CSR1_ID) - begin - tpollcmd <= 1'b1 ; - end - else - begin - tpollcmd <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : rpoolcmd_reg_proc - if (rst) - begin - rpollcmd <= 1'b0 ; - end - else - begin - if (!csrrw & csrreq & csraddr72 == CSR2_ID) - begin - rpollcmd <= 1'b1 ; - end - else - begin - rpollcmd <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : csr3_reg_proc - if (rst) - begin - csr3 <= CSR3_RV ; - end - else - begin - if (!csrrw & csrreq & csraddr72 == CSR3_ID) - begin - if (csrdbe_c[0]) - begin - csr3[7:0] <= csrdata_c[7:0] ; - end - if (csrdbe_c[1]) - begin - csr3[15:8] <= csrdata_c[15:8] ; - end - if (csrdbe_c[2]) - begin - csr3[23:16] <= csrdata_c[23:16] ; - end - if (csrdbe_c[3]) - begin - csr3[31:24] <= csrdata_c[31:24] ; - end - end - end - end - - assign rdbad = csr3[DATADEPTH - 1:0] ; - - always @(posedge clk) - begin : rdbadc_reg_proc - if (rst) - begin - rdbadc <= 1'b1 ; - end - else - begin - if (!csrrw & csrreq & csraddr72 == CSR3_ID & rpsm == PSM_STOP) - begin - rdbadc <= 1'b1 ; - end - else if (rpsm == PSM_RUN) - begin - rdbadc <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : csr4_reg_proc - if (rst) - begin - csr4 <= CSR4_RV ; - end - else - begin - if (!csrrw & csrreq & csraddr72 == CSR4_ID) - begin - if (csrdbe_c[0]) - begin - csr4[7:0] <= csrdata_c[7:0] ; - end - if (csrdbe_c[1]) - begin - csr4[15:8] <= csrdata_c[15:8] ; - end - if (csrdbe_c[2]) - begin - csr4[23:16] <= csrdata_c[23:16] ; - end - if (csrdbe_c[3]) - begin - csr4[31:24] <= csrdata_c[31:24] ; - end - end - end - end - - always @(posedge clk) - begin : tdbadc_reg_proc - if (rst) - begin - tdbadc <= 1'b1 ; - end - else - begin - if (!csrrw & csrreq & csraddr72 == CSR4_ID) - begin - tdbadc <= 1'b1 ; - end - else if (tpsm == PSM_RUN) - begin - tdbadc <= 1'b0 ; - end - end - end - - assign csr5wr_c = (!csrrw & csrreq & csraddr72 == CSR5_ID) ? 1'b1 : - 1'b0 ; - - always @(posedge clk) - begin : csr5wr_reg_proc - if (rst) - begin - csr5wr <= 1'b0 ; - end - else - begin - csr5wr <= csr5wr_c ; - end - end - - always @(posedge clk) - begin : csr5_reg_proc - if (rst) - begin - csr5_ts <= CSR5_RV[22:20] ; - csr5_rs <= CSR5_RV[19:17] ; - csr5_nis <= CSR5_RV[16] ; - csr5_ais <= CSR5_RV[15] ; - csr5_eri <= CSR5_RV[14] ; - csr5_gte <= CSR5_RV[11] ; - csr5_eti <= CSR5_RV[10] ; - csr5_rps <= CSR5_RV[8] ; - csr5_ru <= CSR5_RV[7] ; - csr5_ri <= CSR5_RV[6] ; - csr5_unf <= CSR5_RV[5] ; - csr5_tu <= CSR5_RV[2] ; - csr5_tps <= CSR5_RV[1] ; - csr5_ti <= CSR5_RV[0] ; - end - else - begin - if (csr5wr_c) - begin - if (csrdbe_c[2]) - begin - csr5_nis <= ~csrdata_c[16] & csr5_nis ; - end - if (csrdbe_c[1]) - begin - csr5_ais <= ~csrdata_c[15] & csr5_ais ; - csr5_eri <= ~csrdata_c[14] & csr5_eri ; - csr5_gte <= ~csrdata_c[11] & csr5_gte ; - csr5_eti <= ~csrdata_c[10] & csr5_eti ; - csr5_rps <= ~csrdata_c[8] & csr5_rps ; - end - if (csrdbe_c[0]) - begin - csr5_ru <= ~csrdata_c[7] & csr5_ru ; - csr5_ri <= ~csrdata_c[6] & csr5_ri ; - csr5_unf <= ~csrdata_c[5] & csr5_unf ; - csr5_tu <= ~csrdata_c[2] & csr5_tu ; - csr5_tps <= ~csrdata_c[1] & csr5_tps ; - csr5_ti <= ~csrdata_c[0] & csr5_ti ; - end - end - else - begin - if (timex) - begin - csr5_ti <= 1'b1 ; - end - if (rimex) - begin - csr5_ri <= 1'b1 ; - end - if (eti) - begin - csr5_eti <= 1'b1 ; - end - if (eri) - begin - csr5_eri <= 1'b1 ; - end - if (gte) - begin - csr5_gte <= 1'b1 ; - end - if (tpsm_c == PSM_STOP & - (tpsm == PSM_RUN | tpsm == PSM_SUSPEND)) - begin - csr5_tps <= 1'b1 ; - end - if (rpsm_c == PSM_STOP & - (rpsm == PSM_RUN | rpsm == PSM_SUSPEND)) - begin - csr5_rps <= 1'b1 ; - end - if (rui) - begin - csr5_ru <= 1'b1 ; - end - if (tui) - begin - csr5_tu <= 1'b1 ; - end - if (unfi) - begin - csr5_unf <= 1'b1 ; - end - if ((csr5_ri & csr7_rie) | - (csr5_ti & csr7_tie) | - (csr5_eri & csr7_ere) | - (csr5_tu & csr7_tue) | - (csr5_gte & csr7_gte)) - begin - csr5_nis <= 1'b1 ; - end - else - begin - csr5_nis <= 1'b0 ; - end - if ((csr5_eti & csr7_ete) | - (csr5_rps & csr7_rse) | - (csr5_ru & csr7_rue) | - (csr5_unf & csr7_une) | - (csr5_tps & csr7_tse)) - begin - csr5_ais <= 1'b1 ; - end - else - begin - csr5_ais <= 1'b0 ; - end - csr5_ts <= ts_c ; - csr5_rs <= rs_c ; - end - end - end - - always @(posedge clk) - begin : csr6_reg_proc - if (rst) - begin - csr6_ra <= CSR6_RV[30] ; - csr6_ttm <= CSR6_RV[22] ; - csr6_sf <= CSR6_RV[21] ; - csr6_tr <= CSR6_RV[15:14] ; - csr6_st <= CSR6_RV[13] ; - csr6_fd <= CSR6_RV[9] ; - csr6_pm <= CSR6_RV[7] ; - csr6_pr <= CSR6_RV[6] ; - csr6_if <= CSR6_RV[4] ; - csr6_pb <= CSR6_RV[3] ; - csr6_ho <= CSR6_RV[2] ; - csr6_sr <= CSR6_RV[1] ; - csr6_hp <= CSR6_RV[0] ; - end - else - begin - if (!csrrw & csrreq & csraddr72 == CSR6_ID) - begin - if (csrdbe_c[3]) - begin - csr6_ra <= csrdata_c[30] ; - end - if (csrdbe_c[2]) - begin - csr6_ttm <= csrdata_c[22] ; - if (tpsm == PSM_STOP) - begin - csr6_sf <= csrdata_c[21] ; - end - end - if (csrdbe_c[1]) - begin - csr6_tr <= csrdata_c[15:14] ; - csr6_st <= csrdata_c[13] ; - csr6_fd <= csrdata_c[9] ; - end - if (csrdbe_c[0]) - begin - csr6_pm <= csrdata_c[7] ; - csr6_pr <= csrdata_c[6] ; - csr6_pb <= csrdata_c[3] ; - csr6_sr <= csrdata_c[1] ; - end - end - case (ft) - FT_PERFECT : - begin - csr6_ho <= 1'b0 ; - csr6_if <= 1'b0 ; - csr6_hp <= 1'b0 ; - end - FT_HASH : - begin - csr6_ho <= 1'b0 ; - csr6_if <= 1'b0 ; - csr6_hp <= 1'b1 ; - end - FT_INVERSE : - begin - csr6_ho <= 1'b0 ; - csr6_if <= 1'b1 ; - csr6_hp <= 1'b0 ; - end - default : - begin - csr6_ho <= 1'b1 ; - csr6_if <= 1'b0 ; - csr6_hp <= 1'b1 ; - end - endcase - end - end - - always @(posedge clk) - begin : csr7_reg_proc - if (rst) - begin - csr7_nie <= CSR7_RV[16] ; - csr7_aie <= CSR7_RV[15] ; - csr7_ere <= CSR7_RV[14] ; - csr7_gte <= CSR7_RV[11] ; - csr7_ete <= CSR7_RV[10] ; - csr7_rse <= CSR7_RV[8] ; - csr7_rue <= CSR7_RV[7] ; - csr7_rie <= CSR7_RV[6] ; - csr7_une <= CSR7_RV[5] ; - csr7_tue <= CSR7_RV[2] ; - csr7_tse <= CSR7_RV[1] ; - csr7_tie <= CSR7_RV[0] ; - end - else - begin - if (!csrrw & csrreq & csraddr72 == CSR7_ID) - begin - if (csrdbe_c[2]) - begin - csr7_nie <= csrdata_c[16] ; - end - if (csrdbe_c[1]) - begin - csr7_aie <= csrdata_c[15] ; - csr7_ere <= csrdata_c[14] ; - csr7_gte <= csrdata_c[11] ; - csr7_ete <= csrdata_c[10] ; - csr7_rse <= csrdata_c[8] ; - end - if (csrdbe_c[0]) - begin - csr7_rue <= csrdata_c[7] ; - csr7_rie <= csrdata_c[6] ; - csr7_une <= csrdata_c[5] ; - csr7_tue <= csrdata_c[2] ; - csr7_tse <= csrdata_c[1] ; - csr7_tie <= csrdata_c[0] ; - end - end - end - end - - always @(posedge clk) - begin : csr8_reg_proc - if (rst) - begin - csr8_oco <= 1'b0 ; - csr8_mfo <= 1'b0 ; - csr8_foc <= {11{1'b0}} ; - csr8_mfc <= {16{1'b0}} ; - end - else - begin - if (!(csrrw & csrreq & csraddr72 == CSR8_ID)) - begin - if (!csr8read) - begin - csr8_foc <= foc_c ; - csr8_mfc <= mfc_c ; - csr8_oco <= oco ; - csr8_mfo <= mfo ; - end - end - end - end - - always @(posedge clk) - begin : csr8read_reg_proc - if (rst) - begin - csr8read <= 1'b0 ; - end - else - begin - if (csrrw & csrreq & csraddr72 == CSR8_ID) - begin - csr8read <= csrdbe_c[3] ; - end - else - begin - csr8read <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : csr9_reg_proc - if (rst) - begin - csr9_mdi <= CSR9_RV[19] ; - csr9_mii <= CSR9_RV[18] ; - csr9_mdo <= CSR9_RV[17] ; - csr9_mdc <= CSR9_RV[16] ; - csr9_sdi <= CSR9_RV[2] ; - csr9_sclk <= CSR9_RV[1] ; - csr9_scs <= CSR9_RV[0] ; - csr9_sdo <= CSR9_RV[3] ; - end - else - begin - if (!csrrw & csrreq & csraddr72 == CSR9_ID) - begin - if (csrdbe_c[0]) - begin - csr9_sclk <= csrdata_c[1] ; - csr9_scs <= csrdata_c[0] ; - csr9_sdo <= csrdata_c[3] ; - end - if (csrdbe_c[2]) - begin - csr9_mii <= csrdata_c[18] ; - csr9_mdo <= csrdata_c[17] ; - csr9_mdc <= csrdata_c[16] ; - end - end - csr9_mdi <= mdi ; - csr9_sdi <= sdi ; - end - end - - always @(posedge clk) - begin : csr11_reg_proc - if (rst) - begin - csr11_cs <= CSR11_RV[31] ; - csr11_tt <= CSR11_RV[30:27] ; - csr11_ntp <= CSR11_RV[26:24] ; - csr11_rt <= CSR11_RV[23:20] ; - csr11_nrp <= CSR11_RV[19:17] ; - csr11_con <= CSR11_RV[16] ; - csr11_tim <= CSR11_RV[15:0] ; - end - else - begin - if (!csrrw & csrreq & csraddr72 == CSR11_ID) - begin - if (csrdbe_c[3]) - begin - csr11_cs <= csrdata_c[31] ; - csr11_tt <= csrdata_c[30:27] ; - csr11_ntp <= csrdata_c[26:24] ; - end - if (csrdbe_c[2]) - begin - csr11_rt <= csrdata_c[23:20] ; - csr11_nrp <= csrdata_c[19:17] ; - csr11_con <= csrdata_c[16] ; - end - if (csrdbe_c[1]) - begin - csr11_tim[15:8] <= csrdata_c[15:8] ; - end - if (csrdbe_c[0]) - begin - csr11_tim[7:0] <= csrdata_c[7:0] ; - end - end - end - end - - always @(posedge clk) - begin : csr11wr_reg_proc - if (rst) - begin - csr11wr <= 1'b0 ; - end - else - begin - if (!csrrw & csrreq & csraddr72 == CSR11_ID) - begin - csr11wr <= 1'b1 ; - end - else - begin - csr11wr <= 1'b0 ; - end - end - end - - assign csr0 = {CSR0_RV[31:26], CSR0_RV[25:21], csr0_dbo, csr0_tap, - CSR0_RV[16:14], csr0_pbl, csr0_ble, - csr0_dsl, csr0_bar, (rst | csr0_swr)} ; - - assign csr5 = {CSR5_RV[31:23], csr5_ts, csr5_rs, csr5_nis, - csr5_ais, csr5_eri, CSR5_RV[13:12], csr5_gte, csr5_eti, - CSR5_RV[9], csr5_rps, csr5_ru, csr5_ri, csr5_unf, - CSR5_RV[4:3], csr5_tu, csr5_tps, csr5_ti} ; - - assign csr6 = {CSR6_RV[31], csr6_ra, CSR6_RV[29:26], - CSR6_RV[25:23], csr6_ttm, csr6_sf, CSR6_RV[20], - CSR6_RV[19], CSR6_RV[18], CSR6_RV[17], CSR6_RV[16], - csr6_tr, csr6_st, CSR6_RV[13], CSR6_RV[12:11], - csr6_fd, CSR6_RV[8], csr6_pm, csr6_pr, CSR6_RV[5], - csr6_if, csr6_pb, csr6_ho, csr6_sr, csr6_hp} ; - - assign csr7 = {CSR7_RV[31:17], csr7_nie, csr7_aie, csr7_ere, - CSR7_RV[13:12], csr7_gte, csr7_ete, CSR6_RV[9], - csr7_rse, csr7_rue, csr7_rie, csr7_une, - CSR7_RV[4:3], csr7_tue, csr7_tse, csr7_tie} ; - - assign csr8 = {CSR8_RV[31:29], csr8_oco, csr8_foc, - csr8_mfo, csr8_mfc} ; - - assign csr9 = {CSR9_RV[31:20], csr9_mdi, csr9_mii, csr9_mdo, - csr9_mdc, CSR9_RV[15:4], csr9_sdo, csr9_sdi, - csr9_sclk, csr9_scs} ; - - assign csr11 = {csr11_cs, ttcnt[7:4], tcnt[2:0], rtcnt[3:0], - rcnt[2:0], csr11_con, gcnt} ; - - always @(csr0 or - csr3 or - csr4 or - csr5 or - csr6 or - csr7 or - csr8 or - csr9 or - csr11 or - csraddr or - csraddr72 or - csraddr10) - begin : csrmux_proc - case (CSRWIDTH) - 8 : - begin - case (csraddr10) - 2'b00 : - begin - case (csraddr72) - CSR0_ID : - begin - csrdatao <= csr0[7:0] ; - end - CSR3_ID : - begin - csrdatao <= csr3[7:0] ; - end - CSR4_ID : - begin - csrdatao <= csr4[7:0] ; - end - CSR5_ID : - begin - csrdatao <= csr5[7:0] ; - end - CSR6_ID : - begin - csrdatao <= csr6[7:0] ; - end - CSR7_ID : - begin - csrdatao <= csr7[7:0] ; - end - CSR8_ID : - begin - csrdatao <= csr8[7:0] ; - end - CSR9_ID : - begin - csrdatao <= csr9[7:0] ; - end - CSR11_ID : - begin - csrdatao <= csr11[7:0] ; - end - default : - begin - csrdatao <= {CSRWIDTH{1'b0}} ; - end - endcase - end - 2'b01 : - begin - case (csraddr72) - CSR0_ID : - begin - csrdatao <= csr0[15:8] ; - end - CSR3_ID : - begin - csrdatao <= csr3[15:8] ; - end - CSR4_ID : - begin - csrdatao <= csr4[15:8] ; - end - CSR5_ID : - begin - csrdatao <= csr5[15:8] ; - end - CSR6_ID : - begin - csrdatao <= csr6[15:8] ; - end - CSR7_ID : - begin - csrdatao <= csr7[15:8] ; - end - CSR8_ID : - begin - csrdatao <= csr8[15:8] ; - end - CSR9_ID : - begin - csrdatao <= csr9[15:8] ; - end - CSR11_ID : - begin - csrdatao <= csr11[15:8] ; - end - default : - begin - csrdatao <= {CSRWIDTH{1'b0}} ; - end - endcase - end - 2'b10 : - begin - case (csraddr72) - CSR0_ID : - begin - csrdatao <= csr0[23:16] ; - end - CSR3_ID : - begin - csrdatao <= csr3[23:16] ; - end - CSR4_ID : - begin - csrdatao <= csr4[23:16] ; - end - CSR5_ID : - begin - csrdatao <= csr5[23:16] ; - end - CSR6_ID : - begin - csrdatao <= csr6[23:16] ; - end - CSR7_ID : - begin - csrdatao <= csr7[23:16] ; - end - CSR8_ID : - begin - csrdatao <= csr8[23:16] ; - end - CSR9_ID : - begin - csrdatao <= csr9[23:16] ; - end - CSR11_ID : - begin - csrdatao <= csr11[23:16] ; - end - default : - begin - csrdatao <= {CSRWIDTH{1'b0}} ; - end - endcase - end - 2'b11 : - begin - case (csraddr72) - CSR0_ID : - begin - csrdatao <= csr0[31:24] ; - end - CSR3_ID : - begin - csrdatao <= csr3[31:24] ; - end - CSR4_ID : - begin - csrdatao <= csr4[31:24] ; - end - CSR5_ID : - begin - csrdatao <= csr5[31:24] ; - end - CSR6_ID : - begin - csrdatao <= csr6[31:24] ; - end - CSR7_ID : - begin - csrdatao <= csr7[31:24] ; - end - CSR8_ID : - begin - csrdatao <= csr8[31:24] ; - end - CSR9_ID : - begin - csrdatao <= csr9[31:24] ; - end - CSR11_ID : - begin - csrdatao <= csr11[31:24] ; - end - default : - begin - csrdatao <= {CSRWIDTH{1'b0}} ; - end - endcase - end - default : - begin - csrdatao <= {CSRWIDTH{1'b0}} ; - end - endcase - end - 16 : - begin - case (csraddr[1]) - 1'b0 : - begin - case (csraddr72) - CSR0_ID : - begin - csrdatao <= csr0[15:0] ; - end - CSR3_ID : - begin - csrdatao <= csr3[15:0] ; - end - CSR4_ID : - begin - csrdatao <= csr4[15:0] ; - end - CSR5_ID : - begin - csrdatao <= csr5[15:0] ; - end - CSR6_ID : - begin - csrdatao <= csr6[15:0] ; - end - CSR7_ID : - begin - csrdatao <= csr7[15:0] ; - end - CSR8_ID : - begin - csrdatao <= csr8[15:0] ; - end - CSR9_ID : - begin - csrdatao <= csr9[15:0] ; - end - CSR11_ID : - begin - csrdatao <= csr11[15:0] ; - end - default : - begin - csrdatao <= {CSRWIDTH{1'b0}} ; - end - endcase - end - 1'b1 : - begin - case (csraddr72) - CSR0_ID : - begin - csrdatao <= csr0[31:16] ; - end - CSR3_ID : - begin - csrdatao <= csr3[31:16] ; - end - CSR4_ID : - begin - csrdatao <= csr4[31:16] ; - end - CSR5_ID : - begin - csrdatao <= csr5[31:16] ; - end - CSR6_ID : - begin - csrdatao <= csr6[31:16] ; - end - CSR7_ID : - begin - csrdatao <= csr7[31:16] ; - end - CSR8_ID : - begin - csrdatao <= csr8[31:16] ; - end - CSR9_ID : - begin - csrdatao <= csr9[31:16] ; - end - CSR11_ID : - begin - csrdatao <= csr11[31:16] ; - end - default : - begin - csrdatao <= {CSRWIDTH{1'b0}} ; - end - endcase - end - default : - begin - csrdatao <= {CSRWIDTH{1'b0}} ; - end - endcase - end - default : - begin - case (csraddr72) - CSR0_ID : - begin - csrdatao <= csr0 ; - end - CSR3_ID : - begin - csrdatao <= csr3 ; - end - CSR4_ID : - begin - csrdatao <= csr4 ; - end - CSR5_ID : - begin - csrdatao <= csr5 ; - end - CSR6_ID : - begin - csrdatao <= csr6 ; - end - CSR7_ID : - begin - csrdatao <= csr7 ; - end - CSR8_ID : - begin - csrdatao <= csr8 ; - end - CSR9_ID : - begin - csrdatao <= csr9 ; - end - CSR11_ID : - begin - csrdatao <= csr11 ; - end - default : - begin - csrdatao <= {CSRWIDTH{1'b0}} ; - end - endcase - end - endcase - end - - assign csrack = 1'b1 ; - - assign dma_priority = (csr0_bar & !tprog) ? 2'b01 : - (csr0_bar & tprog) ? 2'b10 : - 2'b00 ; - - assign dbo = csr0_dbo ; - - assign pbl = csr0_pbl ; - - assign dsl = csr0_dsl ; - - assign ble = csr0_ble ; - - assign tdbad = csr4[DATADEPTH - 1:0] ; - - always @(posedge clk) - begin : itpoll_reg_proc - if (rst) - begin - itpoll <= 1'b0 ; - end - else - begin - if (((((csr0_tap == 3'b001 | - csr0_tap == 3'b010 | - csr0_tap == 3'b011) & tcs2048) | - ((csr0_tap == 3'b100 | - csr0_tap == 3'b101 | - csr0_tap == 3'b110 | - csr0_tap == 3'b111) & tcs128)) & - tapcnt == 3'b000 & tpsm == PSM_SUSPEND) | - tpollcmd | tstartcmd) - begin - itpoll <= 1'b1 ; - end - else if (tpollack) - begin - itpoll <= 1'b0 ; - end - end - end - - assign tpoll = itpoll ; - - always @(posedge clk) - begin : tap_reg_proc - if (rst) - begin - tapcnt <= {3{1'b1}} ; - end - else - begin - if (((csr0_tap == 3'b001 | - csr0_tap == 3'b010 | - csr0_tap == 3'b011) & (tcs2048 | tapwr)) | - ((csr0_tap == 3'b100 | - csr0_tap == 3'b101 | - csr0_tap == 3'b110 | - csr0_tap == 3'b111) & (tcs128 | tapwr))) - begin - if (tapcnt == 3'b000 | tapwr) - begin - case (csr0_tap) - 3'b001 : - begin - tapcnt <= 3'b000 ; - end - 3'b010 : - begin - tapcnt <= 3'b010 ; - end - 3'b011 : - begin - tapcnt <= 3'b110 ; - end - 3'b100 : - begin - tapcnt <= 3'b000 ; - end - 3'b101 : - begin - tapcnt <= 3'b001 ; - end - 3'b110 : - begin - tapcnt <= 3'b010 ; - end - default : - begin - tapcnt <= 3'b111 ; - end - endcase - end - else - begin - tapcnt <= tapcnt - 1 ; - end - end - end - end - - assign tm = {csr6_ttm, csr6_tr} ; - - assign sf = csr6_sf ; - - always @(posedge clk) - begin : tim_reg_proc - if (rst) - begin - timprog <= 1'b0 ; - timex <= 1'b0 ; - ttcnt <= {8{1'b1}} ; - tcnt <= {3{1'b1}} ; - end - else - begin - if (csr5_ti) - begin - timprog <= 1'b0 ; - end - else if (tireq_r & !tireq_r2) - begin - timprog <= 1'b1 ; - end - - if (csr5_ti) - begin - timex <= 1'b0 ; - end - else if (timprog & - ((ttcnt == 8'b00000000 & csr11_tt != 4'b0000) | - (tcnt == 3'b000 & csr11_ntp != 3'b000) | - (iic) | - (csr11_tt == 4'b0000 & csr11_ntp == 3'b000))) - begin - timex <= 1'b1 ; - end - - if ((tireq_r & !tireq_r2) | csr5_ti | csr11wr) - begin - ttcnt <= {csr11_tt, 4'b0000} ; - end - else if (((tcs128 & csr11_cs) | - (tcs2048 & !csr11_cs)) & - ttcnt != 8'b00000000 & timprog) - begin - ttcnt <= ttcnt - 1 ; - end - - if (csr5_ti | csr11wr) - begin - tcnt <= csr11_ntp ; - end - else if (tireq_r & !tireq_r2 & - tcnt != 3'b000 & csr11_ntp != 3'b000) - begin - tcnt <= tcnt - 1 ; - end - end - end - - always @(posedge clk) - begin : tcscnt_reg_proc - if (rst) - begin - tcsreq_r1 <= 1'b0 ; - tcsreq_r2 <= 1'b0 ; - tcs2048 <= 1'b0 ; - tcs128 <= 1'b0 ; - tcscnt <= {4{1'b1}} ; - end - else - begin - tcsreq_r1 <= tcsreq ; - tcsreq_r2 <= tcsreq_r1 ; - - if (tcs128) - begin - if (tcscnt == 4'b0000) - begin - tcscnt <= 4'b1111 ; - end - else - begin - tcscnt <= tcscnt - 1 ; - end - end - - if (tcsreq_r1 & !tcsreq_r2) - begin - tcs128 <= 1'b1 ; - end - else - begin - tcs128 <= 1'b0 ; - end - - if (tcscnt == 4'b0000 & tcs128) - begin - tcs2048 <= 1'b1 ; - end - else - begin - tcs2048 <= 1'b0 ; - end - - end - end - - assign tcsack = tcsreq_r2 ; - - always @(posedge clk) - begin : st_reg_proc - if (rst) - begin - tstopcmd <= 1'b1 ; - tstartcmd <= 1'b0 ; - end - else - begin - if (tstartcmd) - begin - tstopcmd <= 1'b0 ; - end - else if (!csrrw & csrreq & !(csrdata_c[13]) & - csraddr72 == CSR6_ID & (csrdbe_c[1])) - begin - tstopcmd <= 1'b1 ; - end - - if (tpsm == PSM_RUN | tpsm == PSM_SUSPEND) - begin - tstartcmd <= 1'b0 ; - end - else if (!csrrw & csrreq & (csrdata_c[13]) & - csraddr72 == CSR6_ID & (csrdbe_c[1])) - begin - tstartcmd <= 1'b1 ; - end - - end - end - - assign ts_c = (tpsm == PSM_STOP) ? 3'b000 : - (tpsm == PSM_SUSPEND) ? 3'b110 : - (tstat) ? 3'b111 : - (tdes) ? 3'b001 : - (tset) ? 3'b101 : - (tbuf) ? 3'b011 : - (tprog) ? 3'b010 : - csr5_ts ; - - always @(posedge clk) - begin : tpsack_reg_proc - if (rst) - begin - stoptc_r <= 1'b0 ; - stoptlsm_r <= 1'b0 ; - stoptfifo_r <= 1'b0 ; - end - else - begin - stoptc_r <= stoptc ; - stoptlsm_r <= stoptlsm ; - stoptfifo_r <= stoptfifo ; - end - end - - always @(tpsm or - tstartcmd or - tstopcmd or - tu_r or - stoptc_r or - stoptlsm_r or - stoptfifo_r) - begin : tpsm_proc - case (tpsm) - PSM_STOP : - begin - if (tstartcmd & !stoptc_r & !stoptlsm_r & !stoptfifo_r) - begin - tpsm_c <= PSM_RUN ; - end - else - begin - tpsm_c <= PSM_STOP ; - end - end - PSM_SUSPEND : - begin - if (tstopcmd & stoptc_r & stoptlsm_r & stoptfifo_r) - begin - tpsm_c <= PSM_STOP ; - end - else if (!tu_r) - begin - tpsm_c <= PSM_RUN ; - end - else - begin - tpsm_c <= PSM_SUSPEND ; - end - end - default : - begin - if (tstopcmd & stoptc_r & stoptlsm_r & stoptfifo_r) - begin - tpsm_c <= PSM_STOP ; - end - else if (tu_r) - begin - tpsm_c <= PSM_SUSPEND ; - end - else - begin - tpsm_c <= PSM_RUN ; - end - end - endcase - end - - always @(posedge clk) - begin : tpsm_reg_proc - if (rst) - begin - tpsm <= PSM_STOP ; - end - else - begin - tpsm <= tpsm_c ; - end - end - - always @(posedge clk) - begin : tps_reg_proc - if (rst) - begin - tps <= 1'b0 ; - end - else - begin - if (tstartcmd) - begin - tps <= 1'b0 ; - end - else if (tpsm == PSM_STOP) - begin - tps <= 1'b1 ; - end - end - end - - assign stopt = tstopcmd ; - - assign ren = csr6_sr ; - - assign fd = csr6_fd ; - - assign ra = csr6_ra ; - - assign pm = csr6_pm ; - - assign pr = csr6_pr ; - - assign rif = csr6_if ; - - assign pb = csr6_pb ; - - assign ho = csr6_ho ; - - assign hp = csr6_hp ; - - always @(posedge clk) - begin : rpoll_reg_proc - if (rst) - begin - rpoll <= 1'b0 ; - end - else - begin - if (rpollcmd | rstartcmd) - begin - rpoll <= 1'b1 ; - end - else if (rpollack) - begin - rpoll <= 1'b0 ; - end - end - end - - assign rs_c = (rpsm == PSM_STOP) ? 3'b000 : - (rpsm == PSM_SUSPEND) ? 3'b100 : - (rstat) ? 3'b101 : - (rdes) ? 3'b001 : - (rbuf) ? 3'b111 : - (rprog) ? 3'b010 : - 3'b011 ; - - always @(posedge clk) - begin : rpsack_reg_proc - if (rst) - begin - stoprc_r <= 1'b0 ; - stoprlsm_r <= 1'b0 ; - end - else - begin - stoprc_r <= stoprc ; - stoprlsm_r <= stoprlsm ; - end - end - - always @(rpsm or - rstartcmd or - rstopcmd or - rui or - ru_r or - stoprc_r or - stoprlsm_r) - begin : rpsm_proc - case (rpsm) - PSM_STOP : - begin - if (rstartcmd & !stoprc_r & !stoprlsm_r) - begin - rpsm_c <= PSM_RUN ; - end - else - begin - rpsm_c <= PSM_STOP ; - end - end - PSM_SUSPEND : - begin - if (rstopcmd & stoprc_r & stoprlsm_r) - begin - rpsm_c <= PSM_STOP ; - end - else if (!ru_r) - begin - rpsm_c <= PSM_RUN ; - end - else - begin - rpsm_c <= PSM_SUSPEND ; - end - end - default : - begin - if (rstopcmd & stoprc_r & stoprlsm_r) - begin - rpsm_c <= PSM_STOP ; - end - else if (rui) - begin - rpsm_c <= PSM_SUSPEND ; - end - else - begin - rpsm_c <= PSM_RUN ; - end - end - endcase - end - - always @(posedge clk) - begin : rpsm_reg_proc - if (rst) - begin - rpsm <= PSM_STOP ; - end - else - begin - rpsm <= rpsm_c ; - end - end - - always @(posedge clk) - begin : rps_reg_proc - if (rst) - begin - rps <= 1'b0 ; - end - else - begin - if (rstartcmd) - begin - rps <= 1'b0 ; - end - else if (rpsm == PSM_STOP) - begin - rps <= 1'b1 ; - end - end - end - - always @(posedge clk) - begin : rstartcmd_reg_proc - if (rst) - begin - rstartcmd <= 1'b0 ; - rstopcmd <= 1'b0 ; - end - else - begin - if (rpsm == PSM_RUN) - begin - rstartcmd <= 1'b0 ; - end - else if (!csrrw & csrreq & (csrdata_c[1]) & - csraddr72 == CSR6_ID & (csrdbe_c[0])) - begin - rstartcmd <= 1'b1 ; - end - - if (rpsm == PSM_STOP) - begin - rstopcmd <= 1'b0 ; - end - else if (!csrrw & csrreq & !(csrdata_c[1]) & - csraddr72 == CSR6_ID & (csrdbe_c[0])) - begin - rstopcmd <= 1'b1 ; - end - end - end - - assign stopr = rstopcmd ; - - always @(posedge clk) - begin : rim_reg_proc - if (rst) - begin - rimex <= 1'b0 ; - rimprog <= 1'b0 ; - rtcnt <= {4{1'b1}} ; - rcnt <= {3{1'b1}} ; - end - else - begin - if (csr5_ri) - begin - rimex <= 1'b0 ; - end - else if (rimprog & - ((rtcnt == 4'b0000 & csr11_rt != 4'b0000) | - (rcnt == 3'b000 & csr11_nrp != 3'b000) | - (csr11_rt == 4'b0000 & csr11_nrp == 3'b000))) - begin - rimex <= 1'b1 ; - end - - if (csr5_ri) - begin - rimprog <= 1'b0 ; - end - else if (rireq_r & !rireq_r2) - begin - rimprog <= 1'b1 ; - end - - if ((rireq_r & !rireq_r2) | csr5_ri) - begin - rtcnt <= csr11_rt ; - end - else if (((rcs128 & csr11_cs) | - (rcs2048 & !csr11_cs)) & - rtcnt != 4'b0000 & rimprog) - begin - rtcnt <= rtcnt - 1 ; - end - - if (csr5_ri | csr11wr) - begin - rcnt <= csr11_nrp ; - end - else if (rireq_r & !rireq_r2 & - rcnt != 3'b000 & csr11_nrp != 3'b000) - begin - rcnt <= rcnt - 1 ; - end - - end - end - - always @(posedge clk) - begin : rcscnt_reg_proc - if (rst) - begin - rcsreq_r <= 1'b0 ; - rcsreq_r1 <= 1'b0 ; - rcscnt <= {4{1'b1}} ; - rcs128 <= 1'b0 ; - rcs2048 <= 1'b0 ; - end - else - begin - - rcsreq_r <= rcsreq ; - rcsreq_r1 <= rcsreq_r ; - - if (rcs128) - begin - if (rcscnt == 4'b0000) - begin - rcscnt <= 4'b1111 ; - end - else - begin - rcscnt <= rcscnt - 1 ; - end - end - - if (rcsreq_r & !rcsreq_r1) - begin - rcs128 <= 1'b1 ; - end - else - begin - rcs128 <= 1'b0 ; - end - - if (rcscnt == 4'b0000 & rcs128) - begin - rcs2048 <= 1'b1 ; - end - else - begin - rcs2048 <= 1'b0 ; - end - end - end - - assign rcsack = rcsreq_r ; - - always @(posedge clk) - begin : ireq_reg_proc - if (rst) - begin - rireq_r <= 1'b0 ; - rireq_r2 <= 1'b0 ; - erireq_r <= 1'b0 ; - erireq_r2 <= 1'b0 ; - tireq_r <= 1'b0 ; - tireq_r2 <= 1'b0 ; - etireq_r <= 1'b0 ; - etireq_r2 <= 1'b0 ; - unf_r <= 1'b0 ; - unf_r2 <= 1'b0 ; - tu_r <= 1'b0 ; - tu_r2 <= 1'b0 ; - ru_r <= 1'b0 ; - ru_r2 <= 1'b0 ; - end - else - begin - rireq_r <= rireq ; - rireq_r2 <= rireq_r ; - erireq_r <= erireq ; - erireq_r2 <= erireq_r ; - tireq_r <= tireq ; - tireq_r2 <= tireq_r ; - etireq_r <= etireq ; - etireq_r2 <= etireq_r ; - unf_r <= unf ; - unf_r2 <= unf_r ; - tu_r <= tu ; - tu_r2 <= tu_r ; - ru_r <= ru ; - ru_r2 <= ru_r ; - end - end - - always @(posedge clk) - begin : iic_reg_proc - if (rst) - begin - iic <= 1'b0 ; - end - else - begin - if (tireq_r & !tireq_r2) - begin - if (!ic & !iint) - begin - iic <= 1'b0 ; - end - else - begin - iic <= 1'b1 ; - end - end - end - end - - always @(posedge clk) - begin : eti_reg_proc - if (rst) - begin - eti <= 1'b0 ; - end - else - begin - if (etireq_r & !etireq_r2) - begin - eti <= 1'b1 ; - end - else if (!csr5wr_c) - begin - eti <= 1'b0 ; - end - end - end - - assign etiack = etireq_r2 ; - - always @(posedge clk) - begin : eri_reg_proc - if (rst) - begin - eri <= 1'b0 ; - end - else - begin - if (erireq_r & !erireq_r2) - begin - eri <= 1'b1 ; - end - else if (!csr5wr_c) - begin - eri <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : unfi_reg_proc - if (rst) - begin - unfi <= 1'b0 ; - end - else - begin - if (unf_r & !unf_r2) - begin - unfi <= 1'b1 ; - end - else if (!csr5wr_c) - begin - unfi <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : tui_reg_proc - if (rst) - begin - tui <= 1'b0 ; - end - else - begin - if (tu_r & !tu_r2) - begin - tui <= 1'b1 ; - end - else if (!csr5wr_c) - begin - tui <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : rui_reg_proc - if (rst) - begin - rui <= 1'b0 ; - end - else - begin - if (ru_r & !ru_r2) - begin - rui <= 1'b1 ; - end - else if (!csr5wr_c) - begin - rui <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : iint_reg_proc - if (rst) - begin - iint <= 1'b0 ; - end - else - begin - iint <= ((csr5_nis && csr7_nie) || - (csr5_ais && csr7_aie)) && ~csr5wr; - end - end - - assign interrupt = iint ; - - assign riack = rireq_r2 ; - - assign eriack = erireq_r2 ; - - assign tiack = tireq_r2 ; - - always @(focg_r) - begin : foc_proc - reg [10:0] foc_v; - - foc_v[10] = focg_r[10] ; - begin : foc_loop - integer i; - for(i = 9; i >= 0; i = i - 1) - begin - foc_v[i] = foc_v[i + 1] ^ focg_r[i] ; - end - end - foc_c = foc_v; - end - - always @(mfcg_r) - begin : mfc_proc - reg [15:0] mfc_v; - - mfc_v[15] = mfcg_r[10] ; - begin : mfc_loop - integer i; - for(i = 14; i >= 0; i = i - 1) - begin - mfc_v[i] = mfc_v[i + 1] ^ mfcg_r[i] ; - end - end - mfc_c = mfc_v; - end - - always @(posedge clk) - begin : sc_reg_proc - if (rst) - begin - focl <= 1'b0 ; - mfcl <= 1'b0 ; - focg_r <= {11{1'b0}} ; - mfcg_r <= {16{1'b0}} ; - end - else - begin - if (csr8read) - begin - focl <= 1'b1 ; - end - else if (foclack) - begin - focl <= 1'b0 ; - end - - if (csr8read) - begin - mfcl <= 1'b1 ; - end - else if (mfclack) - begin - mfcl <= 1'b0 ; - end - - mfcg_r <= mfcg ; - - focg_r <= focg ; - - end - end - - assign mdo = csr9_mdo ; - - assign mden = csr9_mii ; - - assign mdc = csr9_mdc ; - - assign sclk = csr9_sclk ; - - assign scs = csr9_scs ; - - assign sdo = csr9_sdo ; - - always @(posedge clk) - begin : gpt_reg_proc - if (rst) - begin - gstart <= 1'b0 ; - gstart_r <= 1'b0 ; - gcnt <= {16{1'b0}} ; - gte <= 1'b0 ; - end - else - begin - if (!csrrw & csrreq & (csrdbe_c[3]) & csraddr72 == CSR11_ID) - begin - gstart <= 1'b1 ; - end - else if ((!csr11_con & gte) | - csr11_tim == 16'b0000000000000000) - begin - gstart <= 1'b0 ; - end - - if(csr11_tim != 16'b0000000000000000) - begin - gstart_r <= gstart ; - end - else - begin - gstart_r <= 1'b0 ; - end - - if (gstart & !gstart_r) - begin - gcnt <= csr11_tim ; - end - else if (gcnt == 16'b0000000000000000) - begin - if (csr11_con) - begin - gcnt <= csr11_tim ; - end - end - else if (tcs2048) - begin - gcnt <= gcnt - 1 ; - end - - if (csr5wr_c) - begin - gte <= 1'b0 ; - end - else if (gstart_r & gcnt == 16'b0000000000000000 & - csr11_tim != 16'b0000000000000000) - begin - gte <= 1'b1 ; - end - - end - end - - always @(posedge clk) - begin : rstsofto_reg_proc - rstsofto <= csr0_swr; - end - - assign czero_max = {CSRWIDTH_MAX{1'b0}} ; - - assign csrdatai_max = {czero_max[CSRWIDTH_MAX+1:CSRWIDTH], - csrdatai}; - - assign csrbe_max = {czero_max[CSRWIDTH_MAX/8+1:CSRWIDTH/8], - csrbe}; - -endmodule - - - -module DMA_V ( - clk, - rst, - dma_priority, - ble, - dbo, - rdes, - rbuf, - rstat, - tdes, - tbuf, - tstat, - dataack, - datai, - datareq, - datareqc, - datarw, - dataeob, - dataeobc, - datao, - dataaddr, - idataaddr, - req1, - write1, - tcnt1, - addr1, - datai1, - ack1, - eob1, - datao1, - req2, - write2, - tcnt2, - addr2, - datai2, - ack2, - eob2, - datao2); - - parameter DATAWIDTH = 32; - parameter DATADEPTH = 32; - - `include "utility.v" - - input clk; - input rst; - - input [1:0] dma_priority; - input ble; - input dbo; - input rdes; - input rbuf; - input rstat; - input tdes; - input tbuf; - input tstat; - - - input dataack; - input [DATAWIDTH - 1:0] datai; - output datareq; - wire datareq; - output datareqc; - wire datareqc; - output datarw; - reg datarw; - output dataeob; - wire dataeob; - output dataeobc; - wire dataeobc; - output [DATAWIDTH - 1:0] datao; - wire [DATAWIDTH - 1:0] datao; - output [DATADEPTH - 1:0] dataaddr; - wire [DATADEPTH - 1:0] dataaddr; - output [DATADEPTH - 1:0] idataaddr; - wire [DATADEPTH - 1:0] idataaddr; - - input req1; - input write1; - input [FIFODEPTH_MAX - 1:0] tcnt1; - input [DATADEPTH - 1:0] addr1; - input [DATAWIDTH - 1:0] datai1; - output ack1; - wire ack1; - output eob1; - wire eob1; - output [DATAWIDTH - 1:0] datao1; - wire [DATAWIDTH - 1:0] datao1; - - input req2; - input write2; - input [FIFODEPTH_MAX - 1:0] tcnt2; - input [DATADEPTH - 1:0] addr2; - input [DATAWIDTH - 1:0] datai2; - output ack2; - wire ack2; - output eob2; - wire eob2; - output [DATAWIDTH - 1:0] datao2; - wire [DATAWIDTH - 1:0] datao2; - - - reg [1:0] dsm_c; - reg [1:0] dsm; - reg hist1; - reg hist2; - wire [1:0] dmareq; - reg [FIFODEPTH_MAX - 1:0] msmbcnt; - reg idatareq; - reg idatareqc; - reg eob; - reg eobc; - reg [DATADEPTH - 1:0] addr_c; - reg [DATADEPTH - 1:0] addr; - reg blesel_c; - reg [DATAWIDTH - 1:0] dataible_c; - reg [DATAWIDTH - 1:0] dataoble_c; - wire [DATAWIDTH_MAX + 1:0] datai_max; - reg req_c; - reg write_c; - reg [FIFODEPTH_MAX - 1:0] tcnt_c; - reg [DATADEPTH - 1:0] saddr_c; - reg [DATAWIDTH_MAX - 1:0] datai_c; - wire [DATAWIDTH_MAX + 1:0] datai_max_c; - wire [FIFODEPTH_MAX - 1:0] fzero; - wire [DATAWIDTH_MAX + 1:0] dzero; - - assign dmareq = {req2, req1} ; - - always @(dsm or - dmareq or - hist1 or - hist2 or - dma_priority or - eob or - dataack) - begin : dsm_proc - case (dsm) - DSM_IDLE : - begin - case (dmareq) - 2'b11 : - begin - case (dma_priority) - 2'b01 : - begin - if (!hist1 & !hist2) - begin - dsm_c <= DSM_CH2 ; - end - else - begin - dsm_c <= DSM_CH1 ; - end - end - 2'b10 : - begin - if (hist1 & hist2) - begin - dsm_c <= DSM_CH1 ; - end - else - begin - dsm_c <= DSM_CH2 ; - end - end - default : - begin - if (hist1) - begin - dsm_c <= DSM_CH1 ; - end - else - begin - dsm_c <= DSM_CH2 ; - end - end - endcase - end - 2'b01 : - begin - dsm_c <= DSM_CH1 ; - end - 2'b10 : - begin - dsm_c <= DSM_CH2 ; - end - default : - begin - dsm_c <= DSM_IDLE ; - end - endcase - end - DSM_CH1 : - begin - if (eob & dataack) - begin - dsm_c <= DSM_IDLE ; - end - else - begin - dsm_c <= DSM_CH1 ; - end - end - default : - begin - if (eob & dataack) - begin - dsm_c <= DSM_IDLE ; - end - else - begin - dsm_c <= DSM_CH2 ; - end - end - endcase - end - - always @(posedge clk) - begin : dsm_reg_proc - if (rst) - begin - dsm <= DSM_IDLE ; - end - else - begin - dsm <= dsm_c ; - end - end - - always @(posedge clk) - begin : hist_reg_proc - if (rst) - begin - hist1 <= 1'b1 ; - hist2 <= 1'b1 ; - end - else - begin - if (eob) - begin - case (dsm) - DSM_CH1 : - begin - hist1 <= 1'b1 ; - end - DSM_CH2 : - begin - hist1 <= 1'b0 ; - end - default : - begin - hist1 <= hist1 ; - end - endcase - end - hist2 <= hist1 ; - end - end - - always @(dbo or - ble or - dsm_c or - dsm or - tdes or - tbuf or - tstat or - rdes or - rbuf or - rstat) - begin : blesel_proc - if (dsm_c == DSM_CH1 | dsm == DSM_CH1) - begin - if ((tbuf & ble) | - ((tdes | tstat) & dbo)) - begin - blesel_c <= 1'b1 ; - end - else - begin - blesel_c <= 1'b0 ; - end - end - else - begin - if ((rbuf & ble) | - ((rdes | rstat) & dbo)) - begin - blesel_c <= 1'b1 ; - end - else - begin - blesel_c <= 1'b0 ; - end - end - end - - always @(dsm_c or - dsm or - req1 or - write1 or - tcnt1 or - addr1 or - datai1 or - req2 or - write2 or - tcnt2 or - addr2 or - datai2) - begin : chmux_proc - if (dsm_c == DSM_CH1 | dsm == DSM_CH1) - begin - req_c <= req1 ; - write_c <= write1 ; - tcnt_c <= tcnt1 ; - saddr_c <= addr1 ; - datai_c <= {{((DATAWIDTH_MAX+1)-DATAWIDTH){1'b0}},datai1} ; - end - else - begin - req_c <= req2 ; - write_c <= write2 ; - tcnt_c <= tcnt2 ; - saddr_c <= addr2 ; - datai_c <= {{((DATAWIDTH_MAX+1)-DATAWIDTH){1'b0}},datai2} ; - end - end - - assign datai_max_c = {dzero[DATAWIDTH_MAX+1:DATAWIDTH],datai_c}; - - always @(datai_max_c or blesel_c) - begin : dataoble_proc - case (DATAWIDTH) - 32 : - begin - if (blesel_c) - begin - dataoble_c <= {datai_max_c[ 7: 0], - datai_max_c[15: 8], - datai_max_c[23:16], - datai_max_c[31:24]}; - end - else - begin - dataoble_c <= datai_max_c[31:0]; - end - end - 16 : - begin - if (blesel_c) - begin - dataoble_c <= {datai_max_c[7 :0], - datai_max_c[15:8]}; - end - else - begin - dataoble_c <= datai_max_c[15:0]; - end - end - default : - begin - dataoble_c <= datai_max_c[7:0]; - end - endcase - end - - assign datai_max = {dzero[DATAWIDTH_MAX+1:DATAWIDTH],datai}; - - always @(datai_max or blesel_c) - begin : dataible_proc - case (DATAWIDTH) - 32 : - begin - if (blesel_c) - begin - dataible_c <= {datai_max[ 7: 0], - datai_max[15: 8], - datai_max[23:16], - datai_max[31:24]}; - end - else - begin - dataible_c <= datai_max[31:0]; - end - end - 16 : - begin - if (blesel_c) - begin - dataible_c <= {datai_max[7 :0], - datai_max[15:8]}; - end - else - begin - dataible_c <= datai_max[15:0]; - end - end - default : - begin - dataible_c <= datai_max[7:0]; - end - endcase - end - - always @(posedge clk) - begin : msmbcnt_reg_proc - if (rst) - begin - msmbcnt <= {FIFODEPTH_MAX{1'b0}} ; - end - else - begin - if (!idatareq) - begin - msmbcnt <= tcnt_c ; - end - else if (dataack & idatareq) - begin - msmbcnt <= msmbcnt - 1 ; - end - end - end - - always @(posedge clk) - begin : datarw_reg_proc - if (rst) - begin - datarw <= 1'b1 ; - end - else - begin - if (req_c) - begin - datarw <= ~write_c ; - end - end - end - - always @(posedge clk) - begin : idatareq_reg_proc - if (rst) - begin - idatareq <= 1'b0 ; - end - else - begin - if (eob & dataack & idatareq) - begin - idatareq <= 1'b0 ; - end - else if (req1 | req2) - begin - idatareq <= 1'b1 ; - end - end - end - - assign datareq = idatareq ; - - always @(idatareq or - dataack or - req1 or - req2 or - eob - ) - begin : idatareqc_comb_proc - if (eob & dataack & idatareq) - begin - idatareqc <= 1'b0 ; - end - else if (req1 | req2) - begin - idatareqc <= 1'b1 ; - end - else - begin - idatareqc <= idatareq ; - end - end - - assign datareqc = idatareqc ; - - assign dataeob = eob ; - - assign dataeobc = eobc ; - - assign datao1 = dataible_c ; - - assign datao2 = dataible_c ; - - assign datao = dataoble_c ; - - always @(dataack or - idatareq or - addr or - saddr_c or - req_c or - dsm) - begin : addr_proc - if (dataack & idatareq) - begin - case (DATAWIDTH) - 8 : - begin - addr_c <= addr + 1 ; - end - 16 : - begin - addr_c <= {addr[DATADEPTH - 1:1] + 1, 1'b0} ; - end - default : - begin - addr_c <= {addr[DATADEPTH - 1:2] + 1, 2'b00} ; - end - endcase - end - else if (req_c & dsm == DSM_IDLE) - begin - addr_c <= saddr_c ; - end - else - begin - addr_c <= addr ; - end - end - - always @(posedge clk) - begin : addr_reg_proc - if (rst) - begin - addr <= {DATADEPTH{1'b1}} ; - end - else - begin - addr <= addr_c ; - end - end - - assign dataaddr = addr ; - - assign idataaddr = addr ; - - assign ack1 = (dataack & dsm == DSM_CH1) ? 1'b1 : 1'b0 ; - - assign ack2 = (dataack & dsm == DSM_CH2) ? 1'b1 : 1'b0 ; - - always @(posedge clk) - begin : eob_reg_proc - if (rst) - begin - eob <= 1'b0 ; - end - else if (req_c | idatareq) - begin - if ((idatareq & - (msmbcnt == fzero | - msmbcnt == {fzero[FIFODEPTH_MAX-1:1], 1'b1} | - (msmbcnt == {fzero[FIFODEPTH_MAX-1:2], 2'b10} & dataack))) - | - (!idatareq & - (tcnt_c == fzero | - tcnt_c == {fzero[FIFODEPTH_MAX-1:1], 1'b1}))) - begin - eob <= 1'b1 ; - end - else - begin - eob <= 1'b0 ; - end - end - end - - always @(req_c or - idatareq or - msmbcnt or - dataack or - tcnt_c or - fzero or - eob) - begin : eob_comb_proc - if (req_c | idatareq) - begin - if ((idatareq & - (msmbcnt == fzero | - msmbcnt == {fzero[FIFODEPTH_MAX-1:1], 1'b1} | - (msmbcnt == {fzero[FIFODEPTH_MAX-1:2], 2'b10} & dataack))) - | - (!idatareq & - (tcnt_c == fzero | - tcnt_c == {fzero[FIFODEPTH_MAX-1:1], 1'b1}))) - begin - eobc <= 1'b1 ; - end - else - begin - eobc <= 1'b0 ; - end - end - else - begin - eobc <= eob; - end - end - - assign eob1 = eob ; - - assign eob2 = eob ; - - assign fzero = {FIFODEPTH_MAX{1'b0}} ; - - assign dzero = {(DATAWIDTH_MAX+1){1'b0}} ; - -endmodule - - -module MAC_V ( - clkdma, - clkcsr, - rstcsr, - clkt, - clkr, - rsttco, - rstrco, - interrupt, - tps, - rps, - csrreq, - csrrw, - csrbe, - csrdatai, - csraddr, - csrack, - csrdatao, - dataack, - datareq, - datareqc, - datarw, - dataeob, - dataeobc, - datai, - dataaddr, - datao, - trdata, - twe, - twaddr, - traddr, - twdata, - rrdata, - rwe, - rwaddr, - rraddr, - rwdata, - frdata, - fwe, - fwaddr, - fraddr, - fwdata, - match, - matchval, - matchen, - matchdata, - sdi, - sclk, - scs, - sdo, - rxer, - rxdv, - col, - crs, - rxd, - txen, - txer, - txd, - mdc, - mdi, - mdo, - mden - ); - - parameter CSRWIDTH = 32; - parameter DATAWIDTH = 32; - parameter DATADEPTH = 32; - parameter TFIFODEPTH = 9; - parameter RFIFODEPTH = 9; - parameter TCDEPTH = 1; - parameter RCDEPTH = 2; - - `include "utility.v" - - input clkdma; - input clkcsr; - input rstcsr; - input clkt; - input clkr; - output rsttco; - wire rsttco; - output rstrco; - wire rstrco; - - output interrupt; - wire interrupt; - - output tps; - wire tps; - output rps; - wire rps; - - input csrreq; - input csrrw; - input [CSRWIDTH / 8 - 1:0] csrbe; - input [CSRWIDTH - 1:0] csrdatai; - input [CSRDEPTH - 1:0] csraddr; - output csrack; - wire csrack; - output [CSRWIDTH - 1:0] csrdatao; - wire [CSRWIDTH - 1:0] csrdatao; - - input dataack; - output datareq; - wire datareq; - output datareqc; - wire datareqc; - output datarw; - wire datarw; - output dataeob; - wire dataeob; - output dataeobc; - wire dataeobc; - input [DATAWIDTH - 1:0] datai; - output [DATADEPTH - 1:0] dataaddr; - wire [DATADEPTH - 1:0] dataaddr; - output [DATAWIDTH - 1:0] datao; - wire [DATAWIDTH - 1:0] datao; - - input [DATAWIDTH - 1:0] trdata; - output twe; - wire twe; - output [TFIFODEPTH - 1:0] twaddr; - wire [TFIFODEPTH - 1:0] twaddr; - output [TFIFODEPTH - 1:0] traddr; - wire [TFIFODEPTH - 1:0] traddr; - output [DATAWIDTH - 1:0] twdata; - wire [DATAWIDTH - 1:0] twdata; - - input [DATAWIDTH - 1:0] rrdata; - output rwe; - wire rwe; - output [RFIFODEPTH - 1:0] rwaddr; - wire [RFIFODEPTH - 1:0] rwaddr; - output [RFIFODEPTH - 1:0] rraddr; - wire [RFIFODEPTH - 1:0] rraddr; - output [DATAWIDTH - 1:0] rwdata; - wire [DATAWIDTH - 1:0] rwdata; - - input [15:0] frdata; - output fwe; - wire fwe; - output [ADDRDEPTH - 1:0] fwaddr; - wire [ADDRDEPTH - 1:0] fwaddr; - output [ADDRDEPTH - 1:0] fraddr; - wire [ADDRDEPTH - 1:0] fraddr; - output [15:0] fwdata; - wire [15:0] fwdata; - - input match; - input matchval; - output matchen; - wire matchen; - output [47:0] matchdata; - wire [47:0] matchdata; - - input sdi; - output sclk; - wire sclk; - output scs; - wire scs; - output sdo; - wire sdo; - - input rxer; - input rxdv; - input col; - input crs; - input [MIIWIDTH - 1:0] rxd; - output txen; - wire txen; - output txer; - wire txer; - output [MIIWIDTH - 1:0] txd; - wire [MIIWIDTH - 1:0] txd; - output mdc; - wire mdc; - input mdi; - output mdo; - wire mdo; - output mden; - wire mden; - - - wire rstsoft; - wire rsttc; - wire rstrc; - wire rstdmao; - wire rstcsro; - - wire [5:0] pbl; - wire ac; - wire dpd; - wire [4:0] dsl; - wire tpoll; - wire [DATADEPTH - 1:0] tdbad; - wire sf; - wire [2:0] tm; - wire fd; - wire ble; - wire dbo; - wire ra; - wire pm; - wire pr; - wire pb; - wire rif; - wire ho; - wire hp; - wire rpoll; - wire rpollack; - wire [DATADEPTH - 1:0] rdbad; - - wire tdes; - wire tbuf; - wire tset; - wire tstat; - wire tu; - wire [1:0] ft; - wire rdes; - wire rstat; - wire ru; - wire rcomp; - wire rcompack; - wire tcomp; - wire tcompack; - - wire [1:0] dma_priority; - wire treq; - wire twrite; - wire [FIFODEPTH_MAX - 1:0] tcnt; - wire [DATADEPTH - 1:0] taddr; - wire [DATAWIDTH - 1:0] tdatai; - wire tack; - wire teob; - wire [DATAWIDTH - 1:0] tdatao; - wire rreq; - wire rwrite; - wire [FIFODEPTH_MAX - 1:0] rcnt; - wire [DATADEPTH - 1:0] raddr; - wire [DATAWIDTH - 1:0] rdatai; - wire rack; - wire reob; - wire [DATAWIDTH - 1:0] rdatao; - wire [DATADEPTH - 1:0] idataaddr; - - wire tfifonf; - wire tfifocnf; - wire tfifoval; - wire tfifowe; - wire tfifoeof; - wire [DATAWIDTH / 8 - 1:0] tfifobe; - wire [DATAWIDTH - 1:0] tfifodata; - wire [TFIFODEPTH - 1:0] tfifolev; - wire [TFIFODEPTH - 1:0] tradg; - - wire etiack; - wire etireq; - wire tcsne; - wire tcachere; - wire ic; - wire ici; - wire aci; - wire dpdi; - wire lo_o; - wire nc_o; - wire lc_o; - wire ec_o; - wire de_o; - wire ur_o; - wire [3:0] cc_o; - wire lo_i; - wire nc_i; - wire lc_i; - wire ec_i; - wire de_i; - wire ur_i; - wire [3:0] cc_i; - - wire tpollack; - wire tdbadc; - wire [DATADEPTH - 1:0] statado; - wire [DATADEPTH - 1:0] statadi; - - wire sofreq; - wire eofreq; - wire [DATAWIDTH / 8 - 1:0] be; - wire [TFIFODEPTH - 1:0] eofad; - wire [TFIFODEPTH - 1:0] twadg; - wire tireq; - wire tiack; - wire winp; - - wire coll; - wire carrier; - wire bkoff; - wire tpend; - wire tprog; - wire preamble; - - wire tcsreq; - wire tcsack; - - wire stopt; - wire stoptc; - wire stoptfifo; - wire stoptlsm; - - wire [RFIFODEPTH - 1:0] rradg; - wire [RFIFODEPTH - 1:0] rwadg; - wire rfifore; - wire [DATAWIDTH - 1:0] rfifodata; - wire rcachere; - wire rcachene; - wire rcachenf; - wire [DATAWIDTH - 1:0] irwdata; - wire irwe; - - wire riack; - wire ren; - wire rireq; - wire ff; - wire rf; - wire mf; - wire db; - wire re; - wire ce; - wire tl; - wire ftp; - wire ov; - wire cs; - wire [13:0] length; - wire rprog; - wire rcpoll; - - - wire ff_o; - wire rf_o; - wire mf_o; - wire tl_o; - wire re_o; - wire db_o; - wire ce_o; - wire ov_o; - wire cs_o; - wire [13:0] fl_o; - - wire rdbadc; - wire erireq; - wire eriack; - wire rbuf; - - wire foclack; - wire mfclack; - wire oco; - wire mfo; - wire [10:0] focg; - wire [15:0] mfcg; - wire focl; - wire mfcl; - - wire stopr; - wire stoprc; - wire stoprfifo; - wire stoprlsm; - - wire rcsack; - wire rcsreq; - - DMA_V #(DATAWIDTH, DATADEPTH) U_DMA( - .clk (clkdma), - .rst (rstdmao), - .dma_priority (dma_priority), - .ble (ble), - .dbo (dbo), - .rdes (rdes), - .rbuf (rbuf), - .rstat (rstat), - .tdes (tdes), - .tbuf (tbuf), - .tstat (tstat), - .dataack (dataack), - .datai (datai), - .datareq (datareq), - .datareqc (datareqc), - .datarw (datarw), - .dataeob (dataeob), - .dataeobc (dataeobc), - .datao (datao), - .dataaddr (dataaddr), - .idataaddr (idataaddr), - .req1 (treq), - .write1 (twrite), - .tcnt1 (tcnt), - .addr1 (taddr), - .datai1 (tdatao), - .ack1 (tack), - .eob1 (teob), - .datao1 (tdatai), - .req2 (rreq), - .write2 (rwrite), - .tcnt2 (rcnt), - .addr2 (raddr), - .datai2 (rdatao), - .ack2 (rack), - .eob2 (reob), - .datao2 (rdatai) - ); - - TLSM_V #(DATAWIDTH, DATADEPTH, TFIFODEPTH) U_TLSM( - .clk (clkdma), - .rst (rstdmao), - .fifonf (tfifonf), - .fifocnf (tfifocnf), - .fifoval (tfifoval), - .fifowe (tfifowe), - .fifoeof (tfifoeof), - .fifobe (tfifobe), - .fifodata (tfifodata), - .fifolev (tfifolev), - .ic (ici), - .ac (aci), - .dpd (dpdi), - .statado (statadi), - .csne (tcsne), - .lo (lo_i), - .nc (nc_i), - .lc (lc_i), - .ec (ec_i), - .de (de_i), - .ur (ur_i), - .cc (cc_i), - .cachere (tcachere), - .statadi (statado), - .dmaack (tack), - .dmaeob (teob), - .dmadatai (tdatai), - .dmaaddr (idataaddr), - .dmareq (treq), - .dmawr (twrite), - .dmacnt (tcnt), - .dmaaddro (taddr), - .dmadatao (tdatao), - .fwe (fwe), - .fdata (fwdata), - .faddr (fwaddr), - .dsl (dsl), - .pbl (pbl), - .poll (tpoll), - .dbadc (tdbadc), - .dbad (tdbad), - .pollack (tpollack), - .tcompack (tcompack), - .tcomp (tcomp), - .des (tdes), - .fbuf (tbuf), - .stat (tstat), - .setp (tset), - .tu (tu), - .ft (ft), - .stopi (stopt), - .stopo (stoptlsm) - ); - - TFIFO_V #(DATAWIDTH, DATADEPTH, TFIFODEPTH, TCDEPTH) U_TFIFO( - .clk (clkdma), - .rst (rstdmao), - .ramwe (twe), - .ramaddr (twaddr), - .ramdata (twdata), - .fifowe (tfifowe), - .fifoeof (tfifoeof), - .fifobe (tfifobe), - .fifodata (tfifodata), - .fifonf (tfifonf), - .fifocnf (tfifocnf), - .fifoval (tfifoval), - .flev (tfifolev), - .ici (ici), - .dpdi (dpdi), - .aci (aci), - .statadi (statadi), - .cachere (tcachere), - .deo (de_i), - .lco (lc_i), - .loo (lo_i), - .nco (nc_i), - .eco (ec_i), - .ico (ic), - .uro (ur_i), - .csne (tcsne), - .cco (cc_i), - .statado (statado), - .sofreq (sofreq), - .eofreq (eofreq), - .dpdo (dpd), - .aco (ac), - .beo (be), - .eofad (eofad), - .wadg (twadg), - .tireq (tireq), - .winp (winp), - .dei (de_o), - .lci (lc_o), - .loi (lo_o), - .nci (nc_o), - .eci (ec_o), - .uri (ur_o), - .cci (cc_o), - .radg (tradg), - .tiack (tiack), - .sf (sf), - .fdp (fd), - .tm (tm), - .pbl (pbl), - .etiack (etiack), - .etireq (etireq), - .stopi (stopt), - .stopo (stoptfifo) - ); - - TC_V #(TFIFODEPTH, DATAWIDTH) U_TC( - .clk (clkt), - .rst (rsttc), - .txen (txen), - .txer (txer), - .txd (txd), - .ramdata (trdata), - .ramaddr (traddr), - .wadg (twadg), - .radg (tradg), - .dpd (dpd), - .ac (ac), - .sofreq (sofreq), - .eofreq (eofreq), - .tiack (tiack), - .lastbe (be), - .eofadg (eofad), - .tireq (tireq), - .ur (ur_o), - .de (de_o), - .coll (coll), - .carrier (carrier), - .bkoff (bkoff), - .tpend (tpend), - .tprog (tprog), - .preamble (preamble), - .stopi (stopt), - .stopo (stoptc), - .tcsack (tcsack), - .tcsreq (tcsreq) - ); - - BD_V U_BD( - .clk (clkt), - .rst (rsttc), - .col (col), - .crs (crs), - .fdp (fd), - .tprog (tprog), - .preamble (preamble), - .tpend (tpend), - .winp (winp), - .tiack (tiack), - .coll (coll), - .carrier (carrier), - .bkoff (bkoff), - .lc (lc_o), - .lo (lo_o), - .nc (nc_o), - .ec (ec_o), - .cc (cc_o) - ); - - - - RC_V #(RFIFODEPTH, DATAWIDTH) U_RC( - .clk (clkr), - .rst (rstrc), - .col (col), - .rxdv (rxdv), - .rxer (rxer), - .rxd (rxd), - .ramwe (irwe), - .ramaddr (rwaddr), - .ramdata (irwdata), - .fdata (frdata), - .faddr (fraddr), - .cachenf (rcachenf), - .radg (rradg), - .wadg (rwadg), - .rprog (rprog), - .rcpoll (rcpoll), - .riack (riack), - .ren (ren), - .ra (ra), - .pm (pm), - .pr (pr), - .pb (pb), - .rif (rif), - .ho (ho), - .hp (hp), - .rireq (rireq), - .ff (ff), - .rf (rf), - .mf (mf), - .db (db), - .re (re), - .ce (ce), - .tl (tl), - .ftp (ftp), - .ov (ov), - .cs (cs), - .length (length), - .match (match), - .matchval (matchval), - .matchen (matchen), - .matchdata (matchdata), - .focl (focl), - .foclack (foclack), - .oco (oco), - .focg (focg), - .mfcl (mfcl), - .mfclack (mfclack), - .mfo (mfo), - .mfcg (mfcg), - .stopi (stopr), - .stopo (stoprc), - .rcsack (rcsack), - .rcsreq (rcsreq) - ); - - RFIFO_V #(DATAWIDTH, DATADEPTH, RFIFODEPTH, RCDEPTH) U_RFIFO( - .clk (clkdma), - .rst (rstdmao), - .ramdata (rrdata), - .ramaddr (rraddr), - .fifore (rfifore), - .ffo (ff_o), - .rfo (rf_o), - .mfo (mf_o), - .tlo (tl_o), - .reo (re_o), - .dbo (db_o), - .ceo (ce_o), - .ovo (ov_o), - .cso (cs_o), - .flo (fl_o), - .fifodata (rfifodata), - .cachere (rcachere), - .cachene (rcachene), - .cachenf (rcachenf), - .radg (rradg), - .rireq (rireq), - .ffi (ff), - .rfi (rf), - .mfi (mf), - .tli (tl), - .rei (re), - .dbi (db), - .cei (ce), - .ovi (ov), - .csi (cs), - .fli (length), - .wadg (rwadg), - .riack (riack) - ); - - RLSM_V #(DATAWIDTH, DATADEPTH, RFIFODEPTH) U_RLSM( - .clk (clkdma), - .rst (rstdmao), - .fifodata (rfifodata), - .fifore (rfifore), - .cachere (rcachere), - .dmaack (rack), - .dmaeob (reob), - .dmadatai (rdatai), - .dmaaddr (idataaddr), - .dmareq (rreq), - .dmawr (rwrite), - .dmacnt (rcnt), - .dmaaddro (raddr), - .dmadatao (rdatao), - .rprog (rprog), - .rcpoll (rcpoll), - .fifocne (rcachene), - .ff (ff_o), - .rf (rf_o), - .mf (mf_o), - .db (db_o), - .re (re_o), - .ce (ce_o), - .tl (tl_o), - .ftp (ftp), - .ov (ov_o), - .cs (cs_o), - .length (fl_o), - .pbl (pbl), - .dsl (dsl), - .rpoll (rpoll), - .rdbadc (rdbadc), - .rdbad (rdbad), - .rpollack (rpollack), - .bufack (eriack), - .rcompack (rcompack), - .des (rdes), - .fbuf (rbuf), - .stat (rstat), - .ru (ru), - .rcomp (rcomp), - .bufcomp (erireq), - .stopi (stopr), - .stopo (stoprlsm) - ); - - CSR_V #(CSRWIDTH, DATAWIDTH, DATADEPTH, RFIFODEPTH, RCDEPTH) U_CSR( - .clk (clkcsr), - .rst (rstcsro), - .interrupt (interrupt), - .rstsofto (rstsoft), - .csrreq (csrreq), - .csrrw (csrrw), - .csrbe (csrbe), - .csraddr (csraddr), - .csrdatai (csrdatai), - .csrack (csrack), - .csrdatao (csrdatao), - .tprog (tprog), - .tireq (tcomp), - .unf (ur_i), - .tiack (tcompack), - .tcsreq (tcsreq), - .tcsack (tcsack), - .fd (fd), - .ic (ic), - .etireq (etireq), - .etiack (etiack), - .tm (tm), - .sf (sf), - .tset (tset), - .tdes (tdes), - .tbuf (tbuf), - .tstat (tstat), - .tu (tu), - .tpollack (tpollack), - .ft (ft), - .tpoll (tpoll), - .tdbadc (tdbadc), - .tdbad (tdbad), - .rireq (rcomp), - .rcsreq (rcsreq), - .rprog (rprog), - .riack (rcompack), - .rcsack (rcsack), - .ren (ren), - .ra (ra), - .pm (pm), - .pr (pr), - .pb (pb), - .rif (rif), - .ho (ho), - .hp (hp), - .foclack (foclack), - .mfclack (mfclack), - .oco (oco), - .mfo (mfo), - .focg (focg), - .mfcg (mfcg), - .focl (focl), - .mfcl (mfcl), - .erireq (erireq), - .ru (ru), - .rpollack (rpollack), - .rdes (rdes), - .rbuf (rbuf), - .rstat (rstat), - .eriack (eriack), - .rpoll (rpoll), - .rdbadc (rdbadc), - .rdbad (rdbad), - .ble (ble), - .dbo (dbo), - .dma_priority (dma_priority), - .pbl (pbl), - .dsl (dsl), - .stoptc (stoptc), - .stoptlsm (stoptlsm), - .stoptfifo (stoptfifo), - .stopt (stopt), - .tps (tps), - .stoprc (stoprc), - .stoprlsm (stoprlsm), - .stopr (stopr), - .rps (rps), - .sdi (sdi), - .sclk (sclk), - .scs (scs), - .sdo (sdo), - .mdi (mdi), - .mdc (mdc), - .mdo (mdo), - .mden (mden) - ); - - RSTC_V U_RSTC ( - .clkdma(clkdma), - .clkcsr(clkcsr), - .clkt(clkt), - .clkr(clkr), - .rstcsr(rstcsr), - .rstsoft(rstsoft), - .rsttc(rsttc), - .rstrc(rstrc), - .rstdmao(rstdmao), - .rstcsro(rstcsro) - ); - - assign rwe = irwe ; - - assign rwdata = irwdata ; - - assign rsttco = rsttc ; - - assign rstrco = rstrc ; - -endmodule - - - - - -module MAC2AHB_V ( - mhclk, - mhresetn, - mhrdata, - mhready, - mhresp, - mhaddr, - mhtrans, - mhwrite, - mhsize, - mhburst, - mhprot, - mhwdata, - mhgrantmac, - mhbusreqmac, - mhlockmac, - shclk, - shresetn, - shselmac, - shaddr, - shwrite, - shreadyi, - shtrans, - shsize, - shburst, - shwdata, - shreadyo, - shresp, - shrdata, - datareq, - datareqc, - datarw, - dataeob, - dataeobc, - dataaddr, - datao, - dataack, - datai, - rstcsr, - csrack, - csrdatao, - csrreq, - csrrw, - csrbe, - csrdatai, - csraddr - ); - - parameter MAHBDATAWIDTH = 32; - parameter MAHBADDRESSWIDTH = 32; - - parameter SAHBDATAWIDTH = 32; - parameter SAHBADDRESSWIDTH = 32; - - parameter MACDATAWIDTH = 32; - parameter MACADDRESSWIDTH = 32; - - parameter CSRDATAWIDTH = 32; - parameter CSRADDRESSWIDTH = 32; - - `include "mac2ahb_package.v" - - input mhclk; - input mhresetn; - input [MAHBDATAWIDTH - 1:0] mhrdata; - input mhready; - input [1:0] mhresp; - output [MAHBADDRESSWIDTH - 1:0] mhaddr; - wire [MAHBADDRESSWIDTH - 1:0] mhaddr; - output [1:0] mhtrans; - wire [1:0] mhtrans; - output mhwrite; - wire mhwrite; - output [2:0] mhsize; - wire [2:0] mhsize; - output [2:0] mhburst; - wire [2:0] mhburst; - output [3:0] mhprot; - wire [3:0] mhprot; - output [MAHBDATAWIDTH - 1:0] mhwdata; - wire [MAHBDATAWIDTH - 1:0] mhwdata; - - input mhgrantmac; - output mhbusreqmac; - wire mhbusreqmac; - output mhlockmac; - wire mhlockmac; - - input shclk; - input shresetn; - input shselmac; - input [SAHBADDRESSWIDTH - 1:0] shaddr; - input shwrite; - input shreadyi; - input [1:0] shtrans; - input [2:0] shsize; - input [2:0] shburst; - input [SAHBDATAWIDTH - 1:0] shwdata; - output shreadyo; - wire shreadyo; - output [1:0] shresp; - wire [1:0] shresp; - output [SAHBDATAWIDTH - 1:0] shrdata; - wire [SAHBDATAWIDTH - 1:0] shrdata; - - - input datareq; - input datareqc; - input datarw; - input dataeob; - input dataeobc; - input [MACADDRESSWIDTH - 1:0] dataaddr; - input [MACDATAWIDTH - 1:0] datao; - output dataack; - wire dataack; - output [MACDATAWIDTH - 1:0] datai; - wire [MACDATAWIDTH - 1:0] datai; - - - output rstcsr; - wire rstcsr; - input csrack; - input [CSRDATAWIDTH - 1:0] csrdatao; - output csrreq; - wire csrreq; - output csrrw; - wire csrrw; - output [CSRDATAWIDTH / 8 - 1:0] csrbe; - wire [CSRDATAWIDTH / 8 - 1:0] csrbe; - output [CSRDATAWIDTH - 1:0] csrdatai; - wire [CSRDATAWIDTH - 1:0] csrdatai; - output [CSRADDRESSWIDTH - 1:0] csraddr; - wire [CSRADDRESSWIDTH - 1:0] csraddr; - - - MACDATA2AHB_V - #(MAHBDATAWIDTH, MAHBADDRESSWIDTH, MACDATAWIDTH, MACADDRESSWIDTH) - U_MACDATA2AHB ( - .mhclk (mhclk), - .mhresetn (mhresetn), - .mhrdata (mhrdata), - .mhready (mhready), - .mhresp (mhresp), - .mhaddr (mhaddr), - .mhtrans (mhtrans), - .mhwrite (mhwrite), - .mhsize (mhsize), - .mhburst (mhburst), - .mhprot (mhprot), - .mhwdata (mhwdata), - .mhgrantmac (mhgrantmac), - .mhbusreqmac (mhbusreqmac), - .mhlockmac (mhlockmac), - .datareq (datareq), - .datareqc (datareqc), - .datarw (datarw), - .dataeob (dataeob), - .dataeobc (dataeobc), - .dataaddr (dataaddr), - .datao (datao), - .dataack (dataack), - .datai (datai) - ); - - MACCSR2AHB_V - #(SAHBDATAWIDTH, SAHBADDRESSWIDTH, CSRDATAWIDTH, CSRADDRESSWIDTH) - U_MACCSR2AHB( - .shclk (shclk), - .shresetn (shresetn), - .shselmac (shselmac), - .shaddr (shaddr), - .shwrite (shwrite), - .shreadyi (shreadyi), - .shtrans (shtrans), - .shsize (shsize), - .shburst (shburst), - .shwdata (shwdata), - .shreadyo (shreadyo), - .shresp (shresp), - .shrdata (shrdata), - .rstcsr (rstcsr), - .csrack (csrack), - .csrdatao (csrdatao), - .csrreq (csrreq), - .csrrw (csrrw), - .csrbe (csrbe), - .csrdatai (csrdatai), - .csraddr (csraddr) - ); - -endmodule - - - - -module MAC_AHB_V ( - clkt, - clkr, - rsttco, - rstrco, - interrupt, - tps, - rps, - mhclk, - mhresetn, - mhrdata, - mhready, - mhresp, - mhaddr, - mhtrans, - mhwrite, - mhsize, - mhburst, - mhprot, - mhwdata, - mhgrantmac, - mhbusreqmac, - mhlockmac, - shclk, - shresetn, - shselmac, - shaddr, - shwrite, - shreadyi, - shtrans, - shsize, - shburst, - shwdata, - shreadyo, - shresp, - shrdata, - trdata, - twe, - twaddr, - traddr, - twdata, - rrdata, - rwe, - rwaddr, - rraddr, - rwdata, - frdata, - fwe, - fwaddr, - fraddr, - fwdata, - match, - matchval, - matchen, - matchdata, - sdi, - sclk, - scs, - sdo, - rxer, - rxdv, - col, - crs, - rxd, - txen, - txer, - txd, - mdc, - mdi, - mdo, - mden - ); - - parameter MAHBDATAWIDTH = 32; - parameter MAHBADDRESSWIDTH = 32; - parameter TFIFODEPTH = 9; - parameter RFIFODEPTH = 9; - parameter TCDEPTH = 1; - parameter RCDEPTH = 2; - - `include "utility.v" - - parameter SAHBDATAWIDTH = 32; - parameter SAHBADDRESSWIDTH = CSRDEPTH; - - input clkt; - input clkr; - output rsttco; - wire rsttco; - output rstrco; - wire rstrco; - - - output interrupt; - wire interrupt; - - output tps; - wire tps; - output rps; - wire rps; - - input mhclk; - input mhresetn; - input [MAHBDATAWIDTH - 1:0] mhrdata; - input mhready; - input [1:0] mhresp; - output [MAHBADDRESSWIDTH - 1:0] mhaddr; - wire [MAHBADDRESSWIDTH - 1:0] mhaddr; - output [1:0] mhtrans; - wire [1:0] mhtrans; - output mhwrite; - wire mhwrite; - output [2:0] mhsize; - wire [2:0] mhsize; - output [2:0] mhburst; - wire [2:0] mhburst; - output [3:0] mhprot; - wire [3:0] mhprot; - output [MAHBDATAWIDTH - 1:0] mhwdata; - wire [MAHBDATAWIDTH - 1:0] mhwdata; - input mhgrantmac; - output mhbusreqmac; - wire mhbusreqmac; - output mhlockmac; - wire mhlockmac; - - input shclk; - input shresetn; - input shselmac; - input [SAHBADDRESSWIDTH - 1:0] shaddr; - input shwrite; - input [1:0] shtrans; - input [2:0] shsize; - input shreadyi; - input [2:0] shburst; - input [SAHBDATAWIDTH - 1:0] shwdata; - output shreadyo; - wire shreadyo; - output [1:0] shresp; - wire [1:0] shresp; - output [SAHBDATAWIDTH - 1:0] shrdata; - wire [SAHBDATAWIDTH - 1:0] shrdata; - - input [MAHBDATAWIDTH - 1:0] trdata; - output twe; - wire twe; - output [TFIFODEPTH - 1:0] twaddr; - wire [TFIFODEPTH - 1:0] twaddr; - output [TFIFODEPTH - 1:0] traddr; - wire [TFIFODEPTH - 1:0] traddr; - output [MAHBDATAWIDTH - 1:0] twdata; - wire [MAHBDATAWIDTH - 1:0] twdata; - - - input [MAHBDATAWIDTH - 1:0] rrdata; - output rwe; - wire rwe; - output [RFIFODEPTH - 1:0] rwaddr; - wire [RFIFODEPTH - 1:0] rwaddr; - output [RFIFODEPTH - 1:0] rraddr; - wire [RFIFODEPTH - 1:0] rraddr; - output [MAHBDATAWIDTH - 1:0] rwdata; - wire [MAHBDATAWIDTH - 1:0] rwdata; - - input [15:0] frdata; - output fwe; - wire fwe; - output [ADDRDEPTH - 1:0] fwaddr; - wire [ADDRDEPTH - 1:0] fwaddr; - output [ADDRDEPTH - 1:0] fraddr; - wire [ADDRDEPTH - 1:0] fraddr; - output [15:0] fwdata; - wire [15:0] fwdata; - - input match; - input matchval; - output matchen; - wire matchen; - output [47:0] matchdata; - wire [47:0] matchdata; - - input sdi; - output sclk; - wire sclk; - output scs; - wire scs; - output sdo; - wire sdo; - - input rxer; - input rxdv; - input col; - input crs; - input [MIIWIDTH - 1:0] rxd; - output txen; - wire txen; - output txer; - wire txer; - output [MIIWIDTH - 1:0] txd; - wire [MIIWIDTH - 1:0] txd; - output mdc; - wire mdc; - input mdi; - output mdo; - wire mdo; - output mden; - wire mden; - - - wire datareq; - wire datareqc; - wire datarw; - wire dataeob; - wire dataeobc; - wire [(MAHBADDRESSWIDTH - 1):0] dataaddr; - wire [(MAHBDATAWIDTH - 1):0] datao; - wire dataack; - wire [(MAHBDATAWIDTH - 1):0] datai; - - wire rstcsr; - wire csrack; - wire [SAHBDATAWIDTH - 1:0] csrdatao; - wire csrreq; - wire csrrw; - wire [SAHBDATAWIDTH / 8 - 1:0] csrbe; - wire [SAHBDATAWIDTH - 1:0] csrdatai; - wire [SAHBADDRESSWIDTH - 1:0] csraddr; - - MAC_V - #(SAHBDATAWIDTH, - MAHBDATAWIDTH, - MAHBADDRESSWIDTH, - TFIFODEPTH, - RFIFODEPTH, - TCDEPTH, - RCDEPTH) - U_MAC ( - .clkdma (mhclk), - .clkcsr (shclk), - .clkt (clkt), - .clkr (clkr), - .rstcsr (rstcsr), - .rsttco (rsttco), - .rstrco (rstrco), - .interrupt (interrupt), - .rps (rps), - .tps (tps), - .csrreq (csrreq), - .csrrw (csrrw), - .csrbe (csrbe), - .csrdatai (csrdatai), - .csrack (csrack), - .csraddr (csraddr), - .csrdatao (csrdatao), - .dataack (dataack), - .datareq (datareq), - .datareqc (datareqc), - .datarw (datarw), - .dataeob (dataeob), - .dataeobc (dataeobc), - .datai (datai), - .dataaddr (dataaddr), - .datao (datao), - .trdata (trdata), - .twe (twe), - .twaddr (twaddr), - .traddr (traddr), - .twdata (twdata), - .rrdata (rrdata), - .rwe (rwe), - .rwaddr (rwaddr), - .rraddr (rraddr), - .rwdata (rwdata), - .frdata (frdata), - .fwe (fwe), - .fraddr (fraddr), - .fwaddr (fwaddr), - .fwdata (fwdata), - .match (match), - .matchval (matchval), - .matchen (matchen), - .matchdata (matchdata), - .sdi (sdi), - .sclk (sclk), - .scs (scs), - .sdo (sdo), - .rxer (rxer), - .rxdv (rxdv), - .col (col), - .crs (crs), - .rxd (rxd), - .txen (txen), - .txer (txer), - .txd (txd), - .mdi (mdi), - .mdo (mdo), - .mden (mden), - .mdc (mdc) - ); - - MAC2AHB_V - #(MAHBDATAWIDTH, - MAHBADDRESSWIDTH, - SAHBDATAWIDTH, - SAHBADDRESSWIDTH, - MAHBDATAWIDTH, - MAHBADDRESSWIDTH, - SAHBDATAWIDTH, - SAHBADDRESSWIDTH) - U_MAC2AHB ( - .mhclk (mhclk), - .mhresetn (mhresetn), - .mhrdata (mhrdata), - .mhready (mhready), - .mhresp (mhresp), - .mhaddr (mhaddr), - .mhtrans (mhtrans), - .mhwrite (mhwrite), - .mhsize (mhsize), - .mhburst (mhburst), - .mhprot (mhprot), - .mhwdata (mhwdata), - .mhgrantmac (mhgrantmac), - .mhbusreqmac (mhbusreqmac), - .mhlockmac (mhlockmac), - .shclk (shclk), - .shresetn (shresetn), - .shselmac (shselmac), - .shaddr (shaddr), - .shwrite (shwrite), - .shreadyi (shreadyi), - .shtrans (shtrans), - .shsize (shsize), - .shburst (shburst), - .shwdata (shwdata), - .shreadyo (shreadyo), - .shresp (shresp), - .shrdata (shrdata), - .datareq (datareq), - .datareqc (datareqc), - .datarw (datarw), - .dataeob (dataeob), - .dataeobc (dataeobc), - .dataaddr (dataaddr), - .datao (datao), - .dataack (dataack), - .datai (datai), - .rstcsr (rstcsr), - .csrack (csrack), - .csrdatao (csrdatao), - .csrreq (csrreq), - .csrrw (csrrw), - .csrbe (csrbe), - .csrdatai (csrdatai), - .csraddr (csraddr) - ); - - -endmodule - - - - -module MACCSR2AHB_V ( - shclk, - shresetn, - shselmac, - shaddr, - shwrite, - shreadyi, - shtrans, - shsize, - shburst, - shwdata, - shreadyo, - shresp, - shrdata, - rstcsr, - csrack, - csrdatao, - csrreq, - csrrw, - csrbe, - csrdatai, - csraddr - ); - - parameter SAHBDATAWIDTH = 32; - parameter SAHBADDRESSWIDTH = 8; - parameter CSRDATAWIDTH = 32; - parameter CSRADDRESSWIDTH = 8; - - `include "mac2ahb_package.v" - - - input shclk; - input shresetn; - input shselmac; - input [SAHBADDRESSWIDTH - 1:0] shaddr; - input shwrite; - input shreadyi; - input [1:0] shtrans; - input [2:0] shsize; - input [2:0] shburst; - input [SAHBDATAWIDTH - 1:0] shwdata; - output shreadyo; - wire shreadyo; - output [1:0] shresp; - wire [1:0] shresp; - output [SAHBDATAWIDTH - 1:0] shrdata; - wire [SAHBDATAWIDTH - 1:0] shrdata; - - - output rstcsr; - wire rstcsr; - input csrack; - input [CSRDATAWIDTH - 1:0] csrdatao; - output csrreq; - wire csrreq; - output csrrw; - wire csrrw; - output [CSRDATAWIDTH / 8 - 1:0] csrbe; - wire [CSRDATAWIDTH / 8 - 1:0] csrbe; - output [CSRDATAWIDTH - 1:0] csrdatai; - wire [CSRDATAWIDTH - 1:0] csrdatai; - output [CSRADDRESSWIDTH - 1:0] csraddr; - wire [CSRADDRESSWIDTH - 1:0] csraddr; - - - reg [CSRADDRESSWIDTH - 1:0] i_addrreg_r; - - reg i_transfind_r; - - reg i_transfdir_r; - - reg [CSRDATAWIDTH / 8 - 1:0] i_calcbe; - - reg [CSRDATAWIDTH / 8 - 1:0] i_calcbe_r; - - always @(posedge shclk) - begin : i_transfind_proc - if (!shresetn) - begin - i_transfind_r <= 1'b0 ; - end - else - begin - i_transfind_r <= 1'b0 ; - if (shtrans == HTRANS_NONSEQ & shreadyi & - shburst == HBURST_SINGLE & shselmac) - begin - i_transfind_r <= 1'b1 ; - end - end - end - - always @(posedge shclk) - begin : i_transfdir_proc - if (!shresetn) - begin - i_transfdir_r <= 1'b1 ; - end - else - begin - if (shtrans == HTRANS_NONSEQ & shselmac & shreadyi) - begin - if (shwrite) - begin - i_transfdir_r <= 1'b0 ; - end - else - begin - i_transfdir_r <= 1'b1 ; - end - end - end - end - - always @(posedge shclk) - begin : i_addrreg_proc - if (!shresetn) - begin - i_addrreg_r <= {CSRADDRESSWIDTH{1'b0}} ; - end - else - begin - i_addrreg_r <= i_addrreg_r ; - if (shtrans == HTRANS_NONSEQ & shselmac & shreadyi) - begin - i_addrreg_r <= shaddr[CSRADDRESSWIDTH - 1:0] ; - end - end - end - - always @(posedge shclk) - begin : i_calcbe_reg_proc - if (!shresetn) - begin - i_calcbe_r <= {CSRDATAWIDTH / 8{1'b0}} ; - end - else - begin - i_calcbe_r <= i_calcbe ; - end - end - - always @(shaddr or shsize) - begin : i_calcbe_proc - case (SAHBDATAWIDTH) - 8 : - begin - i_calcbe = 1'b1 ; - end - 16 : - begin - i_calcbe = {CSRDATAWIDTH / 8{1'b1}} ; - case (shsize) - HSIZE_8BIT : - begin - if (shaddr[0]) - begin - i_calcbe = 2'b10 ; - end - else - begin - i_calcbe = 2'b01 ; - end - end - HSIZE_16BIT : - begin - if (!(shaddr[0])) - begin - i_calcbe = 2'b11 ; - end - else - begin - i_calcbe = 2'b00 ; - end - end - default : - begin - end - endcase - end - 32 : - begin - i_calcbe = {CSRDATAWIDTH / 8{1'b1}} ; - case (shsize) - HSIZE_8BIT : - begin - if (shaddr[1:0] == 2'b00) - begin - i_calcbe = 4'b0001 ; - end - else if (shaddr[1:0] == 2'b01) - begin - i_calcbe = 4'b0010 ; - end - else if (shaddr[1:0] == 2'b10) - begin - i_calcbe = 4'b0100 ; - end - else - begin - i_calcbe = 4'b1000 ; - end - end - HSIZE_16BIT : - begin - if (shaddr[1:0] == 2'b00) - begin - i_calcbe = 4'b0011 ; - end - else if (shaddr[1:0] == 2'b10) - begin - i_calcbe = 4'b1100 ; - end - else - begin - i_calcbe = 4'b0000 ; - end - end - HSIZE_32BIT : - begin - if (shaddr[1:0] == 2'b00) - begin - i_calcbe = 4'b1111 ; - end - else - begin - i_calcbe = 4'b0000 ; - end - end - default : - begin - end - endcase - end - default : - begin - end - endcase - end - - assign shresp = HRESP_OKAY ; - - assign csrdatai = shwdata ; - - assign csrbe = i_calcbe_r ; - - assign csraddr = i_addrreg_r ; - - assign csrreq = i_transfind_r ; - - assign csrrw = i_transfdir_r ; - - assign rstcsr = ~shresetn ; - - assign shreadyo = csrack ; - - assign shrdata = csrdatao ; - -endmodule - - -module MACDATA2AHB_V ( - mhclk, - mhresetn, - mhrdata, - mhready, - mhresp, - mhaddr, - mhtrans, - mhwrite, - mhsize, - mhburst, - mhprot, - mhwdata, - mhgrantmac, - mhbusreqmac, - mhlockmac, - datareq, - datareqc, - datarw, - dataeob, - dataeobc, - dataaddr, - datao, - dataack, - datai - ); - - parameter MAHBDATAWIDTH = 32; - parameter MAHBADDRESSWIDTH = 32; - parameter MACDATAWIDTH = 32; - parameter MACADDRESSWIDTH = 32; - - `include "mac2ahb_package.v" - - - input mhclk; - input mhresetn; - input [MAHBDATAWIDTH - 1:0] mhrdata; - input mhready; - input [1:0] mhresp; - output [MAHBADDRESSWIDTH - 1:0] mhaddr; - wire [MAHBADDRESSWIDTH - 1:0] mhaddr; - output [1:0] mhtrans; - reg [1:0] mhtrans; - output mhwrite; - wire mhwrite; - output [2:0] mhsize; - reg [2:0] mhsize; - output [2:0] mhburst; - reg [2:0] mhburst; - output [3:0] mhprot; - wire [3:0] mhprot; - output [MAHBDATAWIDTH - 1:0] mhwdata; - wire [MAHBDATAWIDTH - 1:0] mhwdata; - - input mhgrantmac; - output mhbusreqmac; - wire mhbusreqmac; - output mhlockmac; - wire mhlockmac; - - input datareq; - input datareqc; - input datarw; - input dataeob; - input dataeobc; - input [MACADDRESSWIDTH - 1:0] dataaddr; - input [MACDATAWIDTH - 1:0] datao; - output dataack; - wire dataack; - output [MACDATAWIDTH - 1:0] datai; - wire [MACDATAWIDTH - 1:0] datai; - - - - wire [MAHBDATAWIDTH - 1:0] ahb_hrdata; - wire ahb_hready; - reg[1:0] ahb_hresp; - wire [MAHBADDRESSWIDTH - 1:0] ahb_haddr; - wire [1:0] ahb_htrans; - wire ahb_hwrite; - wire [2:0] ahb_hsize; - wire [0:0] ahb_hburst; - wire [3:0] ahb_hprot; - wire [MAHBDATAWIDTH - 1:0] ahb_hwdata; - wire ahb_hgrantmac; - reg ahb_hbusreqmac; - wire ahb_hlockmac; - wire mac_datareqc; - wire mac_datareq; - wire mac_datarw; - wire mac_dataeobc; - wire mac_dataeobcc; - wire [MACADDRESSWIDTH - 1:0] mac_dataaddr; - wire [MACDATAWIDTH - 1:0] mac_datao; - wire mac_dataack; - wire [MACDATAWIDTH - 1:0] mac_datai; - reg [1:0] fsm_macdata2ahb_nxt; - reg [1:0] fsm_macdata2ahb_r; - reg [MACADDRESSWIDTH - 1:0] i_ahb_haddr; - reg [MACADDRESSWIDTH - 1:0] i_ahb_haddr_c; - reg i_ahb_hgrant_r; - wire i_hbusreq_c; - reg i_mac_dataeobc_r; - reg i_datareqc_r; - wire i_hwritem_c; - reg i_hwritem; - wire [1:0] i_htransm_c; - reg [1:0] i_htransm; - wire i_dataack_c; - wire i_1kc; - - assign ahb_hwdata = mac_datao ; - - assign mac_datai = ahb_hrdata ; - - always @(i_ahb_haddr or - fsm_macdata2ahb_r or - ahb_hready or - mac_dataaddr or - i_ahb_hgrant_r or - i_mac_dataeobc_r or - i_datareqc_r or - dataaddr) - begin : i_ahb_haddr_proc - case (fsm_macdata2ahb_r) - AHBM_ADDR : - begin - if (ahb_hready == 1'b1 & i_mac_dataeobc_r == 1'b0) - begin - i_ahb_haddr_c = i_ahb_haddr + 3'b100 ; - end - else - begin - i_ahb_haddr_c = i_ahb_haddr ; - end - end - AHBM_ADDRDATA : - begin - if (ahb_hready == 1'b1 & i_mac_dataeobc_r == 1'b0) - begin - i_ahb_haddr_c = i_ahb_haddr + 3'b100 ; - end - else - begin - i_ahb_haddr_c = i_ahb_haddr ; - end - end - AHBM_IDLE : - begin - if (i_datareqc_r == 1'b1) - begin - i_ahb_haddr_c = dataaddr ; - end - else - begin - i_ahb_haddr_c = i_ahb_haddr ; - end - end - default : - begin - i_ahb_haddr_c = i_ahb_haddr ; - end - endcase - end - - always @(posedge mhclk) - begin : iahbaddrm_reg_proc - if (mhresetn == 1'b0) - begin - i_ahb_haddr <= {MACADDRESSWIDTH - 1+1{1'b1}} ; - end - else - begin - i_ahb_haddr <= i_ahb_haddr_c ; - end - end - - assign ahb_haddr = i_ahb_haddr ; - - assign i_1kc = (ahb_htrans == SEQ | ahb_htrans == NONSEQ) ? - (i_ahb_haddr[10] ^ i_ahb_haddr_c[10]) : 1'b0 ; - - assign i_hbusreq_c = (mac_datareqc == 1'b1 & - ( - mac_dataeobc == 1'b0 | - fsm_macdata2ahb_nxt == AHBM_IDLE - ) - ) ? 1'b1 : 1'b0 ; - - assign ahb_hwrite = i_hwritem ; - - assign ahb_htrans = (!ahb_hgrantmac & fsm_macdata2ahb_r == AHBM_ADDR) ? - IDLE : i_htransm ; - - assign ahb_hlockmac = 1'b0 ; - - - assign i_hwritem_c = (fsm_macdata2ahb_nxt == AHBM_ADDR) ? - ~mac_datarw : i_hwritem ; - - - assign ahb_hburst = INCR ; - - assign i_htransm_c = (fsm_macdata2ahb_nxt == AHBM_ADDR) ? NONSEQ : - (fsm_macdata2ahb_nxt == AHBM_ADDRDATA) ? SEQ : - IDLE ; - - assign i_dataack_c = (ahb_hready == 1'b1 & - ( - ahb_hresp == OKAY | ahb_hresp == ERROR - ) & - ( - fsm_macdata2ahb_r == AHBM_DATA | - fsm_macdata2ahb_r == AHBM_ADDRDATA - ) - ) ? 1'b1 : 1'b0 ; - - assign mac_dataack = i_dataack_c ; - - always @(fsm_macdata2ahb_r or - ahb_hgrantmac or - ahb_hresp or - ahb_hready or - i_datareqc_r or - i_mac_dataeobc_r or - mac_dataeobc or - mac_datareqc or - mac_datareq or - i_1kc) - begin : fsm_macdata2ahb_r_proc - case (fsm_macdata2ahb_r) - AHBM_IDLE : - begin - if (ahb_hgrantmac == 1'b1 & - ahb_hready == 1'b1 & - mac_datareq == 1'b1) - begin - fsm_macdata2ahb_nxt = AHBM_ADDR ; - end - else - begin - fsm_macdata2ahb_nxt = AHBM_IDLE ; - end - end - AHBM_ADDR : - begin - if(!ahb_hgrantmac) - begin - fsm_macdata2ahb_nxt = AHBM_IDLE; - end - else if (ahb_hready == 1'b1) - begin - if (i_mac_dataeobc_r == 1'b1 | - ahb_hgrantmac == 1'b0 | - i_1kc == 1'b1) - begin - fsm_macdata2ahb_nxt = AHBM_DATA ; - end - else - begin - fsm_macdata2ahb_nxt = AHBM_ADDRDATA ; - end - end - else - begin - fsm_macdata2ahb_nxt = AHBM_ADDR ; - end - end - AHBM_DATA : - begin - if (ahb_hready == 1'b1) - begin - if (ahb_hgrantmac == 1'b1 & - mac_datareqc == 1'b1 & - i_1kc == 1'b0) - begin - fsm_macdata2ahb_nxt = AHBM_ADDR ; - end - else - begin - fsm_macdata2ahb_nxt = AHBM_IDLE ; - end - end - else - begin - if (ahb_hresp == OKAY | ahb_hresp == ERROR) - begin - fsm_macdata2ahb_nxt = AHBM_DATA ; - end - else - begin - fsm_macdata2ahb_nxt = AHBM_IDLE ; - end - end - end - default: - begin - if (ahb_hready == 1'b1) - begin - if (ahb_hgrantmac == 1'b0 | - mac_dataeobc == 1'b1 | - i_1kc == 1'b1) - begin - fsm_macdata2ahb_nxt = AHBM_DATA ; - end - else - begin - fsm_macdata2ahb_nxt = AHBM_ADDRDATA ; - end - end - else - begin - if (ahb_hresp == OKAY | ahb_hresp == ERROR) - begin - fsm_macdata2ahb_nxt = AHBM_ADDRDATA ; - end - else - begin - fsm_macdata2ahb_nxt = AHBM_IDLE ; - end - end - end - endcase - end - - always @(posedge mhclk) - begin : fsm_macdata2ahb_r_reg_proc - if (mhresetn == 1'b0) - begin - fsm_macdata2ahb_r <= AHBM_IDLE ; - end - else - begin - fsm_macdata2ahb_r <= fsm_macdata2ahb_nxt ; - end - end - - always @(posedge mhclk) - begin : datactrl_reg_proc - if (mhresetn == 1'b0) - begin - i_datareqc_r <= 1'b0 ; - i_mac_dataeobc_r <= 1'b0 ; - i_ahb_hgrant_r <= 1'b0 ; - end - else - begin - i_datareqc_r <= mac_datareqc ; - i_mac_dataeobc_r <= mac_dataeobc ; - i_ahb_hgrant_r <= ahb_hgrantmac ; - end - end - - always @(posedge mhclk) - begin : ahbm_ctrl_reg_proc - if (mhresetn == 1'b0) - begin - ahb_hbusreqmac <= 1'b0 ; - i_hwritem <= 1'b0 ; - i_htransm <= IDLE ; - end - else - begin - ahb_hbusreqmac <= i_hbusreq_c ; - i_hwritem <= i_hwritem_c ; - i_htransm <= i_htransm_c ; - end - end - assign ahb_hsize = (MAHBDATAWIDTH == 8) ? HSIZE8BIT : - (MAHBDATAWIDTH == 16) ? HSIZE16BIT : - (MAHBDATAWIDTH == 32) ? HSIZE32BIT : - (MAHBDATAWIDTH == 64) ? HSIZE64BIT : - UNSUPPORTED ; - - assign ahb_hprot = HPROT_MACPROTECTIONCONTROL ; - - assign ahb_hrdata = mhrdata ; - - assign ahb_hready = mhready ; - - always @(mhresp) - begin : ahb_hresp_map_proc - case (mhresp) - HRESP_ERROR : - begin - ahb_hresp = ERROR ; - end - HRESP_RETRY : - begin - ahb_hresp = RETRY ; - end - HRESP_SPLIT : - begin - ahb_hresp = SPLIT ; - end - default : - begin - ahb_hresp = OKAY ; - end - endcase - end - - assign mhaddr = ahb_haddr ; - - always @(ahb_htrans) - begin : ahb_htrans_map_proc - case (ahb_htrans) - NONSEQ : - begin - mhtrans = HTRANS_NONSEQ ; - end - SEQ : - begin - mhtrans = HTRANS_SEQ ; - end - default : - begin - mhtrans = HTRANS_IDLE ; - end - endcase - end - - assign mhwrite = ahb_hwrite ; - - always @(ahb_hsize) - begin : ahb_hsize_map_proc - case (ahb_hsize) - HSIZE8BIT : - begin - mhsize = HSIZE_8BIT ; - end - HSIZE16BIT : - begin - mhsize = HSIZE_16BIT ; - end - default : - begin - mhsize = HSIZE_32BIT ; - end - endcase - end - - always @(ahb_hburst) - begin : ahb_hburst_map_proc - case (ahb_hburst) - INCR : - begin - mhburst = HBURST_INCR ; - end - default : - begin - mhburst = HBURST_SINGLE ; - end - endcase - end - - assign mhprot = ahb_hprot ; - - assign mhwdata = ahb_hwdata ; - - assign ahb_hgrantmac = mhgrantmac ; - - assign mhbusreqmac = ahb_hbusreqmac ; - - assign mhlockmac = ahb_hlockmac ; - - - assign mac_datareqc = datareqc ; - - assign mac_datareq = datareq ; - - assign mac_datarw = datarw ; - - assign mac_dataeobc = dataeobc ; - - assign mac_dataaddr = dataaddr ; - - assign mac_datao = datao ; - - assign dataack = mac_dataack ; - - assign datai = mac_datai ; - -endmodule - - -module RC_V ( - clk, - rst, - rxdv, - rxer, - rxd, - col, - ramwe, - ramaddr, - ramdata, - fdata, - faddr, - cachenf, - radg, - wadg, - rprog, - rcpoll, - riack, - ren, - ra, - pm, - pr, - pb, - rif, - ho, - hp, - rireq, - ff, - rf, - mf, - db, - re, - ce, - tl, - ftp, - ov, - cs, - length, - match, - matchval, - matchen, - matchdata, - focl, - foclack, - oco, - focg, - mfcl, - mfclack, - mfo, - mfcg, - stopi, - stopo, - rcsack, - rcsreq); - - parameter FIFODEPTH = 9; - parameter DATAWIDTH = 32; - - `include "utility.v" - - input clk; - input rst; - - input col; - input rxdv; - input rxer; - input [MIIWIDTH - 1:0] rxd; - - output ramwe; - wire ramwe; - output [FIFODEPTH - 1:0] ramaddr; - wire [FIFODEPTH - 1:0] ramaddr; - output [DATAWIDTH - 1:0] ramdata; - wire [DATAWIDTH - 1:0] ramdata; - - input [ADDRWIDTH - 1:0] fdata; - output [ADDRDEPTH - 1:0] faddr; - wire [ADDRDEPTH - 1:0] faddr; - - input cachenf; - input [FIFODEPTH - 1:0] radg; - output [FIFODEPTH - 1:0] wadg; - wire [FIFODEPTH - 1:0] wadg; - output rprog; - reg rprog; - output rcpoll; - wire rcpoll; - - input riack; - input ren; - input ra; - input pm; - input pr; - input pb; - input rif; - input ho; - input hp; - output rireq; - reg rireq; - output ff; - reg ff; - output rf; - reg rf; - output mf; - reg mf; - output db; - reg db; - output re; - reg re; - output ce; - reg ce; - output tl; - reg tl; - output ftp; - reg ftp; - output cs; - reg cs; - output ov; - reg ov; - output [13:0] length; - reg [13:0] length; - - input match; - input matchval; - output matchen; - reg matchen; - output [47:0] matchdata; - wire [47:0] matchdata; - - input focl; - output foclack; - wire foclack; - output oco; - reg oco; - output [10:0] focg; - reg [10:0] focg; - input mfcl; - output mfclack; - output mfo; - reg mfo; - output [15:0] mfcg; - reg [15:0] mfcg; - - input stopi; - output stopo; - reg stopo; - - input rcsack; - output rcsreq; - reg rcsreq; - - - - reg we; - reg full; - reg [FIFODEPTH - 1:0] wad; - reg [FIFODEPTH - 1:0] wadi; - reg [FIFODEPTH - 1:0] iwadg; - reg [FIFODEPTH - 1:0] wadig; - reg [FIFODEPTH - 1:0] radg_0_r; - reg [FIFODEPTH - 1:0] radg_r; - reg [FIFODEPTH - 1:0] isofad; - reg cachenf_r; - reg cachenf_2r; - reg fcfbci; - reg fcfbci_r; - reg eorfff; - - - reg col_r; - reg rxdv_r; - reg rxer_r; - reg [MIIWIDTH - 1:0] rxd_r; - wire [3:0] rxd_r4; - - reg [3:0] rsm_c; - reg [3:0] rsm; - reg [3:0] ncnt; - wire [1:0] ncnt10; - wire [2:0] ncnt20; - reg [DATAWIDTH - 1:0] data_c; - reg [DATAWIDTH - 1:0] data; - reg [31:0] crc_c; - reg [31:0] crc; - reg [6:0] bcnt; - wire [2:0] bcnt20; - reg bz; - reg winp; - wire iri_c; - reg iri; - reg riack_r; - reg [13:0] lcnt; - reg [15:0] lfield; - reg ren_r; - reg irprog; - - reg [2:0] fsm_c; - reg [2:0] fsm; - reg perfm_c; - reg perfm; - reg invm; - reg [8:0] crchash; - reg hash; - reg [47:0] dest; - reg [2:0] flcnt; - reg [ADDRDEPTH - 1:0] fa; - reg [15:0] fdata_r; - - reg rcs; - reg rcsack_r; - reg [7:0] rcscnt; - - reg [10:0] focnt; - reg focl_r; - reg [15:0] mfcnt; - reg mfcl_r; - - reg stop_r; - - wire [FIFODEPTH - 1:0] fzero; - wire [MIIWIDTH_MAX + 1:0] mzero_max; - wire [MIIWIDTH_MAX + 1:0] rxd_r_max; - - always @(posedge clk) - begin : mii_reg_proc - if (rst) - begin - col_r <= 1'b0; - rxdv_r <= 1'b0 ; - rxer_r <= 1'b0 ; - rxd_r <= {MIIWIDTH{1'b0}} ; - data <= {DATAWIDTH{1'b1}} ; - end - else - begin - col_r <= col ; - rxdv_r <= rxdv ; - rxer_r <= rxer ; - rxd_r <= rxd ; - data <= data_c ; - end - end - - assign rxd_r4 = rxd_r_max[MIIWIDTH-1:0]; - - assign ncnt10 = ncnt[1:0] ; - - assign ncnt20 = ncnt[2:0] ; - - always @(ncnt or ncnt10 or ncnt20 or rxd_r_max or data) - begin : data_proc - reg[15:0] data16; - reg[31:0] data32; - case (DATAWIDTH) - 8 : - begin - data_c <= data ; - if (!(ncnt[0])) - begin - data_c[3:0] <= rxd_r_max[MIIWIDTH-1:0] ; - end - else - begin - data_c[7:4] <= rxd_r_max[MIIWIDTH-1:0] ; - end - end - 16 : - begin - data16 = data; - case (ncnt10) - 2'b00 : - begin - data16[3:0] = rxd_r_max[MIIWIDTH-1:0]; - end - 2'b01 : - begin - data16[7:4] = rxd_r_max[MIIWIDTH-1:0]; - end - 2'b10 : - begin - data16[11:8] = rxd_r_max[MIIWIDTH-1:0]; - end - default : - begin - data16[15:12] = rxd_r_max[MIIWIDTH-1:0]; - end - endcase - data_c <= data16 ; - end - default : - begin - data32 = data; - case (ncnt20) - 3'b000 : - begin - data32[3:0] = rxd_r_max[MIIWIDTH-1:0]; - end - 3'b001 : - begin - data32[7:4] = rxd_r_max[MIIWIDTH-1:0]; - end - 3'b010 : - begin - data32[11:8] = rxd_r_max[MIIWIDTH-1:0]; - end - 3'b011 : - begin - data32[15:12] = rxd_r_max[MIIWIDTH-1:0]; - end - 3'b100 : - begin - data32[19:16] = rxd_r_max[MIIWIDTH-1:0]; - end - 3'b101 : - begin - data32[23:20] = rxd_r_max[MIIWIDTH-1:0]; - end - 3'b110 : - begin - data32[27:24] = rxd_r_max[MIIWIDTH-1:0]; - end - default : - begin - data32[31:28] = rxd_r_max[MIIWIDTH-1:0]; - end - endcase - data_c <= data32 ; - end - endcase - end - - always @(posedge clk) - begin : fifofull_reg_proc - if (rst) - begin - cachenf_r <= 1'b1 ; - cachenf_2r <= 1'b1 ; - full <= 1'b0 ; - end - else - begin - cachenf_r <= cachenf ; - - if(cachenf_2r | - ( - (!rxdv_r & cachenf_r) | - ( rxdv_r & cachenf_r & - (rsm==RSM_IDLE_RCSMT | rsm==RSM_SFD) - ) - ) - ) - begin - cachenf_2r <= cachenf ; - end - - if ((wadig == radg_r) | (iwadg == radg_r & full)) - begin - full <= 1'b1 ; - end - else - begin - full <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : addr_reg_proc - if (rst) - begin - wad <= {FIFODEPTH{1'b0}} ; - wadi <= {fzero[FIFODEPTH - 1:1], 1'b1} ; - iwadg <= {FIFODEPTH{1'b0}} ; - isofad <= {FIFODEPTH{1'b0}} ; - wadig <= {fzero[FIFODEPTH - 1:1],1'b1} ; - radg_0_r <= {FIFODEPTH{1'b0}} ; - radg_r <= {FIFODEPTH{1'b0}} ; - end - else - begin - if (rsm == RSM_BAD) - begin - wad <= isofad ; - end - else if (we) - begin - wad <= wad + 1 ; - end - - if (rsm == RSM_BAD) - begin - wadi <= isofad + 1 ; - end - else if (we) - begin - wadi <= wadi + 1 ; - end - - iwadg[FIFODEPTH - 1] <= wad[FIFODEPTH - 1] ; - begin : iwaddrg_loop - integer i; - for(i = FIFODEPTH - 2; i >= 0; i = i - 1) - begin - iwadg[i] <= wad[i + 1] ^ wad[i] ; - end - end - - wadig[FIFODEPTH - 1] <= wadi[FIFODEPTH - 1] ; - begin : waddrig_loop - integer i; - for(i = FIFODEPTH - 2; i >= 0; i = i - 1) - begin - wadig[i] <= wadi[i + 1] ^ wadi[i] ; - end - end - - if (rsm == RSM_IDLE_RCSMT) - begin - isofad <= wad ; - end - - radg_0_r <= radg ; - radg_r <= radg_0_r ; - - end - end - - always @(posedge clk) - begin : we_reg_proc - if (rst) - begin - we <= 1'b0 ; - end - else - begin - if ((rsm == RSM_INFO | - rsm == RSM_DEST | - rsm == RSM_LENGTH | - rsm == RSM_SOURCE) & - ((rxdv_r & ((DATAWIDTH == 8 & (ncnt[0])) | - (DATAWIDTH == 16 & ncnt[1:0] == 2'b11) | - (DATAWIDTH == 32 & ncnt[2:0] == 3'b111))) | - (!rxdv_r & !we & - ( - (DATAWIDTH==32 & ncnt[2:1]!=2'b00) | - (DATAWIDTH==16 & ncnt[1] !=1'b0) - ) - ) | - (full & !we))) - begin - we <= 1'b1 ; - end - else - begin - we <= 1'b0 ; - end - end - end - - assign ramdata = data ; - - assign ramwe = we ; - - assign ramaddr = wad ; - - assign wadg = iwadg ; - - always @(rsm or - rxdv_r or - rxd_r_max or - rxd_r4 or - stop_r or - bz or - fsm or - ra or - pm or - pb or - dest or - riack_r or - full or - ren_r or - winp or - irprog or - cachenf_r) - begin : rsm_proc - case (rsm) - RSM_IDLE_RCSMT : - begin - if (rxdv_r & !stop_r & ren_r) - begin - if (rxd_r_max[MIIWIDTH-1:0] == 4'b0101) - begin - rsm_c <= RSM_SFD ; - end - else - begin - rsm_c <= RSM_IDLE_RCSMT ; - end - end - else - begin - rsm_c <= RSM_IDLE_RCSMT ; - end - end - RSM_SFD : - begin - if (rxdv_r & !full & cachenf_r) - begin - case (rxd_r4) - 4'b1101 : - begin - rsm_c <= RSM_DEST ; - end - 4'b0101 : - begin - rsm_c <= RSM_SFD ; - end - default : - begin - rsm_c <= RSM_IDLE_RCSMT ; - end - endcase - end - else if (full | !cachenf_r) - begin - rsm_c <= RSM_BAD ; - end - else - begin - rsm_c <= RSM_IDLE_RCSMT ; - end - end - RSM_DEST : - begin - if (!rxdv_r | full | !cachenf_r) - begin - rsm_c <= RSM_BAD ; - end - else if (bz) - begin - rsm_c <= RSM_SOURCE ; - end - else - begin - rsm_c <= RSM_DEST ; - end - end - RSM_SOURCE : - begin - if (!rxdv_r) - begin - if ((pb) & (fsm == FSM_MATCH | ra | (pm & (dest[0])))) - begin - rsm_c <= RSM_SUCC ; - end - else - begin - rsm_c <= RSM_BAD ; - end - end - else if (full | !cachenf_r) - begin - rsm_c <= RSM_BAD ; - end - else if (bz) - begin - rsm_c <= RSM_LENGTH ; - end - else - begin - rsm_c <= RSM_SOURCE ; - end - end - RSM_LENGTH : - begin - if (!rxdv_r) - begin - if ((pb) & (fsm == FSM_MATCH | ra | (pm & (dest[0])))) - begin - rsm_c <= RSM_SUCC ; - end - else - begin - rsm_c <= RSM_BAD ; - end - end - else if (full | !cachenf_r) - begin - rsm_c <= RSM_BAD ; - end - else if (bz) - begin - rsm_c <= RSM_INFO ; - end - else - begin - rsm_c <= RSM_LENGTH ; - end - end - RSM_INFO : - begin - if (!rxdv_r) - begin - if ((winp | pb) & - (fsm == FSM_MATCH | ra | (pm & (dest[0])))) - begin - rsm_c <= RSM_SUCC ; - end - else - begin - rsm_c <= RSM_BAD ; - end - end - else if (full | !cachenf_r) - begin - if (winp) - begin - rsm_c <= RSM_SUCC ; - end - else - begin - rsm_c <= RSM_BAD ; - end - end - else if (fsm == FSM_FAIL & !ra & ~(pm & (dest[0]))) - begin - rsm_c <= RSM_BAD ; - end - else - begin - rsm_c <= RSM_INFO ; - end - end - RSM_SUCC : - begin - rsm_c <= RSM_INT ; - end - RSM_INT : - begin - if (riack_r) - begin - rsm_c <= RSM_INT1 ; - end - else - begin - rsm_c <= RSM_INT ; - end - end - RSM_INT1 : - begin - if (!rxdv_r & !riack_r) - begin - rsm_c <= RSM_IDLE_RCSMT ; - end - else - begin - rsm_c <= RSM_INT1 ; - end - end - default : - begin - if (!rxdv_r & !riack_r & !irprog) - begin - rsm_c <= RSM_IDLE_RCSMT ; - end - else - begin - rsm_c <= RSM_BAD ; - end - end - endcase - end - - always @(posedge clk) - begin : rsm_reg_proc - if (rst) - begin - rsm <= RSM_IDLE_RCSMT ; - end - else - begin - rsm <= rsm_c ; - end - end - - always @(posedge clk) - begin : rprog_reg_proc - if (rst) - begin - irprog <= 1'b0 ; - rprog <= 1'b0 ; - end - else - begin - if (rsm == RSM_IDLE_RCSMT | - rsm == RSM_BAD | - rsm == RSM_INT | - rsm == RSM_INT1) - begin - irprog <= 1'b0 ; - end - else - begin - irprog <= 1'b1 ; - end - - if (winp & irprog) - begin - rprog <= 1'b1 ; - end - else - begin - rprog <= 1'b0 ; - end - end - end - - assign rcpoll = irprog ; - - always @(posedge clk) - begin : bncnt_reg_proc - if (rst) - begin - bcnt <= {7{1'b0}} ; - bz <= 1'b0 ; - ncnt <= 4'b0000 ; - end - else - begin - if(cachenf_r) - begin - if (bz | rsm == RSM_IDLE_RCSMT) - begin - case (rsm) - RSM_IDLE_RCSMT : - begin - bcnt <= 7'b0000101 ; - end - RSM_DEST : - begin - bcnt <= 7'b0000101 ; - end - RSM_SOURCE : - begin - bcnt <= 7'b0000001 ; - end - default : - begin - bcnt <= 7'b0110001 ; - end - endcase - end - else - begin - if (ncnt[0]) - begin - bcnt <= bcnt - 1 ; - end - end - end - else - begin - if(!fcfbci_r) - begin - bcnt <= 7'b0111110 ; - end - else - begin - if (!ncnt[0]) - begin - bcnt <= bcnt - 1 ; - end - end - end - - if (bcnt == 7'b0000000 & !ncnt[0]) - begin - bz <= 1'b1 ; - end - else - begin - bz <= 1'b0 ; - end - - if (rsm == RSM_SFD | rsm == RSM_IDLE_RCSMT) - begin - ncnt <= 4'b0000 ; - end - else - begin - ncnt <= ncnt + 1 ; - end - end - end - - always @(posedge clk) - begin : winp_reg_proc - if (rst) - begin - winp <= 1'b0 ; - end - else - begin - if (rsm == RSM_IDLE_RCSMT) - begin - winp <= 1'b0 ; - end - else if ((rsm == RSM_INFO & bz & cachenf_2r) | - (rsm == RSM_BAD & bz & !cachenf_2r)) - begin - winp <= 1'b1 ; - end - end - end - - always @(crc or rsm or rxd_r_max) - begin : crc_proc - case (rsm) - RSM_IDLE_RCSMT : - begin - crc_c <= {32{1'b1}} ; - end - RSM_DEST, RSM_SOURCE, RSM_LENGTH, RSM_INFO : - begin - crc_c[0] <= crc[28] ^ - rxd_r_max[3] ; - crc_c[1] <= crc[28] ^ crc[29] ^ - rxd_r_max[2] ^ rxd_r_max[3] ; - crc_c[2] <= crc[28] ^ crc[29] ^ crc[30] ^ - rxd_r_max[1] ^ rxd_r_max[2] ^ rxd_r_max[3] ; - crc_c[3] <= crc[29] ^ crc[30] ^ crc[31] ^ - rxd_r_max[0] ^ rxd_r_max[1] ^ rxd_r_max[2] ; - crc_c[4] <= crc[0] ^ crc[28] ^ crc[30] ^ crc[31] ^ - rxd_r_max[0] ^ rxd_r_max[1] ^ rxd_r_max[3] ; - crc_c[5] <= crc[1] ^ crc[28] ^ crc[29] ^ crc[31] ^ - rxd_r_max[0] ^ rxd_r_max[2] ^ rxd_r_max[3] ; - crc_c[6] <= crc[2] ^ crc[29] ^ crc[30] ^ - rxd_r_max[1] ^ rxd_r_max[2] ; - crc_c[7] <= crc[3] ^ crc[28] ^ crc[30] ^ crc[31] ^ - rxd_r_max[0] ^ rxd_r_max[1] ^ rxd_r_max[3] ; - crc_c[8] <= crc[4] ^ crc[28] ^ crc[29] ^ crc[31] ^ - rxd_r_max[0] ^ rxd_r_max[2] ^ rxd_r_max[3] ; - crc_c[9] <= crc[5] ^ crc[29] ^ crc[30] ^ - rxd_r_max[1] ^ rxd_r_max[2] ; - crc_c[10] <= crc[6] ^ crc[28] ^ crc[30] ^ crc[31] ^ - rxd_r_max[0] ^ rxd_r_max[1] ^ rxd_r_max[3] ; - crc_c[11] <= crc[7] ^ crc[28] ^ crc[29] ^ crc[31] ^ - rxd_r_max[0] ^ rxd_r_max[2] ^ rxd_r_max[3] ; - crc_c[12] <= crc[8] ^ crc[28] ^ crc[29] ^ crc[30] ^ - rxd_r_max[1] ^ rxd_r_max[2] ^ rxd_r_max[3] ; - crc_c[13] <= crc[9] ^ crc[29] ^ crc[30] ^ crc[31] ^ - rxd_r_max[0] ^ rxd_r_max[1] ^ rxd_r_max[2] ; - crc_c[14] <= crc[10] ^ crc[30] ^ crc[31] ^ - rxd_r_max[0] ^ rxd_r_max[1] ; - crc_c[15] <= crc[11] ^ crc[31] ^ - rxd_r_max[0] ; - crc_c[16] <= crc[12] ^ crc[28] ^ - rxd_r_max[3] ; - crc_c[17] <= crc[13] ^ crc[29] ^ - rxd_r_max[2] ; - crc_c[18] <= crc[14] ^ crc[30] ^ - rxd_r_max[1] ; - crc_c[19] <= crc[15] ^ crc[31] ^ - rxd_r_max[0] ; - crc_c[20] <= crc[16] ; - crc_c[21] <= crc[17] ; - crc_c[22] <= crc[18] ^ crc[28] ^ - rxd_r_max[3] ; - crc_c[23] <= crc[19] ^ crc[28] ^ crc[29] ^ - rxd_r_max[2] ^ rxd_r_max[3] ; - crc_c[24] <= crc[20] ^ crc[29] ^ crc[30] ^ - rxd_r_max[1] ^ rxd_r_max[2] ; - crc_c[25] <= crc[21] ^ crc[30] ^ crc[31] ^ - rxd_r_max[0] ^ rxd_r_max[1] ; - crc_c[26] <= crc[22] ^ crc[28] ^ crc[31] ^ - rxd_r_max[0] ^ rxd_r_max[3] ; - crc_c[27] <= crc[23] ^ crc[29] ^ - rxd_r_max[2] ; - crc_c[28] <= crc[24] ^ crc[30] ^ - rxd_r_max[1] ; - crc_c[29] <= crc[25] ^ crc[31] ^ - rxd_r_max[0] ; - crc_c[30] <= crc[26] ; - crc_c[31] <= crc[27] ; - end - default : - begin - crc_c <= crc ; - end - endcase - end - - always @(posedge clk) - begin : crc_reg_proc - if (rst) - begin - crc <= {32{1'b1}} ; - end - else - begin - crc <= crc_c ; - end - end - - assign iri_c = (rsm == RSM_INT) ? 1'b1 : 1'b0 ; - - always @(posedge clk) - begin : rint_reg_proc - if (rst) - begin - iri <= 1'b0 ; - riack_r <= 1'b0 ; - rireq <= 1'b0 ; - end - else - begin - iri <= iri_c ; - riack_r <= riack ; - rireq <= iri ; - end - end - - always @(posedge clk) - begin : length_reg_proc - if (rst) - begin - lcnt <= {14{1'b0}} ; - length <= {14{1'b0}} ; - end - else - begin - if ((rsm == RSM_IDLE_RCSMT && cachenf_2r) | - (!fcfbci && !cachenf_2r) | - rsm == RSM_INT1) - begin - lcnt <= {14{1'b0}} ; - end - else if (((rsm == RSM_INFO | - rsm == RSM_LENGTH | - rsm == RSM_DEST | - rsm == RSM_SOURCE) & rxdv_r) | - (fcfbci && !cachenf_2r)) - begin - if (ncnt[0]) - begin - lcnt <= lcnt + 1 ; - end - end - - length[13] <= lcnt[13] ; - begin : length_loop - integer i; - for(i = 12; i >= 0; i = i - 1) - begin - length[i] <= lcnt[i + 1] ^ lcnt[i] ; - end - end - end - end - - always @(posedge clk) - begin : fcfbci_reg_proc - if (rst) - begin - fcfbci <= 1'b0 ; - fcfbci_r <= 1'b0 ; - end - else - begin - - fcfbci_r <= fcfbci ; - - if(!cachenf_2r) - begin - if(rxdv_r && rxd_r4==4'b1101) - begin - fcfbci <= 1'b1 ; - end - else if(!rxdv_r) - begin - fcfbci <= 1'b0 ; - end - end - else - begin - fcfbci <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : eorfff_reg_proc - if (rst) - begin - eorfff <= 1'b0 ; - end - else - begin - if(rsm_c==RSM_IDLE_RCSMT && rsm==RSM_BAD && !cachenf_2r) - begin - eorfff <= 1'b1 ; - end - else - begin - eorfff <= 1'b0 ; - end - end - end - - - always @(posedge clk) - begin : stat_reg_proc - if (rst) - begin - lfield <= {16{1'b0}} ; - ftp <= 1'b0 ; - tl <= 1'b0 ; - ff <= 1'b0 ; - mf <= 1'b0 ; - re <= 1'b0 ; - ce <= 1'b0 ; - db <= 1'b0 ; - rf <= 1'b0 ; - ov <= 1'b0 ; - cs <= 1'b0 ; - end - else - begin - if (rsm == RSM_LENGTH) - begin - if (bcnt[1:0] == 2'b00) - begin - if (!(ncnt[0])) - begin - lfield[3:0] <= rxd_r_max[MIIWIDTH-1:0] ; - end - else - begin - lfield[7:4] <= rxd_r_max[MIIWIDTH-1:0] ; - end - end - else - begin - if (!(ncnt[0])) - begin - lfield[11:8] <= rxd_r_max[MIIWIDTH-1:0] ; - end - else - begin - lfield[15:12] <= rxd_r_max[MIIWIDTH-1:0] ; - end - end - end - - if (lfield > MAX_SIZE) - begin - ftp <= 1'b1 ; - end - else - begin - ftp <= 1'b0 ; - end - - if (lcnt == MAX_FRAME & !iri_c) - begin - tl <= 1'b1 ; - end - else if (rsm == RSM_IDLE_RCSMT) - begin - tl <= 1'b0 ; - end - - if (!iri_c) - begin - if (fsm == FSM_MATCH) - begin - ff <= 1'b0 ; - end - else - begin - ff <= 1'b1 ; - end - end - - if (!iri_c) - begin - mf <= dest[0] ; - end - - if (rxer_r & !iri_c) - begin - re <= 1'b1 ; - end - else if (rsm == RSM_IDLE_RCSMT) - begin - re <= 1'b0 ; - end - - if (rsm == RSM_INFO & !(ncnt[0])) - begin - if (crc == CRCVAL) - begin - ce <= 1'b0 ; - end - else - begin - ce <= 1'b1 ; - end - end - - if (rsm == RSM_INFO) - begin - if (!rxdv_r & (ncnt[0])) - begin - db <= 1'b1 ; - end - else - begin - db <= 1'b0 ; - end - end - - if (!winp & iri_c) - begin - rf <= 1'b1 ; - end - else if (rsm == RSM_IDLE_RCSMT) - begin - rf <= 1'b0 ; - end - - if (rsm == RSM_IDLE_RCSMT) - begin - ov <= 1'b0 ; - end - else if (full | !cachenf_r) - begin - ov <= 1'b1 ; - end - - if (col_r & !iri_c) - begin - cs <= 1'b1 ; - end - else if (rsm == RSM_IDLE_RCSMT) - begin - cs <= 1'b0 ; - end - - - end - end - - always @(posedge clk) - begin : ren_reg_proc - if (rst) - begin - ren_r <= 1'b0 ; - end - else - begin - if (rsm == RSM_IDLE_RCSMT) - begin - ren_r <= ren ; - end - end - end - - always @(fsm or - rsm or - ho or - hp or - dest or - lcnt or - ncnt or - flcnt or - perfm or - hash or - pr or - fa or - invm or - rif or - matchval or - match) - begin : fsm_proc - case (fsm) - FSM_IDLE : - begin - if (lcnt[2:0] == 3'b101 & (ncnt[0])) - begin - if (pr) - begin - fsm_c <= FSM_MATCH ; - end - else if (ho | (hp & (dest[0]))) - begin - fsm_c <= FSM_HASH ; - end - else if (!hp) - begin - fsm_c <= FSM_PERF16 ; - end - else - begin - fsm_c <= FSM_PERF1 ; - end - end - else - begin - fsm_c <= FSM_IDLE ; - end - end - FSM_PERF1 : - begin - if (fa == 6'b101100) - begin - if(perfm | - (matchval & match)) - begin - fsm_c <= FSM_MATCH ; - end - else - begin - fsm_c <= FSM_FAIL ; - end - end - else - begin - fsm_c <= FSM_PERF1 ; - end - end - FSM_PERF16 : - begin - if ((flcnt == 3'b010 & perfm & !rif) | - (fa == 6'b110010 & rif & invm) | - (matchval & match)) - begin - fsm_c <= FSM_MATCH ; - end - else if (fa == 6'b110010) - begin - fsm_c <= FSM_FAIL ; - end - else - begin - fsm_c <= FSM_PERF16 ; - end - end - FSM_HASH : - begin - if (matchval & match) - begin - fsm_c <= FSM_MATCH ; - end - else if (flcnt == 3'b101) - begin - if (hash) - begin - fsm_c <= FSM_MATCH ; - end - else - begin - fsm_c <= FSM_FAIL ; - end - end - else - begin - fsm_c <= FSM_HASH ; - end - end - FSM_MATCH : - begin - if (rsm == RSM_IDLE_RCSMT) - begin - fsm_c <= FSM_IDLE ; - end - else - begin - fsm_c <= FSM_MATCH ; - end - end - default : - begin - if (rsm == RSM_IDLE_RCSMT) - begin - fsm_c <= FSM_IDLE ; - end - else - begin - fsm_c <= FSM_FAIL ; - end - end - endcase - end - - always @(posedge clk) - begin : fsm_reg_proc - if (rst) - begin - fsm <= FSM_IDLE ; - end - else - begin - fsm <= fsm_c ; - end - end - - assign bcnt20 = bcnt[2:0] ; - - always @(posedge clk) - begin : dest_reg_proc - if (rst) - begin - dest <= {48{1'b0}} ; - end - else - begin - if (rsm == RSM_DEST) - begin - if (!(ncnt[0])) - begin - case (bcnt20) - 3'b101 : - begin - dest[3:0] <= rxd_r_max[MIIWIDTH-1:0] ; - end - 3'b100 : - begin - dest[11:8] <= rxd_r_max[MIIWIDTH-1:0] ; - end - 3'b011 : - begin - dest[19:16] <= rxd_r_max[MIIWIDTH-1:0] ; - end - 3'b010 : - begin - dest[27:24] <= rxd_r_max[MIIWIDTH-1:0] ; - end - 3'b001 : - begin - dest[35:32] <= rxd_r_max[MIIWIDTH-1:0] ; - end - default : - begin - dest[43:40] <= rxd_r_max[MIIWIDTH-1:0] ; - end - endcase - end - else - begin - case (bcnt20) - 3'b101 : - begin - dest[7:4] <= rxd_r_max[MIIWIDTH-1:0] ; - end - 3'b100 : - begin - dest[15:12] <= rxd_r_max[MIIWIDTH-1:0] ; - end - 3'b011 : - begin - dest[23:20] <= rxd_r_max[MIIWIDTH-1:0] ; - end - 3'b010 : - begin - dest[31:28] <= rxd_r_max[MIIWIDTH-1:0] ; - end - 3'b001 : - begin - dest[39:36] <= rxd_r_max[MIIWIDTH-1:0] ; - end - default : - begin - dest[47:44] <= rxd_r_max[MIIWIDTH-1:0] ; - end - endcase - end - end - end - end - - always @(posedge clk) - begin : hash_reg_proc - if (rst) - begin - crchash <= {9{1'b0}} ; - hash <= 1'b0 ; - fdata_r <= {16{1'b0}} ; - end - else - begin - if (fsm == FSM_HASH & flcnt == 3'b000) - begin - crchash <= {crc[23], crc[24], crc[25], crc[26], - crc[27], crc[28], crc[29], crc[30], crc[31]} ; - end - - hash <= fdata_r[crchash[3:0]] ; - - fdata_r <= fdata ; - end - end - - always @(perfm or flcnt or fsm or fdata_r or dest) - begin : perfm_proc - if ((flcnt == 3'b001 & fdata_r != dest[47:32]) | - (flcnt == 3'b000 & fdata_r != dest[31:16]) | - (flcnt == 3'b010 & fdata_r != dest[15:0]) | fsm == FSM_IDLE) - begin - perfm_c <= 1'b0 ; - end - else if (flcnt == 3'b010 & fdata_r == dest[15:0]) - begin - perfm_c <= 1'b1 ; - end - else - begin - perfm_c <= perfm ; - end - end - - always @(posedge clk) - begin : perfm_reg_proc - if (rst) - begin - invm <= 1'b0 ; - perfm <= 1'b0 ; - end - else - begin - perfm <= perfm_c ; - - if (fsm == FSM_IDLE) - begin - invm <= 1'b1 ; - end - else if (flcnt == 3'b001 & perfm_c) - begin - invm <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : fa_reg_proc - if (rst) - begin - flcnt <= {3{1'b0}} ; - fa <= {ADDRDEPTH{1'b0}} ; - end - else - begin - case (fsm) - FSM_PERF1, FSM_PERF16 : - begin - fa <= fa + 1 ; - end - FSM_HASH : - begin - fa[5:0] <= {1'b0, crchash[8:4]} ; - end - default : - begin - if (hp & !(dest[0])) - begin - fa <= PERF1_ADDR ; - end - else - begin - fa <= {ADDRDEPTH{1'b0}} ; - end - end - endcase - - if (fsm_c == FSM_IDLE | - (flcnt == 3'b010 & fsm_c == FSM_PERF16) | - (flcnt == 3'b010 & fsm_c == FSM_PERF1)) - begin - flcnt <= {3{1'b0}} ; - end - else if (fsm == FSM_PERF1 | - fsm == FSM_PERF16 | - fsm == FSM_HASH) - begin - flcnt <= flcnt + 1 ; - end - end - end - - assign faddr = fa ; - - assign matchdata = dest ; - - always @(posedge clk) - begin : matchen_reg_proc - if (rst) - begin - matchen <= 1'b0 ; - end - else - begin - if (fsm == FSM_PERF1 | fsm == FSM_HASH | fsm == FSM_PERF16) - begin - matchen <= 1'b1 ; - end - else - begin - matchen <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : stop_reg_proc - if (rst) - begin - stop_r <= 1'b0 ; - stopo <= 1'b0 ; - end - else - begin - stop_r <= stopi ; - - if (stop_r & rsm == RSM_IDLE_RCSMT) - begin - stopo <= 1'b1 ; - end - else - begin - stopo <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : rcscnt_reg_proc - if (rst) - begin - rcscnt <= {8{1'b0}} ; - rcs <= 1'b0 ; - rcsreq <= 1'b0 ; - rcsack_r <= 1'b0 ; - end - else - begin - if (rcscnt == 8'b00000000) - begin - rcscnt <= 8'b10000000 ; - end - else - begin - rcscnt <= rcscnt - 1 ; - end - - if (rcscnt == 8'b00000000) - begin - rcs <= 1'b1 ; - end - else if (rcsack_r) - begin - rcs <= 1'b0 ; - end - - if (rcs & !rcsack_r) - begin - rcsreq <= 1'b1 ; - end - else if (rcsack_r) - begin - rcsreq <= 1'b0 ; - end - - rcsack_r <= rcsack ; - end - end - - always @(posedge clk) - begin : focnt_reg_proc - if (rst) - begin - focnt <= {11{1'b0}} ; - oco <= 1'b0 ; - focl_r <= 1'b0 ; - focg <= {11{1'b0}} ; - end - else - begin - if (focl_r) - begin - focnt <= {11{1'b0}} ; - end - else if ((rsm == RSM_DEST | - rsm == RSM_SOURCE | - rsm == RSM_LENGTH | - rsm == RSM_INFO | - rsm == RSM_SFD) & - full) - begin - focnt <= focnt + 1 ; - end - - if (focl_r) - begin - oco <= 1'b0 ; - end - else if ((rsm == RSM_DEST | - rsm == RSM_SOURCE | - rsm == RSM_LENGTH | - rsm == RSM_INFO) & - focnt == 11'b11111111111 & - (full | !cachenf_r)) - begin - oco <= 1'b1 ; - end - - focl_r <= focl ; - - focg[10] <= focnt[10] ; - begin : focg_loop - integer i; - for(i = 9; i >= 0; i = i - 1) - begin - focg[i] <= focnt[i] ^ focnt[i + 1] ; - end - end - end - end - - assign foclack = focl_r ; - - always @(posedge clk) - begin : mfcnt_reg_proc - if (rst) - begin - mfcnt <= {16{1'b0}} ; - mfo <= 1'b0 ; - mfcl_r <= 1'b0 ; - mfcg <= {16{1'b0}} ; - end - else - begin - if (mfcl_r) - begin - mfcnt <= {16{1'b0}} ; - end - else if ( - eorfff && - (pb | winp) && - ( - fsm==FSM_MATCH | ra | - ( - pm && dest[0] - ) - ) - ) - begin - mfcnt <= mfcnt + 1'b1 ; - end - - if (mfcl_r) - begin - mfo <= 1'b0 ; - end - else if ( - mfcnt=={16{1'b1}} && pb && - ( - fsm==FSM_MATCH | ra | - ( - pm && dest[0] - ) - ) - ) - begin - mfo <= 1'b1 ; - end - - mfcl_r <= mfcl; - - begin : mfcg_reg_write - integer i; - mfcg[15] <= mfcnt[15]; - for(i = 14; i >= 0; i = i - 1) - begin - mfcg[i] <= mfcnt[i] ^ mfcnt[i + 1]; - end - end - end - end - - assign mfclack = mfcl_r ; - - assign fzero = {FIFODEPTH{1'b0}} ; - - assign mzero_max = {(MIIWIDTH_MAX + 1){1'b0}} ; - - assign rxd_r_max = {mzero_max[MIIWIDTH_MAX + 1:MIIWIDTH], - rxd_r}; - -endmodule - - - -module RFIFO_V ( - clk, - rst, - ramdata, - ramaddr, - fifore, - ffo, - rfo, - mfo, - tlo, - reo, - dbo, - ceo, - ovo, - cso, - flo, - fifodata, - cachere, - cachene, - cachenf, - radg, - rireq, - ffi, - rfi, - mfi, - tli, - rei, - dbi, - cei, - ovi, - csi, - fli, - wadg, - riack - ); - - parameter DATAWIDTH = 32; - parameter DATADEPTH = 32; - parameter FIFODEPTH = 9; - parameter CACHEDEPTH = 2; - - input clk; - input rst; - - input [DATAWIDTH - 1:0] ramdata; - output [FIFODEPTH - 1:0] ramaddr; - wire [FIFODEPTH - 1:0] ramaddr; - - input fifore; - output ffo; - wire ffo; - output rfo; - wire rfo; - output mfo; - wire mfo; - output tlo; - wire tlo; - output reo; - wire reo; - output dbo; - wire dbo; - output ceo; - wire ceo; - output ovo; - wire ovo; - output cso; - wire cso; - output [13:0] flo; - wire [13:0] flo; - output [DATAWIDTH - 1:0] fifodata; - wire [DATAWIDTH - 1:0] fifodata; - - input cachere; - output cachene; - wire cachene; - - output cachenf; - wire cachenf; - output [FIFODEPTH - 1:0] radg; - reg [FIFODEPTH - 1:0] radg; - - input rireq; - input ffi; - input rfi; - input mfi; - input tli; - input rei; - input dbi; - input cei; - input ovi; - input csi; - input [13:0] fli; - input [FIFODEPTH - 1:0] wadg; - output riack; - wire riack; - - - parameter CSWIDTH = 23; - reg [CSWIDTH - 1:0] csmem[(1'b1 << CACHEDEPTH) - 1:0]; - wire cswe; - wire csre; - reg csnf; - reg csne; - reg [CACHEDEPTH - 1:0] cswad; - reg [CACHEDEPTH - 1:0] cswadi; - reg [CACHEDEPTH - 1:0] csrad; - reg [CACHEDEPTH - 1:0] csrad_r; - wire [CSWIDTH - 1:0] csdi; - wire [CSWIDTH - 1:0] csdo; - - reg [FIFODEPTH - 1:0] stat; - reg [FIFODEPTH - 1:0] rad_c; - reg [FIFODEPTH - 1:0] rad; - reg [FIFODEPTH - 1:0] wad_c; - reg [FIFODEPTH - 1:0] wad; - reg [FIFODEPTH - 1:0] wadg_0_r; - reg [FIFODEPTH - 1:0] wadg_r; - reg [13:0] flibin_c; - reg [13:0] flibin; - reg [13:0] fli_r; - - reg rireq_r; - reg iriack; - - wire [FIFODEPTH - 1:0] fzero; - - always @(posedge clk) - begin : csmem_reg_proc - if (rst) - begin : csmem_reset - integer i; - for(i = ((1'b1 << CACHEDEPTH) - 1); i >= 0; i = i - 1) - begin - csmem[i] <= {CSWIDTH{1'b0}}; - end - csrad_r <= csrad ; - end - else - begin - csmem[cswad] <= csdi ; - csrad_r <= csrad ; - end - end - - always @(posedge clk) - begin : cswad_reg_proc - if (rst) - begin - cswad <= {CACHEDEPTH{1'b1}} ; - end - else - begin - if (cswe) - begin - cswad <= cswad + 1 ; - end - end - end - - always @(posedge clk) - begin : csrad_reg_proc - if (rst) - begin - csrad <= {CACHEDEPTH{1'b1}} ; - end - else - begin - if (csre) - begin - csrad <= csrad + 1 ; - end - end - end - - always @(posedge clk) - begin : csne_reg_proc - if (rst) - begin - csne <= 1'b0 ; - end - else - begin - if (cswad == csrad) - begin - csne <= 1'b0 ; - end - else - begin - csne <= 1'b1 ; - end - end - end - - always @(cswad) - begin : cswadi_drv - cswadi <= cswad + 1; - end - - always @(posedge clk) - begin : csnf_reg_proc - if (rst) - begin - csnf <= 1'b0 ; - end - else - begin - if (cswadi == csrad) - begin - csnf <= 1'b0 ; - end - else - begin - csnf <= 1'b1 ; - end - end - end - - always @(fli_r) - begin : flibin_proc - reg[13:0] flibin_v; - flibin_v[13] = fli_r[13]; - begin : flibin_loop - integer i; - for(i = 12; i >= 0; i = i - 1) - begin - flibin_v[i] = flibin_v[i + 1] ^ fli_r[i]; - end - end - flibin_c = flibin_v ; - end - - always @(posedge clk) - begin : flibin_reg_proc - if (rst) - begin - flibin <= {14{1'b0}} ; - fli_r <= {14{1'b0}} ; - end - else - begin - flibin <= flibin_c ; - fli_r <= fli ; - end - end - - assign cachene = csne ; - - assign cachenf = csnf ; - - assign cswe = rireq_r & ~iriack ; - - assign csdo = csmem[csrad_r] ; - - assign csdi = {ffi, rfi, mfi, tli, rei, dbi, cei, ovi, csi, flibin} ; - - assign ffo = csdo[CSWIDTH - 1] ; - - assign rfo = csdo[CSWIDTH - 2] ; - - assign mfo = csdo[CSWIDTH - 3] ; - - assign tlo = csdo[CSWIDTH - 4] ; - - assign reo = csdo[CSWIDTH - 5] ; - - assign dbo = csdo[CSWIDTH - 6] ; - - assign ceo = csdo[CSWIDTH - 7] ; - - assign ovo = csdo[CSWIDTH - 8] ; - - assign cso = csdo[CSWIDTH - 9]; - - assign flo = csdo[13:0] ; - - assign csre = cachere ; - - always @(posedge clk) - begin : rireq_reg_proc - if (rst) - begin - rireq_r <= 1'b0 ; - end - else - begin - rireq_r <= rireq ; - end - end - - always @(posedge clk) - begin : irecack_reg_proc - if (rst) - begin - iriack <= 1'b0 ; - end - else - begin - iriack <= rireq_r ; - end - end - - assign riack = iriack ; - - always @(rad or fifore) - begin : rad_proc - if (fifore) - begin - rad_c <= rad + 1 ; - end - else - begin - rad_c <= rad ; - end - end - - always @(posedge clk) - begin : rad_reg_proc - if (rst) - begin - rad <= {FIFODEPTH{1'b0}} ; - end - else - begin - rad <= rad_c ; - end - end - - always @(posedge clk) - begin : radg_reg_proc - if (rst) - begin - radg <= {FIFODEPTH{1'b0}} ; - end - else - begin - radg[FIFODEPTH - 1] <= rad[FIFODEPTH - 1] ; - begin : radg_loop - integer i; - for(i = FIFODEPTH - 2; i >= 0; i = i - 1) - begin - radg[i] <= rad[i] ^ rad[i + 1] ; - end - end - end - end - - always @(posedge clk) - begin : wadg_reg_proc - if (rst) - begin - wadg_0_r <= {FIFODEPTH{1'b0}} ; - wadg_r <= {FIFODEPTH{1'b0}} ; - end - else - begin - wadg_0_r <= wadg; - wadg_r <= wadg_0_r; - end - end - - always @(wadg_r) - begin : wad_proc - reg[FIFODEPTH - 1:0] wad_v; - wad_v[FIFODEPTH - 1] = wadg_r[FIFODEPTH - 1]; - begin : wad_loop - integer i; - for(i = FIFODEPTH - 2; i >= 0; i = i - 1) - begin - wad_v[i] = wad_v[i + 1] ^ wadg_r[i]; - end - end - wad_c = wad_v ; - end - - always @(posedge clk) - begin : ad_reg_proc - if (rst) - begin - wad <= {FIFODEPTH{1'b0}} ; - end - else - begin - wad <= wad_c ; - end - end - - always @(posedge clk) - begin : stat_reg_proc - if (rst) - begin - stat <= {FIFODEPTH{1'b0}} ; - end - else - begin - stat <= wad - rad ; - end - end - - assign ramaddr = rad_c ; - - assign fifodata = ramdata ; - - - assign fzero = {FIFODEPTH{1'b0}}; - -endmodule - - - -module RLSM_V ( - clk, - rst, - fifodata, - fifore, - cachere, - dmaack, - dmaeob, - dmadatai, - dmaaddr, - dmareq, - dmawr, - dmacnt, - dmaaddro, - dmadatao, - rprog, - rcpoll, - fifocne, - ff, - rf, - mf, - db, - re, - ce, - tl, - ftp, - ov, - cs, - length, - pbl, - dsl, - rpoll, - rdbadc, - rdbad, - rpollack, - rcompack, - bufack, - des, - fbuf, - stat, - ru, - rcomp, - bufcomp, - stopi, - stopo - ); - - parameter DATAWIDTH = 32; - parameter DATADEPTH = 32; - parameter FIFODEPTH = 9; - - `include "utility.v" - - input clk; - input rst; - - input [DATAWIDTH - 1:0] fifodata; - output fifore; - wire fifore; - output cachere; - wire cachere; - - input dmaack; - input dmaeob; - input [DATAWIDTH - 1:0] dmadatai; - input [DATADEPTH - 1:0] dmaaddr; - output dmareq; - wire dmareq; - output dmawr; - wire dmawr; - output [FIFODEPTH_MAX - 1:0] dmacnt; - reg [FIFODEPTH_MAX - 1:0] dmacnt; - output [DATADEPTH - 1:0] dmaaddro; - reg [DATADEPTH - 1:0] dmaaddro; - output [DATAWIDTH - 1:0] dmadatao; - reg [DATAWIDTH - 1:0] dmadatao; - - input rprog; - input rcpoll; - input fifocne; - input ff; - input rf; - input mf; - input db; - input re; - input ce; - input tl; - input ftp; - input ov; - input cs; - input [13:0] length; - - input [5:0] pbl; - input [4:0] dsl; - input rpoll; - input rdbadc; - input [DATADEPTH - 1:0] rdbad; - output rpollack; - reg rpollack; - - input rcompack; - input bufack; - output des; - reg des; - output fbuf; - reg fbuf; - output stat; - reg stat; - output ru; - reg ru; - output rcomp; - reg rcomp; - output bufcomp; - reg bufcomp; - - input stopi; - output stopo; - reg stopo; - - - - reg [3:0] lsm_c; - reg [3:0] lsm; - reg [3:0] lsm_r; - reg own_c; - reg own; - reg rch; - reg rer; - reg rls; - reg rfs; - reg rde; - wire res_c; - reg [10:0] bs1; - reg [10:0] bs2; - - reg adwrite; - reg [DATADEPTH - 1:0] bad; - reg [DATADEPTH - 1:0] dad; - reg [10:0] bcnt; - reg [DATADEPTH - 1:0] statad; - reg [DATADEPTH - 1:0] tstatad; - reg dbadc_r; - - reg req_c; - reg req; - wire [2:0] dmaaddr20; - wire [1:0] addr10; - reg [DATADEPTH_MAX - 1:0] dataimax_r; - wire [31:0] fstat; - - reg rprog_r; - reg rcpoll_r; - reg rcpoll_r2; - reg whole; - - reg [13:0] fifolev_r; - reg [13:0] fbcnt; - reg [13:0] fbcnt_c; - reg [13:0] length_r; - wire ififore; - reg ififore_r; - reg icachere; - wire [FIFODEPTH_MAX - 1:0] bsmax; - wire [FIFODEPTH_MAX - 1:0] flmax; - wire [FIFODEPTH_MAX - 1:0] blmax; - reg fl_g_16; - reg fl_g_bs; - reg fl_g_bl; - reg bl_g_bs; - reg pblz; - - reg stop_r; - - wire [FIFODEPTH_MAX - 1:0] fzero_max; - wire [DATAWIDTH_MAX + 1:0] dmadatai_max; - wire [DATAWIDTH_MAX + 1:0] dzero_max; - - always @(posedge clk) - begin : dataimax_reg_proc - if (rst) - begin - dataimax_r <= {DATADEPTH_MAX{1'b1}} ; - end - else - begin - case (DATAWIDTH) - 8 : - begin - case (dmaaddr20) - 3'b000, 3'b100 : - begin - dataimax_r[7:0] <= dmadatai_max[DATAWIDTH-1:0] ; - end - 3'b001, 3'b101 : - begin - dataimax_r[15:8] <= dmadatai_max[DATAWIDTH-1:0] ; - end - 3'b010, 3'b110 : - begin - dataimax_r[23:16] <= dmadatai_max[DATAWIDTH-1:0] ; - end - default : - begin - dataimax_r[31:24] <= dmadatai_max[DATAWIDTH-1:0] ; - end - endcase - end - 16 : - begin - if (!(dmaaddr[1])) - begin - dataimax_r[15:0] <= dmadatai_max[DATAWIDTH-1:0] ; - end - else - begin - dataimax_r[31:16] <= dmadatai_max[DATAWIDTH-1:0] ; - end - end - default : - begin - dataimax_r <= dmadatai_max[31:0] ; - end - endcase - end - end - - always @(posedge clk) - begin : fifolev_reg_proc - if (rst) - begin - length_r <= {14{1'b0}} ; - fifolev_r <= {14{1'b0}} ; - fl_g_bs <= 1'b0 ; - fl_g_16 <= 1'b0 ; - fl_g_bl <= 1'b0 ; - bl_g_bs <= 1'b0 ; - pblz <= 1'b0 ; - end - else - begin - length_r <= length; - - fifolev_r <= length_r - fbcnt_c ; - - if (flmax >= bsmax) - begin - fl_g_bs <= 1'b1 ; - end - else - begin - fl_g_bs <= 1'b0 ; - end - - case (DATAWIDTH) - 8 : - begin - if (flmax > ({fzero_max[FIFODEPTH_MAX - 1:6], - 6'b111111})) - begin - fl_g_16 <= 1'b1 ; - end - else - begin - fl_g_16 <= 1'b0 ; - end - end - 16 : - begin - if (flmax > ({fzero_max[FIFODEPTH_MAX - 1:5], - 5'b11111})) - begin - fl_g_16 <= 1'b1 ; - end - else - begin - fl_g_16 <= 1'b0 ; - end - end - default : - begin - if (flmax > ({fzero_max[FIFODEPTH_MAX - 1:4], - 4'b1111})) - begin - fl_g_16 <= 1'b1 ; - end - else - begin - fl_g_16 <= 1'b0 ; - end - end - endcase - - if (flmax >= (blmax + 1'b1)) - begin - fl_g_bl <= 1'b1 ; - end - else - begin - fl_g_bl <= 1'b0 ; - end - - if (blmax >= bsmax) - begin - bl_g_bs <= 1'b1 ; - end - else - begin - bl_g_bs <= 1'b0 ; - end - - if (pbl == 6'b000000) - begin - pblz <= 1'b1 ; - end - else - begin - pblz <= 1'b0 ; - end - end - end - - assign flmax = (DATAWIDTH == 8) ? {fzero_max[FIFODEPTH_MAX - 1:14], - fifolev_r} : - (DATAWIDTH == 16) ? {fzero_max[FIFODEPTH_MAX - 1:13], - fifolev_r[13:1]} : - {fzero_max[FIFODEPTH_MAX - 1:12], - fifolev_r[13:2]} ; - - assign blmax = {fzero_max[FIFODEPTH_MAX - 1:6], pbl} ; - - assign bsmax = (DATAWIDTH == 8) ? {fzero_max[FIFODEPTH_MAX - 1:11], - bcnt} : - (DATAWIDTH == 16) ? {fzero_max[FIFODEPTH_MAX - 1:10], - bcnt[10:1]} : - {fzero_max[FIFODEPTH_MAX - 1:9], - bcnt[10:2]} ; - - always @(lsm or - fl_g_bs or - fl_g_bl or - bl_g_bs or - pblz or - blmax or - bsmax or - flmax or - fzero_max) - begin : dmacnt_proc - if (lsm == LSM_DES0 | - lsm == LSM_DES1 | - lsm == LSM_DES2 | - lsm == LSM_DES3 | - lsm == LSM_STAT | - lsm == LSM_FSTAT | - lsm == LSM_DES0P) - begin - case (DATAWIDTH) - 8 : - begin - dmacnt <= {fzero_max[FIFODEPTH_MAX - 1:3], 3'b100} ; - end - 16 : - begin - dmacnt <= {fzero_max[FIFODEPTH_MAX - 1:3], 3'b010} ; - end - default : - begin - dmacnt <= {fzero_max[FIFODEPTH_MAX - 1:3], 3'b001} ; - end - endcase - end - else - begin - if (pblz) - begin - if (fl_g_bs) - begin - dmacnt <= bsmax ; - end - else - begin - dmacnt <= flmax ; - end - end - else - begin - if (fl_g_bl) - begin - if (bl_g_bs) - begin - dmacnt <= bsmax ; - end - else - begin - dmacnt <= blmax ; - end - end - else - begin - if (fl_g_bs) - begin - dmacnt <= bsmax ; - end - else - begin - dmacnt <= flmax ; - end - end - end - end - end - - always @(req or - lsm or - lsm_c or - fifocne or - fl_g_bl or - fl_g_16 or - pblz or - whole or - rprog_r or - dmaack or - dmaeob or - flmax or - fzero_max) - begin : req_proc - case (lsm) - LSM_BUF1, LSM_BUF2 : - begin - if ((dmaack & dmaeob) | lsm_c==LSM_NXT) - begin - req_c <= 1'b0 ; - end - else if (fifocne | (rprog_r & ((fl_g_bl & !pblz) | - (fl_g_16 & pblz)))) - begin - req_c <= 1'b1 ; - end - else - begin - req_c <= req ; - end - end - LSM_DES0, LSM_DES1, LSM_DES2, - LSM_DES3, LSM_STAT, LSM_DES0P : - begin - if (dmaack) - begin - req_c <= 1'b0 ; - end - else - begin - req_c <= 1'b1 ; - end - end - LSM_FSTAT : - begin - if (dmaack | !whole | - (DATAWIDTH == 8 & flmax[1:0] != fzero_max[1:0]) - | - (DATAWIDTH == 16 & flmax[ 1] != fzero_max[1])) - begin - req_c <= 1'b0 ; - end - else - begin - req_c <= 1'b1 ; - end - end - default : - begin - req_c <= 1'b0 ; - end - endcase - end - - always @(posedge clk) - begin : req_reg_proc - if (rst) - begin - req <= 1'b0 ; - end - else - begin - req <= req_c ; - end - end - - always @(lsm or bad or dad or statad) - begin : dmaaddro_proc - case (lsm) - LSM_BUF1, LSM_BUF2 : - begin - dmaaddro <= bad ; - end - LSM_STAT, LSM_FSTAT : - begin - dmaaddro <= statad ; - end - default : - begin - dmaaddro <= dad ; - end - endcase - end - - assign fstat = {1'b0, ff, length, res_c, rde, - RDES0_RV[13:12], rf, mf, rfs, rls, tl, - cs, ftp, RDES0_RV[4], re, db, ce, ov} ; - - assign dmawr = (lsm == LSM_STAT | - lsm == LSM_FSTAT | - lsm == LSM_BUF1 | - lsm == LSM_BUF2) ? 1'b1 : 1'b0 ; - - always @(fifodata or lsm or addr10 or fstat) - begin : dmadatao_proc - if (lsm == LSM_BUF1 | lsm == LSM_BUF2) - begin - dmadatao <= fifodata ; - end - else - begin - case (DATAWIDTH) - 8 : - begin - case (addr10) - 2'b00 : - begin - dmadatao <= fstat[7:0] ; - end - 2'b01 : - begin - dmadatao <= fstat[15:8] ; - end - 2'b10 : - begin - dmadatao <= fstat[23:16] ; - end - default : - begin - dmadatao <= fstat[31:24] ; - end - endcase - end - 16 : - begin - if (addr10 == 2'b00) - begin - dmadatao <= fstat[15:0] ; - end - else - begin - dmadatao <= fstat[31:16] ; - end - end - default : - begin - dmadatao <= fstat ; - end - endcase - end - end - - assign dmareq = req ; - - always @(lsm or - rcpoll_r or - rcpoll_r2 or - rpoll or - dmaack or - dmaeob or - own_c or - bs1 or - bs2 or - whole or - rch or - stop_r or - own or - bcnt or - dbadc_r) - begin : lsm_proc - case (lsm) - LSM_IDLE : - begin - if (!dbadc_r & !stop_r & ((rcpoll_r & !rcpoll_r2) | rpoll)) - begin - lsm_c <= LSM_DES0 ; - end - else - begin - lsm_c <= LSM_IDLE ; - end - end - LSM_DES0 : - begin - if (dmaack & dmaeob) - begin - if (own_c) - begin - lsm_c <= LSM_DES1 ; - end - else - begin - lsm_c <= LSM_IDLE ; - end - end - else - begin - lsm_c <= LSM_DES0 ; - end - end - LSM_DES0P : - begin - if (dmaack & dmaeob) - begin - if (!own_c | whole) - begin - lsm_c <= LSM_FSTAT ; - end - else - begin - lsm_c <= LSM_STAT ; - end - end - else - begin - lsm_c <= LSM_DES0P ; - end - end - LSM_DES1 : - begin - if (dmaack & dmaeob) - begin - lsm_c <= LSM_DES2 ; - end - else - begin - lsm_c <= LSM_DES1 ; - end - end - LSM_DES2 : - begin - if (dmaack & dmaeob) - begin - if (bs1 == 11'b00000000000) - begin - lsm_c <= LSM_DES3 ; - end - else - begin - lsm_c <= LSM_BUF1 ; - end - end - else - begin - lsm_c <= LSM_DES2 ; - end - end - LSM_DES3 : - begin - if (dmaack & dmaeob) - begin - if (bs2 != 11'b00000000000 & !rch) - begin - lsm_c <= LSM_BUF2 ; - end - else - begin - lsm_c <= LSM_NXT ; - end - end - else - begin - lsm_c <= LSM_DES3 ; - end - end - LSM_BUF1 : - begin - if (whole | bcnt == 11'b00000000000) - begin - lsm_c <= LSM_DES3 ; - end - else if(dbadc_r) - begin - lsm_c <= LSM_IDLE ; - end - else - begin - lsm_c <= LSM_BUF1 ; - end - end - LSM_BUF2 : - begin - if (whole | bcnt == 11'b00000000000) - begin - lsm_c <= LSM_NXT ; - end - else if(dbadc_r) - begin - lsm_c <= LSM_IDLE ; - end - else - begin - lsm_c <= LSM_BUF2 ; - end - end - LSM_NXT : - begin - if (whole) - begin - if (stop_r) - begin - lsm_c <= LSM_FSTAT ; - end - else - begin - lsm_c <= LSM_DES0P ; - end - end - else - begin - lsm_c <= LSM_DES0P ; - end - end - LSM_STAT : - begin - if (dmaack & dmaeob) - begin - lsm_c <= LSM_DES1 ; - end - else - begin - lsm_c <= LSM_STAT ; - end - end - default : - begin - if (dmaack & dmaeob) - begin - if (own & !stop_r) - begin - lsm_c <= LSM_DES1 ; - end - else - begin - lsm_c <= LSM_IDLE ; - end - end - else - begin - lsm_c <= LSM_FSTAT ; - end - end - endcase - end - - always @(posedge clk) - begin : rlsm_reg_proc - if (rst) - begin - lsm <= LSM_IDLE ; - lsm_r <= LSM_IDLE ; - end - else - begin - lsm <= lsm_c ; - lsm_r <= lsm ; - end - end - - always @(posedge clk) - begin : rpollack_reg_proc - if (rst) - begin - rpollack <= 1'b0 ; - end - else - begin - if (rpoll & !dbadc_r) - begin - rpollack <= 1'b1 ; - end - else if (!rpoll) - begin - rpollack <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : bcnt_reg_proc - if (rst) - begin - bcnt <= {11{1'b1}} ; - end - else - begin - if (lsm == LSM_DES2) - begin - bcnt <= bs1 ; - end - else if (lsm == LSM_DES3) - begin - bcnt <= bs2 ; - end - else - begin - if (dmaack) - begin - case (DATAWIDTH) - 8 : - begin - bcnt <= bcnt - 1 ; - end - 16 : - begin - bcnt <= {(bcnt[10:1] - 1), 1'b0} ; - end - default : - begin - bcnt <= {(bcnt[10:2] - 1), 2'b00} ; - end - endcase - end - end - end - end - - always @(own or - dmaack or - dmaeob or - lsm or - dmadatai_max) - begin : own_proc - if (dmaack & dmaeob & (lsm == LSM_DES0 | lsm == LSM_DES0P)) - begin - own_c <= dmadatai_max[DATAWIDTH - 1] ; - end - else - begin - own_c <= own ; - end - end - - always @(posedge clk) - begin : des1_reg_proc - reg ft22; - if (rst) - begin - rer <= 1'b0 ; - rch <= 1'b0 ; - bs2 <= {11{1'b0}} ; - bs1 <= {11{1'b0}} ; - end - else - begin - if (lsm == LSM_DES1 & dmaack) - begin - case (DATAWIDTH) - 8 : - begin - case (dmaaddr20) - 3'b000, 3'b100 : - begin - bs1[7:0] <= dmadatai_max[7:0] ; - end - 3'b001, 3'b101 : - begin - bs1[10:8] <= dmadatai_max[2:0] ; - bs2[4:0] <= dmadatai_max[7:3] ; - end - 3'b010, 3'b110 : - begin - bs2[10:5] <= dmadatai_max[5:0] ; - end - default : - begin - rer <= dmadatai_max[1] ; - rch <= dmadatai_max[0] ; - end - endcase - end - 16 : - begin - case (dmaaddr20) - 3'b000, 3'b100 : - begin - bs1[10:0] <= dmadatai_max[10:0] ; - bs2[4:0] <= dmadatai_max[15:11] ; - end - default : - begin - bs2[10:5] <= dmadatai_max[5:0] ; - rer <= dmadatai_max[9] ; - rch <= dmadatai_max[8] ; - end - endcase - end - default : - begin - rer <= dmadatai_max[25] ; - rch <= dmadatai_max[24] ; - bs2 <= dmadatai_max[21:11] ; - bs1 <= dmadatai_max[10:0] ; - end - endcase - end - end - end - - always @(posedge clk) - begin : rdes_reg_proc - if (rst) - begin - own <= 1'b0 ; - rfs <= 1'b1 ; - rls <= 1'b0 ; - rde <= 1'b0 ; - end - else - begin - if (lsm == LSM_FSTAT & dmaack & dmaeob) - begin - rfs <= 1'b1 ; - end - else if (lsm == LSM_STAT & dmaack & dmaeob) - begin - rfs <= 1'b0 ; - end - - if (lsm == LSM_FSTAT) - begin - rls <= 1'b1 ; - end - else - begin - rls <= 1'b0 ; - end - - if (lsm == LSM_FSTAT & !whole) - begin - rde <= 1'b1 ; - end - else if (lsm == LSM_IDLE) - begin - rde <= 1'b0 ; - end - - own <= own_c ; - end - end - - assign res_c = rf | ce | rde | cs | tl ; - - always @(posedge clk) - begin : adwrite_reg_proc - if (rst) - begin - adwrite <= 1'b0 ; - dbadc_r <= 1'b0 ; - end - else - begin - if (dmaack & dmaeob) - begin - adwrite <= 1'b1 ; - end - else - begin - adwrite <= 1'b0 ; - end - - dbadc_r <= rdbadc ; - end - end - - always @(posedge clk) - begin : dad_reg_proc - if (rst) - begin - dad <= {DATADEPTH{1'b1}} ; - end - else - begin - if (dbadc_r) - begin - dad <= rdbad ; - end - else if (adwrite & lsm == LSM_NXT & rch) - begin - dad <= dataimax_r[DATADEPTH - 1:0] ; - end - else if (adwrite) - begin - case (lsm_r) - LSM_DES3 : - begin - if (rer) - begin - dad <= rdbad ; - end - else - begin - dad <= dmaaddr + ({dsl, 2'b00}) ; - end - end - LSM_DES0, LSM_DES0P : - begin - if (own) - begin - dad <= dmaaddr ; - end - end - LSM_DES2 : - begin - dad <= dmaaddr ; - end - LSM_DES1 : - begin - dad <= dmaaddr ; - end - LSM_FSTAT : - begin - dad <= (lsm == LSM_IDLE) ? rdbad : dad; - end - default : - begin - dad <= dad ; - end - endcase - end - end - end - - always @(posedge clk) - begin : bad_reg_proc - if (rst) - begin - bad <= {DATADEPTH{1'b1}} ; - end - else - begin - if (adwrite) - begin - if (lsm_r == LSM_BUF1 | lsm_r == LSM_BUF2) - begin - bad <= dmaaddr ; - end - else - begin - bad <= dataimax_r[DATADEPTH - 1:0] ; - end - end - end - end - - always @(posedge clk) - begin : stataddr_reg_proc - if (rst) - begin - tstatad <= {DATADEPTH{1'b1}} ; - statad <= {DATADEPTH{1'b1}} ; - end - else - begin - if (lsm == LSM_DES1 & adwrite) - begin - statad <= tstatad ; - end - - if ((lsm == LSM_DES0 | lsm == LSM_DES0P) & dmaack & dmaeob) - begin - tstatad <= dad ; - end - end - end - - always @(fbcnt or icachere or ififore) - begin : fbcnt_proc - if (icachere) - begin - fbcnt_c <= {14{1'b0}} ; - end - else - begin - if (ififore) - begin - case (DATAWIDTH) - 8 : - begin - fbcnt_c <= fbcnt + 1 ; - end - 16 : - begin - fbcnt_c <= fbcnt + 2'b10 ; - end - default : - begin - fbcnt_c <= fbcnt + 3'b100 ; - end - endcase - end - else - begin - fbcnt_c <= fbcnt; - end - end - end - - always @(posedge clk) - begin : fbcnt_reg_proc - if(rst) - begin - fbcnt <= {14{1'b0}}; - end - else - begin - fbcnt <= fbcnt_c; - end - end - - always @(fbcnt or length or fifocne) - begin : whole_proc - if (fbcnt >= length & fifocne) - begin - whole <= 1'b1 ; - end - else - begin - whole <= 1'b0 ; - end - end - - assign ififore = (((lsm == LSM_BUF1 | lsm == LSM_BUF2) & dmaack) | - (lsm == LSM_FSTAT & !whole & - flmax != fzero_max[14:0] & !ififore_r) | - (lsm == LSM_FSTAT & !whole & - fifocne & !ififore_r)) ? 1'b1 : 1'b0 ; - - always @(posedge clk) - begin : ififore_reg_proc - if (rst) - begin - ififore_r <= 1'b0 ; - icachere <= 1'b0 ; - end - else - begin - ififore_r <= ififore ; - - if (lsm == LSM_FSTAT & dmaack & dmaeob) - begin - icachere <= 1'b1 ; - end - else - begin - icachere <= 1'b0 ; - end - end - end - - assign fifore = ififore ; - - assign cachere = icachere ; - - always @(posedge clk) - begin : rprog_reg_proc - if (rst) - begin - rprog_r <= 1'b0 ; - rcpoll_r <= 1'b0 ; - rcpoll_r2 <= 1'b0 ; - end - else - begin - rprog_r <= rprog ; - rcpoll_r <= rcpoll ; - if (lsm == LSM_IDLE) - begin - rcpoll_r2 <= rcpoll_r ; - end - end - end - - always @(posedge clk) - begin : stat_reg_drv - if (rst) - begin - des <= 1'b0 ; - fbuf <= 1'b0 ; - stat <= 1'b0 ; - rcomp <= 1'b0 ; - bufcomp <= 1'b0 ; - ru <= 1'b0 ; - end - else - begin - if (lsm == LSM_DES0 | - lsm == LSM_DES1 | - lsm == LSM_DES2 | - lsm == LSM_DES3 | - lsm == LSM_DES0P) - begin - des <= 1'b1 ; - end - else - begin - des <= 1'b0 ; - end - - if ((lsm == LSM_BUF1 | lsm == LSM_BUF2) & req) - begin - fbuf <= 1'b1 ; - end - else - begin - fbuf <= 1'b0 ; - end - - if (lsm == LSM_STAT | lsm == LSM_FSTAT) - begin - stat <= 1'b1 ; - end - else - begin - stat <= 1'b0 ; - end - - if (lsm == LSM_FSTAT & dmaack & dmaeob) - begin - rcomp <= 1'b1 ; - end - else if (rcompack) - begin - rcomp <= 1'b0 ; - end - - if (lsm == LSM_STAT & dmaack & dmaeob) - begin - bufcomp <= 1'b1 ; - end - else if (bufack) - begin - bufcomp <= 1'b0 ; - end - - if (own & !own_c) - begin - ru <= 1'b1 ; - end - else if (own) - begin - ru <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : stop_reg_proc - if (rst) - begin - stop_r <= 1'b1 ; - stopo <= 1'b1 ; - end - else - begin - stop_r <= stopi ; - - if (stop_r & (lsm == LSM_IDLE | - ((lsm == LSM_BUF1 | lsm == LSM_BUF2) & - !fifocne & !rprog_r))) - begin - stopo <= 1'b1 ; - end - else - begin - stopo <= 1'b0 ; - end - end - end - - assign dzero_max = {DATAWIDTH_MAX{1'b0}} ; - - assign fzero_max = {FIFODEPTH_MAX{1'b0}} ; - - assign dmadatai_max = {dzero_max[DATAWIDTH_MAX+1:DATAWIDTH], - dmadatai}; - - assign dmaaddr20 = dmaaddr[2:0] ; - - assign addr10 = dmaaddr[1:0] ; - -endmodule - - - -module RSTC_V ( - clkdma, - clkcsr, - clkt, - clkr, - rstcsr, - rstsoft, - rsttc, - rstrc, - rstdmao, - rstcsro - ); - - input clkdma; - input clkcsr; - input clkt; - input clkr; - - input rstcsr; - input rstsoft; - output rsttc; - reg rsttc; - output rstrc; - reg rstrc; - output rstdmao; - reg rstdmao; - output rstcsro; - reg rstcsro; - - - reg rstsoft_rc1; - reg rstsoft_rc2; - reg rstsoft_rc3; - reg rstsoft_tc1; - reg rstsoft_tc2; - reg rstsoft_tc3; - reg rstsoft_dma1; - reg rstsoft_dma2; - reg rstsoft_dma3; - reg rstsoft_csr; - reg rstsoft_dma_csr1; - reg rstsoft_dma_csr2; - reg rstsoft_rc_csr1; - reg rstsoft_rc_csr2; - reg rstsoft_tc_csr1; - reg rstsoft_tc_csr2; - reg rstcsr_r1; - reg rstcsr_r2; - reg rstcsr_tc1; - reg rstcsr_tc2; - reg rstcsr_rc1; - reg rstcsr_rc2; - reg rstcsr_dma1; - reg rstcsr_dma2; - - - always @(posedge clkcsr) - begin : rstsoft_csr_reg_proc - if (rstcsr_r2) - begin - rstsoft_csr <= 1'b0 ; - rstsoft_dma_csr1 <= 1'b0 ; - rstsoft_dma_csr2 <= 1'b0 ; - rstsoft_tc_csr1 <= 1'b0 ; - rstsoft_tc_csr2 <= 1'b0 ; - rstsoft_rc_csr1 <= 1'b0 ; - rstsoft_rc_csr2 <= 1'b0 ; - end - else - begin - if (rstsoft) - begin - rstsoft_csr <= 1'b1 ; - end - else if (rstsoft_rc_csr2 & rstsoft_tc_csr2 & rstsoft_dma_csr2) - begin - rstsoft_csr <= 1'b0 ; - end - rstsoft_dma_csr1 <= rstsoft_dma3; - rstsoft_dma_csr2 <= rstsoft_dma_csr1; - rstsoft_tc_csr1 <= rstsoft_tc3; - rstsoft_tc_csr2 <= rstsoft_tc_csr1; - rstsoft_rc_csr1 <= rstsoft_rc3; - rstsoft_rc_csr2 <= rstsoft_rc_csr1; - end - end - - always @(posedge clkcsr) - begin : rstcsro_reg_proc - rstcsr_r1 <= rstcsr; - rstcsr_r2 <= rstcsr_r1; - rstcsro <= rstcsr_r2 | rstsoft_csr; - end - - always @(posedge clkr) - begin : rstrc_reg_proc - rstcsr_rc1 <= rstcsr; - rstcsr_rc2 <= rstcsr_rc1; - rstsoft_rc1 <= rstsoft_csr; - rstsoft_rc2 <= rstsoft_rc1; - rstsoft_rc3 <= rstsoft_rc2; - rstrc <= rstcsr_rc2 | rstsoft_rc2; - end - - always @(posedge clkt) - begin : rsttc_proc - rstcsr_tc1 <= rstcsr; - rstcsr_tc2 <= rstcsr_tc1; - rstsoft_tc1 <= rstsoft_csr; - rstsoft_tc2 <= rstsoft_tc1; - rstsoft_tc3 <= rstsoft_tc2; - rsttc <= rstcsr_tc2 | rstsoft_tc2; - end - - always @(posedge clkdma) - begin : rstdma_reg_proc - rstcsr_dma1 <= rstcsr; - rstcsr_dma2 <= rstcsr_dma1; - rstsoft_dma1 <= rstsoft_csr; - rstsoft_dma2 <= rstsoft_dma1; - rstsoft_dma3 <= rstsoft_dma2; - rstdmao <= rstcsr_dma2 | rstsoft_dma2; - end - -endmodule - -module TC_V ( - clk, - rst, - txen, - txer, - txd, - ramdata, - ramaddr, - wadg, - radg, - dpd, - ac, - sofreq, - eofreq, - tiack, - lastbe, - eofadg, - tireq, - ur, - de, - coll, - carrier, - bkoff, - tpend, - tprog, - preamble, - stopi, - stopo, - tcsack, - tcsreq - ); - - parameter FIFODEPTH = 9; - parameter DATAWIDTH = 32; - - `include "utility.v" - - input clk; - input rst; - - output txen; - reg txen; - output txer; - wire txer; - output [MIIWIDTH - 1:0] txd; - reg [MIIWIDTH - 1:0] txd; - - input [DATAWIDTH - 1:0] ramdata; - output [FIFODEPTH - 1:0] ramaddr; - wire [FIFODEPTH - 1:0] ramaddr; - - input [FIFODEPTH - 1:0] wadg; - output [FIFODEPTH - 1:0] radg; - wire [FIFODEPTH - 1:0] radg; - - input dpd; - input ac; - input sofreq; - input eofreq; - input tiack; - input [DATAWIDTH / 8 - 1:0] lastbe; - input [FIFODEPTH - 1:0] eofadg; - output tireq; - reg tireq; - output ur; - wire ur; - output de; - reg de; - - input coll; - input carrier; - input bkoff; - output tpend; - wire tpend; - output tprog; - reg tprog; - output preamble; - reg preamble; - - input stopi; - output stopo; - reg stopo; - - input tcsack; - output tcsreq; - reg tcsreq; - - - reg re_c; - reg re; - reg empty_c; - reg empty; - reg [FIFODEPTH - 1:0] rad_r; - reg [FIFODEPTH - 1:0] rad; - reg [FIFODEPTH - 1:0] iradg; - reg [FIFODEPTH - 1:0] wadg_0_r; - reg [FIFODEPTH - 1:0] iwadg; - reg [FIFODEPTH - 1:0] iwad_c; - reg [FIFODEPTH - 1:0] iwad; - reg [FIFODEPTH - 1:0] sofad; - reg [FIFODEPTH - 1:0] eofadg_r; - reg sofreq_r; - reg eofreq_r; - reg whole; - reg eof; - reg [DATAWIDTH - 1:0] ramdata_r; - - reg [MIIWIDTH - 1:0] itxd0; - reg [DATAWIDTH - 1:0] pmux; - reg [DATAWIDTH - 1:0] datamux_c; - wire [DATAWIDTH_MAX + 1:0] datamux_c_max; - reg txen1; - reg txen_rise; - reg [MIIWIDTH - 1:0] txd_rise; - - reg [3:0] tsm_c; - reg [3:0] tsm; - reg nset; - reg [3:0] ncnt; - wire [1:0] ncnt10; - wire [2:0] ncnt20; - reg [6:0] brel; - reg bset; - reg [6:0] bcnt; - reg bz; - reg nopad; - reg crcgen; - reg crcsend; - reg [31:0] crc_c; - reg [31:0] crc; - reg [31:0] crcneg_c; - reg itprog; - reg itpend; - reg iur; - reg iti; - reg tiack_r; - reg [3:0] ifscnt; - - reg tcsack_r; - reg [7:0] tcscnt; - reg tcs; - - reg ifs1p; - reg ifs2p; - wire defer; - - reg bkoff_r; - - reg stop_r; - wire [3:0] hnibble; - wire [MIIWIDTH_MAX + 1:0] itxd0_max; - wire [MIIWIDTH_MAX + 1:0] itxd0zero_max; - wire [DATAWIDTH_MAX + 1:0] dzero_max; - - always @(posedge clk) - begin : faddr_reg_proc - if (rst) - begin - rad <= {FIFODEPTH{1'b0}} ; - rad_r <= {FIFODEPTH{1'b0}} ; - iradg <= {FIFODEPTH{1'b0}} ; - sofad <= {FIFODEPTH{1'b0}} ; - eofadg_r <= {FIFODEPTH{1'b0}} ; - iwad <= {FIFODEPTH{1'b0}} ; - wadg_0_r <= {FIFODEPTH{1'b0}} ; - iwadg <= {FIFODEPTH{1'b0}} ; - end - else - begin - if (bkoff_r) - begin - rad <= sofad ; - end - else if (re_c) - begin - rad <= rad + 1 ; - end - else if (eof & tsm == TSM_FLUSH) - begin - rad <= iwad ; - end - - rad_r <= rad ; - - iradg <= rad ^ {1'b0, rad[FIFODEPTH - 1:1]} ; - - if (tsm == TSM_IDLE_TCSMT) - begin - sofad <= rad_r ; - end - - eofadg_r <= eofadg ; - - iwad <= iwad_c ; - - wadg_0_r <= wadg; - if (eofreq_r) - begin - iwadg <= eofadg_r ; - end - else - begin - iwadg <= wadg_0_r ; - end - end - end - - always @(iwadg) - begin : iwad_proc - reg[FIFODEPTH - 1:0] wad_v; - wad_v[FIFODEPTH - 1] = iwadg[FIFODEPTH - 1]; - begin : iwad_loop - integer i; - for(i = FIFODEPTH - 2; i >= 0; i = i - 1) - begin - wad_v[i] = wad_v[i + 1] ^ iwadg[i]; - end - end - iwad_c = wad_v ; - end - - always @(rad or iwad) - begin : empty_proc - if (rad == iwad) - begin - empty_c <= 1'b1 ; - end - else - begin - empty_c <= 1'b0 ; - end - end - - always @(posedge clk) - begin : empty_reg_proc - if (rst) - begin - empty <= 1'b1 ; - end - else - begin - empty <= empty_c ; - end - end - - always @(tsm or empty_c or ncnt) - begin : re_proc - if ((tsm == TSM_INFO | - tsm == TSM_SFD | - tsm == TSM_FLUSH) & !empty_c & - ((DATAWIDTH == 8 & !(ncnt[0])) | - (DATAWIDTH == 16 & ncnt[1:0] == 2'b10) | - (DATAWIDTH == 32 & ncnt[2:0] == 3'b110))) - begin - re_c <= 1'b1 ; - end - else - begin - re_c <= 1'b0 ; - end - end - - always @(posedge clk) - begin : re_reg_proc - if (rst) - begin - re <= 1'b0 ; - end - else - begin - re <= re_c ; - end - end - - assign ramaddr = rad ; - - assign radg = iradg ; - - always @(posedge clk) - begin : whole_reg_proc - if (rst) - begin - whole <= 1'b0 ; - end - else - begin - if (iti) - begin - whole <= 1'b0 ; - end - else if (eofreq_r) - begin - whole <= 1'b1 ; - end - end - end - - always @(posedge clk) - begin : se_reg_proc - if (rst) - begin - sofreq_r <= 1'b0 ; - eofreq_r <= 1'b0 ; - end - else - begin - sofreq_r <= sofreq ; - eofreq_r <= eofreq ; - end - end - - always @(tsm or - itpend or - bkoff_r or - defer or bz or - ncnt or dpd or - iur or - hnibble or - ac or - empty or - whole or - tiack_r or - nopad or - coll or - eof) - begin : tsm_proc - case (tsm) - TSM_IDLE_TCSMT : - begin - if (itpend & !bkoff_r & !defer) - begin - tsm_c <= TSM_PREA ; - end - else - begin - tsm_c <= TSM_IDLE_TCSMT ; - end - end - TSM_PREA : - begin - if (bz & (ncnt[0])) - begin - tsm_c <= TSM_SFD ; - end - else - begin - tsm_c <= TSM_PREA ; - end - end - TSM_SFD : - begin - if (bz & (ncnt[0])) - begin - tsm_c <= TSM_INFO ; - end - else - begin - tsm_c <= TSM_SFD ; - end - end - TSM_INFO : - begin - if (coll) - begin - tsm_c <= TSM_JAM ; - end - else if (empty) - begin - if (!whole & ncnt == hnibble) - begin - tsm_c <= TSM_JAM ; - end - else if (eof & (nopad | dpd)) - begin - if (ac) - begin - tsm_c <= TSM_INT ; - end - else - begin - tsm_c <= TSM_CRC ; - end - end - else if (eof) - begin - tsm_c <= TSM_PAD ; - end - else - begin - tsm_c <= TSM_INFO ; - end - end - else - begin - tsm_c <= TSM_INFO ; - end - end - TSM_PAD : - begin - if (coll) - begin - tsm_c <= TSM_JAM ; - end - else if (nopad & (ncnt[0])) - begin - tsm_c <= TSM_CRC ; - end - else - begin - tsm_c <= TSM_PAD ; - end - end - TSM_CRC : - begin - if (coll) - begin - tsm_c <= TSM_JAM ; - end - else if (bz & (ncnt[0])) - begin - tsm_c <= TSM_INT ; - end - else - begin - tsm_c <= TSM_CRC ; - end - end - TSM_JAM : - begin - if (bz & (ncnt[0])) - begin - if (!bkoff_r | iur) - begin - tsm_c <= TSM_FLUSH ; - end - else - begin - tsm_c <= TSM_IDLE_TCSMT ; - end - end - else - begin - tsm_c <= TSM_JAM ; - end - end - TSM_FLUSH : - begin - if (whole & empty) - begin - tsm_c <= TSM_INT ; - end - else - begin - tsm_c <= TSM_FLUSH ; - end - end - default : - begin - if (tiack_r) - begin - tsm_c <= TSM_IDLE_TCSMT ; - end - else - begin - tsm_c <= TSM_INT ; - end - end - endcase - end - - always @(posedge clk) - begin : tsm_reg_proc - if (rst) - begin - tsm <= TSM_IDLE_TCSMT ; - end - else - begin - tsm <= tsm_c ; - end - end - - assign defer = ifs1p | ifs2p ; - - always @(posedge clk) - begin : ifs_reg_proc - if (rst) - begin - ifs1p <= 1'b0 ; - ifs2p <= 1'b0 ; - ifscnt <= IFS1_TIME ; - end - else - begin - if (!itprog & !ifs1p & !ifs2p & ifscnt != 4'b0000) - begin - ifs1p <= 1'b1 ; - end - else if (ifscnt == 4'b0000 | ifs2p) - begin - ifs1p <= 1'b0 ; - end - - if (ifs1p & ifscnt == 4'b0000) - begin - ifs2p <= 1'b1 ; - end - else if (ifs2p & ifscnt == 4'b0000) - begin - ifs2p <= 1'b0 ; - end - - if (itprog | - (carrier & ifs1p) | - (carrier & ifscnt == 4'b0000 & !itpend) | - (carrier & ifscnt == 4'b0000 & bkoff_r)) - begin - ifscnt <= IFS1_TIME ; - end - else if (ifs1p & ifscnt == 4'b0000) - begin - ifscnt <= IFS2_TIME ; - end - else if (ifscnt != 4'b0000) - begin - ifscnt <= ifscnt - 1 ; - end - end - end - - always @(posedge clk) - begin : de_reg_proc - if (rst) - begin - de <= 1'b0 ; - end - else - begin - if (ifs1p & itpend & carrier & tsm == TSM_IDLE_TCSMT) - begin - de <= 1'b1 ; - end - else if (tiack_r) - begin - de <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : eof_reg_proc - if (rst) - begin - eof <= 1'b0 ; - end - else - begin - case (DATAWIDTH) - 8 : - begin - if (whole & !(ncnt[0])) - begin - eof <= 1'b1 ; - end - else - begin - eof <= 1'b0 ; - end - end - 16 : - begin - if (whole & ((lastbe == 2'b11 & ncnt[1:0] == 2'b10) | - (lastbe == 2'b01 & ncnt[1:0] == 2'b00))) - begin - eof <= 1'b1 ; - end - else - begin - eof <= 1'b0 ; - end - end - default : - begin - if (whole & ((lastbe == 4'b1111 & ncnt[2:0] == 3'b110) | - (lastbe == 4'b0111 & ncnt[2:0] == 3'b100) | - (lastbe == 4'b0011 & ncnt[2:0] == 3'b010) | - (lastbe == 4'b0001 & ncnt[2:0] == 3'b000))) - begin - eof <= 1'b1 ; - end - else - begin - eof <= 1'b0 ; - end - end - endcase - end - end - - always @(coll or tsm or ncnt or bz or empty or eof or nopad) - begin : bset_reg_proc - if ((coll & (tsm == TSM_INFO | - tsm == TSM_PAD | - tsm == TSM_CRC)) | - (tsm == TSM_PAD & nopad & !(ncnt[0])) | - (tsm == TSM_PREA & bz & !(ncnt[0])) | - (tsm == TSM_SFD & (ncnt[0])) | - (tsm == TSM_INFO & empty & eof & nopad) | - (tsm == TSM_IDLE_TCSMT)) - begin - bset <= 1'b1 ; - end - else - begin - bset <= 1'b0 ; - end - end - - always @(posedge clk) - begin : bcnt_reg_proc - if (rst) - begin - bcnt <= {7{1'b1}} ; - brel <= 7'b0000110 ; - bz <= 1'b0 ; - end - else - begin - if (bset) - begin - if(coll & tsm==TSM_INFO) - begin - bcnt <= 7'b0000011; - end - else - begin - bcnt <= brel ; - end - end - else if ((ncnt[0]) & !bz) - begin - bcnt <= bcnt - 1 ; - end - - case (tsm) - TSM_IDLE_TCSMT : - begin - brel <= 7'b0000110 ; - end - TSM_PREA : - begin - brel <= 7'b0000000 ; - end - TSM_SFD : - begin - if (coll) - begin - brel <= 7'b0000011 ; - end - else - begin - brel <= MIN_FRAME - 1 ; - end - end - default : - begin - brel <= 7'b0000011 ; - end - endcase - - if (bset & brel != 7'b0000000) - begin - bz <= 1'b0 ; - end - else if (bcnt == 7'b0000001 & (ncnt[0]) & !bz) - begin - bz <= 1'b1 ; - end - end - end - - always @(posedge clk) - begin : nopad_reg_proc - if (rst) - begin - nopad <= 1'b0 ; - end - else - begin - if ((tsm == TSM_INFO & bcnt == 7'b0000100 & !ac) | - (tsm == TSM_INFO & bcnt == 7'b0000001 & ac) | - (tsm == TSM_PAD & bcnt == 7'b0000100) | (dpd & !ac)) - begin - nopad <= 1'b1 ; - end - else if (tsm == TSM_IDLE_TCSMT) - begin - nopad <= 1'b0 ; - end - end - end - - always @(tsm or - itpend or - bkoff_r or - defer or - ncnt or - eof or - empty or - nopad) - begin : nset_proc - if ((tsm == TSM_IDLE_TCSMT & ~(itpend & !bkoff_r & !defer)) | - (tsm == TSM_INFO & empty & eof) | - (tsm == TSM_PAD & nopad & (ncnt[0]))) - begin - nset <= 1'b1 ; - end - else - begin - nset <= 1'b0 ; - end - end - - always @(posedge clk) - begin : ncnt_reg_proc - if (rst) - begin - ncnt <= {4{1'b0}} ; - end - else - begin - if (nset) - begin - ncnt <= {4{1'b0}} ; - end - else if (tsm != TSM_IDLE_TCSMT) - begin - ncnt <= ncnt + 1 ; - end - end - end - - always @(tsm or crc or itxd0_max or crcgen) - begin : crc_proc - if (tsm == TSM_PREA) - begin - crc_c <= {32{1'b1}} ; - end - else if (crcgen) - begin - crc_c[0] <= crc[28] ^ - itxd0_max[3] ; - crc_c[1] <= crc[28] ^ crc[29] ^ - itxd0_max[2] ^ itxd0_max[3] ; - crc_c[2] <= crc[28] ^ crc[29] ^ crc[30] ^ - itxd0_max[1] ^ itxd0_max[2] ^ itxd0_max[3] ; - crc_c[3] <= crc[29] ^ crc[30] ^ crc[31] ^ - itxd0_max[0] ^ itxd0_max[1] ^ itxd0_max[2] ; - crc_c[4] <= crc[0] ^ crc[28] ^ crc[30] ^ crc[31] ^ - itxd0_max[0] ^ itxd0_max[1] ^ itxd0_max[3] ; - crc_c[5] <= crc[1] ^ crc[28] ^ crc[29] ^ crc[31] ^ - itxd0_max[0] ^ itxd0_max[2] ^ itxd0_max[3] ; - crc_c[6] <= crc[2] ^ crc[29] ^ crc[30] ^ - itxd0_max[1] ^ itxd0_max[2] ; - crc_c[7] <= crc[3] ^ crc[28] ^ crc[30] ^ crc[31] ^ - itxd0_max[0] ^ itxd0_max[1] ^ itxd0_max[3] ; - crc_c[8] <= crc[4] ^ crc[28] ^ crc[29] ^ crc[31] ^ - itxd0_max[0] ^ itxd0_max[2] ^ itxd0_max[3] ; - crc_c[9] <= crc[5] ^ crc[29] ^ crc[30] ^ - itxd0_max[1] ^ itxd0_max[2] ; - crc_c[10] <= crc[6] ^ crc[28] ^ crc[30] ^ crc[31] ^ - itxd0_max[0] ^ itxd0_max[1] ^ itxd0_max[3] ; - crc_c[11] <= crc[7] ^ crc[28] ^ crc[29] ^ crc[31] ^ - itxd0_max[0] ^ itxd0_max[2] ^ itxd0_max[3] ; - crc_c[12] <= crc[8] ^ crc[28] ^ crc[29] ^ crc[30] ^ - itxd0_max[1] ^ itxd0_max[2] ^ itxd0_max[3] ; - crc_c[13] <= crc[9] ^ crc[29] ^ crc[30] ^ crc[31] ^ - itxd0_max[0] ^ itxd0_max[1] ^ itxd0_max[2] ; - crc_c[14] <= crc[10] ^ crc[30] ^ crc[31] ^ - itxd0_max[0] ^ itxd0_max[1] ; - crc_c[15] <= crc[11] ^ crc[31] ^ - itxd0_max[0] ; - crc_c[16] <= crc[12] ^ crc[28] ^ - itxd0_max[3] ; - crc_c[17] <= crc[13] ^ crc[29] ^ - itxd0_max[2] ; - crc_c[18] <= crc[14] ^ crc[30] ^ - itxd0_max[1] ; - crc_c[19] <= crc[15] ^ crc[31] ^ - itxd0_max[0] ; - crc_c[20] <= crc[16] ; - crc_c[21] <= crc[17] ; - crc_c[22] <= crc[18] ^ crc[28] ^ - itxd0_max[3] ; - crc_c[23] <= crc[19] ^ crc[28] ^ crc[29] ^ - itxd0_max[2] ^ itxd0_max[3] ; - crc_c[24] <= crc[20] ^ crc[29] ^ crc[30] ^ - itxd0_max[1] ^ itxd0_max[2] ; - crc_c[25] <= crc[21] ^ crc[30] ^ crc[31] ^ - itxd0_max[0] ^ itxd0_max[1] ; - crc_c[26] <= crc[22] ^ crc[28] ^ crc[31] ^ - itxd0_max[0] ^ itxd0_max[3] ; - crc_c[27] <= crc[23] ^ crc[29] ^ - itxd0_max[2] ; - crc_c[28] <= crc[24] ^ crc[30] ^ - itxd0_max[1] ; - crc_c[29] <= crc[25] ^ crc[31] ^ - itxd0_max[0] ; - crc_c[30] <= crc[26] ; - crc_c[31] <= crc[27] ; - end - else - begin - crc_c <= crc ; - end - end - - always @(posedge clk) - begin : crc_reg_proc - if (rst) - begin - crcgen <= 1'b0 ; - crcsend <= 1'b0 ; - crc <= {32{1'b1}} ; - end - else - begin - crc <= crc_c ; - - if (tsm == TSM_INFO | tsm == TSM_PAD) - begin - crcgen <= 1'b1 ; - end - else - begin - crcgen <= 1'b0 ; - end - - if (tsm == TSM_CRC) - begin - crcsend <= 1'b1 ; - end - else - begin - crcsend <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : tstate_reg_proc - if (rst) - begin - itprog <= 1'b0 ; - itpend <= 1'b0 ; - tprog <= 1'b0 ; - preamble <= 1'b0 ; - end - else - begin - if (tsm == TSM_INFO | tsm == TSM_PAD | tsm == TSM_CRC | - tsm == TSM_JAM) - begin - itprog <= 1'b1 ; - end - else - begin - itprog <= 1'b0 ; - end - - if (sofreq_r) - begin - itpend <= 1'b1 ; - end - else - begin - itpend <= 1'b0 ; - end - - if (tsm == TSM_PREA | - tsm == TSM_SFD | - tsm == TSM_INFO | - tsm == TSM_PAD | - tsm == TSM_CRC | - tsm == TSM_JAM) - begin - tprog <= 1'b1 ; - end - else - begin - tprog <= 1'b0 ; - end - - if (tsm == TSM_PREA | tsm == TSM_SFD) - begin - preamble <= 1'b1 ; - end - else - begin - preamble <= 1'b0 ; - end - end - end - - assign tpend = itpend ; - - always @(posedge clk) - begin : iti_reg_proc - if (rst) - begin - iti <= 1'b0 ; - tireq <= 1'b0 ; - tiack_r <= 1'b0 ; - end - else - begin - if (tsm == TSM_INT) - begin - iti <= 1'b1 ; - end - else if (tiack) - begin - iti <= 1'b0 ; - end - - tireq <= iti ; - tiack_r <= tiack ; - end - end - - always @(posedge clk) - begin : iur_reg_proc - if (rst) - begin - iur <= 1'b0 ; - end - else - begin - if (itprog & empty & !whole) - begin - iur <= 1'b1 ; - end - else if (tiack_r) - begin - iur <= 1'b0 ; - end - end - end - - assign ur = iur ; - - always @(tsm or ramdata_r or pmux) - begin : datamux_proc - if (tsm == TSM_INFO) - begin - datamux_c <= ramdata_r ; - end - else - begin - datamux_c <= pmux ; - end - end - - assign ncnt10 = ncnt[1:0] ; - - assign ncnt20 = ncnt[2:0] ; - - assign datamux_c_max = {dzero_max[DATAWIDTH_MAX + 1:DATAWIDTH], - datamux_c}; - - always @(crc) - begin : crcneg_proc - begin : crcneg_loop - integer i; - for(i = 31; i >= 0; i = i - 1) - begin - crcneg_c[i] <= ~crc[31 - i] ; - end - end - end - - always @(posedge clk) - begin : txd_proc - if (rst) - begin - txd_rise <= {MIIWIDTH{1'b1}} ; - pmux <= {DATAWIDTH{1'b1}} ; - itxd0 <= {MIIWIDTH{1'b1}} ; - ramdata_r <= {DATAWIDTH{1'b0}} ; - end - else - begin - case (tsm_c) - TSM_PAD : - begin - pmux <= PAD_PATTERN[63:64 - DATAWIDTH] ; - end - TSM_JAM : - begin - pmux <= JAM_PATTERN[63:64 - DATAWIDTH] ; - end - TSM_PREA : - begin - pmux <= PRE_PATTERN[63:64 - DATAWIDTH] ; - end - TSM_SFD : - begin - pmux <= SFD_PATTERN[63:64 - DATAWIDTH] ; - end - default : - begin - pmux <= {DATAWIDTH{1'b1}} ; - end - endcase - - case (DATAWIDTH) - 32 : - begin - case (ncnt20) - 3'b000 : - begin - itxd0 <= datamux_c_max[3:0] ; - end - 3'b001 : - begin - itxd0 <= datamux_c_max[7:4] ; - end - 3'b010 : - begin - itxd0 <= datamux_c_max[11:8] ; - end - 3'b011 : - begin - itxd0 <= datamux_c_max[15:12] ; - end - 3'b100 : - begin - itxd0 <= datamux_c_max[19:16] ; - end - 3'b101 : - begin - itxd0 <= datamux_c_max[23:20] ; - end - 3'b110 : - begin - itxd0 <= datamux_c_max[27:24] ; - end - default : - begin - itxd0 <= datamux_c_max[31:28] ; - end - endcase - end - 16 : - begin - case (ncnt10) - 2'b00 : - begin - itxd0 <= datamux_c_max[3:0] ; - end - 2'b01 : - begin - itxd0 <= datamux_c_max[7:4] ; - end - 2'b10 : - begin - itxd0 <= datamux_c_max[11:8] ; - end - default : - begin - itxd0 <= datamux_c_max[15:12] ; - end - endcase - end - default : - begin - if (!(ncnt[0])) - begin - itxd0 <= datamux_c_max[3:0] ; - end - else - begin - itxd0 <= datamux_c_max[7:4] ; - end - end - endcase - - if (re) - begin - ramdata_r <= ramdata ; - end - - if (crcsend) - begin - case (ncnt) - 4'b0001 : - begin - txd_rise <= crcneg_c[3:0] ; - end - 4'b0010 : - begin - txd_rise <= crcneg_c[7:4] ; - end - 4'b0011 : - begin - txd_rise <= crcneg_c[11:8] ; - end - 4'b0100 : - begin - txd_rise <= crcneg_c[15:12] ; - end - 4'b0101 : - begin - txd_rise <= crcneg_c[19:16] ; - end - 4'b0110 : - begin - txd_rise <= crcneg_c[23:20] ; - end - 4'b0111 : - begin - txd_rise <= crcneg_c[27:24] ; - end - default : - begin - txd_rise <= crcneg_c[31:28] ; - end - endcase - end - else - begin - txd_rise <= itxd0 ; - end - end - end - - always @(posedge clk) - begin : txen_reg_proc - if (rst) - begin - txen1 <= 1'b0 ; - txen_rise <= 1'b0 ; - end - else - begin - txen_rise <= txen1 ; - if (tsm == TSM_IDLE_TCSMT | - tsm == TSM_INT | - tsm == TSM_FLUSH) - begin - txen1 <= 1'b0 ; - end - else - begin - txen1 <= 1'b1 ; - end - end - end - - always @(posedge clk) - begin : mii_fall_reg_proc - txen <= txen_rise ; - txd <= txd_rise; - end - - assign txer = 1'b0 ; - - always @(posedge clk) - begin : bkoff_reg_proc - if (rst) - begin - bkoff_r <= 1'b0 ; - end - else - begin - if (bkoff) - begin - bkoff_r <= 1'b1 ; - end - else if (tsm != TSM_JAM) - begin - bkoff_r <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : stopo_reg_proc - if (rst) - begin - stop_r <= 1'b0 ; - stopo <= 1'b0 ; - end - else - begin - stop_r <= stopi; - - if (stop_r & tsm == TSM_IDLE_TCSMT & !itpend) - begin - stopo <= 1'b1 ; - end - else - begin - stopo <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : cscnt_reg_proc - if (rst) - begin - tcscnt <= {8{1'b0}} ; - tcs <= 1'b0 ; - tcsreq <= 1'b0 ; - tcsack_r <= 1'b0 ; - end - else - begin - if (tcscnt == 8'b00000000) - begin - tcscnt <= 8'b10000000 ; - end - else - begin - tcscnt <= tcscnt - 1 ; - end - - if (tcscnt == 8'b00000000) - begin - tcs <= 1'b1 ; - end - else if (tcsack_r) - begin - tcs <= 1'b0 ; - end - - if (tcs & !tcsack_r) - begin - tcsreq <= 1'b1 ; - end - else if (tcsack_r) - begin - tcsreq <= 1'b0 ; - end - - tcsack_r <= tcsack ; - - end - end - - assign hnibble = (DATAWIDTH == 32) ? 4'b0111 : - (DATAWIDTH == 16) ? 4'b0011 : - 4'b0001 ; - - assign itxd0zero_max = {(MIIWIDTH_MAX + 1){1'b0}} ; - - assign itxd0_max = {itxd0zero_max[MIIWIDTH_MAX + 1:MIIWIDTH], - itxd0}; - - assign dzero_max = {(DATAWIDTH_MAX + 1){1'b0}} ; - -endmodule - - - -module TFIFO_V ( - clk, - rst, - ramwe, - ramaddr, - ramdata, - fifowe, - fifoeof, - fifobe, - fifodata, - fifonf, - fifocnf, - fifoval, - flev, - ici, - dpdi, - aci, - statadi, - cachere, - deo, - lco, - loo, - nco, - eco, - csne, - ico, - uro, - cco, - statado, - sofreq, - eofreq, - dpdo, - aco, - beo, - eofad, - wadg, - tireq, - winp, - dei, - lci, - loi, - nci, - eci, - uri, - cci, - radg, - tiack, - sf, - fdp, - tm, - pbl, - etiack, - etireq, - stopi, - stopo - ); - - parameter DATAWIDTH = 32; - parameter DATADEPTH = 32; - parameter FIFODEPTH = 9; - parameter CACHEDEPTH = 1; - - `include "utility.v" - - input clk; - input rst; - - output ramwe; - wire ramwe; - output [FIFODEPTH - 1:0] ramaddr; - wire [FIFODEPTH - 1:0] ramaddr; - output [DATAWIDTH - 1:0] ramdata; - wire [DATAWIDTH - 1:0] ramdata; - - input fifowe; - input fifoeof; - input [DATAWIDTH / 8 - 1:0] fifobe; - input [DATAWIDTH - 1:0] fifodata; - output fifonf; - reg fifonf; - output fifocnf; - wire fifocnf; - output fifoval; - reg fifoval; - output [FIFODEPTH - 1:0] flev; - wire [FIFODEPTH - 1:0] flev; - - input ici; - input dpdi; - input aci; - input [DATADEPTH - 1:0] statadi; - - input cachere; - output deo; - wire deo; - output lco; - wire lco; - output loo; - wire loo; - output nco; - wire nco; - output eco; - wire eco; - output csne; - wire csne; - output ico; - wire ico; - output uro; - wire uro; - output [3:0] cco; - wire [3:0] cco; - output [DATADEPTH - 1:0] statado; - wire [DATADEPTH - 1:0] statado; - - output sofreq; - wire sofreq; - output eofreq; - reg eofreq; - output dpdo; - wire dpdo; - output aco; - wire aco; - output [DATAWIDTH / 8 - 1:0] beo; - wire [DATAWIDTH / 8 - 1:0] beo; - output [FIFODEPTH - 1:0] eofad; - reg [FIFODEPTH - 1:0] eofad; - output [FIFODEPTH - 1:0] wadg; - reg [FIFODEPTH - 1:0] wadg; - - input tireq; - input winp; - input dei; - input lci; - input loi; - input nci; - input eci; - input uri; - input [3:0] cci; - input [FIFODEPTH - 1:0] radg; - output tiack; - wire tiack; - - input sf; - input fdp; - input [2:0] tm; - input [5:0] pbl; - - input etiack; - output etireq; - reg etireq; - - input stopi; - output stopo; - reg stopo; - - - parameter CCWIDTH = (3 + DATADEPTH + DATAWIDTH / 8 + FIFODEPTH); - reg [CCWIDTH - 1:0] ccmem[(1'b1 << CACHEDEPTH) - 1:0]; - wire ccwe; - wire ccre; - reg ccne; - reg iccnf; - wire [CACHEDEPTH - 1:0] ccwad_c; - reg [CACHEDEPTH - 1:0] ccwad; - reg [CACHEDEPTH - 1:0] ccrad; - reg [CACHEDEPTH - 1:0] ccrad_r; - wire [CCWIDTH - 1:0] ccdi; - wire [CCWIDTH - 1:0] ccdo; - - parameter CSWIDTH = (DATADEPTH + 11); - reg [CSWIDTH - 1:0] csmem[(1'b1 << CACHEDEPTH) - 1:0]; - wire cswe; - reg csre; - reg [CACHEDEPTH - 1:0] cswad; - wire [CACHEDEPTH - 1:0] csrad_c; - reg [CACHEDEPTH - 1:0] csrad; - reg [CACHEDEPTH - 1:0] csrad_r; - wire [CSWIDTH - 1:0] csdi; - wire [CSWIDTH - 1:0] csdo; - wire [DATADEPTH - 1:0] statad; - wire ic; - reg icsne; - - reg tprog; - reg tprog_r; - - reg winp_r; - reg [FIFODEPTH_MAX - 1:0] tlev_c; - reg tresh; - reg [FIFODEPTH - 1:0] stat; - reg [FIFODEPTH - 1:0] wad; - reg [FIFODEPTH - 1:0] rad_c; - reg [FIFODEPTH - 1:0] rad; - reg [FIFODEPTH - 1:0] radg_0_r; - reg [FIFODEPTH - 1:0] radg_r; - reg [FIFODEPTH - 1:0] sad; - wire [FIFODEPTH - 1:0] eofad_bin; - reg pblz; - reg [FIFODEPTH_MAX - 1:0] sflev_c; - - reg tireq_r; - reg tireq_r2; - - reg stop_r; - - wire [FIFODEPTH - 1:0] fone; - wire [FIFODEPTH - 1:0] fzero; - - always @(posedge clk) - begin : ccmem_reg_proc - if (rst) - begin : ccmem_reset - integer i; - for(i = ((1'b1 << CACHEDEPTH) - 1); i >= 0; i = i - 1) - begin - ccmem[i] <= {CCWIDTH{1'b0}}; - end - ccrad_r <= {CACHEDEPTH{1'b0}} ; - end - else - begin - if (fifowe | fifoeof) - begin - ccmem[ccwad] <= ccdi ; - end - ccrad_r <= ccrad ; - end - end - - assign ccwad_c = (fifoeof) ? ccwad + 1 : ccwad ; - - always @(posedge clk) - begin : ccaddr_reg_proc - if (rst) - begin - ccwad <= {CACHEDEPTH{1'b0}} ; - ccrad <= {CACHEDEPTH{1'b0}} ; - end - else - begin - ccwad <= ccwad_c ; - - if (ccre) - begin - ccrad <= ccrad + 1 ; - end - end - end - - always @(posedge clk) - begin : ccfe_reg_proc - if (rst) - begin - iccnf <= 1'b1 ; - ccne <= 1'b0 ; - end - else - begin - if ((ccwad_c == ccrad) & ccwe) - begin - iccnf <= 1'b0 ; - end - else if (ccre) - begin - iccnf <= 1'b1 ; - end - - if (ccwad == ccrad & iccnf) - begin - ccne <= 1'b0 ; - end - else - begin - ccne <= 1'b1 ; - end - end - end - - assign fifocnf = iccnf ; - - assign ccdo = ccmem[ccrad_r] ; - - assign ccdi = {ici, aci, dpdi, wad, fifobe, statadi} ; - - assign ccwe = fifoeof ; - - assign ccre = tireq_r & ~tireq_r2 ; - - assign ic = ccdo[CCWIDTH - 1] ; - - assign aco = ccdo[CCWIDTH - 2] ; - - assign dpdo = ccdo[CCWIDTH - 3] ; - - assign eofad_bin = ccdo[CCWIDTH - 4:CCWIDTH - 3 - FIFODEPTH] ; - - always @(posedge clk) - begin : eofad_reg_proc - if (rst) - begin - eofad <= {FIFODEPTH{1'b0}} ; - end - else - begin - eofad[FIFODEPTH - 1] <= eofad_bin[FIFODEPTH - 1] ; - begin : eofad_loop - integer i; - for(i = FIFODEPTH - 2; i >= 0; i = i - 1) - begin - eofad[i] <= eofad_bin[i] ^ eofad_bin[i + 1] ; - end - end - end - end - - assign beo = ccdo[DATADEPTH + DATAWIDTH / 8 - 1:DATADEPTH] ; - - assign statad = ccdo[DATADEPTH - 1:0] ; - - always @(posedge clk) - begin : csmem_reg_proc - if (rst) - begin : csmem_reset - integer i; - for(i = ((1'b1 << CACHEDEPTH) - 1); i >= 0; i = i - 1) - begin - csmem[i] <= {CSWIDTH{1'b0}}; - end - csrad_r <= {CACHEDEPTH{1'b0}}; - end - else - begin - csmem[cswad] <= csdi ; - csrad_r <= csrad ; - end - end - - always @(posedge clk) - begin : csaddr_reg_proc - if (rst) - begin - cswad <= {CACHEDEPTH{1'b0}} ; - csrad <= {CACHEDEPTH{1'b0}} ; - end - else - begin - if (cswe) - begin - cswad <= cswad + 1 ; - end - - csrad <= csrad_c ; - end - end - - assign csrad_c = (csre) ? csrad + 1 : csrad ; - - always @(posedge clk) - begin : icsne_reg_proc - if (rst) - begin - icsne <= 1'b0 ; - end - else - begin - if (cswad == csrad | (csre & cswad == csrad_c)) - begin - icsne <= 1'b0 ; - end - else - begin - icsne <= 1'b1 ; - end - end - end - - assign csne = icsne; - - assign csdo = csmem[csrad_r] ; - - assign csdi = {dei, lci, loi, nci, eci, ic, cci, uri, statad} ; - - assign deo = csdo[CSWIDTH - 1] ; - - assign lco = csdo[CSWIDTH - 2] ; - - assign loo = csdo[CSWIDTH - 3] ; - - assign nco = csdo[CSWIDTH - 4] ; - - assign eco = csdo[CSWIDTH - 5] ; - - assign ico = csdo[CSWIDTH - 6] ; - - assign cco = csdo[CSWIDTH - 7:CSWIDTH - 10] ; - - assign uro = csdo[CSWIDTH - 11] ; - - assign statado = csdo[DATADEPTH - 1:0] ; - - assign cswe = tireq_r & tprog ; - - always @(posedge clk) - begin : csre_reg_proc - if (rst) - begin - csre <= 1'b0 ; - end - else - begin - csre <= cachere ; - end - end - - always @(posedge clk) - begin : tprog_reg_proc - if (rst) - begin - tprog <= 1'b0 ; - tprog_r <= 1'b0 ; - end - else - begin - tprog_r <= tprog ; - if (tireq_r) - begin - tprog <= 1'b0 ; - end - else if ((!sf & !tprog & !tireq_r & tresh) | ccne) - begin - tprog <= 1'b1 ; - end - end - end - - always @(posedge clk) - begin : eofreq_reg_proc - if (rst) - begin - eofreq <= 1'b0 ; - end - else - begin - if (tprog & ccne) - begin - eofreq <= 1'b1 ; - end - else if (tireq_r) - begin - eofreq <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : tireq_reg_proc - if (rst) - begin - tireq_r <= 1'b0 ; - tireq_r2 <= 1'b0 ; - end - else - begin - tireq_r <= tireq ; - tireq_r2 <= tireq_r ; - end - end - - always @(posedge clk) - begin : etireq_reg_proc - if (rst) - begin - etireq <= 1'b0 ; - end - else - begin - if (fifoeof) - begin - etireq <= 1'b1 ; - end - else if (etiack) - begin - etireq <= 1'b0 ; - end - end - end - - assign tiack = tireq_r2 ; - - assign sofreq = tprog ; - - always @(posedge clk) - begin : addr_reg_proc - if (rst) - begin - wad <= {FIFODEPTH{1'b0}} ; - wadg <= {FIFODEPTH{1'b0}} ; - radg_0_r <= {FIFODEPTH{1'b0}} ; - radg_r <= {FIFODEPTH{1'b0}} ; - rad <= {FIFODEPTH{1'b0}} ; - sad <= {FIFODEPTH{1'b0}} ; - end - else - begin - if (fifowe) - begin - wad <= wad + 1 ; - end - - wadg[FIFODEPTH - 1] <= wad[FIFODEPTH - 1] ; - begin : wadg_loop - integer i; - for(i = FIFODEPTH - 2; i >= 0; i = i - 1) - begin - wadg[i] <= wad[i] ^ wad[i + 1] ; - end - end - - radg_0_r <= radg ; - radg_r <= radg_0_r ; - - rad <= rad_c ; - - if (!tprog & tprog_r) - begin - sad <= eofad_bin ; - end - end - end - - always @(radg_r) - begin : rad_proc - reg[FIFODEPTH - 1:0] rad_v; - rad_v[FIFODEPTH - 1] = radg_r[FIFODEPTH - 1]; - begin : rad_loop - integer i; - for(i = FIFODEPTH - 2; i >= 0; i = i - 1) - begin - rad_v[i] = rad_v[i + 1] ^ radg_r[i]; - end - end - rad_c = rad_v ; - end - - always @(posedge clk) - begin : stat_reg_proc - if (rst) - begin - stat <= {FIFODEPTH{1'b0}} ; - end - else - begin - if ((!winp_r & !fdp & tprog & !tireq_r) | !tprog_r) - begin - stat <= wad - sad ; - end - else - begin - stat <= wad - rad ; - end - end - end - - always @(posedge clk) - begin : winp_reg_proc - if (rst) - begin - winp_r <= 1'b0 ; - end - else - begin - winp_r <= winp ; - end - end - - always @(tm) - begin : tresh_proc - tlev_c <= {FIFODEPTH_MAX{1'b0}} ; - case (DATAWIDTH) - 8 : - begin - case (tm) - 3'b000, 3'b101, 3'b110 : - begin - tlev_c[10:0] <= 11'b00010000000 ; - end - 3'b001, 3'b111 : - begin - tlev_c[10:0] <= 11'b00100000000 ; - end - 3'b010 : - begin - tlev_c[10:0] <= 11'b01000000000 ; - end - 3'b011 : - begin - tlev_c[10:0] <= 11'b10000000000 ; - end - default : - begin - tlev_c[10:0] <= 11'b00001000000 ; - end - endcase - end - 16 : - begin - case (tm) - 3'b000, 3'b101, 3'b110 : - begin - tlev_c[10:0] <= 11'b00001000000 ; - end - 3'b001, 3'b111 : - begin - tlev_c[10:0] <= 11'b00010000000 ; - end - 3'b010 : - begin - tlev_c[10:0] <= 11'b00100000000 ; - end - 3'b011 : - begin - tlev_c[10:0] <= 11'b01000000000 ; - end - default : - begin - tlev_c[10:0] <= 11'b00000100000 ; - end - endcase - end - default : - begin - case (tm) - 3'b000, 3'b101, 3'b110 : - begin - tlev_c[10:0] <= 11'b00000100000 ; - end - 3'b001, 3'b111 : - begin - tlev_c[10:0] <= 11'b00001000000 ; - end - 3'b010 : - begin - tlev_c[10:0] <= 11'b00010000000 ; - end - 3'b011 : - begin - tlev_c[10:0] <= 11'b00100000000 ; - end - default : - begin - tlev_c[10:0] <= 11'b00000010000 ; - end - endcase - end - endcase - end - - always @(posedge clk) - begin : tresh_reg_proc - if (rst) - begin - tresh <= 1'b0 ; - end - else - begin - if (stat >= tlev_c[FIFODEPTH - 1:0]) - begin - tresh <= 1'b1 ; - end - else - begin - tresh <= 1'b0 ; - end - end - end - - always @(pbl or pblz) - begin : sflev_proc - sflev_c[FIFODEPTH_MAX - 1:6] <= {(FIFODEPTH_MAX-6){1'b1}} ; - if (pblz) - begin - sflev_c[5:0] <= 6'b000000 ; - end - else - begin - sflev_c[5:0] <= ~pbl ; - end - end - - always @(posedge clk) - begin : fifoval_reg_proc - if (rst) - begin - fifoval <= 1'b0 ; - end - else - begin - if (stat <= sflev_c[FIFODEPTH - 1:0]) - begin - fifoval <= 1'b1 ; - end - else - begin - fifoval <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : pblz_reg_proc - if (rst) - begin - pblz <= 1'b0 ; - end - else - begin - if (pbl == 6'b000000) - begin - pblz <= 1'b1 ; - end - else - begin - pblz <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : fifonf_reg_proc - if (rst) - begin - fifonf <= 1'b1 ; - end - else - begin - if ((stat == {fone[FIFODEPTH - 1:1], 1'b0} & fifowe) | - (stat == fone)) - begin - fifonf <= 1'b0 ; - end - else - begin - fifonf <= 1'b1 ; - end - end - end - - assign flev = stat ; - - assign ramaddr = wad ; - - assign ramdata = fifodata ; - - assign ramwe = fifowe ; - - always @(posedge clk) - begin : tstop_reg_proc - if (rst) - begin - stop_r <= 1'b1 ; - stopo <= 1'b0 ; - end - else - begin - stop_r <= stopi ; - - if (stop_r & !ccne & !icsne & stat == fzero & !tprog) - begin - stopo <= 1'b1 ; - end - else - begin - stopo <= 1'b0 ; - end - end - end - - assign fone = {FIFODEPTH{1'b1}} ; - - assign fzero = {FIFODEPTH{1'b0}} ; - -endmodule - - - -module TLSM_V ( - clk, - rst, - fifonf, - fifocnf, - fifoval, - fifolev, - fifowe, - fifoeof, - fifobe, - fifodata, - ic, - ac, - dpd, - statado, - csne, - lo, - nc, - lc, - ec, - de, - ur, - cc, - statadi, - cachere, - dmaack, - dmaeob, - dmadatai, - dmaaddr, - dmareq, - dmawr, - dmacnt, - dmaaddro, - dmadatao, - fwe, - fdata, - faddr, - dsl, - pbl, - poll, - dbadc, - dbad, - pollack, - tcompack, - tcomp, - des, - fbuf, - stat, - setp, - tu, - ft, - stopi, - stopo - ); - - parameter DATAWIDTH = 32; - parameter DATADEPTH = 32; - parameter FIFODEPTH = 9; - - `include "utility.v" - - input clk; - input rst; - - input fifonf; - input fifocnf; - input fifoval; - input [FIFODEPTH - 1:0] fifolev; - output fifowe; - wire fifowe; - output fifoeof; - wire fifoeof; - output [DATAWIDTH / 8 - 1:0] fifobe; - reg [DATAWIDTH / 8 - 1:0] fifobe; - output [DATAWIDTH - 1:0] fifodata; - wire [DATAWIDTH - 1:0] fifodata; - - output ic; - reg ic; - output ac; - reg ac; - output dpd; - reg dpd; - output [DATADEPTH - 1:0] statado; - wire [DATADEPTH - 1:0] statado; - - input csne; - input lo; - input nc; - input lc; - input ec; - input de; - input ur; - input [3:0] cc; - input [DATADEPTH - 1:0] statadi; - output cachere; - wire cachere; - - input dmaack; - input dmaeob; - input [DATAWIDTH - 1:0] dmadatai; - input [DATADEPTH - 1:0] dmaaddr; - output dmareq; - wire dmareq; - output dmawr; - wire dmawr; - output [FIFODEPTH_MAX - 1:0] dmacnt; - wire [FIFODEPTH_MAX - 1:0] dmacnt; - output [DATADEPTH - 1:0] dmaaddro; - reg [DATADEPTH - 1:0] dmaaddro; - output [DATAWIDTH - 1:0] dmadatao; - reg [DATAWIDTH - 1:0] dmadatao; - - output fwe; - wire fwe; - output [ADDRWIDTH - 1:0] fdata; - wire [ADDRWIDTH - 1:0] fdata; - output [ADDRDEPTH - 1:0] faddr; - wire [ADDRDEPTH - 1:0] faddr; - - input [4:0] dsl; - input [5:0] pbl; - input poll; - input dbadc; - input [DATADEPTH - 1:0] dbad; - output pollack; - wire pollack; - - input tcompack; - output tcomp; - wire tcomp; - output des; - reg des; - output fbuf; - reg fbuf; - output stat; - reg stat; - output setp; - reg setp; - output tu; - reg tu; - output [1:0] ft; - reg [1:0] ft; - - input stopi; - output stopo; - reg stopo; - - - wire [DATAWIDTH_MAX + 1:0] dmadatai_max; - reg [DATAWIDTH_MAX - 1:0] dataimax_r; - wire [1:0] dataimax_r10; - wire [2:0] dmaaddr20; - reg req_c; - reg req; - reg [2:0] req_r; - - reg idmareq; - wire [31:0] datao32; - wire [FIFODEPTH_MAX - 1:0] bsmax; - wire [FIFODEPTH_MAX - 1:0] flmax; - wire [FIFODEPTH - 1:0] flmax_sub; - wire [FIFODEPTH_MAX - 1:0] blmax; - reg fl_g_bs; - reg fl_g_bl; - reg bl_g_bs; - reg pblz; - reg buffetch; - reg dmaack_r; - - reg [3:0] lsm_c; - reg [3:0] lsm; - reg [3:0] lsm_r; - reg [2:0] csm_c; - reg [2:0] csm; - reg [2:0] lsmcnt; - reg tsprog; - reg [DATADEPTH - 1:0] statad; - wire es_c; - reg own_c; - reg own; - reg tch; - reg ter; - reg set; - reg tls; - reg tfs; - wire [10:0] bs_c; - wire [1:0] bs_c10; - reg [10:0] bs1; - reg [10:0] bs2; - reg adwrite; - reg [DATADEPTH - 1:0] bad; - reg [DATADEPTH - 1:0] dad; - reg dbadc_r; - wire [31:0] tstat; - reg lastdma; - reg icachere; - reg poll_r; - reg [FIFODEPTH_MAX - 1:0] dmacnt_c; - reg [FIFODEPTH_MAX - 1:0] dmacnt_r; - - wire [1:0] addsel16; - wire [3:0] addsel32; - reg [3:0] addv_c; - reg [1:0] badd_c; - reg [11:0] bcnt; - reg ififowe; - wire bufwe; - wire firstb_c; - reg firstb; - reg [DATAWIDTH - 1:0] buf0_c; - reg [DATAWIDTH * 2 - 9:0] buf_c; - reg [DATAWIDTH * 2 - 9:0] buf_r; - reg [3:0] buflev_c; - reg [3:0] buflev; - reg [DATAWIDTH / 8 - 1:0] firstbe; - reg [DATAWIDTH / 8 - 1:0] lastbe; - reg [DATAWIDTH / 8 - 1:0] be; - wire [1:0] be10; - wire [3:0] be30; - - reg itcomp; - reg tcompack_r; - - reg ifwe; - reg [ADDRDEPTH - 1:0] ifaddr; - - reg stop_r; - - wire [FIFODEPTH_MAX - 1:0] fzero_max; - wire [DATAWIDTH_MAX + 1:0] dzero_max; - wire [DATAWIDTH_MAX * 2 - 7:0] buf_r_max; - wire [DATAWIDTH_MAX * 2 - 7:0] bufzero_max; - - - always @(posedge clk) - begin : idmareq_reg_proc - if (rst) - begin - idmareq <= 1'b0 ; - end - else - begin - if (req_c) - begin - idmareq <= 1'b1 ; - end - else if (dmaack & dmaeob) - begin - idmareq <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : cachere_reg_proc - if (rst) - begin - icachere <= 1'b0 ; - end - else - begin - if (itcomp & tcompack_r) - begin - icachere <= 1'b1 ; - end - else - begin - icachere <= 1'b0 ; - end - end - end - - assign cachere = icachere ; - - always @(lsm or - csm or - poll_r or - dmaack or - dmaeob or - own_c or - tch or - bs1 or - bs2 or - stop_r or - lsmcnt or - fifocnf or - tsprog or - lastdma or - dbadc_r) - begin : lsm_proc - case (lsm) - LSM_IDLE : - begin - if (!dbadc_r & !stop_r & fifocnf & (poll_r | (tsprog & dmaack & dmaeob))) - begin - lsm_c <= LSM_DES0 ; - end - else - begin - lsm_c <= LSM_IDLE ; - end - end - LSM_DES0 : - begin - if (dmaack & dmaeob & !tsprog) - begin - if (own_c) - begin - lsm_c <= LSM_DES1 ; - end - else - begin - lsm_c <= LSM_IDLE ; - end - end - else - begin - lsm_c <= LSM_DES0 ; - end - end - LSM_DES1 : - begin - if (dmaack & dmaeob & !tsprog) - begin - lsm_c <= LSM_DES2 ; - end - else - begin - lsm_c <= LSM_DES1 ; - end - end - LSM_DES2 : - begin - if (dmaack & dmaeob & !tsprog) - begin - if (bs1 == 11'b00000000000 | csm == CSM_IDLE) - begin - lsm_c <= LSM_DES3 ; - end - else - begin - lsm_c <= LSM_BUF1 ; - end - end - else - begin - lsm_c <= LSM_DES2 ; - end - end - LSM_DES3 : - begin - if (dmaack & dmaeob & !tsprog) - begin - if (bs2 == 11'b00000000000 | tch | csm == CSM_IDLE) - begin - lsm_c <= LSM_NXT ; - end - else - begin - lsm_c <= LSM_BUF2 ; - end - end - else - begin - lsm_c <= LSM_DES3 ; - end - end - LSM_BUF1 : - begin - if (!tsprog & dmaack & dmaeob & lastdma) - begin - lsm_c <= LSM_DES3 ; - end - else - begin - lsm_c <= LSM_BUF1 ; - end - end - LSM_BUF2 : - begin - if (!tsprog & dmaack & dmaeob & lastdma) - begin - lsm_c <= LSM_NXT ; - end - else - begin - lsm_c <= LSM_BUF2 ; - end - end - LSM_NXT : - begin - if (lsmcnt == 3'b000) - begin - if (csm == CSM_L | csm == CSM_FL) - begin - if (stop_r | !fifocnf) - begin - lsm_c <= LSM_IDLE ; - end - else - begin - lsm_c <= LSM_DES0 ; - end - end - else - begin - lsm_c <= LSM_STAT ; - end - end - else - begin - lsm_c <= LSM_NXT ; - end - end - default : - begin - if (dmaack & dmaeob & !tsprog) - begin - if (stop_r) - begin - lsm_c <= LSM_IDLE ; - end - else - begin - lsm_c <= LSM_DES0 ; - end - end - else - begin - lsm_c <= LSM_STAT ; - end - end - endcase - end - - always @(posedge clk) - begin : lsm_reg_proc - if (rst) - begin - lsm <= LSM_IDLE ; - lsm_r <= LSM_IDLE ; - end - else - begin - lsm <= lsm_c ; - lsm_r <= lsm ; - end - end - - always @(csm or lsm or tfs or tls or own or set or bs1 or bs2) - begin : csm_proc - case (csm) - CSM_IDLE : - begin - if (lsm == LSM_DES2) - begin - if (!set & tfs & tls) - begin - csm_c <= CSM_FL ; - end - else if (!set & tfs & !tls) - begin - csm_c <= CSM_F ; - end - else if (set & !tfs & !tls) - begin - csm_c <= CSM_SET ; - end - else - begin - csm_c <= CSM_IDLE ; - end - end - else - begin - csm_c <= CSM_IDLE ; - end - end - CSM_FL : - begin - if (lsm == LSM_DES0 | lsm == LSM_IDLE) - begin - csm_c <= CSM_IDLE ; - end - else if (lsm == LSM_DES2 & - bs1 == 11'b00000000000 & - bs2 == 11'b00000000000) - begin - csm_c <= CSM_BAD ; - end - else - begin - csm_c <= CSM_FL ; - end - end - CSM_F : - begin - if (tls) - begin - csm_c <= CSM_L ; - end - else if (lsm == LSM_DES1 & !tfs) - begin - csm_c <= CSM_I ; - end - else - begin - csm_c <= CSM_F ; - end - end - CSM_L : - begin - if (lsm == LSM_DES0 | lsm == LSM_IDLE) - begin - csm_c <= CSM_IDLE ; - end - else - begin - csm_c <= CSM_L ; - end - end - CSM_SET : - begin - if (lsm == LSM_DES0 | lsm == LSM_IDLE) - begin - csm_c <= CSM_IDLE ; - end - else - begin - csm_c <= CSM_SET ; - end - end - CSM_I : - begin - if (tls) - begin - csm_c <= CSM_L ; - end - else - begin - csm_c <= CSM_I ; - end - end - default : - begin - if (lsm == LSM_NXT) - begin - csm_c <= CSM_IDLE ; - end - else - begin - csm_c <= CSM_BAD ; - end - end - endcase - end - - always @(posedge clk) - begin : csm_reg_proc - if (rst) - begin - csm <= CSM_IDLE ; - end - else - begin - csm <= csm_c ; - end - end - - always @(posedge clk) - begin : lsmcnt_reg_proc - if (rst) - begin - lsmcnt <= {3{1'b1}} ; - end - else - begin - if (lsm == LSM_NXT) - begin - lsmcnt <= lsmcnt - 1 ; - end - else - begin - lsmcnt <= {3{1'b1}} ; - end - end - end - - always @(posedge clk) - begin : poll_reg_proc - if (rst) - begin - poll_r <= 1'b0 ; - end - else - begin - if (poll) - begin - poll_r <= 1'b1 ; - end - else if (!dbadc_r) - begin - poll_r <= 1'b0 ; - end - end - end - - assign pollack = poll_r ; - - always @(own or dmaack or dmaeob or lsm or dmadatai_max or tsprog) - begin : own_proc - if (dmaack & dmaeob & lsm == LSM_DES0 & !tsprog) - begin - own_c <= dmadatai_max[DATAWIDTH - 1] ; - end - else - begin - own_c <= own ; - end - end - - always @(posedge clk) - begin : own_reg_proc - if (rst) - begin - own <= 1'b1 ; - end - else - begin - own <= own_c ; - end - end - - always @(posedge clk) - begin : des1_reg_proc - reg ft22; - if (rst) - begin - ft22 = 1'b0; - tls <= 1'b0 ; - tfs <= 1'b0 ; - set <= 1'b0 ; - ac <= 1'b0 ; - ter <= 1'b0 ; - tch <= 1'b0 ; - dpd <= 1'b0 ; - ic <= 1'b0 ; - bs2 <= {11{1'b0}} ; - bs1 <= {11{1'b0}} ; - ft <= {2{1'b0}} ; - end - else - begin - if (lsm == LSM_DES1 & dmaack & !tsprog) - begin - case (DATAWIDTH) - 8 : - begin - case (dmaaddr20) - 3'b000, 3'b100 : - begin - bs1[7:0] <= dmadatai_max[7:0] ; - end - 3'b001, 3'b101 : - begin - bs1[10:8] <= dmadatai_max[2:0] ; - bs2[4:0] <= dmadatai_max[7:3] ; - end - 3'b010, 3'b110 : - begin - bs2[10:5] <= dmadatai_max[5:0] ; - dpd <= dmadatai_max[7] ; - ft22 = dmadatai_max[6]; - end - default : - begin - ic <= dmadatai_max[7] ; - tls <= dmadatai_max[6] ; - tfs <= dmadatai_max[5] ; - set <= dmadatai_max[3] ; - ac <= dmadatai_max[2] ; - ter <= dmadatai_max[1] ; - tch <= dmadatai_max[0] ; - if (dmadatai_max[3]) - begin - ft <= {dmadatai_max[4], ft22} ; - end - end - endcase - end - 16 : - begin - case (dmaaddr20) - 3'b000, 3'b100 : - begin - bs1[10:0] <= dmadatai_max[10:0] ; - bs2[4:0] <= dmadatai_max[15:11] ; - end - default : - begin - bs2[10:5] <= dmadatai_max[5:0] ; - ic <= dmadatai_max[15] ; - tls <= dmadatai_max[14] ; - tfs <= dmadatai_max[13] ; - set <= dmadatai_max[11] ; - ac <= dmadatai_max[10] ; - ter <= dmadatai_max[9] ; - tch <= dmadatai_max[8] ; - dpd <= dmadatai_max[7] ; - if (dmadatai_max[11]) - begin - ft <= {dmadatai_max[12], dmadatai_max[6]} ; - end - end - endcase - end - default : - begin - ic <= dmadatai_max[31] ; - tls <= dmadatai_max[30] ; - tfs <= dmadatai_max[29] ; - set <= dmadatai_max[27] ; - ac <= dmadatai_max[26] ; - ter <= dmadatai_max[25] ; - tch <= dmadatai_max[24] ; - dpd <= dmadatai_max[23] ; - bs2 <= dmadatai_max[21:11] ; - bs1 <= dmadatai_max[10:0] ; - if (dmadatai_max[27]) - begin - ft <= {dmadatai_max[28], dmadatai_max[22]} ; - end - end - endcase - end - end - end - - always @(posedge clk) - begin : adwrite_reg_proc - if (rst) - begin - adwrite <= 1'b0 ; - end - else - begin - if (dmaack & dmaeob & !tsprog) - begin - adwrite <= 1'b1 ; - end - else - begin - adwrite <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : dbadc_reg_proc - if (rst) - begin - dbadc_r <= 1'b0 ; - end - else - begin - dbadc_r <= dbadc ; - end - end - - always @(posedge clk) - begin : dad_reg_proc - if (rst) - begin - dad <= {DATADEPTH{1'b1}} ; - end - else - begin - if (dbadc_r) - begin - dad <= dbad ; - end - else if (adwrite) - begin - case (lsm_r) - LSM_DES3 : - begin - if (ter) - begin - dad <= dbad ; - end - else if (tch) - begin - dad <= dataimax_r[DATADEPTH - 1:0] ; - end - else - begin - dad <= dmaaddr + ({dsl, 2'b00}) ; - end - end - LSM_DES0 : - begin - if (own) - begin - dad <= dmaaddr ; - end - end - LSM_DES2 : - begin - dad <= dmaaddr ; - end - LSM_DES1 : - begin - dad <= dmaaddr ; - end - default : - begin - end - endcase - end - end - end - - always @(posedge clk) - begin : bad_reg_proc - if (rst) - begin - bad <= {DATADEPTH{1'b1}} ; - end - else - begin - if (adwrite) - begin - if (lsm_r == LSM_DES2 | lsm_r == LSM_DES3) - begin - case (DATAWIDTH) - 8 : - begin - bad <= dataimax_r[DATADEPTH - 1:0] ; - end - 16 : - begin - bad <= {dataimax_r[DATADEPTH - 1:1], 1'b0} ; - end - default : - begin - bad <= {dataimax_r[DATADEPTH - 1:2], 2'b00} ; - end - endcase - end - else - begin - bad <= dmaaddr ; - end - end - end - end - - always @(posedge clk) - begin : stataddr_reg_proc - if (rst) - begin - statad <= {DATADEPTH{1'b1}} ; - end - else - begin - if (lsm_r == LSM_DES0 & adwrite & own) - begin - statad <= dad ; - end - end - end - - assign statado = statad ; - - assign bs_c = (lsm_r == LSM_DES2) ? bs1 : bs2 ; - - assign addsel16 = {dataimax_r[0], bs_c[0]} ; - - assign addsel32 = {dataimax_r10, bs_c10} ; - - always @(addsel16 or addsel32) - begin : badd_proc - case (DATAWIDTH) - 8 : - begin - badd_c <= 2'b00 ; - end - 16 : - begin - if (addsel16 == 2'b01 | - addsel16 == 2'b10 | - addsel16 == 2'b11) - begin - badd_c <= 2'b01 ; - end - else - begin - badd_c <= 2'b00 ; - end - end - default : - begin - case (addsel32) - 4'b0000 : - begin - badd_c <= 2'b00 ; - end - 4'b1011, 4'b1110, 4'b1111 : - begin - badd_c <= 2'b10 ; - end - default : - begin - badd_c <= 2'b01 ; - end - endcase - end - endcase - end - - always @(posedge clk) - begin : bcnt_reg_proc - if (rst) - begin - bcnt <= {12{1'b1}} ; - end - else - begin - case (DATAWIDTH) - 8 : - begin - if (lsm_r == LSM_DES2 | lsm_r == LSM_DES3) - begin - bcnt <= {1'b0, bs_c} ; - end - else if (dmaack & !tsprog) - begin - bcnt <= bcnt - 1 ; - end - end - 16 : - begin - if (lsm_r == LSM_DES2 | lsm_r == LSM_DES3) - begin - bcnt <= {(({1'b0, bs_c[10:1]}) + badd_c), 1'b0} ; - end - else if (dmaack & !tsprog) - begin - bcnt <= {(bcnt[11:1] - 1), 1'b0} ; - end - end - default : - begin - if (lsm_r == LSM_DES2 | lsm_r == LSM_DES3) - begin - bcnt <= {(({1'b0, bs_c[10:2]}) + badd_c), 2'b00} ; - end - else if (dmaack & !tsprog) - begin - bcnt <= {(bcnt[11:2] - 1), 2'b00} ; - end - end - endcase - end - end - - - assign bs_c10 = bs_c[1:0] ; - - assign dataimax_r10 = dataimax_r[1:0] ; - - always @(posedge clk) - begin : firstbe_reg_proc - if (rst) - begin - firstbe <= {(DATAWIDTH/8){1'b1}} ; - end - else - begin - if (lsm_r == LSM_DES2 | lsm_r == LSM_DES3) - begin - case (DATAWIDTH) - 8 : - begin - firstbe <= 1'b1 ; - end - 16 : - begin - if (dataimax_r[0]) - begin - firstbe <= 2'b10 ; - end - else - begin - firstbe <= 2'b11 ; - end - end - default : - begin - case (dataimax_r10) - 2'b00 : - begin - firstbe <= 4'b1111 ; - end - 2'b01 : - begin - firstbe <= 4'b1110 ; - end - 2'b10 : - begin - firstbe <= 4'b1100 ; - end - default : - begin - firstbe <= 4'b1000 ; - end - endcase - end - endcase - end - end - end - - always @(posedge clk) - begin : lastbe_reg_proc - if (rst) - begin - lastbe <= {(DATAWIDTH/8){1'b1}} ; - end - else - begin - if (lsm_r == LSM_DES2 | lsm_r == LSM_DES3) - begin - case (DATAWIDTH) - 8 : - begin - lastbe <= 1'b1 ; - end - 16 : - begin - if ((!(dataimax_r[0]) & !(bs_c[0])) | - ((dataimax_r[0]) & (bs_c[0]))) - begin - lastbe <= 2'b11 ; - end - else - begin - lastbe <= 2'b01 ; - end - end - default : - begin - case (dataimax_r10) - 2'b00 : - begin - case (bs_c10) - 2'b00 : - begin - lastbe <= 4'b1111 ; - end - 2'b01 : - begin - lastbe <= 4'b0001 ; - end - 2'b10 : - begin - lastbe <= 4'b0011 ; - end - default : - begin - lastbe <= 4'b0111 ; - end - endcase - end - 2'b01 : - begin - case (bs_c10) - 2'b00 : - begin - lastbe <= 4'b0001 ; - end - 2'b01 : - begin - lastbe <= 4'b0011 ; - end - 2'b10 : - begin - lastbe <= 4'b0111 ; - end - default : - begin - lastbe <= 4'b1111 ; - end - endcase - end - 2'b10 : - begin - case (bs_c10) - 2'b00 : - begin - lastbe <= 4'b0011 ; - end - 2'b01 : - begin - lastbe <= 4'b0111 ; - end - 2'b10 : - begin - lastbe <= 4'b1111 ; - end - default : - begin - lastbe <= 4'b0001 ; - end - endcase - end - default : - begin - case (bs_c10) - 2'b00 : - begin - lastbe <= 4'b0111 ; - end - 2'b01 : - begin - lastbe <= 4'b1111 ; - end - 2'b10 : - begin - lastbe <= 4'b0001 ; - end - default : - begin - lastbe <= 4'b0011 ; - end - endcase - end - endcase - end - endcase - end - end - end - - always @(posedge clk) - begin : tfwe_reg_proc - if (rst) - begin - ififowe <= 1'b0 ; - end - else - begin - if (((DATAWIDTH == 8 & buflev_c >= 4'b0001 & bufwe) | - (DATAWIDTH ==16 & buflev_c >= 4'b0010 & bufwe) | - (DATAWIDTH ==32 & buflev_c >= 4'b0100 & bufwe) | - (buflev_c != 4'b0000 & lsm == LSM_NXT & - (csm == CSM_L | csm == CSM_FL))) & fifonf) - begin - ififowe <= 1'b1 ; - end - else - begin - ififowe <= 1'b0 ; - end - end - end - - assign fifoeof = ((csm == CSM_L | csm == CSM_FL) & - lsm == LSM_NXT & lsmcnt == 3'b001) ? 1'b1 : 1'b0 ; - - assign fifowe = ififowe ; - - assign firstb_c = (bufwe) ? 1'b0 : - (lsm == LSM_DES2 | lsm == LSM_DES3) ? 1'b1 : - firstb ; - - always @(firstb or firstbe or lastbe or dmaeob or lastdma) - begin : be_proc - if (dmaeob & lastdma) - begin - be <= lastbe ; - end - else if (firstb) - begin - be <= firstbe ; - end - else - begin - be <= {(DATAWIDTH/8){1'b1}} ; - end - end - - always @(be or be30 or dmadatai_max) - begin : tbuf0_proc - reg[15:0] buf0_16; - reg[31:0] buf0_32; - buf0_c <= {DATAWIDTH{1'b0}} ; - case (DATAWIDTH) - 8 : - begin - buf0_c <= dmadatai_max[7:0]; - end - 16 : - begin - buf0_16 = {16{1'b0}}; - if (be == 2'b10) - begin - buf0_16[7:0] = dmadatai_max[15:8]; - end - else - begin - buf0_16 = dmadatai_max[15:0]; - end - buf0_c <= buf0_16 ; - end - default : - begin - buf0_32 = {32{1'b0}}; - case (be30) - 4'b1110 : - begin - buf0_32[23:0] = dmadatai_max[31:8]; - end - 4'b1100 : - begin - buf0_32[15:0] = dmadatai_max[31:16]; - end - 4'b1000 : - begin - buf0_32[7:0] = dmadatai_max[31:24]; - end - default : - begin - buf0_32 = dmadatai_max[31:0]; - end - endcase - buf0_c <= buf0_32 ; - end - endcase - end - - always @(buflev or buf_r_max or buf0_c or bufwe or ififowe) - begin : tbuf_proc - reg[23:0] buf_16; - reg[55:0] buf_32; - case (DATAWIDTH) - 8 : - begin - buf_c <= buf0_c ; - end - 16 : - begin - buf_16 = buf_r_max[DATAWIDTH * 2 - 9:0]; - if (bufwe) - begin - case (buflev) - 4'b0000 : - begin - buf_16[15:0] = buf0_c; - end - 4'b0001 : - begin - buf_16[23:8] = buf0_c; - end - 4'b0010 : - begin - buf_16[15:0] = buf0_c; - end - default : - begin - buf_16[23:8] = buf0_c; - buf_16[7:0] = buf_r_max[23:16]; - end - endcase - end - else if (ififowe) - begin - buf_16 = {buf_r_max[23:8], buf_r_max[23:16]}; - end - buf_c <= buf_16 ; - end - default : - begin - buf_32 = buf_r_max[DATAWIDTH * 2 - 9:0]; - if (bufwe) - begin - case (buflev) - 4'b0000 : - begin - buf_32[31:0] = buf0_c; - end - 4'b0001 : - begin - buf_32[39:8] = buf0_c; - end - 4'b0010 : - begin - buf_32[47:16] = buf0_c; - end - 4'b0011 : - begin - buf_32[55:24] = buf0_c; - end - 4'b0100 : - begin - buf_32[31:0] = buf0_c; - end - 4'b0101 : - begin - buf_32[39:8] = buf0_c; - buf_32[7:0] = buf_r_max[39:32]; - end - 4'b0110 : - begin - buf_32[47:16] = buf0_c; - buf_32[15:0] = buf_r_max[47:32]; - end - default : - begin - buf_32[55:24] = buf0_c; - buf_32[23:0] = buf_r_max[55:32]; - end - endcase - end - else if (ififowe) - begin - buf_32 = {buf_r_max[55:24], buf_r_max[55:32]}; - end - buf_c <= buf_32 ; - end - endcase - end - - assign bufwe = (dmaack & !set & fifonf & !tsprog & - (lsm == LSM_BUF1 | lsm == LSM_BUF2)) ? 1'b1 : 1'b0 ; - - assign fifodata = buf_r_max[DATAWIDTH - 1:0] ; - - assign be10 = (DATAWIDTH == 16) ? be : {2{1'b1}} ; - - assign be30 = (DATAWIDTH == 32) ? be : {4{1'b1}} ; - - always @(be10 or be30) - begin : addv_proc - case (DATAWIDTH) - 8 : - begin - addv_c <= 4'b0000 ; - end - 16 : - begin - case (be10) - 2'b01, 2'b10 : - begin - addv_c <= 4'b0001 ; - end - default : - begin - addv_c <= 4'b0010 ; - end - endcase - end - default : - begin - case (be30) - 4'b0001, 4'b1000 : - begin - addv_c <= 4'b0001 ; - end - 4'b0011, 4'b1100 : - begin - addv_c <= 4'b0010 ; - end - 4'b0111, 4'b1110 : - begin - addv_c <= 4'b0011 ; - end - default : - begin - addv_c <= 4'b0100 ; - end - endcase - end - endcase - end - - always @(buflev or bufwe or ififowe or addv_c) - begin : buflev_proc - case (DATAWIDTH) - 8 : - begin - if (bufwe) - begin - buflev_c <= 4'b0001 ; - end - else if (ififowe) - begin - buflev_c <= 4'b0000 ; - end - else - begin - buflev_c <= buflev ; - end - end - 16 : - begin - if (bufwe) - begin - buflev_c <= ({buflev[3:2], 1'b0, buflev[0]}) + addv_c ; - end - else if (ififowe & (buflev[1])) - begin - buflev_c <= {buflev[3:2], 1'b0, buflev[0]} ; - end - else if (ififowe & !(buflev[1])) - begin - buflev_c <= {buflev[3:1], 1'b0} ; - end - else - begin - buflev_c <= buflev ; - end - end - default : - begin - if (bufwe) - begin - buflev_c <= ({buflev[3:3], 1'b0, buflev[1:0]}) + addv_c ; - end - else if (ififowe & (buflev[2])) - begin - buflev_c <= {buflev[3:3], 1'b0, buflev[1:0]} ; - end - else if (ififowe & !(buflev[2])) - begin - buflev_c <= {buflev[3:2], 2'b00} ; - end - else - begin - buflev_c <= buflev ; - end - end - endcase - end - - always @(posedge clk) - begin : buf_reg_proc - if (rst) - begin - buflev <= {4{1'b0}} ; - firstb <= 1'b1 ; - buf_r <= {(DATAWIDTH*2){1'b0}} ; - end - else - begin - buflev <= buflev_c ; - firstb <= firstb_c ; - buf_r <= buf_c ; - end - end - - always @(posedge clk) - begin : lbe_reg_proc - if (rst) - begin - fifobe <= {(DATAWIDTH/8){1'b1}} ; - end - else - begin - if (ififowe) - begin - case (DATAWIDTH) - 8 : - begin - fifobe <= 1'b1 ; - end - 16 : - begin - case (buflev) - 4'b0001 : - begin - fifobe <= 2'b01 ; - end - default : - begin - fifobe <= 2'b11 ; - end - endcase - end - default : - begin - case (buflev) - 4'b0001 : - begin - fifobe <= 4'b0001 ; - end - 4'b0010 : - begin - fifobe <= 4'b0011 ; - end - 4'b0011 : - begin - fifobe <= 4'b0111 ; - end - default : - begin - fifobe <= 4'b1111 ; - end - endcase - end - endcase - end - end - end - - assign es_c = ur | lc | lo | nc | ec ; - - assign tstat = {1'b0, TDES0_RV[30:16], - es_c, TDES0_RV[14:12], lo, nc, lc, - ec, TDES0_RV[7], - cc, TDES0_RV[2], ur, de}; - - assign datao32 = (tsprog) ? tstat : (set) ? SET0_RV : TDES0_RV ; - - always @(posedge clk) - begin : dataimax_reg_proc - if (rst) - begin - dataimax_r <= {DATADEPTH_MAX{1'b1}} ; - end - else - begin - case (DATAWIDTH) - 8 : - begin - case (dmaaddr20) - 3'b000, 3'b100 : - begin - dataimax_r[7:0] <= dmadatai_max[DATAWIDTH-1:0] ; - end - 3'b001, 3'b101 : - begin - dataimax_r[15:8] <= dmadatai_max[DATAWIDTH-1:0] ; - end - 3'b010, 3'b110 : - begin - dataimax_r[23:16] <= dmadatai_max[DATAWIDTH-1:0] ; - end - default : - begin - dataimax_r[31:24] <= dmadatai_max[DATAWIDTH-1:0] ; - end - endcase - end - 16 : - begin - if (!(dmaaddr[1])) - begin - dataimax_r[15:0] <= dmadatai_max[DATAWIDTH-1:0] ; - end - else - begin - dataimax_r[31:16] <= dmadatai_max[DATAWIDTH-1:0] ; - end - end - default : - begin - dataimax_r <= dmadatai_max[31:0] ; - end - endcase - end - end - - always @(datao32 or dmaaddr) - begin : datao_proc - reg[1:0] addr10; - addr10 = dmaaddr[1:0]; - case (DATAWIDTH) - 8 : - begin - case (addr10) - 2'b00 : - begin - dmadatao <= datao32[7:0] ; - end - 2'b01 : - begin - dmadatao <= datao32[15:8] ; - end - 2'b10 : - begin - dmadatao <= datao32[23:16] ; - end - default : - begin - dmadatao <= datao32[31:24] ; - end - endcase - end - 16 : - begin - if (!(addr10[1])) - begin - dmadatao <= datao32[15:0] ; - end - else - begin - dmadatao <= datao32[31:16] ; - end - end - default : - begin - dmadatao <= datao32 ; - end - endcase - end - - assign flmax_sub = fzero_max[FIFODEPTH - 1:0] - 1 - fifolev ; - - assign flmax = {fzero_max[FIFODEPTH_MAX - 1:FIFODEPTH], - flmax_sub} ; - - assign blmax = {fzero_max[FIFODEPTH_MAX - 1:6], pbl} ; - - assign bsmax = (DATAWIDTH == 8) ? {fzero_max[FIFODEPTH_MAX - 1:12], - bcnt} : - (DATAWIDTH ==16) ? {fzero_max[FIFODEPTH_MAX - 1:11], - bcnt[11:1]} : - {fzero_max[FIFODEPTH_MAX - 1:10], - bcnt[11:2]} ; - - always @(posedge clk) - begin : fifolev_reg_proc - if (rst) - begin - fl_g_bs <= 1'b0 ; - fl_g_bl <= 1'b0 ; - bl_g_bs <= 1'b0 ; - pblz <= 1'b0 ; - end - else - begin - if (flmax >= bsmax) - begin - fl_g_bs <= 1'b1 ; - end - else - begin - fl_g_bs <= 1'b0 ; - end - - if (flmax >= blmax) - begin - fl_g_bl <= 1'b1 ; - end - else - begin - fl_g_bl <= 1'b0 ; - end - - if (blmax >= bsmax) - begin - bl_g_bs <= 1'b1 ; - end - else - begin - bl_g_bs <= 1'b0 ; - end - - if (pbl == 6'b000000) - begin - pblz <= 1'b1 ; - end - else - begin - pblz <= 1'b0 ; - end - end - end - - always @(csm or - lsm or - pblz or - tsprog or - fl_g_bs or - fl_g_bl or - bl_g_bs or - blmax or - bsmax or - flmax or - fzero_max or - buffetch or - dmacnt_r) - begin : dmacnt_proc - if (lsm == LSM_DES0 | - lsm == LSM_DES1 | - lsm == LSM_DES2 | - lsm == LSM_DES3 | - lsm == LSM_STAT | tsprog) - begin - case (DATAWIDTH) - 8 : - begin - dmacnt_c <= {fzero_max[FIFODEPTH_MAX - 1:3], 3'b100} ; - end - 16 : - begin - dmacnt_c <= {fzero_max[FIFODEPTH_MAX - 1:3], 3'b010} ; - end - default : - begin - dmacnt_c <= {fzero_max[FIFODEPTH_MAX - 1:3], 3'b001} ; - end - endcase - end - else if(!buffetch) - begin - if (pblz) - begin - if (fl_g_bs | csm == CSM_SET) - begin - dmacnt_c <= bsmax ; - end - else - begin - dmacnt_c <= flmax ; - end - end - else - begin - if (fl_g_bl | csm == CSM_SET) - begin - if (bl_g_bs) - begin - dmacnt_c <= bsmax ; - end - else - begin - dmacnt_c <= blmax ; - end - end - else - begin - if (fl_g_bs) - begin - dmacnt_c <= bsmax ; - end - else - begin - dmacnt_c <= flmax ; - end - end - end - end - else - begin - dmacnt_c <= dmacnt_r; - end - end - - always @(posedge clk) - begin : dmacnt_reg_proc - if (rst) - begin - dmacnt_r <= {FIFODEPTH_MAX{1'b0}}; - end - else - begin - dmacnt_r <= dmacnt_c; - end - end - - assign dmacnt = dmacnt_c; - - always @(posedge clk) - begin : lastdma_reg_proc - if (rst) - begin - lastdma <= 1'b1 ; - end - else - begin - if (lsm == LSM_DES0 | - lsm == LSM_DES1 | - lsm == LSM_DES2 | - lsm == LSM_DES3 | - lsm == LSM_STAT | tsprog) - begin - lastdma <= 1'b1 ; - end - else if (!buffetch) - begin - if (pblz) - begin - if (fl_g_bs | csm == CSM_SET) - begin - lastdma <= 1'b1 ; - end - else - begin - lastdma <= 1'b0 ; - end - end - else - begin - if (fl_g_bl | csm == CSM_SET) - begin - if (bl_g_bs) - begin - lastdma <= 1'b1 ; - end - else - begin - lastdma <= 1'b0 ; - end - end - else - begin - if (fl_g_bs) - begin - lastdma <= 1'b1 ; - end - else - begin - lastdma <= 1'b0 ; - end - end - end - end - end - end - - always @(tsprog or lsm or statadi or bad or dad or statad) - begin : dmaaddro_proc - if (tsprog) - begin - dmaaddro <= statadi ; - end - else - begin - case (lsm) - LSM_BUF1, LSM_BUF2 : - begin - dmaaddro <= bad ; - end - LSM_STAT : - begin - dmaaddro <= statad ; - end - default : - begin - dmaaddro <= dad ; - end - endcase - end - end - - always @(req or - dmaack or - dmaeob or - lsm or - tsprog or - fifoval or - req_r) - begin : req_proc - case (lsm) - LSM_BUF1, LSM_BUF2 : - begin - if (dmaack & dmaeob) - begin - req_c <= 1'b0 ; - end - else if ((fifoval & req_r == 3'b000) | tsprog) - begin - req_c <= 1'b1 ; - end - else - begin - req_c <= req ; - end - end - LSM_DES0, LSM_DES1, LSM_DES2, LSM_DES3, LSM_STAT : - begin - if (dmaack) - begin - req_c <= 1'b0 ; - end - else - begin - req_c <= 1'b1 ; - end - end - default : - begin - if (dmaack) - begin - req_c <= 1'b0 ; - end - else if (tsprog) - begin - req_c <= 1'b1 ; - end - else - begin - req_c <= 1'b0 ; - end - end - endcase - end - - always @(posedge clk) - begin : req_reg_proc - if (rst) - begin - req <= 1'b0 ; - req_r <= {3{1'b0 }}; - dmaack_r <= 1'b0 ; - end - else - begin - req <= req_c ; - req_r[0] <= req; - req_r[1] <= req_r[0]; - req_r[2] <= req_r[1]; - dmaack_r <= dmaack & dmaeob ; - end - end - - assign dmawr = (tsprog | lsm == LSM_STAT) ? 1'b1 : 1'b0 ; - - assign dmareq = req ; - - always @(posedge clk) - begin : stat_reg_proc - if (rst) - begin - des <= 1'b0 ; - fbuf <= 1'b0 ; - stat <= 1'b0 ; - tsprog <= 1'b0 ; - buffetch <= 1'b0 ; - tu <= 1'b0 ; - end - else - begin - if (lsm == LSM_DES0 | - lsm == LSM_DES1 | - lsm == LSM_DES2 | - lsm == LSM_DES3) - begin - des <= 1'b1 ; - end - else - begin - des <= 1'b0 ; - end - - if (lsm == LSM_BUF1 | lsm == LSM_BUF2) - begin - fbuf <= 1'b1 ; - end - else - begin - fbuf <= 1'b0 ; - end - - if (tsprog) - begin - stat <= 1'b1 ; - end - else - begin - stat <= 1'b0 ; - end - - if ((dmaeob & dmaack) | itcomp | tcompack_r) - begin - tsprog <= 1'b0 ; - end - else if (csne & !idmareq & !icachere) - begin - tsprog <= 1'b1 ; - end - - if (dmaack_r) - begin - buffetch <= 1'b0 ; - end - else if (req_r[0] & (lsm == LSM_BUF1 | lsm == LSM_BUF2)) - begin - buffetch <= 1'b1 ; - end - - if (lsm == LSM_IDLE & !own) - begin - tu <= 1'b1 ; - end - else if (own_c) - begin - tu <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : tcompack_reg_proc - if (rst) - begin - tcompack_r <= 1'b0 ; - itcomp <= 1'b0 ; - end - else - begin - tcompack_r <= tcompack ; - - if (tsprog & dmaeob & dmaack) - begin - itcomp <= 1'b1 ; - end - else if (tcompack_r) - begin - itcomp <= 1'b0 ; - end - end - end - - assign tcomp = itcomp ; - - always @(posedge clk) - begin : setp_reg_proc - if (rst) - begin - setp <= 1'b0 ; - end - else - begin - if (csm == CSM_SET) - begin - setp <= 1'b1 ; - end - else - begin - setp <= 1'b0 ; - end - end - end - - always @(posedge clk) - begin : ifaddr_reg_proc - if (rst) - begin - ifaddr <= {ADDRDEPTH{1'b0}} ; - end - else - begin - if (csm == CSM_IDLE) - begin - ifaddr <= {ADDRDEPTH{1'b0}} ; - end - else if (ifwe) - begin - ifaddr <= ifaddr + 1 ; - end - end - end - - always @(posedge clk) - begin : ifwe_reg_proc - if (rst) - begin - ifwe <= 1'b0 ; - end - else - begin - case (DATAWIDTH) - 8 : - begin - if (csm == CSM_SET & - dmaack & - dmaaddr[1:0] == 2'b11 & - lsm == LSM_BUF1) - begin - ifwe <= 1'b1 ; - end - else - begin - ifwe <= 1'b0 ; - end - end - 16 : - begin - if (csm == CSM_SET & - dmaack & - dmaaddr[1] & - lsm == LSM_BUF1) - begin - ifwe <= 1'b1 ; - end - else - begin - ifwe <= 1'b0 ; - end - end - default : - begin - if (csm == CSM_SET & dmaack & - lsm == LSM_BUF1) - begin - ifwe <= 1'b1 ; - end - else - begin - ifwe <= 1'b0 ; - end - end - endcase - end - end - - assign faddr = ifaddr ; - - assign fwe = ifwe ; - - assign fdata = dataimax_r[15:0] ; - - always @(posedge clk) - begin : stop_reg_proc - if (rst) - begin - stop_r <= 1'b1 ; - stopo <= 1'b1 ; - end - else - begin - stop_r <= stopi ; - - if (lsm == LSM_IDLE & stop_r) - begin - stopo <= 1'b1 ; - end - else - begin - stopo <= 1'b0 ; - end - end - end - - assign fzero_max = {FIFODEPTH_MAX{1'b0}} ; - - assign dzero_max = {DATAWIDTH_MAX{1'b0}} ; - - assign bufzero_max = {(DATAWIDTH_MAX * 2 - 9){1'b0}} ; - - assign dmaaddr20 = dmaaddr[2:0] ; - - assign dmadatai_max = {dzero_max[DATAWIDTH_MAX+1:DATAWIDTH], - dmadatai}; - - assign buf_r_max = {bufzero_max[DATAWIDTH_MAX * 2 - 7: - DATAWIDTH * 2 - 8], - buf_r}; - -endmodule - diff --git a/resources/soc/simu/testbench/vmac/ram.vlog b/resources/soc/simu/testbench/vmac/ram.vlog deleted file mode 100644 index 8722327..0000000 --- a/resources/soc/simu/testbench/vmac/ram.vlog +++ /dev/null @@ -1,22018 +0,0 @@ -@400 -80000000 -61000100 -00002000 -00001080 - -@420 -80000000 -61000100 -00003000 -00001000 - -@440 -80000000 -00000100 -00004000 -00000000 - -@800 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -43224355 -54245245 -67654766 -43524524 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -43524524 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -45657478 -09979866 -32413141 -34134324 -32434123 -54356455 -65436554 -67467565 -78578578 -78568783 -32432434 -54665867 -12113233 -45256475 -56748678 -56435355 -63543565 -67465765 -12313133 -54654563 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -34234254 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -32154254 -42543523 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -32410987 -21543243 -65745623 -12342342 -24132123 -01234567 -01234567 -89a0cdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 -89abcdef -01234567 diff --git a/resources/soc/simu/testbench/vmac/virtual_mac.v b/resources/soc/simu/testbench/vmac/virtual_mac.v deleted file mode 100644 index f913c52..0000000 --- a/resources/soc/simu/testbench/vmac/virtual_mac.v +++ /dev/null @@ -1,406 +0,0 @@ -/*------------------------------------------------------------------------------ --------------------------------------------------------------------------------- -Copyright (c) 2016, Loongson Technology Corporation Limited. - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. - -3. Neither the name of Loongson Technology Corporation Limited nor the names of -its contributors may be used to endorse or promote products derived from this -software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL LOONGSON TECHNOLOGY CORPORATION LIMITED BE LIABLE -TO ANY PARTY FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ - -`timescale 1ns/1ps -`define IO_DELAY 2.5 - -module virtual_mac( - hclk, hrst_n, - mtxclk, mtxen, mtxd, mtxerr, - mrxclk, mrxdv, mrxd, mrxerr, - mcoll, mcrs, - mdc, md_io, - gpio); - -input hclk, hrst_n; -input mtxclk; -output [3:0] mtxd; -output mtxen; -output mtxerr; - -input mrxclk; -input [3:0] mrxd; -input mrxdv; -input mrxerr; - -input mcoll; -input mcrs; - -inout md_io; -output mdc; - -input gpio; - -wire md_oe, md_o; -wire mdio = md_oe ? md_o : 1'bz; -wire md_i = mdio; - -wire [1:0] v_htrans; -wire [2:0] v_hburst; -wire [31:0] v_haddr; -wire v_hwrite; -wire [2:0] v_hsize; -wire [31:0] v_hrdata; -wire [31:0] v_hwdata; -wire v_hrdy; -wire [1:0] v_hresp = 2'b0; - -wire m_hreq, m_hlock, m_hgnt; -wire [1:0] m_htrans; -wire [2:0] m_hburst; -wire [31:0] m_haddr; -wire m_hwrite; -wire [2:0] m_hsize; -wire [3:0] m_hprot; -wire [31:0] m_hwdata; - -wire s_hsel, s_hrdy; -wire [1:0] s_hresp; -wire [15:0] s_hsplit; -wire [31:0] s_hrdata; - -wire read_complete; -assign m_hgnt = ~s_hsel; -reg grant_dly; -always @(posedge hclk) - grant_dly <= m_hgnt & m_hreq; - -wire [3:0] mtxd_mid; -wire mtxen_mid; -wire mtxerr_mid; -wire mdc_mid; -assign #`IO_DELAY mtxd = mtxd_mid; -assign #`IO_DELAY mtxen = mtxen_mid; -assign #`IO_DELAY mtxerr = mtxerr_mid; -assign #`IO_DELAY mdc = mdc_mid; -vMAC_TOP virtual_core -( - .hclk(hclk), .hrst_(hrst_n), .SYS_RST_(hrst_n), - - .hmst(4'b1), .hmstlock(1'b0), - .htrans(v_htrans), .hburst(v_hburst), .haddr(v_haddr), - .hwrite(v_hwrite), .hsize(v_hsize), - .hrdata(v_hrdata), .hwdata(v_hwdata), .hrdy(v_hrdy), .hresp(v_hresp), - .eth_hreq(m_hreq), .eth_hlock(m_hlock), .eth_hgnt(m_hgnt), - .eth_htrans(m_htrans), .eth_hburst(m_hburst), .eth_haddr(m_haddr), - .eth_hwrite(m_hwrite), .eth_hsize(m_hsize), .eth_hprot(m_hprot), - .eth_hwdata(m_hwdata), - .eth_hsel(s_hsel), .eth_hrdy(s_hrdy), .eth_hresp(s_hresp), .eth_hsplit(s_hsplit), - .eth_hrdata(s_hrdata), - - .interrupt(), - .mtxclk(mtxclk), .mtxen(mtxen_mid), .mtxd(mtxd_mid), .mtxerr(mtxerr_mid), - .mrxclk(mrxclk), .mrxdv(mrxdv), .mrxd(mrxd), .mrxerr(mrxerr), - .mcoll(mcoll), .mcrs(mcrs), - .mdc(mdc_mid), .md_i(md_i), .md_o(md_o), .md_oe(md_oe), - - .bist_mode(1'b0) - ); - -virtual_mac_slave virtual_mac_slave_0( - .hclk(hclk), .hrst_n(hrst_n), - .hreq(m_hreq), .hlock(m_hlock), .hgnt(m_hgnt), .hrdy(v_hrdy), - .htrans(m_htrans), .hburst(m_hburst), .haddr(m_haddr), .hrdata(v_hrdata), - .hwrite(m_hwrite), .hsize(m_hsize), .hprot(m_hprot), .hwdata(m_hwdata), .read_complete(read_complete)); - -virtual_mac_master virtual_mac_master_0( - .hclk(hclk), .hrst_n(hrst_n), .grant_dly(grant_dly), - .hsel(s_hsel), .htrans(v_htrans), .hburst(v_hburst), .hsize(v_hsize), .hrdy(s_hrdy), - .hwrite(v_hwrite), .hrdata(s_hrdata), .hwdata(v_hwdata), .haddr(v_haddr), .hprot(), .read_complete(read_complete), - .gpio(gpio)); -endmodule - -module virtual_mac_slave( - hclk, hrst_n, - hreq, hlock, hgnt, hrdy, - htrans, hburst, haddr, hrdata, - hwrite, hsize, hprot, hwdata, read_complete); -input hclk, hrst_n; -input hreq, hlock, hgnt; -input [1:0] htrans; -input [2:0] hburst; -input [31:0] haddr; -output[31:0] hrdata; -input hwrite; -input [2:0] hsize; -input [3:0] hprot; -input [31:0] hwdata; -output hrdy; -input read_complete; - -wire hrdy = 1'b1; -wire s_command = (htrans[1] == 1'b1) & hrdy; - - -reg [31:0] MEM_in[1048575:0]; -reg [31:0] MEM_out[1048575:0]; -reg reg_enable; -wire s_end = hrdy & reg_enable; -always @(posedge hclk) - if (~hrst_n) - reg_enable <= 1'b0; - else if (s_command) - reg_enable <= 1'b1; - else if (s_end) - reg_enable <= 1'b0; - -reg reg_we; -always @(posedge hclk) - if (~hrst_n) - reg_we <= 1'b0; - else if (s_command) - reg_we <= hwrite; - else if (s_end) - reg_we <= 1'b0; - -reg [31:0] reg_addr; -always @(posedge hclk) - if (~hrst_n) - reg_addr <= 31'b0; - else if (s_command) - reg_addr <= {2'b00,haddr[31:2]}; - -integer i; -`ifdef VIRTUAL_MAC -initial -begin - for (i = 0 ;i <1048576; i = i+1) MEM_out[i] = 32'b0; - #100; - $readmemh("../../testbench/vmac/ram.vlog", MEM_out); - $display("[%t]:)[virtual_mac]:reading ../../testbench/vmac/ram.vlog",$time); - $display("DEBUG: MEM_out[32'h1040]=%h, MEM_out[32'h840]=%h", MEM_out[32'h1040], MEM_out[32'h840]); -end -`endif - -initial -begin - @(posedge read_complete); - for (i= 0; i < 32'h40; i= i+1) - if (MEM_out[i+32'h800] != MEM_out[i+32'h1000]) - $display("[%t]:[virtual_mac]:error data, MEM_out[%h] = %h, correct is %h",$time, i, MEM_out[i+32'h1000], MEM_out[i+32'h800]); - else - $display("data, MEM_out[%h] = %h", i, MEM_out[i+32'h1000]); -`ifdef MAC_DEBUG - $display("[%t]:[virtual_mac]:valuation complete",$time); -`endif -end - -reg flag; -initial - begin - flag = 1'b0; - end - -always @(posedge hclk) - if (hrst_n & reg_we & s_end) - begin - MEM_out[reg_addr] <= hwdata; - if (reg_addr==32'h1040) flag = 1'b1; - end - -assign hrdata = (reg_addr == 32'h400 |reg_addr == 32'h420)? 32'h80000000: MEM_out[reg_addr]; - -endmodule - -module virtual_mac_master( - hclk, hrst_n, grant_dly, - hsel, htrans, hburst, hsize, hrdy, - hwrite, hrdata, hwdata, haddr, hprot, read_complete, - gpio); -input hclk, hrst_n; -input grant_dly; -output hsel; -output [1:0] htrans; -output [2:0] hburst; -output [2:0] hsize; -input hrdy; -output hwrite; -input [31:0] hrdata; -output [31:0] hwdata; -output [31:0] haddr; -output [3:0] hprot; -output read_complete; -input gpio; - -reg ready; -reg hsel; -reg [1:0] htrans; -reg [2:0] hburst; -reg [2:0] hsize; -reg hwrite; -reg [31:0] hwdata; -reg [31:0] haddr; -reg [3:0] hprot; - -reg read_complete; - -`ifdef MAC_DEBUG -wire debug = 1; -`else -wire debug = 0; -`endif - -initial begin - -htrans = 2'b00; -haddr = 2'b00; -hburst = 3'b00; -hwrite = 1'b0; -hsize = 3'b000; -hwdata = 32'b0; -hsel = 1'b0; -hprot = 4'b0; - -read_complete = 1'b0; - -ready = 1'b0; - -`ifdef VIRTUAL_MAC -@(posedge hrst_n); - -wait(gpio); - -@(posedge hclk) - -if (debug) $display("[%t]:[virtual_mac]:start transmit process ",$time); -while (grant_dly) @(posedge hclk); -one_write(32'h00,32'h0000, 2); - -while (grant_dly) @(posedge hclk); -one_write(32'h20,32'h1000, 2); - -while (grant_dly) @(posedge hclk); -one_write(32'h18,32'h1100, 2); - -while (grant_dly) @(posedge hclk); -one_write(32'h30,32'h40002002, 2); - -@(posedge hclk) - -while (grant_dly) @(posedge hclk); -one_read(32'h28,2); -while (hrdata[6]==0) -begin - while (grant_dly) @(posedge hclk); - one_read(32'h28,2); - repeat(10)@(posedge hclk); - #3; -end -read_complete = 1'b1; - -if (debug) $display("[%t]:[virtual_mac]:receive process complete",$time); - -`endif -end - - -task one_write; -input [11:0] addr; -input [31:0] wdata; -input [2:0] size; -begin -if (debug) $display("[%t]:[virtual_mac]: write address phase begin: haddr = %x",$time, addr); -htrans = 2'b10; -haddr = addr; -hburst = 3'b00; -hwrite = 1'b1; -hsize = size; -hsel = 1'b1; -ready = 1'b0; - -@(posedge hclk); - if( hrdy == 1'b1) ready = 1'b1; -while (ready != 1'b1) -begin - @(posedge hclk); - if( hrdy == 1'b1) ready = 1'b1; - #3; -end -ready = 1'b0; - -if (debug) $display("[%t]:[virtual_mac]: write data phase begin: haddr = %x", $time, addr); - -hwdata = wdata; -hsel = 1'b0; -htrans = 2'b00; -@(posedge hclk); - if( hrdy == 1'b1) ready = 1'b1; -while (ready != 1'b1) -begin - @(posedge hclk); - if( hrdy == 1'b1) ready = 1'b1; - #3; -end -ready = 1'b0; - -if (debug) $display("[%t]:[virtual_mac]: write complete!!!", $time); -end -endtask - -task one_read; -input [11:0] addr; -input [2:0] size; -begin -htrans = 2'b10; -haddr = addr; -hburst = 3'b00; -hwrite = 1'b0; -hsize = size; -hsel = 1'b1; - - -@(posedge hclk); - if( hrdy == 1'b1) ready = 1'b1; -while (ready != 1'b1) -begin - @(posedge hclk); - if( hrdy == 1'b1) ready = 1'b1; - #3; -end -ready = 1'b0; - -htrans = 2'b00; - -hsel = 1'b0; -@(posedge hclk); - if( hrdy == 1'b1) ready = 1'b1; -while (ready != 1'b1) -begin - @(posedge hclk); - if( hrdy == 1'b1) ready = 1'b1; -end -ready = 1'b0; -end -endtask - -endmodule diff --git a/resources/soc/vivado_xpr/project_1/project_1/project_1.xpr b/resources/soc/vivado_xpr/project_1/project_1/project_1.xpr deleted file mode 100644 index cea8981..0000000 --- a/resources/soc/vivado_xpr/project_1/project_1/project_1.xpr +++ /dev/null @@ -1,1154 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Vivado Synthesis Defaults - - - - - - - - - - - - Vivado Synthesis Defaults - - - - - - - - - - - - Vivado Synthesis Defaults - - - - - - - - - - - - Vivado Synthesis Defaults - - - - - - - - - - - - Vivado Synthesis Defaults - - - - - - - - - - - - Vivado Synthesis Defaults - - - - - - - - - - - - Vivado Synthesis Defaults - - - - - - - - - - - - Vivado Synthesis Defaults - - - - - - - - - - - - Vivado Synthesis Defaults - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Default settings for Implementation. - - - - - - - - - - - - - - - - - - - Default settings for Implementation. - - - - - - - - - - - - - - - - - - - Default settings for Implementation. - - - - - - - - - - - - - - - - - - - Default settings for Implementation. - - - - - - - - - - - - - - - - - - - Default settings for Implementation. - - - - - - - - - - - - - - - - - - - Default settings for Implementation. - - - - - - - - - - - - - - - - - - - Default settings for Implementation. - - - - - - - - - - - - - - - - - - - Default settings for Implementation. - - - - - - - - - - - - - - - - - - - Default settings for Implementation. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - default_dashboard - - - diff --git a/resources/soc/vivado_xpr/project_1/xilinx_ip/axi_interconnect_0/axi_interconnect_0.xci b/resources/soc/vivado_xpr/project_1/xilinx_ip/axi_interconnect_0/axi_interconnect_0.xci deleted file mode 100644 index c3afcac..0000000 --- a/resources/soc/vivado_xpr/project_1/xilinx_ip/axi_interconnect_0/axi_interconnect_0.xci +++ /dev/null @@ -1,1520 +0,0 @@ - - - xilinx.com - xci - unknown - 1.0 - - - axi_interconnect_0 - - - 32 - 0 - 0 - 0 - - 32 - 100000000 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 8 - 0 - 256 - 2 - 1 - 2 - 1 - 0.000 - AXI4 - READ_WRITE - 0 - 0 - 1 - 0 - 0 - 32 - 0 - 0 - 0 - - 32 - 100000000 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 4 - 0 - 256 - 2 - 1 - 2 - 1 - 0.000 - AXI4 - READ_WRITE - 0 - 0 - 1 - 0 - 0 - 32 - 0 - 0 - 0 - - 32 - 100000000 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 4 - 0 - 256 - 2 - 1 - 2 - 1 - 0.000 - AXI4 - READ_WRITE - 0 - 0 - 1 - 0 - 0 - 32 - 0 - 0 - 0 - - 64 - 100000000 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 4 - 0 - 256 - 2 - 1 - 2 - 1 - 0.000 - AXI4 - READ_WRITE - 0 - 0 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 100000000 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 100000000 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 100000000 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 100000000 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 100000000 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 100000000 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 100000000 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 100000000 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 100000000 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 100000000 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 100000000 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 100000000 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 100000000 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - - - - 100000000 - 0 - 0.000 - 0 - ACTIVE_LOW - - - - 100000000 - 0 - 0.000 - - - - 100000000 - 0 - 0.000 - - - - 100000000 - 0 - 0.000 - - - - 100000000 - 0 - 0.000 - - - - 100000000 - 0 - 0.000 - - - - 100000000 - 0 - 0.000 - - - - 100000000 - 0 - 0.000 - - - - 100000000 - 0 - 0.000 - - - - 100000000 - 0 - 0.000 - - - - 100000000 - 0 - 0.000 - - - - 100000000 - 0 - 0.000 - - - - 100000000 - 0 - 0.000 - - - - 100000000 - 0 - 0.000 - - - - 100000000 - 0 - 0.000 - - - - 100000000 - 0 - 0.000 - - - - 100000000 - 0 - 0.000 - - - - 100000000 - 0 - 0.000 - 32 - artix7 - 32 - 1:1 - 32 - 0 - 0 - 512 - 8 - 1 - 0 - 512 - 8 - 3 - 1:1 - 0 - 32 - 1 - 4 - 0 - 32 - READ/WRITE - 1 - 4 - 0 - 32 - 1:1 - 0 - 32 - 1 - 2 - 0 - 32 - READ/WRITE - 1 - 2 - 0 - 32 - 1:1 - 0 - 64 - 1 - 2 - 0 - 32 - READ/WRITE - 1 - 2 - 0 - 32 - 1:1 - 0 - 32 - 0 - 1 - 0 - 0 - READ/WRITE - 0 - 1 - 0 - 0 - 1:1 - 0 - 32 - 0 - 1 - 0 - 0 - READ/WRITE - 0 - 1 - 0 - 0 - 1:1 - 0 - 32 - 0 - 1 - 0 - 0 - READ/WRITE - 0 - 1 - 0 - 0 - 1:1 - 0 - 32 - 0 - 1 - 0 - 0 - READ/WRITE - 0 - 1 - 0 - 0 - 1:1 - 0 - 32 - 0 - 1 - 0 - 0 - READ/WRITE - 0 - 1 - 0 - 0 - 1:1 - 0 - 32 - 0 - 1 - 0 - 0 - READ/WRITE - 0 - 1 - 0 - 0 - 1:1 - 0 - 32 - 0 - 1 - 0 - 0 - READ/WRITE - 0 - 1 - 0 - 0 - 1:1 - 0 - 32 - 0 - 1 - 0 - 0 - READ/WRITE - 0 - 1 - 0 - 0 - 1:1 - 0 - 32 - 0 - 1 - 0 - 0 - READ/WRITE - 0 - 1 - 0 - 0 - 1:1 - 0 - 32 - 0 - 1 - 0 - 0 - READ/WRITE - 0 - 1 - 0 - 0 - 1:1 - 0 - 32 - 0 - 1 - 0 - 0 - READ/WRITE - 0 - 1 - 0 - 0 - 1:1 - 0 - 32 - 0 - 1 - 0 - 0 - READ/WRITE - 0 - 1 - 0 - 0 - 1:1 - 0 - 32 - 0 - 1 - 0 - 0 - READ/WRITE - 0 - 1 - 0 - 0 - 2 - 4 - 4 - 0 - 32 - axi_interconnect_0 - 32 - 1:1 - 32 - 0 - 0 - 512 - 8 - 1 - 0 - 512 - 8 - 3 - 1:1 - 0 - 32 - 1 - 4 - 0 - 32 - READ/WRITE - 1 - 4 - 0 - 32 - 1:1 - 0 - 32 - 1 - 2 - 0 - 32 - READ/WRITE - 1 - 2 - 0 - 32 - 1:1 - 0 - 64 - 1 - 2 - 0 - 32 - READ/WRITE - 1 - 2 - 0 - 32 - 1:1 - 0 - 32 - 0 - 1 - 0 - 0 - READ/WRITE - 0 - 1 - 0 - 0 - 1:1 - 0 - 32 - 0 - 1 - 0 - 0 - READ/WRITE - 0 - 1 - 0 - 0 - 1:1 - 0 - 32 - 0 - 1 - 0 - 0 - READ/WRITE - 0 - 1 - 0 - 0 - 1:1 - 0 - 32 - 0 - 1 - 0 - 0 - READ/WRITE - 0 - 1 - 0 - 0 - 1:1 - 0 - 32 - 0 - 1 - 0 - 0 - READ/WRITE - 0 - 1 - 0 - 0 - 1:1 - 0 - 32 - 0 - 1 - 0 - 0 - READ/WRITE - 0 - 1 - 0 - 0 - 1:1 - 0 - 32 - 0 - 1 - 0 - 0 - READ/WRITE - 0 - 1 - 0 - 0 - 1:1 - 0 - 32 - 0 - 1 - 0 - 0 - READ/WRITE - 0 - 1 - 0 - 0 - 1:1 - 0 - 32 - 0 - 1 - 0 - 0 - READ/WRITE - 0 - 1 - 0 - 0 - 1:1 - 0 - 32 - 0 - 1 - 0 - 0 - READ/WRITE - 0 - 1 - 0 - 0 - 1:1 - 0 - 32 - 0 - 1 - 0 - 0 - READ/WRITE - 0 - 1 - 0 - 0 - 1:1 - 0 - 32 - 0 - 1 - 0 - 0 - READ/WRITE - 0 - 1 - 0 - 0 - 1:1 - 0 - 32 - 0 - 1 - 0 - 0 - READ/WRITE - 0 - 1 - 0 - 0 - 2 - 4 - artix7 - - - xc7a200t - fbg676 - VERILOG - - MIXED - -2 - - - TRUE - TRUE - IP_Flow - 17 - TRUE - . - - . - 2019.2 - OUT_OF_CONTEXT - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/soc/vivado_xpr/project_1/xilinx_ip/clk_pll_33/clk_pll_33.xci b/resources/soc/vivado_xpr/project_1/xilinx_ip/clk_pll_33/clk_pll_33.xci deleted file mode 100644 index 47f82a4..0000000 --- a/resources/soc/vivado_xpr/project_1/xilinx_ip/clk_pll_33/clk_pll_33.xci +++ /dev/null @@ -1,716 +0,0 @@ - - - xilinx.com - xci - unknown - 1.0 - - - clk_pll_33 - - - false - 100000000 - false - 100000000 - false - 100000000 - false - 100000000 - - - - 100000000 - 0 - 0.000 - - - - 100000000 - 0 - 0.000 - 1 - LEVEL_HIGH - - - - 100000000 - 0 - 0.000 - 0 - 0 - - 100000000 - 0 - 0.000 - 1 - 0 - 0 - 0 - - 1 - 100000000 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 0 - MMCM - cddcdone - cddcreq - 0000 - 0000 - clkfb_in_n - clkfb_in - clkfb_in_p - SINGLE - clkfb_out_n - clkfb_out - clkfb_out_p - clkfb_stopped - 100.0 - 100.0 - 0000 - 0000 - 33.00000 - 0000 - 0000 - 100.000 - BUFG - 50.0 - false - 33.00000 - 0.000 - 50.000 - 33.000 - 0.000 - 1 - 0000 - 0000 - 100.000 - BUFG - 50.000 - false - 100.000 - 0.000 - 50.000 - 100.000 - 0.000 - 1 - 0 - 0000 - 0000 - 100.000 - BUFG - 50.000 - false - 100.000 - 0.000 - 50.000 - 100.000 - 0.000 - 1 - 0 - 0000 - 0000 - 100.000 - BUFG - 50.000 - false - 100.000 - 0.000 - 50.000 - 100.000 - 0.000 - 1 - 0 - 0000 - 0000 - 100.000 - BUFG - 50.000 - false - 100.000 - 0.000 - 50.000 - 100.000 - 0.000 - 1 - 0 - 0000 - 0000 - 100.000 - BUFG - 50.000 - false - 100.000 - 0.000 - 50.000 - 100.000 - 0.000 - 1 - 0 - BUFG - 50.000 - false - 100.000 - 0.000 - 50.000 - 100.000 - 0.000 - 1 - 0 - VCO - clk_in_sel - clk_out1 - clk_out2 - clk_out3 - clk_out4 - clk_out5 - clk_out6 - clk_out7 - CLK_VALID - NA - daddr - dclk - den - din - 0000 - 1 - 0.33 - 0.33 - 0.33 - 0.33 - 0.33 - 0.33 - dout - drdy - dwe - 49.000 - 1.000 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - FDBK_AUTO - 0000 - 0000 - 0 - Input Clock Freq (MHz) Input Jitter (UI) - __primary_________100.000____________0.010 - no_secondary_input_clock - input_clk_stopped - 0 - Units_MHz - No_Jitter - locked - 0000 - 0000 - 0000 - false - false - false - false - false - false - false - false - OPTIMIZED - 33.000 - 0.000 - FALSE - 10.000 - 10.000 - 25.000 - 0.500 - 0.000 - FALSE - 1 - 0.500 - 0.000 - FALSE - 1 - 0.500 - 0.000 - FALSE - 1 - 0.500 - 0.000 - FALSE - FALSE - 1 - 0.500 - 0.000 - FALSE - 1 - 0.500 - 0.000 - FALSE - 1 - 0.500 - 0.000 - FALSE - FALSE - ZHOLD - 4 - None - 0.010 - 0.010 - FALSE - 64.000 - 2.000 - 1 - Output Output Phase Duty Cycle Pk-to-Pk Phase - Clock Freq (MHz) (degrees) (%) Jitter (ps) Error (ps) - clk_out1__33.00000______0.000______50.0______333.104____261.747 - no_CLK_OUT2_output - no_CLK_OUT3_output - no_CLK_OUT4_output - no_CLK_OUT5_output - no_CLK_OUT6_output - no_CLK_OUT7_output - 0 - 0 - 128.000 - 1.000 - WAVEFORM - UNKNOWN - false - false - false - false - false - OPTIMIZED - 1 - 0.000 - 1.000 - 1 - 0.500 - 0.000 - 1 - 0.500 - 0.000 - 1 - 0.500 - 0.000 - 1 - 0.500 - 0.000 - 1 - 0.500 - 0.000 - 1 - 0.500 - 0.000 - CLKFBOUT - SYSTEM_SYNCHRONOUS - 1 - No notes - 0.010 - power_down - 0000 - 1 - clk_in1 - PLL - AUTO - 100.000 - 0.010 - 10.000 - No_buffer - psclk - psdone - psen - psincdec - 100.0 - 0 - reset - 100.000 - 0.010 - 10.000 - clk_in2 - Single_ended_clock_capable_pin - CENTER_HIGH - 4000 - 0.004 - STATUS - 11 - 32 - 100.0 - 100.0 - 100.0 - 100.0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 1866.000 - 800.000 - clk_pll_33 - MMCM - false - empty - cddcdone - cddcreq - clkfb_in_n - clkfb_in - clkfb_in_p - SINGLE - clkfb_out_n - clkfb_out - clkfb_out_p - clkfb_stopped - 100.0 - 0.010 - 100.0 - 0.010 - BUFG - 333.104 - false - 261.747 - 50.000 - 33.000 - 0.000 - 1 - true - BUFG - 0.0 - false - 0.0 - 50.000 - 100.000 - 0.000 - 1 - false - BUFG - 0.0 - false - 0.0 - 50.000 - 100.000 - 0.000 - 1 - false - BUFG - 0.0 - false - 0.0 - 50.000 - 100.000 - 0.000 - 1 - false - BUFG - 0.0 - false - 0.0 - 50.000 - 100.000 - 0.000 - 1 - false - BUFG - 0.0 - false - 0.0 - 50.000 - 100.000 - 0.000 - 1 - false - BUFG - 0.0 - false - 0.0 - 50.000 - 100.000 - 0.000 - 1 - false - 600.000 - Custom - Custom - clk_in_sel - clk_out1 - false - clk_out2 - false - clk_out3 - false - clk_out4 - false - clk_out5 - false - clk_out6 - false - clk_out7 - false - CLK_VALID - auto - clk_pll_33 - daddr - dclk - den - Custom - Custom - din - dout - drdy - dwe - false - false - false - false - false - false - false - false - false - FDBK_AUTO - input_clk_stopped - frequency - Enable_AXI - Units_MHz - Units_UI - UI - No_Jitter - locked - OPTIMIZED - 33 - 0.000 - false - 10.000 - 10.000 - 25 - 0.500 - 0.000 - false - 1 - 0.500 - 0.000 - false - 1 - 0.500 - 0.000 - false - 1 - 0.500 - 0.000 - false - false - 1 - 0.500 - 0.000 - false - 1 - 0.500 - 0.000 - false - 1 - 0.500 - 0.000 - false - false - ZHOLD - 4 - None - 0.010 - 0.010 - false - 1 - false - false - WAVEFORM - false - UNKNOWN - OPTIMIZED - 4 - 0.000 - 10.000 - 1 - 0.500 - 0.000 - 1 - 0.500 - 0.000 - 1 - 0.500 - 0.000 - 1 - 0.500 - 0.000 - 1 - 0.500 - 0.000 - 1 - 0.500 - 0.000 - CLKFBOUT - SYSTEM_SYNCHRONOUS - 1 - None - 0.010 - power_down - 1 - clk_in1 - PLL - mmcm_adv - 100.000 - 0.010 - 10.000 - No_buffer - psclk - psdone - psen - psincdec - 100.0 - REL_PRIMARY - Custom - reset - ACTIVE_HIGH - 100.000 - 0.010 - 10.000 - clk_in2 - Single_ended_clock_capable_pin - CENTER_HIGH - 250 - 0.004 - STATUS - empty - 100.0 - 100.0 - 100.0 - 100.0 - false - false - false - false - false - false - false - true - false - false - false - false - false - false - true - false - false - false - false - false - artix7 - - - xc7a200t - fbg676 - VERILOG - - MIXED - -2 - - - TRUE - TRUE - IP_Flow - 4 - TRUE - . - - . - 2019.2 - OUT_OF_CONTEXT - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/soc/vivado_xpr/project_1/xilinx_ip/clk_wiz_0/clk_wiz_0.xci b/resources/soc/vivado_xpr/project_1/xilinx_ip/clk_wiz_0/clk_wiz_0.xci deleted file mode 100644 index 3430950..0000000 --- a/resources/soc/vivado_xpr/project_1/xilinx_ip/clk_wiz_0/clk_wiz_0.xci +++ /dev/null @@ -1,716 +0,0 @@ - - - xilinx.com - xci - unknown - 1.0 - - - clk_wiz_0 - - - false - 100000000 - false - 100000000 - false - 100000000 - false - 100000000 - - - - 100000000 - 0 - 0.000 - - - - 100000000 - 0 - 0.000 - 1 - LEVEL_HIGH - - - - 100000000 - 0 - 0.000 - 0 - 0 - - 100000000 - 0 - 0.000 - 1 - 0 - 0 - 0 - - 1 - 100000000 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 0 - MMCM - cddcdone - cddcreq - 0000 - 0000 - clkfb_in_n - clkfb_in - clkfb_in_p - SINGLE - clkfb_out_n - clkfb_out - clkfb_out_p - clkfb_stopped - 100.0 - 100.0 - 0000 - 0000 - 200.00000 - 0000 - 0000 - 100.000 - BUFG - 50.0 - false - 200.00000 - 0.000 - 50.000 - 200.000 - 0.000 - 1 - 0000 - 0000 - 100.000 - BUFG - 50.000 - false - 100.000 - 0.000 - 50.000 - 100.000 - 0.000 - 1 - 0 - 0000 - 0000 - 100.000 - BUFG - 50.000 - false - 100.000 - 0.000 - 50.000 - 100.000 - 0.000 - 1 - 0 - 0000 - 0000 - 100.000 - BUFG - 50.000 - false - 100.000 - 0.000 - 50.000 - 100.000 - 0.000 - 1 - 0 - 0000 - 0000 - 100.000 - BUFG - 50.000 - false - 100.000 - 0.000 - 50.000 - 100.000 - 0.000 - 1 - 0 - 0000 - 0000 - 100.000 - BUFG - 50.000 - false - 100.000 - 0.000 - 50.000 - 100.000 - 0.000 - 1 - 0 - BUFG - 50.000 - false - 100.000 - 0.000 - 50.000 - 100.000 - 0.000 - 1 - 0 - VCO - clk_in_sel - clk_out1 - clk_out2 - clk_out3 - clk_out4 - clk_out5 - clk_out6 - clk_out7 - CLK_VALID - NA - daddr - dclk - den - din - 0000 - 1 - 2.0 - 2.0 - 2.0 - 2.0 - 2.0 - 2.0 - dout - drdy - dwe - 49.000 - 1.000 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - FDBK_AUTO - 0000 - 0000 - 0 - Input Clock Freq (MHz) Input Jitter (UI) - __primary_________100.000____________0.010 - no_secondary_input_clock - input_clk_stopped - 0 - Units_MHz - No_Jitter - locked - 0000 - 0000 - 0000 - false - false - false - false - false - false - false - false - OPTIMIZED - 10.000 - 0.000 - FALSE - 10.000 - 10.000 - 5.000 - 0.500 - 0.000 - FALSE - 1 - 0.500 - 0.000 - FALSE - 1 - 0.500 - 0.000 - FALSE - 1 - 0.500 - 0.000 - FALSE - FALSE - 1 - 0.500 - 0.000 - FALSE - 1 - 0.500 - 0.000 - FALSE - 1 - 0.500 - 0.000 - FALSE - FALSE - ZHOLD - 1 - None - 0.010 - 0.010 - FALSE - 64.000 - 2.000 - 1 - Output Output Phase Duty Cycle Pk-to-Pk Phase - Clock Freq (MHz) (degrees) (%) Jitter (ps) Error (ps) - clk_out1__200.00000______0.000______50.0______114.829_____98.575 - no_CLK_OUT2_output - no_CLK_OUT3_output - no_CLK_OUT4_output - no_CLK_OUT5_output - no_CLK_OUT6_output - no_CLK_OUT7_output - 0 - 0 - 128.000 - 1.000 - WAVEFORM - UNKNOWN - false - false - false - false - false - OPTIMIZED - 1 - 0.000 - 1.000 - 1 - 0.500 - 0.000 - 1 - 0.500 - 0.000 - 1 - 0.500 - 0.000 - 1 - 0.500 - 0.000 - 1 - 0.500 - 0.000 - 1 - 0.500 - 0.000 - CLKFBOUT - SYSTEM_SYNCHRONOUS - 1 - No notes - 0.010 - power_down - 0000 - 1 - clk_in1 - PLL - AUTO - 100.000 - 0.010 - 10.000 - No_buffer - psclk - psdone - psen - psincdec - 100.0 - 0 - reset - 100.000 - 0.010 - 10.000 - clk_in2 - Single_ended_clock_capable_pin - CENTER_HIGH - 4000 - 0.004 - STATUS - 11 - 32 - 100.0 - 100.0 - 100.0 - 100.0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 1866.000 - 800.000 - clk_wiz_0 - MMCM - false - empty - cddcdone - cddcreq - clkfb_in_n - clkfb_in - clkfb_in_p - SINGLE - clkfb_out_n - clkfb_out - clkfb_out_p - clkfb_stopped - 100.0 - 0.010 - 100.0 - 0.010 - BUFG - 126.455 - false - 114.212 - 50.000 - 200.000 - 0.000 - 1 - true - BUFG - 0.0 - false - 0.0 - 50.000 - 100.000 - 0.000 - 1 - false - BUFG - 0.0 - false - 0.0 - 50.000 - 100.000 - 0.000 - 1 - false - BUFG - 0.0 - false - 0.0 - 50.000 - 100.000 - 0.000 - 1 - false - BUFG - 0.0 - false - 0.0 - 50.000 - 100.000 - 0.000 - 1 - false - BUFG - 0.0 - false - 0.0 - 50.000 - 100.000 - 0.000 - 1 - false - BUFG - 0.0 - false - 0.0 - 50.000 - 100.000 - 0.000 - 1 - false - 600.000 - Custom - Custom - clk_in_sel - clk_out1 - false - clk_out2 - false - clk_out3 - false - clk_out4 - false - clk_out5 - false - clk_out6 - false - clk_out7 - false - CLK_VALID - auto - clk_wiz_0 - daddr - dclk - den - Custom - Custom - din - dout - drdy - dwe - false - false - false - false - false - false - false - false - false - FDBK_AUTO - input_clk_stopped - frequency - Enable_AXI - Units_MHz - Units_UI - UI - No_Jitter - locked - OPTIMIZED - 10 - 0.000 - false - 10.000 - 10.000 - 5 - 0.500 - 0.000 - false - 1 - 0.500 - 0.000 - false - 1 - 0.500 - 0.000 - false - 1 - 0.500 - 0.000 - false - false - 1 - 0.500 - 0.000 - false - 1 - 0.500 - 0.000 - false - 1 - 0.500 - 0.000 - false - false - ZHOLD - 1 - None - 0.010 - 0.010 - false - 1 - false - false - WAVEFORM - false - UNKNOWN - OPTIMIZED - 4 - 0.000 - 10.000 - 1 - 0.500 - 0.000 - 1 - 0.500 - 0.000 - 1 - 0.500 - 0.000 - 1 - 0.500 - 0.000 - 1 - 0.500 - 0.000 - 1 - 0.500 - 0.000 - CLKFBOUT - SYSTEM_SYNCHRONOUS - 1 - None - 0.010 - power_down - 1 - clk_in1 - PLL - mmcm_adv - 100.000 - 0.010 - 10.000 - No_buffer - psclk - psdone - psen - psincdec - 100.0 - REL_PRIMARY - Custom - reset - ACTIVE_HIGH - 100.000 - 0.010 - 10.000 - clk_in2 - Single_ended_clock_capable_pin - CENTER_HIGH - 250 - 0.004 - STATUS - empty - 100.0 - 100.0 - 100.0 - 100.0 - false - false - false - false - false - false - false - true - false - false - false - false - false - false - true - false - false - false - false - false - artix7 - - - xc7a200t - fbg676 - VERILOG - - MIXED - -2 - - - TRUE - TRUE - IP_Flow - 4 - TRUE - . - - . - 2019.2 - OUT_OF_CONTEXT - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/soc/vivado_xpr/project_1/xilinx_ip/dpram_512x32/dpram_512x32.xci b/resources/soc/vivado_xpr/project_1/xilinx_ip/dpram_512x32/dpram_512x32.xci deleted file mode 100644 index 9bd132f..0000000 --- a/resources/soc/vivado_xpr/project_1/xilinx_ip/dpram_512x32/dpram_512x32.xci +++ /dev/null @@ -1,315 +0,0 @@ - - - xilinx.com - xci - unknown - 1.0 - - - dpram_512x32 - - - 4096 - 1 - 0 - 0 - 0 - - 1 - 100000000 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 100000000 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - OTHER - NONE - 8192 - 32 - 1 - - OTHER - NONE - 8192 - 32 - 1 - - - 100000000 - 0 - 0.000 - 0 - 9 - 9 - 1 - 4 - 0 - 1 - 9 - 0 - 1 - 0 - NONE - 0 - 0 - 0 - ./ - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - Estimated Power for IP : 3.68295 mW - artix7 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - dpram_512x32.mem - no_coe_file_loaded - 0 - 0 - 1 - 0 - 1 - 512 - 512 - 1 - 1 - 32 - 32 - 0 - 0 - CE - CE - ALL - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 512 - 512 - NO_CHANGE - WRITE_FIRST - 32 - 32 - artix7 - 4 - Memory_Slave - AXI4_Full - false - Minimum_Area - false - 9 - NONE - no_coe_file_loaded - ALL - dpram_512x32 - false - false - false - false - false - false - false - false - false - Use_ENA_Pin - Always_Enabled - Single_Bit_Error_Injection - false - Native - false - no_mem_loaded - Simple_Dual_Port_RAM - NO_CHANGE - WRITE_FIRST - 0 - 0 - BRAM - 0 - 100 - 100 - 50 - 100 - 100 - 0 - 8kx2 - false - false - 1 - 1 - 32 - 32 - false - false - false - false - 0 - false - false - CE - CE - SYNC - false - false - false - false - false - false - false - 512 - 32 - 32 - No_ECC - false - false - false - Stand_Alone - artix7 - - - xc7a200t - fbg676 - VERILOG - - MIXED - -2 - - - TRUE - TRUE - IP_Flow - 4 - TRUE - . - - . - 2019.2 - OUT_OF_CONTEXT - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/soc/vivado_xpr/project_1/xilinx_ip/mig_axi_32/mig_a.prj b/resources/soc/vivado_xpr/project_1/xilinx_ip/mig_axi_32/mig_a.prj deleted file mode 100644 index 2937b9b..0000000 --- a/resources/soc/vivado_xpr/project_1/xilinx_ip/mig_axi_32/mig_a.prj +++ /dev/null @@ -1,131 +0,0 @@ - - - - mig_axi_32 - 1 - 1 - OFF - 1024 - OFF - Enabled - xc7a200t-fbg676/-2 - 2.3 - No Buffer - No Buffer - ACTIVE LOW - FALSE - 1 - 50 Ohms - 0 - - DDR3_SDRAM/Components/MT41J64M16XX-125 - 2500 - 1.8V - 4:1 - 100 - 0 - 800 - 1.000 - 1 - 1 - 1 - 1 - 16 - 1 - 1 - Disabled - Normal - FALSE - - 13 - 10 - 3 - 1.5V - BANK_ROW_COLUMN - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 8 - Fixed - Sequential - 6 - Normal - No - Slow Exit - Enable - RZQ/7 - Disable - Disable - RZQ/4 - 0 - Disabled - Enabled - Output Buffer Enabled - Full Array - 5 - Enabled - Normal - Dynamic ODT off - AXI - - RD_PRI_REG - 27 - 32 - 8 - 1 - - - - diff --git a/resources/soc/vivado_xpr/project_1/xilinx_ip/mig_axi_32/mig_axi_32.xci b/resources/soc/vivado_xpr/project_1/xilinx_ip/mig_axi_32/mig_axi_32.xci deleted file mode 100644 index 806bf11..0000000 --- a/resources/soc/vivado_xpr/project_1/xilinx_ip/mig_axi_32/mig_axi_32.xci +++ /dev/null @@ -1,2647 +0,0 @@ - - - xilinx.com - xci - unknown - 1.0 - - - mig_axi_32 - - - 0 - 0 - - 0 - TDM - 8 - false - 11 - 11 - true - - true - 8 - - COMPONENTS - ROW_COLUMN_BANK - Single - 1250 - 0 - TDM - 8 - false - 11 - 11 - true - - true - 8 - - COMPONENTS - ROW_COLUMN_BANK - Single - 1250 - 0 - 0 - - - - 0 - - - - 0 - - - - 0 - - - - 0 - - - - 0 - 0 - 0 - 0 - 0 - false - 100000000 - - - - 100000000 - 0 - 0.000 - 0 - - 0 - TDM - 8 - false - 11 - 11 - true - - true - 8 - - COMPONENTS - ROW_COLUMN_BANK - Single - 1250 - 0 - TDM - 8 - false - 11 - 11 - true - - true - 8 - - COMPONENTS - ROW_COLUMN_BANK - Single - 1250 - 0 - 0 - - - - 0 - - - - 0 - - - - 0 - - - - 0 - - - - 0 - 0 - 0 - 0 - 0 - false - 100000000 - - - - 100000000 - 0 - 0.000 - 0 - - 0 - TDM - 8 - false - 11 - 11 - true - - true - 8 - - COMPONENTS - ROW_COLUMN_BANK - Single - 1250 - 0 - TDM - 8 - false - 11 - 11 - true - - true - 8 - - COMPONENTS - ROW_COLUMN_BANK - Single - 1250 - 0 - 0 - - - - 0 - - - - 0 - - - - 0 - - - - 0 - - - - 0 - 0 - 0 - 0 - 0 - false - 100000000 - - - - 100000000 - 0 - 0.000 - 0 - - 0 - TDM - 8 - false - 11 - 11 - true - - true - 8 - - COMPONENTS - ROW_COLUMN_BANK - Single - 1250 - 0 - TDM - 8 - false - 11 - 11 - true - - true - 8 - - COMPONENTS - ROW_COLUMN_BANK - Single - 1250 - 0 - 0 - - - - 0 - - - - 0 - - - - 0 - - - - 0 - - - - 0 - 0 - 0 - 0 - 0 - false - 100000000 - - - - 100000000 - 0 - 0.000 - 0 - - 0 - TDM - 8 - false - 11 - 11 - true - - true - 8 - - COMPONENTS - ROW_COLUMN_BANK - Single - 1250 - 0 - TDM - 8 - false - 11 - 11 - true - - true - 8 - - COMPONENTS - ROW_COLUMN_BANK - Single - 1250 - 0 - 0 - - - - 0 - - - - 0 - - - - 0 - - - - 0 - - - - 0 - 0 - 0 - 0 - 0 - false - 100000000 - - - - 100000000 - 0 - 0.000 - 0 - - 0 - TDM - 8 - false - 11 - 11 - true - - true - 8 - - COMPONENTS - ROW_COLUMN_BANK - Single - 1250 - 0 - TDM - 8 - false - 11 - 11 - true - - true - 8 - - COMPONENTS - ROW_COLUMN_BANK - Single - 1250 - 0 - 0 - - - - 0 - - - - 0 - - - - 0 - - - - 0 - - - - 0 - 0 - 0 - 0 - 0 - false - 100000000 - - - - 100000000 - 0 - 0.000 - 0 - - 0 - TDM - 8 - false - 11 - 11 - true - - true - 8 - - COMPONENTS - ROW_COLUMN_BANK - Single - 1250 - 0 - TDM - 8 - false - 11 - 11 - true - - true - 8 - - COMPONENTS - ROW_COLUMN_BANK - Single - 1250 - 0 - 0 - - - - 0 - - - - 0 - - - - 0 - - - - 0 - - - - 0 - 0 - 0 - 0 - 0 - false - 100000000 - - - - 100000000 - 0 - 0.000 - 0 - - 0 - TDM - 8 - false - 11 - 11 - true - - true - 8 - - COMPONENTS - ROW_COLUMN_BANK - Single - 1250 - 0 - TDM - 8 - false - 11 - 11 - true - - true - 8 - - COMPONENTS - ROW_COLUMN_BANK - Single - 1250 - 0 - 0 - - - - 0 - - - - 0 - - - - 0 - - - - 0 - - - - 0 - 0 - 0 - 0 - 0 - false - 100000000 - - - - 100000000 - 0 - 0.000 - false - 100000000 - - - - 100000000 - 0 - 0.000 - - 0 - TDM - 8 - false - 11 - 11 - true - - true - 8 - - COMPONENTS - ROW_COLUMN_BANK - Single - 1250 - 0 - TDM - 8 - false - 11 - 11 - true - - true - 8 - - COMPONENTS - ROW_COLUMN_BANK - Single - 1250 - 0 - 0 - - - - 0 - - - - 0 - - - - 0 - - - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 0 - false - 100000000 - - - - 100000000 - 0 - 0.000 - 27 - 0 - 0 - 0 - - 32 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 8 - 0 - 256 - 2 - 1 - 2 - 1 - 0.000 - AXI4 - READ_WRITE - 0 - 0 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 32 - 32 - 32 - 4 - 1048576 - 32 - 4 - 1048576 - 8 - 3 - 1 - 1 - 1 - 8 - OFF - 1 - 1 - 1 - 8 - 1 - OFF - 14 - 1 - 1 - 1 - 2 - 1 - 8 - 3 - 1 - 1 - 1 - 8 - OFF - 1 - 1 - 1 - 8 - 1 - OFF - 14 - 1 - 1 - 1 - 2 - 1 - 8 - 8 - 2 - OFF - 1 - OFF - 100.0 - FALSE - 8 - 3 - 1 - 1 - 1 - 8 - OFF - 1 - 1 - 1 - 8 - OFF - 14 - 1 - 1 - 1 - 2 - 1 - DDR3 - FALSE - 10.0 - FALSE - 10 - FALSE - 10 - FALSE - 10 - FALSE - 10 - 1200.0 - 0.000 - ACTIVE_LOW - 29 - 1 - 8 - 18 - OFF - 1 - 29 - 2 - 1 - 1 - 18 - OFF - 1 - 1 - 1 - 8 - 1 - 29 - 1 - 29 - 2 - 1 - 1 - 18 - OFF - 1 - 1 - 1 - 8 - 1 - 29 - 1 - 29 - 2 - 1 - 18 - 1 - 1 - DIFF - FALSE - 0 - 32 - 32 - 32 - 4 - 1048576 - 32 - 4 - 1048576 - 8 - 3 - 1 - 1 - 1 - 8 - OFF - 1 - 1 - 1 - 8 - 1 - OFF - 14 - 1 - 1 - 1 - 2 - 1 - 8 - 3 - 1 - 1 - 1 - 8 - OFF - 1 - 1 - 1 - 8 - 1 - OFF - 14 - 1 - 1 - 1 - 2 - 1 - 8 - 8 - 2 - OFF - 1 - OFF - 100.0 - FALSE - 8 - 3 - 1 - 1 - 1 - 8 - OFF - 1 - 1 - 1 - 8 - OFF - 14 - 1 - 1 - 1 - 2 - 1 - DDR3 - FALSE - 10.0 - FALSE - 10 - FALSE - 10 - FALSE - 10 - FALSE - 10 - 1200.0 - 0.000 - ACTIVE_LOW - 29 - 1 - 8 - 18 - OFF - 1 - 29 - 2 - 1 - 1 - 18 - OFF - 1 - 1 - 1 - 8 - 1 - 29 - 1 - 29 - 2 - 1 - 1 - 18 - OFF - 1 - 1 - 1 - 8 - 1 - 29 - 1 - 29 - 2 - 1 - 18 - 1 - 1 - DIFF - FALSE - 0 - 32 - 32 - 32 - 4 - 1048576 - 32 - 4 - 1048576 - 8 - 3 - 1 - 1 - 1 - 8 - OFF - 1 - 1 - 1 - 8 - 1 - OFF - 14 - 1 - 1 - 1 - 2 - 1 - 8 - 3 - 1 - 1 - 1 - 8 - OFF - 1 - 1 - 1 - 8 - 1 - OFF - 14 - 1 - 1 - 1 - 2 - 1 - 8 - 8 - 2 - OFF - 1 - OFF - 100.0 - FALSE - 8 - 3 - 1 - 1 - 1 - 8 - OFF - 1 - 1 - 1 - 8 - OFF - 14 - 1 - 1 - 1 - 2 - 1 - DDR3 - FALSE - 10.0 - FALSE - 10 - FALSE - 10 - FALSE - 10 - FALSE - 10 - 1200.0 - 0.000 - ACTIVE_LOW - 29 - 1 - 8 - 18 - OFF - 1 - 29 - 2 - 1 - 1 - 18 - OFF - 1 - 1 - 1 - 8 - 1 - 29 - 1 - 29 - 2 - 1 - 1 - 18 - OFF - 1 - 1 - 1 - 8 - 1 - 29 - 1 - 29 - 2 - 1 - 18 - 1 - 1 - DIFF - FALSE - 0 - 32 - 32 - 32 - 4 - 1048576 - 32 - 4 - 1048576 - 8 - 3 - 1 - 1 - 1 - 8 - OFF - 1 - 1 - 1 - 8 - 1 - OFF - 14 - 1 - 1 - 1 - 2 - 1 - 8 - 3 - 1 - 1 - 1 - 8 - OFF - 1 - 1 - 1 - 8 - 1 - OFF - 14 - 1 - 1 - 1 - 2 - 1 - 8 - 8 - 2 - OFF - 1 - OFF - 100.0 - FALSE - 8 - 3 - 1 - 1 - 1 - 8 - OFF - 1 - 1 - 1 - 8 - OFF - 14 - 1 - 1 - 1 - 2 - 1 - DDR3 - FALSE - 10.0 - FALSE - 10 - FALSE - 10 - FALSE - 10 - FALSE - 10 - 1200.0 - 0.000 - ACTIVE_LOW - 29 - 1 - 8 - 18 - OFF - 1 - 29 - 2 - 1 - 1 - 18 - OFF - 1 - 1 - 1 - 8 - 1 - 29 - 1 - 29 - 2 - 1 - 1 - 18 - OFF - 1 - 1 - 1 - 8 - 1 - 29 - 1 - 29 - 2 - 1 - 18 - 1 - 1 - DIFF - FALSE - 0 - 32 - 32 - 32 - 4 - 1048576 - 32 - 4 - 1048576 - 8 - 3 - 1 - 1 - 1 - 8 - OFF - 1 - 1 - 1 - 8 - 1 - OFF - 14 - 1 - 1 - 1 - 2 - 1 - 8 - 3 - 1 - 1 - 1 - 8 - OFF - 1 - 1 - 1 - 8 - 1 - OFF - 14 - 1 - 1 - 1 - 2 - 1 - 8 - 8 - 2 - OFF - 1 - OFF - 100.0 - FALSE - 8 - 3 - 1 - 1 - 1 - 8 - OFF - 1 - 1 - 1 - 8 - OFF - 14 - 1 - 1 - 1 - 2 - 1 - DDR3 - FALSE - 10.0 - FALSE - 10 - FALSE - 10 - FALSE - 10 - FALSE - 10 - 1200.0 - 0.000 - ACTIVE_LOW - 29 - 1 - 8 - 18 - OFF - 1 - 29 - 2 - 1 - 1 - 18 - OFF - 1 - 1 - 1 - 8 - 1 - 29 - 1 - 29 - 2 - 1 - 1 - 18 - OFF - 1 - 1 - 1 - 8 - 1 - 29 - 1 - 29 - 2 - 1 - 18 - 1 - 1 - DIFF - FALSE - 0 - 32 - 32 - 32 - 4 - 1048576 - 32 - 4 - 1048576 - 8 - 3 - 1 - 1 - 1 - 8 - OFF - 1 - 1 - 1 - 8 - 1 - OFF - 14 - 1 - 1 - 1 - 2 - 1 - 8 - 3 - 1 - 1 - 1 - 8 - OFF - 1 - 1 - 1 - 8 - 1 - OFF - 14 - 1 - 1 - 1 - 2 - 1 - 8 - 8 - 2 - OFF - 1 - OFF - 100.0 - FALSE - 8 - 3 - 1 - 1 - 1 - 8 - OFF - 1 - 1 - 1 - 8 - OFF - 14 - 1 - 1 - 1 - 2 - 1 - DDR3 - FALSE - 10.0 - FALSE - 10 - FALSE - 10 - FALSE - 10 - FALSE - 10 - 1200.0 - 0.000 - ACTIVE_LOW - 29 - 1 - 8 - 18 - OFF - 1 - 29 - 2 - 1 - 1 - 18 - OFF - 1 - 1 - 1 - 8 - 1 - 29 - 1 - 29 - 2 - 1 - 1 - 18 - OFF - 1 - 1 - 1 - 8 - 1 - 29 - 1 - 29 - 2 - 1 - 18 - 1 - 1 - DIFF - FALSE - 0 - 32 - 32 - 32 - 4 - 1048576 - 32 - 4 - 1048576 - 8 - 3 - 1 - 1 - 1 - 8 - OFF - 1 - 1 - 1 - 8 - 1 - OFF - 14 - 1 - 1 - 1 - 2 - 1 - 8 - 3 - 1 - 1 - 1 - 8 - OFF - 1 - 1 - 1 - 8 - 1 - OFF - 14 - 1 - 1 - 1 - 2 - 1 - 8 - 8 - 2 - OFF - 1 - OFF - 100.0 - FALSE - 8 - 3 - 1 - 1 - 1 - 8 - OFF - 1 - 1 - 1 - 8 - OFF - 14 - 1 - 1 - 1 - 2 - 1 - DDR3 - FALSE - 10.0 - FALSE - 10 - FALSE - 10 - FALSE - 10 - FALSE - 10 - 1200.0 - 0.000 - ACTIVE_LOW - 29 - 1 - 8 - 18 - OFF - 1 - 29 - 2 - 1 - 1 - 18 - OFF - 1 - 1 - 1 - 8 - 1 - 29 - 1 - 29 - 2 - 1 - 1 - 18 - OFF - 1 - 1 - 1 - 8 - 1 - 29 - 1 - 29 - 2 - 1 - 18 - 1 - 1 - DIFF - FALSE - 0 - 32 - 32 - 32 - 4 - 1048576 - 32 - 4 - 1048576 - 8 - 3 - 1 - 1 - 1 - 8 - OFF - 1 - 1 - 1 - 8 - 1 - OFF - 14 - 1 - 1 - 1 - 2 - 1 - 8 - 3 - 1 - 1 - 1 - 8 - OFF - 1 - 1 - 1 - 8 - 1 - OFF - 14 - 1 - 1 - 1 - 2 - 1 - 8 - 8 - 2 - OFF - 1 - OFF - 100.0 - FALSE - 8 - 3 - 1 - 1 - 1 - 8 - OFF - 1 - 1 - 1 - 8 - OFF - 14 - 1 - 1 - 1 - 2 - 1 - DDR3 - FALSE - 10.0 - FALSE - 10 - FALSE - 10 - FALSE - 10 - FALSE - 10 - 1200.0 - 0.000 - ACTIVE_LOW - 29 - 1 - 8 - 18 - OFF - 1 - 29 - 2 - 1 - 1 - 18 - OFF - 1 - 1 - 1 - 8 - 1 - 29 - 1 - 29 - 2 - 1 - 1 - 18 - OFF - 1 - 1 - 1 - 8 - 1 - 29 - 1 - 29 - 2 - 1 - 18 - 1 - 1 - DIFF - FALSE - 0 - 0 - 27 - 32 - 32 - 4 - 1048576 - 32 - 8 - 134217728 - 8 - 3 - 1 - 1 - 1 - 8 - OFF - 1 - 1 - 1 - 8 - 1 - OFF - 14 - 1 - 1 - 1 - 2 - 1 - 27 - 3 - 1 - 1 - 1 - 16 - OFF - 2 - 1 - 2 - 16 - 1 - OFF - 13 - 0 - 1 - 1 - 4 - 1 - 8 - 8 - 2 - OFF - 1 - OFF - 100000000 - FALSE - 8 - 3 - 1 - 1 - 1 - 8 - OFF - 1 - 1 - 1 - 8 - OFF - 14 - 1 - 1 - 1 - 2 - 1 - DDR3 - FALSE - 10.0 - FALSE - 10 - FALSE - 10 - FALSE - 10 - FALSE - 10 - 800 - 1 - 0.000 - ACTIVE_LOW - 29 - 1 - 8 - 18 - OFF - 1 - NOBUF - 29 - 2 - 1 - 1 - 18 - OFF - 1 - 1 - 1 - 8 - 1 - 29 - 1 - 29 - 2 - 1 - 1 - 18 - OFF - 1 - 1 - 1 - 8 - 1 - 29 - 1 - 29 - 2 - 1 - 18 - 1 - 1 - NOBUF - INTERNAL - FALSE - 1 - Custom - mig_axi_32 - Custom - Custom - mig_a.prj - artix7 - - - xc7a200t - fbg676 - VERILOG - - MIXED - -2 - - - TRUE - TRUE - IP_Flow - 1 - TRUE - . - - . - 2019.2 - OUT_OF_CONTEXT - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/soc/vivado_xpr/project_1/xilinx_ip/mig_axi_32/mig_b.prj b/resources/soc/vivado_xpr/project_1/xilinx_ip/mig_axi_32/mig_b.prj deleted file mode 100644 index 1b7a3db..0000000 --- a/resources/soc/vivado_xpr/project_1/xilinx_ip/mig_axi_32/mig_b.prj +++ /dev/null @@ -1,131 +0,0 @@ - - - - mig_axi_32 - 1 - 1 - OFF - 1024 - OFF - Enabled - xc7a200t-fbg676/-2 - 2.3 - No Buffer - No Buffer - ACTIVE LOW - FALSE - 1 - 50 Ohms - 0 - - DDR3_SDRAM/Components/MT41J64M16XX-125 - 2500 - 1.8V - 4:1 - 100 - 0 - 800 - 1.000 - 1 - 1 - 1 - 1 - 16 - 1 - 1 - Disabled - Normal - FALSE - - 13 - 10 - 3 - 1.5V - BANK_ROW_COLUMN - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 8 - Fixed - Sequential - 6 - Normal - No - Slow Exit - Enable - RZQ/7 - Disable - Disable - RZQ/4 - 0 - Disabled - Enabled - Output Buffer Enabled - Full Array - 5 - Enabled - Normal - Dynamic ODT off - AXI - - RD_PRI_REG - 27 - 32 - 8 - 0 - - - - diff --git a/resources/soc/vivado_xpr/project_1/xilinx_ip/sram_128x22/sram_128x22.xci b/resources/soc/vivado_xpr/project_1/xilinx_ip/sram_128x22/sram_128x22.xci deleted file mode 100644 index c8e50c9..0000000 --- a/resources/soc/vivado_xpr/project_1/xilinx_ip/sram_128x22/sram_128x22.xci +++ /dev/null @@ -1,309 +0,0 @@ - - - xilinx.com - xci - unknown - 1.0 - - - sram_128x22 - - - 4096 - 1 - 0 - 0 - 0 - - 1 - 100000000 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 100000000 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - OTHER - NONE - 8192 - 32 - 1 - - OTHER - NONE - 8192 - 32 - 1 - - - 100000000 - 0 - 0.000 - 0 - 7 - 7 - 1 - 4 - 0 - 1 - 9 - 0 - 1 - 0 - NONE - 0 - 0 - 0 - ./ - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - Estimated Power for IP : 3.12245 mW - artix7 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - sram_128x22.mem - no_coe_file_loaded - 0 - 0 - 0 - 0 - 1 - 128 - 128 - 1 - 1 - 22 - 22 - 0 - 0 - CE - CE - ALL - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 128 - 128 - WRITE_FIRST - WRITE_FIRST - 22 - 22 - artix7 - 4 - Memory_Slave - AXI4_Full - false - Minimum_Area - false - 9 - NONE - no_coe_file_loaded - ALL - sram_128x22 - false - false - false - false - false - false - false - false - false - Use_ENA_Pin - Always_Enabled - Single_Bit_Error_Injection - false - Native - false - no_mem_loaded - Single_Port_RAM - WRITE_FIRST - WRITE_FIRST - 0 - 0 - BRAM - 0 - 100 - 100 - 50 - 0 - 0 - 0 - 8kx2 - false - false - 1 - 1 - 22 - 22 - false - false - false - false - 0 - false - false - CE - CE - SYNC - false - false - false - false - false - false - false - 128 - 22 - 22 - No_ECC - false - false - false - Stand_Alone - artix7 - - - xc7a200t - fbg676 - VERILOG - - MIXED - -2 - - - TRUE - TRUE - IP_Flow - 4 - TRUE - . - - . - 2019.2 - OUT_OF_CONTEXT - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/soc/vivado_xpr/project_1/xilinx_ip/sram_128x32/sram_128x32.xci b/resources/soc/vivado_xpr/project_1/xilinx_ip/sram_128x32/sram_128x32.xci deleted file mode 100644 index 6f97f47..0000000 --- a/resources/soc/vivado_xpr/project_1/xilinx_ip/sram_128x32/sram_128x32.xci +++ /dev/null @@ -1,309 +0,0 @@ - - - xilinx.com - xci - unknown - 1.0 - - - sram_128x32 - - - 4096 - 1 - 0 - 0 - 0 - - 1 - 100000000 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 100000000 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - OTHER - NONE - 8192 - 32 - 1 - - OTHER - NONE - 8192 - 32 - 1 - - - 100000000 - 0 - 0.000 - 0 - 7 - 7 - 1 - 4 - 0 - 1 - 9 - 0 - 1 - 0 - NONE - 0 - 0 - 0 - ./ - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - Estimated Power for IP : 3.53845 mW - artix7 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - sram_128x32.mem - no_coe_file_loaded - 0 - 0 - 0 - 0 - 1 - 128 - 128 - 1 - 1 - 32 - 32 - 0 - 0 - CE - CE - ALL - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 128 - 128 - WRITE_FIRST - WRITE_FIRST - 32 - 32 - artix7 - 4 - Memory_Slave - AXI4_Full - false - Minimum_Area - false - 9 - NONE - no_coe_file_loaded - ALL - sram_128x32 - false - false - false - false - false - false - false - false - false - Use_ENA_Pin - Always_Enabled - Single_Bit_Error_Injection - false - Native - false - no_mem_loaded - Single_Port_RAM - WRITE_FIRST - WRITE_FIRST - 0 - 0 - BRAM - 0 - 100 - 100 - 50 - 0 - 0 - 0 - 8kx2 - false - false - 1 - 1 - 32 - 32 - false - false - false - false - 0 - false - false - CE - CE - SYNC - false - false - false - false - false - false - false - 128 - 32 - 32 - No_ECC - false - false - false - Stand_Alone - artix7 - - - xc7a200t - fbg676 - VERILOG - - MIXED - -2 - - - TRUE - TRUE - IP_Flow - 4 - TRUE - . - - . - 2019.2 - OUT_OF_CONTEXT - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/soc/vivado_xpr/project_1/xilinx_ip/sram_128x64/sram_128x64.xci b/resources/soc/vivado_xpr/project_1/xilinx_ip/sram_128x64/sram_128x64.xci deleted file mode 100644 index 200b408..0000000 --- a/resources/soc/vivado_xpr/project_1/xilinx_ip/sram_128x64/sram_128x64.xci +++ /dev/null @@ -1,311 +0,0 @@ - - - xilinx.com - xci - unknown - 1.0 - - - sram_128x64 - - - 4096 - 1 - 0 - 0 - 0 - - 1 - 100000000 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 100000000 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - OTHER - NONE - 8192 - 32 - 1 - - OTHER - NONE - 8192 - 32 - 1 - - - 100000000 - 0 - 0.000 - 0 - 7 - 7 - 1 - 4 - 0 - 1 - 8 - 0 - 0 - 1 - NONE - 0 - 0 - 0 - ./ - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - Estimated Power for IP : 6.700549 mW - artix7 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - sram_128x64.mem - no_coe_file_loaded - 0 - 0 - 0 - 0 - 1 - 128 - 128 - 1 - 1 - 64 - 64 - 0 - 0 - CE - CE - ALL - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 8 - 8 - 128 - 128 - WRITE_FIRST - WRITE_FIRST - 64 - 64 - artix7 - 4 - Memory_Slave - AXI4_Full - false - Minimum_Area - false - 8 - NONE - no_coe_file_loaded - ALL - sram_128x64 - false - false - false - false - false - false - false - false - false - Use_ENA_Pin - Always_Enabled - Single_Bit_Error_Injection - false - Native - false - no_mem_loaded - Single_Port_RAM - WRITE_FIRST - WRITE_FIRST - 0 - 0 - BRAM - 0 - 100 - 100 - 50 - 0 - 0 - 0 - 8kx2 - false - false - 1 - 1 - 64 - 64 - false - false - false - false - 0 - false - false - CE - CE - SYNC - false - true - false - false - false - false - false - 128 - 64 - 64 - No_ECC - false - false - false - Stand_Alone - artix7 - - - xc7a200t - fbg676 - VERILOG - - MIXED - -2 - - - TRUE - TRUE - IP_Flow - 4 - TRUE - . - - . - 2019.2 - OUT_OF_CONTEXT - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/soc/vivado_xpr/project_1/xilinx_ip/sram_32x52bit/sram_32x52bit.xci b/resources/soc/vivado_xpr/project_1/xilinx_ip/sram_32x52bit/sram_32x52bit.xci deleted file mode 100644 index 9bd5d2e..0000000 --- a/resources/soc/vivado_xpr/project_1/xilinx_ip/sram_32x52bit/sram_32x52bit.xci +++ /dev/null @@ -1,309 +0,0 @@ - - - xilinx.com - xci - unknown - 1.0 - - - sram_32x52bit - - - 4096 - 1 - 0 - 0 - 0 - - 1 - 100000000 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - - 1 - 100000000 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 0.000 - AXI4LITE - READ_WRITE - 0 - 0 - 0 - 0 - 0 - OTHER - NONE - 8192 - 32 - 1 - - OTHER - NONE - 8192 - 32 - 1 - - - 100000000 - 0 - 0.000 - 0 - 5 - 5 - 1 - 4 - 0 - 1 - 9 - 0 - 0 - 1 - NONE - 0 - 0 - 0 - ./ - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - Estimated Power for IP : 6.27815 mW - artix7 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - sram_32x52bit.mem - no_coe_file_loaded - 0 - 0 - 0 - 0 - 1 - 32 - 32 - 1 - 1 - 52 - 52 - 0 - 0 - CE - CE - ALL - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 32 - 32 - WRITE_FIRST - WRITE_FIRST - 52 - 52 - artix7 - 4 - Memory_Slave - AXI4_Full - false - Minimum_Area - false - 9 - NONE - no_coe_file_loaded - ALL - sram_32x52bit - false - false - false - false - false - false - false - false - false - Use_ENA_Pin - Always_Enabled - Single_Bit_Error_Injection - false - Native - false - no_mem_loaded - Single_Port_RAM - WRITE_FIRST - WRITE_FIRST - 0 - 0 - BRAM - 0 - 100 - 100 - 50 - 0 - 0 - 0 - 8kx2 - false - false - 1 - 1 - 52 - 52 - false - false - false - false - 0 - false - false - CE - CE - SYNC - false - false - false - false - false - false - false - 32 - 52 - 52 - No_ECC - false - false - false - Stand_Alone - artix7 - - - xc7a200t - fbg676 - VERILOG - - MIXED - -2 - - - TRUE - TRUE - IP_Flow - 4 - TRUE - . - - . - 2019.2 - OUT_OF_CONTEXT - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/soc/vivado_xpr/soc_up.xdc b/resources/soc/vivado_xpr/soc_up.xdc deleted file mode 100644 index d4e156e..0000000 --- a/resources/soc/vivado_xpr/soc_up.xdc +++ /dev/null @@ -1,200 +0,0 @@ -#set_property SEVERITY {Warning} [get_drc_checks RTSTAT-2] -#时钟信号连接 -#create_clock -period 10.000 [get_ports clk] -set_property PACKAGE_PIN AC19 [get_ports clk] -set_property CLOCK_DEDICATED_ROUTE BACKBONE [get_nets clk] -create_clock -period 10.000 -name clk -waveform {0.000 5.000} [get_ports clk] - -#reset -set_property PACKAGE_PIN Y3 [get_ports resetn] - -#LED -set_property PACKAGE_PIN K23 [get_ports {led[0]}] -set_property PACKAGE_PIN J21 [get_ports {led[1]}] -set_property PACKAGE_PIN H23 [get_ports {led[2]}] -set_property PACKAGE_PIN J19 [get_ports {led[3]}] -set_property PACKAGE_PIN G9 [get_ports {led[4]}] -set_property PACKAGE_PIN J26 [get_ports {led[5]}] -set_property PACKAGE_PIN J23 [get_ports {led[6]}] -set_property PACKAGE_PIN J8 [get_ports {led[7]}] -set_property PACKAGE_PIN H8 [get_ports {led[8]}] -set_property PACKAGE_PIN G8 [get_ports {led[9]}] -set_property PACKAGE_PIN F7 [get_ports {led[10]}] -set_property PACKAGE_PIN A4 [get_ports {led[11]}] -set_property PACKAGE_PIN A5 [get_ports {led[12]}] -set_property PACKAGE_PIN A3 [get_ports {led[13]}] -set_property PACKAGE_PIN D5 [get_ports {led[14]}] -set_property PACKAGE_PIN H7 [get_ports {led[15]}] - -#led_rg 0/1 -set_property PACKAGE_PIN G7 [get_ports {led_rg0[0]}] -set_property PACKAGE_PIN F8 [get_ports {led_rg0[1]}] -set_property PACKAGE_PIN B5 [get_ports {led_rg1[0]}] -set_property PACKAGE_PIN D6 [get_ports {led_rg1[1]}] - -#NUM -set_property PACKAGE_PIN D3 [get_ports {num_csn[7]}] -set_property PACKAGE_PIN D25 [get_ports {num_csn[6]}] -set_property PACKAGE_PIN D26 [get_ports {num_csn[5]}] -set_property PACKAGE_PIN E25 [get_ports {num_csn[4]}] -set_property PACKAGE_PIN E26 [get_ports {num_csn[3]}] -set_property PACKAGE_PIN G25 [get_ports {num_csn[2]}] -set_property PACKAGE_PIN G26 [get_ports {num_csn[1]}] -set_property PACKAGE_PIN H26 [get_ports {num_csn[0]}] - -set_property PACKAGE_PIN C3 [get_ports {num_a_g[0]}] -set_property PACKAGE_PIN E6 [get_ports {num_a_g[1]}] -set_property PACKAGE_PIN B2 [get_ports {num_a_g[2]}] -set_property PACKAGE_PIN B4 [get_ports {num_a_g[3]}] -set_property PACKAGE_PIN E5 [get_ports {num_a_g[4]}] -set_property PACKAGE_PIN D4 [get_ports {num_a_g[5]}] -set_property PACKAGE_PIN A2 [get_ports {num_a_g[6]}] -#set_property PACKAGE_PIN C4 :DP - -#switch -set_property PACKAGE_PIN AC21 [get_ports {switch[7]}] -set_property PACKAGE_PIN AD24 [get_ports {switch[6]}] -set_property PACKAGE_PIN AC22 [get_ports {switch[5]}] -set_property PACKAGE_PIN AC23 [get_ports {switch[4]}] -set_property PACKAGE_PIN AB6 [get_ports {switch[3]}] -set_property PACKAGE_PIN W6 [get_ports {switch[2]}] -set_property PACKAGE_PIN AA7 [get_ports {switch[1]}] -set_property PACKAGE_PIN Y6 [get_ports {switch[0]}] - -#btn_key -set_property PACKAGE_PIN V8 [get_ports {btn_key_col[0]}] -set_property PACKAGE_PIN V9 [get_ports {btn_key_col[1]}] -set_property PACKAGE_PIN Y8 [get_ports {btn_key_col[2]}] -set_property PACKAGE_PIN V7 [get_ports {btn_key_col[3]}] -set_property PACKAGE_PIN U7 [get_ports {btn_key_row[0]}] -set_property PACKAGE_PIN W8 [get_ports {btn_key_row[1]}] -set_property PACKAGE_PIN Y7 [get_ports {btn_key_row[2]}] -set_property PACKAGE_PIN AA8 [get_ports {btn_key_row[3]}] - -#btn_step -set_property PACKAGE_PIN Y5 [get_ports btn_step[0]] -set_property PACKAGE_PIN V6 [get_ports btn_step[1]] - -#SPI flash -set_property PACKAGE_PIN P20 [get_ports SPI_CLK] -set_property PACKAGE_PIN R20 [get_ports SPI_CS] -set_property PACKAGE_PIN P19 [get_ports SPI_MISO] -set_property PACKAGE_PIN N18 [get_ports SPI_MOSI] - -#mac phy connect -set_property PACKAGE_PIN AB21 [get_ports mtxclk_0] -set_property PACKAGE_PIN AA19 [get_ports mrxclk_0] -set_property PACKAGE_PIN AA15 [get_ports mtxen_0] -set_property PACKAGE_PIN AF18 [get_ports {mtxd_0[0]}] -set_property PACKAGE_PIN AE18 [get_ports {mtxd_0[1]}] -set_property PACKAGE_PIN W15 [get_ports {mtxd_0[2]}] -set_property PACKAGE_PIN W14 [get_ports {mtxd_0[3]}] -set_property PACKAGE_PIN AB20 [get_ports mtxerr_0] -set_property PACKAGE_PIN AE22 [get_ports mrxdv_0] -set_property PACKAGE_PIN V1 [get_ports {mrxd_0[0]}] -set_property PACKAGE_PIN V4 [get_ports {mrxd_0[1]}] -set_property PACKAGE_PIN V2 [get_ports {mrxd_0[2]}] -set_property PACKAGE_PIN V3 [get_ports {mrxd_0[3]}] -set_property PACKAGE_PIN W16 [get_ports mrxerr_0] -set_property PACKAGE_PIN Y15 [get_ports mcoll_0] -set_property PACKAGE_PIN AF20 [get_ports mcrs_0] -set_property PACKAGE_PIN W3 [get_ports mdc_0] -set_property PACKAGE_PIN W1 [get_ports mdio_0] -set_property PACKAGE_PIN AE26 [get_ports phy_rstn] - -#uart -set_property PACKAGE_PIN F23 [get_ports UART_RX] -set_property IOSTANDARD LVCMOS33 [get_ports UART_RX] -set_property PACKAGE_PIN H19 [get_ports UART_TX] -set_property IOSTANDARD LVCMOS33 [get_ports UART_TX] - -#nand flash -set_property PACKAGE_PIN V19 [get_ports NAND_CLE] -set_property PACKAGE_PIN W20 [get_ports NAND_ALE] -set_property PACKAGE_PIN AA25 [get_ports NAND_RDY] -set_property PACKAGE_PIN AA24 [get_ports NAND_RD] -set_property PACKAGE_PIN AB24 [get_ports NAND_CE] -set_property PACKAGE_PIN AA22 [get_ports NAND_WR] -set_property PACKAGE_PIN W19 [get_ports {NAND_DATA[7]}] -set_property PACKAGE_PIN Y20 [get_ports {NAND_DATA[6]}] -set_property PACKAGE_PIN Y21 [get_ports {NAND_DATA[5]}] -set_property PACKAGE_PIN V18 [get_ports {NAND_DATA[4]}] -set_property PACKAGE_PIN U19 [get_ports {NAND_DATA[3]}] -set_property PACKAGE_PIN U20 [get_ports {NAND_DATA[2]}] -set_property PACKAGE_PIN W21 [get_ports {NAND_DATA[1]}] -set_property PACKAGE_PIN AC24 [get_ports {NAND_DATA[0]}] - -#ejtag -# set_property PACKAGE_PIN J18 [get_ports EJTAG_TRST] -# set_property PACKAGE_PIN K18 [get_ports EJTAG_TCK] -# set_property PACKAGE_PIN K20 [get_ports EJTAG_TDI] -# set_property PACKAGE_PIN K22 [get_ports EJTAG_TMS] -# set_property PACKAGE_PIN K21 [get_ports EJTAG_TDO] - - -set_property IOSTANDARD LVCMOS33 [get_ports clk] -set_property IOSTANDARD LVCMOS33 [get_ports resetn] -set_property IOSTANDARD LVCMOS33 [get_ports {led[*]}] -set_property IOSTANDARD LVCMOS33 [get_ports {led_rg0[*]}] -set_property IOSTANDARD LVCMOS33 [get_ports {led_rg1[*]}] -set_property IOSTANDARD LVCMOS33 [get_ports {num_a_g[*]}] -set_property IOSTANDARD LVCMOS33 [get_ports {num_csn[*]}] -set_property IOSTANDARD LVCMOS33 [get_ports {switch[*]}] -set_property IOSTANDARD LVCMOS33 [get_ports {btn_key_col[*]}] -set_property IOSTANDARD LVCMOS33 [get_ports {btn_key_row[*]}] -set_property IOSTANDARD LVCMOS33 [get_ports {btn_step[*]}] - -set_property IOSTANDARD LVCMOS33 [get_ports SPI_MOSI] -set_property IOSTANDARD LVCMOS33 [get_ports SPI_MISO] -set_property IOSTANDARD LVCMOS33 [get_ports SPI_CS] -set_property IOSTANDARD LVCMOS33 [get_ports SPI_CLK] - -set_property IOSTANDARD LVCMOS33 [get_ports {mrxd_0[*]}] -set_property IOSTANDARD LVCMOS33 [get_ports {mtxd_0[*]}] -set_property IOSTANDARD LVCMOS33 [get_ports phy_rstn] -set_property IOSTANDARD LVCMOS33 [get_ports mtxerr_0] -set_property IOSTANDARD LVCMOS33 [get_ports mtxen_0] -set_property IOSTANDARD LVCMOS33 [get_ports mtxclk_0] -set_property IOSTANDARD LVCMOS33 [get_ports mrxerr_0] -set_property IOSTANDARD LVCMOS33 [get_ports mcoll_0] -set_property IOSTANDARD LVCMOS33 [get_ports mcrs_0] -set_property IOSTANDARD LVCMOS33 [get_ports mdc_0] -set_property IOSTANDARD LVCMOS33 [get_ports mdio_0] -set_property IOSTANDARD LVCMOS33 [get_ports mrxclk_0] -set_property IOSTANDARD LVCMOS33 [get_ports mrxdv_0] - -set_property IOSTANDARD LVCMOS33 [get_ports NAND_CLE] -set_property IOSTANDARD LVCMOS33 [get_ports NAND_ALE] -set_property IOSTANDARD LVCMOS33 [get_ports NAND_RDY] -set_property IOSTANDARD LVCMOS33 [get_ports NAND_RD] -set_property IOSTANDARD LVCMOS33 [get_ports NAND_CE] -set_property IOSTANDARD LVCMOS33 [get_ports NAND_WR] -set_property IOSTANDARD LVCMOS33 [get_ports {NAND_DATA[7]}] -set_property IOSTANDARD LVCMOS33 [get_ports {NAND_DATA[6]}] -set_property IOSTANDARD LVCMOS33 [get_ports {NAND_DATA[5]}] -set_property IOSTANDARD LVCMOS33 [get_ports {NAND_DATA[4]}] -set_property IOSTANDARD LVCMOS33 [get_ports {NAND_DATA[3]}] -set_property IOSTANDARD LVCMOS33 [get_ports {NAND_DATA[2]}] -set_property IOSTANDARD LVCMOS33 [get_ports {NAND_DATA[1]}] -set_property IOSTANDARD LVCMOS33 [get_ports {NAND_DATA[0]}] - -# set_property IOSTANDARD LVCMOS33 [get_ports EJTAG_TRST] -# set_property IOSTANDARD LVCMOS33 [get_ports EJTAG_TCK] -# set_property IOSTANDARD LVCMOS33 [get_ports EJTAG_TDI] -# set_property IOSTANDARD LVCMOS33 [get_ports EJTAG_TMS] -# set_property IOSTANDARD LVCMOS33 [get_ports EJTAG_TDO] -# set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets EJTAG_TCK_IBUF] - -create_clock -period 40.000 -name mrxclk_0 -waveform {0.000 20.000} [get_ports mrxclk_0] -create_clock -period 40.000 -name mtxclk_0 -waveform {0.000 20.000} [get_ports mtxclk_0] - -set_false_path -from [get_clocks clk_pll_i] -to [get_clocks clk_out1_clk_pll_33] -set_false_path -from [get_clocks mrxclk_0] -to [get_clocks clk_out1_clk_pll_33] -set_false_path -from [get_clocks mtxclk_0] -to [get_clocks clk_out1_clk_pll_33] -set_false_path -from [get_clocks clk_out1_clk_pll_33] -to [get_clocks mrxclk_0] -set_false_path -from [get_clocks clk_out1_clk_pll_33] -to [get_clocks mrxclk_0] -set_false_path -from [get_clocks clk_out1_clk_pll_33] -to [get_clocks mtxclk_0] -set_false_path -from [get_clocks clk_out1_clk_pll_33] -to [get_clocks mtxclk_0] - -set_false_path -from [get_clocks -of_objects [get_pins mig_axi/u_mig_axi_32_mig/u_ddr3_infrastructure/gen_mmcm.mmcm_i/CLKFBOUT]] -to [get_clocks -of_objects [get_pins clk_pll_33/inst/plle2_adv_inst/CLKOUT0]] -set_false_path -from [get_clocks -of_objects [get_pins clk_pll_33/inst/plle2_adv_inst/CLKOUT0]] -to [get_clocks -of_objects [get_pins mig_axi/u_mig_axi_32_mig/u_ddr3_infrastructure/gen_mmcm.mmcm_i/CLKFBOUT]] diff --git a/resources/tft-lcd/LCD.sv b/resources/tft-lcd/LCD.sv deleted file mode 100644 index 05ed4d6..0000000 --- a/resources/tft-lcd/LCD.sv +++ /dev/null @@ -1,28 +0,0 @@ -module LCD ( - input logic clk, - input logic rst, - - // TFT-LCD - output logic CS, // 片选 低有效 - output logic RS, // 0命令 1数据 - output logic WR, // 写使能 低有效 - output logic RD, // 读使能 低有效 - output logic RSTN, // 复位 低有效 - inout logic [15:0] DATA, // 双向数据总线 - output logic BL_CTR, // 背光控制引脚 高点亮, 低关闭 - inout logic SDA , // I2C SDA - input logic PEN, // 触摸中断 - output logic CT_RST, // 触摸屏复位 - output logic SCL, // I2C SCL - - // CPU - output logic intr // To CPU中断信号 -); - // 复位同步 - assign RSTN = ~rst; - assign CT_RST = ~rst; - // 点亮背光 - assign BL_CTR = 1'b1; - - -endmodule \ No newline at end of file diff --git a/sim/.gitignore b/sim/.gitignore deleted file mode 100644 index 9b2e351..0000000 --- a/sim/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -logs -obj_dir \ No newline at end of file diff --git a/sim/Makefile b/sim/Makefile deleted file mode 100644 index 3d3c773..0000000 --- a/sim/Makefile +++ /dev/null @@ -1,60 +0,0 @@ -GENHTML = genhtml - -VERILATOR = verilator -VERILATOR_COVERAGE = verilator_coverage - -VERILATOR_FLAGS = -# Generate C++ in executable form -VERILATOR_FLAGS += -cc --exe -# Generate makefile dependencies (not shown as complicates the Makefile) -VERILATOR_FLAGS += -MMD -# Optimize -VERILATOR_FLAGS += -Os -x-assign 0 -# Warn abount lint issues; may not want this on less solid designs -VERILATOR_FLAGS += -Wall -# Make waveforms -VERILATOR_FLAGS += --trace -# Check SystemVerilog assertions -VERILATOR_FLAGS += --assert -# Generate coverage analysis -VERILATOR_FLAGS += --coverage -# Run make to compile model, with as many CPUs as are free -VERILATOR_FLAGS += --build -j - -# Get rid of annoying warnings -VERILATOR_FLAGS += -Wno-UNOPT -Wno-UNOPTFLAT -Wno-BLKSEQ -VERILATOR_FLAGS += -DSIMULATION_PC - -# Create annotated source -VERILATOR_COV_FLAGS += --annotate logs/annotated -# A single coverage hit is considered good enough -VERILATOR_COV_FLAGS += --annotate-min 1 -# Create LCOV info -VERILATOR_COV_FLAGS += --write-info logs/coverage.info -# Input file from Verilator -VERILATOR_COV_FLAGS += logs/coverage.dat - -SOURCE = $(wildcard ../model/*.v ../model/*.sv ../src/*.v ../src/*.sv ../src/**/*.v ../src/**/*.sv) -INCLUDE = $(addprefix -I, $(dir $(wildcard ../src/*/. ../src/**/*/.))) -# Input files for Verilator -VERILATOR_INPUT = $(INCLUDE) $(SOURCE) -top mycpu_top sim_main.cpp - -default: run - -test: - echo $(INCLUDE) - -verilate: - $(VERILATOR) $(VERILATOR_FLAGS) $(VERILATOR_INPUT) - -run: verilate - @rm -rf logs - @mkdir -p logs - obj_dir/Vmycpu_top - -coverage: verilate - @rm -rf logs/annotated - $(VERILATOR_COVERAGE) $(VERILATOR_COV_FLAGS) - -clean: - -rm -rf obj_dir logs *.log *.dmp *.vpd core \ No newline at end of file diff --git a/sim/sim_main.cpp b/sim/sim_main.cpp deleted file mode 100644 index f02506a..0000000 --- a/sim/sim_main.cpp +++ /dev/null @@ -1,47 +0,0 @@ -#include - -#include "Vmycpu_top.h" - -vluint64_t main_time = 0; -double sc_time_stamp() { - return main_time; // Note does conversion to real, to match SystemC -} - -int main(int argc, char** argv, char** env) { - if (0 && argc && argv && env) {} - - Verilated::debug(0); - Verilated::randReset(2); - Verilated::traceEverOn(true); - Verilated::commandArgs(argc, argv); - Verilated::mkdir("logs"); - - Vmycpu_top* top = new Vmycpu_top; // Or use a const unique_ptr, or the VL_UNIQUE_PTR wrapper - - top->aclk = 0; - while (!Verilated::gotFinish()) { - ++main_time; - top->aclk = !top->aclk; - top->aresetn = (main_time < 10) ? 1 : 0; - if (main_time < 5) { - // Zero coverage if still early in reset, otherwise toggles there may - // falsely indicate a signal is covered - VerilatedCov::zero(); - } - top->eval(); - - // TODO: fake AXI - } - - top->final(); - - // Coverage analysis (since test passed) -#if VM_COVERAGE - Verilated::mkdir("logs"); - VerilatedCov::write("logs/coverage.dat"); -#endif - - delete top; - top = NULL; - exit(0); -} \ No newline at end of file